diff --git a/openair1/PHY/CODING/crc_byte.c b/openair1/PHY/CODING/crc_byte.c index b16850b7fb4a17e4a848db1b00641b6d6804d25c..6176e1f92f06ce6c40b461a579482b7ae91bd5b1 100644 --- a/openair1/PHY/CODING/crc_byte.c +++ b/openair1/PHY/CODING/crc_byte.c @@ -255,48 +255,6 @@ unsigned int crcPayload(unsigned char * inptr, int bitlen, uint32_t* crc256Table return crc; } -void nr_crc_computation(uint8_t* input, uint8_t* output, uint16_t payloadBits, uint16_t crcParityBits, uint32_t* crc256Table) -{ - //Create payload in bit - uint8_t* input2 = (uint8_t*)malloc(payloadBits); //divided by 8 (in bits) - uint8_t mask = 128; // 10000000 - - for(uint8_t ind=0; ind<(payloadBits/8); ind++) - { - input2[ind]=0; - for(uint8_t ind2=0; ind2<8; ind2++) - { - if(input[8*ind+ind2]) - { - input2[ind] = input2[ind] | mask; - } - mask= mask >> 1; - } - mask=128; - } - - //crcTable256Init(poly); - - unsigned int crcBits; - crcBits = crcPayload(input2, payloadBits, crc256Table); - - //create crc in byte - unsigned int mask2=0x80000000; //100... - - for(uint8_t ind=0; ind<crcParityBits; ind++) - { - if(crcBits & mask2) - output[ind]=1; - else - output[ind]=0; - - mask2 = mask2 >> 1; - } - -} - - - #ifdef DEBUG_CRC diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c b/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c index 7b5a1c922ae42c034020ff6419c0e75d09ef50e1..ef329b3aaa73cde95d51616cc48a1a2955cb86f5 100644 --- a/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c +++ b/openair1/PHY/CODING/nrPolar_tools/nr_crc_byte.c @@ -21,132 +21,7 @@ #include "PHY/CODING/nrPolar_tools/nr_polar_defs.h" -/* -// ----- New implementation ---- -uint32_t poly6 = 0x84000000; // 10000100000... -> D^6+D^5+1 -uint32_t poly11 = 0xc4200000; //11000100001000... -> D^11+D^10+D^9+D^5+1 -uint32_t poly16 = 0x10210000; //00100000010000100... - > D^16+D^12+D^5+1 -uint32_t poly24a = 0x864cfb00; //100001100100110011111011 -> D^24+D^23+D^18+D^17+D^14+D^11+D^10+D^7+D^6+D^5+D^4+D^3+D+1 -uint32_t poly24b = 0x80006300; //100000000000000001100011 -> D^24+D^23+D^6+D^5+D+1 -uint32_t poly24c = 0xB2B11700; //101100101011000100010111 -> D^24... - -//static unsigned int crc256Table[256]; - -void nr_crc_computation(uint8_t* input, uint8_t* output, uint16_t payloadBits, uint16_t crcParityBits, uint32_t* crc256Table) -{ - //Create payload in bit - uint8_t* input2 = (uint8_t*)malloc(payloadBits); //divided by 8 (in bits) - uint8_t mask = 128; // 10000000 - - for(uint8_t ind=0; ind<(payloadBits/8); ind++) - { - input2[ind]=0; - for(uint8_t ind2=0; ind2<8; ind2++) - { - if(input[8*ind+ind2]) - { - input2[ind] = input2[ind] | mask; - } - mask= mask >> 1; - } - mask=128; - } - - //crcTable256Init(poly); - - unsigned int crcBits; - crcBits = crcPayload(input2, payloadBits, crc256Table); - - //create crc in byte - unsigned int mask2=0x80000000; //100... - output = (uint8_t*)malloc(sizeof(uint8_t)*crcParityBits); - - for(uint8_t ind=0; ind<crcParityBits; ind++) - { - if(crcBits & mask2) - output[ind]=1; - else - output[ind]=0; - - mask2 = mask2 >> 1; - } - -} - -unsigned int crcbit (unsigned char* inputptr, int octetlen, unsigned int poly) -{ - unsigned int i, crc = 0, c; - - while (octetlen-- > 0) { - c = (*inputptr++) << 24; - - for (i = 8; i != 0; i--) { - if ((1 << 31) & (c ^ crc)) - crc = (crc << 1) ^ poly; - else - crc <<= 1; - - c <<= 1; - } - } - - return crc; -} - -void crcTableInit (void) -{ - unsigned char c = 0; - - do { - crc6Table[c] = crcbit(&c, 1, poly6); - crc11Table[c]= crcbit(&c, 1, poly11); - crc16Table[c] =crcbit(&c, 1, poly16); - crc24aTable[c]=crcbit(&c, 1, poly24a); - crc24bTable[c]=crcbit(&c, 1, poly24b); - crc24cTable[c]=crcbit(&c, 1, poly24c); - - } while (++c); -} - -void crcTable256Init (uint32_t poly, uint32_t* crc256Table) -{ - unsigned char c = 0; -// crc256Table = malloc(sizeof(uint32_t)*256); - - do { - crc256Table[c] = crcbit(&c, 1, poly); - -// crc6Table[c] = crcbit(&c, 1, poly6); - // crc11Table[c]= crcbit(&c, 1, poly11); -// crc16Table[c] =crcbit(&c, 1, poly16); -// crc24aTable[c]=crcbit(&c, 1, poly24a); -// crc24bTable[c]=crcbit(&c, 1, poly24b); -// crc24cTable[c]=crcbit(&c, 1, poly24c); - } while (++c); - - //return crc256Table; -} - -unsigned int crcPayload(unsigned char * inptr, int bitlen, uint32_t* crc256Table) -{ - int octetlen, resbit; - unsigned int crc = 0; - octetlen = bitlen/8; // Change in bytes - resbit = (bitlen % 8); - - while (octetlen-- > 0) - { - crc = (crc << 8) ^ crc256Table[(*inptr++) ^ (crc >> 24)]; - } - - if (resbit > 0) - { - crc = (crc << resbit) ^ crc256Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))]; - } - return crc; -} -*/ // ----- Old implementation ---- uint8_t **crc24c_generator_matrix(uint16_t payloadSizeBits){ diff --git a/openair1/PHY/INIT/init_top.c b/openair1/PHY/INIT/init_top.c index e64eda740ca0a9bd8b73335392373e5728c62da4..956e473f673246dd05940a33b8537a642e66a113 100644 --- a/openair1/PHY/INIT/init_top.c +++ b/openair1/PHY/INIT/init_top.c @@ -72,6 +72,7 @@ void init_lte_top(LTE_DL_FRAME_PARMS *frame_parms) init_dfts(); + crcTableInit(); phy_generate_viterbi_tables_lte(); diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 2d5ccaedeb1f661c17eb268c1eee7d73f364ea1e..a67645eef422ee7acc1dba19cd4fff772e2b300b 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -115,6 +115,10 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, );*/ LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_gNB][MOD %02"PRIu8"][]\n", gNB->Mod_id); + crcTableInit(); + + init_dfts(); + // PBCH DMRS gold sequences generation nr_init_pbch_dmrs(gNB); // Polar encoder init for PBCH diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index c1d6399e46839adbe35a2343e15a3801b8aba135..dfbbb25d06f065d4c420d321872c5e854a4e4dea 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -947,6 +947,8 @@ void phy_init_nr_top(PHY_VARS_NR_UE *ue) crcTableInit(); + init_dfts(); + ccodedot11_init(); ccodedot11_init_inv(); diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c deleted file mode 100644 index 4020056e6f68043a591f4792c287202e49a76ab0..0000000000000000000000000000000000000000 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c +++ /dev/null @@ -1,748 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file PHY/LTE_TRANSPORT/dlsch_decoding.c -* \brief Top-level routines for decoding Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 -* \author R. Knopp -* \date 2011 -* \version 0.1 -* \company Eurecom -* \email: knopp@eurecom.fr -* \note -* \warning -*/ - -//#include "defs.h" -#include "PHY/defs.h" -#include "PHY/extern.h" -#include "PHY/CODING/extern.h" -#include "SCHED/extern.h" -#include "SIMULATION/TOOLS/defs.h" -//#define DEBUG_DLSCH_DECODING -//#define UE_DEBUG_TRACE 1 - - -void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch) -{ - - int i,r; - - if (dlsch) { - for (i=0; i<dlsch->Mdlharq; 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; r<MAX_NUM_DLSCH_SEGMENTS; r++) { - free16(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768); - dlsch->harq_processes[i]->c[r] = NULL; - } - - for (r=0; r<MAX_NUM_DLSCH_SEGMENTS; r++) - if (dlsch->harq_processes[i]->d[r]) { - free16(dlsch->harq_processes[i]->d[r],((3*8*6144)+12+96)*sizeof(short)); - dlsch->harq_processes[i]->d[r] = NULL; - } - - free16(dlsch->harq_processes[i],sizeof(LTE_DL_UE_HARQ_t)); - dlsch->harq_processes[i] = NULL; - } - } - - free16(dlsch,sizeof(LTE_UE_DLSCH_t)); - dlsch = NULL; - } -} - -LTE_UE_DLSCH_t *new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t max_turbo_iterations,uint8_t N_RB_DL, uint8_t abstraction_flag) -{ - - LTE_UE_DLSCH_t *dlsch; - uint8_t exit_flag = 0,i,r; - - unsigned char bw_scaling =1; - - switch (N_RB_DL) { - case 6: - bw_scaling =16; - break; - - case 25: - bw_scaling =4; - break; - - case 50: - bw_scaling =2; - break; - - default: - bw_scaling =1; - break; - } - - dlsch = (LTE_UE_DLSCH_t *)malloc16(sizeof(LTE_UE_DLSCH_t)); - - if (dlsch) { - memset(dlsch,0,sizeof(LTE_UE_DLSCH_t)); - dlsch->Kmimo = Kmimo; - dlsch->Mdlharq = Mdlharq; - dlsch->Nsoft = Nsoft; - dlsch->max_turbo_iterations = max_turbo_iterations; - - for (i=0; i<Mdlharq; i++) { - // printf("new_ue_dlsch: Harq process %d\n",i); - dlsch->harq_processes[i] = (LTE_DL_UE_HARQ_t *)malloc16(sizeof(LTE_DL_UE_HARQ_t)); - - if (dlsch->harq_processes[i]) { - memset(dlsch->harq_processes[i],0,sizeof(LTE_DL_UE_HARQ_t)); - dlsch->harq_processes[i]->first_tx=1; - dlsch->harq_processes[i]->b = (uint8_t*)malloc16(MAX_DLSCH_PAYLOAD_BYTES/bw_scaling); - - if (dlsch->harq_processes[i]->b) - memset(dlsch->harq_processes[i]->b,0,MAX_DLSCH_PAYLOAD_BYTES/bw_scaling); - else - exit_flag=3; - - if (abstraction_flag == 0) { - for (r=0; r<MAX_NUM_DLSCH_SEGMENTS/bw_scaling; r++) { - dlsch->harq_processes[i]->c[r] = (uint8_t*)malloc16(((r==0)?8:0) + 3+ 768); - - if (dlsch->harq_processes[i]->c[r]) - memset(dlsch->harq_processes[i]->c[r],0,((r==0)?8:0) + 3+ 768); - else - exit_flag=2; - - dlsch->harq_processes[i]->d[r] = (short*)malloc16(((3*8*6144)+12+96)*sizeof(short)); - - if (dlsch->harq_processes[i]->d[r]) - memset(dlsch->harq_processes[i]->d[r],0,((3*8*6144)+12+96)*sizeof(short)); - else - exit_flag=2; - } - } - } else { - exit_flag=1; - } - } - - if (exit_flag==0) - return(dlsch); - } - - printf("new_ue_dlsch with size %zu: exit_flag = %u\n",sizeof(LTE_DL_UE_HARQ_t), exit_flag); - free_ue_dlsch(dlsch); - - return(NULL); -} - -uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, - short *dlsch_llr, - LTE_DL_FRAME_PARMS *frame_parms, - LTE_UE_DLSCH_t *dlsch, - LTE_DL_UE_HARQ_t *harq_process, - uint32_t frame, - uint8_t subframe, - uint8_t harq_pid, - uint8_t is_crnti, - uint8_t llr8_flag) -{ - -#if UE_TIMING_TRACE - time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats; - time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats; - time_stats_t *dlsch_deinterleaving_stats=&phy_vars_ue->dlsch_deinterleaving_stats; -#endif - uint32_t A,E; - uint32_t G; - uint32_t ret,offset; - uint16_t iind; - // uint8_t dummy_channel_output[(3*8*block_length)+12]; - short dummy_w[MAX_NUM_DLSCH_SEGMENTS][3*(6144+64)]; - uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0; - uint8_t crc_type; -#ifdef DEBUG_DLSCH_DECODING - uint16_t i; -#endif - //#ifdef __AVX2__ -#if 0 - int Kr_last,skipped_last=0; - uint8_t (*tc_2cw)(int16_t *y, - int16_t *y2, - uint8_t *, - uint8_t *, - uint16_t, - uint16_t, - uint16_t, - uint8_t, - uint8_t, - uint8_t, - time_stats_t *, - time_stats_t *, - time_stats_t *, - time_stats_t *, - time_stats_t *, - time_stats_t *, - time_stats_t *); - -#endif -decoder_if_t tc; - - - - - if (!dlsch_llr) { - printf("dlsch_decoding.c: NULL dlsch_llr pointer\n"); - return(dlsch->max_turbo_iterations); - } - - if (!harq_process) { - printf("dlsch_decoding.c: NULL harq_process pointer\n"); - return(dlsch->max_turbo_iterations); - } - - if (!frame_parms) { - printf("dlsch_decoding.c: NULL frame_parms pointer\n"); - return(dlsch->max_turbo_iterations); - } - - if (subframe>9) { - printf("dlsch_decoding.c: Illegal subframe index %d\n",subframe); - return(dlsch->max_turbo_iterations); - } - - if (dlsch->harq_ack[subframe].ack != 2) { - LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n", - phy_vars_ue->Mod_id, subframe, dlsch->harq_ack[subframe].ack); - } - - if (llr8_flag == 0) { - //#ifdef __AVX2__ -#if 0 - tc_2cw = phy_threegpplte_turbo_decoder16avx2; -#endif - tc = decoder16; - } - else - { - AssertFatal (harq_process->TBS >= 256 , "Mismatch flag nbRB=%d TBS=%d mcs=%d Qm=%d RIV=%d round=%d \n", - harq_process->nb_rb, harq_process->TBS,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round); - tc = decoder8; - } - - - // nb_rb = dlsch->nb_rb; - - /* - if (nb_rb > frame_parms->N_RB_DL) { - printf("dlsch_decoding.c: Illegal nb_rb %d\n",nb_rb); - return(max_turbo_iterations); - }*/ - - /*harq_pid = dlsch->current_harq_pid[phy_vars_ue->current_thread_id[subframe]]; - if (harq_pid >= 8) { - printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid); - return(max_turbo_iterations); - } - */ - - harq_process->trials[harq_process->round]++; - - A = harq_process->TBS; //2072 for QPSK 1/3 - - ret = dlsch->max_turbo_iterations; - - - G = harq_process->G; - //get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,num_pdcch_symbols,phy_vars_ue->frame,subframe); - - // printf("DLSCH Decoding, harq_pid %d Ndi %d\n",harq_pid,harq_process->Ndi); - - if (harq_process->round == 0) { - // This is a new packet, so compute quantities regarding segmentation - harq_process->B = A+24; - lte_segmentation(NULL, - NULL, - harq_process->B, - &harq_process->C, - &harq_process->Cplus, - &harq_process->Cminus, - &harq_process->Kplus, - &harq_process->Kminus, - &harq_process->F); - // CLEAR LLR's HERE for first packet in process - } - - /* - else { - printf("dlsch_decoding.c: Ndi>0 not checked yet!!\n"); - return(max_turbo_iterations); - } - */ - err_flag = 0; - r_offset = 0; - - unsigned char bw_scaling =1; - - switch (frame_parms->N_RB_DL) { - case 6: - bw_scaling =16; - break; - - case 25: - bw_scaling =4; - break; - - case 50: - bw_scaling =2; - break; - - default: - bw_scaling =1; - break; - } - - if (harq_process->C > MAX_NUM_DLSCH_SEGMENTS/bw_scaling) { - LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,MAX_NUM_DLSCH_SEGMENTS/bw_scaling); - return((1+dlsch->max_turbo_iterations)); - } -#ifdef DEBUG_DLSCH_DECODING - printf("Segmentation: C %d, Cminus %d, Kminus %d, Kplus %d\n",harq_process->C,harq_process->Cminus,harq_process->Kminus,harq_process->Kplus); -#endif - - opp_enabled=1; - - for (r=0; r<harq_process->C; r++) { - - - // Get Turbo interleaver parameters - if (r<harq_process->Cminus) - Kr = harq_process->Kminus; - else - Kr = harq_process->Kplus; - - Kr_bytes = Kr>>3; - - if (Kr_bytes<=64) - iind = (Kr_bytes-5); - else if (Kr_bytes <=128) - iind = 59 + ((Kr_bytes-64)>>1); - else if (Kr_bytes <= 256) - iind = 91 + ((Kr_bytes-128)>>2); - else if (Kr_bytes <= 768) - iind = 123 + ((Kr_bytes-256)>>3); - else { - printf("dlsch_decoding: Illegal codeword size %d!!!\n",Kr_bytes); - return(dlsch->max_turbo_iterations); - } - -#ifdef DEBUG_DLSCH_DECODING - printf("f1 %d, f2 %d, F %d\n",f1f2mat_old[2*iind],f1f2mat_old[1+(2*iind)],(r==0) ? harq_process->F : 0); -#endif - -#if UE_TIMING_TRACE - start_meas(dlsch_rate_unmatching_stats); -#endif - memset(&dummy_w[r][0],0,3*(6144+64)*sizeof(short)); - harq_process->RTC[r] = generate_dummy_w(4+(Kr_bytes*8), - (uint8_t*) &dummy_w[r][0], - (r==0) ? harq_process->F : 0); - -#ifdef DEBUG_DLSCH_DECODING - LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n", - harq_pid,r, G, - Kr*3, - harq_process->TBS, - harq_process->Qm, - harq_process->nb_rb, - harq_process->Nl, - harq_process->rvidx, - harq_process->round); -#endif - -#ifdef DEBUG_DLSCH_DECODING - printf(" in decoding dlsch->harq_processes[harq_pid]->rvidx = %d\n", dlsch->harq_processes[harq_pid]->rvidx); -#endif - if (lte_rate_matching_turbo_rx(harq_process->RTC[r], - G, - harq_process->w[r], - (uint8_t*)&dummy_w[r][0], - dlsch_llr+r_offset, - harq_process->C, - dlsch->Nsoft, - dlsch->Mdlharq, - dlsch->Kmimo, - harq_process->rvidx, - (harq_process->round==0)?1:0, - harq_process->Qm, - harq_process->Nl, - r, - &E)==-1) { -#if UE_TIMING_TRACE - stop_meas(dlsch_rate_unmatching_stats); -#endif - LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n"); - return(dlsch->max_turbo_iterations); - } else - { -#if UE_TIMING_TRACE - stop_meas(dlsch_rate_unmatching_stats); -#endif - } - r_offset += E; - - /* - printf("Subblock deinterleaving, d %p w %p\n", - harq_process->d[r], - harq_process->w); - */ -#if UE_TIMING_TRACE - start_meas(dlsch_deinterleaving_stats); -#endif - sub_block_deinterleaving_turbo(4+Kr, - &harq_process->d[r][96], - - harq_process->w[r]); -#if UE_TIMING_TRACE - stop_meas(dlsch_deinterleaving_stats); -#endif -#ifdef DEBUG_DLSCH_DECODING - /* - if (r==0) { - write_output("decoder_llr.m","decllr",dlsch_llr,G,1,0); - write_output("decoder_in.m","dec",&harq_process->d[0][96],(3*8*Kr_bytes)+12,1,0); - } - - printf("decoder input(segment %d) :",r); - int i; for (i=0;i<(3*8*Kr_bytes)+12;i++) - printf("%d : %d\n",i,harq_process->d[r][96+i]); - printf("\n");*/ -#endif - - - // printf("Clearing c, %p\n",harq_process->c[r]); - memset(harq_process->c[r],0,Kr_bytes); - - // printf("done\n"); - if (harq_process->C == 1) - crc_type = CRC24_A; - else - crc_type = CRC24_B; - - /* - printf("decoder input(segment %d)\n",r); - for (i=0;i<(3*8*Kr_bytes)+12;i++) - if ((harq_process->d[r][96+i]>7) || - (harq_process->d[r][96+i] < -8)) - printf("%d : %d\n",i,harq_process->d[r][96+i]); - printf("\n"); - */ - - //#ifndef __AVX2__ -#if 1 - if (err_flag == 0) { -/* - LOG_I(PHY, "turbo algo Kr=%d cb_cnt=%d C=%d nbRB=%d crc_type %d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n", - Kr,r,harq_process->C,harq_process->nb_rb,crc_type,A,harq_process->TBS, - harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_turbo_iterations); -*/ - if (llr8_flag) { - AssertFatal (Kr >= 256, "turbo algo issue Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d\n", - Kr,r,harq_process->C,harq_process->nb_rb,A,harq_process->TBS,harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round); - } -#if UE_TIMING_TRACE - start_meas(dlsch_turbo_decoding_stats); -#endif - LOG_D(PHY,"AbsSubframe %d.%d Start turbo segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1); - ret = tc - (&harq_process->d[r][96], - NULL, - harq_process->c[r], - NULL, - Kr, - f1f2mat_old[iind*2], - f1f2mat_old[(iind*2)+1], - dlsch->max_turbo_iterations, - crc_type, - (r==0) ? harq_process->F : 0, - &phy_vars_ue->dlsch_tc_init_stats, - &phy_vars_ue->dlsch_tc_alpha_stats, - &phy_vars_ue->dlsch_tc_beta_stats, - &phy_vars_ue->dlsch_tc_gamma_stats, - &phy_vars_ue->dlsch_tc_ext_stats, - &phy_vars_ue->dlsch_tc_intl1_stats, - &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1); - -#if UE_TIMING_TRACE - stop_meas(dlsch_turbo_decoding_stats); -#endif - } -#else - if ((harq_process->C == 1) || - ((r==harq_process->C-1) && (skipped_last==0))) { // last segment with odd number of segments - -#if UE_TIMING_TRACE - start_meas(dlsch_turbo_decoding_stats); -#endif - ret = tc - (&harq_process->d[r][96], - harq_process->c[r], - Kr, - f1f2mat_old[iind*2], - f1f2mat_old[(iind*2)+1], - dlsch->max_turbo_iterations, - crc_type, - (r==0) ? harq_process->F : 0, - &phy_vars_ue->dlsch_tc_init_stats, - &phy_vars_ue->dlsch_tc_alpha_stats, - &phy_vars_ue->dlsch_tc_beta_stats, - &phy_vars_ue->dlsch_tc_gamma_stats, - &phy_vars_ue->dlsch_tc_ext_stats, - &phy_vars_ue->dlsch_tc_intl1_stats, - &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1); - #if UE_TIMING_TRACE - stop_meas(dlsch_turbo_decoding_stats); -#endif - // printf("single decode, exit\n"); - // exit(-1); - } - else { - // we can merge code segments - if ((skipped_last == 0) && (r<harq_process->C-1)) { - skipped_last = 1; - Kr_last = Kr; - } - else { - skipped_last=0; - - if (Kr_last == Kr) { // decode 2 code segments with AVX2 version -#ifdef DEBUG_DLSCH_DECODING - printf("single decoding segment %d (%p)\n",r-1,&harq_process->d[r-1][96]); -#endif -#if UE_TIMING_TRACE - start_meas(dlsch_turbo_decoding_stats); -#endif -#ifdef DEBUG_DLSCH_DECODING - printf("double decoding segments %d,%d (%p,%p)\n",r-1,r,&harq_process->d[r-1][96],&harq_process->d[r][96]); -#endif - ret = tc_2cw - (&harq_process->d[r-1][96], - &harq_process->d[r][96], - harq_process->c[r-1], - harq_process->c[r], - Kr, - f1f2mat_old[iind*2], - f1f2mat_old[(iind*2)+1], - dlsch->max_turbo_iterations, - crc_type, - (r==0) ? harq_process->F : 0, - &phy_vars_ue->dlsch_tc_init_stats, - &phy_vars_ue->dlsch_tc_alpha_stats, - &phy_vars_ue->dlsch_tc_beta_stats, - &phy_vars_ue->dlsch_tc_gamma_stats, - &phy_vars_ue->dlsch_tc_ext_stats, - &phy_vars_ue->dlsch_tc_intl1_stats, - &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1); - /* - ret = tc - (&harq_process->d[r-1][96], - harq_process->c[r-1], - Kr_last, - f1f2mat_old[iind*2], - f1f2mat_old[(iind*2)+1], - dlsch->max_turbo_iterations, - crc_type, - (r==0) ? harq_process->F : 0, - &phy_vars_ue->dlsch_tc_init_stats, - &phy_vars_ue->dlsch_tc_alpha_stats, - &phy_vars_ue->dlsch_tc_beta_stats, - &phy_vars_ue->dlsch_tc_gamma_stats, - &phy_vars_ue->dlsch_tc_ext_stats, - &phy_vars_ue->dlsch_tc_intl1_stats, - &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1); - - exit(-1);*/ -#if UE_TIMING_TRACE - stop_meas(dlsch_turbo_decoding_stats); -#endif - } - else { // Kr_last != Kr -#if UE_TIMING_TRACE - start_meas(dlsch_turbo_decoding_stats); -#endif - ret = tc - (&harq_process->d[r-1][96], - harq_process->c[r-1], - Kr_last, - f1f2mat_old[iind*2], - f1f2mat_old[(iind*2)+1], - dlsch->max_turbo_iterations, - crc_type, - (r==0) ? harq_process->F : 0, - &phy_vars_ue->dlsch_tc_init_stats, - &phy_vars_ue->dlsch_tc_alpha_stats, - &phy_vars_ue->dlsch_tc_beta_stats, - &phy_vars_ue->dlsch_tc_gamma_stats, - &phy_vars_ue->dlsch_tc_ext_stats, - &phy_vars_ue->dlsch_tc_intl1_stats, - &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1); -#if UE_TIMING_TRACE - stop_meas(dlsch_turbo_decoding_stats); - - start_meas(dlsch_turbo_decoding_stats); -#endif - - ret = tc - (&harq_process->d[r][96], - harq_process->c[r], - Kr, - f1f2mat_old[iind*2], - f1f2mat_old[(iind*2)+1], - dlsch->max_turbo_iterations, - crc_type, - (r==0) ? harq_process->F : 0, - &phy_vars_ue->dlsch_tc_init_stats, - &phy_vars_ue->dlsch_tc_alpha_stats, - &phy_vars_ue->dlsch_tc_beta_stats, - &phy_vars_ue->dlsch_tc_gamma_stats, - &phy_vars_ue->dlsch_tc_ext_stats, - &phy_vars_ue->dlsch_tc_intl1_stats, - &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1); - -#if UE_TIMING_TRACE - - stop_meas(dlsch_turbo_decoding_stats); - - /*printf("Segmentation: C %d r %d, dlsch_rate_unmatching_stats %5.3f dlsch_deinterleaving_stats %5.3f dlsch_turbo_decoding_stats %5.3f \n", - harq_process->C, - r, - dlsch_rate_unmatching_stats->p_time/(cpuf*1000.0), - dlsch_deinterleaving_stats->p_time/(cpuf*1000.0), - dlsch_turbo_decoding_stats->p_time/(cpuf*1000.0));*/ -#endif - } - } - } -#endif - - - if ((err_flag == 0) && (ret>=(1+dlsch->max_turbo_iterations))) {// a Code segment is in error so break; - LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1); - err_flag = 1; - } - } - - int32_t frame_rx_prev = frame; - int32_t subframe_rx_prev = subframe - 1; - if (subframe_rx_prev < 0) { - frame_rx_prev--; - subframe_rx_prev += 10; - } - frame_rx_prev = frame_rx_prev%1024; - - if (err_flag == 1) { -#if UE_DEBUG_TRACE - LOG_I(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n", - phy_vars_ue->Mod_id, frame, subframe, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round); -#endif - dlsch->harq_ack[subframe].ack = 0; - dlsch->harq_ack[subframe].harq_id = harq_pid; - dlsch->harq_ack[subframe].send_harq_status = 1; - harq_process->errors[harq_process->round]++; - harq_process->round++; - - - // printf("Rate: [UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round); - if (harq_process->round >= dlsch->Mdlharq) { - harq_process->status = SCH_IDLE; - harq_process->round = 0; - } - if(is_crnti) - { - LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for subframe %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n", - phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS); - } - - return((1+dlsch->max_turbo_iterations)); - } else { -#if UE_DEBUG_TRACE - LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d TBS %d mcs %d nb_rb %d\n", - phy_vars_ue->Mod_id,subframe,harq_process->TBS,harq_process->mcs,harq_process->nb_rb); -#endif - - harq_process->status = SCH_IDLE; - harq_process->round = 0; - dlsch->harq_ack[subframe].ack = 1; - dlsch->harq_ack[subframe].harq_id = harq_pid; - dlsch->harq_ack[subframe].send_harq_status = 1; - //LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n", - // phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs); - - if(is_crnti) - { - LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round,harq_process->TBS); - } - //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round); - - } - - // Reassembly of Transport block here - offset = 0; - - /* - printf("harq_pid %d\n",harq_pid); - printf("F %d, Fbytes %d\n",harq_process->F,harq_process->F>>3); - printf("C %d\n",harq_process->C); - */ - for (r=0; r<harq_process->C; r++) { - if (r<harq_process->Cminus) - Kr = harq_process->Kminus; - else - Kr = harq_process->Kplus; - - Kr_bytes = Kr>>3; - - // printf("Segment %d : Kr= %d bytes\n",r,Kr_bytes); - if (r==0) { - memcpy(harq_process->b, - &harq_process->c[0][(harq_process->F>>3)], - Kr_bytes - (harq_process->F>>3)- ((harq_process->C>1)?3:0)); - offset = Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0); - // printf("copied %d bytes to b sequence (harq_pid %d)\n", - // Kr_bytes - (harq_process->F>>3),harq_pid); - // printf("b[0] = %x,c[%d] = %x\n", - // harq_process->b[0], - // harq_process->F>>3, - // harq_process->c[0][(harq_process->F>>3)]); - } else { - memcpy(harq_process->b+offset, - harq_process->c[r], - Kr_bytes- ((harq_process->C>1)?3:0)); - offset += (Kr_bytes - ((harq_process->C>1)?3:0)); - } - } - - dlsch->last_iteration_cnt = ret; - - return(ret); -} - diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c deleted file mode 100644 index 6284f279d895d04590cf44ca3d792c1fcda40f47..0000000000000000000000000000000000000000 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c +++ /dev/null @@ -1,6155 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file PHY/LTE_TRANSPORT/dlsch_demodulation.c - * \brief Top-level routines for demodulating the PDSCH physical channel from 36-211, V8.6 2009-03 - * \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert, X. Xiang - * \date 2011 - * \version 0.1 - * \company Eurecom - * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,ankit.bhamri@eurecom.fr,sebastien.aubert@eurecom.fr - * \note - * \warning - */ -//#include "PHY/defs.h" -#include "PHY/extern.h" -#include "SCHED/defs.h" -#include "defs.h" -#include "extern.h" -#include "PHY/sse_intrin.h" -#include "T.h" - -#define NOCYGWIN_STATIC - -/* dynamic shift for LLR computation for TM3/4 - * set as command line argument, see lte-softmodem.c - * default value: 0 - */ -int16_t dlsch_demod_shift = 0; -int16_t interf_unaw_shift = 13; - -//#define DEBUG_HARQ - -#define DEBUG_PHY 1 -//#define DEBUG_DLSCH_DEMOD 1 - -//#define DISABLE_LOG_X - -// [MCS][i_mod (0,1,2) = (2,4,6)] -unsigned char offset_mumimo_llr_drange_fix=0; -//inferference-free case -unsigned char interf_unaw_shift_tm4_mcs[29]={5, 3, 4, 3, 3, 2, 1, 1, 2, 0, 1, 1, 1, 1, 0, 0, - 1, 1, 1, 1, 0, 2, 1, 0, 1, 0, 1, 0, 0} ; -unsigned char interf_unaw_shift_tm1_mcs[29]={5, 5, 4, 3, 3, 3, 2, 2, 4, 4, 2, 3, 3, 3, 1, 1, - 0, 1, 1, 2, 5, 4, 4, 6, 5, 1, 0, 5, 6} ; // mcs 21, 26, 28 seem to be errorneous - -/* -//original values from sebastion + same hand tuning -unsigned char offset_mumimo_llr_drange[29][3]={{8,8,8},{7,7,7},{7,7,7},{7,7,7},{6,6,6},{6,6,6},{6,6,6},{5,5,5},{4,4,4},{1,2,4}, // QPSK -{5,5,4},{5,5,5},{5,5,5},{3,3,3},{2,2,2},{2,2,2},{2,2,2}, // 16-QAM -{2,2,1},{3,3,3},{3,3,3},{3,3,1},{2,2,2},{2,2,2},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; //64-QAM -*/ - /* - //first optimization try - unsigned char offset_mumimo_llr_drange[29][3]={{7, 8, 7},{6, 6, 7},{6, 6, 7},{6, 6, 6},{5, 6, 6},{5, 5, 6},{5, 5, 6},{4, 5, 4},{4, 3, 4},{3, 2, 2},{6, 5, 5},{5, 4, 4},{5, 5, 4},{3, 3, 2},{2, 2, 1},{2, 1, 1},{2, 2, 2},{3, 3, 3},{3, 3, 2},{3, 3, 2},{3, 2, 1},{2, 2, 2},{2, 2, 2},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}}; - */ - //second optimization try - /* - unsigned char offset_mumimo_llr_drange[29][3]={{5, 8, 7},{4, 6, 8},{3, 6, 7},{7, 7, 6},{4, 7, 8},{4, 7, 4},{6, 6, 6},{3, 6, 6},{3, 6, 6},{1, 3, 4},{1, 1, 0},{3, 3, 2},{3, 4, 1},{4, 0, 1},{4, 2, 2},{3, 1, 2},{2, 1, 0},{2, 1, 1},{1, 0, 1},{1, 0, 1},{0, 0, 0},{1, 0, 0},{0, 0, 0},{0, 1, 0},{1, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}}; w - */ -unsigned char offset_mumimo_llr_drange[29][3]= {{0, 6, 5},{0, 4, 5},{0, 4, 5},{0, 5, 4},{0, 5, 6},{0, 5, 3},{0, 4, 4},{0, 4, 4},{0, 3, 3},{0, 1, 2},{1, 1, 0},{1, 3, 2},{3, 4, 1},{2, 0, 0},{2, 2, 2},{1, 1, 1},{2, 1, 0},{2, 1, 1},{1, 0, 1},{1, 0, 1},{0, 0, 0},{1, 0, 0},{0, 0, 0},{0, 1, 0},{1, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}}; - - -extern void print_shorts(char *s,int16_t *x); - - -int rx_pdsch(PHY_VARS_UE *ue, - PDSCH_t type, - unsigned char eNB_id, - unsigned char eNB_id_i, //if this == ue->n_connected_eNB, we assume MU interference - uint32_t frame, - uint8_t subframe, - unsigned char symbol, - unsigned char first_symbol_flag, - RX_type_t rx_type, - unsigned char i_mod, - unsigned char harq_pid) -{ - - LTE_UE_COMMON *common_vars = &ue->common_vars; - LTE_UE_PDSCH **pdsch_vars; - LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; - PHY_MEASUREMENTS *measurements = &ue->measurements; - LTE_UE_DLSCH_t **dlsch; - - int avg[4]; - int avg_0[2]; - int avg_1[2]; - -#if UE_TIMING_TRACE - uint8_t slot = 0; -#endif - - unsigned char aatx,aarx; - - unsigned short nb_rb = 0, round; - int avgs = 0, rb; - LTE_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq = 0; - - uint8_t beamforming_mode; - uint32_t *rballoc; - - int32_t **rxdataF_comp_ptr; - int32_t **dl_ch_mag_ptr; - int32_t codeword_TB0 = -1; - int32_t codeword_TB1 = -1; - - - - switch (type) { - case SI_PDSCH: - pdsch_vars = &ue->pdsch_vars_SI[eNB_id]; - dlsch = &ue->dlsch_SI[eNB_id]; - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - beamforming_mode = 0; - break; - - case RA_PDSCH: - pdsch_vars = &ue->pdsch_vars_ra[eNB_id]; - dlsch = &ue->dlsch_ra[eNB_id]; - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - beamforming_mode = 0; - break; - - case PDSCH: - pdsch_vars = ue->pdsch_vars[ue->current_thread_id[subframe]]; - dlsch = ue->dlsch[ue->current_thread_id[subframe]][eNB_id]; - //printf("status TB0 = %d, status TB1 = %d \n", dlsch[0]->harq_processes[harq_pid]->status, dlsch[1]->harq_processes[harq_pid]->status); - LOG_D(PHY,"AbsSubframe %d.%d / Sym %d harq_pid %d, harq status %d.%d \n", - frame,subframe,symbol,harq_pid, - dlsch[0]->harq_processes[harq_pid]->status, - dlsch[1]->harq_processes[harq_pid]->status); - - if ((dlsch[0]->harq_processes[harq_pid]->status == ACTIVE) && - (dlsch[1]->harq_processes[harq_pid]->status == ACTIVE)){ - codeword_TB0 = dlsch[0]->harq_processes[harq_pid]->codeword; - codeword_TB1 = dlsch[1]->harq_processes[harq_pid]->codeword; - dlsch0_harq = dlsch[codeword_TB0]->harq_processes[harq_pid]; - dlsch1_harq = dlsch[codeword_TB1]->harq_processes[harq_pid]; -#ifdef DEBUG_HARQ - printf("[DEMOD] I am assuming both TBs are active\n"); -#endif - } - else if ((dlsch[0]->harq_processes[harq_pid]->status == ACTIVE) && - (dlsch[1]->harq_processes[harq_pid]->status != ACTIVE) ) { - codeword_TB0 = dlsch[0]->harq_processes[harq_pid]->codeword; - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - dlsch1_harq = NULL; - codeword_TB1 = -1; -#ifdef DEBUG_HARQ - printf("[DEMOD] I am assuming only TB0 is active\n"); -#endif - } - else if ((dlsch[0]->harq_processes[harq_pid]->status != ACTIVE) && - (dlsch[1]->harq_processes[harq_pid]->status == ACTIVE) ){ - codeword_TB1 = dlsch[1]->harq_processes[harq_pid]->codeword; - dlsch0_harq = dlsch[1]->harq_processes[harq_pid]; - dlsch1_harq = NULL; - codeword_TB0 = -1; -#ifdef DEBUG_HARQ - printf("[DEMOD] I am assuming only TB1 is active, it is in cw %d\n", dlsch0_harq->codeword); -#endif - } - else { - LOG_E(PHY,"[UE][FATAL] Frame %d subframe %d: no active DLSCH\n",ue->proc.proc_rxtx[0].frame_rx,subframe); - return(-1); - } - beamforming_mode = ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id]; - break; - - default: - LOG_E(PHY,"[UE][FATAL] Frame %d subframe %d: Unknown PDSCH format %d\n",ue->proc.proc_rxtx[0].frame_rx,subframe,type); - return(-1); - break; - } -#ifdef DEBUG_HARQ - printf("[DEMOD] MIMO mode = %d\n", dlsch0_harq->mimo_mode); - printf("[DEMOD] cw for TB0 = %d, cw for TB1 = %d\n", codeword_TB0, codeword_TB1); -#endif - - DevAssert(dlsch0_harq); - round = dlsch0_harq->round; - //printf("round = %d\n", round); - - if (eNB_id > 2) { - LOG_W(PHY,"dlsch_demodulation.c: Illegal eNB_id %d\n",eNB_id); - return(-1); - } - - if (!common_vars) { - LOG_W(PHY,"dlsch_demodulation.c: Null common_vars\n"); - return(-1); - } - - if (!dlsch[0]) { - LOG_W(PHY,"dlsch_demodulation.c: Null dlsch_ue pointer\n"); - return(-1); - } - - if (!pdsch_vars) { - LOG_W(PHY,"dlsch_demodulation.c: Null pdsch_vars pointer\n"); - return(-1); - } - - if (!frame_parms) { - LOG_W(PHY,"dlsch_demodulation.c: Null frame_parms\n"); - return(-1); - } - - if (((frame_parms->Ncp == NORMAL) && (symbol>=7)) || - ((frame_parms->Ncp == EXTENDED) && (symbol>=6))) - rballoc = dlsch0_harq->rb_alloc_odd; - else - rballoc = dlsch0_harq->rb_alloc_even; - - - if (dlsch0_harq->mimo_mode>DUALSTREAM_PUSCH_PRECODING) { - LOG_E(PHY,"This transmission mode is not yet supported!\n"); - return(-1); - } - - - if ((dlsch0_harq->mimo_mode==LARGE_CDD) || ((dlsch0_harq->mimo_mode>=DUALSTREAM_UNIFORM_PRECODING1) && (dlsch0_harq->mimo_mode<=DUALSTREAM_PUSCH_PRECODING))) { - DevAssert(dlsch1_harq); - if (eNB_id!=eNB_id_i) { - LOG_E(PHY,"TM3/TM4 requires to set eNB_id==eNB_id_i!\n"); - return(-1); - } - } - -#if UE_TIMING_TRACE - if(symbol > ue->frame_parms.symbols_per_tti>>1) - { - slot = 1; - } -#endif - -#ifdef DEBUG_HARQ - printf("Demod dlsch0_harq->pmi_alloc %d\n", dlsch0_harq->pmi_alloc); -#endif - - if (frame_parms->nb_antenna_ports_eNB>1 && beamforming_mode==0) { -#ifdef DEBUG_DLSCH_MOD - LOG_I(PHY,"dlsch: using pmi %x (%p), rb_alloc %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),dlsch[0],dlsch0_harq->rb_alloc_even[0]); -#endif - -#if UE_TIMING_TRACE - start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); -#endif - nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, - common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id], - pdsch_vars[eNB_id]->rxdataF_ext, - pdsch_vars[eNB_id]->dl_ch_estimates_ext, - dlsch0_harq->pmi_alloc, - pdsch_vars[eNB_id]->pmi_ext, - rballoc, - symbol, - subframe, - ue->high_speed_flag, - frame_parms, - dlsch0_harq->mimo_mode); -#ifdef DEBUG_DLSCH_MOD - printf("dlsch: using pmi %lx, rb_alloc %x, pmi_ext ",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),*rballoc); - for (rb=0;rb<nb_rb;rb++) - printf("%d",pdsch_vars[eNB_id]->pmi_ext[rb]); - printf("\n"); -#endif - - if (rx_type >= rx_IC_single_stream) { - if (eNB_id_i<ue->n_connected_eNB) // we are in TM5 - nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, - common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id_i], - pdsch_vars[eNB_id_i]->rxdataF_ext, - pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - dlsch0_harq->pmi_alloc, - pdsch_vars[eNB_id_i]->pmi_ext, - rballoc, - symbol, - subframe, - ue->high_speed_flag, - frame_parms, - dlsch0_harq->mimo_mode); - else - nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, - common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id], - pdsch_vars[eNB_id_i]->rxdataF_ext, - pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - dlsch0_harq->pmi_alloc, - pdsch_vars[eNB_id_i]->pmi_ext, - rballoc, - symbol, - subframe, - ue->high_speed_flag, - frame_parms, - dlsch0_harq->mimo_mode); - } - } else if (beamforming_mode==0) { //else if nb_antennas_ports_eNB==1 && beamforming_mode == 0 - nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, - common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id], - pdsch_vars[eNB_id]->rxdataF_ext, - pdsch_vars[eNB_id]->dl_ch_estimates_ext, - dlsch0_harq->pmi_alloc, - pdsch_vars[eNB_id]->pmi_ext, - rballoc, - symbol, - subframe, - ue->high_speed_flag, - frame_parms); - - if (rx_type==rx_IC_single_stream) { - if (eNB_id_i<ue->n_connected_eNB) - nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, - common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id_i], - pdsch_vars[eNB_id_i]->rxdataF_ext, - pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - dlsch0_harq->pmi_alloc, - pdsch_vars[eNB_id_i]->pmi_ext, - rballoc, - symbol, - subframe, - ue->high_speed_flag, - frame_parms); - else - nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, - common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id], - pdsch_vars[eNB_id_i]->rxdataF_ext, - pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - dlsch0_harq->pmi_alloc, - pdsch_vars[eNB_id_i]->pmi_ext, - rballoc, - symbol, - subframe, - ue->high_speed_flag, - frame_parms); - } - } else if (beamforming_mode==7) { //else if beamforming_mode == 7 - nb_rb = dlsch_extract_rbs_TM7(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, - pdsch_vars[eNB_id]->dl_bf_ch_estimates, - pdsch_vars[eNB_id]->rxdataF_ext, - pdsch_vars[eNB_id]->dl_bf_ch_estimates_ext, - rballoc, - symbol, - subframe, - ue->high_speed_flag, - frame_parms); - - } else if(beamforming_mode>7) { - LOG_W(PHY,"dlsch_demodulation: beamforming mode not supported yet.\n"); - } - - //printf("nb_rb = %d, eNB_id %d\n",nb_rb,eNB_id); - if (nb_rb==0) { - // LOG_D(PHY,"dlsch_demodulation.c: nb_rb=0\n"); - return(-1); - } - - -#if UE_TIMING_TRACE - stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); -#if DISABLE_LOG_X - printf("[AbsSFN %d.%d] Slot%d Symbol %d Flag %d type %d: Pilot/Data extraction %5.2f \n",frame,subframe,slot, - symbol,ue->high_speed_flag,type,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); -#else - LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d Flag %d type %d: Pilot/Data extraction %5.2f \n",frame,subframe,slot,symbol, - ue->high_speed_flag,type,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); -#endif -#endif - - -#if UE_TIMING_TRACE - start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); -#endif - aatx = frame_parms->nb_antenna_ports_eNB; - aarx = frame_parms->nb_antennas_rx; - - dlsch_scale_channel(pdsch_vars[eNB_id]->dl_ch_estimates_ext, - frame_parms, - dlsch, - symbol, - nb_rb); - - if ((dlsch0_harq->mimo_mode<DUALSTREAM_UNIFORM_PRECODING1) && - (rx_type==rx_IC_single_stream) && - (eNB_id_i==ue->n_connected_eNB) && - (dlsch0_harq->dl_power_off==0) - ) // TM5 two-user - { - dlsch_scale_channel(pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - frame_parms, - dlsch, - symbol, - nb_rb); - } - -#if UE_TIMING_TRACE - stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); -#if DISABLE_LOG_X - printf("[AbsSFN %d.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); -#else - LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); -#endif -#endif - -#if UE_TIMING_TRACE - start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); -#endif - if (first_symbol_flag==1) { - if (beamforming_mode==0){ - if (dlsch0_harq->mimo_mode<LARGE_CDD) { - dlsch_channel_level(pdsch_vars[eNB_id]->dl_ch_estimates_ext, - frame_parms, - avg, - symbol, - nb_rb); - avgs = 0; - for (aatx=0;aatx<frame_parms->nb_antenna_ports_eNB;aatx++) - for (aarx=0;aarx<frame_parms->nb_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_mode<DUALSTREAM_UNIFORM_PRECODING1) {// single-layer precoding (TM5, TM6) - if ((rx_type==rx_IC_single_stream) && (eNB_id_i==ue->n_connected_eNB) && (dlsch0_harq->dl_power_off==0)) { - dlsch_channel_level_TM56(pdsch_vars[eNB_id]->dl_ch_estimates_ext, - frame_parms, - pdsch_vars[eNB_id]->pmi_ext, - avg, - symbol, - nb_rb); - avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(i_mod>>1)-1]; - pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0); - - } - else if (dlsch0_harq->dl_power_off==1) { //TM6 - - dlsch_channel_level(pdsch_vars[eNB_id]->dl_ch_estimates_ext, - frame_parms, - avg, - symbol, - nb_rb); - - avgs = 0; - for (aatx=0;aatx<frame_parms->nb_antenna_ports_eNB;aatx++) - for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) - avgs = cmax(avgs,avg[(aatx<<1)+aarx]); - - pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2) + 1; - pdsch_vars[eNB_id]->log2_maxh++; - - } - } - - } - else if (beamforming_mode==7) - dlsch_channel_level_TM7(pdsch_vars[eNB_id]->dl_bf_ch_estimates_ext, - frame_parms, - avg, - symbol, - nb_rb); -#ifdef UE_DEBUG_TRACE - LOG_D(PHY,"[DLSCH] AbsSubframe %d.%d log2_maxh = %d [log2_maxh0 %d log2_maxh1 %d] (%d,%d)\n", - frame%1024,subframe, pdsch_vars[eNB_id]->log2_maxh, - pdsch_vars[eNB_id]->log2_maxh0, - pdsch_vars[eNB_id]->log2_maxh1, - avg[0],avgs); - //LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode); -#endif - - //wait until pdcch is decoded - //proc->channel_level = 1; - } - - /* - uint32_t wait = 0; - while(proc->channel_level == 0) - { - usleep(1); - wait++; - } - */ - -#if T_TRACER - if (type == PDSCH) - { - T(T_UE_PHY_PDSCH_ENERGY, T_INT(eNB_id), T_INT(frame%1024), T_INT(subframe), - T_INT(avg[0]), T_INT(avg[1]), T_INT(avg[2]), T_INT(avg[3])); - } -#endif - -#if UE_TIMING_TRACE - stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); -#if DISABLE_LOG_X - printf("[AbsSFN %d.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,subframe,slot,symbol,first_symbol_flag,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); -#else - LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,subframe,slot,symbol,first_symbol_flag,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); -#endif -#endif - - -#if UE_TIMING_TRACE - start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); -#endif -// Now channel compensation - if (dlsch0_harq->mimo_mode<LARGE_CDD) { - dlsch_channel_compensation(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, - (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_i<ue->n_connected_eNB)) { - dlsch_channel_compensation(pdsch_vars[eNB_id_i]->rxdataF_ext, - pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - pdsch_vars[eNB_id_i]->dl_ch_mag0, - pdsch_vars[eNB_id_i]->dl_ch_magb0, - pdsch_vars[eNB_id_i]->rxdataF_comp0, - (aatx>1) ? pdsch_vars[eNB_id_i]->rho : NULL, - frame_parms, - symbol, - first_symbol_flag, - i_mod, - nb_rb, - pdsch_vars[eNB_id]->log2_maxh, - measurements); // log2_maxh+I0_shift -#ifdef DEBUG_PHY - if (symbol == 5) { - write_output("rxF_comp_d.m","rxF_c_d",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); - write_output("rxF_comp_i.m","rxF_c_i",&pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); - } -#endif - - dlsch_dual_stream_correlation(frame_parms, - symbol, - nb_rb, - pdsch_vars[eNB_id]->dl_ch_estimates_ext, - pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], - pdsch_vars[eNB_id]->log2_maxh); - } - } else if ((dlsch0_harq->mimo_mode == LARGE_CDD) || ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) && - (dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))){ - dlsch_channel_compensation_TM34(frame_parms, - pdsch_vars[eNB_id], - measurements, - eNB_id, - symbol, - dlsch0_harq->Qm, - dlsch1_harq->Qm, - harq_pid, - dlsch0_harq->round, - dlsch0_harq->mimo_mode, - nb_rb, - pdsch_vars[eNB_id]->log2_maxh0, - pdsch_vars[eNB_id]->log2_maxh1); - /* if (symbol == 5) { - write_output("rxF_comp_d00.m","rxF_c_d00",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM - write_output("rxF_comp_d01.m","rxF_c_d01",&pdsch_vars[eNB_id]->rxdataF_comp0[1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0 - write_output("rxF_comp_d10.m","rxF_c_d10",&pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0 - write_output("rxF_comp_d11.m","rxF_c_d11",&pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round][1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be QAM - } */ - // compute correlation between signal and interference channels (rho12 and rho21) - dlsch_dual_stream_correlation(frame_parms, // this is doing h11'*h12 and h21'*h22 - symbol, - nb_rb, - pdsch_vars[eNB_id]->dl_ch_estimates_ext, - &(pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]), - pdsch_vars[eNB_id]->dl_ch_rho2_ext, - pdsch_vars[eNB_id]->log2_maxh0); - //printf("rho stream1 =%d\n", &pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round] ); - //to be optimized (just take complex conjugate) - dlsch_dual_stream_correlation(frame_parms, // this is doing h12'*h11 and h22'*h21 - symbol, - nb_rb, - &(pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]), - pdsch_vars[eNB_id]->dl_ch_estimates_ext, - pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], - pdsch_vars[eNB_id]->log2_maxh1); - // printf("rho stream2 =%d\n",&pdsch_vars[eNB_id]->dl_ch_rho2_ext ); - //printf("TM3 log2_maxh : %d\n",pdsch_vars[eNB_id]->log2_maxh); - /* if (symbol == 5) { - write_output("rho0_0.m","rho0_0",&pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM - write_output("rho2_0.m","rho2_0",&pdsch_vars[eNB_id]->dl_ch_rho2_ext[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0 - write_output("rho0_1.m.m","rho0_1",&pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round][1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0 - write_output("rho2_1.m","rho2_1",&pdsch_vars[eNB_id]->dl_ch_rho2_ext[1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be QAM - } */ - - } else if (dlsch0_harq->mimo_mode<DUALSTREAM_UNIFORM_PRECODING1) {// single-layer precoding (TM5, TM6) - if ((rx_type==rx_IC_single_stream) && (eNB_id_i==ue->n_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; rb<nb_rb; rb++) { - switch(pdsch_vars[eNB_id]->pmi_ext[rb]) { - case 0: - pdsch_vars[eNB_id_i]->pmi_ext[rb]=1; - break; - case 1: - pdsch_vars[eNB_id_i]->pmi_ext[rb]=0; - break; - case 2: - pdsch_vars[eNB_id_i]->pmi_ext[rb]=3; - break; - case 3: - pdsch_vars[eNB_id_i]->pmi_ext[rb]=2; - break; - } - // if (rb==0) - // printf("pmi %d, pmi_i %d\n",pdsch_vars[eNB_id]->pmi_ext[rb],pdsch_vars[eNB_id_i]->pmi_ext[rb]); - } - dlsch_channel_compensation_TM56(pdsch_vars[eNB_id_i]->rxdataF_ext, - pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - pdsch_vars[eNB_id_i]->dl_ch_mag0, - pdsch_vars[eNB_id_i]->dl_ch_magb0, - pdsch_vars[eNB_id_i]->rxdataF_comp0, - pdsch_vars[eNB_id_i]->pmi_ext, - frame_parms, - measurements, - eNB_id_i, - symbol, - i_mod, - nb_rb, - pdsch_vars[eNB_id]->log2_maxh, - dlsch0_harq->dl_power_off); -#ifdef DEBUG_PHY - if (symbol==5) { - write_output("rxF_comp_d.m","rxF_c_d",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); - write_output("rxF_comp_i.m","rxF_c_i",&pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); - } -#endif - dlsch_dual_stream_correlation(frame_parms, - symbol, - nb_rb, - pdsch_vars[eNB_id]->dl_ch_estimates_ext, - pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], - pdsch_vars[eNB_id]->log2_maxh); - } else if (dlsch0_harq->dl_power_off==1) { - dlsch_channel_compensation_TM56(pdsch_vars[eNB_id]->rxdataF_ext, - pdsch_vars[eNB_id]->dl_ch_estimates_ext, - pdsch_vars[eNB_id]->dl_ch_mag0, - pdsch_vars[eNB_id]->dl_ch_magb0, - pdsch_vars[eNB_id]->rxdataF_comp0, - pdsch_vars[eNB_id]->pmi_ext, - frame_parms, - measurements, - eNB_id, - symbol, - dlsch0_harq->Qm, - nb_rb, - pdsch_vars[eNB_id]->log2_maxh, - 1); - - } - - - } else if (dlsch0_harq->mimo_mode==TM7) { //TM7 - - dlsch_channel_compensation(pdsch_vars[eNB_id]->rxdataF_ext, - pdsch_vars[eNB_id]->dl_bf_ch_estimates_ext, - pdsch_vars[eNB_id]->dl_ch_mag0, - pdsch_vars[eNB_id]->dl_ch_magb0, - pdsch_vars[eNB_id]->rxdataF_comp0, - (aatx>1) ? pdsch_vars[eNB_id]->rho : NULL, - frame_parms, - symbol, - first_symbol_flag, - get_Qm(dlsch0_harq->mcs), - nb_rb, - //9, - pdsch_vars[eNB_id]->log2_maxh, - measurements); // log2_maxh+I0_shift - } - -#if UE_TIMING_TRACE - stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); -#if DISABLE_LOG_X - printf("[AbsSFN %d.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,subframe,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); -#else - LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,subframe,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); -#endif -#endif -// MRC -#if UE_TIMING_TRACE - start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); -#endif - - if (frame_parms->nb_antennas_rx > 1) { - if ((dlsch0_harq->mimo_mode == LARGE_CDD) || - ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) && - (dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))){ // TM3 or TM4 - if (frame_parms->nb_antenna_ports_eNB == 2) { - dlsch_detection_mrc_TM34(frame_parms, - pdsch_vars[eNB_id], - harq_pid, - dlsch0_harq->round, - symbol, - nb_rb, - 1); - /* if (symbol == 5) { - write_output("rho0_mrc.m","rho0_0",&pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM - write_output("rho2_mrc.m","rho2_0",&pdsch_vars[eNB_id]->dl_ch_rho2_ext[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0 - } */ - } - } else { - dlsch_detection_mrc(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - pdsch_vars[eNB_id_i]->rxdataF_comp0, - pdsch_vars[eNB_id]->rho, - pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], - pdsch_vars[eNB_id]->dl_ch_mag0, - pdsch_vars[eNB_id]->dl_ch_magb0, - pdsch_vars[eNB_id_i]->dl_ch_mag0, - pdsch_vars[eNB_id_i]->dl_ch_magb0, - symbol, - nb_rb, - rx_type==rx_IC_single_stream); - } - } - // printf("Combining"); - if ((dlsch0_harq->mimo_mode == SISO) || - ((dlsch0_harq->mimo_mode >= UNIFORM_PRECODING11) && - (dlsch0_harq->mimo_mode <= PUSCH_PRECODING0)) || - (dlsch0_harq->mimo_mode == TM7)) { - /* - dlsch_siso(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp, - pdsch_vars[eNB_id_i]->rxdataF_comp, - symbol, - nb_rb); - */ - } else if (dlsch0_harq->mimo_mode == ALAMOUTI) { - dlsch_alamouti(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - pdsch_vars[eNB_id]->dl_ch_mag0, - pdsch_vars[eNB_id]->dl_ch_magb0, - symbol, - nb_rb); - } - - // printf("LLR"); - if ((dlsch0_harq->mimo_mode == LARGE_CDD) || - ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) && - (dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))) { - rxdataF_comp_ptr = pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round]; - dl_ch_mag_ptr = pdsch_vars[eNB_id]->dl_ch_mag1[harq_pid][round]; - } - else { - rxdataF_comp_ptr = pdsch_vars[eNB_id_i]->rxdataF_comp0; - dl_ch_mag_ptr = pdsch_vars[eNB_id_i]->dl_ch_mag0; - //i_mod should have been passed as a parameter - } - -#if UE_TIMING_TRACE - stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); -#if DISABLE_LOG_X - printf("[AbsSFN %d.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); -#else - LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); -#endif -#endif - -#if UE_TIMING_TRACE - start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); -#endif - //printf("LLR dlsch0_harq->Qm %d rx_type %d cw0 %d cw1 %d symbol %d \n",dlsch0_harq->Qm,rx_type,codeword_TB0,codeword_TB1,symbol); - // compute LLRs - // -> // compute @pointer where llrs should filled for this ofdm-symbol - int8_t *pllr_symbol_cw0; - int8_t *pllr_symbol_cw1; - uint32_t llr_offset_symbol; - llr_offset_symbol = pdsch_vars[eNB_id]->llr_offset[symbol]; - pllr_symbol_cw0 = (int8_t*)pdsch_vars[eNB_id]->llr[0]; - pllr_symbol_cw1 = (int8_t*)pdsch_vars[eNB_id]->llr[1]; - pllr_symbol_cw0 += llr_offset_symbol; - pllr_symbol_cw1 += llr_offset_symbol; - - LOG_I(PHY,"compute LLRs [AbsSubframe %d.%d-%d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %p @LLR Buff(symb) %p\n", - frame, subframe,symbol, - nb_rb,dlsch0_harq->Qm, - pdsch_vars[eNB_id]->llr_length[symbol], - pdsch_vars[eNB_id]->llr_offset[symbol], - (int16_t*)pdsch_vars[eNB_id]->llr[0], - pllr_symbol_cw0); - - switch (dlsch0_harq->Qm) { - case 2 : - if ((rx_type==rx_standard) || (codeword_TB1 == -1)) { - - - dlsch_qpsk_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - (int16_t*)pllr_symbol_cw0, - symbol, - first_symbol_flag, - nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - beamforming_mode); - - } else if (codeword_TB0 == -1){ - - dlsch_qpsk_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - (int16_t*)pllr_symbol_cw1, - symbol, - first_symbol_flag, - nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - beamforming_mode); - } - else if (rx_type >= rx_IC_single_stream) { - if (dlsch1_harq->Qm == 2) { - dlsch_qpsk_qpsk_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - rxdataF_comp_ptr, - pdsch_vars[eNB_id]->dl_ch_rho2_ext, - pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - pdsch_vars[eNB_id]->llr128); - if (rx_type==rx_IC_dual_stream) { - dlsch_qpsk_qpsk_llr(frame_parms, - rxdataF_comp_ptr, - pdsch_vars[eNB_id]->rxdataF_comp0, - pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], - pdsch_vars[eNB_id]->llr[1], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol), - pdsch_vars[eNB_id]->llr128_2ndstream); - } - } - else if (dlsch1_harq->Qm == 4) { - dlsch_qpsk_16qam_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - rxdataF_comp_ptr,//i - dl_ch_mag_ptr,//i - pdsch_vars[eNB_id]->dl_ch_rho2_ext, - pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - pdsch_vars[eNB_id]->llr128); - if (rx_type==rx_IC_dual_stream) { - dlsch_16qam_qpsk_llr(frame_parms, - rxdataF_comp_ptr, - pdsch_vars[eNB_id]->rxdataF_comp0,//i - dl_ch_mag_ptr, - pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], - pdsch_vars[eNB_id]->llr[1], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,subframe,symbol), - pdsch_vars[eNB_id]->llr128_2ndstream); - } - } - else { - dlsch_qpsk_64qam_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - rxdataF_comp_ptr,//i - dl_ch_mag_ptr,//i - pdsch_vars[eNB_id]->dl_ch_rho2_ext, - pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - pdsch_vars[eNB_id]->llr128); - if (rx_type==rx_IC_dual_stream) { - dlsch_64qam_qpsk_llr(frame_parms, - rxdataF_comp_ptr, - pdsch_vars[eNB_id]->rxdataF_comp0,//i - dl_ch_mag_ptr, - pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], - pdsch_vars[eNB_id]->llr[1], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,subframe,symbol), - pdsch_vars[eNB_id]->llr128_2ndstream); - } - } - } - break; - case 4 : - if ((rx_type==rx_standard ) || (codeword_TB1 == -1)) { - dlsch_16qam_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - pdsch_vars[eNB_id]->llr[0], - pdsch_vars[eNB_id]->dl_ch_mag0, - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol), - pdsch_vars[eNB_id]->llr128, - beamforming_mode); - } else if (codeword_TB0 == -1){ - dlsch_16qam_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - pdsch_vars[eNB_id]->llr[1], - pdsch_vars[eNB_id]->dl_ch_mag0, - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol), - pdsch_vars[eNB_id]->llr128_2ndstream, - beamforming_mode); - } - else if (rx_type >= rx_IC_single_stream) { - if (dlsch1_harq->Qm == 2) { - dlsch_16qam_qpsk_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - rxdataF_comp_ptr,//i - pdsch_vars[eNB_id]->dl_ch_mag0, - pdsch_vars[eNB_id]->dl_ch_rho2_ext, - pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol), - pdsch_vars[eNB_id]->llr128); - if (rx_type==rx_IC_dual_stream) { - dlsch_qpsk_16qam_llr(frame_parms, - rxdataF_comp_ptr, - pdsch_vars[eNB_id]->rxdataF_comp0,//i - pdsch_vars[eNB_id]->dl_ch_mag0,//i - pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], - pdsch_vars[eNB_id]->llr[1], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol), - pdsch_vars[eNB_id]->llr128_2ndstream); - } - } - else if (dlsch1_harq->Qm == 4) { - dlsch_16qam_16qam_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - rxdataF_comp_ptr,//i - pdsch_vars[eNB_id]->dl_ch_mag0, - dl_ch_mag_ptr,//i - pdsch_vars[eNB_id]->dl_ch_rho2_ext, - pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol), - pdsch_vars[eNB_id]->llr128); - if (rx_type==rx_IC_dual_stream) { - dlsch_16qam_16qam_llr(frame_parms, - rxdataF_comp_ptr, - pdsch_vars[eNB_id]->rxdataF_comp0,//i - dl_ch_mag_ptr, - pdsch_vars[eNB_id]->dl_ch_mag0,//i - pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], - pdsch_vars[eNB_id]->llr[1], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,subframe,symbol), - pdsch_vars[eNB_id]->llr128_2ndstream); - } - } - else { - dlsch_16qam_64qam_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - rxdataF_comp_ptr,//i - pdsch_vars[eNB_id]->dl_ch_mag0, - dl_ch_mag_ptr,//i - pdsch_vars[eNB_id]->dl_ch_rho2_ext, - pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol), - pdsch_vars[eNB_id]->llr128); - if (rx_type==rx_IC_dual_stream) { - dlsch_64qam_16qam_llr(frame_parms, - rxdataF_comp_ptr, - pdsch_vars[eNB_id]->rxdataF_comp0, - dl_ch_mag_ptr, - pdsch_vars[eNB_id]->dl_ch_mag0, - pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], - pdsch_vars[eNB_id]->llr[1], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,subframe,symbol), - pdsch_vars[eNB_id]->llr128_2ndstream); - } - } - } - break; - case 6 : - if ((rx_type==rx_standard) || (codeword_TB1 == -1)) { - dlsch_64qam_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - (int16_t*)pllr_symbol_cw0, - pdsch_vars[eNB_id]->dl_ch_mag0, - pdsch_vars[eNB_id]->dl_ch_magb0, - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol), - pdsch_vars[eNB_id]->llr_offset[symbol], - beamforming_mode); - } else if (codeword_TB0 == -1){ - dlsch_64qam_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - (int16_t*)pllr_symbol_cw1, - pdsch_vars[eNB_id]->dl_ch_mag0, - pdsch_vars[eNB_id]->dl_ch_magb0, - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol), - pdsch_vars[eNB_id]->llr_offset[symbol], - beamforming_mode); - } - else if (rx_type >= rx_IC_single_stream) { - if (dlsch1_harq->Qm == 2) { - dlsch_64qam_qpsk_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - rxdataF_comp_ptr,//i - pdsch_vars[eNB_id]->dl_ch_mag0, - pdsch_vars[eNB_id]->dl_ch_rho2_ext, - pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol), - pdsch_vars[eNB_id]->llr128); - if (rx_type==rx_IC_dual_stream) { - dlsch_qpsk_64qam_llr(frame_parms, - rxdataF_comp_ptr, - pdsch_vars[eNB_id]->rxdataF_comp0,//i - pdsch_vars[eNB_id]->dl_ch_mag0, - pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], - pdsch_vars[eNB_id]->llr[1], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol), - pdsch_vars[eNB_id]->llr128_2ndstream); - } - } - else if (dlsch1_harq->Qm == 4) { - dlsch_64qam_16qam_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - rxdataF_comp_ptr,//i - pdsch_vars[eNB_id]->dl_ch_mag0, - dl_ch_mag_ptr,//i - pdsch_vars[eNB_id]->dl_ch_rho2_ext, - pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol), - pdsch_vars[eNB_id]->llr128); - if (rx_type==rx_IC_dual_stream) { - dlsch_16qam_64qam_llr(frame_parms, - rxdataF_comp_ptr, - pdsch_vars[eNB_id]->rxdataF_comp0,//i - dl_ch_mag_ptr, - pdsch_vars[eNB_id]->dl_ch_mag0,//i - pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], - pdsch_vars[eNB_id]->llr[1], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,subframe,symbol), - pdsch_vars[eNB_id]->llr128_2ndstream); - } - } - else { - dlsch_64qam_64qam_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - rxdataF_comp_ptr,//i - pdsch_vars[eNB_id]->dl_ch_mag0, - dl_ch_mag_ptr,//i - pdsch_vars[eNB_id]->dl_ch_rho2_ext, - (int16_t*)pllr_symbol_cw0, - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol), - pdsch_vars[eNB_id]->llr_offset[symbol]); - if (rx_type==rx_IC_dual_stream) { - dlsch_64qam_64qam_llr(frame_parms, - rxdataF_comp_ptr, - pdsch_vars[eNB_id]->rxdataF_comp0,//i - dl_ch_mag_ptr, - pdsch_vars[eNB_id]->dl_ch_mag0,//i - pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], - (int16_t*)pllr_symbol_cw1, - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,subframe,symbol), - pdsch_vars[eNB_id]->llr_offset[symbol]); - } - } - } - break; - default: - LOG_W(PHY,"rx_dlsch.c : Unknown mod_order!!!!\n"); - return(-1); - break; - } - if (dlsch1_harq) { - switch (get_Qm(dlsch1_harq->mcs)) { - case 2 : - if (rx_type==rx_standard) { - dlsch_qpsk_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - (int16_t*)pllr_symbol_cw0, - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - beamforming_mode); - } - break; - case 4: - if (rx_type==rx_standard) { - dlsch_16qam_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - pdsch_vars[eNB_id]->llr[0], - pdsch_vars[eNB_id]->dl_ch_mag0, - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol), - pdsch_vars[eNB_id]->llr128, - beamforming_mode); - } - break; - case 6 : - if (rx_type==rx_standard) { - dlsch_64qam_llr(frame_parms, - pdsch_vars[eNB_id]->rxdataF_comp0, - (int16_t*)pllr_symbol_cw0, - pdsch_vars[eNB_id]->dl_ch_mag0, - pdsch_vars[eNB_id]->dl_ch_magb0, - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol), - pdsch_vars[eNB_id]->llr_offset[symbol], - beamforming_mode); - } - break; - default: - LOG_W(PHY,"rx_dlsch.c : Unknown mod_order!!!!\n"); - return(-1); - break; - } - } - -#if UE_TIMING_TRACE - stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); -#if DISABLE_LOG_X - printf("[AbsSFN %d.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); -#else - LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); -#endif -#endif -// Please keep it: useful for debugging -#if 0 - if( (symbol == 13) && (subframe==0) && (dlsch0_harq->Qm == 6) /*&& (nb_rb==25)*/) - { - LOG_E(PHY,"Dump Phy Chan Est \n"); - if(1) - { -#if 1 - write_output("rxdataF0.m" , "rxdataF0", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[0][0],14*frame_parms->ofdm_symbol_size,1,1); - //write_output("rxdataF1.m" , "rxdataF1", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[0][0],14*frame_parms->ofdm_symbol_size,1,1); - write_output("dl_ch_estimates00.m", "dl_ch_estimates00", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][0][0],14*frame_parms->ofdm_symbol_size,1,1); - //write_output("dl_ch_estimates01.m", "dl_ch_estimates01", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][1][0],14*frame_parms->ofdm_symbol_size,1,1); - //write_output("dl_ch_estimates10.m", "dl_ch_estimates10", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2][0],14*frame_parms->ofdm_symbol_size,1,1); - //write_output("dl_ch_estimates11.m", "dl_ch_estimates11", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][3][0],14*frame_parms->ofdm_symbol_size,1,1); - - - //write_output("rxdataF_ext00.m" , "rxdataF_ext00", &pdsch_vars[eNB_id]->rxdataF_ext[0][0],14*frame_parms->N_RB_DL*12,1,1); - //write_output("rxdataF_ext01.m" , "rxdataF_ext01", &pdsch_vars[eNB_id]->rxdataF_ext[1][0],14*frame_parms->N_RB_DL*12,1,1); - //write_output("rxdataF_ext10.m" , "rxdataF_ext10", &pdsch_vars[eNB_id]->rxdataF_ext[2][0],14*frame_parms->N_RB_DL*12,1,1); - //write_output("rxdataF_ext11.m" , "rxdataF_ext11", &pdsch_vars[eNB_id]->rxdataF_ext[3][0],14*frame_parms->N_RB_DL*12,1,1); - write_output("dl_ch_estimates_ext00.m", "dl_ch_estimates_ext00", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[0][0],14*frame_parms->N_RB_DL*12,1,1); - //write_output("dl_ch_estimates_ext01.m", "dl_ch_estimates_ext01", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[1][0],14*frame_parms->N_RB_DL*12,1,1); - //write_output("dl_ch_estimates_ext10.m", "dl_ch_estimates_ext10", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[2][0],14*frame_parms->N_RB_DL*12,1,1); - //write_output("dl_ch_estimates_ext11.m", "dl_ch_estimates_ext11", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[3][0],14*frame_parms->N_RB_DL*12,1,1); - write_output("rxdataF_comp00.m","rxdataF_comp00", &pdsch_vars[eNB_id]->rxdataF_comp0[0][0],14*frame_parms->N_RB_DL*12,1,1); - //write_output("rxdataF_comp01.m","rxdataF_comp01", &pdsch_vars[eNB_id]->rxdataF_comp0[1][0],14*frame_parms->N_RB_DL*12,1,1); - //write_output("rxdataF_comp10.m","rxdataF_comp10", &pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round][0][0],14*frame_parms->N_RB_DL*12,1,1); - //write_output("rxdataF_comp11.m","rxdataF_comp11", &pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round][1][0],14*frame_parms->N_RB_DL*12,1,1); -#endif - write_output("llr0.m","llr0", &pdsch_vars[eNB_id]->llr[0][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0); - //write_output("llr1.m","llr1", &pdsch_vars[eNB_id]->llr[1][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0); - - - AssertFatal(0," "); - } - - } -#endif - - T(T_UE_PHY_PDSCH_IQ, T_INT(eNB_id), T_INT(frame%1024), - T_INT(subframe), T_INT(nb_rb), - T_INT(frame_parms->N_RB_UL), T_INT(frame_parms->symbols_per_tti), - T_BUFFER(&pdsch_vars[eNB_id]->rxdataF_comp0[eNB_id][0], - 2 * /* ulsch[UE_id]->harq_processes[harq_pid]->nb_rb */ frame_parms->N_RB_UL *12*frame_parms->symbols_per_tti*2)); - - return 0; -} - -//============================================================================================== -// Pre-processing for LLR computation -//============================================================================================== - -void dlsch_channel_compensation(int **rxdataF_ext, - int **dl_ch_estimates_ext, - int **dl_ch_mag, - int **dl_ch_magb, - int **rxdataF_comp, - int **rho, - LTE_DL_FRAME_PARMS *frame_parms, - unsigned char symbol, - uint8_t first_symbol_flag, - unsigned char mod_order, - unsigned short nb_rb, - unsigned char output_shift, - PHY_MEASUREMENTS *measurements) -{ - -#if defined(__i386) || defined(__x86_64) - - unsigned short rb; - unsigned char aatx,aarx,symbol_mod,pilots=0; - __m128i *dl_ch128,*dl_ch128_2,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128; - __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b; - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - - if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) { - - if (frame_parms->nb_antenna_ports_eNB==1) // 10 out of 12 so don't reduce size - nb_rb=1+(5*nb_rb/6); - else - pilots=1; - } - - for (aatx=0; aatx<frame_parms->nb_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; aarx<frame_parms->nb_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; rb<nb_rb; rb++) { - if (mod_order>2) { - // 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; aarx<frame_parms->nb_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; rb<nb_rb; rb++) { - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch128[0],dl_ch128_2[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,dl_ch128_2[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); - rho128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - - //print_shorts("rx:",dl_ch128_2); - //print_shorts("ch:",dl_ch128); - //print_shorts("pack:",rho128); - - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch128[1],dl_ch128_2[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,dl_ch128_2[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); - - - rho128[1] =_mm_packs_epi32(mmtmpD2,mmtmpD3); - //print_shorts("rx:",dl_ch128_2+1); - //print_shorts("ch:",dl_ch128+1); - //print_shorts("pack:",rho128+1); - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch128[2],dl_ch128_2[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,dl_ch128_2[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); - - rho128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - //print_shorts("rx:",dl_ch128_2+2); - //print_shorts("ch:",dl_ch128+2); - //print_shorts("pack:",rho128+2); - - dl_ch128+=3; - dl_ch128_2+=3; - rho128+=3; - - } - - if (first_symbol_flag==1) { - measurements->rx_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; aatx<frame_parms->nb_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; aarx<frame_parms->nb_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; rb<nb_rb; rb++) { - if (mod_order>2) { - // get channel amplitude if not QPSK - mmtmpD0 = vmull_s16(dl_ch128[0], dl_ch128[0]); - // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3]; - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits - mmtmpD1 = vmull_s16(dl_ch128[1], dl_ch128[1]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits - mmtmpD0 = vmull_s16(dl_ch128[2], dl_ch128[2]); - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - mmtmpD1 = vmull_s16(dl_ch128[3], dl_ch128[3]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - if (pilots==0) { - mmtmpD0 = vmull_s16(dl_ch128[4], dl_ch128[4]); - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - mmtmpD1 = vmull_s16(dl_ch128[5], dl_ch128[5]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - } - - dl_ch_mag128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128b); - dl_ch_mag128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128b); - dl_ch_mag128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128); - dl_ch_mag128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128); - - 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; aarx<frame_parms->nb_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; rb<nb_rb; rb++) { - mmtmpD0 = vmull_s16(dl_ch128[0], dl_ch128_2[0]); - mmtmpD1 = vmull_s16(dl_ch128[1], dl_ch128_2[1]); - mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[0],*(int16x4_t*)conj)), dl_ch128_2[0]); - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[1],*(int16x4_t*)conj)), dl_ch128_2[1]); - 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); - rho128[0] = vzip_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - mmtmpD0 = vmull_s16(dl_ch128[2], dl_ch128_2[2]); - mmtmpD1 = vmull_s16(dl_ch128[3], dl_ch128_2[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)), dl_ch128_2[2]); - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[3],*(int16x4_t*)conj)), dl_ch128_2[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); - rho128[1] = vzip_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - mmtmpD0 = vmull_s16(dl_ch128[0], dl_ch128_2[0]); - mmtmpD1 = vmull_s16(dl_ch128[1], dl_ch128_2[1]); - mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[4],*(int16x4_t*)conj)), dl_ch128_2[4]); - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[5],*(int16x4_t*)conj)), dl_ch128_2[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); - rho128[2] = vzip_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - - dl_ch128+=6; - dl_ch128_2+=6; - rho128+=3; - } - - if (first_symbol_flag==1) { - measurements->rx_correlation[0][aarx] = signal_energy(&rho[aarx][symbol*frame_parms->N_RB_DL*12],rb*12); - } - } - } -#endif -} - -#if defined(__x86_64__) || defined(__i386__) - -void prec2A_TM56_128(unsigned char pmi,__m128i *ch0,__m128i *ch1) -{ - - __m128i amp; - amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15); - - switch (pmi) { - - case 0 : // +1 +1 - // print_shorts("phase 0 :ch0",ch0); - // print_shorts("phase 0 :ch1",ch1); - ch0[0] = _mm_adds_epi16(ch0[0],ch1[0]); - break; - - case 1 : // +1 -1 - // print_shorts("phase 1 :ch0",ch0); - // print_shorts("phase 1 :ch1",ch1); - ch0[0] = _mm_subs_epi16(ch0[0],ch1[0]); - // print_shorts("phase 1 :ch0-ch1",ch0); - break; - - case 2 : // +1 +j - ch1[0] = _mm_sign_epi16(ch1[0],*(__m128i*)&conjugate[0]); - ch1[0] = _mm_shufflelo_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1)); - ch1[0] = _mm_shufflehi_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1)); - ch0[0] = _mm_subs_epi16(ch0[0],ch1[0]); - - break; // +1 -j - - case 3 : - ch1[0] = _mm_sign_epi16(ch1[0],*(__m128i*)&conjugate[0]); - ch1[0] = _mm_shufflelo_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1)); - ch1[0] = _mm_shufflehi_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1)); - ch0[0] = _mm_adds_epi16(ch0[0],ch1[0]); - break; - } - - ch0[0] = _mm_mulhi_epi16(ch0[0],amp); - ch0[0] = _mm_slli_epi16(ch0[0],1); - - _mm_empty(); - _m_empty(); -} -#elif defined(__arm__) -void prec2A_TM56_128(unsigned char pmi,__m128i *ch0,__m128i *ch1) { - - // sqrt(2) is already taken into account in computation sqrt_rho_a, sqrt_rho_b, - //so removed it - - //__m128i amp; - //amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15); - - switch (pmi) { - - case 0 : // +1 +1 - // print_shorts("phase 0 :ch0",ch0); - // print_shorts("phase 0 :ch1",ch1); - ch0[0] = _mm_adds_epi16(ch0[0],ch1[0]); - break; - case 1 : // +1 -1 - // print_shorts("phase 1 :ch0",ch0); - // print_shorts("phase 1 :ch1",ch1); - ch0[0] = _mm_subs_epi16(ch0[0],ch1[0]); - // print_shorts("phase 1 :ch0-ch1",ch0); - break; - case 2 : // +1 +j - ch1[0] = _mm_sign_epi16(ch1[0],*(__m128i*)&conjugate[0]); - ch1[0] = _mm_shufflelo_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1)); - ch1[0] = _mm_shufflehi_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1)); - ch0[0] = _mm_subs_epi16(ch0[0],ch1[0]); - - break; // +1 -j - case 3 : - ch1[0] = _mm_sign_epi16(ch1[0],*(__m128i*)&conjugate[0]); - ch1[0] = _mm_shufflelo_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1)); - ch1[0] = _mm_shufflehi_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1)); - ch0[0] = _mm_adds_epi16(ch0[0],ch1[0]); - break; - } - - //ch0[0] = _mm_mulhi_epi16(ch0[0],amp); - //ch0[0] = _mm_slli_epi16(ch0[0],1); - - _mm_empty(); - _m_empty(); -} -#endif -// precoding is stream 0 .5(1,1) .5(1,-1) .5(1,1) .5(1,-1) -// stream 1 .5(1,-1) .5(1,1) .5(1,-1) .5(1,1) -// store "precoded" channel for stream 0 in ch0, stream 1 in ch1 - -short TM3_prec[8]__attribute__((aligned(16))) = {1,1,-1,-1,1,1,-1,-1} ; - -void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) { - - __m128i amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15); - - __m128i tmp0,tmp1; - - //_mm_mulhi_epi16 - // print_shorts("prec2A_TM3 ch0 (before):",ch0); - // print_shorts("prec2A_TM3 ch1 (before):",ch1); - - tmp0 = ch0[0]; - tmp1 = _mm_sign_epi16(ch1[0],((__m128i*)&TM3_prec)[0]); - // print_shorts("prec2A_TM3 ch1*s (mid):",(__m128i*)TM3_prec); - - ch0[0] = _mm_adds_epi16(ch0[0],tmp1); - ch1[0] = _mm_subs_epi16(tmp0,tmp1); - - ch0[0] = _mm_mulhi_epi16(ch0[0],amp); - ch0[0] = _mm_slli_epi16(ch0[0],1); - - ch1[0] = _mm_mulhi_epi16(ch1[0],amp); - ch1[0] = _mm_slli_epi16(ch1[0],1); - - // print_shorts("prec2A_TM3 ch0 (mid):",&tmp0); - // print_shorts("prec2A_TM3 ch1 (mid):",ch1); - - //ch0[0] = _mm_mulhi_epi16(ch0[0],amp); - //ch0[0] = _mm_slli_epi16(ch0[0],1); - //ch1[0] = _mm_mulhi_epi16(ch1[0],amp); - //ch1[0] = _mm_slli_epi16(ch1[0],1); - - //ch0[0] = _mm_srai_epi16(ch0[0],1); - //ch1[0] = _mm_srai_epi16(ch1[0],1); - - // print_shorts("prec2A_TM3 ch0 (after):",ch0); - // print_shorts("prec2A_TM3 ch1 (after):",ch1); - - _mm_empty(); - _m_empty(); -} - -// pmi = 0 => stream 0 (1,1), stream 1 (1,-1) -// pmi = 1 => stream 0 (1,j), stream 2 (1,-j) - -void prec2A_TM4_128(int pmi,__m128i *ch0,__m128i *ch1) { - -// sqrt(2) is already taken into account in computation sqrt_rho_a, sqrt_rho_b, -//so divide by 2 is replaced by divide by sqrt(2). - - // printf ("demod pmi=%d\n", pmi); - __m128i amp; - amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15); - __m128i tmp0,tmp1; - - // print_shorts("prec2A_TM4 ch0 (before):",ch0); - // print_shorts("prec2A_TM4 ch1 (before):",ch1); - - if (pmi == 0) { //[1 1;1 -1] - tmp0 = ch0[0]; - tmp1 = ch1[0]; - ch0[0] = _mm_adds_epi16(tmp0,tmp1); - ch1[0] = _mm_subs_epi16(tmp0,tmp1); - } - else { //ch0+j*ch1 ch0-j*ch1 - tmp0 = ch0[0]; - tmp1 = _mm_sign_epi16(ch1[0],*(__m128i*)&conjugate[0]); - tmp1 = _mm_shufflelo_epi16(tmp1,_MM_SHUFFLE(2,3,0,1)); - tmp1 = _mm_shufflehi_epi16(tmp1,_MM_SHUFFLE(2,3,0,1)); - ch0[0] = _mm_subs_epi16(tmp0,tmp1); - ch1[0] = _mm_add_epi16(tmp0,tmp1); - } - - //print_shorts("prec2A_TM4 ch0 (middle):",ch0); - //print_shorts("prec2A_TM4 ch1 (middle):",ch1); - - ch0[0] = _mm_mulhi_epi16(ch0[0],amp); - ch0[0] = _mm_slli_epi16(ch0[0],1); - ch1[0] = _mm_mulhi_epi16(ch1[0],amp); - ch1[0] = _mm_slli_epi16(ch1[0],1); - - - // ch0[0] = _mm_srai_epi16(ch0[0],1); //divide by 2 - // ch1[0] = _mm_srai_epi16(ch1[0],1); //divide by 2 - //print_shorts("prec2A_TM4 ch0 (end):",ch0); - //print_shorts("prec2A_TM4 ch1 (end):",ch1); - _mm_empty(); - _m_empty(); - // print_shorts("prec2A_TM4 ch0 (end):",ch0); - //print_shorts("prec2A_TM4 ch1 (end):",ch1); -} - -void dlsch_channel_compensation_TM56(int **rxdataF_ext, - int **dl_ch_estimates_ext, - int **dl_ch_mag, - int **dl_ch_magb, - int **rxdataF_comp, - unsigned char *pmi_ext, - LTE_DL_FRAME_PARMS *frame_parms, - PHY_MEASUREMENTS *measurements, - int eNB_id, - unsigned char symbol, - unsigned char mod_order, - unsigned short nb_rb, - unsigned char output_shift, - unsigned char dl_power_off) -{ - -#if defined(__x86_64__) || defined(__i386__) - - unsigned short rb,Nre; - __m128i *dl_ch0_128,*dl_ch1_128,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128; - unsigned char aarx=0,symbol_mod,pilots=0; - int precoded_signal_strength=0; - __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b; - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - - if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) - pilots=1; - - - //printf("comp prec: symbol %d, pilots %d\n",symbol, pilots); - - if (mod_order == 4) { - QAM_amp128 = _mm_set1_epi16(QAM16_n1); - QAM_amp128b = _mm_setzero_si128(); - } else if (mod_order == 6) { - QAM_amp128 = _mm_set1_epi16(QAM64_n1); - QAM_amp128b = _mm_set1_epi16(QAM64_n2); - } - - for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - - dl_ch0_128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch1_128 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; - - - dl_ch_mag128 = (__m128i *)&dl_ch_mag[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128b = (__m128i *)&dl_ch_magb[aarx][symbol*frame_parms->N_RB_DL*12]; - rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - rxdataF_comp128 = (__m128i *)&rxdataF_comp[aarx][symbol*frame_parms->N_RB_DL*12]; - - - for (rb=0; rb<nb_rb; rb++) { - // combine TX channels using precoder from pmi -#ifdef DEBUG_DLSCH_DEMOD - printf("mode 6 prec: rb %d, pmi->%d\n",rb,pmi_ext[rb]); -#endif - prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128[0],&dl_ch1_128[0]); - prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128[1],&dl_ch1_128[1]); - - if (pilots==0) { - - prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128[2],&dl_ch1_128[2]); - } - - if (mod_order>2) { - // get channel amplitude if not QPSK - - mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch0_128[0]); - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - - mmtmpD1 = _mm_madd_epi16(dl_ch0_128[1],dl_ch0_128[1]); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); - - mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1); - - dl_ch_mag128[0] = _mm_unpacklo_epi16(mmtmpD0,mmtmpD0); - dl_ch_mag128b[0] = dl_ch_mag128[0]; - dl_ch_mag128[0] = _mm_mulhi_epi16(dl_ch_mag128[0],QAM_amp128); - dl_ch_mag128[0] = _mm_slli_epi16(dl_ch_mag128[0],1); - - - //print_shorts("dl_ch_mag128[0]=",&dl_ch_mag128[0]); - - //print_shorts("dl_ch_mag128[0]=",&dl_ch_mag128[0]); - - dl_ch_mag128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0); - dl_ch_mag128b[1] = dl_ch_mag128[1]; - dl_ch_mag128[1] = _mm_mulhi_epi16(dl_ch_mag128[1],QAM_amp128); - dl_ch_mag128[1] = _mm_slli_epi16(dl_ch_mag128[1],1); - - if (pilots==0) { - mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],dl_ch0_128[2]); - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - - mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0); - - dl_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1); - dl_ch_mag128b[2] = dl_ch_mag128[2]; - - dl_ch_mag128[2] = _mm_mulhi_epi16(dl_ch_mag128[2],QAM_amp128); - dl_ch_mag128[2] = _mm_slli_epi16(dl_ch_mag128[2],1); - } - - dl_ch_mag128b[0] = _mm_mulhi_epi16(dl_ch_mag128b[0],QAM_amp128b); - dl_ch_mag128b[0] = _mm_slli_epi16(dl_ch_mag128b[0],1); - - //print_shorts("dl_ch_mag128b[0]=",&dl_ch_mag128b[0]); - - dl_ch_mag128b[1] = _mm_mulhi_epi16(dl_ch_mag128b[1],QAM_amp128b); - dl_ch_mag128b[1] = _mm_slli_epi16(dl_ch_mag128b[1],1); - - if (pilots==0) { - dl_ch_mag128b[2] = _mm_mulhi_epi16(dl_ch_mag128b[2],QAM_amp128b); - dl_ch_mag128b[2] = _mm_slli_epi16(dl_ch_mag128b[2],1); - - } - } - - // MF multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],rxdataF128[0]); - // print_ints("re",&mmtmpD0); - - // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[0],_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]); - - // print_ints("im",&mmtmpD1); - mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[0]); - // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - // print_ints("re(shift)",&mmtmpD0); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); - // print_ints("im(shift)",&mmtmpD1); - mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); - mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - // print_ints("c0",&mmtmpD2); - // print_ints("c1",&mmtmpD3); - rxdataF_comp128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rx:",rxdataF128); - // print_shorts("ch:",dl_ch128); - // print_shorts("pack:",rxdataF_comp128); - - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch0_128[1],rxdataF128[1]); - // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[1],_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); - mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[1]); - // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); - mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); - mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - - rxdataF_comp128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rx:",rxdataF128+1); - // print_shorts("ch:",dl_ch128+1); - // print_shorts("pack:",rxdataF_comp128+1); - - if (pilots==0) { - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],rxdataF128[2]); - // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[2],_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); - mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]); - // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); - mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); - mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - - rxdataF_comp128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rx:",rxdataF128+2); - // print_shorts("ch:",dl_ch128+2); - // print_shorts("pack:",rxdataF_comp128+2); - - dl_ch0_128+=3; - dl_ch1_128+=3; - dl_ch_mag128+=3; - dl_ch_mag128b+=3; - rxdataF128+=3; - rxdataF_comp128+=3; - } else { - dl_ch0_128+=2; - dl_ch1_128+=2; - dl_ch_mag128+=2; - dl_ch_mag128b+=2; - rxdataF128+=2; - rxdataF_comp128+=2; - } - } - - Nre = (pilots==0) ? 12 : 8; - - precoded_signal_strength += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], - (nb_rb*Nre))) - (measurements->n0_power[aarx])); - } // rx_antennas - - measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength,measurements->n0_power_tot); - - //printf("eNB_id %d, symbol %d: precoded CQI %d dB\n",eNB_id,symbol, - // measurements->precoded_cqi_dB[eNB_id][0]); - -#elif defined(__arm__) - - uint32_t rb,Nre; - uint32_t aarx,symbol_mod,pilots=0; - - int16x4_t *dl_ch0_128,*dl_ch1_128,*rxdataF128; - int16x8_t *dl_ch0_128b,*dl_ch1_128b; - int32x4_t mmtmpD0,mmtmpD1,mmtmpD0b,mmtmpD1b; - int16x8_t *dl_ch_mag128,*dl_ch_mag128b,mmtmpD2,mmtmpD3,mmtmpD4,*rxdataF_comp128; - int16x8_t QAM_amp128,QAM_amp128b; - - int16_t conj[4]__attribute__((aligned(16))) = {1,-1,1,-1}; - int32x4_t output_shift128 = vmovq_n_s32(-(int32_t)output_shift); - int32_t precoded_signal_strength=0; - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) { - if (frame_parms->nb_antenna_ports_eNB==1) // 10 out of 12 so don't reduce size - { nb_rb=1+(5*nb_rb/6); } - - else - { pilots=1; } - } - - - if (mod_order == 4) { - QAM_amp128 = vmovq_n_s16(QAM16_n1); // 2/sqrt(10) - QAM_amp128b = vmovq_n_s16(0); - - } else if (mod_order == 6) { - QAM_amp128 = vmovq_n_s16(QAM64_n1); // - QAM_amp128b = vmovq_n_s16(QAM64_n2); - } - - // printf("comp: rxdataF_comp %p, symbol %d\n",rxdataF_comp[0],symbol); - - for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - - - - dl_ch0_128 = (int16x4_t*)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch1_128 = (int16x4_t*)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch0_128b = (int16x8_t*)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch1_128b = (int16x8_t*)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128 = (int16x8_t*)&dl_ch_mag[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128b = (int16x8_t*)&dl_ch_magb[aarx][symbol*frame_parms->N_RB_DL*12]; - rxdataF128 = (int16x4_t*)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - rxdataF_comp128 = (int16x8_t*)&rxdataF_comp[aarx][symbol*frame_parms->N_RB_DL*12]; - - for (rb=0; rb<nb_rb; rb++) { -#ifdef DEBUG_DLSCH_DEMOD - printf("mode 6 prec: rb %d, pmi->%d\n",rb,pmi_ext[rb]); -#endif - prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128b[0],&dl_ch1_128b[0]); - prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128b[1],&dl_ch1_128b[1]); - - if (pilots==0) { - prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128b[2],&dl_ch1_128b[2]); - } - - if (mod_order>2) { - // get channel amplitude if not QPSK - mmtmpD0 = vmull_s16(dl_ch0_128[0], dl_ch0_128[0]); - // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3]; - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits - mmtmpD1 = vmull_s16(dl_ch0_128[1], dl_ch0_128[1]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits - mmtmpD0 = vmull_s16(dl_ch0_128[2], dl_ch0_128[2]); - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - mmtmpD1 = vmull_s16(dl_ch0_128[3], dl_ch0_128[3]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - if (pilots==0) { - mmtmpD0 = vmull_s16(dl_ch0_128[4], dl_ch0_128[4]); - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - mmtmpD1 = vmull_s16(dl_ch0_128[5], dl_ch0_128[5]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - - } - - dl_ch_mag128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128b); - dl_ch_mag128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128b); - dl_ch_mag128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128); - dl_ch_mag128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128); - - - if (pilots==0) { - dl_ch_mag128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128b); - dl_ch_mag128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128); - } - } - mmtmpD0 = vmull_s16(dl_ch0_128[0], rxdataF128[0]); - //mmtmpD0 = [Re(ch[0])Re(rx[0]) Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1]) Im(ch[1])Im(ch[1])] - mmtmpD1 = vmull_s16(dl_ch0_128[1], rxdataF128[1]); - //mmtmpD1 = [Re(ch[2])Re(rx[2]) Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3]) Im(ch[3])Im(ch[3])] - mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - //mmtmpD0 = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])] - - mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[0],*(int16x4_t*)conj)), rxdataF128[0]); - //mmtmpD0 = [-Im(ch[0])Re(rx[0]) Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1]) Re(ch[1])Im(rx[1])] - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[1],*(int16x4_t*)conj)), rxdataF128[1]); - //mmtmpD0 = [-Im(ch[2])Re(rx[2]) Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3]) Re(ch[3])Im(rx[3])] - mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); - //mmtmpD1 = [-Im(ch[0])Re(rx[0])+Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1])+Re(ch[1])Im(rx[1]) -Im(ch[2])Re(rx[2])+Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3])+Re(ch[3])Im(rx[3])] - - mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); - mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); - rxdataF_comp128[0] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - mmtmpD0 = vmull_s16(dl_ch0_128[2], rxdataF128[2]); - mmtmpD1 = vmull_s16(dl_ch0_128[3], rxdataF128[3]); - mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - - mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[2],*(int16x4_t*)conj)), rxdataF128[2]); - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[3],*(int16x4_t*)conj)), rxdataF128[3]); - mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); - - mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); - mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); - rxdataF_comp128[1] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - if (pilots==0) { - mmtmpD0 = vmull_s16(dl_ch0_128[4], rxdataF128[4]); - mmtmpD1 = vmull_s16(dl_ch0_128[5], rxdataF128[5]); - mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - - mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[4],*(int16x4_t*)conj)), rxdataF128[4]); - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[5],*(int16x4_t*)conj)), rxdataF128[5]); - mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); - - - mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); - mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); - rxdataF_comp128[2] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - - dl_ch0_128+=6; - dl_ch1_128+=6; - dl_ch_mag128+=3; - dl_ch_mag128b+=3; - rxdataF128+=6; - rxdataF_comp128+=3; - - } else { // we have a smaller PDSCH in symbols with pilots so skip last group of 4 REs and increment less - dl_ch0_128+=4; - dl_ch1_128+=4; - dl_ch_mag128+=2; - dl_ch_mag128b+=2; - rxdataF128+=4; - rxdataF_comp128+=2; - } - } - - Nre = (pilots==0) ? 12 : 8; - - - precoded_signal_strength += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], - - (nb_rb*Nre))) - (measurements->n0_power[aarx])); - // rx_antennas - } - measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength,measurements->n0_power_tot); - - //printf("eNB_id %d, symbol %d: precoded CQI %d dB\n",eNB_id,symbol, - // measurements->precoded_cqi_dB[eNB_id][0]); - -#endif - _mm_empty(); - _m_empty(); -} - -void dlsch_channel_compensation_TM34(LTE_DL_FRAME_PARMS *frame_parms, - LTE_UE_PDSCH *pdsch_vars, - PHY_MEASUREMENTS *measurements, - int eNB_id, - unsigned char symbol, - unsigned char mod_order0, - unsigned char mod_order1, - int harq_pid, - int round, - MIMO_mode_t mimo_mode, - unsigned short nb_rb, - unsigned char output_shift0, - unsigned char output_shift1) { - -#if defined(__x86_64__) || defined(__i386__) - - unsigned short rb,Nre; - __m128i *dl_ch0_128,*dl_ch1_128,*dl_ch_mag0_128,*dl_ch_mag1_128,*dl_ch_mag0_128b,*dl_ch_mag1_128b,*rxdataF128,*rxdataF_comp0_128,*rxdataF_comp1_128; - unsigned char aarx=0,symbol_mod,pilots=0; - int precoded_signal_strength0=0,precoded_signal_strength1=0; - int rx_power_correction; - - int **rxdataF_ext = pdsch_vars->rxdataF_ext; - int **dl_ch_estimates_ext = pdsch_vars->dl_ch_estimates_ext; - int **dl_ch_mag0 = pdsch_vars->dl_ch_mag0; - int **dl_ch_mag1 = pdsch_vars->dl_ch_mag1[harq_pid][round]; - int **dl_ch_magb0 = pdsch_vars->dl_ch_magb0; - int **dl_ch_magb1 = pdsch_vars->dl_ch_magb1[harq_pid][round]; - int **rxdataF_comp0 = pdsch_vars->rxdataF_comp0; - int **rxdataF_comp1 = pdsch_vars->rxdataF_comp1[harq_pid][round]; - unsigned char *pmi_ext = pdsch_vars->pmi_ext; - __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp0_128,QAM_amp0_128b,QAM_amp1_128,QAM_amp1_128b; - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - - if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) - pilots=1; - - rx_power_correction = 1; - - // printf("comp prec: symbol %d, pilots %d\n",symbol, pilots); - - if (mod_order0 == 4) { - QAM_amp0_128 = _mm_set1_epi16(QAM16_n1); - QAM_amp0_128b = _mm_setzero_si128(); - } else if (mod_order0 == 6) { - QAM_amp0_128 = _mm_set1_epi16(QAM64_n1); - QAM_amp0_128b = _mm_set1_epi16(QAM64_n2); - } - - if (mod_order1 == 4) { - QAM_amp1_128 = _mm_set1_epi16(QAM16_n1); - QAM_amp1_128b = _mm_setzero_si128(); - } else if (mod_order1 == 6) { - QAM_amp1_128 = _mm_set1_epi16(QAM64_n1); - QAM_amp1_128b = _mm_set1_epi16(QAM64_n2); - } - - for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) { - - /* if (aarx==0) { - output_shift=output_shift0; - } - else { - output_shift=output_shift1; - } */ - - // printf("antenna %d\n", aarx); - // printf("symbol %d, rx antenna %d\n", symbol, aarx); - - dl_ch0_128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; // this is h11 - dl_ch1_128 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; // this is h12 - - - dl_ch_mag0_128 = (__m128i *)&dl_ch_mag0[aarx][symbol*frame_parms->N_RB_DL*12]; //responsible for x1 - dl_ch_mag0_128b = (__m128i *)&dl_ch_magb0[aarx][symbol*frame_parms->N_RB_DL*12];//responsible for x1 - dl_ch_mag1_128 = (__m128i *)&dl_ch_mag1[aarx][symbol*frame_parms->N_RB_DL*12]; //responsible for x2. always coming from tx2 - dl_ch_mag1_128b = (__m128i *)&dl_ch_magb1[aarx][symbol*frame_parms->N_RB_DL*12]; //responsible for x2. always coming from tx2 - rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12]; //received signal on antenna of interest h11*x1+h12*x2 - rxdataF_comp0_128 = (__m128i *)&rxdataF_comp0[aarx][symbol*frame_parms->N_RB_DL*12]; //result of multipl with MF x1 on antenna of interest - rxdataF_comp1_128 = (__m128i *)&rxdataF_comp1[aarx][symbol*frame_parms->N_RB_DL*12]; //result of multipl with MF x2 on antenna of interest - - for (rb=0; rb<nb_rb; rb++) { - - // combine TX channels using precoder from pmi - if (mimo_mode==LARGE_CDD) { - prec2A_TM3_128(&dl_ch0_128[0],&dl_ch1_128[0]); - prec2A_TM3_128(&dl_ch0_128[1],&dl_ch1_128[1]); - - - if (pilots==0) { - prec2A_TM3_128(&dl_ch0_128[2],&dl_ch1_128[2]); - } - } - else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODING1) { - prec2A_TM4_128(0,&dl_ch0_128[0],&dl_ch1_128[0]); - prec2A_TM4_128(0,&dl_ch0_128[1],&dl_ch1_128[1]); - - if (pilots==0) { - prec2A_TM4_128(0,&dl_ch0_128[2],&dl_ch1_128[2]); - } - } - else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODINGj) { - prec2A_TM4_128(1,&dl_ch0_128[0],&dl_ch1_128[0]); - prec2A_TM4_128(1,&dl_ch0_128[1],&dl_ch1_128[1]); - - if (pilots==0) { - prec2A_TM4_128(1,&dl_ch0_128[2],&dl_ch1_128[2]); - } - } - - else if (mimo_mode==DUALSTREAM_PUSCH_PRECODING) { - prec2A_TM4_128(pmi_ext[rb],&dl_ch0_128[0],&dl_ch1_128[0]); - prec2A_TM4_128(pmi_ext[rb],&dl_ch0_128[1],&dl_ch1_128[1]); - - if (pilots==0) { - prec2A_TM4_128(pmi_ext[rb],&dl_ch0_128[2],&dl_ch1_128[2]); - } - } - - - else { - LOG_E(PHY,"Unknown MIMO mode\n"); - return; - } - - - if (mod_order0>2) { - // get channel amplitude if not QPSK - - mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch0_128[0]); - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0); - - mmtmpD1 = _mm_madd_epi16(dl_ch0_128[1],dl_ch0_128[1]); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0); - - mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1); - - dl_ch_mag0_128[0] = _mm_unpacklo_epi16(mmtmpD0,mmtmpD0); - dl_ch_mag0_128b[0] = dl_ch_mag0_128[0]; - dl_ch_mag0_128[0] = _mm_mulhi_epi16(dl_ch_mag0_128[0],QAM_amp0_128); - dl_ch_mag0_128[0] = _mm_slli_epi16(dl_ch_mag0_128[0],1); - - // print_shorts("dl_ch_mag0_128[0]=",&dl_ch_mag0_128[0]); - - - dl_ch_mag0_128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0); - dl_ch_mag0_128b[1] = dl_ch_mag0_128[1]; - dl_ch_mag0_128[1] = _mm_mulhi_epi16(dl_ch_mag0_128[1],QAM_amp0_128); - dl_ch_mag0_128[1] = _mm_slli_epi16(dl_ch_mag0_128[1],1); - - if (pilots==0) { - mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],dl_ch0_128[2]); - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0); - - mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0); - - dl_ch_mag0_128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1); - dl_ch_mag0_128b[2] = dl_ch_mag0_128[2]; - - dl_ch_mag0_128[2] = _mm_mulhi_epi16(dl_ch_mag0_128[2],QAM_amp0_128); - dl_ch_mag0_128[2] = _mm_slli_epi16(dl_ch_mag0_128[2],1); - } - - dl_ch_mag0_128b[0] = _mm_mulhi_epi16(dl_ch_mag0_128b[0],QAM_amp0_128b); - dl_ch_mag0_128b[0] = _mm_slli_epi16(dl_ch_mag0_128b[0],1); - - // print_shorts("dl_ch_mag0_128b[0]=",&dl_ch_mag0_128b[0]); - - dl_ch_mag0_128b[1] = _mm_mulhi_epi16(dl_ch_mag0_128b[1],QAM_amp0_128b); - dl_ch_mag0_128b[1] = _mm_slli_epi16(dl_ch_mag0_128b[1],1); - - if (pilots==0) { - dl_ch_mag0_128b[2] = _mm_mulhi_epi16(dl_ch_mag0_128b[2],QAM_amp0_128b); - dl_ch_mag0_128b[2] = _mm_slli_epi16(dl_ch_mag0_128b[2],1); - } - } - - if (mod_order1>2) { - // get channel amplitude if not QPSK - - mmtmpD0 = _mm_madd_epi16(dl_ch1_128[0],dl_ch1_128[0]); - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift1); - - mmtmpD1 = _mm_madd_epi16(dl_ch1_128[1],dl_ch1_128[1]); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift1); - - mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1); - - dl_ch_mag1_128[0] = _mm_unpacklo_epi16(mmtmpD0,mmtmpD0); - dl_ch_mag1_128b[0] = dl_ch_mag1_128[0]; - dl_ch_mag1_128[0] = _mm_mulhi_epi16(dl_ch_mag1_128[0],QAM_amp1_128); - dl_ch_mag1_128[0] = _mm_slli_epi16(dl_ch_mag1_128[0],1); - - // print_shorts("dl_ch_mag1_128[0]=",&dl_ch_mag1_128[0]); - - dl_ch_mag1_128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0); - dl_ch_mag1_128b[1] = dl_ch_mag1_128[1]; - dl_ch_mag1_128[1] = _mm_mulhi_epi16(dl_ch_mag1_128[1],QAM_amp1_128); - dl_ch_mag1_128[1] = _mm_slli_epi16(dl_ch_mag1_128[1],1); - - if (pilots==0) { - mmtmpD0 = _mm_madd_epi16(dl_ch1_128[2],dl_ch1_128[2]); - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift1); - - mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0); - - dl_ch_mag1_128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1); - dl_ch_mag1_128b[2] = dl_ch_mag1_128[2]; - - dl_ch_mag1_128[2] = _mm_mulhi_epi16(dl_ch_mag1_128[2],QAM_amp1_128); - dl_ch_mag1_128[2] = _mm_slli_epi16(dl_ch_mag1_128[2],1); - } - - dl_ch_mag1_128b[0] = _mm_mulhi_epi16(dl_ch_mag1_128b[0],QAM_amp1_128b); - dl_ch_mag1_128b[0] = _mm_slli_epi16(dl_ch_mag1_128b[0],1); - - // print_shorts("dl_ch_mag1_128b[0]=",&dl_ch_mag1_128b[0]); - - dl_ch_mag1_128b[1] = _mm_mulhi_epi16(dl_ch_mag1_128b[1],QAM_amp1_128b); - dl_ch_mag1_128b[1] = _mm_slli_epi16(dl_ch_mag1_128b[1],1); - - if (pilots==0) { - dl_ch_mag1_128b[2] = _mm_mulhi_epi16(dl_ch_mag1_128b[2],QAM_amp1_128b); - dl_ch_mag1_128b[2] = _mm_slli_epi16(dl_ch_mag1_128b[2],1); - } - } - - // layer 0 - // MF multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],rxdataF128[0]); - // print_ints("re",&mmtmpD0); - - // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[0],_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]); - mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[0]); - // print_ints("im",&mmtmpD1); - // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0); - // printf("Shift: %d\n",output_shift); - // print_ints("re(shift)",&mmtmpD0); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0); - // print_ints("im(shift)",&mmtmpD1); - mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); - mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - // print_ints("c0",&mmtmpD2); - // print_ints("c1",&mmtmpD3); - rxdataF_comp0_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - - // print_shorts("rx:",rxdataF128); - // print_shorts("ch:",dl_ch0_128); - // print_shorts("pack:",rxdataF_comp0_128); - - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch0_128[1],rxdataF128[1]); - // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[1],_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); - mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[1]); - // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0); - mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); - mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - - rxdataF_comp0_128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rx:",rxdataF128+1); - // print_shorts("ch:",dl_ch0_128+1); - // print_shorts("pack:",rxdataF_comp0_128+1); - - if (pilots==0) { - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],rxdataF128[2]); - // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[2],_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); - mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]); - // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0); - mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); - mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - - rxdataF_comp0_128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rx:",rxdataF128+2); - // print_shorts("ch:",dl_ch0_128+2); - // print_shorts("pack:",rxdataF_comp0_128+2); - - } - - - // layer 1 - // MF multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch1_128[0],rxdataF128[0]); - // print_ints("re",&mmtmpD0); - - // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - mmtmpD1 = _mm_shufflelo_epi16(dl_ch1_128[0],_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]); - // print_ints("im",&mmtmpD1); - mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[0]); - // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift1); - // print_ints("re(shift)",&mmtmpD0); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift1); - // print_ints("im(shift)",&mmtmpD1); - mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); - mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - // print_ints("c0",&mmtmpD2); - // print_ints("c1",&mmtmpD3); - rxdataF_comp1_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rx:",rxdataF128); - // print_shorts("ch:",dl_ch1_128); - // print_shorts("pack:",rxdataF_comp1_128); - - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch1_128[1],rxdataF128[1]); - // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - mmtmpD1 = _mm_shufflelo_epi16(dl_ch1_128[1],_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); - mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[1]); - // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift1); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift1); - mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); - mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - - rxdataF_comp1_128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rx:",rxdataF128+1); - // print_shorts("ch:",dl_ch1_128+1); - // print_shorts("pack:",rxdataF_comp1_128+1); - - if (pilots==0) { - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch1_128[2],rxdataF128[2]); - // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - mmtmpD1 = _mm_shufflelo_epi16(dl_ch1_128[2],_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); - mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); - mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]); - // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift1); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift1); - mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); - mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - - rxdataF_comp1_128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rx:",rxdataF128+2); - // print_shorts("ch:",dl_ch1_128+2); - // print_shorts("pack:",rxdataF_comp1_128+2); - - dl_ch0_128+=3; - dl_ch1_128+=3; - dl_ch_mag0_128+=3; - dl_ch_mag1_128+=3; - dl_ch_mag0_128b+=3; - dl_ch_mag1_128b+=3; - rxdataF128+=3; - rxdataF_comp0_128+=3; - rxdataF_comp1_128+=3; - } - else { - dl_ch0_128+=2; - dl_ch1_128+=2; - dl_ch_mag0_128+=2; - dl_ch_mag1_128+=2; - dl_ch_mag0_128b+=2; - dl_ch_mag1_128b+=2; - rxdataF128+=2; - rxdataF_comp0_128+=2; - rxdataF_comp1_128+=2; - } - - } // rb loop - Nre = (pilots==0) ? 12 : 8; - - precoded_signal_strength0 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], - (nb_rb*Nre))*rx_power_correction) - (measurements->n0_power[aarx])); - - precoded_signal_strength1 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx+2][symbol*frame_parms->N_RB_DL*Nre], - (nb_rb*Nre))*rx_power_correction) - (measurements->n0_power[aarx])); - } // rx_antennas - - measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength0,measurements->n0_power_tot); - measurements->precoded_cqi_dB[eNB_id][1] = dB_fixed2(precoded_signal_strength1,measurements->n0_power_tot); - - // printf("eNB_id %d, symbol %d: precoded CQI %d dB\n",eNB_id,symbol, - // measurements->precoded_cqi_dB[eNB_id][0]); - - _mm_empty(); - _m_empty(); - - #elif defined(__arm__) - - unsigned short rb,Nre; - unsigned char aarx,symbol_mod,pilots=0; - int precoded_signal_strength0=0,precoded_signal_strength1=0, rx_power_correction; - int16x4_t *dl_ch0_128,*rxdataF128; - int16x4_t *dl_ch1_128; - int16x8_t *dl_ch0_128b,*dl_ch1_128b; - - int32x4_t mmtmpD0,mmtmpD1,mmtmpD0b,mmtmpD1b; - int16x8_t *dl_ch_mag0_128,*dl_ch_mag0_128b,*dl_ch_mag1_128,*dl_ch_mag1_128b,mmtmpD2,mmtmpD3,mmtmpD4,*rxdataF_comp0_128,*rxdataF_comp1_128; - int16x8_t QAM_amp0_128,QAM_amp0_128b,QAM_amp1_128,QAM_amp1_128b; - int32x4_t output_shift128 = vmovq_n_s32(-(int32_t)output_shift); - - int **rxdataF_ext = pdsch_vars->rxdataF_ext; - int **dl_ch_estimates_ext = pdsch_vars->dl_ch_estimates_ext; - int **dl_ch_mag0 = pdsch_vars->dl_ch_mag0; - int **dl_ch_mag1 = pdsch_vars->dl_ch_mag1[harq_pid][round]; - int **dl_ch_magb0 = pdsch_vars->dl_ch_magb0; - int **dl_ch_magb1 = pdsch_vars->dl_ch_magb1[harq_pid][round]; - int **rxdataF_comp0 = pdsch_vars->rxdataF_comp0; - int **rxdataF_comp1 = pdsch_vars->rxdataF_comp1[harq_pid][round]; - - int16_t conj[4]__attribute__((aligned(16))) = {1,-1,1,-1}; - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - - if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) { - if (frame_parms->nb_antenna_ports_eNB==1) // 10 out of 12 so don't reduce size - { nb_rb=1+(5*nb_rb/6); } - - else - { pilots=1; } - } - - rx_power_correction=1; - - if (mod_order0 == 4) { - QAM_amp0_128 = vmovq_n_s16(QAM16_n1); // 2/sqrt(10) - QAM_amp0_128b = vmovq_n_s16(0); - - } else if (mod_order0 == 6) { - QAM_amp0_128 = vmovq_n_s16(QAM64_n1); // - QAM_amp0_128b = vmovq_n_s16(QAM64_n2); - } - - if (mod_order1 == 4) { - QAM_amp1_128 = vmovq_n_s16(QAM16_n1); // 2/sqrt(10) - QAM_amp1_128b = vmovq_n_s16(0); - - } else if (mod_order1 == 6) { - QAM_amp1_128 = vmovq_n_s16(QAM64_n1); // - QAM_amp1_128b = vmovq_n_s16(QAM64_n2); - } - - // printf("comp: rxdataF_comp %p, symbol %d\n",rxdataF_comp[0],symbol); - - for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - - - - dl_ch0_128 = (int16x4_t*)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch1_128 = (int16x4_t*)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch0_128b = (int16x8_t*)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch1_128b = (int16x8_t*)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag0_128 = (int16x8_t*)&dl_ch_mag0[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag0_128b = (int16x8_t*)&dl_ch_magb0[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag1_128 = (int16x8_t*)&dl_ch_mag1[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag1_128b = (int16x8_t*)&dl_ch_magb1[aarx][symbol*frame_parms->N_RB_DL*12]; - rxdataF128 = (int16x4_t*)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - rxdataF_comp0_128 = (int16x8_t*)&rxdataF_comp0[aarx][symbol*frame_parms->N_RB_DL*12]; - rxdataF_comp1_128 = (int16x8_t*)&rxdataF_comp1[aarx][symbol*frame_parms->N_RB_DL*12]; - - for (rb=0; rb<nb_rb; rb++) { - // combine TX channels using precoder from pmi - if (mimo_mode==LARGE_CDD) { - prec2A_TM3_128(&dl_ch0_128[0],&dl_ch1_128[0]); - prec2A_TM3_128(&dl_ch0_128[1],&dl_ch1_128[1]); - - - if (pilots==0) { - prec2A_TM3_128(&dl_ch0_128[2],&dl_ch1_128[2]); - } - } - else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODING1) { - prec2A_TM4_128(0,&dl_ch0_128[0],&dl_ch1_128[0]); - prec2A_TM4_128(0,&dl_ch0_128[1],&dl_ch1_128[1]); - - if (pilots==0) { - prec2A_TM4_128(0,&dl_ch0_128[2],&dl_ch1_128[2]); - } - } - else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODINGj) { - prec2A_TM4_128(1,&dl_ch0_128[0],&dl_ch1_128[0]); - prec2A_TM4_128(1,&dl_ch0_128[1],&dl_ch1_128[1]); - - if (pilots==0) { - prec2A_TM4_128(1,&dl_ch0_128[2],&dl_ch1_128[2]); - } - } - else { - LOG_E(PHY,"Unknown MIMO mode\n"); - return; - } - - - if (mod_order0>2) { - // get channel amplitude if not QPSK - mmtmpD0 = vmull_s16(dl_ch0_128[0], dl_ch0_128[0]); - // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3]; - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits - mmtmpD1 = vmull_s16(dl_ch0_128[1], dl_ch0_128[1]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits - mmtmpD0 = vmull_s16(dl_ch0_128[2], dl_ch0_128[2]); - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - mmtmpD1 = vmull_s16(dl_ch0_128[3], dl_ch0_128[3]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - if (pilots==0) { - mmtmpD0 = vmull_s16(dl_ch0_128[4], dl_ch0_128[4]); - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - mmtmpD1 = vmull_s16(dl_ch0_128[5], dl_ch0_128[5]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - - } - - dl_ch_mag0_128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp0_128b); - dl_ch_mag0_128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp0_128b); - dl_ch_mag0_128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp0_128); - dl_ch_mag0_128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp0_128); - - - if (pilots==0) { - dl_ch_mag0_128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp0_128b); - dl_ch_mag0_128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp0_128); - } - } - - if (mod_order1>2) { - // get channel amplitude if not QPSK - mmtmpD0 = vmull_s16(dl_ch1_128[0], dl_ch1_128[0]); - // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3]; - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits - mmtmpD1 = vmull_s16(dl_ch1_128[1], dl_ch1_128[1]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits - mmtmpD0 = vmull_s16(dl_ch1_128[2], dl_ch1_128[2]); - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - mmtmpD1 = vmull_s16(dl_ch1_128[3], dl_ch1_128[3]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - if (pilots==0) { - mmtmpD0 = vmull_s16(dl_ch1_128[4], dl_ch1_128[4]); - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - mmtmpD1 = vmull_s16(dl_ch1_128[5], dl_ch1_128[5]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - - } - - dl_ch_mag1_128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp1_128b); - dl_ch_mag1_128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp1_128b); - dl_ch_mag1_128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp1_128); - dl_ch_mag1_128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp1_128); - - - if (pilots==0) { - dl_ch_mag1_128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp1_128b); - dl_ch_mag1_128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp1_128); - } - } - - mmtmpD0 = vmull_s16(dl_ch0_128[0], rxdataF128[0]); - //mmtmpD0 = [Re(ch[0])Re(rx[0]) Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1]) Im(ch[1])Im(ch[1])] - mmtmpD1 = vmull_s16(dl_ch0_128[1], rxdataF128[1]); - //mmtmpD1 = [Re(ch[2])Re(rx[2]) Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3]) Im(ch[3])Im(ch[3])] - mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - //mmtmpD0 = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])] - - mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[0],*(int16x4_t*)conj)), rxdataF128[0]); - //mmtmpD0 = [-Im(ch[0])Re(rx[0]) Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1]) Re(ch[1])Im(rx[1])] - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[1],*(int16x4_t*)conj)), rxdataF128[1]); - //mmtmpD0 = [-Im(ch[2])Re(rx[2]) Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3]) Re(ch[3])Im(rx[3])] - mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); - //mmtmpD1 = [-Im(ch[0])Re(rx[0])+Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1])+Re(ch[1])Im(rx[1]) -Im(ch[2])Re(rx[2])+Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3])+Re(ch[3])Im(rx[3])] - - mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); - mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); - rxdataF_comp0_128[0] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - mmtmpD0 = vmull_s16(dl_ch0_128[2], rxdataF128[2]); - mmtmpD1 = vmull_s16(dl_ch0_128[3], rxdataF128[3]); - mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - - mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[2],*(int16x4_t*)conj)), rxdataF128[2]); - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[3],*(int16x4_t*)conj)), rxdataF128[3]); - mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); - - mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); - mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); - rxdataF_comp0_128[1] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - // second stream - mmtmpD0 = vmull_s16(dl_ch1_128[0], rxdataF128[0]); - mmtmpD1 = vmull_s16(dl_ch1_128[1], rxdataF128[1]); - mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[0],*(int16x4_t*)conj)), rxdataF128[0]); - - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[1],*(int16x4_t*)conj)), rxdataF128[1]); - //mmtmpD0 = [-Im(ch[2])Re(rx[2]) Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3]) Re(ch[3])Im(rx[3])] - mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); - //mmtmpD1 = [-Im(ch[0])Re(rx[0])+Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1])+Re(ch[1])Im(rx[1]) -Im(ch[2])Re(rx[2])+Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3])+Re(ch[3])Im(rx[3])] - - mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); - mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); - rxdataF_comp1_128[0] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - mmtmpD0 = vmull_s16(dl_ch1_128[2], rxdataF128[2]); - mmtmpD1 = vmull_s16(dl_ch1_128[3], rxdataF128[3]); - mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - - mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[2],*(int16x4_t*)conj)), rxdataF128[2]); - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[3],*(int16x4_t*)conj)), rxdataF128[3]); - mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); - - mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); - mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); - rxdataF_comp1_128[1] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - if (pilots==0) { - mmtmpD0 = vmull_s16(dl_ch0_128[4], rxdataF128[4]); - mmtmpD1 = vmull_s16(dl_ch0_128[5], rxdataF128[5]); - mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - - mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[4],*(int16x4_t*)conj)), rxdataF128[4]); - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[5],*(int16x4_t*)conj)), rxdataF128[5]); - mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); - - - mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); - mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); - rxdataF_comp0_128[2] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - mmtmpD0 = vmull_s16(dl_ch1_128[4], rxdataF128[4]); - mmtmpD1 = vmull_s16(dl_ch1_128[5], rxdataF128[5]); - mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - - mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch1_128[4],*(int16x4_t*)conj)), rxdataF128[4]); - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch1_128[5],*(int16x4_t*)conj)), rxdataF128[5]); - mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); - - - mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); - mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); - rxdataF_comp1_128[2] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - } - } - - - - Nre = (pilots==0) ? 12 : 8; - - // rx_antennas - } - - - Nre = (pilots==0) ? 12 : 8; - - precoded_signal_strength0 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], - (nb_rb*Nre))*rx_power_correction) - (measurements->n0_power[aarx])); - precoded_signal_strength1 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx+2][symbol*frame_parms->N_RB_DL*Nre], - (nb_rb*Nre))*rx_power_correction) - (measurements->n0_power[aarx])); - - measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength0,measurements->n0_power_tot); - measurements->precoded_cqi_dB[eNB_id][1] = dB_fixed2(precoded_signal_strength1,measurements->n0_power_tot); - -#endif -} - - -void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms, - unsigned char symbol, - unsigned short nb_rb, - int **dl_ch_estimates_ext, - int **dl_ch_estimates_ext_i, - int **dl_ch_rho_ext, - unsigned char output_shift) -{ - -#if defined(__x86_64__)||defined(__i386__) - - unsigned short rb; - __m128i *dl_ch128,*dl_ch128i,*dl_ch_rho128,mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3; - unsigned char aarx,symbol_mod,pilots=0; - - // printf("dlsch_dual_stream_correlation: symbol %d\n",symbol); - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - - if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) { - pilots=1; - } - - // printf("Dual stream correlation (%p)\n",dl_ch_estimates_ext_i); - - for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - - - - //printf ("antenna %d", aarx); - dl_ch128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - - if (dl_ch_estimates_ext_i == NULL) // TM3/4 - dl_ch128i = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; - else - dl_ch128i = (__m128i *)&dl_ch_estimates_ext_i[aarx][symbol*frame_parms->N_RB_DL*12]; - - dl_ch_rho128 = (__m128i *)&dl_ch_rho_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - - - for (rb=0; rb<nb_rb; rb++) { - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch128[0],dl_ch128i[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]); - mmtmpD1 = _mm_madd_epi16(mmtmpD1,dl_ch128i[0]); - // print_ints("im",&mmtmpD1); - // 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); - dl_ch_rho128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rho 0:",dl_ch_rho128); - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch128[1],dl_ch128i[1]); - // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - 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,dl_ch128i[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); - dl_ch_rho128[1] =_mm_packs_epi32(mmtmpD2,mmtmpD3); - - - if (pilots==0) { - - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch128[2],dl_ch128i[2]); - // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - 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,dl_ch128i[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); - dl_ch_rho128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - - dl_ch128+=3; - dl_ch128i+=3; - dl_ch_rho128+=3; - } else { - - dl_ch128+=2; - dl_ch128i+=2; - dl_ch_rho128+=2; - } - } - - } - - _mm_empty(); - _m_empty(); - -#elif defined(__arm__) - -#endif -} - - -/*void dlsch_dual_stream_correlationTM34(LTE_DL_FRAME_PARMS *frame_parms, - unsigned char symbol, - unsigned short nb_rb, - int **dl_ch_estimates_ext, - int **dl_ch_estimates_ext_i, - int **dl_ch_rho_ext, - unsigned char output_shift0, - unsigned char output_shift1) -{ - -#if defined(__x86_64__)||defined(__i386__) - - unsigned short rb; - __m128i *dl_ch128,*dl_ch128i,*dl_ch_rho128,mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3; - unsigned char aarx,symbol_mod,pilots=0; - int output_shift; - - // printf("dlsch_dual_stream_correlation: symbol %d\n",symbol); - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - - if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) { - pilots=1; - } - - // printf("Dual stream correlation (%p)\n",dl_ch_estimates_ext_i); - - for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - - if (aarx==0) { - output_shift=output_shift0; - } - else { - output_shift=output_shift1; - } - - //printf ("antenna %d", aarx); - dl_ch128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - - if (dl_ch_estimates_ext_i == NULL) // TM3/4 - dl_ch128i = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; - else - dl_ch128i = (__m128i *)&dl_ch_estimates_ext_i[aarx][symbol*frame_parms->N_RB_DL*12]; - - dl_ch_rho128 = (__m128i *)&dl_ch_rho_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - - - for (rb=0; rb<nb_rb; rb++) { - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch128[0],dl_ch128i[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]); - mmtmpD1 = _mm_madd_epi16(mmtmpD1,dl_ch128i[0]); - // print_ints("im",&mmtmpD1); - // 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); - dl_ch_rho128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rho 0:",dl_ch_rho128); - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch128[1],dl_ch128i[1]); - // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - 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,dl_ch128i[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); - dl_ch_rho128[1] =_mm_packs_epi32(mmtmpD2,mmtmpD3); - - - if (pilots==0) { - - // multiply by conjugated channel - mmtmpD0 = _mm_madd_epi16(dl_ch128[2],dl_ch128i[2]); - // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) - 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,dl_ch128i[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); - dl_ch_rho128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - - dl_ch128+=3; - dl_ch128i+=3; - dl_ch_rho128+=3; - } else { - - dl_ch128+=2; - dl_ch128i+=2; - dl_ch_rho128+=2; - } - } - - } - - _mm_empty(); - _m_empty(); - -#elif defined(__arm__) - -#endif -} -*/ - -void dlsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms, - int **rxdataF_comp, - int **rxdataF_comp_i, - int **rho, - int **rho_i, - int **dl_ch_mag, - int **dl_ch_magb, - int **dl_ch_mag_i, - int **dl_ch_magb_i, - unsigned char symbol, - unsigned short nb_rb, - unsigned char dual_stream_UE) -{ - -#if defined(__x86_64__)||defined(__i386__) - - unsigned char aatx; - int i; - __m128i *rxdataF_comp128_0,*rxdataF_comp128_1,*rxdataF_comp128_i0,*rxdataF_comp128_i1,*dl_ch_mag128_0,*dl_ch_mag128_1,*dl_ch_mag128_0b,*dl_ch_mag128_1b,*rho128_0,*rho128_1,*rho128_i0,*rho128_i1, - *dl_ch_mag128_i0,*dl_ch_mag128_i1,*dl_ch_mag128_i0b,*dl_ch_mag128_i1b; - - if (frame_parms->nb_antennas_rx>1) { - - for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++) { - - rxdataF_comp128_0 = (__m128i *)&rxdataF_comp[(aatx<<1)][symbol*frame_parms->N_RB_DL*12]; - rxdataF_comp128_1 = (__m128i *)&rxdataF_comp[(aatx<<1)+1][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_0 = (__m128i *)&dl_ch_mag[(aatx<<1)][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_1 = (__m128i *)&dl_ch_mag[(aatx<<1)+1][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_0b = (__m128i *)&dl_ch_magb[(aatx<<1)][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_1b = (__m128i *)&dl_ch_magb[(aatx<<1)+1][symbol*frame_parms->N_RB_DL*12]; - - // MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation) - for (i=0;i<nb_rb*3;i++) { - rxdataF_comp128_0[i] = _mm_adds_epi16(_mm_srai_epi16(rxdataF_comp128_0[i],1),_mm_srai_epi16(rxdataF_comp128_1[i],1)); - dl_ch_mag128_0[i] = _mm_adds_epi16(_mm_srai_epi16(dl_ch_mag128_0[i],1),_mm_srai_epi16(dl_ch_mag128_1[i],1)); - dl_ch_mag128_0b[i] = _mm_adds_epi16(_mm_srai_epi16(dl_ch_mag128_0b[i],1),_mm_srai_epi16(dl_ch_mag128_1b[i],1)); - // print_shorts("mrc comp0:",&rxdataF_comp128_0[i]); - // print_shorts("mrc mag0:",&dl_ch_mag128_0[i]); - // print_shorts("mrc mag0b:",&dl_ch_mag128_0b[i]); - // print_shorts("mrc rho1:",&rho128_1[i]); - - } - } - - if (rho) { - rho128_0 = (__m128i *) &rho[0][symbol*frame_parms->N_RB_DL*12]; - rho128_1 = (__m128i *) &rho[1][symbol*frame_parms->N_RB_DL*12]; - for (i=0;i<nb_rb*3;i++) { - // print_shorts("mrc rho0:",&rho128_0[i]); - // print_shorts("mrc rho1:",&rho128_1[i]); - rho128_0[i] = _mm_adds_epi16(_mm_srai_epi16(rho128_0[i],1),_mm_srai_epi16(rho128_1[i],1)); - } - } - - - if (dual_stream_UE == 1) { - rho128_i0 = (__m128i *) &rho_i[0][symbol*frame_parms->N_RB_DL*12]; - rho128_i1 = (__m128i *) &rho_i[1][symbol*frame_parms->N_RB_DL*12]; - rxdataF_comp128_i0 = (__m128i *)&rxdataF_comp_i[0][symbol*frame_parms->N_RB_DL*12]; - rxdataF_comp128_i1 = (__m128i *)&rxdataF_comp_i[1][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_i0 = (__m128i *)&dl_ch_mag_i[0][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_i1 = (__m128i *)&dl_ch_mag_i[1][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_i0b = (__m128i *)&dl_ch_magb_i[0][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_i1b = (__m128i *)&dl_ch_magb_i[1][symbol*frame_parms->N_RB_DL*12]; - - for (i=0; i<nb_rb*3; i++) { - rxdataF_comp128_i0[i] = _mm_adds_epi16(_mm_srai_epi16(rxdataF_comp128_i0[i],1),_mm_srai_epi16(rxdataF_comp128_i1[i],1)); - rho128_i0[i] = _mm_adds_epi16(_mm_srai_epi16(rho128_i0[i],1),_mm_srai_epi16(rho128_i1[i],1)); - - dl_ch_mag128_i0[i] = _mm_adds_epi16(_mm_srai_epi16(dl_ch_mag128_i0[i],1),_mm_srai_epi16(dl_ch_mag128_i1[i],1)); - dl_ch_mag128_i0b[i] = _mm_adds_epi16(_mm_srai_epi16(dl_ch_mag128_i0b[i],1),_mm_srai_epi16(dl_ch_mag128_i1b[i],1)); - } - } - } - - _mm_empty(); - _m_empty(); - -#elif defined(__arm__) - - unsigned char aatx; - int i; - int16x8_t *rxdataF_comp128_0,*rxdataF_comp128_1,*rxdataF_comp128_i0,*rxdataF_comp128_i1,*dl_ch_mag128_0,*dl_ch_mag128_1,*dl_ch_mag128_0b,*dl_ch_mag128_1b,*rho128_0,*rho128_1,*rho128_i0,*rho128_i1,*dl_ch_mag128_i0,*dl_ch_mag128_i1,*dl_ch_mag128_i0b,*dl_ch_mag128_i1b; - - if (frame_parms->nb_antennas_rx>1) { - - for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++) { - - rxdataF_comp128_0 = (int16x8_t *)&rxdataF_comp[(aatx<<1)][symbol*frame_parms->N_RB_DL*12]; - rxdataF_comp128_1 = (int16x8_t *)&rxdataF_comp[(aatx<<1)+1][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_0 = (int16x8_t *)&dl_ch_mag[(aatx<<1)][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_1 = (int16x8_t *)&dl_ch_mag[(aatx<<1)+1][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_0b = (int16x8_t *)&dl_ch_magb[(aatx<<1)][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_1b = (int16x8_t *)&dl_ch_magb[(aatx<<1)+1][symbol*frame_parms->N_RB_DL*12]; - - // MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation) - for (i=0; i<nb_rb*3; i++) { - rxdataF_comp128_0[i] = vhaddq_s16(rxdataF_comp128_0[i],rxdataF_comp128_1[i]); - dl_ch_mag128_0[i] = vhaddq_s16(dl_ch_mag128_0[i],dl_ch_mag128_1[i]); - dl_ch_mag128_0b[i] = vhaddq_s16(dl_ch_mag128_0b[i],dl_ch_mag128_1b[i]); - } - } - - if (rho) { - rho128_0 = (int16x8_t *) &rho[0][symbol*frame_parms->N_RB_DL*12]; - rho128_1 = (int16x8_t *) &rho[1][symbol*frame_parms->N_RB_DL*12]; - - for (i=0; i<nb_rb*3; i++) { - // print_shorts("mrc rho0:",&rho128_0[i]); - // print_shorts("mrc rho1:",&rho128_1[i]); - rho128_0[i] = vhaddq_s16(rho128_0[i],rho128_1[i]); - } - } - - - if (dual_stream_UE == 1) { - rho128_i0 = (int16x8_t *) &rho_i[0][symbol*frame_parms->N_RB_DL*12]; - rho128_i1 = (int16x8_t *) &rho_i[1][symbol*frame_parms->N_RB_DL*12]; - rxdataF_comp128_i0 = (int16x8_t *)&rxdataF_comp_i[0][symbol*frame_parms->N_RB_DL*12]; - rxdataF_comp128_i1 = (int16x8_t *)&rxdataF_comp_i[1][symbol*frame_parms->N_RB_DL*12]; - - dl_ch_mag128_i0 = (int16x8_t *)&dl_ch_mag_i[0][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_i1 = (int16x8_t *)&dl_ch_mag_i[1][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_i0b = (int16x8_t *)&dl_ch_magb_i[0][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_i1b = (int16x8_t *)&dl_ch_magb_i[1][symbol*frame_parms->N_RB_DL*12]; - - for (i=0; i<nb_rb*3; i++) { - rxdataF_comp128_i0[i] = vhaddq_s16(rxdataF_comp128_i0[i],rxdataF_comp128_i1[i]); - rho128_i0[i] = vhaddq_s16(rho128_i0[i],rho128_i1[i]); - - dl_ch_mag128_i0[i] = vhaddq_s16(dl_ch_mag128_i0[i],dl_ch_mag128_i1[i]); - dl_ch_mag128_i0b[i] = vhaddq_s16(dl_ch_mag128_i0b[i],dl_ch_mag128_i1b[i]); - } - } - } - -#endif -} - - -void dlsch_detection_mrc_TM34(LTE_DL_FRAME_PARMS *frame_parms, - LTE_UE_PDSCH *pdsch_vars, - int harq_pid, - int round, - unsigned char symbol, - unsigned short nb_rb, - unsigned char dual_stream_UE) { - - int i; - __m128i *rxdataF_comp128_0,*rxdataF_comp128_1,*rxdataF_comp128_i0,*rxdataF_comp128_i1,*dl_ch_mag128_0,*dl_ch_mag128_1,*dl_ch_mag128_0b,*dl_ch_mag128_1b,*rho128_0,*rho128_1,*rho128_i0,*rho128_i1,*dl_ch_mag128_i0,*dl_ch_mag128_i1,*dl_ch_mag128_i0b,*dl_ch_mag128_i1b; - - int **rxdataF_comp0 = pdsch_vars->rxdataF_comp0; - int **rxdataF_comp1 = pdsch_vars->rxdataF_comp1[harq_pid][round]; - int **dl_ch_rho_ext = pdsch_vars->dl_ch_rho_ext[harq_pid][round]; //for second stream - int **dl_ch_rho2_ext = pdsch_vars->dl_ch_rho2_ext; - int **dl_ch_mag0 = pdsch_vars->dl_ch_mag0; - int **dl_ch_mag1 = pdsch_vars->dl_ch_mag1[harq_pid][round]; - int **dl_ch_magb0 = pdsch_vars->dl_ch_magb0; - int **dl_ch_magb1 = pdsch_vars->dl_ch_magb1[harq_pid][round]; - - if (frame_parms->nb_antennas_rx>1) { - - rxdataF_comp128_0 = (__m128i *)&rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12]; - rxdataF_comp128_1 = (__m128i *)&rxdataF_comp0[1][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_0 = (__m128i *)&dl_ch_mag0[0][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_1 = (__m128i *)&dl_ch_mag0[1][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_0b = (__m128i *)&dl_ch_magb0[0][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_1b = (__m128i *)&dl_ch_magb0[1][symbol*frame_parms->N_RB_DL*12]; - - // MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation) - for (i=0;i<nb_rb*3;i++) { - rxdataF_comp128_0[i] = _mm_adds_epi16(_mm_srai_epi16(rxdataF_comp128_0[i],1),_mm_srai_epi16(rxdataF_comp128_1[i],1)); - dl_ch_mag128_0[i] = _mm_adds_epi16(_mm_srai_epi16(dl_ch_mag128_0[i],1),_mm_srai_epi16(dl_ch_mag128_1[i],1)); - dl_ch_mag128_0b[i] = _mm_adds_epi16(_mm_srai_epi16(dl_ch_mag128_0b[i],1),_mm_srai_epi16(dl_ch_mag128_1b[i],1)); - - // print_shorts("mrc compens0:",&rxdataF_comp128_0[i]); - // print_shorts("mrc mag128_0:",&dl_ch_mag128_0[i]); - // print_shorts("mrc mag128_0b:",&dl_ch_mag128_0b[i]); - } } - - // if (rho) { - rho128_0 = (__m128i *) &dl_ch_rho2_ext[0][symbol*frame_parms->N_RB_DL*12]; - rho128_1 = (__m128i *) &dl_ch_rho2_ext[1][symbol*frame_parms->N_RB_DL*12]; - for (i=0;i<nb_rb*3;i++) { - // print_shorts("mrc rho0:",&rho128_0[i]); - // print_shorts("mrc rho1:",&rho128_1[i]); - rho128_0[i] = _mm_adds_epi16(_mm_srai_epi16(rho128_0[i],1),_mm_srai_epi16(rho128_1[i],1)); - } - //} - - - if (dual_stream_UE == 1) { - rho128_i0 = (__m128i *) &dl_ch_rho_ext[0][symbol*frame_parms->N_RB_DL*12]; - rho128_i1 = (__m128i *) &dl_ch_rho_ext[1][symbol*frame_parms->N_RB_DL*12]; - rxdataF_comp128_i0 = (__m128i *)&rxdataF_comp1[0][symbol*frame_parms->N_RB_DL*12]; - rxdataF_comp128_i1 = (__m128i *)&rxdataF_comp1[1][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_i0 = (__m128i *)&dl_ch_mag1[0][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_i1 = (__m128i *)&dl_ch_mag1[1][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_i0b = (__m128i *)&dl_ch_magb1[0][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag128_i1b = (__m128i *)&dl_ch_magb1[1][symbol*frame_parms->N_RB_DL*12]; - for (i=0;i<nb_rb*3;i++) { - rxdataF_comp128_i0[i] = _mm_adds_epi16(_mm_srai_epi16(rxdataF_comp128_i0[i],1),_mm_srai_epi16(rxdataF_comp128_i1[i],1)); - rho128_i0[i] = _mm_adds_epi16(_mm_srai_epi16(rho128_i0[i],1),_mm_srai_epi16(rho128_i1[i],1)); - - dl_ch_mag128_i0[i] = _mm_adds_epi16(_mm_srai_epi16(dl_ch_mag128_i0[i],1),_mm_srai_epi16(dl_ch_mag128_i1[i],1)); - dl_ch_mag128_i0b[i] = _mm_adds_epi16(_mm_srai_epi16(dl_ch_mag128_i0b[i],1),_mm_srai_epi16(dl_ch_mag128_i1b[i],1)); - - //print_shorts("mrc compens1:",&rxdataF_comp128_i0[i]); - //print_shorts("mrc mag128_i0:",&dl_ch_mag128_i0[i]); - //print_shorts("mrc mag128_i0b:",&dl_ch_mag128_i0b[i]); - } - } - - - _mm_empty(); - _m_empty(); -} - - - -void dlsch_scale_channel(int **dl_ch_estimates_ext, - LTE_DL_FRAME_PARMS *frame_parms, - LTE_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; aatx<frame_parms->nb_antenna_ports_eNB; aatx++) { - for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - - dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12]; - - for (rb=0;rb<nb_rb;rb++) { - - dl_ch128[0] = _mm_mulhi_epi16(dl_ch128[0],ch_amp128); - dl_ch128[0] = _mm_slli_epi16(dl_ch128[0],3); - - dl_ch128[1] = _mm_mulhi_epi16(dl_ch128[1],ch_amp128); - dl_ch128[1] = _mm_slli_epi16(dl_ch128[1],3); - - if (pilots) { - dl_ch128+=2; - } else { - dl_ch128[2] = _mm_mulhi_epi16(dl_ch128[2],ch_amp128); - dl_ch128[2] = _mm_slli_epi16(dl_ch128[2],3); - dl_ch128+=3; - - } - } - } - } - -#elif defined(__arm__) - -#endif -} - - -//compute average channel_level on each (TX,RX) antenna pair -void dlsch_channel_level(int **dl_ch_estimates_ext, - LTE_DL_FRAME_PARMS *frame_parms, - int32_t *avg, - uint8_t symbol, - unsigned short nb_rb) -{ - -#if defined(__x86_64__)||defined(__i386__) - - short rb; - unsigned char aatx,aarx,nre=12,symbol_mod; - __m128i *dl_ch128, avg128D; - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) - nre=8; - else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB==1)) - nre=10; - else - nre=12; - - //nb_rb*nre = y * 2^x - int16_t x = factor2(nb_rb*nre); - int16_t y = (nb_rb*nre)>>x; - //printf("nb_rb*nre = %d = %d * 2^(%d)\n",nb_rb*nre,y,x); - - for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++) - for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - //clear average level - avg128D = _mm_setzero_si128(); - // 5 is always a symbol with no pilots for both normal and extended prefix - - dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12]; - - for (rb=0;rb<nb_rb;rb++) { - // printf("rb %d : ",rb); - // print_shorts("ch",&dl_ch128[0]); - avg128D = _mm_add_epi32(avg128D,_mm_srai_epi16(_mm_madd_epi16(dl_ch128[0],dl_ch128[0]),x)); - avg128D = _mm_add_epi32(avg128D,_mm_srai_epi16(_mm_madd_epi16(dl_ch128[1],dl_ch128[1]),x)); - - //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)) { - 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; aatx<frame_parms->nb_antenna_ports_eNB; aatx++) - for (aarx=0; aarx<frame_parms->nb_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; rb<nb_rb; rb++) { - // printf("rb %d : ",rb); - // print_shorts("ch",&dl_ch128[0]); - avg128D = vqaddq_s32(avg128D,vmull_s16(dl_ch128[0],dl_ch128[0])); - avg128D = vqaddq_s32(avg128D,vmull_s16(dl_ch128[1],dl_ch128[1])); - avg128D = vqaddq_s32(avg128D,vmull_s16(dl_ch128[2],dl_ch128[2])); - avg128D = vqaddq_s32(avg128D,vmull_s16(dl_ch128[3],dl_ch128[3])); - - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) { - dl_ch128+=4; - } else { - avg128D = vqaddq_s32(avg128D,vmull_s16(dl_ch128[4],dl_ch128[4])); - avg128D = vqaddq_s32(avg128D,vmull_s16(dl_ch128[5],dl_ch128[5])); - dl_ch128+=6; - } - - /* - if (rb==0) { - print_shorts("dl_ch128",&dl_ch128[0]); - print_shorts("dl_ch128",&dl_ch128[1]); - print_shorts("dl_ch128",&dl_ch128[2]); - } - */ - } - - - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) - nre=8; - else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB==1)) - nre=10; - else - nre=12; - - avg[(aatx<<1)+aarx] = (((int32_t*)&avg128D)[0] + - ((int32_t*)&avg128D)[1] + - ((int32_t*)&avg128D)[2] + - ((int32_t*)&avg128D)[3])/(nb_rb*nre); - - // printf("Channel level : %d\n",avg[(aatx<<1)+aarx]); - } - - -#endif -} - -//compute average channel_level of effective (precoded) channel - -//compute average channel_level of effective (precoded) channel -void dlsch_channel_level_TM34(int **dl_ch_estimates_ext, - LTE_DL_FRAME_PARMS *frame_parms, - unsigned char *pmi_ext, - int *avg_0, - int *avg_1, - uint8_t symbol, - unsigned short nb_rb, - MIMO_mode_t mimo_mode){ - -#if defined(__x86_64__)||defined(__i386__) - - - short rb; - unsigned char aarx,nre=12,symbol_mod; - __m128i *dl_ch0_128,*dl_ch1_128, dl_ch0_128_tmp, dl_ch1_128_tmp, avg_0_128D, avg_1_128D; - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - - //clear average level - // avg_0_128D = _mm_setzero_si128(); - // avg_1_128D = _mm_setzero_si128(); - avg_0[0] = 0; - avg_0[1] = 0; - avg_1[0] = 0; - avg_1[1] = 0; - // 5 is always a symbol with no pilots for both normal and extended prefix - - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) - nre=8; - else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB==1)) - nre=10; - else - nre=12; - - for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - dl_ch0_128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch1_128 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; - - avg_0_128D = _mm_setzero_si128(); - avg_1_128D = _mm_setzero_si128(); - for (rb=0; rb<nb_rb; rb++) { - // printf("rb %d : \n",rb); - // print_shorts("ch0\n",&dl_ch0_128[0]); - //print_shorts("ch1\n",&dl_ch1_128[0]); - dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[0]); - dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[0]); - - if (mimo_mode==LARGE_CDD) - prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp); - else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODING1) - prec2A_TM4_128(0,&dl_ch0_128_tmp,&dl_ch1_128_tmp); - else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODINGj) - prec2A_TM4_128(1,&dl_ch0_128_tmp,&dl_ch1_128_tmp); - else if (mimo_mode==DUALSTREAM_PUSCH_PRECODING) - prec2A_TM4_128(pmi_ext[rb],&dl_ch0_128_tmp,&dl_ch1_128_tmp); - - // mmtmpD0 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); - avg_0_128D = _mm_add_epi32(avg_0_128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); - - avg_1_128D = _mm_add_epi32(avg_1_128D,_mm_madd_epi16(dl_ch1_128_tmp,dl_ch1_128_tmp)); - - dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[1]); - dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[1]); - - if (mimo_mode==LARGE_CDD) - prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp); - else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODING1) - prec2A_TM4_128(0,&dl_ch0_128_tmp,&dl_ch1_128_tmp); - else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODINGj) - prec2A_TM4_128(1,&dl_ch0_128_tmp,&dl_ch1_128_tmp); - else if (mimo_mode==DUALSTREAM_PUSCH_PRECODING) - prec2A_TM4_128(pmi_ext[rb],&dl_ch0_128_tmp,&dl_ch1_128_tmp); - - // mmtmpD1 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); - avg_0_128D = _mm_add_epi32(avg_0_128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); - - avg_1_128D = _mm_add_epi32(avg_1_128D,_mm_madd_epi16(dl_ch1_128_tmp,dl_ch1_128_tmp)); - - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) { - dl_ch0_128+=2; - dl_ch1_128+=2; - } - else { - dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[2]); - dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[2]); - - if (mimo_mode==LARGE_CDD) - prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp); - else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODING1) - prec2A_TM4_128(0,&dl_ch0_128_tmp,&dl_ch1_128_tmp); - else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODINGj) - prec2A_TM4_128(1,&dl_ch0_128_tmp,&dl_ch1_128_tmp); - else if (mimo_mode==DUALSTREAM_PUSCH_PRECODING) - prec2A_TM4_128(pmi_ext[rb],&dl_ch0_128_tmp,&dl_ch1_128_tmp); - // mmtmpD2 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); - - avg_1_128D = _mm_add_epi32(avg_1_128D,_mm_madd_epi16(dl_ch1_128_tmp,dl_ch1_128_tmp)); - avg_0_128D = _mm_add_epi32(avg_0_128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); - - dl_ch0_128+=3; - dl_ch1_128+=3; - } - } - - - avg_0[aarx] = (((int*)&avg_0_128D)[0])/(nb_rb*nre) + - (((int*)&avg_0_128D)[1])/(nb_rb*nre) + - (((int*)&avg_0_128D)[2])/(nb_rb*nre) + - (((int*)&avg_0_128D)[3])/(nb_rb*nre); - // printf("From Chan_level aver stream 0 %d =%d\n", aarx, avg_0[aarx]); - - avg_1[aarx] = (((int*)&avg_1_128D)[0])/(nb_rb*nre) + - (((int*)&avg_1_128D)[1])/(nb_rb*nre) + - (((int*)&avg_1_128D)[2])/(nb_rb*nre) + - (((int*)&avg_1_128D)[3])/(nb_rb*nre); - // printf("From Chan_level aver stream 1 %d =%d\n", aarx, avg_1[aarx]); - } -//avg_0[0] = max(avg_0[0],avg_0[1]); -//avg_1[0] = max(avg_1[0],avg_1[1]); -//avg_0[0]= max(avg_0[0], avg_1[0]); - - avg_0[0] = avg_0[0] + avg_0[1]; - // printf("From Chan_level aver stream 0 final =%d\n", avg_0[0]); - avg_1[0] = avg_1[0] + avg_1[1]; - // printf("From Chan_level aver stream 1 final =%d\n", avg_1[0]); - avg_0[0] = min (avg_0[0], avg_1[0]); - avg_1[0] = avg_0[0]; - - _mm_empty(); - _m_empty(); - -#elif defined(__arm__) - -#endif -} - - - -/*void dlsch_channel_level_TM34(int **dl_ch_estimates_ext, - LTE_DL_FRAME_PARMS *frame_parms, - int *avg, - uint8_t symbol, - unsigned short nb_rb, - MIMO_mode_t mimo_mode){ - -#if defined(__x86_64__)||defined(__i386__) - - - short rb; - unsigned char aarx,nre=12,symbol_mod; - __m128i *dl_ch0_128,*dl_ch1_128, dl_ch0_128_tmp, dl_ch1_128_tmp,avg128D; - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - - //clear average level - avg128D = _mm_setzero_si128(); - avg[0] = 0; - avg[1] = 0; - // 5 is always a symbol with no pilots for both normal and extended prefix - - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) - nre=8; - else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB==1)) - nre=10; - else - nre=12; - - for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - dl_ch0_128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch1_128 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; - - for (rb=0; rb<nb_rb; rb++) { - - dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[0]); - dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[0]); - - if (mimo_mode==LARGE_CDD) - prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp); - else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODING1) - prec2A_TM4_128(0,&dl_ch0_128_tmp,&dl_ch1_128_tmp); - else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODINGj) - prec2A_TM4_128(1,&dl_ch0_128_tmp,&dl_ch1_128_tmp); - - // mmtmpD0 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); - avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); - - dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[1]); - dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[1]); - - if (mimo_mode==LARGE_CDD) - prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp); - else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODING1) - prec2A_TM4_128(0,&dl_ch0_128_tmp,&dl_ch1_128_tmp); - else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODINGj) - prec2A_TM4_128(1,&dl_ch0_128_tmp,&dl_ch1_128_tmp); - - // mmtmpD1 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); - avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); - - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) { - dl_ch0_128+=2; - dl_ch1_128+=2; - } - else { - dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[2]); - dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[2]); - - if (mimo_mode==LARGE_CDD) - prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp); - else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODING1) - prec2A_TM4_128(0,&dl_ch0_128_tmp,&dl_ch1_128_tmp); - else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODINGj) - prec2A_TM4_128(1,&dl_ch0_128_tmp,&dl_ch1_128_tmp); - - // mmtmpD2 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); - avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); - - dl_ch0_128+=3; - dl_ch1_128+=3; - } - } - - avg[aarx] = (((int*)&avg128D)[0])/(nb_rb*nre) + - (((int*)&avg128D)[1])/(nb_rb*nre) + - (((int*)&avg128D)[2])/(nb_rb*nre) + - (((int*)&avg128D)[3])/(nb_rb*nre); - } - - // choose maximum of the 2 effective channels - avg[0] = cmax(avg[0],avg[1]); - - _mm_empty(); - _m_empty(); - -#elif defined(__arm__) - -#endif -}*/ - -//compute average channel_level of effective (precoded) channel -void dlsch_channel_level_TM56(int **dl_ch_estimates_ext, - LTE_DL_FRAME_PARMS *frame_parms, - unsigned char *pmi_ext, - int *avg, - uint8_t symbol, - unsigned short nb_rb) -{ - -#if defined(__x86_64__)||defined(__i386__) - - short rb; - unsigned char aarx,nre=12,symbol_mod; - __m128i *dl_ch0_128,*dl_ch1_128, dl_ch0_128_tmp, dl_ch1_128_tmp,avg128D; - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - - //clear average level - avg128D = _mm_setzero_si128(); - avg[0] = 0; - avg[1] = 0; - // 5 is always a symbol with no pilots for both normal and extended prefix - - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) - nre=8; - else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB==1)) - nre=10; - else - nre=12; - - for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - dl_ch0_128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch1_128 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; - - for (rb=0; rb<nb_rb; rb++) { - - dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[0]); - dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[0]); - - prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128_tmp,&dl_ch1_128_tmp); - // mmtmpD0 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); - avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); - - dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[1]); - dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[1]); - - prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128_tmp,&dl_ch1_128_tmp); - // mmtmpD1 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); - avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); - - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) { - dl_ch0_128+=2; - dl_ch1_128+=2; - } - else { - dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[2]); - dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[2]); - - prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128_tmp,&dl_ch1_128_tmp); - // mmtmpD2 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); - avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); - - dl_ch0_128+=3; - dl_ch1_128+=3; - } - } - - avg[aarx] = (((int*)&avg128D)[0])/(nb_rb*nre) + - (((int*)&avg128D)[1])/(nb_rb*nre) + - (((int*)&avg128D)[2])/(nb_rb*nre) + - (((int*)&avg128D)[3])/(nb_rb*nre); - } - - // choose maximum of the 2 effective channels - avg[0] = cmax(avg[0],avg[1]); - - _mm_empty(); - _m_empty(); - -#elif defined(__arm__) - - -#endif -} - -//compute average channel_level for TM7 -void dlsch_channel_level_TM7(int **dl_bf_ch_estimates_ext, - LTE_DL_FRAME_PARMS *frame_parms, - int *avg, - uint8_t symbol, - unsigned short nb_rb) -{ - -#if defined(__x86_64__)||defined(__i386__) - - short rb; - unsigned char aatx,aarx,nre=12,symbol_mod; - __m128i *dl_ch128,avg128D; - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - - for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++) - for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - //clear average level - avg128D = _mm_setzero_si128(); - // 5 is always a symbol with no pilots for both normal and extended prefix - - dl_ch128=(__m128i *)&dl_bf_ch_estimates_ext[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12]; - - for (rb=0; rb<nb_rb; rb++) { - // printf("rb %d : ",rb); - // print_shorts("ch",&dl_ch128[0]); - avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[0],dl_ch128[0])); - avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[1],dl_ch128[1])); - - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) { - dl_ch128+=2; - } else { - avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[2],dl_ch128[2])); - dl_ch128+=3; - } - - /* - if (rb==0) { - print_shorts("dl_ch128",&dl_ch128[0]); - print_shorts("dl_ch128",&dl_ch128[1]); - print_shorts("dl_ch128",&dl_ch128[2]); - } - */ - } - - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))) - nre=10; - else if ((frame_parms->Ncp==0) && (symbol==3 || symbol==6 || symbol==9 || symbol==12)) - nre=9; - else if ((frame_parms->Ncp==1) && (symbol==4 || symbol==7 || symbol==9)) - nre=8; - else - nre=12; - - avg[(aatx<<1)+aarx] = (((int*)&avg128D)[0] + - ((int*)&avg128D)[1] + - ((int*)&avg128D)[2] + - ((int*)&avg128D)[3])/(nb_rb*nre); - - // printf("Channel level : %d\n",avg[(aatx<<1)+aarx]); - } - - _mm_empty(); - _m_empty(); - -#elif defined(__arm__) - -#endif -} -//#define ONE_OVER_2_Q15 16384 -void dlsch_alamouti(LTE_DL_FRAME_PARMS *frame_parms, - int **rxdataF_comp, - int **dl_ch_mag, - int **dl_ch_magb, - unsigned char symbol, - unsigned short nb_rb) -{ - -#if defined(__x86_64__)||defined(__i386__) - - short *rxF0,*rxF1; - __m128i *ch_mag0,*ch_mag1,*ch_mag0b,*ch_mag1b, *rxF0_128; - unsigned char rb,re; - int jj = (symbol*frame_parms->N_RB_DL*12); - uint8_t symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - uint8_t pilots = ((symbol_mod==0)||(symbol_mod==(4-frame_parms->Ncp))) ? 1 : 0; - rxF0_128 = (__m128i*) &rxdataF_comp[0][jj]; - - //amp = _mm_set1_epi16(ONE_OVER_2_Q15); - - - // printf("Doing alamouti!\n"); - rxF0 = (short*)&rxdataF_comp[0][jj]; //tx antenna 0 h0*y - rxF1 = (short*)&rxdataF_comp[2][jj]; //tx antenna 1 h1*y - ch_mag0 = (__m128i *)&dl_ch_mag[0][jj]; - ch_mag1 = (__m128i *)&dl_ch_mag[2][jj]; - ch_mag0b = (__m128i *)&dl_ch_magb[0][jj]; - ch_mag1b = (__m128i *)&dl_ch_magb[2][jj]; - - for (rb=0; rb<nb_rb; rb++) { - - for (re=0; re<((pilots==0)?12:8); re+=2) { - - // Alamouti RX combining - - // printf("Alamouti: symbol %d, rb %d, re %d: rxF0 (%d,%d,%d,%d), rxF1 (%d,%d,%d,%d)\n",symbol,rb,re,rxF0[0],rxF0[1],rxF0[2],rxF0[3],rxF1[0],rxF1[1],rxF1[2],rxF1[3]); - rxF0[0] = rxF0[0] + rxF1[2]; - rxF0[1] = rxF0[1] - rxF1[3]; - - rxF0[2] = rxF0[2] - rxF1[0]; - rxF0[3] = rxF0[3] + rxF1[1]; - - // printf("Alamouti: rxF0 after (%d,%d,%d,%d)\n",rxF0[0],rxF0[1],rxF0[2],rxF0[3]); - rxF0+=4; - rxF1+=4; - - } - - // compute levels for 16QAM or 64 QAM llr unit - ch_mag0[0] = _mm_adds_epi16(ch_mag0[0],ch_mag1[0]); - ch_mag0[1] = _mm_adds_epi16(ch_mag0[1],ch_mag1[1]); - - ch_mag0b[0] = _mm_adds_epi16(ch_mag0b[0],ch_mag1b[0]); - ch_mag0b[1] = _mm_adds_epi16(ch_mag0b[1],ch_mag1b[1]); - - // account for 1/sqrt(2) scaling at transmission - //ch_mag0[0] = _mm_srai_epi16(ch_mag0[0],1); - //ch_mag0[1] = _mm_srai_epi16(ch_mag0[1],1); - //ch_mag0b[0] = _mm_srai_epi16(ch_mag0b[0],1); - //ch_mag0b[1] = _mm_srai_epi16(ch_mag0b[1],1); - - //rxF0_128[0] = _mm_mulhi_epi16(rxF0_128[0],amp); - //rxF0_128[0] = _mm_slli_epi16(rxF0_128[0],1); - //rxF0_128[1] = _mm_mulhi_epi16(rxF0_128[1],amp); - //rxF0_128[1] = _mm_slli_epi16(rxF0_128[1],1); - - //rxF0_128[0] = _mm_srai_epi16(rxF0_128[0],1); - //rxF0_128[1] = _mm_srai_epi16(rxF0_128[1],1); - - - - if (pilots==0) { - ch_mag0[2] = _mm_adds_epi16(ch_mag0[2],ch_mag1[2]); - ch_mag0b[2] = _mm_adds_epi16(ch_mag0b[2],ch_mag1b[2]); - - //ch_mag0[2] = _mm_srai_epi16(ch_mag0[2],1); - //ch_mag0b[2] = _mm_srai_epi16(ch_mag0b[2],1); - - //rxF0_128[2] = _mm_mulhi_epi16(rxF0_128[2],amp); - //rxF0_128[2] = _mm_slli_epi16(rxF0_128[2],1); - - //rxF0_128[2] = _mm_srai_epi16(rxF0_128[2],1); - - - ch_mag0+=3; - ch_mag1+=3; - ch_mag0b+=3; - ch_mag1b+=3; - rxF0_128+=3; - } else { - ch_mag0+=2; - ch_mag1+=2; - ch_mag0b+=2; - ch_mag1b+=2; - rxF0_128+=2; - } - } - - _mm_empty(); - _m_empty(); - -#elif defined(__arm__) - -#endif -} - - -//============================================================================================== -// Extraction functions -//============================================================================================== - -unsigned short 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 char subframe, - uint32_t high_speed_flag, - LTE_DL_FRAME_PARMS *frame_parms) { - - - - unsigned short rb,nb_rb=0; - unsigned char rb_alloc_ind; - unsigned char i,aarx,l,nsymb,skip_half=0,sss_symb,pss_symb=0; - int *dl_ch0,*dl_ch0_ext,*rxF,*rxF_ext; - - - - unsigned char symbol_mod,pilots=0,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; aarx<frame_parms->nb_antennas_rx; aarx++) { - - if (high_speed_flag == 1) - dl_ch0 = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))]; - else - dl_ch0 = &dl_ch_estimates[aarx][5]; - - dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)]; - - rxF_ext = &rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)]; - rxF = &rxdataF[aarx][(frame_parms->first_carrier_offset + (symbol*(frame_parms->ofdm_symbol_size)))]; - - if ((frame_parms->N_RB_DL&1) == 0) // even number of RBs - - for (rb=0;rb<frame_parms->N_RB_DL;rb++) { - - if (rb < 32) - rb_alloc_ind = (rb_alloc[0]>>rb) & 1; - else if (rb < 64) - rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1; - else if (rb < 96) - rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1; - else if (rb < 100) - rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1; - else - rb_alloc_ind = 0; - - if (rb_alloc_ind == 1) - nb_rb++; - - // For second half of RBs skip DC carrier - if (rb==(frame_parms->N_RB_DL>>1)) { - rxF = &rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))]; - //dl_ch0++; - } - - // PBCH - if ((subframe==0) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=nsymb>>1) && (l<((nsymb>>1) + 4))) { - rb_alloc_ind = 0; - } - - //SSS - if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) { - rb_alloc_ind = 0; - } - - - if (frame_parms->frame_type == FDD) { - //PSS - if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { - rb_alloc_ind = 0; - } - } - - if ((frame_parms->frame_type == TDD) && - (subframe==6)) { //TDD Subframe 6 - if ((rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { - rb_alloc_ind = 0; - } - } - - if (rb_alloc_ind==1) { - *pmi_ext = (pmi>>((rb>>2)<<1))&3; - memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int)); - - /* - printf("rb %d\n",rb); - for (i=0;i<12;i++) - printf("(%d %d)",((short *)dl_ch0)[i<<1],((short*)dl_ch0)[1+(i<<1)]); - printf("\n"); - */ - if (pilots==0) { - for (i=0; i<12; i++) { - rxF_ext[i]=rxF[i]; - /* - printf("%d : (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]), - ((short*)&rxF[i])[0],((short*)&rxF[i])[1]);*/ - } - - dl_ch0_ext+=12; - rxF_ext+=12; - } else { - j=0; - - for (i=0; i<12; i++) { - if ((i!=(frame_parms->nushift+poffset)) && - (i!=((frame_parms->nushift+poffset+6)%12))) { - rxF_ext[j]=rxF[i]; - // printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); - dl_ch0_ext[j++]=dl_ch0[i]; - - } - } - - dl_ch0_ext+=10; - rxF_ext+=10; - } - - - } - - dl_ch0+=12; - rxF+=12; - - } - else { // Odd number of RBs - for (rb=0; rb<frame_parms->N_RB_DL>>1; rb++) { -#ifdef DEBUG_DLSCH_DEMOD - printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]); -#endif - skip_half=0; - - if (rb < 32) - rb_alloc_ind = (rb_alloc[0]>>rb) & 1; - else if (rb < 64) - rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1; - else if (rb < 96) - rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1; - else if (rb < 100) - rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1; - else - rb_alloc_ind = 0; - - if (rb_alloc_ind == 1) - nb_rb++; - - - // PBCH - if ((subframe==0) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) { - rb_alloc_ind = 0; - } - - //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3 - if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) - skip_half=1; - else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) - skip_half=2; - - //SSS - - if (((subframe==0)||(subframe==5)) && - (rb>((frame_parms->N_RB_DL>>1)-3)) && - (rb<((frame_parms->N_RB_DL>>1)+3)) && - (l==sss_symb) ) { - rb_alloc_ind = 0; - } - //SSS - if (((subframe==0)||(subframe==5)) && - (rb==((frame_parms->N_RB_DL>>1)-3)) && - (l==sss_symb)) - skip_half=1; - else if (((subframe==0)||(subframe==5)) && - (rb==((frame_parms->N_RB_DL>>1)+3)) && - (l==sss_symb)) - skip_half=2; - - //PSS in subframe 0/5 if FDD - if (frame_parms->frame_type == FDD) { //FDD - - if (((subframe==0)||(subframe==5)) && - (rb>((frame_parms->N_RB_DL>>1)-3)) && - (rb<((frame_parms->N_RB_DL>>1)+3)) && - (l==pss_symb) ) { - rb_alloc_ind = 0; - } - - if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) - skip_half=1; - else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) - skip_half=2; - } - - if ((frame_parms->frame_type == TDD) && - (subframe==6)){ //TDD Subframe 6 - if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { - rb_alloc_ind = 0; - } - if ((rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) - skip_half=1; - else if ((rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) - skip_half=2; - } - - - if (rb_alloc_ind==1) { - -#ifdef DEBUG_DLSCH_DEMOD - printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half); -#endif - if (pilots==0) { - // printf("Extracting w/o pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); - if (skip_half==1) { - memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int)); - - for (i=0; i<6; i++) { - rxF_ext[i]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - dl_ch0_ext+=6; - rxF_ext+=6; - } else if (skip_half==2) { - memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int)); - - for (i=0; i<6; i++) { - rxF_ext[i]=rxF[(i+6)]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - dl_ch0_ext+=6; - rxF_ext+=6; - } else { - memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int)); - - for (i=0; i<12; i++) { - rxF_ext[i]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - dl_ch0_ext+=12; - rxF_ext+=12; - } - } else { - // printf("Extracting with pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); - j=0; - - if (skip_half==1) { - for (i=0; i<6; i++) { - if (i!=((frame_parms->nushift+poffset)%6)) { - rxF_ext[j]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); -#endif - dl_ch0_ext[j++]=dl_ch0[i]; - } - } - rxF_ext+=5; - dl_ch0_ext+=5; - } else if (skip_half==2) { - for (i=0; i<6; i++) { - if (i!=((frame_parms->nushift+poffset)%6)) { - rxF_ext[j]=rxF[(i+6)]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); -#endif - dl_ch0_ext[j++]=dl_ch0[i+6]; - } - } - - dl_ch0_ext+=5; - rxF_ext+=5; - } else { - for (i=0; i<12; i++) { - if ((i!=(frame_parms->nushift+poffset)) && - (i!=((frame_parms->nushift+poffset+6)%12))) { - rxF_ext[j]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); -#endif - dl_ch0_ext[j++]=dl_ch0[i]; - - } - } - - dl_ch0_ext+=10; - rxF_ext+=10; - } - } - } - dl_ch0+=12; - rxF+=12; - } // first half loop - - - // Do middle RB (around DC) - if (rb < 32) - rb_alloc_ind = (rb_alloc[0]>>rb) & 1; - else if (rb < 64) - rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1; - else if (rb < 96) - rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1; - else if (rb < 100) - rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1; - else - rb_alloc_ind = 0; - - - if (rb_alloc_ind == 1) - nb_rb++; - - // PBCH - - if ((subframe==0) && - (l>=(nsymb>>1)) && - (l<((nsymb>>1) + 4))) { - rb_alloc_ind = 0; - } - - //SSS - if (((subframe==0)||(subframe==5)) && (l==sss_symb) ) { - rb_alloc_ind = 0; - } - - if (frame_parms->frame_type == FDD) { - //PSS - if (((subframe==0)||(subframe==5)) && (l==pss_symb) ) { - rb_alloc_ind = 0; - } - } - - //PSS - if ((frame_parms->frame_type == TDD) && - (subframe==6) && - (l==pss_symb) ) { - rb_alloc_ind = 0; - } - - - // printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]); - // printf("DC rb %d (%p)\n",rb,rxF); - if (rb_alloc_ind==1) { -#ifdef DEBUG_DLSCH_DEMOD - printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half); -#endif - if (pilots==0) { - for (i=0; i<6; i++) { - dl_ch0_ext[i]=dl_ch0[i]; - rxF_ext[i]=rxF[i]; - } - - rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; - - for (; i<12; i++) { - dl_ch0_ext[i]=dl_ch0[i]; - rxF_ext[i]=rxF[(1+i-6)]; - } - - dl_ch0_ext+=12; - rxF_ext+=12; - } else { // pilots==1 - j=0; - - for (i=0; i<6; i++) { - if (i!=((frame_parms->nushift+poffset)%6)) { - dl_ch0_ext[j]=dl_ch0[i]; - rxF_ext[j++]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("**extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j-1],*(1+(short*)&rxF_ext[j-1])); -#endif - } - } - - rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; - - for (; i<12; i++) { - if (i!=((frame_parms->nushift+6+poffset)%12)) { - dl_ch0_ext[j]=dl_ch0[i]; - rxF_ext[j++]=rxF[(1+i-6)]; -#ifdef DEBUG_DLSCH_DEMOD - printf("**extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j-1],*(1+(short*)&rxF_ext[j-1])); -#endif - } - } - - dl_ch0_ext+=10; - rxF_ext+=10; - } // symbol_mod==0 - } // rballoc==1 - else { - rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; - } - - dl_ch0+=12; - rxF+=7; - rb++; - - for (;rb<frame_parms->N_RB_DL;rb++) { - // printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]); - // printf("rb %d (%p)\n",rb,rxF); - skip_half=0; - - if (rb < 32) - rb_alloc_ind = (rb_alloc[0]>>rb) & 1; - else if (rb < 64) - rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1; - else if (rb < 96) - rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1; - else if (rb < 100) - rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1; - else - rb_alloc_ind = 0; - - if (rb_alloc_ind == 1) - nb_rb++; - - // PBCH - if ((subframe==0) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=nsymb>>1) && (l<((nsymb>>1) + 4))) { - rb_alloc_ind = 0; - } - //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3 - if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) - skip_half=1; - else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) - skip_half=2; - - //SSS - if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) { - rb_alloc_ind = 0; - } - //SSS - if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==sss_symb)) - skip_half=1; - else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb)) - skip_half=2; - if (frame_parms->frame_type == FDD) { - //PSS - if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { - rb_alloc_ind = 0; - } - - //PSS - - if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) - skip_half=1; - else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) - skip_half=2; - } - - if ((frame_parms->frame_type == TDD) && - - (subframe==6)) { //TDD Subframe 6 - if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { - rb_alloc_ind = 0; - } - - if ((rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) - skip_half=1; - else if ((rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) - skip_half=2; - } - - if (rb_alloc_ind==1) { -#ifdef DEBUG_DLSCH_DEMOD - printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half); -#endif - /* - printf("rb %d\n",rb); - for (i=0;i<12;i++) - printf("(%d %d)",((short *)dl_ch0)[i<<1],((short*)dl_ch0)[1+(i<<1)]); - printf("\n"); - */ - if (pilots==0) { - // printf("Extracting w/o pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); - if (skip_half==1) { - memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int)); - - for (i=0; i<6; i++) { - rxF_ext[i]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - dl_ch0_ext+=6; - rxF_ext+=6; - - } else if (skip_half==2) { - memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int)); - - for (i=0; i<6; i++) { - rxF_ext[i]=rxF[(i+6)]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - dl_ch0_ext+=6; - rxF_ext+=6; - - } else { - memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int)); - - for (i=0; i<12; i++) { - rxF_ext[i]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - dl_ch0_ext+=12; - rxF_ext+=12; - } - } else { - // printf("Extracting with pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); - j=0; - - if (skip_half==1) { - for (i=0; i<6; i++) { - if (i!=((frame_parms->nushift+poffset)%6)) { - rxF_ext[j]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); -#endif - dl_ch0_ext[j++]=dl_ch0[i]; - } - } - - dl_ch0_ext+=5; - rxF_ext+=5; - } else if (skip_half==2) { - for (i=0; i<6; i++) { - if (i!=((frame_parms->nushift+poffset)%6)) { - rxF_ext[j]=rxF[(i+6)]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); -#endif - dl_ch0_ext[j++]=dl_ch0[i+6]; - } - } - - dl_ch0_ext+=5; - rxF_ext+=5; - } else { - for (i=0; i<12; i++) { - if ((i!=(frame_parms->nushift+poffset)) && - (i!=((frame_parms->nushift+poffset+6)%12))) { - rxF_ext[j]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); -#endif - dl_ch0_ext[j++]=dl_ch0[i]; - } - } - dl_ch0_ext+=10; - rxF_ext+=10; - } - } // pilots=0 - } - - dl_ch0+=12; - rxF+=12; - } - } - } - - - return(nb_rb/frame_parms->nb_antennas_rx); -} - -unsigned short dlsch_extract_rbs_dual(int **rxdataF, - int **dl_ch_estimates, - int **rxdataF_ext, - int **dl_ch_estimates_ext, - unsigned short pmi, - unsigned char *pmi_ext, - unsigned int *rb_alloc, - unsigned char symbol, - unsigned char subframe, - uint32_t high_speed_flag, - LTE_DL_FRAME_PARMS *frame_parms, - MIMO_mode_t mimo_mode) { - - int prb,nb_rb=0; - int prb_off,prb_off2; - int rb_alloc_ind,skip_half=0,sss_symb,pss_symb=0,nsymb,l; - int i,aarx; - int32_t *dl_ch0,*dl_ch0p,*dl_ch0_ext,*dl_ch1,*dl_ch1p,*dl_ch1_ext,*rxF,*rxF_ext; - int symbol_mod,pilots=0,j=0; - unsigned char *pmi_loc; - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - // printf("extract_rbs: symbol_mod %d\n",symbol_mod); - - if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) - pilots=1; - - nsymb = (frame_parms->Ncp==NORMAL) ? 14:12; - l=symbol; - - if (frame_parms->frame_type == TDD) { // TDD - sss_symb = nsymb-1; - pss_symb = 2; - } else { - sss_symb = (nsymb>>1)-2; - pss_symb = (nsymb>>1)-1; - } - - for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - - if (high_speed_flag==1) { - dl_ch0 = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))]; - dl_ch1 = &dl_ch_estimates[2+aarx][5+(symbol*(frame_parms->ofdm_symbol_size))]; - } else { - dl_ch0 = &dl_ch_estimates[aarx][5]; - dl_ch1 = &dl_ch_estimates[2+aarx][5]; - } - - pmi_loc = pmi_ext; - - // pointers to extracted RX signals and channel estimates - rxF_ext = &rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)]; - dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)]; - dl_ch1_ext = &dl_ch_estimates_ext[2+aarx][symbol*(frame_parms->N_RB_DL*12)]; - - for (prb=0; prb<frame_parms->N_RB_DL; prb++) { - skip_half=0; - - if (prb < 32) - rb_alloc_ind = (rb_alloc[0]>>prb) & 1; - else if (prb < 64) - rb_alloc_ind = (rb_alloc[1]>>(prb-32)) & 1; - else if (prb < 96) - rb_alloc_ind = (rb_alloc[2]>>(prb-64)) & 1; - else if (prb < 100) - rb_alloc_ind = (rb_alloc[3]>>(prb-96)) & 1; - else - rb_alloc_ind = 0; - - if (rb_alloc_ind == 1) - nb_rb++; - - - if ((frame_parms->N_RB_DL&1) == 0) { // even number of RBs - - // PBCH - if ((subframe==0) && - (prb>=((frame_parms->N_RB_DL>>1)-3)) && - (prb<((frame_parms->N_RB_DL>>1)+3)) && - (l>=(nsymb>>1)) && - (l<((nsymb>>1) + 4))) { - rb_alloc_ind = 0; - // printf("symbol %d / rb %d: skipping PBCH REs\n",symbol,prb); - } - - //SSS - - if (((subframe==0)||(subframe==5)) && - (prb>=((frame_parms->N_RB_DL>>1)-3)) && - (prb<((frame_parms->N_RB_DL>>1)+3)) && - (l==sss_symb) ) { - rb_alloc_ind = 0; - // printf("symbol %d / rb %d: skipping SSS REs\n",symbol,prb); - } - - - - //PSS in subframe 0/5 if FDD - if (frame_parms->frame_type == FDD) { //FDD - if (((subframe==0)||(subframe==5)) && - (prb>=((frame_parms->N_RB_DL>>1)-3)) && - (prb<((frame_parms->N_RB_DL>>1)+3)) && - (l==pss_symb) ) { - rb_alloc_ind = 0; - // printf("symbol %d / rb %d: skipping PSS REs\n",symbol,prb); - } - } - - if ((frame_parms->frame_type == TDD) && - (subframe==6)) { //TDD Subframe 6 - if ((prb>=((frame_parms->N_RB_DL>>1)-3)) && - (prb<((frame_parms->N_RB_DL>>1)+3)) && - (l==pss_symb) ) { - rb_alloc_ind = 0; - } - } - - if (rb_alloc_ind==1) { // PRB is allocated - - - - prb_off = 12*prb; - prb_off2 = 1+(12*(prb-(frame_parms->N_RB_DL>>1))); - dl_ch0p = dl_ch0+(12*prb); - dl_ch1p = dl_ch1+(12*prb); - if (prb<(frame_parms->N_RB_DL>>1)){ - rxF = &rxdataF[aarx][prb_off+ - frame_parms->first_carrier_offset + - (symbol*(frame_parms->ofdm_symbol_size))]; - } - else { - rxF = &rxdataF[aarx][prb_off2+ - (symbol*(frame_parms->ofdm_symbol_size))]; - } - - /* - if (mimo_mode <= PUSCH_PRECODING1) - *pmi_loc = (pmi>>((prb>>2)<<1))&3; - else - *pmi_loc=(pmi>>prb)&1;*/ - - *pmi_loc = get_pmi(frame_parms->N_RB_DL,mimo_mode,pmi,prb); - pmi_loc++; - - - if (pilots == 0) { - - memcpy(dl_ch0_ext,dl_ch0p,12*sizeof(int)); - memcpy(dl_ch1_ext,dl_ch1p,12*sizeof(int)); - memcpy(rxF_ext,rxF,12*sizeof(int)); - dl_ch0_ext +=12; - dl_ch1_ext +=12; - rxF_ext +=12; - } else { // pilots==1 - j=0; - for (i=0; i<12; i++) { - if ((i!=frame_parms->nushift) && - (i!=frame_parms->nushift+3) && - (i!=frame_parms->nushift+6) && - (i!=((frame_parms->nushift+9)%12))) { - rxF_ext[j]=rxF[i]; - // printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); - dl_ch0_ext[j]=dl_ch0p[i]; - dl_ch1_ext[j++]=dl_ch1p[i]; - } - } - dl_ch0_ext+=8; - dl_ch1_ext+=8; - rxF_ext+=8; - } // pilots==1 - - } - } else { // Odd number of RBs - - - // PBCH - if ((subframe==0) && - (prb>((frame_parms->N_RB_DL>>1)-3)) && - (prb<((frame_parms->N_RB_DL>>1)+3)) && - (l>=(nsymb>>1)) && - (l<((nsymb>>1) + 4))) { - rb_alloc_ind = 0; - // printf("symbol %d / rb %d: skipping PBCH REs\n",symbol,prb); - } - - //SSS - - if (((subframe==0)||(subframe==5)) && - (prb>((frame_parms->N_RB_DL>>1)-3)) && - (prb<((frame_parms->N_RB_DL>>1)+3)) && - (l==sss_symb) ) { - rb_alloc_ind = 0; - // printf("symbol %d / rb %d: skipping SSS REs\n",symbol,prb); - } - - - - //PSS in subframe 0/5 if FDD - if (frame_parms->frame_type == FDD) { //FDD - if (((subframe==0)||(subframe==5)) && - (prb>((frame_parms->N_RB_DL>>1)-3)) && - (prb<((frame_parms->N_RB_DL>>1)+3)) && - (l==pss_symb) ) { - rb_alloc_ind = 0; - // printf("symbol %d / rb %d: skipping PSS REs\n",symbol,prb); - } - } - - if ((frame_parms->frame_type == TDD) && - ((subframe==1) || (subframe==6))) { //TDD Subframe 1-6 - if ((prb>((frame_parms->N_RB_DL>>1)-3)) && - (prb<((frame_parms->N_RB_DL>>1)+3)) && - (l==pss_symb) ) { - rb_alloc_ind = 0; - } - } - - if (rb_alloc_ind == 1) { - skip_half=0; - - //Check if we have to drop half a PRB due to PSS/SSS/PBCH - // skip_half == 0 means full PRB - // skip_half == 1 means first half is used (leftmost half-PRB from PSS/SSS/PBCH) - // skip_half == 2 means second half is used (rightmost half-PRB from PSS/SSS/PBCH) - //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3 - if ((subframe==0) && - (prb==((frame_parms->N_RB_DL>>1)-3)) && - (l>=(nsymb>>1)) && - (l<((nsymb>>1) + 4))) - skip_half=1; - else if ((subframe==0) && - (prb==((frame_parms->N_RB_DL>>1)+3)) && - (l>=(nsymb>>1)) && - (l<((nsymb>>1) + 4))) - skip_half=2; - - //SSS - if (((subframe==0)||(subframe==5)) && - (prb==((frame_parms->N_RB_DL>>1)-3)) && - (l==sss_symb)) - skip_half=1; - else if (((subframe==0)||(subframe==5)) && - (prb==((frame_parms->N_RB_DL>>1)+3)) && - (l==sss_symb)) - skip_half=2; - - //PSS Subframe 0,5 - if (((frame_parms->frame_type == FDD) && - (((subframe==0)||(subframe==5)))) || //FDD Subframes 0,5 - ((frame_parms->frame_type == TDD) && - (((subframe==1) || (subframe==6))))) { //TDD Subframes 1,6 - - if ((prb==((frame_parms->N_RB_DL>>1)-3)) && - (l==pss_symb)) - skip_half=1; - else if ((prb==((frame_parms->N_RB_DL>>1)+3)) && - (l==pss_symb)) - skip_half=2; - } - - - prb_off = 12*prb; - prb_off2 = 7+(12*(prb-(frame_parms->N_RB_DL>>1)-1)); - dl_ch0p = dl_ch0+(12*prb); - dl_ch1p = dl_ch1+(12*prb); - - if (prb<=(frame_parms->N_RB_DL>>1)){ - rxF = &rxdataF[aarx][prb_off+ - frame_parms->first_carrier_offset + - (symbol*(frame_parms->ofdm_symbol_size))]; - } - else { - rxF = &rxdataF[aarx][prb_off2+ - (symbol*(frame_parms->ofdm_symbol_size))]; - } -#ifdef DEBUG_DLSCH_DEMOD - printf("symbol %d / rb %d: alloc %d skip_half %d (rxF %p, rxF_ext %p) prb_off (%d,%d)\n",symbol,prb,rb_alloc_ind,skip_half,rxF,rxF_ext,prb_off,prb_off2); -#endif - /* if (mimo_mode <= PUSCH_PRECODING1) - *pmi_loc = (pmi>>((prb>>2)<<1))&3; - else - *pmi_loc=(pmi>>prb)&1; - // printf("symbol_mod %d (pilots %d) rb %d, sb %d, pmi %d (pmi_loc %p,rxF %p, ch00 %p, ch01 %p, rxF_ext %p dl_ch0_ext %p dl_ch1_ext %p)\n",symbol_mod,pilots,prb,prb>>2,*pmi_loc,pmi_loc,rxF,dl_ch0, dl_ch1, rxF_ext,dl_ch0_ext,dl_ch1_ext); -*/ - *pmi_loc = get_pmi(frame_parms->N_RB_DL,mimo_mode,pmi,prb); - pmi_loc++; - - if (prb != (frame_parms->N_RB_DL>>1)) { // This PRB is not around DC - if (pilots==0) { - if (skip_half==1) { - memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t)); - memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t)); - memcpy(rxF_ext,rxF,6*sizeof(int32_t)); -#ifdef DEBUG_DLSCH_DEMOD - for (i=0;i<6;i++) - printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - dl_ch0_ext+=6; - dl_ch1_ext+=6; - rxF_ext+=6; - } else if (skip_half==2) { - memcpy(dl_ch0_ext,dl_ch0p+6,6*sizeof(int32_t)); - memcpy(dl_ch1_ext,dl_ch1p+6,6*sizeof(int32_t)); - memcpy(rxF_ext,rxF+6,6*sizeof(int32_t)); -#ifdef DEBUG_DLSCH_DEMOD - for (i=0;i<6;i++) - printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - dl_ch0_ext+=6; - dl_ch1_ext+=6; - rxF_ext+=6; - } else { // skip_half==0 - memcpy(dl_ch0_ext,dl_ch0p,12*sizeof(int32_t)); - memcpy(dl_ch1_ext,dl_ch1p,12*sizeof(int32_t)); - memcpy(rxF_ext,rxF,12*sizeof(int32_t)); -#ifdef DEBUG_DLSCH_DEMOD - for (i=0;i<12;i++) - printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - dl_ch0_ext+=12; - dl_ch1_ext+=12; - rxF_ext+=12; - } - } else { // pilots=1 - j=0; - - if (skip_half==1) { - for (i=0; i<6; i++) { - if ((i!=frame_parms->nushift) && - (i!=((frame_parms->nushift+3)%6))) { - rxF_ext[j]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("(pilots,skip1)extract rb %d, re %d (%d)=> (%d,%d)\n",prb,i,j,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); -#endif - dl_ch0_ext[j]=dl_ch0p[i]; - dl_ch1_ext[j++]=dl_ch1p[i]; - } - } - dl_ch0_ext+=4; - dl_ch1_ext+=4; - rxF_ext+=4; - } else if (skip_half==2) { - for (i=0; i<6; i++) { - if ((i!=frame_parms->nushift) && - (i!=((frame_parms->nushift+3)%6))) { - rxF_ext[j]=rxF[(i+6)]; -#ifdef DEBUG_DLSCH_DEMOD - printf("(pilots,skip2)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); -#endif - dl_ch0_ext[j]=dl_ch0p[i+6]; - dl_ch1_ext[j++]=dl_ch1p[i+6]; - } - } - dl_ch0_ext+=4; - dl_ch1_ext+=4; - rxF_ext+=4; - - } else { //skip_half==0 - for (i=0; i<12; i++) { - if ((i!=frame_parms->nushift) && - (i!=frame_parms->nushift+3) && - (i!=frame_parms->nushift+6) && - (i!=((frame_parms->nushift+9)%12))) { - rxF_ext[j]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("(pilots)extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); -#endif - dl_ch0_ext[j] =dl_ch0p[i]; - dl_ch1_ext[j++]=dl_ch1p[i]; - } - } - dl_ch0_ext+=8; - dl_ch1_ext+=8; - rxF_ext+=8; - } //skip_half==0 - } //pilots==1 - } else { // Do middle RB (around DC) - - if (pilots==0) { - memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t)); - memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t)); - memcpy(rxF_ext,rxF,6*sizeof(int32_t)); -#ifdef DEBUG_DLSCH_DEMOD - for (i=0; i<6; i++) { - printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); - } -#endif - rxF_ext+=6; - dl_ch0_ext+=6; - dl_ch1_ext+=6; - dl_ch0p+=6; - dl_ch1p+=6; - - rxF = &rxdataF[aarx][1+((symbol*(frame_parms->ofdm_symbol_size)))]; - - memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t)); - memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t)); - memcpy(rxF_ext,rxF,6*sizeof(int32_t)); -#ifdef DEBUG_DLSCH_DEMOD - for (i=0; i<6; i++) { - printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); - } -#endif - rxF_ext+=6; - dl_ch0_ext+=6; - dl_ch1_ext+=6; - } else { // pilots==1 - j=0; - - for (i=0; i<6; i++) { - if ((i!=frame_parms->nushift) && - (i!=((frame_parms->nushift+3)%6))) { - dl_ch0_ext[j]=dl_ch0p[i]; - dl_ch1_ext[j]=dl_ch1p[i]; - rxF_ext[j++]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("(pilots)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF[i],*(1+(short*)&rxF[i])); -#endif - } - } - rxF = &rxdataF[aarx][1+symbol*(frame_parms->ofdm_symbol_size)]; - - for (; i<12; i++) { - if ((i!=((frame_parms->nushift+6)%12)) && - (i!=((frame_parms->nushift+9)%12))) { - dl_ch0_ext[j]=dl_ch0p[i]; - dl_ch1_ext[j]=dl_ch1p[i]; - rxF_ext[j++]=rxF[i-6]; -#ifdef DEBUG_DLSCH_DEMOD - printf("(pilots)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF[1+i-6],*(1+(short*)&rxF[1+i-6])); -#endif - } - } - - dl_ch0_ext+=8; - dl_ch1_ext+=8; - rxF_ext+=8; - } //pilots==1 - } // if Middle PRB - } // if odd PRB - } // if rballoc==1 - } // for prb - } // for aarx - return(nb_rb/frame_parms->nb_antennas_rx); -} - -unsigned short dlsch_extract_rbs_TM7(int **rxdataF, - int **dl_bf_ch_estimates, - int **rxdataF_ext, - int **dl_bf_ch_estimates_ext, - unsigned int *rb_alloc, - unsigned char symbol, - unsigned char subframe, - uint32_t high_speed_flag, - LTE_DL_FRAME_PARMS *frame_parms) -{ - - unsigned short rb,nb_rb=0; - unsigned char rb_alloc_ind; - unsigned char i,aarx,l,nsymb,skip_half=0,sss_symb,pss_symb=0; - int *dl_ch0,*dl_ch0_ext,*rxF,*rxF_ext; - - unsigned char symbol_mod,pilots=0,uespec_pilots=0,j=0,poffset=0,uespec_poffset=0; - int8_t uespec_nushift = frame_parms->Nid_cell%3; - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - pilots = ((symbol_mod==0)||(symbol_mod==(4-frame_parms->Ncp))) ? 1 : 0; - l=symbol; - nsymb = (frame_parms->Ncp==NORMAL) ? 14:12; - - if (frame_parms->Ncp==0){ - if (symbol==3 || symbol==6 || symbol==9 || symbol==12) - uespec_pilots = 1; - } else{ - if (symbol==4 || symbol==7 || symbol==10) - uespec_pilots = 1; - } - - if (frame_parms->frame_type == TDD) {// TDD - sss_symb = nsymb-1; - pss_symb = 2; - } else { - sss_symb = (nsymb>>1)-2; - pss_symb = (nsymb>>1)-1; - } - - if (symbol_mod==(4-frame_parms->Ncp)) - poffset=3; - - if ((frame_parms->Ncp==0 && (symbol==6 ||symbol ==12)) || (frame_parms->Ncp==1 && symbol==7)) - uespec_poffset=2; - - for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { - - if (high_speed_flag == 1) - dl_ch0 = &dl_bf_ch_estimates[aarx][symbol*(frame_parms->ofdm_symbol_size)]; - else - dl_ch0 = &dl_bf_ch_estimates[aarx][0]; - - dl_ch0_ext = &dl_bf_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)]; - - rxF_ext = &rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)]; - rxF = &rxdataF[aarx][(frame_parms->first_carrier_offset + (symbol*(frame_parms->ofdm_symbol_size)))]; - - if ((frame_parms->N_RB_DL&1) == 0) // even number of RBs - for (rb=0; rb<frame_parms->N_RB_DL; rb++) { - - if (rb < 32) - rb_alloc_ind = (rb_alloc[0]>>rb) & 1; - else if (rb < 64) - rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1; - else if (rb < 96) - rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1; - else if (rb < 100) - rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1; - else - rb_alloc_ind = 0; - - if (rb_alloc_ind == 1) - nb_rb++; - - // For second half of RBs skip DC carrier - if (rb==(frame_parms->N_RB_DL>>1)) { - rxF = &rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))]; - //dl_ch0++; - } - - // PBCH - if ((subframe==0) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=nsymb>>1) && (l<((nsymb>>1) + 4))) { - rb_alloc_ind = 0; - } - - //SSS - if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) { - rb_alloc_ind = 0; - } - - - if (frame_parms->frame_type == FDD) { - //PSS - if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { - rb_alloc_ind = 0; - } - } - - if ((frame_parms->frame_type == TDD) && - (subframe==6)) { //TDD Subframe 6 - if ((rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { - rb_alloc_ind = 0; - } - } - - if (rb_alloc_ind==1) { - - /* - printf("rb %d\n",rb); - for (i=0;i<12;i++) - printf("(%d %d)",((short *)dl_ch0)[i<<1],((short*)dl_ch0)[1+(i<<1)]); - printf("\n"); - */ - if (pilots==0 && uespec_pilots==0) { - memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int)); - - for (i=0; i<12; i++) { - rxF_ext[i]=rxF[i]; - } - - dl_ch0_ext+=12; - rxF_ext+=12; - } else if(pilots==1 && uespec_pilots==0) { - j=0; - - for (i=0; i<12; i++) { - if ((i!=(frame_parms->nushift+poffset)) && - (i!=((frame_parms->nushift+poffset+6)%12))) { - rxF_ext[j]=rxF[i]; - dl_ch0_ext[j++]=dl_ch0[i]; - } - } - - dl_ch0_ext+=10; - rxF_ext+=10; - - } else if (pilots==0 && uespec_pilots==1) { - j=0; - - - for (i=0; i<12; i++){ - if (frame_parms->Ncp==0){ - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ - rxF_ext[j] = rxF[i]; - dl_ch0_ext[j++]=dl_ch0[i]; - } - } else{ - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ - rxF_ext[j] = rxF[i]; - dl_ch0_ext[j++]=dl_ch0[i]; - } - } - - } - - dl_ch0_ext+=9-frame_parms->Ncp; - rxF_ext+=9-frame_parms->Ncp; - - } else { - LOG_E(PHY,"dlsch_extract_rbs_TM7(dl_demodulation.c):pilot or ue spec pilot detection error\n"); - exit(-1); - } - - } - - dl_ch0+=12; - rxF+=12; - - } - else { // Odd number of RBs - for (rb=0; rb<frame_parms->N_RB_DL>>1; rb++) { - skip_half=0; - - if (rb < 32) - rb_alloc_ind = (rb_alloc[0]>>rb) & 1; - else if (rb < 64) - rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1; - else if (rb < 96) - rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1; - else if (rb < 100) - rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1; - else - rb_alloc_ind = 0; - - if (rb_alloc_ind == 1) - nb_rb++; - - // PBCH - if ((subframe==0) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) { - rb_alloc_ind = 0; - } - - //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3 - if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) - skip_half=1; - else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) - skip_half=2; - - //SSS - - if (((subframe==0)||(subframe==5)) && - (rb>((frame_parms->N_RB_DL>>1)-3)) && - (rb<((frame_parms->N_RB_DL>>1)+3)) && - (l==sss_symb) ) { - rb_alloc_ind = 0; - } - - //SSS - if (((subframe==0)||(subframe==5)) && - (rb==((frame_parms->N_RB_DL>>1)-3)) && - (l==sss_symb)) - skip_half=1; - else if (((subframe==0)||(subframe==5)) && - (rb==((frame_parms->N_RB_DL>>1)+3)) && - (l==sss_symb)) - skip_half=2; - - //PSS in subframe 0/5 if FDD - if (frame_parms->frame_type == FDD) { //FDD - if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { - rb_alloc_ind = 0; - } - - if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) - skip_half=1; - else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) - skip_half=2; - } - - if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) { //TDD Subframe 1 and 6 - if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { - rb_alloc_ind = 0; - } - - if ((rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) - skip_half=1; - else if ((rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) - skip_half=2; - } - - - if (rb_alloc_ind==1) { -#ifdef DEBUG_DLSCH_DEMOD - printf("rb %d/symbol %d pilots %d, uespec_pilots %d, (skip_half %d)\n",rb,l,pilots,uespec_pilots,skip_half); -#endif - - if (pilots==0 && uespec_pilots==0) { - //printf("Extracting w/o pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); - - if (skip_half==1) { - memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int)); - - for (i=0; i<6; i++) { - rxF_ext[i]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - - dl_ch0_ext+=6; - rxF_ext+=6; - } else if (skip_half==2) { - memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int)); - - for (i=0; i<6; i++) { - rxF_ext[i]=rxF[(i+6)]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - - dl_ch0_ext+=6; - rxF_ext+=6; - } else { - memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int)); - - for (i=0; i<12; i++){ - rxF_ext[i]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",symbol,rb,i,*(short *)&rxF[i],*(1+(short*)&rxF[i])); -#endif - } - dl_ch0_ext+=12; - rxF_ext+=12; - } - } else if (pilots==1 && uespec_pilots==0) { - // printf("Extracting with pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); - j=0; - - if (skip_half==1) { - for (i=0; i<6; i++) { - if (i!=((frame_parms->nushift+poffset)%6)) { - rxF_ext[j]=rxF[i]; - dl_ch0_ext[j++]=dl_ch0[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - - dl_ch0_ext+=5; - rxF_ext+=5; - } else if (skip_half==2) { - for (i=0; i<6; i++) { - if (i!=((frame_parms->nushift+poffset)%6)) { - rxF_ext[j]=rxF[(i+6)]; - dl_ch0_ext[j++]=dl_ch0[i+6]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - - dl_ch0_ext+=5; - rxF_ext+=5; - } else { - for (i=0; i<12; i++) { - if ((i!=(frame_parms->nushift+poffset)) && - (i!=((frame_parms->nushift+poffset+6)%12))) { - rxF_ext[j]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); -#endif - dl_ch0_ext[j++]=dl_ch0[i]; - - } - } - - dl_ch0_ext+=10; - rxF_ext+=10; - } - } else if(pilots==0 && uespec_pilots==1){ - //printf("Extracting with uespec pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); - j=0; - - if (skip_half==1) { - if (frame_parms->Ncp==0){ - for (i=0; i<6; i++) { - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ - rxF_ext[j]=rxF[i]; - dl_ch0_ext[j++]=dl_ch0[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - dl_ch0_ext+=6-(uespec_nushift+uespec_poffset<6)-(uespec_nushift+uespec_poffset+4<6)-((uespec_nushift+uespec_poffset+8)%12<6); - rxF_ext+=6-(uespec_nushift+uespec_poffset<6)-(uespec_nushift+uespec_poffset+4<6)-((uespec_nushift+uespec_poffset+8)%12<6); - - } else{ - for (i=0; i<6; i++) { - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ - rxF_ext[j]=rxF[i]; - dl_ch0_ext[j++]=dl_ch0[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - dl_ch0_ext+=4; - rxF_ext+=4; - } - - } else if (skip_half==2) { - if(frame_parms->Ncp==0){ - for (i=0; i<6; i++) { - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ - rxF_ext[j]=rxF[(i+6)]; - dl_ch0_ext[j++]=dl_ch0[i+6]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - dl_ch0_ext+=6-(uespec_nushift+uespec_poffset>6)-(uespec_nushift+uespec_poffset+4>6)-((uespec_nushift+uespec_poffset+8)%12>6); - rxF_ext+=6-(uespec_nushift+uespec_poffset>6)-(uespec_nushift+uespec_poffset+4>6)-((uespec_nushift+uespec_poffset+8)%12>6); - - } else { - for (i=0; i<6; i++) { - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ - rxF_ext[j]=rxF[(i+6)]; - dl_ch0_ext[j++]=dl_ch0[i+6]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - dl_ch0_ext+=4; - rxF_ext+=4; - } - - } else { - - for (i=0; i<12; i++){ - if (frame_parms->Ncp==0){ - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ - rxF_ext[j] = rxF[i]; - dl_ch0_ext[j++] = dl_ch0[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d, j %d => (%d,%d)\n",symbol,rb,i,j-1,*(short *)&dl_ch0[j],*(1+(short*)&dl_ch0[i])); -#endif - } - } else{ - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ - rxF_ext[j] = rxF[i]; - dl_ch0_ext[j++]=dl_ch0[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - - } - - dl_ch0_ext+=9-frame_parms->Ncp; - rxF_ext+=9-frame_parms->Ncp; - } - - } else { - LOG_E(PHY,"dlsch_extract_rbs_TM7(dl_demodulation.c):pilot or ue spec pilot detection error\n"); - exit(-1); - - } - } - - dl_ch0+=12; - rxF+=12; - } // first half loop - - - // Do middle RB (around DC) - if (rb < 32) - rb_alloc_ind = (rb_alloc[0]>>rb) & 1; - else if (rb < 64) - rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1; - else if (rb < 96) - rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1; - else if (rb < 100) - rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1; - else - rb_alloc_ind = 0; - - if (rb_alloc_ind == 1) - nb_rb++; - - // PBCH - if ((subframe==0) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) { - rb_alloc_ind = 0; - } - - //SSS - if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) { - rb_alloc_ind = 0; - } - - if (frame_parms->frame_type == FDD) { - //PSS - if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { - rb_alloc_ind = 0; - } - } - - if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) { - //PSS - if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { - rb_alloc_ind = 0; - } - } - - //printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]); - //printf("DC rb %d (%p)\n",rb,rxF); - if (rb_alloc_ind==1) { - //printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half); - if (pilots==0 && uespec_pilots==0) { - for (i=0; i<6; i++) { - dl_ch0_ext[i]=dl_ch0[i]; - rxF_ext[i]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - - rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; - - for (; i<12; i++) { - dl_ch0_ext[i]=dl_ch0[i]; - rxF_ext[i]=rxF[(1+i-6)]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - - dl_ch0_ext+=12; - rxF_ext+=12; - } else if(pilots==1 && uespec_pilots==0){ // pilots==1 - j=0; - - for (i=0; i<6; i++) { - if (i!=((frame_parms->nushift+poffset)%6)) { - dl_ch0_ext[j]=dl_ch0[i]; - rxF_ext[j++]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - - rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; - - for (; i<12; i++) { - if (i!=((frame_parms->nushift+6+poffset)%12)) { - dl_ch0_ext[j]=dl_ch0[i]; - rxF_ext[j++]=rxF[(1+i-6)]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - - dl_ch0_ext+=10; - rxF_ext+=10; - } else if(pilots==0 && uespec_pilots==1) { - j=0; - - for (i=0; i<6; i++) { - if (frame_parms->Ncp==0){ - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ - dl_ch0_ext[j]=dl_ch0[i]; - rxF_ext[j++] = rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } else { - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ - dl_ch0_ext[j]=dl_ch0[i]; - rxF_ext[j++] = rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - } - - rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; - - for (; i<12; i++) { - if (frame_parms->Ncp==0){ - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ - dl_ch0_ext[j]=dl_ch0[i]; - rxF_ext[j++]=rxF[(1+i-6)]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } else { - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ - dl_ch0_ext[j]=dl_ch0[i]; - rxF_ext[j++] = rxF[(1+i-6)]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - } - - dl_ch0_ext+=9-frame_parms->Ncp; - rxF_ext+=9-frame_parms->Ncp; - - }// symbol_mod==0 - - } // rballoc==1 - else { - rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; - } - - dl_ch0+=12; - rxF+=7; - rb++; - - for (; rb<frame_parms->N_RB_DL; rb++) { - // printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]); - // printf("rb %d (%p)\n",rb,rxF); - skip_half=0; - - if (rb < 32) - rb_alloc_ind = (rb_alloc[0]>>rb) & 1; - else if (rb < 64) - rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1; - else if (rb < 96) - rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1; - else if (rb < 100) - rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1; - else - rb_alloc_ind = 0; - - if (rb_alloc_ind==1) - nb_rb++; - - // PBCH - if ((subframe==0) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=nsymb>>1) && (l<((nsymb>>1) + 4))) { - rb_alloc_ind = 0; - } - - //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3 - if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) - skip_half=1; - else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) - skip_half=2; - - //SSS - if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) { - rb_alloc_ind = 0; - } - - //SSS - if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==sss_symb)) - skip_half=1; - else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb)) - skip_half=2; - - //PSS - if (frame_parms->frame_type == FDD) { - if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { - rb_alloc_ind = 0; - } - - if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) - skip_half=1; - else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) - skip_half=2; - } - - if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) { //TDD Subframe 1 and 6 - if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { - rb_alloc_ind = 0; - } - - if ((rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) - skip_half=1; - else if ((rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) - skip_half=2; - } - - if (rb_alloc_ind==1) { -#ifdef DEBUG_DLSCH_DEMOD - printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half); -#endif - /* - printf("rb %d\n",rb); - for (i=0;i<12;i++) - printf("(%d %d)",((short *)dl_ch0)[i<<1],((short*)dl_ch0)[1+(i<<1)]); - printf("\n"); - */ - if (pilots==0 && uespec_pilots==0) { - //printf("Extracting w/o pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); - if (skip_half==1) { - memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int)); - - for (i=0; i<6; i++) { - rxF_ext[i]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - - dl_ch0_ext+=6; - rxF_ext+=6; - - } else if (skip_half==2) { - memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int)); - - for (i=0; i<6; i++) { - rxF_ext[i]=rxF[i+6]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - - dl_ch0_ext+=6; - rxF_ext+=6; - - } else { - memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int)); - //printf("symbol %d, extract rb %d, => (%d,%d)\n",symbol,rb,*(short *)&dl_ch0[j],*(1+(short*)&dl_ch0[i])); - - for (i=0; i<12; i++) { - rxF_ext[i]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - - dl_ch0_ext+=12; - rxF_ext+=12; - } - } else if (pilots==1 && uespec_pilots==0){ - //printf("Extracting with pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); - j=0; - - if (skip_half==1) { - for (i=0; i<6; i++) { - if (i!=((frame_parms->nushift+poffset)%6)) { - rxF_ext[j]=rxF[i]; - dl_ch0_ext[j++]=dl_ch0[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - - dl_ch0_ext+=5; - rxF_ext+=5; - } else if (skip_half==2) { - for (i=0; i<6; i++) { - if (i!=((frame_parms->nushift+poffset)%6)) { - rxF_ext[j]=rxF[(i+6)]; - dl_ch0_ext[j++]=dl_ch0[i+6]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - - dl_ch0_ext+=5; - rxF_ext+=5; - } else { - for (i=0; i<12; i++) { - if ((i!=(frame_parms->nushift+poffset)) && - (i!=((frame_parms->nushift+poffset+6)%12))) { - rxF_ext[j]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); -#endif - dl_ch0_ext[j++]=dl_ch0[i]; - } - } - - dl_ch0_ext+=10; - rxF_ext+=10; - } - } else if(pilots==0 && uespec_pilots==1) { - j=0; - - if (skip_half==1) { - if (frame_parms->Ncp==0){ - for (i=0; i<6; i++) { - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ - rxF_ext[j]=rxF[i]; - dl_ch0_ext[j++]=dl_ch0[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - dl_ch0_ext+=6-(uespec_nushift+uespec_poffset<6)-(uespec_nushift+uespec_poffset+4<6)-((uespec_nushift+uespec_poffset+8)%12<6); - rxF_ext+=6-(uespec_nushift+uespec_poffset<6)-(uespec_nushift+uespec_poffset+4<6)-((uespec_nushift+uespec_poffset+8)%12<6); - - } else{ - for (i=0; i<6; i++) { - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ - rxF_ext[j]=rxF[i]; - dl_ch0_ext[j++]=dl_ch0[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - dl_ch0_ext+=4; - rxF_ext+=4; - } - - } else if (skip_half==2) { - if(frame_parms->Ncp==0){ - for (i=0; i<6; i++) { - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ - rxF_ext[j]=rxF[i+6]; - dl_ch0_ext[j++]=dl_ch0[i+6]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - dl_ch0_ext+=6-(uespec_nushift+uespec_poffset>6)-(uespec_nushift+uespec_poffset+4>6)-((uespec_nushift+uespec_poffset+8)%12>6); - rxF_ext+=6-(uespec_nushift+uespec_poffset>6)-(uespec_nushift+uespec_poffset+4>6)-((uespec_nushift+uespec_poffset+8)%12>6); - - } else { - for (i=0; i<6; i++) { - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ - rxF_ext[j]=rxF[(i+6)]; - dl_ch0_ext[j++]=dl_ch0[i+6]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - dl_ch0_ext+=4; - rxF_ext+=4; - } - - } else { - for (i=0; i<12; i++){ - if (frame_parms->Ncp==0){ - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ - rxF_ext[j] = rxF[i]; - dl_ch0_ext[j++]=dl_ch0[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } else{ - if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ - rxF_ext[j] = rxF[i]; - dl_ch0_ext[j++]=dl_ch0[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); -#endif - } - } - } - - dl_ch0_ext+=9-frame_parms->Ncp; - rxF_ext+=9-frame_parms->Ncp; - - } - - }// pilots=0 - } - - dl_ch0+=12; - rxF+=12; - } - } - } - - _mm_empty(); - _m_empty(); - - return(nb_rb/frame_parms->nb_antennas_rx); -} - -//============================================================================================== - -void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,unsigned int *coded_bits_per_codeword,int round, unsigned char harq_pid) -{ - unsigned int nsymb = (ue->frame_parms.Ncp == 0) ? 14 : 12; - char fname[32],vname[32]; - int N_RB_DL=ue->frame_parms.N_RB_DL; - - sprintf(fname,"dlsch%d_rxF_r%d_ext0.m",eNB_id,round); - sprintf(vname,"dl%d_rxF_r%d_ext0",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb,1,1); - - if (ue->frame_parms.nb_antennas_rx >1) { - sprintf(fname,"dlsch%d_rxF_r%d_ext1.m",eNB_id,round); - sprintf(vname,"dl%d_rxF_r%d_ext1",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[1],12*N_RB_DL*nsymb,1,1); - } - - sprintf(fname,"dlsch%d_ch_r%d_ext00.m",eNB_id,round); - sprintf(vname,"dl%d_ch_r%d_ext00",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1); - - if (ue->transmission_mode[eNB_id]==7){ - sprintf(fname,"dlsch%d_bf_ch_r%d.m",eNB_id,round); - sprintf(vname,"dl%d_bf_ch_r%d",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_bf_ch_estimates[0],512*nsymb,1,1); - //write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_bf_ch_estimates[0],512,1,1); - - sprintf(fname,"dlsch%d_bf_ch_r%d_ext00.m",eNB_id,round); - sprintf(vname,"dl%d_bf_ch_r%d_ext00",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_bf_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1); - } - - if (ue->frame_parms.nb_antennas_rx == 2) { - sprintf(fname,"dlsch%d_ch_r%d_ext01.m",eNB_id,round); - sprintf(vname,"dl%d_ch_r%d_ext01",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1); - } - - if (ue->frame_parms.nb_antenna_ports_eNB == 2) { - sprintf(fname,"dlsch%d_ch_r%d_ext10.m",eNB_id,round); - sprintf(vname,"dl%d_ch_r%d_ext10",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1); - - if (ue->frame_parms.nb_antennas_rx == 2) { - sprintf(fname,"dlsch%d_ch_r%d_ext11.m",eNB_id,round); - sprintf(vname,"dl%d_ch_r%d_ext11",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1); - } - } - - sprintf(fname,"dlsch%d_rxF_r%d_uespec0.m",eNB_id,round); - sprintf(vname,"dl%d_rxF_r%d_uespec0",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_uespec_pilots[0],12*N_RB_DL,1,1); - - /* - write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1); - write_output("dlsch%d_ch_ext10.m","dl10_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1); - write_output("dlsch%d_ch_ext11.m","dl11_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1); - */ - sprintf(fname,"dlsch%d_r%d_rho.m",eNB_id,round); - sprintf(vname,"dl_rho_r%d_%d",eNB_id,round); - - write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_rho_ext[harq_pid][round][0],12*N_RB_DL*nsymb,1,1); - - sprintf(fname,"dlsch%d_r%d_rho2.m",eNB_id,round); - sprintf(vname,"dl_rho2_r%d_%d",eNB_id,round); - - write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_rho2_ext[0],12*N_RB_DL*nsymb,1,1); - - sprintf(fname,"dlsch%d_rxF_r%d_comp0.m",eNB_id,round); - sprintf(vname,"dl%d_rxF_r%d_comp0",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb,1,1); - if (ue->frame_parms.nb_antenna_ports_eNB == 2) { - sprintf(fname,"dlsch%d_rxF_r%d_comp1.m",eNB_id,round); - sprintf(vname,"dl%d_rxF_r%d_comp1",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp1[harq_pid][round][0],12*N_RB_DL*nsymb,1,1); - } - - sprintf(fname,"dlsch%d_rxF_r%d_llr.m",eNB_id,round); - sprintf(vname,"dl%d_r%d_llr",eNB_id,round); - write_output(fname,vname, ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->llr[0],coded_bits_per_codeword[0],1,0); - sprintf(fname,"dlsch%d_r%d_mag1.m",eNB_id,round); - sprintf(vname,"dl%d_r%d_mag1",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb,1,1); - sprintf(fname,"dlsch%d_r%d_mag2.m",eNB_id,round); - sprintf(vname,"dl%d_r%d_mag2",eNB_id,round); - write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb,1,1); - - // printf("log2_maxh = %d\n",ue->pdsch_vars[eNB_id]->log2_maxh); -} - -#ifdef DEBUG_DLSCH_DEMOD -/* -void print_bytes(char *s,__m128i *x) -{ - - char *tempb = (char *)x; - - printf("%s : %d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",s, - tempb[0],tempb[1],tempb[2],tempb[3],tempb[4],tempb[5],tempb[6],tempb[7], - tempb[8],tempb[9],tempb[10],tempb[11],tempb[12],tempb[13],tempb[14],tempb[15] - ); - -} - -void print_shorts(char *s,__m128i *x) -{ - - short *tempb = (short *)x; - printf("%s : %d,%d,%d,%d,%d,%d,%d,%d\n",s, - tempb[0],tempb[1],tempb[2],tempb[3],tempb[4],tempb[5],tempb[6],tempb[7]); - -} - -void print_shorts2(char *s,__m64 *x) -{ - - short *tempb = (short *)x; - printf("%s : %d,%d,%d,%d\n",s, - tempb[0],tempb[1],tempb[2],tempb[3]); - -} - -void print_ints(char *s,__m128i *x) -{ - - int *tempb = (int *)x; - printf("%s : %d,%d,%d,%d\n",s, - tempb[0],tempb[1],tempb[2],tempb[3]); - -}*/ -#endif diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c deleted file mode 100644 index 7682045ae1307ca6a10ee83ef071091f7e28528d..0000000000000000000000000000000000000000 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c +++ /dev/null @@ -1,8899 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file PHY/LTE_TRANSPORT/dlsch_llr_computation.c - * \brief Top-level routines for LLR computation of the PDSCH physical channel from 36-211, V8.6 2009-03 - * \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert, S. Wagner, X Jiang - * \date 2011 - * \version 0.1 - * \company Eurecom - * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,ankit.bhamri@eurecom.fr,sebastien.aubert@eurecom.fr, sebastian.wagner@eurecom.fr - * \note - * \warning - */ - -#include "PHY/defs.h" -#include "PHY/TOOLS/defs.h" -#include "PHY/extern.h" -#include "defs.h" -#include "extern.h" -#include "PHY/sse_intrin.h" - -//#define DEBUG_LLR_SIC - - -int16_t zeros[8] __attribute__ ((aligned(16))) = {0,0,0,0,0,0,0,0}; -int16_t ones[8] __attribute__ ((aligned(16))) = {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff}; -#if defined(__x86_64__) || defined(__i386__) -__m128i rho_rpi __attribute__ ((aligned(16))); -__m128i rho_rmi __attribute__ ((aligned(16))); -__m128i rho_rpi_1_1 __attribute__ ((aligned(16))); -__m128i rho_rpi_1_3 __attribute__ ((aligned(16))); -__m128i rho_rpi_1_5 __attribute__ ((aligned(16))); -__m128i rho_rpi_1_7 __attribute__ ((aligned(16))); -__m128i rho_rpi_3_1 __attribute__ ((aligned(16))); -__m128i rho_rpi_3_3 __attribute__ ((aligned(16))); -__m128i rho_rpi_3_5 __attribute__ ((aligned(16))); -__m128i rho_rpi_3_7 __attribute__ ((aligned(16))); -__m128i rho_rpi_5_1 __attribute__ ((aligned(16))); -__m128i rho_rpi_5_3 __attribute__ ((aligned(16))); -__m128i rho_rpi_5_5 __attribute__ ((aligned(16))); -__m128i rho_rpi_5_7 __attribute__ ((aligned(16))); -__m128i rho_rpi_7_1 __attribute__ ((aligned(16))); -__m128i rho_rpi_7_3 __attribute__ ((aligned(16))); -__m128i rho_rpi_7_5 __attribute__ ((aligned(16))); -__m128i rho_rpi_7_7 __attribute__ ((aligned(16))); -__m128i rho_rmi_1_1 __attribute__ ((aligned(16))); -__m128i rho_rmi_1_3 __attribute__ ((aligned(16))); -__m128i rho_rmi_1_5 __attribute__ ((aligned(16))); -__m128i rho_rmi_1_7 __attribute__ ((aligned(16))); -__m128i rho_rmi_3_1 __attribute__ ((aligned(16))); -__m128i rho_rmi_3_3 __attribute__ ((aligned(16))); -__m128i rho_rmi_3_5 __attribute__ ((aligned(16))); -__m128i rho_rmi_3_7 __attribute__ ((aligned(16))); -__m128i rho_rmi_5_1 __attribute__ ((aligned(16))); -__m128i rho_rmi_5_3 __attribute__ ((aligned(16))); -__m128i rho_rmi_5_5 __attribute__ ((aligned(16))); -__m128i rho_rmi_5_7 __attribute__ ((aligned(16))); -__m128i rho_rmi_7_1 __attribute__ ((aligned(16))); -__m128i rho_rmi_7_3 __attribute__ ((aligned(16))); -__m128i rho_rmi_7_5 __attribute__ ((aligned(16))); -__m128i rho_rmi_7_7 __attribute__ ((aligned(16))); - -__m128i psi_r_m7_m7 __attribute__ ((aligned(16))); -__m128i psi_r_m7_m5 __attribute__ ((aligned(16))); -__m128i psi_r_m7_m3 __attribute__ ((aligned(16))); -__m128i psi_r_m7_m1 __attribute__ ((aligned(16))); -__m128i psi_r_m7_p1 __attribute__ ((aligned(16))); -__m128i psi_r_m7_p3 __attribute__ ((aligned(16))); -__m128i psi_r_m7_p5 __attribute__ ((aligned(16))); -__m128i psi_r_m7_p7 __attribute__ ((aligned(16))); -__m128i psi_r_m5_m7 __attribute__ ((aligned(16))); -__m128i psi_r_m5_m5 __attribute__ ((aligned(16))); -__m128i psi_r_m5_m3 __attribute__ ((aligned(16))); -__m128i psi_r_m5_m1 __attribute__ ((aligned(16))); -__m128i psi_r_m5_p1 __attribute__ ((aligned(16))); -__m128i psi_r_m5_p3 __attribute__ ((aligned(16))); -__m128i psi_r_m5_p5 __attribute__ ((aligned(16))); -__m128i psi_r_m5_p7 __attribute__ ((aligned(16))); -__m128i psi_r_m3_m7 __attribute__ ((aligned(16))); -__m128i psi_r_m3_m5 __attribute__ ((aligned(16))); -__m128i psi_r_m3_m3 __attribute__ ((aligned(16))); -__m128i psi_r_m3_m1 __attribute__ ((aligned(16))); -__m128i psi_r_m3_p1 __attribute__ ((aligned(16))); -__m128i psi_r_m3_p3 __attribute__ ((aligned(16))); -__m128i psi_r_m3_p5 __attribute__ ((aligned(16))); -__m128i psi_r_m3_p7 __attribute__ ((aligned(16))); -__m128i psi_r_m1_m7 __attribute__ ((aligned(16))); -__m128i psi_r_m1_m5 __attribute__ ((aligned(16))); -__m128i psi_r_m1_m3 __attribute__ ((aligned(16))); -__m128i psi_r_m1_m1 __attribute__ ((aligned(16))); -__m128i psi_r_m1_p1 __attribute__ ((aligned(16))); -__m128i psi_r_m1_p3 __attribute__ ((aligned(16))); -__m128i psi_r_m1_p5 __attribute__ ((aligned(16))); -__m128i psi_r_m1_p7 __attribute__ ((aligned(16))); -__m128i psi_r_p1_m7 __attribute__ ((aligned(16))); -__m128i psi_r_p1_m5 __attribute__ ((aligned(16))); -__m128i psi_r_p1_m3 __attribute__ ((aligned(16))); -__m128i psi_r_p1_m1 __attribute__ ((aligned(16))); -__m128i psi_r_p1_p1 __attribute__ ((aligned(16))); -__m128i psi_r_p1_p3 __attribute__ ((aligned(16))); -__m128i psi_r_p1_p5 __attribute__ ((aligned(16))); -__m128i psi_r_p1_p7 __attribute__ ((aligned(16))); -__m128i psi_r_p3_m7 __attribute__ ((aligned(16))); -__m128i psi_r_p3_m5 __attribute__ ((aligned(16))); -__m128i psi_r_p3_m3 __attribute__ ((aligned(16))); -__m128i psi_r_p3_m1 __attribute__ ((aligned(16))); -__m128i psi_r_p3_p1 __attribute__ ((aligned(16))); -__m128i psi_r_p3_p3 __attribute__ ((aligned(16))); -__m128i psi_r_p3_p5 __attribute__ ((aligned(16))); -__m128i psi_r_p3_p7 __attribute__ ((aligned(16))); -__m128i psi_r_p5_m7 __attribute__ ((aligned(16))); -__m128i psi_r_p5_m5 __attribute__ ((aligned(16))); -__m128i psi_r_p5_m3 __attribute__ ((aligned(16))); -__m128i psi_r_p5_m1 __attribute__ ((aligned(16))); -__m128i psi_r_p5_p1 __attribute__ ((aligned(16))); -__m128i psi_r_p5_p3 __attribute__ ((aligned(16))); -__m128i psi_r_p5_p5 __attribute__ ((aligned(16))); -__m128i psi_r_p5_p7 __attribute__ ((aligned(16))); -__m128i psi_r_p7_m7 __attribute__ ((aligned(16))); -__m128i psi_r_p7_m5 __attribute__ ((aligned(16))); -__m128i psi_r_p7_m3 __attribute__ ((aligned(16))); -__m128i psi_r_p7_m1 __attribute__ ((aligned(16))); -__m128i psi_r_p7_p1 __attribute__ ((aligned(16))); -__m128i psi_r_p7_p3 __attribute__ ((aligned(16))); -__m128i psi_r_p7_p5 __attribute__ ((aligned(16))); -__m128i psi_r_p7_p7 __attribute__ ((aligned(16))); - -__m128i psi_i_m7_m7 __attribute__ ((aligned(16))); -__m128i psi_i_m7_m5 __attribute__ ((aligned(16))); -__m128i psi_i_m7_m3 __attribute__ ((aligned(16))); -__m128i psi_i_m7_m1 __attribute__ ((aligned(16))); -__m128i psi_i_m7_p1 __attribute__ ((aligned(16))); -__m128i psi_i_m7_p3 __attribute__ ((aligned(16))); -__m128i psi_i_m7_p5 __attribute__ ((aligned(16))); -__m128i psi_i_m7_p7 __attribute__ ((aligned(16))); -__m128i psi_i_m5_m7 __attribute__ ((aligned(16))); -__m128i psi_i_m5_m5 __attribute__ ((aligned(16))); -__m128i psi_i_m5_m3 __attribute__ ((aligned(16))); -__m128i psi_i_m5_m1 __attribute__ ((aligned(16))); -__m128i psi_i_m5_p1 __attribute__ ((aligned(16))); -__m128i psi_i_m5_p3 __attribute__ ((aligned(16))); -__m128i psi_i_m5_p5 __attribute__ ((aligned(16))); -__m128i psi_i_m5_p7 __attribute__ ((aligned(16))); -__m128i psi_i_m3_m7 __attribute__ ((aligned(16))); -__m128i psi_i_m3_m5 __attribute__ ((aligned(16))); -__m128i psi_i_m3_m3 __attribute__ ((aligned(16))); -__m128i psi_i_m3_m1 __attribute__ ((aligned(16))); -__m128i psi_i_m3_p1 __attribute__ ((aligned(16))); -__m128i psi_i_m3_p3 __attribute__ ((aligned(16))); -__m128i psi_i_m3_p5 __attribute__ ((aligned(16))); -__m128i psi_i_m3_p7 __attribute__ ((aligned(16))); -__m128i psi_i_m1_m7 __attribute__ ((aligned(16))); -__m128i psi_i_m1_m5 __attribute__ ((aligned(16))); -__m128i psi_i_m1_m3 __attribute__ ((aligned(16))); -__m128i psi_i_m1_m1 __attribute__ ((aligned(16))); -__m128i psi_i_m1_p1 __attribute__ ((aligned(16))); -__m128i psi_i_m1_p3 __attribute__ ((aligned(16))); -__m128i psi_i_m1_p5 __attribute__ ((aligned(16))); -__m128i psi_i_m1_p7 __attribute__ ((aligned(16))); -__m128i psi_i_p1_m7 __attribute__ ((aligned(16))); -__m128i psi_i_p1_m5 __attribute__ ((aligned(16))); -__m128i psi_i_p1_m3 __attribute__ ((aligned(16))); -__m128i psi_i_p1_m1 __attribute__ ((aligned(16))); -__m128i psi_i_p1_p1 __attribute__ ((aligned(16))); -__m128i psi_i_p1_p3 __attribute__ ((aligned(16))); -__m128i psi_i_p1_p5 __attribute__ ((aligned(16))); -__m128i psi_i_p1_p7 __attribute__ ((aligned(16))); -__m128i psi_i_p3_m7 __attribute__ ((aligned(16))); -__m128i psi_i_p3_m5 __attribute__ ((aligned(16))); -__m128i psi_i_p3_m3 __attribute__ ((aligned(16))); -__m128i psi_i_p3_m1 __attribute__ ((aligned(16))); -__m128i psi_i_p3_p1 __attribute__ ((aligned(16))); -__m128i psi_i_p3_p3 __attribute__ ((aligned(16))); -__m128i psi_i_p3_p5 __attribute__ ((aligned(16))); -__m128i psi_i_p3_p7 __attribute__ ((aligned(16))); -__m128i psi_i_p5_m7 __attribute__ ((aligned(16))); -__m128i psi_i_p5_m5 __attribute__ ((aligned(16))); -__m128i psi_i_p5_m3 __attribute__ ((aligned(16))); -__m128i psi_i_p5_m1 __attribute__ ((aligned(16))); -__m128i psi_i_p5_p1 __attribute__ ((aligned(16))); -__m128i psi_i_p5_p3 __attribute__ ((aligned(16))); -__m128i psi_i_p5_p5 __attribute__ ((aligned(16))); -__m128i psi_i_p5_p7 __attribute__ ((aligned(16))); -__m128i psi_i_p7_m7 __attribute__ ((aligned(16))); -__m128i psi_i_p7_m5 __attribute__ ((aligned(16))); -__m128i psi_i_p7_m3 __attribute__ ((aligned(16))); -__m128i psi_i_p7_m1 __attribute__ ((aligned(16))); -__m128i psi_i_p7_p1 __attribute__ ((aligned(16))); -__m128i psi_i_p7_p3 __attribute__ ((aligned(16))); -__m128i psi_i_p7_p5 __attribute__ ((aligned(16))); -__m128i psi_i_p7_p7 __attribute__ ((aligned(16))); - -__m128i a_r_m7_m7 __attribute__ ((aligned(16))); -__m128i a_r_m7_m5 __attribute__ ((aligned(16))); -__m128i a_r_m7_m3 __attribute__ ((aligned(16))); -__m128i a_r_m7_m1 __attribute__ ((aligned(16))); -__m128i a_r_m7_p1 __attribute__ ((aligned(16))); -__m128i a_r_m7_p3 __attribute__ ((aligned(16))); -__m128i a_r_m7_p5 __attribute__ ((aligned(16))); -__m128i a_r_m7_p7 __attribute__ ((aligned(16))); -__m128i a_r_m5_m7 __attribute__ ((aligned(16))); -__m128i a_r_m5_m5 __attribute__ ((aligned(16))); -__m128i a_r_m5_m3 __attribute__ ((aligned(16))); -__m128i a_r_m5_m1 __attribute__ ((aligned(16))); -__m128i a_r_m5_p1 __attribute__ ((aligned(16))); -__m128i a_r_m5_p3 __attribute__ ((aligned(16))); -__m128i a_r_m5_p5 __attribute__ ((aligned(16))); -__m128i a_r_m5_p7 __attribute__ ((aligned(16))); -__m128i a_r_m3_m7 __attribute__ ((aligned(16))); -__m128i a_r_m3_m5 __attribute__ ((aligned(16))); -__m128i a_r_m3_m3 __attribute__ ((aligned(16))); -__m128i a_r_m3_m1 __attribute__ ((aligned(16))); -__m128i a_r_m3_p1 __attribute__ ((aligned(16))); -__m128i a_r_m3_p3 __attribute__ ((aligned(16))); -__m128i a_r_m3_p5 __attribute__ ((aligned(16))); -__m128i a_r_m3_p7 __attribute__ ((aligned(16))); -__m128i a_r_m1_m7 __attribute__ ((aligned(16))); -__m128i a_r_m1_m5 __attribute__ ((aligned(16))); -__m128i a_r_m1_m3 __attribute__ ((aligned(16))); -__m128i a_r_m1_m1 __attribute__ ((aligned(16))); -__m128i a_r_m1_p1 __attribute__ ((aligned(16))); -__m128i a_r_m1_p3 __attribute__ ((aligned(16))); -__m128i a_r_m1_p5 __attribute__ ((aligned(16))); -__m128i a_r_m1_p7 __attribute__ ((aligned(16))); -__m128i a_r_p1_m7 __attribute__ ((aligned(16))); -__m128i a_r_p1_m5 __attribute__ ((aligned(16))); -__m128i a_r_p1_m3 __attribute__ ((aligned(16))); -__m128i a_r_p1_m1 __attribute__ ((aligned(16))); -__m128i a_r_p1_p1 __attribute__ ((aligned(16))); -__m128i a_r_p1_p3 __attribute__ ((aligned(16))); -__m128i a_r_p1_p5 __attribute__ ((aligned(16))); -__m128i a_r_p1_p7 __attribute__ ((aligned(16))); -__m128i a_r_p3_m7 __attribute__ ((aligned(16))); -__m128i a_r_p3_m5 __attribute__ ((aligned(16))); -__m128i a_r_p3_m3 __attribute__ ((aligned(16))); -__m128i a_r_p3_m1 __attribute__ ((aligned(16))); -__m128i a_r_p3_p1 __attribute__ ((aligned(16))); -__m128i a_r_p3_p3 __attribute__ ((aligned(16))); -__m128i a_r_p3_p5 __attribute__ ((aligned(16))); -__m128i a_r_p3_p7 __attribute__ ((aligned(16))); -__m128i a_r_p5_m7 __attribute__ ((aligned(16))); -__m128i a_r_p5_m5 __attribute__ ((aligned(16))); -__m128i a_r_p5_m3 __attribute__ ((aligned(16))); -__m128i a_r_p5_m1 __attribute__ ((aligned(16))); -__m128i a_r_p5_p1 __attribute__ ((aligned(16))); -__m128i a_r_p5_p3 __attribute__ ((aligned(16))); -__m128i a_r_p5_p5 __attribute__ ((aligned(16))); -__m128i a_r_p5_p7 __attribute__ ((aligned(16))); -__m128i a_r_p7_m7 __attribute__ ((aligned(16))); -__m128i a_r_p7_m5 __attribute__ ((aligned(16))); -__m128i a_r_p7_m3 __attribute__ ((aligned(16))); -__m128i a_r_p7_m1 __attribute__ ((aligned(16))); -__m128i a_r_p7_p1 __attribute__ ((aligned(16))); -__m128i a_r_p7_p3 __attribute__ ((aligned(16))); -__m128i a_r_p7_p5 __attribute__ ((aligned(16))); -__m128i a_r_p7_p7 __attribute__ ((aligned(16))); - -__m128i a_i_m7_m7 __attribute__ ((aligned(16))); -__m128i a_i_m7_m5 __attribute__ ((aligned(16))); -__m128i a_i_m7_m3 __attribute__ ((aligned(16))); -__m128i a_i_m7_m1 __attribute__ ((aligned(16))); -__m128i a_i_m7_p1 __attribute__ ((aligned(16))); -__m128i a_i_m7_p3 __attribute__ ((aligned(16))); -__m128i a_i_m7_p5 __attribute__ ((aligned(16))); -__m128i a_i_m7_p7 __attribute__ ((aligned(16))); -__m128i a_i_m5_m7 __attribute__ ((aligned(16))); -__m128i a_i_m5_m5 __attribute__ ((aligned(16))); -__m128i a_i_m5_m3 __attribute__ ((aligned(16))); -__m128i a_i_m5_m1 __attribute__ ((aligned(16))); -__m128i a_i_m5_p1 __attribute__ ((aligned(16))); -__m128i a_i_m5_p3 __attribute__ ((aligned(16))); -__m128i a_i_m5_p5 __attribute__ ((aligned(16))); -__m128i a_i_m5_p7 __attribute__ ((aligned(16))); -__m128i a_i_m3_m7 __attribute__ ((aligned(16))); -__m128i a_i_m3_m5 __attribute__ ((aligned(16))); -__m128i a_i_m3_m3 __attribute__ ((aligned(16))); -__m128i a_i_m3_m1 __attribute__ ((aligned(16))); -__m128i a_i_m3_p1 __attribute__ ((aligned(16))); -__m128i a_i_m3_p3 __attribute__ ((aligned(16))); -__m128i a_i_m3_p5 __attribute__ ((aligned(16))); -__m128i a_i_m3_p7 __attribute__ ((aligned(16))); -__m128i a_i_m1_m7 __attribute__ ((aligned(16))); -__m128i a_i_m1_m5 __attribute__ ((aligned(16))); -__m128i a_i_m1_m3 __attribute__ ((aligned(16))); -__m128i a_i_m1_m1 __attribute__ ((aligned(16))); -__m128i a_i_m1_p1 __attribute__ ((aligned(16))); -__m128i a_i_m1_p3 __attribute__ ((aligned(16))); -__m128i a_i_m1_p5 __attribute__ ((aligned(16))); -__m128i a_i_m1_p7 __attribute__ ((aligned(16))); -__m128i a_i_p1_m7 __attribute__ ((aligned(16))); -__m128i a_i_p1_m5 __attribute__ ((aligned(16))); -__m128i a_i_p1_m3 __attribute__ ((aligned(16))); -__m128i a_i_p1_m1 __attribute__ ((aligned(16))); -__m128i a_i_p1_p1 __attribute__ ((aligned(16))); -__m128i a_i_p1_p3 __attribute__ ((aligned(16))); -__m128i a_i_p1_p5 __attribute__ ((aligned(16))); -__m128i a_i_p1_p7 __attribute__ ((aligned(16))); -__m128i a_i_p3_m7 __attribute__ ((aligned(16))); -__m128i a_i_p3_m5 __attribute__ ((aligned(16))); -__m128i a_i_p3_m3 __attribute__ ((aligned(16))); -__m128i a_i_p3_m1 __attribute__ ((aligned(16))); -__m128i a_i_p3_p1 __attribute__ ((aligned(16))); -__m128i a_i_p3_p3 __attribute__ ((aligned(16))); -__m128i a_i_p3_p5 __attribute__ ((aligned(16))); -__m128i a_i_p3_p7 __attribute__ ((aligned(16))); -__m128i a_i_p5_m7 __attribute__ ((aligned(16))); -__m128i a_i_p5_m5 __attribute__ ((aligned(16))); -__m128i a_i_p5_m3 __attribute__ ((aligned(16))); -__m128i a_i_p5_m1 __attribute__ ((aligned(16))); -__m128i a_i_p5_p1 __attribute__ ((aligned(16))); -__m128i a_i_p5_p3 __attribute__ ((aligned(16))); -__m128i a_i_p5_p5 __attribute__ ((aligned(16))); -__m128i a_i_p5_p7 __attribute__ ((aligned(16))); -__m128i a_i_p7_m7 __attribute__ ((aligned(16))); -__m128i a_i_p7_m5 __attribute__ ((aligned(16))); -__m128i a_i_p7_m3 __attribute__ ((aligned(16))); -__m128i a_i_p7_m1 __attribute__ ((aligned(16))); -__m128i a_i_p7_p1 __attribute__ ((aligned(16))); -__m128i a_i_p7_p3 __attribute__ ((aligned(16))); -__m128i a_i_p7_p5 __attribute__ ((aligned(16))); -__m128i a_i_p7_p7 __attribute__ ((aligned(16))); - -__m128i psi_a_m7_m7 __attribute__ ((aligned(16))); -__m128i psi_a_m7_m5 __attribute__ ((aligned(16))); -__m128i psi_a_m7_m3 __attribute__ ((aligned(16))); -__m128i psi_a_m7_m1 __attribute__ ((aligned(16))); -__m128i psi_a_m7_p1 __attribute__ ((aligned(16))); -__m128i psi_a_m7_p3 __attribute__ ((aligned(16))); -__m128i psi_a_m7_p5 __attribute__ ((aligned(16))); -__m128i psi_a_m7_p7 __attribute__ ((aligned(16))); -__m128i psi_a_m5_m7 __attribute__ ((aligned(16))); -__m128i psi_a_m5_m5 __attribute__ ((aligned(16))); -__m128i psi_a_m5_m3 __attribute__ ((aligned(16))); -__m128i psi_a_m5_m1 __attribute__ ((aligned(16))); -__m128i psi_a_m5_p1 __attribute__ ((aligned(16))); -__m128i psi_a_m5_p3 __attribute__ ((aligned(16))); -__m128i psi_a_m5_p5 __attribute__ ((aligned(16))); -__m128i psi_a_m5_p7 __attribute__ ((aligned(16))); -__m128i psi_a_m3_m7 __attribute__ ((aligned(16))); -__m128i psi_a_m3_m5 __attribute__ ((aligned(16))); -__m128i psi_a_m3_m3 __attribute__ ((aligned(16))); -__m128i psi_a_m3_m1 __attribute__ ((aligned(16))); -__m128i psi_a_m3_p1 __attribute__ ((aligned(16))); -__m128i psi_a_m3_p3 __attribute__ ((aligned(16))); -__m128i psi_a_m3_p5 __attribute__ ((aligned(16))); -__m128i psi_a_m3_p7 __attribute__ ((aligned(16))); -__m128i psi_a_m1_m7 __attribute__ ((aligned(16))); -__m128i psi_a_m1_m5 __attribute__ ((aligned(16))); -__m128i psi_a_m1_m3 __attribute__ ((aligned(16))); -__m128i psi_a_m1_m1 __attribute__ ((aligned(16))); -__m128i psi_a_m1_p1 __attribute__ ((aligned(16))); -__m128i psi_a_m1_p3 __attribute__ ((aligned(16))); -__m128i psi_a_m1_p5 __attribute__ ((aligned(16))); -__m128i psi_a_m1_p7 __attribute__ ((aligned(16))); -__m128i psi_a_p1_m7 __attribute__ ((aligned(16))); -__m128i psi_a_p1_m5 __attribute__ ((aligned(16))); -__m128i psi_a_p1_m3 __attribute__ ((aligned(16))); -__m128i psi_a_p1_m1 __attribute__ ((aligned(16))); -__m128i psi_a_p1_p1 __attribute__ ((aligned(16))); -__m128i psi_a_p1_p3 __attribute__ ((aligned(16))); -__m128i psi_a_p1_p5 __attribute__ ((aligned(16))); -__m128i psi_a_p1_p7 __attribute__ ((aligned(16))); -__m128i psi_a_p3_m7 __attribute__ ((aligned(16))); -__m128i psi_a_p3_m5 __attribute__ ((aligned(16))); -__m128i psi_a_p3_m3 __attribute__ ((aligned(16))); -__m128i psi_a_p3_m1 __attribute__ ((aligned(16))); -__m128i psi_a_p3_p1 __attribute__ ((aligned(16))); -__m128i psi_a_p3_p3 __attribute__ ((aligned(16))); -__m128i psi_a_p3_p5 __attribute__ ((aligned(16))); -__m128i psi_a_p3_p7 __attribute__ ((aligned(16))); -__m128i psi_a_p5_m7 __attribute__ ((aligned(16))); -__m128i psi_a_p5_m5 __attribute__ ((aligned(16))); -__m128i psi_a_p5_m3 __attribute__ ((aligned(16))); -__m128i psi_a_p5_m1 __attribute__ ((aligned(16))); -__m128i psi_a_p5_p1 __attribute__ ((aligned(16))); -__m128i psi_a_p5_p3 __attribute__ ((aligned(16))); -__m128i psi_a_p5_p5 __attribute__ ((aligned(16))); -__m128i psi_a_p5_p7 __attribute__ ((aligned(16))); -__m128i psi_a_p7_m7 __attribute__ ((aligned(16))); -__m128i psi_a_p7_m5 __attribute__ ((aligned(16))); -__m128i psi_a_p7_m3 __attribute__ ((aligned(16))); -__m128i psi_a_p7_m1 __attribute__ ((aligned(16))); -__m128i psi_a_p7_p1 __attribute__ ((aligned(16))); -__m128i psi_a_p7_p3 __attribute__ ((aligned(16))); -__m128i psi_a_p7_p5 __attribute__ ((aligned(16))); -__m128i psi_a_p7_p7 __attribute__ ((aligned(16))); - -__m128i a_sq_m7_m7 __attribute__ ((aligned(16))); -__m128i a_sq_m7_m5 __attribute__ ((aligned(16))); -__m128i a_sq_m7_m3 __attribute__ ((aligned(16))); -__m128i a_sq_m7_m1 __attribute__ ((aligned(16))); -__m128i a_sq_m7_p1 __attribute__ ((aligned(16))); -__m128i a_sq_m7_p3 __attribute__ ((aligned(16))); -__m128i a_sq_m7_p5 __attribute__ ((aligned(16))); -__m128i a_sq_m7_p7 __attribute__ ((aligned(16))); -__m128i a_sq_m5_m7 __attribute__ ((aligned(16))); -__m128i a_sq_m5_m5 __attribute__ ((aligned(16))); -__m128i a_sq_m5_m3 __attribute__ ((aligned(16))); -__m128i a_sq_m5_m1 __attribute__ ((aligned(16))); -__m128i a_sq_m5_p1 __attribute__ ((aligned(16))); -__m128i a_sq_m5_p3 __attribute__ ((aligned(16))); -__m128i a_sq_m5_p5 __attribute__ ((aligned(16))); -__m128i a_sq_m5_p7 __attribute__ ((aligned(16))); -__m128i a_sq_m3_m7 __attribute__ ((aligned(16))); -__m128i a_sq_m3_m5 __attribute__ ((aligned(16))); -__m128i a_sq_m3_m3 __attribute__ ((aligned(16))); -__m128i a_sq_m3_m1 __attribute__ ((aligned(16))); -__m128i a_sq_m3_p1 __attribute__ ((aligned(16))); -__m128i a_sq_m3_p3 __attribute__ ((aligned(16))); -__m128i a_sq_m3_p5 __attribute__ ((aligned(16))); -__m128i a_sq_m3_p7 __attribute__ ((aligned(16))); -__m128i a_sq_m1_m7 __attribute__ ((aligned(16))); -__m128i a_sq_m1_m5 __attribute__ ((aligned(16))); -__m128i a_sq_m1_m3 __attribute__ ((aligned(16))); -__m128i a_sq_m1_m1 __attribute__ ((aligned(16))); -__m128i a_sq_m1_p1 __attribute__ ((aligned(16))); -__m128i a_sq_m1_p3 __attribute__ ((aligned(16))); -__m128i a_sq_m1_p5 __attribute__ ((aligned(16))); -__m128i a_sq_m1_p7 __attribute__ ((aligned(16))); -__m128i a_sq_p1_m7 __attribute__ ((aligned(16))); -__m128i a_sq_p1_m5 __attribute__ ((aligned(16))); -__m128i a_sq_p1_m3 __attribute__ ((aligned(16))); -__m128i a_sq_p1_m1 __attribute__ ((aligned(16))); -__m128i a_sq_p1_p1 __attribute__ ((aligned(16))); -__m128i a_sq_p1_p3 __attribute__ ((aligned(16))); -__m128i a_sq_p1_p5 __attribute__ ((aligned(16))); -__m128i a_sq_p1_p7 __attribute__ ((aligned(16))); -__m128i a_sq_p3_m7 __attribute__ ((aligned(16))); -__m128i a_sq_p3_m5 __attribute__ ((aligned(16))); -__m128i a_sq_p3_m3 __attribute__ ((aligned(16))); -__m128i a_sq_p3_m1 __attribute__ ((aligned(16))); -__m128i a_sq_p3_p1 __attribute__ ((aligned(16))); -__m128i a_sq_p3_p3 __attribute__ ((aligned(16))); -__m128i a_sq_p3_p5 __attribute__ ((aligned(16))); -__m128i a_sq_p3_p7 __attribute__ ((aligned(16))); -__m128i a_sq_p5_m7 __attribute__ ((aligned(16))); -__m128i a_sq_p5_m5 __attribute__ ((aligned(16))); -__m128i a_sq_p5_m3 __attribute__ ((aligned(16))); -__m128i a_sq_p5_m1 __attribute__ ((aligned(16))); -__m128i a_sq_p5_p1 __attribute__ ((aligned(16))); -__m128i a_sq_p5_p3 __attribute__ ((aligned(16))); -__m128i a_sq_p5_p5 __attribute__ ((aligned(16))); -__m128i a_sq_p5_p7 __attribute__ ((aligned(16))); -__m128i a_sq_p7_m7 __attribute__ ((aligned(16))); -__m128i a_sq_p7_m5 __attribute__ ((aligned(16))); -__m128i a_sq_p7_m3 __attribute__ ((aligned(16))); -__m128i a_sq_p7_m1 __attribute__ ((aligned(16))); -__m128i a_sq_p7_p1 __attribute__ ((aligned(16))); -__m128i a_sq_p7_p3 __attribute__ ((aligned(16))); -__m128i a_sq_p7_p5 __attribute__ ((aligned(16))); -__m128i a_sq_p7_p7 __attribute__ ((aligned(16))); - -__m128i bit_met_m7_m7 __attribute__ ((aligned(16))); -__m128i bit_met_m7_m5 __attribute__ ((aligned(16))); -__m128i bit_met_m7_m3 __attribute__ ((aligned(16))); -__m128i bit_met_m7_m1 __attribute__ ((aligned(16))); -__m128i bit_met_m7_p1 __attribute__ ((aligned(16))); -__m128i bit_met_m7_p3 __attribute__ ((aligned(16))); -__m128i bit_met_m7_p5 __attribute__ ((aligned(16))); -__m128i bit_met_m7_p7 __attribute__ ((aligned(16))); -__m128i bit_met_m5_m7 __attribute__ ((aligned(16))); -__m128i bit_met_m5_m5 __attribute__ ((aligned(16))); -__m128i bit_met_m5_m3 __attribute__ ((aligned(16))); -__m128i bit_met_m5_m1 __attribute__ ((aligned(16))); -__m128i bit_met_m5_p1 __attribute__ ((aligned(16))); -__m128i bit_met_m5_p3 __attribute__ ((aligned(16))); -__m128i bit_met_m5_p5 __attribute__ ((aligned(16))); -__m128i bit_met_m5_p7 __attribute__ ((aligned(16))); -__m128i bit_met_m3_m7 __attribute__ ((aligned(16))); -__m128i bit_met_m3_m5 __attribute__ ((aligned(16))); -__m128i bit_met_m3_m3 __attribute__ ((aligned(16))); -__m128i bit_met_m3_m1 __attribute__ ((aligned(16))); -__m128i bit_met_m3_p1 __attribute__ ((aligned(16))); -__m128i bit_met_m3_p3 __attribute__ ((aligned(16))); -__m128i bit_met_m3_p5 __attribute__ ((aligned(16))); -__m128i bit_met_m3_p7 __attribute__ ((aligned(16))); -__m128i bit_met_m1_m7 __attribute__ ((aligned(16))); -__m128i bit_met_m1_m5 __attribute__ ((aligned(16))); -__m128i bit_met_m1_m3 __attribute__ ((aligned(16))); -__m128i bit_met_m1_m1 __attribute__ ((aligned(16))); -__m128i bit_met_m1_p1 __attribute__ ((aligned(16))); -__m128i bit_met_m1_p3 __attribute__ ((aligned(16))); -__m128i bit_met_m1_p5 __attribute__ ((aligned(16))); -__m128i bit_met_m1_p7 __attribute__ ((aligned(16))); -__m128i bit_met_p1_m7 __attribute__ ((aligned(16))); -__m128i bit_met_p1_m5 __attribute__ ((aligned(16))); -__m128i bit_met_p1_m3 __attribute__ ((aligned(16))); -__m128i bit_met_p1_m1 __attribute__ ((aligned(16))); -__m128i bit_met_p1_p1 __attribute__ ((aligned(16))); -__m128i bit_met_p1_p3 __attribute__ ((aligned(16))); -__m128i bit_met_p1_p5 __attribute__ ((aligned(16))); -__m128i bit_met_p1_p7 __attribute__ ((aligned(16))); -__m128i bit_met_p3_m7 __attribute__ ((aligned(16))); -__m128i bit_met_p3_m5 __attribute__ ((aligned(16))); -__m128i bit_met_p3_m3 __attribute__ ((aligned(16))); -__m128i bit_met_p3_m1 __attribute__ ((aligned(16))); -__m128i bit_met_p3_p1 __attribute__ ((aligned(16))); -__m128i bit_met_p3_p3 __attribute__ ((aligned(16))); -__m128i bit_met_p3_p5 __attribute__ ((aligned(16))); -__m128i bit_met_p3_p7 __attribute__ ((aligned(16))); -__m128i bit_met_p5_m7 __attribute__ ((aligned(16))); -__m128i bit_met_p5_m5 __attribute__ ((aligned(16))); -__m128i bit_met_p5_m3 __attribute__ ((aligned(16))); -__m128i bit_met_p5_m1 __attribute__ ((aligned(16))); -__m128i bit_met_p5_p1 __attribute__ ((aligned(16))); -__m128i bit_met_p5_p3 __attribute__ ((aligned(16))); -__m128i bit_met_p5_p5 __attribute__ ((aligned(16))); -__m128i bit_met_p5_p7 __attribute__ ((aligned(16))); -__m128i bit_met_p7_m7 __attribute__ ((aligned(16))); -__m128i bit_met_p7_m5 __attribute__ ((aligned(16))); -__m128i bit_met_p7_m3 __attribute__ ((aligned(16))); -__m128i bit_met_p7_m1 __attribute__ ((aligned(16))); -__m128i bit_met_p7_p1 __attribute__ ((aligned(16))); -__m128i bit_met_p7_p3 __attribute__ ((aligned(16))); -__m128i bit_met_p7_p5 __attribute__ ((aligned(16))); -__m128i bit_met_p7_p7 __attribute__ ((aligned(16))); - -__m128i y0_p_1_1 __attribute__ ((aligned(16))); -__m128i y0_p_1_3 __attribute__ ((aligned(16))); -__m128i y0_p_1_5 __attribute__ ((aligned(16))); -__m128i y0_p_1_7 __attribute__ ((aligned(16))); -__m128i y0_p_3_1 __attribute__ ((aligned(16))); -__m128i y0_p_3_3 __attribute__ ((aligned(16))); -__m128i y0_p_3_5 __attribute__ ((aligned(16))); -__m128i y0_p_3_7 __attribute__ ((aligned(16))); -__m128i y0_p_5_1 __attribute__ ((aligned(16))); -__m128i y0_p_5_3 __attribute__ ((aligned(16))); -__m128i y0_p_5_5 __attribute__ ((aligned(16))); -__m128i y0_p_5_7 __attribute__ ((aligned(16))); -__m128i y0_p_7_1 __attribute__ ((aligned(16))); -__m128i y0_p_7_3 __attribute__ ((aligned(16))); -__m128i y0_p_7_5 __attribute__ ((aligned(16))); -__m128i y0_p_7_7 __attribute__ ((aligned(16))); -__m128i y0_m_1_1 __attribute__ ((aligned(16))); -__m128i y0_m_1_3 __attribute__ ((aligned(16))); -__m128i y0_m_1_5 __attribute__ ((aligned(16))); -__m128i y0_m_1_7 __attribute__ ((aligned(16))); -__m128i y0_m_3_1 __attribute__ ((aligned(16))); -__m128i y0_m_3_3 __attribute__ ((aligned(16))); -__m128i y0_m_3_5 __attribute__ ((aligned(16))); -__m128i y0_m_3_7 __attribute__ ((aligned(16))); -__m128i y0_m_5_1 __attribute__ ((aligned(16))); -__m128i y0_m_5_3 __attribute__ ((aligned(16))); -__m128i y0_m_5_5 __attribute__ ((aligned(16))); -__m128i y0_m_5_7 __attribute__ ((aligned(16))); -__m128i y0_m_7_1 __attribute__ ((aligned(16))); -__m128i y0_m_7_3 __attribute__ ((aligned(16))); -__m128i y0_m_7_5 __attribute__ ((aligned(16))); -__m128i y0_m_7_7 __attribute__ ((aligned(16))); - -__m128i xmm0 __attribute__ ((aligned(16))); -__m128i xmm1 __attribute__ ((aligned(16))); -__m128i xmm2 __attribute__ ((aligned(16))); -__m128i xmm3 __attribute__ ((aligned(16))); -__m128i xmm4 __attribute__ ((aligned(16))); -__m128i xmm5 __attribute__ ((aligned(16))); -__m128i xmm6 __attribute__ ((aligned(16))); -__m128i xmm7 __attribute__ ((aligned(16))); -__m128i xmm8 __attribute__ ((aligned(16))); - -__m128i y0r __attribute__ ((aligned(16))); -__m128i y0i __attribute__ ((aligned(16))); -__m128i y1r __attribute__ ((aligned(16))); -__m128i y1i __attribute__ ((aligned(16))); -__m128i y2r __attribute__ ((aligned(16))); -__m128i y2i __attribute__ ((aligned(16))); - -__m128i logmax_num_re0 __attribute__ ((aligned(16))); -__m128i logmax_num_im0 __attribute__ ((aligned(16))); -__m128i logmax_den_re0 __attribute__ ((aligned(16))); -__m128i logmax_den_im0 __attribute__ ((aligned(16))); -__m128i logmax_num_re1 __attribute__ ((aligned(16))); -__m128i logmax_num_im1 __attribute__ ((aligned(16))); -__m128i logmax_den_re1 __attribute__ ((aligned(16))); -__m128i logmax_den_im1 __attribute__ ((aligned(16))); - -__m128i tmp_result __attribute__ ((aligned(16))); -__m128i tmp_result2 __attribute__ ((aligned(16))); -__m128i tmp_result3 __attribute__ ((aligned(16))); -__m128i tmp_result4 __attribute__ ((aligned(16))); - - -//============================================================================================== -// Auxiliary Makros - -// calculates psi_a = psi_r*a_r + psi_i*a_i -#define prodsum_psi_a_epi16(psi_r,a_r,psi_i,a_i,psi_a) tmp_result = _mm_mulhi_epi16(psi_r,a_r); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result2 = _mm_mulhi_epi16(psi_i,a_i); tmp_result2 = _mm_slli_epi16(tmp_result2,1); psi_a = _mm_adds_epi16(tmp_result,tmp_result2); - -// calculate interference magnitude -#define interference_abs_epi16(psi,int_ch_mag,int_mag,c1,c2) tmp_result = _mm_cmplt_epi16(psi,int_ch_mag); tmp_result2 = _mm_xor_si128(tmp_result,(*(__m128i*)&ones[0])); tmp_result = _mm_and_si128(tmp_result,c1); tmp_result2 = _mm_and_si128(tmp_result2,c2); int_mag = _mm_or_si128(tmp_result,tmp_result2); - -// calculate interference magnitude -// tmp_result = ones in shorts corr. to interval 2<=x<=4, tmp_result2 interval < 2, tmp_result3 interval 4<x<6 and tmp_result4 interval x>6 -#define interference_abs_64qam_epi16(psi,int_ch_mag,int_two_ch_mag,int_three_ch_mag,a,c1,c3,c5,c7) tmp_result = _mm_cmplt_epi16(psi,int_two_ch_mag); tmp_result3 = _mm_xor_si128(tmp_result,(*(__m128i*)&ones[0])); tmp_result2 = _mm_cmplt_epi16(psi,int_ch_mag); tmp_result = _mm_xor_si128(tmp_result,tmp_result2); tmp_result4 = _mm_cmpgt_epi16(psi,int_three_ch_mag); tmp_result3 = _mm_xor_si128(tmp_result3,tmp_result4); tmp_result = _mm_and_si128(tmp_result,c3); tmp_result2 = _mm_and_si128(tmp_result2,c1); tmp_result3 = _mm_and_si128(tmp_result3,c5); tmp_result4 = _mm_and_si128(tmp_result4,c7); tmp_result = _mm_or_si128(tmp_result,tmp_result2); tmp_result3 = _mm_or_si128(tmp_result3,tmp_result4); a = _mm_or_si128(tmp_result,tmp_result3); - -// calculates a_sq = int_ch_mag*(a_r^2 + a_i^2)*scale_factor -#define square_a_epi16(a_r,a_i,int_ch_mag,scale_factor,a_sq) tmp_result = _mm_mulhi_epi16(a_r,a_r); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result = _mm_mulhi_epi16(tmp_result,scale_factor); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result = _mm_mulhi_epi16(tmp_result,int_ch_mag); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result2 = _mm_mulhi_epi16(a_i,a_i); tmp_result2 = _mm_slli_epi16(tmp_result2,1); tmp_result2 = _mm_mulhi_epi16(tmp_result2,scale_factor); tmp_result2 = _mm_slli_epi16(tmp_result2,1); tmp_result2 = _mm_mulhi_epi16(tmp_result2,int_ch_mag); tmp_result2 = _mm_slli_epi16(tmp_result2,1); a_sq = _mm_adds_epi16(tmp_result,tmp_result2); - -// calculates a_sq = int_ch_mag*(a_r^2 + a_i^2)*scale_factor for 64-QAM -#define square_a_64qam_epi16(a_r,a_i,int_ch_mag,scale_factor,a_sq) tmp_result = _mm_mulhi_epi16(a_r,a_r); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result = _mm_mulhi_epi16(tmp_result,scale_factor); tmp_result = _mm_slli_epi16(tmp_result,3); tmp_result = _mm_mulhi_epi16(tmp_result,int_ch_mag); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result2 = _mm_mulhi_epi16(a_i,a_i); tmp_result2 = _mm_slli_epi16(tmp_result2,1); tmp_result2 = _mm_mulhi_epi16(tmp_result2,scale_factor); tmp_result2 = _mm_slli_epi16(tmp_result2,3); tmp_result2 = _mm_mulhi_epi16(tmp_result2,int_ch_mag); tmp_result2 = _mm_slli_epi16(tmp_result2,1); a_sq = _mm_adds_epi16(tmp_result,tmp_result2); - -#elif defined(__arm__) - -#endif - -//============================================================================================== -// SINGLE-STREAM -//============================================================================================== - -//---------------------------------------------------------------------------------------------- -// QPSK -//---------------------------------------------------------------------------------------------- - -int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms, - int32_t **rxdataF_comp, - int16_t *dlsch_llr, - uint8_t symbol, - uint8_t first_symbol_flag, - uint16_t nb_rb, - uint16_t pbch_pss_sss_adjust, - uint8_t beamforming_mode) -{ - - uint32_t *rxF = (uint32_t*)&rxdataF_comp[0][((int32_t)symbol*frame_parms->N_RB_DL*12)]; - uint32_t *llr32; - int i,len; - uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; - - /* - if (first_symbol_flag==1) { - llr32 = (uint32_t*)dlsch_llr; - } else { - llr32 = (uint32_t*)(*llr32p); - }*/ - - llr32 = (uint32_t*)dlsch_llr; - if (!llr32) { - LOG_E(PHY,"dlsch_qpsk_llr: llr is null, symbol %d, llr32=%p\n",symbol, llr32); - return(-1); - } - - - if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { - if (frame_parms->nb_antenna_ports_eNB!=1) - len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); - else - len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); - } else if((beamforming_mode==7) && (frame_parms->Ncp==0) && (symbol==3 || symbol==6 || symbol==9 || symbol==12)){ - len = (nb_rb*9) - (3*pbch_pss_sss_adjust/4); - } else if((beamforming_mode==7) && (frame_parms->Ncp==1) && (symbol==4 || symbol==7 || symbol==10)){ - len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); - } else { - len = (nb_rb*12) - pbch_pss_sss_adjust; - } - - - /* - LOG_I(PHY,"dlsch_qpsk_llr: [symb %d / FirstSym %d / Length %d]: @LLR Buff %x, @LLR Buff(symb) %x \n", - symbol, - first_symbol_flag, - len, - dlsch_llr, - llr32); - */ - //printf("ll32p=%p , dlsch_llr=%p, symbol=%d, flag=%d \n", llr32, dlsch_llr, symbol, first_symbol_flag); - for (i=0; i<len; i++) { - *llr32 = *rxF; - //printf("llr %d : (%d,%d)\n",i,((int16_t*)llr32)[0],((int16_t*)llr32)[1]); - rxF++; - llr32++; - } - - //*llr32p = (int16_t *)llr32; - - return(0); -} - -int32_t dlsch_qpsk_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms, - int32_t **rxdataF_comp, - int32_t **sic_buffer, //Q15 - int32_t **rho_i, - short *dlsch_llr, - uint8_t num_pdcch_symbols, - uint16_t nb_rb, - uint8_t subframe, - uint16_t mod_order_0, - uint32_t rb_alloc) -{ - - int16_t rho_amp_x0[2*frame_parms->N_RB_DL*12]; - int16_t rho_rho_amp_x0[2*frame_parms->N_RB_DL*12]; - uint16_t amp_tmp; - uint16_t *llr16=(uint16_t*)dlsch_llr; - int i, len, nsymb; - uint8_t symbol, symbol_mod; - int len_acc=0; - uint16_t *sic_data; - uint16_t pbch_pss_sss_adjust; - - nsymb = (frame_parms->Ncp==0) ? 14:12; - - for (symbol=num_pdcch_symbols; symbol<nsymb; symbol++) { - uint16_t *rxF = (uint16_t*)(&rxdataF_comp[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]); - int16_t *rho_1=(int16_t*)(&rho_i[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]); - sic_data = (uint16_t*)&sic_buffer[0][((int16_t)len_acc)]; - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - - - - - if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) //pilots=1 - amp_tmp=0x1fff;//dlsch0->sqrt_rho_b; already taken into account - else //pilots=0 - amp_tmp=0x1fff;//1.5*dlsch0->sqrt_rho_a; already taken into account - - if (mod_order_0==6) - amp_tmp=amp_tmp<<1; // to compensate for >> 1 shift in modulation - - - pbch_pss_sss_adjust=adjust_G2(frame_parms,&rb_alloc,2,subframe,symbol); - - if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { - if (frame_parms->nb_antenna_ports_eNB!=1) - len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); - else - len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); - } else { - len = (nb_rb*12) - pbch_pss_sss_adjust; - } - - // printf("dlsch_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust); - - len_acc+=len; //accumulated length; this is done because in sic_buffer we have only data symbols - - multadd_complex_vector_real_scalar((int16_t *)sic_data, - amp_tmp, - (int16_t *)rho_amp_x0, //this is in Q13 - 1, - len); - - mult_cpx_vector((int16_t *)rho_1, //Q15 - (int16_t *)rho_amp_x0, //Q13 - (int16_t*)rho_rho_amp_x0, - len, - 13); - -#ifdef DEBUG_LLR_SIC - write_output("rho_for_multipl.m","rho_for_m", rho_1,len,1, - symbol==num_pdcch_symbols ? 15 : - symbol==nsymb-1 ? 14 : 13); - - write_output("rho_rho_in_llr.m","rho2", rho_rho_amp_x0,len,1, - symbol==num_pdcch_symbols ? 15 : - symbol==nsymb-1 ? 14 : 13); -#endif - - sub_cpx_vector16((int16_t *)rxF, - (int16_t *)rho_rho_amp_x0, - //(int16_t *)clean_x1, - (int16_t *)rxF, - len*2); - -#ifdef DEBUG_LLR_SIC - write_output("rxFdata_comp1_after.m","rxF_a", rxF,len,1,1); - write_output("rxF_comp1.m","rxF_1_comp", rxF,len,1, - symbol==num_pdcch_symbols ? 15 : - symbol==nsymb-1 ? 14 : 13); -#endif - - //this is for QPSK only!!! - for (i=0; i<len*2; i++) { - *llr16 =rxF[i]; - //printf("llr %d : (%d,%d)\n",i,((int16_t*)llr32)[0],((int16_t*)llr32)[1]); - llr16++; - } - - } - - // printf("dlsch_qpsk_llr_SIC: acc_len=%d\n",len_acc); - - return(0); -} - - -//---------------------------------------------------------------------------------------------- -// 16-QAM -//---------------------------------------------------------------------------------------------- - -void dlsch_16qam_llr(LTE_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 **llr32p, - uint8_t beamforming_mode) -{ - -#if defined(__x86_64__) || defined(__i386__) - __m128i *rxF = (__m128i*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; - __m128i *ch_mag; - __m128i llr128[2]; - uint32_t *llr32; -#elif defined(__arm__) - int16x8_t *rxF = (int16x8_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; - int16x8_t *ch_mag; - int16x8_t xmm0; - int16_t *llr16; -#endif - - - int i,len; - unsigned char symbol_mod,len_mod4=0; - - -#if defined(__x86_64__) || defined(__i386__) - if (first_symbol_flag==1) { - llr32 = (uint32_t*)dlsch_llr; - } else { - llr32 = (uint32_t*)*llr32p; - } -#elif defined(__arm__) - if (first_symbol_flag==1) { - llr16 = (int16_t*)dlsch_llr; - } else { - llr16 = (int16_t*)*llr32p; - } -#endif - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - -#if defined(__x86_64__) || defined(__i386__) - ch_mag = (__m128i*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; -#elif defined(__arm__) - ch_mag = (int16x8_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; -#endif - if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { - if (frame_parms->nb_antenna_ports_eNB!=1) - len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); - else - len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); - } else if((beamforming_mode==7) && (frame_parms->Ncp==0) && (symbol==3 || symbol==6 || symbol==9 || symbol==12)){ - len = (nb_rb*9) - (3*pbch_pss_sss_adjust/4); - } else if((beamforming_mode==7) && (frame_parms->Ncp==1) && (symbol==4 || symbol==7 || symbol==10)){ - len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); - } else { - len = (nb_rb*12) - pbch_pss_sss_adjust; - } - - // update output pointer according to number of REs in this symbol (<<2 because 4 bits per RE) - if (first_symbol_flag == 1) - *llr32p = dlsch_llr + (len<<2); - else - *llr32p += (len<<2); - - // printf("len=%d\n", len); - len_mod4 = len&3; - // printf("len_mod4=%d\n", len_mod4); - len>>=2; // length in quad words (4 REs) - // printf("len>>=2=%d\n", len); - len+=(len_mod4==0 ? 0 : 1); - // printf("len+=%d\n", len); - for (i=0; i<len; i++) { - -#if defined(__x86_64__) || defined(__i386) - xmm0 = _mm_abs_epi16(rxF[i]); - xmm0 = _mm_subs_epi16(ch_mag[i],xmm0); - - // lambda_1=y_R, lambda_2=|y_R|-|h|^2, lamda_3=y_I, lambda_4=|y_I|-|h|^2 - llr128[0] = _mm_unpacklo_epi32(rxF[i],xmm0); - llr128[1] = _mm_unpackhi_epi32(rxF[i],xmm0); - llr32[0] = _mm_extract_epi32(llr128[0],0); //((uint32_t *)&llr128[0])[0]; - llr32[1] = _mm_extract_epi32(llr128[0],1); //((uint32_t *)&llr128[0])[1]; - llr32[2] = _mm_extract_epi32(llr128[0],2); //((uint32_t *)&llr128[0])[2]; - llr32[3] = _mm_extract_epi32(llr128[0],3); //((uint32_t *)&llr128[0])[3]; - llr32[4] = _mm_extract_epi32(llr128[1],0); //((uint32_t *)&llr128[1])[0]; - llr32[5] = _mm_extract_epi32(llr128[1],1); //((uint32_t *)&llr128[1])[1]; - llr32[6] = _mm_extract_epi32(llr128[1],2); //((uint32_t *)&llr128[1])[2]; - llr32[7] = _mm_extract_epi32(llr128[1],3); //((uint32_t *)&llr128[1])[3]; - llr32+=8; -#elif defined(__arm__) - xmm0 = vabsq_s16(rxF[i]); - xmm0 = vqsubq_s16(ch_mag[i],xmm0); - // lambda_1=y_R, lambda_2=|y_R|-|h|^2, lamda_3=y_I, lambda_4=|y_I|-|h|^2 - - llr16[0] = vgetq_lane_s16(rxF[i],0); - llr16[1] = vgetq_lane_s16(rxF[i],1); - llr16[2] = vgetq_lane_s16(xmm0,0); - llr16[3] = vgetq_lane_s16(xmm0,1); - llr16[4] = vgetq_lane_s16(rxF[i],2); - llr16[5] = vgetq_lane_s16(rxF[i],3); - llr16[6] = vgetq_lane_s16(xmm0,2); - llr16[7] = vgetq_lane_s16(xmm0,3); - llr16[8] = vgetq_lane_s16(rxF[i],4); - llr16[9] = vgetq_lane_s16(rxF[i],5); - llr16[10] = vgetq_lane_s16(xmm0,4); - llr16[11] = vgetq_lane_s16(xmm0,5); - llr16[12] = vgetq_lane_s16(rxF[i],6); - llr16[13] = vgetq_lane_s16(rxF[i],6); - llr16[14] = vgetq_lane_s16(xmm0,7); - llr16[15] = vgetq_lane_s16(xmm0,7); - llr16+=16; -#endif - - } - -#if defined(__x86_64__) || defined(__i386__) - _mm_empty(); - _m_empty(); -#endif -} - -void dlsch_16qam_llr_SIC (LTE_DL_FRAME_PARMS *frame_parms, - int32_t **rxdataF_comp, - int32_t **sic_buffer, //Q15 - int32_t **rho_i, - int16_t *dlsch_llr, - uint8_t num_pdcch_symbols, - int32_t **dl_ch_mag, - uint16_t nb_rb, - uint8_t subframe, - uint16_t mod_order_0, - uint32_t rb_alloc) -{ - int16_t rho_amp_x0[2*frame_parms->N_RB_DL*12]; - int16_t rho_rho_amp_x0[2*frame_parms->N_RB_DL*12]; - uint16_t amp_tmp; - uint32_t *llr32=(uint32_t*)dlsch_llr; - int i, len, nsymb; - uint8_t symbol, symbol_mod; - int len_acc=0; - uint16_t *sic_data; - uint16_t pbch_pss_sss_adjust; - unsigned char len_mod4=0; - __m128i llr128[2]; - __m128i *ch_mag; - nsymb = (frame_parms->Ncp==0) ? 14:12; - - for (symbol=num_pdcch_symbols; symbol<nsymb; symbol++) { - uint16_t *rxF = (uint16_t*)(&rxdataF_comp[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]); - int16_t *rho_1=(int16_t*)(&rho_i[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]); - ch_mag = (__m128i*)(&dl_ch_mag[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]); - sic_data = (uint16_t*)(&sic_buffer[0][((int16_t)len_acc)]); - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - - pbch_pss_sss_adjust=adjust_G2(frame_parms,&rb_alloc,4,subframe,symbol); - - if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { - amp_tmp=0x1fff;//dlsch0->sqrt_rho_b; already taken into account - if (frame_parms->nb_antenna_ports_eNB!=1) - len = nb_rb*8 - (2*pbch_pss_sss_adjust/3); - else - len = nb_rb*10 - (5*pbch_pss_sss_adjust/6); - } else { - amp_tmp=0x1fff;;//dlsch0->sqrt_rho_a; already taken into account - len = nb_rb*12 - pbch_pss_sss_adjust; - } - - if (mod_order_0==6) - amp_tmp=amp_tmp<<1; // to compensate for >> 1 shift in modulation - - len_acc+=len; - - multadd_complex_vector_real_scalar((int16_t *)sic_data, - amp_tmp, - (int16_t *)rho_amp_x0, //this is in Q13 - 1, - len); - - mult_cpx_vector((int16_t *)rho_1, //Q15 - (int16_t *)rho_amp_x0, //Q13 - (int16_t*)rho_rho_amp_x0, - len, - 13); - - sub_cpx_vector16((int16_t *)rxF, - (int16_t *)rho_rho_amp_x0, - //(int16_t *)clean_x1, - (int16_t *)rxF, - len*2); - - len_mod4 = len&3; - len>>=2; // length in quad words (4 REs) - len+=(len_mod4==0 ? 0 : 1); - - for (i=0; i<len; i++) { - - - __m128i *x1 = (__m128i*)rxF;//clean_x1; -//printf("%p %p %p\n", clean_x1, &clean_x1, &clean_x1[0]); -//int *a = malloc(10*sizeof(int)); -//printf("%p %p\n", a, &a); -//exit(0); - xmm0 = _mm_abs_epi16(x1[i]); - xmm0 = _mm_subs_epi16(ch_mag[i],xmm0); - - // lambda_1=y_R, lambda_2=|y_R|-|h|^2, lamda_3=y_I, lambda_4=|y_I|-|h|^2 - llr128[0] = _mm_unpacklo_epi32(x1[i],xmm0); - llr128[1] = _mm_unpackhi_epi32(x1[i],xmm0); - llr32[0] = _mm_extract_epi32(llr128[0],0); //((uint32_t *)&llr128[0])[0]; - llr32[1] = _mm_extract_epi32(llr128[0],1); //((uint32_t *)&llr128[0])[1]; - llr32[2] = _mm_extract_epi32(llr128[0],2); //((uint32_t *)&llr128[0])[2]; - llr32[3] = _mm_extract_epi32(llr128[0],3); //((uint32_t *)&llr128[0])[3]; - llr32[4] = _mm_extract_epi32(llr128[1],0); //((uint32_t *)&llr128[1])[0]; - llr32[5] = _mm_extract_epi32(llr128[1],1); //((uint32_t *)&llr128[1])[1]; - llr32[6] = _mm_extract_epi32(llr128[1],2); //((uint32_t *)&llr128[1])[2]; - llr32[7] = _mm_extract_epi32(llr128[1],3); //((uint32_t *)&llr128[1])[3]; - llr32+=8; - - } - _mm_empty(); - _m_empty(); -} -} - -//---------------------------------------------------------------------------------------------- -// 64-QAM -//---------------------------------------------------------------------------------------------- - -void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, - int32_t **rxdataF_comp, - int16_t *dlsch_llr, - int32_t **dl_ch_mag, - int32_t **dl_ch_magb, - 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) -{ -#if defined(__x86_64__) || defined(__i386__) - __m128i *rxF = (__m128i*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; - __m128i *ch_mag,*ch_magb; -#elif defined(__arm__) - int16x8_t *rxF = (int16x8_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; - int16x8_t *ch_mag,*ch_magb,xmm1,xmm2; -#endif - int i,len,len2; - unsigned char symbol_mod,len_mod4; - short *llr; - int16_t *llr2; - int8_t *pllr_symbol; - - /* - if (first_symbol_flag==1) - llr = dlsch_llr; - else - llr = *llr_save; - */ - llr = dlsch_llr; - - pllr_symbol = (int8_t*)dlsch_llr; - pllr_symbol += llr_offset; - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - -#if defined(__x86_64__) || defined(__i386__) - ch_mag = (__m128i*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; - ch_magb = (__m128i*)&dl_ch_magb[0][(symbol*frame_parms->N_RB_DL*12)]; -#elif defined(__arm__) - ch_mag = (int16x8_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; - ch_magb = (int16x8_t*)&dl_ch_magb[0][(symbol*frame_parms->N_RB_DL*12)]; -#endif - if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { - if (frame_parms->nb_antenna_ports_eNB!=1) - len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); - else - len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); - } else if((beamforming_mode==7) && (frame_parms->Ncp==0) && (symbol==3 || symbol==6 || symbol==9 || symbol==12)){ - len = (nb_rb*9) - (3*pbch_pss_sss_adjust/4); - } else if((beamforming_mode==7) && (frame_parms->Ncp==1) && (symbol==4 || symbol==7 || symbol==10)){ - len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); - } else { - len = (nb_rb*12) - pbch_pss_sss_adjust; - } - -// printf("dlsch_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust); - -/* LOG_I(PHY,"dlsch_64qam_llr [symb %d / FirstSym %d / Length %d]: @LLR Buff %x \n", - symbol, - first_symbol_flag, - len, - dlsch_llr, - pllr_symbol);*/ - - llr2 = llr; - llr += (len*6); - - len_mod4 =len&3; - len2=len>>2; // length in quad words (4 REs) - len2+=((len_mod4==0)?0:1); - - for (i=0; i<len2; i++) { - -#if defined(__x86_64__) || defined(__i386__) - xmm1 = _mm_abs_epi16(rxF[i]); - xmm1 = _mm_subs_epi16(ch_mag[i],xmm1); - xmm2 = _mm_abs_epi16(xmm1); - xmm2 = _mm_subs_epi16(ch_magb[i],xmm2); -#elif defined(__arm__) - xmm1 = vabsq_s16(rxF[i]); - xmm1 = vsubq_s16(ch_mag[i],xmm1); - xmm2 = vabsq_s16(xmm1); - xmm2 = vsubq_s16(ch_magb[i],xmm2); -#endif - // loop over all LLRs in quad word (24 coded bits) - /* - for (j=0;j<8;j+=2) { - llr2[0] = ((short *)&rxF[i])[j]; - llr2[1] = ((short *)&rxF[i])[j+1]; - llr2[2] = ((short *)&xmm1)[j]; - llr2[3] = ((short *)&xmm1)[j+1]; - llr2[4] = ((short *)&xmm2)[j]; - llr2[5] = ((short *)&xmm2)[j+1]; - - llr2+=6; - } - */ - llr2[0] = ((short *)&rxF[i])[0]; - llr2[1] = ((short *)&rxF[i])[1]; -#if defined(__x86_64__) || defined(__i386__) - llr2[2] = _mm_extract_epi16(xmm1,0); - llr2[3] = _mm_extract_epi16(xmm1,1);//((short *)&xmm1)[j+1]; - llr2[4] = _mm_extract_epi16(xmm2,0);//((short *)&xmm2)[j]; - llr2[5] = _mm_extract_epi16(xmm2,1);//((short *)&xmm2)[j+1]; -#elif defined(__arm__) - llr2[2] = vgetq_lane_s16(xmm1,0); - llr2[3] = vgetq_lane_s16(xmm1,1);//((short *)&xmm1)[j+1]; - llr2[4] = vgetq_lane_s16(xmm2,0);//((short *)&xmm2)[j]; - llr2[5] = vgetq_lane_s16(xmm2,1);//((short *)&xmm2)[j+1]; -#endif - - llr2+=6; - llr2[0] = ((short *)&rxF[i])[2]; - llr2[1] = ((short *)&rxF[i])[3]; -#if defined(__x86_64__) || defined(__i386__) - llr2[2] = _mm_extract_epi16(xmm1,2); - llr2[3] = _mm_extract_epi16(xmm1,3);//((short *)&xmm1)[j+1]; - llr2[4] = _mm_extract_epi16(xmm2,2);//((short *)&xmm2)[j]; - llr2[5] = _mm_extract_epi16(xmm2,3);//((short *)&xmm2)[j+1]; -#elif defined(__arm__) - llr2[2] = vgetq_lane_s16(xmm1,2); - llr2[3] = vgetq_lane_s16(xmm1,3);//((short *)&xmm1)[j+1]; - llr2[4] = vgetq_lane_s16(xmm2,2);//((short *)&xmm2)[j]; - llr2[5] = vgetq_lane_s16(xmm2,3);//((short *)&xmm2)[j+1]; -#endif - - llr2+=6; - llr2[0] = ((short *)&rxF[i])[4]; - llr2[1] = ((short *)&rxF[i])[5]; -#if defined(__x86_64__) || defined(__i386__) - llr2[2] = _mm_extract_epi16(xmm1,4); - llr2[3] = _mm_extract_epi16(xmm1,5);//((short *)&xmm1)[j+1]; - llr2[4] = _mm_extract_epi16(xmm2,4);//((short *)&xmm2)[j]; - llr2[5] = _mm_extract_epi16(xmm2,5);//((short *)&xmm2)[j+1]; -#elif defined(__arm__) - llr2[2] = vgetq_lane_s16(xmm1,4); - llr2[3] = vgetq_lane_s16(xmm1,5);//((short *)&xmm1)[j+1]; - llr2[4] = vgetq_lane_s16(xmm2,4);//((short *)&xmm2)[j]; - llr2[5] = vgetq_lane_s16(xmm2,5);//((short *)&xmm2)[j+1]; -#endif - llr2+=6; - llr2[0] = ((short *)&rxF[i])[6]; - llr2[1] = ((short *)&rxF[i])[7]; -#if defined(__x86_64__) || defined(__i386__) - llr2[2] = _mm_extract_epi16(xmm1,6); - llr2[3] = _mm_extract_epi16(xmm1,7);//((short *)&xmm1)[j+1]; - llr2[4] = _mm_extract_epi16(xmm2,6);//((short *)&xmm2)[j]; - llr2[5] = _mm_extract_epi16(xmm2,7);//((short *)&xmm2)[j+1]; -#elif defined(__arm__) - llr2[2] = vgetq_lane_s16(xmm1,6); - llr2[3] = vgetq_lane_s16(xmm1,7);//((short *)&xmm1)[j+1]; - llr2[4] = vgetq_lane_s16(xmm2,6);//((short *)&xmm2)[j]; - llr2[5] = vgetq_lane_s16(xmm2,7);//((short *)&xmm2)[j+1]; -#endif - llr2+=6; - - } - -#if defined(__x86_64__) || defined(__i386__) - _mm_empty(); - _m_empty(); -#endif -} - -//#if 0 -void dlsch_64qam_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms, - int32_t **rxdataF_comp, - int32_t **sic_buffer, //Q15 - int32_t **rho_i, - int16_t *dlsch_llr, - uint8_t num_pdcch_symbols, - int32_t **dl_ch_mag, - int32_t **dl_ch_magb, - uint16_t nb_rb, - uint8_t subframe, - uint16_t mod_order_0, - uint32_t rb_alloc) -{ - int16_t rho_amp_x0[2*frame_parms->N_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; symbol<nsymb; symbol++) { - uint16_t *rxF = (uint16_t*)(&rxdataF_comp[0][((int16_t)symbol*frame_parms->N_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; i<len2; i++) { - - __m128i *x1 = (__m128i*)rxF; - xmm1 = _mm_abs_epi16(x1[i]); - xmm1 = _mm_subs_epi16(ch_mag[i],xmm1); - xmm2 = _mm_abs_epi16(xmm1); - xmm2 = _mm_subs_epi16(ch_magb[i],xmm2); - - // loop over all LLRs in quad word (24 coded bits) - /* - for (j=0;j<8;j+=2) { - llr2[0] = ((short *)&rxF[i])[j]; - llr2[1] = ((short *)&rxF[i])[j+1]; - llr2[2] = ((short *)&xmm1)[j]; - llr2[3] = ((short *)&xmm1)[j+1]; - llr2[4] = ((short *)&xmm2)[j]; - llr2[5] = ((short *)&xmm2)[j+1]; - - llr2+=6; - } - */ - llr2[0] = ((short *)&x1[i])[0]; - llr2[1] = ((short *)&x1[i])[1]; - llr2[2] = _mm_extract_epi16(xmm1,0); - llr2[3] = _mm_extract_epi16(xmm1,1);//((short *)&xmm1)[j+1]; - llr2[4] = _mm_extract_epi16(xmm2,0);//((short *)&xmm2)[j]; - llr2[5] = _mm_extract_epi16(xmm2,1);//((short *)&xmm2)[j+1]; - - - llr2+=6; - llr2[0] = ((short *)&x1[i])[2]; - llr2[1] = ((short *)&x1[i])[3]; - - llr2[2] = _mm_extract_epi16(xmm1,2); - llr2[3] = _mm_extract_epi16(xmm1,3);//((short *)&xmm1)[j+1]; - llr2[4] = _mm_extract_epi16(xmm2,2);//((short *)&xmm2)[j]; - llr2[5] = _mm_extract_epi16(xmm2,3);//((short *)&xmm2)[j+1]; - - llr2+=6; - llr2[0] = ((short *)&x1[i])[4]; - llr2[1] = ((short *)&x1[i])[5]; - - llr2[2] = _mm_extract_epi16(xmm1,4); - llr2[3] = _mm_extract_epi16(xmm1,5);//((short *)&xmm1)[j+1]; - llr2[4] = _mm_extract_epi16(xmm2,4);//((short *)&xmm2)[j]; - llr2[5] = _mm_extract_epi16(xmm2,5);//((short *)&xmm2)[j+1]; - - llr2+=6; - llr2[0] = ((short *)&x1[i])[6]; - llr2[1] = ((short *)&x1[i])[7]; - - llr2[2] = _mm_extract_epi16(xmm1,6); - llr2[3] = _mm_extract_epi16(xmm1,7);//((short *)&xmm1)[j+1]; - llr2[4] = _mm_extract_epi16(xmm2,6);//((short *)&xmm2)[j]; - llr2[5] = _mm_extract_epi16(xmm2,7);//((short *)&xmm2)[j+1]; - - llr2+=6; - - } - - // *llr_save = llr; - - _mm_empty(); - _m_empty(); - - } -} -//#endif -//============================================================================================== -// DUAL-STREAM -//============================================================================================== - -//---------------------------------------------------------------------------------------------- -// QPSK -//---------------------------------------------------------------------------------------------- - -#if defined(__x86_64__) || defined(__i386) -__m128i y0r_over2 __attribute__ ((aligned(16))); -__m128i y0i_over2 __attribute__ ((aligned(16))); -__m128i y1r_over2 __attribute__ ((aligned(16))); -__m128i y1i_over2 __attribute__ ((aligned(16))); - -__m128i A __attribute__ ((aligned(16))); -__m128i B __attribute__ ((aligned(16))); -__m128i C __attribute__ ((aligned(16))); -__m128i D __attribute__ ((aligned(16))); -__m128i E __attribute__ ((aligned(16))); -__m128i F __attribute__ ((aligned(16))); -__m128i G __attribute__ ((aligned(16))); -__m128i H __attribute__ ((aligned(16))); - -#endif - -int dlsch_qpsk_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms, - int **rxdataF_comp, - int **rxdataF_comp_i, - int **rho_i, - short *dlsch_llr, - unsigned char symbol, - unsigned char first_symbol_flag, - unsigned short nb_rb, - uint16_t pbch_pss_sss_adjust, - short **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 *rho=(int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *llr16; - int len; - uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; - - if (first_symbol_flag == 1) { - llr16 = (int16_t*)dlsch_llr; - } else { - llr16 = (int16_t*)(*llr16p); - } - - AssertFatal(llr16!=NULL,"dlsch_qpsk_qpsk_llr: llr is null, symbol %d\n",symbol); - - if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { - // if symbol has pilots - if (frame_parms->nb_antenna_ports_eNB!=1) - // in 2 antenna ports we have 8 REs per symbol per RB - len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); - else - // for 1 antenna port we have 10 REs per symbol per RB - len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); - } else { - // symbol has no pilots - len = (nb_rb*12) - pbch_pss_sss_adjust; - } - - // printf("dlsch_qpsk_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust); - // printf("qpsk_qpsk: len %d, llr16 %p\n",len,llr16); - qpsk_qpsk((short *)rxF, - (short *)rxF_i, - (short *)llr16, - (short *)rho, - len); - - llr16 += (len<<1); - *llr16p = (short *)llr16; - - return(0); -} - -//__m128i ONE_OVER_SQRT_8 __attribute__((aligned(16))); - -void qpsk_qpsk(short *stream0_in, - short *stream1_in, - short *stream0_out, - short *rho01, - int length - ) -{ - - /* - This function computes the LLRs of stream 0 (s_0) in presence of the interfering stream 1 (s_1) assuming that both symbols are QPSK. It can be used for both MU-MIMO interference-aware receiver or for SU-MIMO receivers. - - Parameters: - stream0_in = Matched filter output y0' = (h0*g0)*y0 - stream1_in = Matched filter output y1' = (h0*g1)*y0 - stream0_out = LLRs - rho01 = Correlation between the two effective channels \rho_{10} = (h1*g1)*(h0*g0) - length = number of resource elements - */ - -#if defined(__x86_64__) || defined(__i386__) - __m128i *rho01_128i = (__m128i *)rho01; - __m128i *stream0_128i_in = (__m128i *)stream0_in; - __m128i *stream1_128i_in = (__m128i *)stream1_in; - __m128i *stream0_128i_out = (__m128i *)stream0_out; - __m128i ONE_OVER_SQRT_8 = _mm_set1_epi16(23170); //round(2^16/sqrt(8)) -#elif defined(__arm__) - int16x8_t *rho01_128i = (int16x8_t *)rho01; - int16x8_t *stream0_128i_in = (int16x8_t *)stream0_in; - int16x8_t *stream1_128i_in = (int16x8_t *)stream1_in; - int16x8_t *stream0_128i_out = (int16x8_t *)stream0_out; - int16x8_t ONE_OVER_SQRT_8 = vdupq_n_s16(23170); //round(2^16/sqrt(8)) -#endif - - int i; - - - for (i=0; i<length>>2; i+=2) { - // in each iteration, we take 8 complex samples -#if defined(__x86_64__) || defined(__i386__) - xmm0 = rho01_128i[i]; // 4 symbols - xmm1 = rho01_128i[i+1]; - - // put (rho_r + rho_i)/2sqrt2 in rho_rpi - // put (rho_r - rho_i)/2sqrt2 in rho_rmi - - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) - xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) - rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) - rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) - - // divide by sqrt(8), no shift needed ONE_OVER_SQRT_8 = Q1.16 - rho_rpi = _mm_mulhi_epi16(rho_rpi,ONE_OVER_SQRT_8); - rho_rmi = _mm_mulhi_epi16(rho_rmi,ONE_OVER_SQRT_8); -#elif defined(__arm__) - - -#endif - // Compute LLR for first bit of stream 0 - - // Compute real and imaginary parts of MF output for stream 0 -#if defined(__x86_64__) || defined(__i386__) - xmm0 = stream0_128i_in[i]; - xmm1 = stream0_128i_in[i+1]; - - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] - y0i = _mm_unpackhi_epi64(xmm0,xmm1); - - y0r_over2 = _mm_srai_epi16(y0r,1); // divide by 2 - y0i_over2 = _mm_srai_epi16(y0i,1); // divide by 2 -#elif defined(__arm__) - - -#endif - // Compute real and imaginary parts of MF output for stream 1 -#if defined(__x86_64__) || defined(__i386__) - xmm0 = stream1_128i_in[i]; - xmm1 = stream1_128i_in[i+1]; - - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] - y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] - - y1r_over2 = _mm_srai_epi16(y1r,1); // divide by 2 - y1i_over2 = _mm_srai_epi16(y1i,1); // divide by 2 - - // Compute the terms for the LLR of first bit - - xmm0 = _mm_setzero_si128(); // ZERO - - // 1 term for numerator of LLR - xmm3 = _mm_subs_epi16(y1r_over2,rho_rpi); - A = _mm_abs_epi16(xmm3); // A = |y1r/2 - rho/sqrt(8)| - xmm2 = _mm_adds_epi16(A,y0i_over2); // = |y1r/2 - rho/sqrt(8)| + y0i/2 - xmm3 = _mm_subs_epi16(y1i_over2,rho_rmi); - B = _mm_abs_epi16(xmm3); // B = |y1i/2 - rho*/sqrt(8)| - logmax_num_re0 = _mm_adds_epi16(B,xmm2); // = |y1r/2 - rho/sqrt(8)|+|y1i/2 - rho*/sqrt(8)| + y0i/2 - - // 2 term for numerator of LLR - xmm3 = _mm_subs_epi16(y1r_over2,rho_rmi); - C = _mm_abs_epi16(xmm3); // C = |y1r/2 - rho*/4| - xmm2 = _mm_subs_epi16(C,y0i_over2); // = |y1r/2 - rho*/4| - y0i/2 - xmm3 = _mm_adds_epi16(y1i_over2,rho_rpi); - D = _mm_abs_epi16(xmm3); // D = |y1i/2 + rho/4| - xmm2 = _mm_adds_epi16(xmm2,D); // |y1r/2 - rho*/4| + |y1i/2 + rho/4| - y0i/2 - logmax_num_re0 = _mm_max_epi16(logmax_num_re0,xmm2); // max, numerator done - - // 1 term for denominator of LLR - xmm3 = _mm_adds_epi16(y1r_over2,rho_rmi); - E = _mm_abs_epi16(xmm3); // E = |y1r/2 + rho*/4| - xmm2 = _mm_adds_epi16(E,y0i_over2); // = |y1r/2 + rho*/4| + y0i/2 - xmm3 = _mm_subs_epi16(y1i_over2,rho_rpi); - F = _mm_abs_epi16(xmm3); // F = |y1i/2 - rho/4| - logmax_den_re0 = _mm_adds_epi16(F,xmm2); // = |y1r/2 + rho*/4| + |y1i/2 - rho/4| + y0i/2 - - // 2 term for denominator of LLR - xmm3 = _mm_adds_epi16(y1r_over2,rho_rpi); - G = _mm_abs_epi16(xmm3); // G = |y1r/2 + rho/4| - xmm2 = _mm_subs_epi16(G,y0i_over2); // = |y1r/2 + rho/4| - y0i/2 - xmm3 = _mm_adds_epi16(y1i_over2,rho_rmi); - H = _mm_abs_epi16(xmm3); // H = |y1i/2 + rho*/4| - xmm2 = _mm_adds_epi16(xmm2,H); // = |y1r/2 + rho/4| + |y1i/2 + rho*/4| - y0i/2 - logmax_den_re0 = _mm_max_epi16(logmax_den_re0,xmm2); // max, denominator done - - // Compute the terms for the LLR of first bit - - // 1 term for nominator of LLR - xmm2 = _mm_adds_epi16(A,y0r_over2); - logmax_num_im0 = _mm_adds_epi16(B,xmm2); // = |y1r/2 - rho/4| + |y1i/2 - rho*/4| + y0r/2 - - // 2 term for nominator of LLR - xmm2 = _mm_subs_epi16(E,y0r_over2); - xmm2 = _mm_adds_epi16(xmm2,F); // = |y1r/2 + rho*/4| + |y1i/2 - rho/4| - y0r/2 - - logmax_num_im0 = _mm_max_epi16(logmax_num_im0,xmm2); // max, nominator done - - // 1 term for denominator of LLR - xmm2 = _mm_adds_epi16(C,y0r_over2); - logmax_den_im0 = _mm_adds_epi16(D,xmm2); // = |y1r/2 - rho*/4| + |y1i/2 + rho/4| - y0r/2 - - xmm2 = _mm_subs_epi16(G,y0r_over2); - xmm2 = _mm_adds_epi16(xmm2,H); // = |y1r/2 + rho/4| + |y1i/2 + rho*/4| - y0r/2 - - logmax_den_im0 = _mm_max_epi16(logmax_den_im0,xmm2); // max, denominator done - - // LLR of first bit [L1(1), L1(2), L1(3), L1(4)] - y0r = _mm_adds_epi16(y0r,logmax_num_re0); - y0r = _mm_subs_epi16(y0r,logmax_den_re0); - - // LLR of second bit [L2(1), L2(2), L2(3), L2(4)] - y0i = _mm_adds_epi16(y0i,logmax_num_im0); - y0i = _mm_subs_epi16(y0i,logmax_den_im0); - - _mm_storeu_si128(&stream0_128i_out[i],_mm_unpacklo_epi16(y0r,y0i)); // = [L1(1), L2(1), L1(2), L2(2)] - - if (i<((length>>1) - 1)) // false if only 2 REs remain - _mm_storeu_si128(&stream0_128i_out[i+1],_mm_unpackhi_epi16(y0r,y0i)); - -#elif defined(__x86_64__) - -#endif - } - -#if defined(__x86_64__) || defined(__i386__) - _mm_empty(); - _m_empty(); -#endif -} - -int dlsch_qpsk_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms, - int32_t **rxdataF_comp, - int32_t **rxdataF_comp_i, - int32_t **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10}) - int32_t **rho_i, - int16_t *dlsch_llr, - uint8_t symbol, - uint8_t first_symbol_flag, - uint16_t nb_rb, - uint16_t pbch_pss_sss_adjust, - int16_t **llr16p) -{ - - int16_t *rxF=(int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *rxF_i=(int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *rho=(int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *llr16; - int len; - uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; - - if (first_symbol_flag == 1) { - llr16 = (int16_t*)dlsch_llr; - } else { - llr16 = (int16_t*)(*llr16p); - } - - AssertFatal(llr16!=NULL,"dlsch_qpsk_qpsk_llr: llr is null, symbol %d\n",symbol); - - - if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { - // if symbol has pilots - if (frame_parms->nb_antenna_ports_eNB!=1) - // in 2 antenna ports we have 8 REs per symbol per RB - len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); - else - // for 1 antenna port we have 10 REs per symbol per RB - len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); - } else { - // symbol has no pilots - len = (nb_rb*12) - pbch_pss_sss_adjust; - } - - qpsk_qam16((short *)rxF, - (short *)rxF_i, - (short *)ch_mag_i, - (short *)llr16, - (short *)rho, - len); - - llr16 += (len<<1); - *llr16p = (short *)llr16; - - return(0); -} - -/* -#if defined(__x86_64__) || defined(__i386__) -__m128i ONE_OVER_SQRT_2 __attribute__((aligned(16))); -__m128i ONE_OVER_SQRT_10 __attribute__((aligned(16))); -__m128i THREE_OVER_SQRT_10 __attribute__((aligned(16))); -__m128i ONE_OVER_SQRT_10_Q15 __attribute__((aligned(16))); -__m128i SQRT_10_OVER_FOUR __attribute__((aligned(16))); -__m128i ch_mag_int; -#endif -*/ -void qpsk_qam16(int16_t *stream0_in, - int16_t *stream1_in, - int16_t *ch_mag_i, - int16_t *stream0_out, - int16_t *rho01, - int32_t length - ) -{ - /* - This function computes the LLRs of stream 0 (s_0) in presence of the interfering stream 1 (s_1) assuming that both symbols are QPSK. It can be used for both MU-MIMO interference-aware receiver or for SU-MIMO receivers. - - Parameters: - stream0_in = Matched filter output y0' = (h0*g0)*y0 - stream1_in = Matched filter output y1' = (h0*g1)*y0 - stream0_out = LLRs - rho01 = Correlation between the two effective channels \rho_{10} = (h1*g1)*(h0*g0) - length = number of resource elements - */ - -#if defined(__x86_64__) || defined(__i386__) - __m128i *rho01_128i = (__m128i *)rho01; - __m128i *stream0_128i_in = (__m128i *)stream0_in; - __m128i *stream1_128i_in = (__m128i *)stream1_in; - __m128i *stream0_128i_out = (__m128i *)stream0_out; - __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i; - __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15) - __m128i ONE_OVER_SQRT_10_Q15 = _mm_set1_epi16(10362); // round(1/sqrt(10)*2^15) - __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15) - __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15) - __m128i ch_mag_int __attribute__((aligned(16))); -#elif defined(__arm__) - int16x8_t *rho01_128i = (int16x8_t *)rho01; - int16x8_t *stream0_128i_in = (int16x8_t *)stream0_in; - int16x8_t *stream1_128i_in = (int16x8_t *)stream1_in; - int16x8_t *stream0_128i_out = (int16x8_t *)stream0_out; - int16x8_t *ch_mag_128i_i = (int16x8_t *)ch_mag_i; - int16x8_t ONE_OVER_SQRT_2 = vdupq_n_s16(23170); // round(1/sqrt(2)*2^15) - int16x8_t ONE_OVER_SQRT_10_Q15 = vdupq_n_s16(10362); // round(1/sqrt(10)*2^15) - int16x8_t THREE_OVER_SQRT_10 = vdupq_n_s16(31086); // round(3/sqrt(10)*2^15) - int16x8_t SQRT_10_OVER_FOUR = vdupq_n_s16(25905); // round(sqrt(10)/4*2^15) - int16x8_t ch_mag_int __attribute__((aligned(16))); -#endif - -#ifdef DEBUG_LLR - print_shorts2("rho01_128i:\n",rho01_128i); -#endif - - int i; - - - for (i=0; i<length>>2; i+=2) { - // in each iteration, we take 8 complex samples - -#if defined(__x86_64__) || defined(__i386__) - - xmm0 = rho01_128i[i]; // 4 symbols - xmm1 = rho01_128i[i+1]; - - // put (rho_r + rho_i)/2sqrt2 in rho_rpi - // put (rho_r - rho_i)/2sqrt2 in rho_rmi - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) - xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) - rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) - rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) - - // divide by sqrt(2) - rho_rpi = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_2); - rho_rmi = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_2); - rho_rpi = _mm_slli_epi16(rho_rpi,1); - rho_rmi = _mm_slli_epi16(rho_rmi,1); - - // Compute LLR for first bit of stream 0 - - // Compute real and imaginary parts of MF output for stream 0 - xmm0 = stream0_128i_in[i]; - xmm1 = stream0_128i_in[i+1]; - - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] - y0i = _mm_unpackhi_epi64(xmm0,xmm1); - - // divide by sqrt(2) - y0r_over2 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_2); - y0i_over2 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_2); - y0r_over2 = _mm_slli_epi16(y0r,1); - y0i_over2 = _mm_slli_epi16(y0i,1); - - y0_p_1_1 = _mm_adds_epi16(y0r_over2, y0i_over2); - y0_m_1_1 = _mm_subs_epi16(y0r_over2, y0i_over2); - - // Compute real and imaginary parts of MF output for stream 1 - xmm0 = stream1_128i_in[i]; - xmm1 = stream1_128i_in[i+1]; - - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] - y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] - - xmm0 = _mm_setzero_si128(); // ZERO - - // compute psi - xmm3 = _mm_subs_epi16(y1r,rho_rpi); - psi_r_p1_p1 = _mm_abs_epi16(xmm3); - xmm3 = _mm_subs_epi16(y1i,rho_rmi); - psi_i_p1_p1 = _mm_abs_epi16(xmm3); - xmm3 = _mm_subs_epi16(y1r,rho_rmi); - psi_r_p1_m1 = _mm_abs_epi16(xmm3); - xmm3 = _mm_adds_epi16(y1i,rho_rpi); - psi_i_p1_m1 = _mm_abs_epi16(xmm3); - xmm3 = _mm_adds_epi16(y1r,rho_rmi); - psi_r_m1_p1 = _mm_abs_epi16(xmm3); - xmm3 = _mm_subs_epi16(y1i,rho_rpi); - psi_i_m1_p1 = _mm_abs_epi16(xmm3); - xmm3 = _mm_adds_epi16(y1r,rho_rpi); - psi_r_m1_m1 = _mm_abs_epi16(xmm3); - xmm3 = _mm_adds_epi16(y1i,rho_rmi); - psi_i_m1_m1 = _mm_abs_epi16(xmm3); - - // Rearrange interfering channel magnitudes - xmm2 = ch_mag_128i_i[i]; - xmm3 = ch_mag_128i_i[i+1]; - - xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - - ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3); - - // calculate optimal interference amplitudes - interference_abs_epi16(psi_r_p1_p1 , ch_mag_int, a_r_p1_p1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p1_p1 , ch_mag_int, a_i_p1_p1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p1_m1 , ch_mag_int, a_r_p1_m1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p1_m1 , ch_mag_int, a_i_p1_m1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m1_p1 , ch_mag_int, a_r_m1_p1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m1_p1 , ch_mag_int, a_i_m1_p1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m1_m1 , ch_mag_int, a_r_m1_m1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m1_m1 , ch_mag_int, a_i_m1_m1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - - // prodsum - prodsum_psi_a_epi16(psi_r_p1_p1, a_r_p1_p1, psi_i_p1_p1, a_i_p1_p1, psi_a_p1_p1); - prodsum_psi_a_epi16(psi_r_p1_m1, a_r_p1_m1, psi_i_p1_m1, a_i_p1_m1, psi_a_p1_m1); - prodsum_psi_a_epi16(psi_r_m1_p1, a_r_m1_p1, psi_i_m1_p1, a_i_m1_p1, psi_a_m1_p1); - prodsum_psi_a_epi16(psi_r_m1_m1, a_r_m1_m1, psi_i_m1_m1, a_i_m1_m1, psi_a_m1_m1); - - // squares - square_a_epi16(a_r_p1_p1, a_i_p1_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p1); - square_a_epi16(a_r_p1_m1, a_i_p1_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m1); - square_a_epi16(a_r_m1_p1, a_i_m1_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p1); - square_a_epi16(a_r_m1_m1, a_i_m1_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m1); - - // Computing Metrics - xmm0 = _mm_subs_epi16(psi_a_p1_p1, a_sq_p1_p1); - bit_met_p1_p1 = _mm_adds_epi16(xmm0, y0_p_1_1); - - xmm0 = _mm_subs_epi16(psi_a_p1_m1, a_sq_p1_m1); - bit_met_p1_m1 = _mm_adds_epi16(xmm0, y0_m_1_1); - - xmm0 = _mm_subs_epi16(psi_a_m1_p1, a_sq_m1_p1); - bit_met_m1_p1 = _mm_subs_epi16(xmm0, y0_m_1_1); - - xmm0 = _mm_subs_epi16(psi_a_m1_m1, a_sq_m1_m1); - bit_met_m1_m1 = _mm_subs_epi16(xmm0, y0_p_1_1); - - // MSB - logmax_num_re0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_m1); // bit=0 - logmax_den_re0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_m1); // bit=1 - - y0r = _mm_subs_epi16(logmax_num_re0,logmax_den_re0); - - // LSB - logmax_num_im0 = _mm_max_epi16(bit_met_p1_p1,bit_met_m1_p1); // bit=0 - logmax_den_im0 = _mm_max_epi16(bit_met_p1_m1,bit_met_m1_m1); // bit=1 - - y0i = _mm_subs_epi16(logmax_num_im0,logmax_den_im0); - - stream0_128i_out[i] = _mm_unpacklo_epi16(y0r,y0i); // = [L1(1), L2(1), L1(2), L2(2)] - - if (i<((length>>1) - 1)) // false if only 2 REs remain - stream0_128i_out[i+1] = _mm_unpackhi_epi16(y0r,y0i); - -#elif defined(__arm__) - -#endif - } - -#if defined(__x86_64__) || defined(__i386__) - _mm_empty(); - _m_empty(); -#endif -} - -int dlsch_qpsk_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, - int32_t **rxdataF_comp, - int32_t **rxdataF_comp_i, - int32_t **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10}) - int32_t **rho_i, - int16_t *dlsch_llr, - uint8_t symbol, - uint8_t first_symbol_flag, - uint16_t nb_rb, - uint16_t pbch_pss_sss_adjust, - int16_t **llr16p) -{ - - int16_t *rxF=(int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *rxF_i=(int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *rho=(int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *llr16; - int len; - uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; - - - if (first_symbol_flag == 1) { - llr16 = (int16_t*)dlsch_llr; - } else { - llr16 = (int16_t*)(*llr16p); - } - - AssertFatal(llr16!=NULL,"dlsch_qpsk_qam64_llr: llr is null, symbol %d\n",symbol); - - if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { - // if symbol has pilots - if (frame_parms->nb_antenna_ports_eNB!=1) - // in 2 antenna ports we have 8 REs per symbol per RB - len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); - else - // for 1 antenna port we have 10 REs per symbol per RB - len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); - } else { - // symbol has no pilots - len = (nb_rb*12) - pbch_pss_sss_adjust; - } - - qpsk_qam64((short *)rxF, - (short *)rxF_i, - (short *)ch_mag_i, - (short *)llr16, - (short *)rho, - len); - - llr16 += (len<<1); - *llr16p = (short *)llr16; - - return(0); -} -/* -__m128i ONE_OVER_SQRT_2_42 __attribute__((aligned(16))); -__m128i THREE_OVER_SQRT_2_42 __attribute__((aligned(16))); -__m128i FIVE_OVER_SQRT_2_42 __attribute__((aligned(16))); -__m128i SEVEN_OVER_SQRT_2_42 __attribute__((aligned(16))); - -__m128i ch_mag_int_with_sigma2 __attribute__((aligned(16))); -__m128i two_ch_mag_int_with_sigma2 __attribute__((aligned(16))); -__m128i three_ch_mag_int_with_sigma2 __attribute__((aligned(16))); -__m128i SQRT_42_OVER_FOUR __attribute__((aligned(16))); -*/ -void qpsk_qam64(short *stream0_in, - short *stream1_in, - short *ch_mag_i, - short *stream0_out, - short *rho01, - int length - ) -{ - - /* - This function computes the LLRs of stream 0 (s_0) in presence of the interfering stream 1 (s_1) assuming that both symbols are QPSK. It can be used for both MU-MIMO interference-aware receiver or for SU-MIMO receivers. - - Parameters: - stream0_in = Matched filter output y0' = (h0*g0)*y0 - stream1_in = Matched filter output y1' = (h0*g1)*y0 - stream0_out = LLRs - rho01 = Correlation between the two effective channels \rho_{10} = (h1*g1)*(h0*g0) - length = number of resource elements - */ - -#if defined(__x86_64__) || defined(__i386__) - __m128i *rho01_128i = (__m128i *)rho01; - __m128i *stream0_128i_in = (__m128i *)stream0_in; - __m128i *stream1_128i_in = (__m128i *)stream1_in; - __m128i *stream0_128i_out = (__m128i *)stream0_out; - __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i; - __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15) - __m128i ONE_OVER_SQRT_2_42 = _mm_set1_epi16(3575); // round(1/sqrt(2*42)*2^15) - __m128i THREE_OVER_SQRT_2_42 = _mm_set1_epi16(10726); // round(3/sqrt(2*42)*2^15) - __m128i FIVE_OVER_SQRT_2_42 = _mm_set1_epi16(17876); // round(5/sqrt(2*42)*2^15) - __m128i SEVEN_OVER_SQRT_2_42 = _mm_set1_epi16(25027); // round(7/sqrt(2*42)*2^15) - __m128i SQRT_42_OVER_FOUR = _mm_set1_epi16(13272); // round(sqrt(42)/4*2^13), Q3.1 - __m128i ch_mag_int; - __m128i ch_mag_int_with_sigma2; - __m128i two_ch_mag_int_with_sigma2; - __m128i three_ch_mag_int_with_sigma2; -#elif defined(__arm__) - -#endif - -#ifdef DEBUG_LLR - print_shorts2("rho01_128i:\n",rho01_128i); -#endif - - int i; - - - for (i=0; i<length>>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<length>>2; i+=2) { - // In one iteration, we deal with 8 REs - -#if defined(__x86_64__) || defined(__i386__) - // Get rho - xmm0 = rho01_128i[i]; - xmm1 = rho01_128i[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) - xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) - rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) - rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) - - // Compute the different rhos - rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi,ONE_OVER_SQRT_10); - rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi,ONE_OVER_SQRT_10); - rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi,THREE_OVER_SQRT_10); - rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi,THREE_OVER_SQRT_10); - rho_rpi_3_3 = _mm_slli_epi16(rho_rpi_3_3,1); - rho_rmi_3_3 = _mm_slli_epi16(rho_rmi_3_3,1); - - xmm4 = _mm_mulhi_epi16(xmm2,ONE_OVER_SQRT_10); // Re(rho) - xmm5 = _mm_mulhi_epi16(xmm3,THREE_OVER_SQRT_10); // Im(rho) - xmm5 = _mm_slli_epi16(xmm5,1); - - rho_rpi_1_3 = _mm_adds_epi16(xmm4,xmm5); - rho_rmi_1_3 = _mm_subs_epi16(xmm4,xmm5); - - xmm6 = _mm_mulhi_epi16(xmm2,THREE_OVER_SQRT_10); // Re(rho) - xmm7 = _mm_mulhi_epi16(xmm3,ONE_OVER_SQRT_10); // Im(rho) - xmm6 = _mm_slli_epi16(xmm6,1); - - rho_rpi_3_1 = _mm_adds_epi16(xmm6,xmm7); - rho_rmi_3_1 = _mm_subs_epi16(xmm6,xmm7); - - // Rearrange interfering MF output - xmm0 = stream1_128i_in[i]; - xmm1 = stream1_128i_in[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] - y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] - - xmm0 = _mm_setzero_si128(); // ZERO - xmm2 = _mm_subs_epi16(rho_rpi_1_1,y1r); // = [Re(rho)+ Im(rho)]/sqrt(10) - y1r - psi_r_p1_p1 = _mm_abs_epi16(xmm2); // = |[Re(rho)+ Im(rho)]/sqrt(10) - y1r| - - xmm2= _mm_subs_epi16(rho_rmi_1_1,y1r); - psi_r_p1_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_1_1,y1i); - psi_i_p1_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_1_3,y1r); - psi_r_p1_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_1_3,y1r); - psi_r_p1_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_3_1,y1i); - psi_i_p1_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_3_1,y1r); - psi_r_p3_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_3_1,y1r); - psi_r_p3_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_1_3,y1i); - psi_i_p3_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_3_3,y1r); - psi_r_p3_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_3_3,y1r); - psi_r_p3_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_3_3,y1i); - psi_i_p3_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_1_1,y1i); - psi_i_m1_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_3_1,y1i); - psi_i_m1_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_1_3,y1i); - psi_i_m3_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_3_3,y1i); - psi_i_m3_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_1_1,y1i); - psi_i_p1_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_3_1,y1i); - psi_i_p1_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_1_3,y1i); - psi_i_p3_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_3_3,y1i); - psi_i_p3_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_1_1,y1r); - psi_r_m1_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_1_3,y1r); - psi_r_m1_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_3_1,y1r); - psi_r_m3_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_3_3,y1r); - psi_r_m3_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1r,rho_rmi_1_1); - psi_r_m1_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1r,rho_rmi_1_3); - psi_r_m1_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1i,rho_rmi_1_1); - psi_i_m1_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1i,rho_rmi_3_1); - psi_i_m1_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1r,rho_rmi_3_1); - psi_r_m3_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1r,rho_rmi_3_3); - psi_r_m3_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1i,rho_rmi_1_3); - psi_i_m3_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1i,rho_rmi_3_3); - psi_i_m3_m3 = _mm_abs_epi16(xmm2); - - // Rearrange desired MF output - xmm0 = stream0_128i_in[i]; - xmm1 = stream0_128i_in[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] - y0i = _mm_unpackhi_epi64(xmm0,xmm1); - - // Rearrange desired channel magnitudes - xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10)) - xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10)) - xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - - ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); // = [|h|^2(1),|h|^2(2),|h|^2(3),|h|^2(4)]*(2/sqrt(10)) - - // Scale MF output of desired signal - y0r_over_sqrt10 = _mm_mulhi_epi16(y0r,ONE_OVER_SQRT_10); - y0i_over_sqrt10 = _mm_mulhi_epi16(y0i,ONE_OVER_SQRT_10); - y0r_three_over_sqrt10 = _mm_mulhi_epi16(y0r,THREE_OVER_SQRT_10); - y0i_three_over_sqrt10 = _mm_mulhi_epi16(y0i,THREE_OVER_SQRT_10); - y0r_three_over_sqrt10 = _mm_slli_epi16(y0r_three_over_sqrt10,1); - y0i_three_over_sqrt10 = _mm_slli_epi16(y0i_three_over_sqrt10,1); - - // Compute necessary combination of required terms - y0_p_1_1 = _mm_adds_epi16(y0r_over_sqrt10,y0i_over_sqrt10); - y0_m_1_1 = _mm_subs_epi16(y0r_over_sqrt10,y0i_over_sqrt10); - - y0_p_1_3 = _mm_adds_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10); - y0_m_1_3 = _mm_subs_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10); - - y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10); - y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10); - - y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10); - y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10); - - // Add psi - psi_a_p1_p1 = _mm_adds_epi16(psi_r_p1_p1 ,psi_i_p1_p1); - psi_a_p1_p3 = _mm_adds_epi16(psi_r_p1_p3 ,psi_i_p1_p3); - psi_a_p3_p1 = _mm_adds_epi16(psi_r_p3_p1 ,psi_i_p3_p1); - psi_a_p3_p3 = _mm_adds_epi16(psi_r_p3_p3 ,psi_i_p3_p3); - psi_a_p1_m1 = _mm_adds_epi16(psi_r_p1_m1 ,psi_i_p1_m1); - psi_a_p1_m3 = _mm_adds_epi16(psi_r_p1_m3 ,psi_i_p1_m3); - psi_a_p3_m1 = _mm_adds_epi16(psi_r_p3_m1 ,psi_i_p3_m1); - psi_a_p3_m3 = _mm_adds_epi16(psi_r_p3_m3 ,psi_i_p3_m3); - psi_a_m1_p1 = _mm_adds_epi16(psi_r_m1_p1 ,psi_i_m1_p1); - psi_a_m1_p3 = _mm_adds_epi16(psi_r_m1_p3 ,psi_i_m1_p3); - psi_a_m3_p1 = _mm_adds_epi16(psi_r_m3_p1 ,psi_i_m3_p1); - psi_a_m3_p3 = _mm_adds_epi16(psi_r_m3_p3 ,psi_i_m3_p3); - psi_a_m1_m1 = _mm_adds_epi16(psi_r_m1_m1 ,psi_i_m1_m1); - psi_a_m1_m3 = _mm_adds_epi16(psi_r_m1_m3 ,psi_i_m1_m3); - psi_a_m3_m1 = _mm_adds_epi16(psi_r_m3_m1 ,psi_i_m3_m1); - psi_a_m3_m3 = _mm_adds_epi16(psi_r_m3_m3 ,psi_i_m3_m3); - - // scale by sqrt(2) - psi_a_p1_p1 = _mm_mulhi_epi16(psi_a_p1_p1,ONE_OVER_SQRT_2); - psi_a_p1_p1 = _mm_slli_epi16(psi_a_p1_p1,1); - psi_a_p1_p3 = _mm_mulhi_epi16(psi_a_p1_p3,ONE_OVER_SQRT_2); - psi_a_p1_p3 = _mm_slli_epi16(psi_a_p1_p3,1); - psi_a_p3_p1 = _mm_mulhi_epi16(psi_a_p3_p1,ONE_OVER_SQRT_2); - psi_a_p3_p1 = _mm_slli_epi16(psi_a_p3_p1,1); - psi_a_p3_p3 = _mm_mulhi_epi16(psi_a_p3_p3,ONE_OVER_SQRT_2); - psi_a_p3_p3 = _mm_slli_epi16(psi_a_p3_p3,1); - - psi_a_p1_m1 = _mm_mulhi_epi16(psi_a_p1_m1,ONE_OVER_SQRT_2); - psi_a_p1_m1 = _mm_slli_epi16(psi_a_p1_m1,1); - psi_a_p1_m3 = _mm_mulhi_epi16(psi_a_p1_m3,ONE_OVER_SQRT_2); - psi_a_p1_m3 = _mm_slli_epi16(psi_a_p1_m3,1); - psi_a_p3_m1 = _mm_mulhi_epi16(psi_a_p3_m1,ONE_OVER_SQRT_2); - psi_a_p3_m1 = _mm_slli_epi16(psi_a_p3_m1,1); - psi_a_p3_m3 = _mm_mulhi_epi16(psi_a_p3_m3,ONE_OVER_SQRT_2); - psi_a_p3_m3 = _mm_slli_epi16(psi_a_p3_m3,1); - - psi_a_m1_p1 = _mm_mulhi_epi16(psi_a_m1_p1,ONE_OVER_SQRT_2); - psi_a_m1_p1 = _mm_slli_epi16(psi_a_m1_p1,1); - psi_a_m1_p3 = _mm_mulhi_epi16(psi_a_m1_p3,ONE_OVER_SQRT_2); - psi_a_m1_p3 = _mm_slli_epi16(psi_a_m1_p3,1); - psi_a_m3_p1 = _mm_mulhi_epi16(psi_a_m3_p1,ONE_OVER_SQRT_2); - psi_a_m3_p1 = _mm_slli_epi16(psi_a_m3_p1,1); - psi_a_m3_p3 = _mm_mulhi_epi16(psi_a_m3_p3,ONE_OVER_SQRT_2); - psi_a_m3_p3 = _mm_slli_epi16(psi_a_m3_p3,1); - - psi_a_m1_m1 = _mm_mulhi_epi16(psi_a_m1_m1,ONE_OVER_SQRT_2); - psi_a_m1_m1 = _mm_slli_epi16(psi_a_m1_m1,1); - psi_a_m1_m3 = _mm_mulhi_epi16(psi_a_m1_m3,ONE_OVER_SQRT_2); - psi_a_m1_m3 = _mm_slli_epi16(psi_a_m1_m3,1); - psi_a_m3_m1 = _mm_mulhi_epi16(psi_a_m3_m1,ONE_OVER_SQRT_2); - psi_a_m3_m1 = _mm_slli_epi16(psi_a_m3_m1,1); - psi_a_m3_m3 = _mm_mulhi_epi16(psi_a_m3_m3,ONE_OVER_SQRT_2); - psi_a_m3_m3 = _mm_slli_epi16(psi_a_m3_m3,1); - - // Computing different multiples of channel norms - ch_mag_over_10=_mm_mulhi_epi16(ch_mag_des, ONE_OVER_TWO_SQRT_10); - ch_mag_over_2=_mm_mulhi_epi16(ch_mag_des, SQRT_10_OVER_FOUR); - ch_mag_over_2=_mm_slli_epi16(ch_mag_over_2, 1); - ch_mag_9_over_10=_mm_mulhi_epi16(ch_mag_des, NINE_OVER_TWO_SQRT_10); - ch_mag_9_over_10=_mm_slli_epi16(ch_mag_9_over_10, 2); - - // Computing Metrics - xmm1 = _mm_adds_epi16(psi_a_p1_p1, y0_p_1_1); - bit_met_p1_p1= _mm_subs_epi16(xmm1, ch_mag_over_10); - - xmm1 = _mm_adds_epi16(psi_a_p1_p3, y0_p_1_3); - bit_met_p1_p3= _mm_subs_epi16(xmm1, ch_mag_over_2); - - xmm1 = _mm_adds_epi16(psi_a_p1_m1, y0_m_1_1); - bit_met_p1_m1= _mm_subs_epi16(xmm1, ch_mag_over_10); - - xmm1 = _mm_adds_epi16(psi_a_p1_m3, y0_m_1_3); - bit_met_p1_m3= _mm_subs_epi16(xmm1, ch_mag_over_2); - - xmm1 = _mm_adds_epi16(psi_a_p3_p1, y0_p_3_1); - bit_met_p3_p1= _mm_subs_epi16(xmm1, ch_mag_over_2); - - xmm1 = _mm_adds_epi16(psi_a_p3_p3, y0_p_3_3); - bit_met_p3_p3= _mm_subs_epi16(xmm1, ch_mag_9_over_10); - - xmm1 = _mm_adds_epi16(psi_a_p3_m1, y0_m_3_1); - bit_met_p3_m1= _mm_subs_epi16(xmm1, ch_mag_over_2); - - xmm1 = _mm_adds_epi16(psi_a_p3_m3, y0_m_3_3); - bit_met_p3_m3= _mm_subs_epi16(xmm1, ch_mag_9_over_10); - - xmm1 = _mm_subs_epi16(psi_a_m1_p1, y0_m_1_1); - bit_met_m1_p1= _mm_subs_epi16(xmm1, ch_mag_over_10); - - xmm1 = _mm_subs_epi16(psi_a_m1_p3, y0_m_1_3); - bit_met_m1_p3= _mm_subs_epi16(xmm1, ch_mag_over_2); - - xmm1 = _mm_subs_epi16(psi_a_m1_m1, y0_p_1_1); - bit_met_m1_m1= _mm_subs_epi16(xmm1, ch_mag_over_10); - - xmm1 = _mm_subs_epi16(psi_a_m1_m3, y0_p_1_3); - bit_met_m1_m3= _mm_subs_epi16(xmm1, ch_mag_over_2); - - xmm1 = _mm_subs_epi16(psi_a_m3_p1, y0_m_3_1); - bit_met_m3_p1= _mm_subs_epi16(xmm1, ch_mag_over_2); - - xmm1 = _mm_subs_epi16(psi_a_m3_p3, y0_m_3_3); - bit_met_m3_p3= _mm_subs_epi16(xmm1, ch_mag_9_over_10); - - xmm1 = _mm_subs_epi16(psi_a_m3_m1, y0_p_3_1); - bit_met_m3_m1= _mm_subs_epi16(xmm1, ch_mag_over_2); - - xmm1 = _mm_subs_epi16(psi_a_m3_m3, y0_p_3_3); - bit_met_m3_m3= _mm_subs_epi16(xmm1, ch_mag_9_over_10); - - // LLR of the first bit - // Bit = 1 - xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3); - xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3); - xmm2 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_num_re0= _mm_max_epi16(xmm4,xmm5); - - // Bit = 0 - xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3); - xmm1 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3); - xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4,xmm5); - - // LLR of first bit [L1(1), L1(2), L1(3), L1(4), L1(5), L1(6), L1(7), L1(8)] - y0r = _mm_subs_epi16(logmax_den_re0,logmax_num_re0); - - // LLR of the second bit - // Bit = 1 - xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1); - xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1); - xmm2 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3); - xmm3 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_num_re1 = _mm_max_epi16(xmm4,xmm5); - - // Bit = 0 - xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1); - xmm1 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1); - xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_den_re1 = _mm_max_epi16(xmm4,xmm5); - - // LLR of second bit [L2(1), L2(2), L2(3), L2(4)] - y1r = _mm_subs_epi16(logmax_den_re1,logmax_num_re1); - - // LLR of the third bit - // Bit = 1 - xmm0 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3); - xmm1 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3); - xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_num_im0 = _mm_max_epi16(xmm4,xmm5); - - // Bit = 0 - xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3); - xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3); - xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3); - xmm3 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_den_im0 = _mm_max_epi16(xmm4,xmm5); - - // LLR of third bit [L3(1), L3(2), L3(3), L3(4)] - y0i = _mm_subs_epi16(logmax_den_im0,logmax_num_im0); - - // LLR of the fourth bit - // Bit = 1 - xmm0 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3); - xmm1 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3); - xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_num_im1 = _mm_max_epi16(xmm4,xmm5); - - // Bit = 0 - xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1); - xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1); - xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1); - xmm3 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_den_im1 = _mm_max_epi16(xmm4,xmm5); - - // LLR of fourth bit [L4(1), L4(2), L4(3), L4(4)] - y1i = _mm_subs_epi16(logmax_den_im1,logmax_num_im1); - - // Pack LLRs in output - // [L1(1), L2(1), L1(2), L2(2), L1(3), L2(3), L1(4), L2(4)] - xmm0 = _mm_unpacklo_epi16(y0r,y1r); - // [L1(5), L2(5), L1(6), L2(6), L1(7), L2(7), L1(8), L2(8)] - xmm1 = _mm_unpackhi_epi16(y0r,y1r); - // [L3(1), L4(1), L3(2), L4(2), L3(3), L4(3), L3(4), L4(4)] - xmm2 = _mm_unpacklo_epi16(y0i,y1i); - // [L3(5), L4(5), L3(6), L4(6), L3(7), L4(7), L3(8), L4(8)] - xmm3 = _mm_unpackhi_epi16(y0i,y1i); - - stream0_128i_out[2*i+0] = _mm_unpacklo_epi32(xmm0,xmm2); // 8LLRs, 2REs - stream0_128i_out[2*i+1] = _mm_unpackhi_epi32(xmm0,xmm2); - stream0_128i_out[2*i+2] = _mm_unpacklo_epi32(xmm1,xmm3); - stream0_128i_out[2*i+3] = _mm_unpackhi_epi32(xmm1,xmm3); - -#elif defined(__arm__) - -#endif - } - -#if defined(__x86_64__) || defined(__i386__) - _mm_empty(); - _m_empty(); -#endif - -} - -int dlsch_16qam_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms, - int32_t **rxdataF_comp, - int32_t **rxdataF_comp_i, - int32_t **dl_ch_mag, //|h_0|^2*(2/sqrt{10}) - int32_t **rho_i, - int16_t *dlsch_llr, - uint8_t symbol, - uint8_t first_symbol_flag, - uint16_t nb_rb, - uint16_t pbch_pss_sss_adjust, - int16_t **llr16p) -{ - - int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *llr16; - int len; - uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; - - // first symbol has different structure due to more pilots - if (first_symbol_flag == 1) { - llr16 = (int16_t*)dlsch_llr; - } else { - llr16 = (int16_t*)(*llr16p); - } - - AssertFatal(llr16!=NULL,"dlsch_16qam_qpsk_llr: llr is null, symbol %d\n",symbol); - - if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { - // if symbol has pilots - if (frame_parms->nb_antenna_ports_eNB!=1) - // in 2 antenna ports we have 8 REs per symbol per RB - len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); - else - // for 1 antenna port we have 10 REs per symbol per RB - len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); - } else { - // symbol has no pilots - len = (nb_rb*12) - pbch_pss_sss_adjust; - } - - // printf("symbol %d: qam16_llr, len %d (llr16 %p)\n",symbol,len,llr16); - - qam16_qpsk((short *)rxF, - (short *)rxF_i, - (short *)ch_mag, - (short *)llr16, - (short *)rho, - len); - - llr16 += (len<<2); - *llr16p = (short *)llr16; - - return(0); -} - -void qam16_qam16(short *stream0_in, - short *stream1_in, - short *ch_mag, - short *ch_mag_i, - short *stream0_out, - short *rho01, - int length - ) -{ - - /* - Author: Sebastian Wagner - Date: 2012-06-04 - - Input: - stream0_in: MF filter for 1st stream, i.e., y0=h0'*y - stream!_in: MF filter for 2nd stream, i.e., y1=h1'*y - ch_mag: 2*h0/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc - ch_mag_i: 2*h1/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc - rho01: Channel cross correlation, i.e., h1'*h0 - - Output: - stream0_out: output LLRs for 1st stream - */ -#if defined(__x86_64__) || defined(__i386__) - __m128i *rho01_128i = (__m128i *)rho01; - __m128i *stream0_128i_in = (__m128i *)stream0_in; - __m128i *stream1_128i_in = (__m128i *)stream1_in; - __m128i *stream0_128i_out = (__m128i *)stream0_out; - __m128i *ch_mag_128i = (__m128i *)ch_mag; - __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i; - - - - __m128i ONE_OVER_SQRT_10 = _mm_set1_epi16(20724); // round(1/sqrt(10)*2^16) - __m128i ONE_OVER_SQRT_10_Q15 = _mm_set1_epi16(10362); // round(1/sqrt(10)*2^15) - __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15) - __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15) - __m128i ONE_OVER_TWO_SQRT_10 = _mm_set1_epi16(10362); // round(1/2/sqrt(10)*2^16) - __m128i NINE_OVER_TWO_SQRT_10 = _mm_set1_epi16(23315); // round(9/2/sqrt(10)*2^14) - __m128i ch_mag_des,ch_mag_int; - __m128i y0r_over_sqrt10; - __m128i y0i_over_sqrt10; - __m128i y0r_three_over_sqrt10; - __m128i y0i_three_over_sqrt10; - __m128i ch_mag_over_10; - __m128i ch_mag_over_2; - __m128i ch_mag_9_over_10; -#elif defined(__arm__) - -#endif - - int i; - - for (i=0; i<length>>2; i+=2) { - // In one iteration, we deal with 8 REs - -#if defined(__x86_64__) || defined(__i386__) - // Get rho - xmm0 = rho01_128i[i]; - xmm1 = rho01_128i[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) - xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) - rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) - rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) - - // Compute the different rhos - rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi,ONE_OVER_SQRT_10); - rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi,ONE_OVER_SQRT_10); - rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi,THREE_OVER_SQRT_10); - rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi,THREE_OVER_SQRT_10); - rho_rpi_3_3 = _mm_slli_epi16(rho_rpi_3_3,1); - rho_rmi_3_3 = _mm_slli_epi16(rho_rmi_3_3,1); - - xmm4 = _mm_mulhi_epi16(xmm2,ONE_OVER_SQRT_10); // Re(rho) - xmm5 = _mm_mulhi_epi16(xmm3,THREE_OVER_SQRT_10); // Im(rho) - xmm5 = _mm_slli_epi16(xmm5,1); - - rho_rpi_1_3 = _mm_adds_epi16(xmm4,xmm5); - rho_rmi_1_3 = _mm_subs_epi16(xmm4,xmm5); - - xmm6 = _mm_mulhi_epi16(xmm2,THREE_OVER_SQRT_10); // Re(rho) - xmm7 = _mm_mulhi_epi16(xmm3,ONE_OVER_SQRT_10); // Im(rho) - xmm6 = _mm_slli_epi16(xmm6,1); - - rho_rpi_3_1 = _mm_adds_epi16(xmm6,xmm7); - rho_rmi_3_1 = _mm_subs_epi16(xmm6,xmm7); - - // Rearrange interfering MF output - xmm0 = stream1_128i_in[i]; - xmm1 = stream1_128i_in[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] - y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] - - xmm0 = _mm_setzero_si128(); // ZERO - xmm2 = _mm_subs_epi16(rho_rpi_1_1,y1r); // = [Re(rho)+ Im(rho)]/sqrt(10) - y1r - psi_r_p1_p1 = _mm_abs_epi16(xmm2); // = |[Re(rho)+ Im(rho)]/sqrt(10) - y1r| - - xmm2= _mm_subs_epi16(rho_rmi_1_1,y1r); - psi_r_p1_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_1_1,y1i); - psi_i_p1_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_1_3,y1r); - psi_r_p1_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_1_3,y1r); - psi_r_p1_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_3_1,y1i); - psi_i_p1_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_3_1,y1r); - psi_r_p3_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_3_1,y1r); - psi_r_p3_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_1_3,y1i); - psi_i_p3_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_3_3,y1r); - psi_r_p3_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_3_3,y1r); - psi_r_p3_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_3_3,y1i); - psi_i_p3_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_1_1,y1i); - psi_i_m1_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_3_1,y1i); - psi_i_m1_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_1_3,y1i); - psi_i_m3_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_3_3,y1i); - psi_i_m3_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_1_1,y1i); - psi_i_p1_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_3_1,y1i); - psi_i_p1_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_1_3,y1i); - psi_i_p3_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_3_3,y1i); - psi_i_p3_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_1_1,y1r); - psi_r_m1_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_1_3,y1r); - psi_r_m1_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_3_1,y1r); - psi_r_m3_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_3_3,y1r); - psi_r_m3_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1r,rho_rmi_1_1); - psi_r_m1_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1r,rho_rmi_1_3); - psi_r_m1_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1i,rho_rmi_1_1); - psi_i_m1_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1i,rho_rmi_3_1); - psi_i_m1_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1r,rho_rmi_3_1); - psi_r_m3_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1r,rho_rmi_3_3); - psi_r_m3_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1i,rho_rmi_1_3); - psi_i_m3_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1i,rho_rmi_3_3); - psi_i_m3_m3 = _mm_abs_epi16(xmm2); - - // Rearrange desired MF output - xmm0 = stream0_128i_in[i]; - xmm1 = stream0_128i_in[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] - y0i = _mm_unpackhi_epi64(xmm0,xmm1); - - // Rearrange desired channel magnitudes - xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10)) - xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10)) - xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - - ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); // = [|h|^2(1),|h|^2(2),|h|^2(3),|h|^2(4)]*(2/sqrt(10)) - - // Rearrange interfering channel magnitudes - xmm2 = ch_mag_128i_i[i]; - xmm3 = ch_mag_128i_i[i+1]; - - xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - - ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3); - - // Scale MF output of desired signal - y0r_over_sqrt10 = _mm_mulhi_epi16(y0r,ONE_OVER_SQRT_10); - y0i_over_sqrt10 = _mm_mulhi_epi16(y0i,ONE_OVER_SQRT_10); - y0r_three_over_sqrt10 = _mm_mulhi_epi16(y0r,THREE_OVER_SQRT_10); - y0i_three_over_sqrt10 = _mm_mulhi_epi16(y0i,THREE_OVER_SQRT_10); - y0r_three_over_sqrt10 = _mm_slli_epi16(y0r_three_over_sqrt10,1); - y0i_three_over_sqrt10 = _mm_slli_epi16(y0i_three_over_sqrt10,1); - - // Compute necessary combination of required terms - y0_p_1_1 = _mm_adds_epi16(y0r_over_sqrt10,y0i_over_sqrt10); - y0_m_1_1 = _mm_subs_epi16(y0r_over_sqrt10,y0i_over_sqrt10); - - y0_p_1_3 = _mm_adds_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10); - y0_m_1_3 = _mm_subs_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10); - - y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10); - y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10); - - y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10); - y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10); - - // Compute optimal interfering symbol magnitude - interference_abs_epi16(psi_r_p1_p1 ,ch_mag_int,a_r_p1_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p1_p1 ,ch_mag_int,a_i_p1_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p1_p3 ,ch_mag_int,a_r_p1_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p1_p3 ,ch_mag_int,a_i_p1_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p1_m1 ,ch_mag_int,a_r_p1_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p1_m1 ,ch_mag_int,a_i_p1_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p1_m3 ,ch_mag_int,a_r_p1_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p1_m3 ,ch_mag_int,a_i_p1_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p3_p1 ,ch_mag_int,a_r_p3_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p3_p1 ,ch_mag_int,a_i_p3_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p3_p3 ,ch_mag_int,a_r_p3_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p3_p3 ,ch_mag_int,a_i_p3_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p3_m1 ,ch_mag_int,a_r_p3_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p3_m1 ,ch_mag_int,a_i_p3_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p3_m3 ,ch_mag_int,a_r_p3_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p3_m3 ,ch_mag_int,a_i_p3_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m1_p1 ,ch_mag_int,a_r_m1_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m1_p1 ,ch_mag_int,a_i_m1_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m1_p3 ,ch_mag_int,a_r_m1_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m1_p3 ,ch_mag_int,a_i_m1_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m1_m1 ,ch_mag_int,a_r_m1_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m1_m1 ,ch_mag_int,a_i_m1_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m1_m3 ,ch_mag_int,a_r_m1_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m1_m3 ,ch_mag_int,a_i_m1_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m3_p1 ,ch_mag_int,a_r_m3_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m3_p1 ,ch_mag_int,a_i_m3_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m3_p3 ,ch_mag_int,a_r_m3_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m3_p3 ,ch_mag_int,a_i_m3_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m3_m1 ,ch_mag_int,a_r_m3_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m3_m1 ,ch_mag_int,a_i_m3_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m3_m3 ,ch_mag_int,a_r_m3_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m3_m3 ,ch_mag_int,a_i_m3_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - - // Calculation of groups of two terms in the bit metric involving product of psi and interference magnitude - prodsum_psi_a_epi16(psi_r_p1_p1,a_r_p1_p1,psi_i_p1_p1,a_i_p1_p1,psi_a_p1_p1); - prodsum_psi_a_epi16(psi_r_p1_p3,a_r_p1_p3,psi_i_p1_p3,a_i_p1_p3,psi_a_p1_p3); - prodsum_psi_a_epi16(psi_r_p3_p1,a_r_p3_p1,psi_i_p3_p1,a_i_p3_p1,psi_a_p3_p1); - prodsum_psi_a_epi16(psi_r_p3_p3,a_r_p3_p3,psi_i_p3_p3,a_i_p3_p3,psi_a_p3_p3); - prodsum_psi_a_epi16(psi_r_p1_m1,a_r_p1_m1,psi_i_p1_m1,a_i_p1_m1,psi_a_p1_m1); - prodsum_psi_a_epi16(psi_r_p1_m3,a_r_p1_m3,psi_i_p1_m3,a_i_p1_m3,psi_a_p1_m3); - prodsum_psi_a_epi16(psi_r_p3_m1,a_r_p3_m1,psi_i_p3_m1,a_i_p3_m1,psi_a_p3_m1); - prodsum_psi_a_epi16(psi_r_p3_m3,a_r_p3_m3,psi_i_p3_m3,a_i_p3_m3,psi_a_p3_m3); - prodsum_psi_a_epi16(psi_r_m1_p1,a_r_m1_p1,psi_i_m1_p1,a_i_m1_p1,psi_a_m1_p1); - prodsum_psi_a_epi16(psi_r_m1_p3,a_r_m1_p3,psi_i_m1_p3,a_i_m1_p3,psi_a_m1_p3); - prodsum_psi_a_epi16(psi_r_m3_p1,a_r_m3_p1,psi_i_m3_p1,a_i_m3_p1,psi_a_m3_p1); - prodsum_psi_a_epi16(psi_r_m3_p3,a_r_m3_p3,psi_i_m3_p3,a_i_m3_p3,psi_a_m3_p3); - prodsum_psi_a_epi16(psi_r_m1_m1,a_r_m1_m1,psi_i_m1_m1,a_i_m1_m1,psi_a_m1_m1); - prodsum_psi_a_epi16(psi_r_m1_m3,a_r_m1_m3,psi_i_m1_m3,a_i_m1_m3,psi_a_m1_m3); - prodsum_psi_a_epi16(psi_r_m3_m1,a_r_m3_m1,psi_i_m3_m1,a_i_m3_m1,psi_a_m3_m1); - prodsum_psi_a_epi16(psi_r_m3_m3,a_r_m3_m3,psi_i_m3_m3,a_i_m3_m3,psi_a_m3_m3); - - - // squared interference magnitude times int. ch. power - square_a_epi16(a_r_p1_p1,a_i_p1_p1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p1_p1); - square_a_epi16(a_r_p1_p3,a_i_p1_p3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p1_p3); - square_a_epi16(a_r_p3_p1,a_i_p3_p1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p3_p1); - square_a_epi16(a_r_p3_p3,a_i_p3_p3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p3_p3); - square_a_epi16(a_r_p1_m1,a_i_p1_m1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p1_m1); - square_a_epi16(a_r_p1_m3,a_i_p1_m3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p1_m3); - square_a_epi16(a_r_p3_m1,a_i_p3_m1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p3_m1); - square_a_epi16(a_r_p3_m3,a_i_p3_m3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p3_m3); - square_a_epi16(a_r_m1_p1,a_i_m1_p1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m1_p1); - square_a_epi16(a_r_m1_p3,a_i_m1_p3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m1_p3); - square_a_epi16(a_r_m3_p1,a_i_m3_p1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m3_p1); - square_a_epi16(a_r_m3_p3,a_i_m3_p3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m3_p3); - square_a_epi16(a_r_m1_m1,a_i_m1_m1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m1_m1); - square_a_epi16(a_r_m1_m3,a_i_m1_m3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m1_m3); - square_a_epi16(a_r_m3_m1,a_i_m3_m1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m3_m1); - square_a_epi16(a_r_m3_m3,a_i_m3_m3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m3_m3); - - // Computing different multiples of channel norms - ch_mag_over_10=_mm_mulhi_epi16(ch_mag_des, ONE_OVER_TWO_SQRT_10); - ch_mag_over_2=_mm_mulhi_epi16(ch_mag_des, SQRT_10_OVER_FOUR); - ch_mag_over_2=_mm_slli_epi16(ch_mag_over_2, 1); - ch_mag_9_over_10=_mm_mulhi_epi16(ch_mag_des, NINE_OVER_TWO_SQRT_10); - ch_mag_9_over_10=_mm_slli_epi16(ch_mag_9_over_10, 2); - - // Computing Metrics - xmm0 = _mm_subs_epi16(psi_a_p1_p1,a_sq_p1_p1); - xmm1 = _mm_adds_epi16(xmm0,y0_p_1_1); - bit_met_p1_p1= _mm_subs_epi16(xmm1,ch_mag_over_10); - - xmm0 = _mm_subs_epi16(psi_a_p1_p3,a_sq_p1_p3); - xmm1 = _mm_adds_epi16(xmm0,y0_p_1_3); - bit_met_p1_p3= _mm_subs_epi16(xmm1,ch_mag_over_2); - - xmm0 = _mm_subs_epi16(psi_a_p1_m1,a_sq_p1_m1); - xmm1 = _mm_adds_epi16(xmm0,y0_m_1_1); - bit_met_p1_m1= _mm_subs_epi16(xmm1,ch_mag_over_10); - - xmm0 = _mm_subs_epi16(psi_a_p1_m3,a_sq_p1_m3); - xmm1 = _mm_adds_epi16(xmm0,y0_m_1_3); - bit_met_p1_m3= _mm_subs_epi16(xmm1,ch_mag_over_2); - - xmm0 = _mm_subs_epi16(psi_a_p3_p1,a_sq_p3_p1); - xmm1 = _mm_adds_epi16(xmm0,y0_p_3_1); - bit_met_p3_p1= _mm_subs_epi16(xmm1,ch_mag_over_2); - - xmm0 = _mm_subs_epi16(psi_a_p3_p3,a_sq_p3_p3); - xmm1 = _mm_adds_epi16(xmm0,y0_p_3_3); - bit_met_p3_p3= _mm_subs_epi16(xmm1,ch_mag_9_over_10); - - xmm0 = _mm_subs_epi16(psi_a_p3_m1,a_sq_p3_m1); - xmm1 = _mm_adds_epi16(xmm0,y0_m_3_1); - bit_met_p3_m1= _mm_subs_epi16(xmm1,ch_mag_over_2); - - xmm0 = _mm_subs_epi16(psi_a_p3_m3,a_sq_p3_m3); - xmm1 = _mm_adds_epi16(xmm0,y0_m_3_3); - bit_met_p3_m3= _mm_subs_epi16(xmm1,ch_mag_9_over_10); - - xmm0 = _mm_subs_epi16(psi_a_m1_p1,a_sq_m1_p1); - xmm1 = _mm_subs_epi16(xmm0,y0_m_1_1); - bit_met_m1_p1= _mm_subs_epi16(xmm1,ch_mag_over_10); - - xmm0 = _mm_subs_epi16(psi_a_m1_p3,a_sq_m1_p3); - xmm1 = _mm_subs_epi16(xmm0,y0_m_1_3); - bit_met_m1_p3= _mm_subs_epi16(xmm1,ch_mag_over_2); - - xmm0 = _mm_subs_epi16(psi_a_m1_m1,a_sq_m1_m1); - xmm1 = _mm_subs_epi16(xmm0,y0_p_1_1); - bit_met_m1_m1= _mm_subs_epi16(xmm1,ch_mag_over_10); - - xmm0 = _mm_subs_epi16(psi_a_m1_m3,a_sq_m1_m3); - xmm1 = _mm_subs_epi16(xmm0,y0_p_1_3); - bit_met_m1_m3= _mm_subs_epi16(xmm1,ch_mag_over_2); - - xmm0 = _mm_subs_epi16(psi_a_m3_p1,a_sq_m3_p1); - xmm1 = _mm_subs_epi16(xmm0,y0_m_3_1); - bit_met_m3_p1= _mm_subs_epi16(xmm1,ch_mag_over_2); - - xmm0 = _mm_subs_epi16(psi_a_m3_p3,a_sq_m3_p3); - xmm1 = _mm_subs_epi16(xmm0,y0_m_3_3); - bit_met_m3_p3= _mm_subs_epi16(xmm1,ch_mag_9_over_10); - - xmm0 = _mm_subs_epi16(psi_a_m3_m1,a_sq_m3_m1); - xmm1 = _mm_subs_epi16(xmm0,y0_p_3_1); - bit_met_m3_m1= _mm_subs_epi16(xmm1,ch_mag_over_2); - - xmm0 = _mm_subs_epi16(psi_a_m3_m3,a_sq_m3_m3); - xmm1 = _mm_subs_epi16(xmm0,y0_p_3_3); - bit_met_m3_m3= _mm_subs_epi16(xmm1,ch_mag_9_over_10); - - // LLR of the first bit - // Bit = 1 - xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3); - xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3); - xmm2 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_num_re0= _mm_max_epi16(xmm4,xmm5); - - // Bit = 0 - xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3); - xmm1 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3); - xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4,xmm5); - - // LLR of first bit [L1(1), L1(2), L1(3), L1(4), L1(5), L1(6), L1(7), L1(8)] - y0r = _mm_subs_epi16(logmax_den_re0,logmax_num_re0); - - // LLR of the second bit - // Bit = 1 - xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1); - xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1); - xmm2 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3); - xmm3 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_num_re1 = _mm_max_epi16(xmm4,xmm5); - - // Bit = 0 - xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1); - xmm1 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1); - xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_den_re1 = _mm_max_epi16(xmm4,xmm5); - - // LLR of second bit [L2(1), L2(2), L2(3), L2(4)] - y1r = _mm_subs_epi16(logmax_den_re1,logmax_num_re1); - - // LLR of the third bit - // Bit = 1 - xmm0 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3); - xmm1 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3); - xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_num_im0 = _mm_max_epi16(xmm4,xmm5); - - // Bit = 0 - xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3); - xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3); - xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3); - xmm3 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_den_im0 = _mm_max_epi16(xmm4,xmm5); - - // LLR of third bit [L3(1), L3(2), L3(3), L3(4)] - y0i = _mm_subs_epi16(logmax_den_im0,logmax_num_im0); - - // LLR of the fourth bit - // Bit = 1 - xmm0 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3); - xmm1 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3); - xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_num_im1 = _mm_max_epi16(xmm4,xmm5); - - // Bit = 0 - xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1); - xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1); - xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1); - xmm3 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_den_im1 = _mm_max_epi16(xmm4,xmm5); - - // LLR of fourth bit [L4(1), L4(2), L4(3), L4(4)] - y1i = _mm_subs_epi16(logmax_den_im1,logmax_num_im1); - - // Pack LLRs in output - // [L1(1), L2(1), L1(2), L2(2), L1(3), L2(3), L1(4), L2(4)] - xmm0 = _mm_unpacklo_epi16(y0r,y1r); - // [L1(5), L2(5), L1(6), L2(6), L1(7), L2(7), L1(8), L2(8)] - xmm1 = _mm_unpackhi_epi16(y0r,y1r); - // [L3(1), L4(1), L3(2), L4(2), L3(3), L4(3), L3(4), L4(4)] - xmm2 = _mm_unpacklo_epi16(y0i,y1i); - // [L3(5), L4(5), L3(6), L4(6), L3(7), L4(7), L3(8), L4(8)] - xmm3 = _mm_unpackhi_epi16(y0i,y1i); - - stream0_128i_out[2*i+0] = _mm_unpacklo_epi32(xmm0,xmm2); // 8LLRs, 2REs - stream0_128i_out[2*i+1] = _mm_unpackhi_epi32(xmm0,xmm2); - stream0_128i_out[2*i+2] = _mm_unpacklo_epi32(xmm1,xmm3); - stream0_128i_out[2*i+3] = _mm_unpackhi_epi32(xmm1,xmm3); -#elif defined(__arm__) - -#endif - - } - -#if defined(__x86_64__) || defined(__i386__) - _mm_empty(); - _m_empty(); -#endif -} - -int dlsch_16qam_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms, - int32_t **rxdataF_comp, - int32_t **rxdataF_comp_i, - int32_t **dl_ch_mag, //|h_0|^2*(2/sqrt{10}) - int32_t **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10}) - int32_t **rho_i, - int16_t *dlsch_llr, - uint8_t symbol, - uint8_t first_symbol_flag, - uint16_t nb_rb, - uint16_t pbch_pss_sss_adjust, - int16_t **llr16p) -{ - - int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *llr16; - int len; - uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; - - // first symbol has different structure due to more pilots - if (first_symbol_flag == 1) { - llr16 = (int16_t*)dlsch_llr; - } else { - llr16 = (int16_t*)(*llr16p); - } - - - AssertFatal(llr16!=NULL,"dlsch_16qam_16qam_llr: llr is null, symbol %d\n",symbol); - - if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { - // if symbol has pilots - if (frame_parms->nb_antenna_ports_eNB!=1) - // in 2 antenna ports we have 8 REs per symbol per RB - len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); - else - // for 1 antenna port we have 10 REs per symbol per RB - len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); - } else { - // symbol has no pilots - len = (nb_rb*12) - pbch_pss_sss_adjust; - } - - // printf("symbol %d: qam16_llr, len %d (llr16 %p)\n",symbol,len,llr16); - - qam16_qam16((short *)rxF, - (short *)rxF_i, - (short *)ch_mag, - (short *)ch_mag_i, - (short *)llr16, - (short *)rho, - len); - - llr16 += (len<<2); - *llr16p = (short *)llr16; - - return(0); -} - -void qam16_qam64(int16_t *stream0_in, - int16_t *stream1_in, - int16_t *ch_mag, - int16_t *ch_mag_i, - int16_t *stream0_out, - int16_t *rho01, - int32_t length - ) -{ - - /* - Author: Sebastian Wagner - Date: 2012-06-04 - - Input: - stream0_in: MF filter for 1st stream, i.e., y0=h0'*y - stream!_in: MF filter for 2nd stream, i.e., y1=h1'*y - ch_mag: 2*h0/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc - ch_mag_i: 2*h1/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc - rho01: Channel cross correlation, i.e., h1'*h0 - - Output: - stream0_out: output LLRs for 1st stream - */ - -#if defined(__x86_64__) || defined(__i386__) - __m128i *rho01_128i = (__m128i *)rho01; - __m128i *stream0_128i_in = (__m128i *)stream0_in; - __m128i *stream1_128i_in = (__m128i *)stream1_in; - __m128i *stream0_128i_out = (__m128i *)stream0_out; - __m128i *ch_mag_128i = (__m128i *)ch_mag; - __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i; - - - __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15) - __m128i ONE_OVER_SQRT_10 = _mm_set1_epi16(20724); // round(1/sqrt(10)*2^16) - __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15) - __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15) - __m128i ONE_OVER_TWO_SQRT_10 = _mm_set1_epi16(10362); // round(1/2/sqrt(10)*2^16) - __m128i NINE_OVER_TWO_SQRT_10 = _mm_set1_epi16(23315); // round(9/2/sqrt(10)*2^14) - __m128i ONE_OVER_SQRT_2_42 = _mm_set1_epi16(3575); // round(1/sqrt(2*42)*2^15) - __m128i THREE_OVER_SQRT_2_42 = _mm_set1_epi16(10726); // round(3/sqrt(2*42)*2^15) - __m128i FIVE_OVER_SQRT_2_42 = _mm_set1_epi16(17876); // round(5/sqrt(2*42)*2^15) - __m128i SEVEN_OVER_SQRT_2_42 = _mm_set1_epi16(25027); // round(7/sqrt(2*42)*2^15) - __m128i SQRT_42_OVER_FOUR = _mm_set1_epi16(13272); // round(sqrt(42)/4*2^13), Q3. - __m128i ch_mag_des,ch_mag_int; - __m128i y0r_over_sqrt10; - __m128i y0i_over_sqrt10; - __m128i y0r_three_over_sqrt10; - __m128i y0i_three_over_sqrt10; - __m128i ch_mag_over_10; - __m128i ch_mag_over_2; - __m128i ch_mag_9_over_10; - __m128i ch_mag_int_with_sigma2; - __m128i two_ch_mag_int_with_sigma2; - __m128i three_ch_mag_int_with_sigma2; - -#elif defined(__arm__) - -#endif - int i; - - for (i=0; i<length>>2; i+=2) { - // In one iteration, we deal with 8 REs - -#if defined(__x86_64__) || defined(__i386__) - // Get rho - xmm0 = rho01_128i[i]; - xmm1 = rho01_128i[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) - xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) - rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) - rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) - - // Compute the different rhos - rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi,ONE_OVER_SQRT_10); - rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi,ONE_OVER_SQRT_10); - rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi,THREE_OVER_SQRT_10); - rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi,THREE_OVER_SQRT_10); - rho_rpi_3_3 = _mm_slli_epi16(rho_rpi_3_3,1); - rho_rmi_3_3 = _mm_slli_epi16(rho_rmi_3_3,1); - - xmm4 = _mm_mulhi_epi16(xmm2,ONE_OVER_SQRT_10); // Re(rho) - xmm5 = _mm_mulhi_epi16(xmm3,THREE_OVER_SQRT_10); // Im(rho) - xmm5 = _mm_slli_epi16(xmm5,1); - - rho_rpi_1_3 = _mm_adds_epi16(xmm4,xmm5); - rho_rmi_1_3 = _mm_subs_epi16(xmm4,xmm5); - - xmm6 = _mm_mulhi_epi16(xmm2,THREE_OVER_SQRT_10); // Re(rho) - xmm7 = _mm_mulhi_epi16(xmm3,ONE_OVER_SQRT_10); // Im(rho) - xmm6 = _mm_slli_epi16(xmm6,1); - - rho_rpi_3_1 = _mm_adds_epi16(xmm6,xmm7); - rho_rmi_3_1 = _mm_subs_epi16(xmm6,xmm7); - - // Rearrange interfering MF output - xmm0 = stream1_128i_in[i]; - xmm1 = stream1_128i_in[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] - y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] - - xmm0 = _mm_setzero_si128(); // ZERO - xmm2 = _mm_subs_epi16(rho_rpi_1_1,y1r); // = [Re(rho)+ Im(rho)]/sqrt(10) - y1r - psi_r_p1_p1 = _mm_abs_epi16(xmm2); // = |[Re(rho)+ Im(rho)]/sqrt(10) - y1r| - - xmm2= _mm_subs_epi16(rho_rmi_1_1,y1r); - psi_r_p1_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_1_1,y1i); - psi_i_p1_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_1_3,y1r); - psi_r_p1_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_1_3,y1r); - psi_r_p1_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_3_1,y1i); - psi_i_p1_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_3_1,y1r); - psi_r_p3_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_3_1,y1r); - psi_r_p3_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_1_3,y1i); - psi_i_p3_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_3_3,y1r); - psi_r_p3_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_3_3,y1r); - psi_r_p3_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rmi_3_3,y1i); - psi_i_p3_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_1_1,y1i); - psi_i_m1_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_3_1,y1i); - psi_i_m1_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_1_3,y1i); - psi_i_m3_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_subs_epi16(rho_rpi_3_3,y1i); - psi_i_m3_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_1_1,y1i); - psi_i_p1_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_3_1,y1i); - psi_i_p1_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_1_3,y1i); - psi_i_p3_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_3_3,y1i); - psi_i_p3_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_1_1,y1r); - psi_r_m1_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_1_3,y1r); - psi_r_m1_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_3_1,y1r); - psi_r_m3_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(rho_rpi_3_3,y1r); - psi_r_m3_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1r,rho_rmi_1_1); - psi_r_m1_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1r,rho_rmi_1_3); - psi_r_m1_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1i,rho_rmi_1_1); - psi_i_m1_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1i,rho_rmi_3_1); - psi_i_m1_m3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1r,rho_rmi_3_1); - psi_r_m3_p1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1r,rho_rmi_3_3); - psi_r_m3_p3 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1i,rho_rmi_1_3); - psi_i_m3_m1 = _mm_abs_epi16(xmm2); - xmm2= _mm_adds_epi16(y1i,rho_rmi_3_3); - psi_i_m3_m3 = _mm_abs_epi16(xmm2); - - // Rearrange desired MF output - xmm0 = stream0_128i_in[i]; - xmm1 = stream0_128i_in[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] - y0i = _mm_unpackhi_epi64(xmm0,xmm1); - - // Rearrange desired channel magnitudes - xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10)) - xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10)) - xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - - ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); // = [|h|^2(1),|h|^2(2),|h|^2(3),|h|^2(4)]*(2/sqrt(10)) - - // Rearrange interfering channel magnitudes - xmm2 = ch_mag_128i_i[i]; - xmm3 = ch_mag_128i_i[i+1]; - - xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - - ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3); - - // Scale MF output of desired signal - y0r_over_sqrt10 = _mm_mulhi_epi16(y0r,ONE_OVER_SQRT_10); - y0i_over_sqrt10 = _mm_mulhi_epi16(y0i,ONE_OVER_SQRT_10); - y0r_three_over_sqrt10 = _mm_mulhi_epi16(y0r,THREE_OVER_SQRT_10); - y0i_three_over_sqrt10 = _mm_mulhi_epi16(y0i,THREE_OVER_SQRT_10); - y0r_three_over_sqrt10 = _mm_slli_epi16(y0r_three_over_sqrt10,1); - y0i_three_over_sqrt10 = _mm_slli_epi16(y0i_three_over_sqrt10,1); - - // Compute necessary combination of required terms - y0_p_1_1 = _mm_adds_epi16(y0r_over_sqrt10,y0i_over_sqrt10); - y0_m_1_1 = _mm_subs_epi16(y0r_over_sqrt10,y0i_over_sqrt10); - - y0_p_1_3 = _mm_adds_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10); - y0_m_1_3 = _mm_subs_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10); - - y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10); - y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10); - - y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10); - y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10); - - // Compute optimal interfering symbol magnitude - ch_mag_int_with_sigma2 = _mm_srai_epi16(ch_mag_int, 1); // *2 - two_ch_mag_int_with_sigma2 = ch_mag_int; // *4 - three_ch_mag_int_with_sigma2 = _mm_adds_epi16(ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2); // *6 - - interference_abs_64qam_epi16(psi_r_p1_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p1_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p1_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p1_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p1_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p1_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p1_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p1_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p3_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p3_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p3_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p3_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p3_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p3_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p3_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p3_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m1_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m1_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m1_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m1_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m1_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m1_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m1_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m1_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m3_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m3_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m3_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m3_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m3_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m3_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m3_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m3_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - - // Calculation of groups of two terms in the bit metric involving product of psi and interference magnitude - prodsum_psi_a_epi16(psi_r_p1_p1,a_r_p1_p1,psi_i_p1_p1,a_i_p1_p1,psi_a_p1_p1); - prodsum_psi_a_epi16(psi_r_p1_p3,a_r_p1_p3,psi_i_p1_p3,a_i_p1_p3,psi_a_p1_p3); - prodsum_psi_a_epi16(psi_r_p3_p1,a_r_p3_p1,psi_i_p3_p1,a_i_p3_p1,psi_a_p3_p1); - prodsum_psi_a_epi16(psi_r_p3_p3,a_r_p3_p3,psi_i_p3_p3,a_i_p3_p3,psi_a_p3_p3); - prodsum_psi_a_epi16(psi_r_p1_m1,a_r_p1_m1,psi_i_p1_m1,a_i_p1_m1,psi_a_p1_m1); - prodsum_psi_a_epi16(psi_r_p1_m3,a_r_p1_m3,psi_i_p1_m3,a_i_p1_m3,psi_a_p1_m3); - prodsum_psi_a_epi16(psi_r_p3_m1,a_r_p3_m1,psi_i_p3_m1,a_i_p3_m1,psi_a_p3_m1); - prodsum_psi_a_epi16(psi_r_p3_m3,a_r_p3_m3,psi_i_p3_m3,a_i_p3_m3,psi_a_p3_m3); - prodsum_psi_a_epi16(psi_r_m1_p1,a_r_m1_p1,psi_i_m1_p1,a_i_m1_p1,psi_a_m1_p1); - prodsum_psi_a_epi16(psi_r_m1_p3,a_r_m1_p3,psi_i_m1_p3,a_i_m1_p3,psi_a_m1_p3); - prodsum_psi_a_epi16(psi_r_m3_p1,a_r_m3_p1,psi_i_m3_p1,a_i_m3_p1,psi_a_m3_p1); - prodsum_psi_a_epi16(psi_r_m3_p3,a_r_m3_p3,psi_i_m3_p3,a_i_m3_p3,psi_a_m3_p3); - prodsum_psi_a_epi16(psi_r_m1_m1,a_r_m1_m1,psi_i_m1_m1,a_i_m1_m1,psi_a_m1_m1); - prodsum_psi_a_epi16(psi_r_m1_m3,a_r_m1_m3,psi_i_m1_m3,a_i_m1_m3,psi_a_m1_m3); - prodsum_psi_a_epi16(psi_r_m3_m1,a_r_m3_m1,psi_i_m3_m1,a_i_m3_m1,psi_a_m3_m1); - prodsum_psi_a_epi16(psi_r_m3_m3,a_r_m3_m3,psi_i_m3_m3,a_i_m3_m3,psi_a_m3_m3); - - // Multiply by sqrt(2) - psi_a_p1_p1 = _mm_mulhi_epi16(psi_a_p1_p1, ONE_OVER_SQRT_2); - psi_a_p1_p1 = _mm_slli_epi16(psi_a_p1_p1, 2); - psi_a_p1_p3 = _mm_mulhi_epi16(psi_a_p1_p3, ONE_OVER_SQRT_2); - psi_a_p1_p3 = _mm_slli_epi16(psi_a_p1_p3, 2); - psi_a_p3_p1 = _mm_mulhi_epi16(psi_a_p3_p1, ONE_OVER_SQRT_2); - psi_a_p3_p1 = _mm_slli_epi16(psi_a_p3_p1, 2); - psi_a_p3_p3 = _mm_mulhi_epi16(psi_a_p3_p3, ONE_OVER_SQRT_2); - psi_a_p3_p3 = _mm_slli_epi16(psi_a_p3_p3, 2); - psi_a_p1_m1 = _mm_mulhi_epi16(psi_a_p1_m1, ONE_OVER_SQRT_2); - psi_a_p1_m1 = _mm_slli_epi16(psi_a_p1_m1, 2); - psi_a_p1_m3 = _mm_mulhi_epi16(psi_a_p1_m3, ONE_OVER_SQRT_2); - psi_a_p1_m3 = _mm_slli_epi16(psi_a_p1_m3, 2); - psi_a_p3_m1 = _mm_mulhi_epi16(psi_a_p3_m1, ONE_OVER_SQRT_2); - psi_a_p3_m1 = _mm_slli_epi16(psi_a_p3_m1, 2); - psi_a_p3_m3 = _mm_mulhi_epi16(psi_a_p3_m3, ONE_OVER_SQRT_2); - psi_a_p3_m3 = _mm_slli_epi16(psi_a_p3_m3, 2); - psi_a_m1_p1 = _mm_mulhi_epi16(psi_a_m1_p1, ONE_OVER_SQRT_2); - psi_a_m1_p1 = _mm_slli_epi16(psi_a_m1_p1, 2); - psi_a_m1_p3 = _mm_mulhi_epi16(psi_a_m1_p3, ONE_OVER_SQRT_2); - psi_a_m1_p3 = _mm_slli_epi16(psi_a_m1_p3, 2); - psi_a_m3_p1 = _mm_mulhi_epi16(psi_a_m3_p1, ONE_OVER_SQRT_2); - psi_a_m3_p1 = _mm_slli_epi16(psi_a_m3_p1, 2); - psi_a_m3_p3 = _mm_mulhi_epi16(psi_a_m3_p3, ONE_OVER_SQRT_2); - psi_a_m3_p3 = _mm_slli_epi16(psi_a_m3_p3, 2); - psi_a_m1_m1 = _mm_mulhi_epi16(psi_a_m1_m1, ONE_OVER_SQRT_2); - psi_a_m1_m1 = _mm_slli_epi16(psi_a_m1_m1, 2); - psi_a_m1_m3 = _mm_mulhi_epi16(psi_a_m1_m3, ONE_OVER_SQRT_2); - psi_a_m1_m3 = _mm_slli_epi16(psi_a_m1_m3, 2); - psi_a_m3_m1 = _mm_mulhi_epi16(psi_a_m3_m1, ONE_OVER_SQRT_2); - psi_a_m3_m1 = _mm_slli_epi16(psi_a_m3_m1, 2); - psi_a_m3_m3 = _mm_mulhi_epi16(psi_a_m3_m3, ONE_OVER_SQRT_2); - psi_a_m3_m3 = _mm_slli_epi16(psi_a_m3_m3, 2); - - // squared interference magnitude times int. ch. power - square_a_64qam_epi16(a_r_p1_p1,a_i_p1_p1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p1_p1); - square_a_64qam_epi16(a_r_p1_p3,a_i_p1_p3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p1_p3); - square_a_64qam_epi16(a_r_p3_p1,a_i_p3_p1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p3_p1); - square_a_64qam_epi16(a_r_p3_p3,a_i_p3_p3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p3_p3); - square_a_64qam_epi16(a_r_p1_m1,a_i_p1_m1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p1_m1); - square_a_64qam_epi16(a_r_p1_m3,a_i_p1_m3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p1_m3); - square_a_64qam_epi16(a_r_p3_m1,a_i_p3_m1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p3_m1); - square_a_64qam_epi16(a_r_p3_m3,a_i_p3_m3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p3_m3); - square_a_64qam_epi16(a_r_m1_p1,a_i_m1_p1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m1_p1); - square_a_64qam_epi16(a_r_m1_p3,a_i_m1_p3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m1_p3); - square_a_64qam_epi16(a_r_m3_p1,a_i_m3_p1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m3_p1); - square_a_64qam_epi16(a_r_m3_p3,a_i_m3_p3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m3_p3); - square_a_64qam_epi16(a_r_m1_m1,a_i_m1_m1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m1_m1); - square_a_64qam_epi16(a_r_m1_m3,a_i_m1_m3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m1_m3); - square_a_64qam_epi16(a_r_m3_m1,a_i_m3_m1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m3_m1); - square_a_64qam_epi16(a_r_m3_m3,a_i_m3_m3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m3_m3); - - // Computing different multiples of channel norms - ch_mag_over_10=_mm_mulhi_epi16(ch_mag_des, ONE_OVER_TWO_SQRT_10); - ch_mag_over_2=_mm_mulhi_epi16(ch_mag_des, SQRT_10_OVER_FOUR); - ch_mag_over_2=_mm_slli_epi16(ch_mag_over_2, 1); - ch_mag_9_over_10=_mm_mulhi_epi16(ch_mag_des, NINE_OVER_TWO_SQRT_10); - ch_mag_9_over_10=_mm_slli_epi16(ch_mag_9_over_10, 2); - - // Computing Metrics - xmm0 = _mm_subs_epi16(psi_a_p1_p1,a_sq_p1_p1); - xmm1 = _mm_adds_epi16(xmm0,y0_p_1_1); - bit_met_p1_p1= _mm_subs_epi16(xmm1,ch_mag_over_10); - - xmm0 = _mm_subs_epi16(psi_a_p1_p3,a_sq_p1_p3); - xmm1 = _mm_adds_epi16(xmm0,y0_p_1_3); - bit_met_p1_p3= _mm_subs_epi16(xmm1,ch_mag_over_2); - - xmm0 = _mm_subs_epi16(psi_a_p1_m1,a_sq_p1_m1); - xmm1 = _mm_adds_epi16(xmm0,y0_m_1_1); - bit_met_p1_m1= _mm_subs_epi16(xmm1,ch_mag_over_10); - - xmm0 = _mm_subs_epi16(psi_a_p1_m3,a_sq_p1_m3); - xmm1 = _mm_adds_epi16(xmm0,y0_m_1_3); - bit_met_p1_m3= _mm_subs_epi16(xmm1,ch_mag_over_2); - - xmm0 = _mm_subs_epi16(psi_a_p3_p1,a_sq_p3_p1); - xmm1 = _mm_adds_epi16(xmm0,y0_p_3_1); - bit_met_p3_p1= _mm_subs_epi16(xmm1,ch_mag_over_2); - - xmm0 = _mm_subs_epi16(psi_a_p3_p3,a_sq_p3_p3); - xmm1 = _mm_adds_epi16(xmm0,y0_p_3_3); - bit_met_p3_p3= _mm_subs_epi16(xmm1,ch_mag_9_over_10); - - xmm0 = _mm_subs_epi16(psi_a_p3_m1,a_sq_p3_m1); - xmm1 = _mm_adds_epi16(xmm0,y0_m_3_1); - bit_met_p3_m1= _mm_subs_epi16(xmm1,ch_mag_over_2); - - xmm0 = _mm_subs_epi16(psi_a_p3_m3,a_sq_p3_m3); - xmm1 = _mm_adds_epi16(xmm0,y0_m_3_3); - bit_met_p3_m3= _mm_subs_epi16(xmm1,ch_mag_9_over_10); - - xmm0 = _mm_subs_epi16(psi_a_m1_p1,a_sq_m1_p1); - xmm1 = _mm_subs_epi16(xmm0,y0_m_1_1); - bit_met_m1_p1= _mm_subs_epi16(xmm1,ch_mag_over_10); - - xmm0 = _mm_subs_epi16(psi_a_m1_p3,a_sq_m1_p3); - xmm1 = _mm_subs_epi16(xmm0,y0_m_1_3); - bit_met_m1_p3= _mm_subs_epi16(xmm1,ch_mag_over_2); - - xmm0 = _mm_subs_epi16(psi_a_m1_m1,a_sq_m1_m1); - xmm1 = _mm_subs_epi16(xmm0,y0_p_1_1); - bit_met_m1_m1= _mm_subs_epi16(xmm1,ch_mag_over_10); - - xmm0 = _mm_subs_epi16(psi_a_m1_m3,a_sq_m1_m3); - xmm1 = _mm_subs_epi16(xmm0,y0_p_1_3); - bit_met_m1_m3= _mm_subs_epi16(xmm1,ch_mag_over_2); - - xmm0 = _mm_subs_epi16(psi_a_m3_p1,a_sq_m3_p1); - xmm1 = _mm_subs_epi16(xmm0,y0_m_3_1); - bit_met_m3_p1= _mm_subs_epi16(xmm1,ch_mag_over_2); - - xmm0 = _mm_subs_epi16(psi_a_m3_p3,a_sq_m3_p3); - xmm1 = _mm_subs_epi16(xmm0,y0_m_3_3); - bit_met_m3_p3= _mm_subs_epi16(xmm1,ch_mag_9_over_10); - - xmm0 = _mm_subs_epi16(psi_a_m3_m1,a_sq_m3_m1); - xmm1 = _mm_subs_epi16(xmm0,y0_p_3_1); - bit_met_m3_m1= _mm_subs_epi16(xmm1,ch_mag_over_2); - - xmm0 = _mm_subs_epi16(psi_a_m3_m3,a_sq_m3_m3); - xmm1 = _mm_subs_epi16(xmm0,y0_p_3_3); - bit_met_m3_m3= _mm_subs_epi16(xmm1,ch_mag_9_over_10); - - // LLR of the first bit - // Bit = 1 - xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3); - xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3); - xmm2 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_num_re0= _mm_max_epi16(xmm4,xmm5); - - // Bit = 0 - xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3); - xmm1 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3); - xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4,xmm5); - - // LLR of first bit [L1(1), L1(2), L1(3), L1(4), L1(5), L1(6), L1(7), L1(8)] - y0r = _mm_subs_epi16(logmax_den_re0,logmax_num_re0); - - // LLR of the second bit - // Bit = 1 - xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1); - xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1); - xmm2 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3); - xmm3 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_num_re1 = _mm_max_epi16(xmm4,xmm5); - - // Bit = 0 - xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1); - xmm1 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1); - xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_den_re1 = _mm_max_epi16(xmm4,xmm5); - - // LLR of second bit [L2(1), L2(2), L2(3), L2(4)] - y1r = _mm_subs_epi16(logmax_den_re1,logmax_num_re1); - - // LLR of the third bit - // Bit = 1 - xmm0 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3); - xmm1 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3); - xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_num_im0 = _mm_max_epi16(xmm4,xmm5); - - // Bit = 0 - xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3); - xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3); - xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3); - xmm3 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_den_im0 = _mm_max_epi16(xmm4,xmm5); - - // LLR of third bit [L3(1), L3(2), L3(3), L3(4)] - y0i = _mm_subs_epi16(logmax_den_im0,logmax_num_im0); - - // LLR of the fourth bit - // Bit = 1 - xmm0 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3); - xmm1 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3); - xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_num_im1 = _mm_max_epi16(xmm4,xmm5); - - // Bit = 0 - xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1); - xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1); - xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1); - xmm3 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1); - xmm4 = _mm_max_epi16(xmm0,xmm1); - xmm5 = _mm_max_epi16(xmm2,xmm3); - logmax_den_im1 = _mm_max_epi16(xmm4,xmm5); - - // LLR of fourth bit [L4(1), L4(2), L4(3), L4(4)] - y1i = _mm_subs_epi16(logmax_den_im1,logmax_num_im1); - - // Pack LLRs in output - // [L1(1), L2(1), L1(2), L2(2), L1(3), L2(3), L1(4), L2(4)] - xmm0 = _mm_unpacklo_epi16(y0r,y1r); - // [L1(5), L2(5), L1(6), L2(6), L1(7), L2(7), L1(8), L2(8)] - xmm1 = _mm_unpackhi_epi16(y0r,y1r); - // [L3(1), L4(1), L3(2), L4(2), L3(3), L4(3), L3(4), L4(4)] - xmm2 = _mm_unpacklo_epi16(y0i,y1i); - // [L3(5), L4(5), L3(6), L4(6), L3(7), L4(7), L3(8), L4(8)] - xmm3 = _mm_unpackhi_epi16(y0i,y1i); - - stream0_128i_out[2*i+0] = _mm_unpacklo_epi32(xmm0,xmm2); // 8LLRs, 2REs - stream0_128i_out[2*i+1] = _mm_unpackhi_epi32(xmm0,xmm2); - stream0_128i_out[2*i+2] = _mm_unpacklo_epi32(xmm1,xmm3); - stream0_128i_out[2*i+3] = _mm_unpackhi_epi32(xmm1,xmm3); -#elif defined(__arm__) - -#endif - - } - -#if defined(__x86_64__) || defined(__i386__) - _mm_empty(); - _m_empty(); -#endif -} - -int dlsch_16qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, - int32_t **rxdataF_comp, - int32_t **rxdataF_comp_i, - int32_t **dl_ch_mag, //|h_0|^2*(2/sqrt{10}) - int32_t **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10}) - int32_t **rho_i, - int16_t *dlsch_llr, - uint8_t symbol, - uint8_t first_symbol_flag, - uint16_t nb_rb, - uint16_t pbch_pss_sss_adjust, - int16_t **llr16p) -{ - - int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *llr16; - int len; - uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; - - // first symbol has different structure due to more pilots - if (first_symbol_flag == 1) { - llr16 = (int16_t*)dlsch_llr; - } else { - llr16 = (int16_t*)(*llr16p); - } - - - AssertFatal(llr16!=NULL,"dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol); - - - if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { - // if symbol has pilots - if (frame_parms->nb_antenna_ports_eNB!=1) - // in 2 antenna ports we have 8 REs per symbol per RB - len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); - else - // for 1 antenna port we have 10 REs per symbol per RB - len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); - } else { - // symbol has no pilots - len = (nb_rb*12) - pbch_pss_sss_adjust; - } - - // printf("symbol %d: qam16_llr, len %d (llr16 %p)\n",symbol,len,llr16); - - qam16_qam64((short *)rxF, - (short *)rxF_i, - (short *)ch_mag, - (short *)ch_mag_i, - (short *)llr16, - (short *)rho, - len); - - llr16 += (len<<2); - *llr16p = (short *)llr16; - - return(0); -} - -//---------------------------------------------------------------------------------------------- -// 64-QAM -//---------------------------------------------------------------------------------------------- - -/* -__m128i ONE_OVER_SQRT_42 __attribute__((aligned(16))); -__m128i THREE_OVER_SQRT_42 __attribute__((aligned(16))); -__m128i FIVE_OVER_SQRT_42 __attribute__((aligned(16))); -__m128i SEVEN_OVER_SQRT_42 __attribute__((aligned(16))); - -__m128i FORTYNINE_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); -__m128i THIRTYSEVEN_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); -__m128i TWENTYNINE_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); -__m128i TWENTYFIVE_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); -__m128i SEVENTEEN_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); -__m128i NINE_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); -__m128i THIRTEEN_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); -__m128i FIVE_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); -__m128i ONE_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); - -__m128i y0r_one_over_sqrt_21 __attribute__((aligned(16))); -__m128i y0r_three_over_sqrt_21 __attribute__((aligned(16))); -__m128i y0r_five_over_sqrt_21 __attribute__((aligned(16))); -__m128i y0r_seven_over_sqrt_21 __attribute__((aligned(16))); -__m128i y0i_one_over_sqrt_21 __attribute__((aligned(16))); -__m128i y0i_three_over_sqrt_21 __attribute__((aligned(16))); -__m128i y0i_five_over_sqrt_21 __attribute__((aligned(16))); -__m128i y0i_seven_over_sqrt_21 __attribute__((aligned(16))); - -__m128i ch_mag_98_over_42_with_sigma2 __attribute__((aligned(16))); -__m128i ch_mag_74_over_42_with_sigma2 __attribute__((aligned(16))); -__m128i ch_mag_58_over_42_with_sigma2 __attribute__((aligned(16))); -__m128i ch_mag_50_over_42_with_sigma2 __attribute__((aligned(16))); -__m128i ch_mag_34_over_42_with_sigma2 __attribute__((aligned(16))); -__m128i ch_mag_18_over_42_with_sigma2 __attribute__((aligned(16))); -__m128i ch_mag_26_over_42_with_sigma2 __attribute__((aligned(16))); -__m128i ch_mag_10_over_42_with_sigma2 __attribute__((aligned(16))); -__m128i ch_mag_2_over_42_with_sigma2 __attribute__((aligned(16))); - -*/ - -void qam64_qpsk(int16_t *stream0_in, - int16_t *stream1_in, - int16_t *ch_mag, - int16_t *stream0_out, - int16_t *rho01, - int32_t length - ) -{ - - /* - Author: S. Wagner - Date: 31-07-12 - - Input: - stream0_in: MF filter for 1st stream, i.e., y0=h0'*y - stream1_in: MF filter for 2nd stream, i.e., y1=h1'*y - ch_mag: 4*h0/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc - ch_mag_i: 4*h1/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc - rho01: Channel cross correlation, i.e., h1'*h0 - - Output: - stream0_out: output LLRs for 1st stream - */ - -#if defined(__x86_64__) || defined(__i386__) - __m128i *rho01_128i = (__m128i *)rho01; - __m128i *stream0_128i_in = (__m128i *)stream0_in; - __m128i *stream1_128i_in = (__m128i *)stream1_in; - __m128i *ch_mag_128i = (__m128i *)ch_mag; - - - __m128i ONE_OVER_SQRT_42 = _mm_set1_epi16(10112); // round(1/sqrt(42)*2^16) - __m128i THREE_OVER_SQRT_42 = _mm_set1_epi16(30337); // round(3/sqrt(42)*2^16) - __m128i FIVE_OVER_SQRT_42 = _mm_set1_epi16(25281); // round(5/sqrt(42)*2^15) - __m128i SEVEN_OVER_SQRT_42 = _mm_set1_epi16(17697); // round(5/sqrt(42)*2^15) - __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15) - __m128i FORTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(30969); // round(49/(4*sqrt(42))*2^14), Q2.14 - __m128i THIRTYSEVEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(23385); // round(37/(4*sqrt(42))*2^14), Q2.14 - __m128i TWENTYFIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(31601); // round(25/(4*sqrt(42))*2^15) - __m128i TWENTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(18329); // round(29/(4*sqrt(42))*2^15), Q2.14 - __m128i SEVENTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(21489); // round(17/(4*sqrt(42))*2^15) - __m128i NINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(11376); // round(9/(4*sqrt(42))*2^15) - __m128i THIRTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(16433); // round(13/(4*sqrt(42))*2^15) - __m128i FIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(6320); // round(5/(4*sqrt(42))*2^15) - __m128i ONE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(1264); // round(1/(4*sqrt(42))*2^15) - - - __m128i ch_mag_des; - __m128i ch_mag_98_over_42_with_sigma2; - __m128i ch_mag_74_over_42_with_sigma2; - __m128i ch_mag_58_over_42_with_sigma2; - __m128i ch_mag_50_over_42_with_sigma2; - __m128i ch_mag_34_over_42_with_sigma2; - __m128i ch_mag_18_over_42_with_sigma2; - __m128i ch_mag_26_over_42_with_sigma2; - __m128i ch_mag_10_over_42_with_sigma2; - __m128i ch_mag_2_over_42_with_sigma2; - __m128i y0r_one_over_sqrt_21; - __m128i y0r_three_over_sqrt_21; - __m128i y0r_five_over_sqrt_21; - __m128i y0r_seven_over_sqrt_21; - __m128i y0i_one_over_sqrt_21; - __m128i y0i_three_over_sqrt_21; - __m128i y0i_five_over_sqrt_21; - __m128i y0i_seven_over_sqrt_21; -#elif defined(__arm__) - -#endif - - int i,j; - - for (i=0; i<length>>2; i+=2) { - -#if defined(__x86_64) || defined(__i386__) - // Get rho - xmm0 = rho01_128i[i]; - xmm1 = rho01_128i[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) - xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) - rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) - rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) - - // Compute the different rhos - rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42); - rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42); - rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42); - rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42); - rho_rpi_5_5 = _mm_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42); - rho_rmi_5_5 = _mm_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42); - rho_rpi_7_7 = _mm_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42); - rho_rmi_7_7 = _mm_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42); - - rho_rpi_5_5 = _mm_slli_epi16(rho_rpi_5_5, 1); - rho_rmi_5_5 = _mm_slli_epi16(rho_rmi_5_5, 1); - rho_rpi_7_7 = _mm_slli_epi16(rho_rpi_7_7, 2); - rho_rmi_7_7 = _mm_slli_epi16(rho_rmi_7_7, 2); - - xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_42); - xmm5 = _mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_42); - xmm6 = _mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_42); - xmm7 = _mm_mulhi_epi16(xmm3, FIVE_OVER_SQRT_42); - xmm8 = _mm_mulhi_epi16(xmm3, SEVEN_OVER_SQRT_42); - xmm7 = _mm_slli_epi16(xmm7, 1); - xmm8 = _mm_slli_epi16(xmm8, 2); - - rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm6); - rho_rmi_1_3 = _mm_subs_epi16(xmm4, xmm6); - rho_rpi_1_5 = _mm_adds_epi16(xmm4, xmm7); - rho_rmi_1_5 = _mm_subs_epi16(xmm4, xmm7); - rho_rpi_1_7 = _mm_adds_epi16(xmm4, xmm8); - rho_rmi_1_7 = _mm_subs_epi16(xmm4, xmm8); - - xmm4 = _mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_42); - rho_rpi_3_1 = _mm_adds_epi16(xmm4, xmm5); - rho_rmi_3_1 = _mm_subs_epi16(xmm4, xmm5); - rho_rpi_3_5 = _mm_adds_epi16(xmm4, xmm7); - rho_rmi_3_5 = _mm_subs_epi16(xmm4, xmm7); - rho_rpi_3_7 = _mm_adds_epi16(xmm4, xmm8); - rho_rmi_3_7 = _mm_subs_epi16(xmm4, xmm8); - - xmm4 = _mm_mulhi_epi16(xmm2, FIVE_OVER_SQRT_42); - xmm4 = _mm_slli_epi16(xmm4, 1); - rho_rpi_5_1 = _mm_adds_epi16(xmm4, xmm5); - rho_rmi_5_1 = _mm_subs_epi16(xmm4, xmm5); - rho_rpi_5_3 = _mm_adds_epi16(xmm4, xmm6); - rho_rmi_5_3 = _mm_subs_epi16(xmm4, xmm6); - rho_rpi_5_7 = _mm_adds_epi16(xmm4, xmm8); - rho_rmi_5_7 = _mm_subs_epi16(xmm4, xmm8); - - xmm4 = _mm_mulhi_epi16(xmm2, SEVEN_OVER_SQRT_42); - xmm4 = _mm_slli_epi16(xmm4, 2); - rho_rpi_7_1 = _mm_adds_epi16(xmm4, xmm5); - rho_rmi_7_1 = _mm_subs_epi16(xmm4, xmm5); - rho_rpi_7_3 = _mm_adds_epi16(xmm4, xmm6); - rho_rmi_7_3 = _mm_subs_epi16(xmm4, xmm6); - rho_rpi_7_5 = _mm_adds_epi16(xmm4, xmm7); - rho_rmi_7_5 = _mm_subs_epi16(xmm4, xmm7); - - // Rearrange interfering MF output - xmm0 = stream1_128i_in[i]; - xmm1 = stream1_128i_in[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] - y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] - - // Psi_r calculation from rho_rpi or rho_rmi - xmm0 = _mm_setzero_si128(); // ZERO for abs_pi16 - xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1r); - psi_r_p7_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1r); - psi_r_p7_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1r); - psi_r_p7_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1r); - psi_r_p7_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1r); - psi_r_p7_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1r); - psi_r_p7_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1r); - psi_r_p7_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1r); - psi_r_p7_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1r); - psi_r_p5_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1r); - psi_r_p5_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1r); - psi_r_p5_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1r); - psi_r_p5_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1r); - psi_r_p5_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1r); - psi_r_p5_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1r); - psi_r_p5_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1r); - psi_r_p5_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1r); - psi_r_p3_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1r); - psi_r_p3_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1r); - psi_r_p3_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1r); - psi_r_p3_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1r); - psi_r_p3_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1r); - psi_r_p3_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1r); - psi_r_p3_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1r); - psi_r_p3_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1r); - psi_r_p1_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1r); - psi_r_p1_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1r); - psi_r_p1_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1r); - psi_r_p1_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1r); - psi_r_p1_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1r); - psi_r_p1_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1r); - psi_r_p1_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1r); - psi_r_p1_m7 = _mm_abs_epi16(xmm2); - - xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1r); - psi_r_m1_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1r); - psi_r_m1_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1r); - psi_r_m1_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1r); - psi_r_m1_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1r); - psi_r_m1_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1r); - psi_r_m1_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1r); - psi_r_m1_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1r); - psi_r_m1_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1r); - psi_r_m3_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1r); - psi_r_m3_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1r); - psi_r_m3_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1r); - psi_r_m3_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1r); - psi_r_m3_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1r); - psi_r_m3_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1r); - psi_r_m3_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1r); - psi_r_m3_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1r); - psi_r_m5_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1r); - psi_r_m5_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1r); - psi_r_m5_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1r); - psi_r_m5_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1r); - psi_r_m5_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1r); - psi_r_m5_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1r); - psi_r_m5_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1r); - psi_r_m5_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1r); - psi_r_m7_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1r); - psi_r_m7_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1r); - psi_r_m7_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1r); - psi_r_m7_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1r); - psi_r_m7_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1r); - psi_r_m7_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1r); - psi_r_m7_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1r); - psi_r_m7_m7 = _mm_abs_epi16(xmm2); - - // Psi_i calculation from rho_rpi or rho_rmi - xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1i); - psi_i_p7_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1i); - psi_i_p7_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1i); - psi_i_p7_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1i); - psi_i_p7_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1i); - psi_i_p7_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1i); - psi_i_p7_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1i); - psi_i_p7_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1i); - psi_i_p7_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1i); - psi_i_p5_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1i); - psi_i_p5_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1i); - psi_i_p5_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1i); - psi_i_p5_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1i); - psi_i_p5_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1i); - psi_i_p5_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1i); - psi_i_p5_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1i); - psi_i_p5_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1i); - psi_i_p3_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1i); - psi_i_p3_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1i); - psi_i_p3_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1i); - psi_i_p3_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1i); - psi_i_p3_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1i); - psi_i_p3_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1i); - psi_i_p3_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1i); - psi_i_p3_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1i); - psi_i_p1_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1i); - psi_i_p1_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1i); - psi_i_p1_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1i); - psi_i_p1_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1i); - psi_i_p1_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1i); - psi_i_p1_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1i); - psi_i_p1_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1i); - psi_i_p1_m7 = _mm_abs_epi16(xmm2); - - xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1i); - psi_i_m1_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1i); - psi_i_m1_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1i); - psi_i_m1_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1i); - psi_i_m1_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1i); - psi_i_m1_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1i); - psi_i_m1_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1i); - psi_i_m1_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1i); - psi_i_m1_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1i); - psi_i_m3_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1i); - psi_i_m3_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1i); - psi_i_m3_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1i); - psi_i_m3_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1i); - psi_i_m3_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1i); - psi_i_m3_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1i); - psi_i_m3_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1i); - psi_i_m3_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1i); - psi_i_m5_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1i); - psi_i_m5_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1i); - psi_i_m5_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1i); - psi_i_m5_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1i); - psi_i_m5_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1i); - psi_i_m5_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1i); - psi_i_m5_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1i); - psi_i_m5_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1i); - psi_i_m7_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1i); - psi_i_m7_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1i); - psi_i_m7_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1i); - psi_i_m7_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1i); - psi_i_m7_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1i); - psi_i_m7_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1i); - psi_i_m7_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1i); - psi_i_m7_m7 = _mm_abs_epi16(xmm2); - - - // Rearrange desired MF output - xmm0 = stream0_128i_in[i]; - xmm1 = stream0_128i_in[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] - y0i = _mm_unpackhi_epi64(xmm0,xmm1); - - // Rearrange desired channel magnitudes - xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10)) - xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10)) - xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); - - y0r_one_over_sqrt_21 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_42); - y0r_three_over_sqrt_21 = _mm_mulhi_epi16(y0r, THREE_OVER_SQRT_42); - y0r_five_over_sqrt_21 = _mm_mulhi_epi16(y0r, FIVE_OVER_SQRT_42); - y0r_five_over_sqrt_21 = _mm_slli_epi16(y0r_five_over_sqrt_21, 1); - y0r_seven_over_sqrt_21 = _mm_mulhi_epi16(y0r, SEVEN_OVER_SQRT_42); - y0r_seven_over_sqrt_21 = _mm_slli_epi16(y0r_seven_over_sqrt_21, 2); // Q2.14 - - y0i_one_over_sqrt_21 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_42); - y0i_three_over_sqrt_21 = _mm_mulhi_epi16(y0i, THREE_OVER_SQRT_42); - y0i_five_over_sqrt_21 = _mm_mulhi_epi16(y0i, FIVE_OVER_SQRT_42); - y0i_five_over_sqrt_21 = _mm_slli_epi16(y0i_five_over_sqrt_21, 1); - y0i_seven_over_sqrt_21 = _mm_mulhi_epi16(y0i, SEVEN_OVER_SQRT_42); - y0i_seven_over_sqrt_21 = _mm_slli_epi16(y0i_seven_over_sqrt_21, 2); // Q2.14 - - y0_p_7_1 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_7_3 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_7_5 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_7_7 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_p_5_1 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_5_3 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_5_5 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_5_7 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_3_5 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_3_7 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_p_1_1 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_1_3 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_1_5 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_1_7 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); - - y0_m_1_1 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_1_3 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_1_5 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_1_7 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_3_5 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_3_7 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_m_5_1 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_5_3 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_5_5 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_5_7 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_m_7_1 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_7_3 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_7_5 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_7_7 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); - - // divide by sqrt(2) - psi_r_p7_p7 = _mm_mulhi_epi16(psi_r_p7_p7, ONE_OVER_SQRT_2); - psi_r_p7_p7 = _mm_slli_epi16(psi_r_p7_p7, 1); - psi_r_p7_p5 = _mm_mulhi_epi16(psi_r_p7_p5, ONE_OVER_SQRT_2); - psi_r_p7_p5 = _mm_slli_epi16(psi_r_p7_p5, 1); - psi_r_p7_p3 = _mm_mulhi_epi16(psi_r_p7_p3, ONE_OVER_SQRT_2); - psi_r_p7_p3 = _mm_slli_epi16(psi_r_p7_p3, 1); - psi_r_p7_p1 = _mm_mulhi_epi16(psi_r_p7_p1, ONE_OVER_SQRT_2); - psi_r_p7_p1 = _mm_slli_epi16(psi_r_p7_p1, 1); - psi_r_p7_m1 = _mm_mulhi_epi16(psi_r_p7_m1, ONE_OVER_SQRT_2); - psi_r_p7_m1 = _mm_slli_epi16(psi_r_p7_m1, 1); - psi_r_p7_m3 = _mm_mulhi_epi16(psi_r_p7_m3, ONE_OVER_SQRT_2); - psi_r_p7_m3 = _mm_slli_epi16(psi_r_p7_m3, 1); - psi_r_p7_m5 = _mm_mulhi_epi16(psi_r_p7_m5, ONE_OVER_SQRT_2); - psi_r_p7_m5 = _mm_slli_epi16(psi_r_p7_m5, 1); - psi_r_p7_m7 = _mm_mulhi_epi16(psi_r_p7_m7, ONE_OVER_SQRT_2); - psi_r_p7_m7 = _mm_slli_epi16(psi_r_p7_m7, 1); - psi_r_p5_p7 = _mm_mulhi_epi16(psi_r_p5_p7, ONE_OVER_SQRT_2); - psi_r_p5_p7 = _mm_slli_epi16(psi_r_p5_p7, 1); - psi_r_p5_p5 = _mm_mulhi_epi16(psi_r_p5_p5, ONE_OVER_SQRT_2); - psi_r_p5_p5 = _mm_slli_epi16(psi_r_p5_p5, 1); - psi_r_p5_p3 = _mm_mulhi_epi16(psi_r_p5_p3, ONE_OVER_SQRT_2); - psi_r_p5_p3 = _mm_slli_epi16(psi_r_p5_p3, 1); - psi_r_p5_p1 = _mm_mulhi_epi16(psi_r_p5_p1, ONE_OVER_SQRT_2); - psi_r_p5_p1 = _mm_slli_epi16(psi_r_p5_p1, 1); - psi_r_p5_m1 = _mm_mulhi_epi16(psi_r_p5_m1, ONE_OVER_SQRT_2); - psi_r_p5_m1 = _mm_slli_epi16(psi_r_p5_m1, 1); - psi_r_p5_m3 = _mm_mulhi_epi16(psi_r_p5_m3, ONE_OVER_SQRT_2); - psi_r_p5_m3 = _mm_slli_epi16(psi_r_p5_m3, 1); - psi_r_p5_m5 = _mm_mulhi_epi16(psi_r_p5_m5, ONE_OVER_SQRT_2); - psi_r_p5_m5 = _mm_slli_epi16(psi_r_p5_m5, 1); - psi_r_p5_m7 = _mm_mulhi_epi16(psi_r_p5_m7, ONE_OVER_SQRT_2); - psi_r_p5_m7 = _mm_slli_epi16(psi_r_p5_m7, 1); - psi_r_p3_p7 = _mm_mulhi_epi16(psi_r_p3_p7, ONE_OVER_SQRT_2); - psi_r_p3_p7 = _mm_slli_epi16(psi_r_p3_p7, 1); - psi_r_p3_p5 = _mm_mulhi_epi16(psi_r_p3_p5, ONE_OVER_SQRT_2); - psi_r_p3_p5 = _mm_slli_epi16(psi_r_p3_p5, 1); - psi_r_p3_p3 = _mm_mulhi_epi16(psi_r_p3_p3, ONE_OVER_SQRT_2); - psi_r_p3_p3 = _mm_slli_epi16(psi_r_p3_p3, 1); - psi_r_p3_p1 = _mm_mulhi_epi16(psi_r_p3_p1, ONE_OVER_SQRT_2); - psi_r_p3_p1 = _mm_slli_epi16(psi_r_p3_p1, 1); - psi_r_p3_m1 = _mm_mulhi_epi16(psi_r_p3_m1, ONE_OVER_SQRT_2); - psi_r_p3_m1 = _mm_slli_epi16(psi_r_p3_m1, 1); - psi_r_p3_m3 = _mm_mulhi_epi16(psi_r_p3_m3, ONE_OVER_SQRT_2); - psi_r_p3_m3 = _mm_slli_epi16(psi_r_p3_m3, 1); - psi_r_p3_m5 = _mm_mulhi_epi16(psi_r_p3_m5, ONE_OVER_SQRT_2); - psi_r_p3_m5 = _mm_slli_epi16(psi_r_p3_m5, 1); - psi_r_p3_m7 = _mm_mulhi_epi16(psi_r_p3_m7, ONE_OVER_SQRT_2); - psi_r_p3_m7 = _mm_slli_epi16(psi_r_p3_m7, 1); - psi_r_p1_p7 = _mm_mulhi_epi16(psi_r_p1_p7, ONE_OVER_SQRT_2); - psi_r_p1_p7 = _mm_slli_epi16(psi_r_p1_p7, 1); - psi_r_p1_p5 = _mm_mulhi_epi16(psi_r_p1_p5, ONE_OVER_SQRT_2); - psi_r_p1_p5 = _mm_slli_epi16(psi_r_p1_p5, 1); - psi_r_p1_p3 = _mm_mulhi_epi16(psi_r_p1_p3, ONE_OVER_SQRT_2); - psi_r_p1_p3 = _mm_slli_epi16(psi_r_p1_p3, 1); - psi_r_p1_p1 = _mm_mulhi_epi16(psi_r_p1_p1, ONE_OVER_SQRT_2); - psi_r_p1_p1 = _mm_slli_epi16(psi_r_p1_p1, 1); - psi_r_p1_m1 = _mm_mulhi_epi16(psi_r_p1_m1, ONE_OVER_SQRT_2); - psi_r_p1_m1 = _mm_slli_epi16(psi_r_p1_m1, 1); - psi_r_p1_m3 = _mm_mulhi_epi16(psi_r_p1_m3, ONE_OVER_SQRT_2); - psi_r_p1_m3 = _mm_slli_epi16(psi_r_p1_m3, 1); - psi_r_p1_m5 = _mm_mulhi_epi16(psi_r_p1_m5, ONE_OVER_SQRT_2); - psi_r_p1_m5 = _mm_slli_epi16(psi_r_p1_m5, 1); - psi_r_p1_m7 = _mm_mulhi_epi16(psi_r_p1_m7, ONE_OVER_SQRT_2); - psi_r_p1_m7 = _mm_slli_epi16(psi_r_p1_m7, 1); - psi_r_m1_p7 = _mm_mulhi_epi16(psi_r_m1_p7, ONE_OVER_SQRT_2); - psi_r_m1_p7 = _mm_slli_epi16(psi_r_m1_p7, 1); - psi_r_m1_p5 = _mm_mulhi_epi16(psi_r_m1_p5, ONE_OVER_SQRT_2); - psi_r_m1_p5 = _mm_slli_epi16(psi_r_m1_p5, 1); - psi_r_m1_p3 = _mm_mulhi_epi16(psi_r_m1_p3, ONE_OVER_SQRT_2); - psi_r_m1_p3 = _mm_slli_epi16(psi_r_m1_p3, 1); - psi_r_m1_p1 = _mm_mulhi_epi16(psi_r_m1_p1, ONE_OVER_SQRT_2); - psi_r_m1_p1 = _mm_slli_epi16(psi_r_m1_p1, 1); - psi_r_m1_m1 = _mm_mulhi_epi16(psi_r_m1_m1, ONE_OVER_SQRT_2); - psi_r_m1_m1 = _mm_slli_epi16(psi_r_m1_m1, 1); - psi_r_m1_m3 = _mm_mulhi_epi16(psi_r_m1_m3, ONE_OVER_SQRT_2); - psi_r_m1_m3 = _mm_slli_epi16(psi_r_m1_m3, 1); - psi_r_m1_m5 = _mm_mulhi_epi16(psi_r_m1_m5, ONE_OVER_SQRT_2); - psi_r_m1_m5 = _mm_slli_epi16(psi_r_m1_m5, 1); - psi_r_m1_m7 = _mm_mulhi_epi16(psi_r_m1_m7, ONE_OVER_SQRT_2); - psi_r_m1_m7 = _mm_slli_epi16(psi_r_m1_m7, 1); - psi_r_m3_p7 = _mm_mulhi_epi16(psi_r_m3_p7, ONE_OVER_SQRT_2); - psi_r_m3_p7 = _mm_slli_epi16(psi_r_m3_p7, 1); - psi_r_m3_p5 = _mm_mulhi_epi16(psi_r_m3_p5, ONE_OVER_SQRT_2); - psi_r_m3_p5 = _mm_slli_epi16(psi_r_m3_p5, 1); - psi_r_m3_p3 = _mm_mulhi_epi16(psi_r_m3_p3, ONE_OVER_SQRT_2); - psi_r_m3_p3 = _mm_slli_epi16(psi_r_m3_p3, 1); - psi_r_m3_p1 = _mm_mulhi_epi16(psi_r_m3_p1, ONE_OVER_SQRT_2); - psi_r_m3_p1 = _mm_slli_epi16(psi_r_m3_p1, 1); - psi_r_m3_m1 = _mm_mulhi_epi16(psi_r_m3_m1, ONE_OVER_SQRT_2); - psi_r_m3_m1 = _mm_slli_epi16(psi_r_m3_m1, 1); - psi_r_m3_m3 = _mm_mulhi_epi16(psi_r_m3_m3, ONE_OVER_SQRT_2); - psi_r_m3_m3 = _mm_slli_epi16(psi_r_m3_m3, 1); - psi_r_m3_m5 = _mm_mulhi_epi16(psi_r_m3_m5, ONE_OVER_SQRT_2); - psi_r_m3_m5 = _mm_slli_epi16(psi_r_m3_m5, 1); - psi_r_m3_m7 = _mm_mulhi_epi16(psi_r_m3_m7, ONE_OVER_SQRT_2); - psi_r_m3_m7 = _mm_slli_epi16(psi_r_m3_m7, 1); - psi_r_m5_p7 = _mm_mulhi_epi16(psi_r_m5_p7, ONE_OVER_SQRT_2); - psi_r_m5_p7 = _mm_slli_epi16(psi_r_m5_p7, 1); - psi_r_m5_p5 = _mm_mulhi_epi16(psi_r_m5_p5, ONE_OVER_SQRT_2); - psi_r_m5_p5 = _mm_slli_epi16(psi_r_m5_p5, 1); - psi_r_m5_p3 = _mm_mulhi_epi16(psi_r_m5_p3, ONE_OVER_SQRT_2); - psi_r_m5_p3 = _mm_slli_epi16(psi_r_m5_p3, 1); - psi_r_m5_p1 = _mm_mulhi_epi16(psi_r_m5_p1, ONE_OVER_SQRT_2); - psi_r_m5_p1 = _mm_slli_epi16(psi_r_m5_p1, 1); - psi_r_m5_m1 = _mm_mulhi_epi16(psi_r_m5_m1, ONE_OVER_SQRT_2); - psi_r_m5_m1 = _mm_slli_epi16(psi_r_m5_m1, 1); - psi_r_m5_m3 = _mm_mulhi_epi16(psi_r_m5_m3, ONE_OVER_SQRT_2); - psi_r_m5_m3 = _mm_slli_epi16(psi_r_m5_m3, 1); - psi_r_m5_m5 = _mm_mulhi_epi16(psi_r_m5_m5, ONE_OVER_SQRT_2); - psi_r_m5_m5 = _mm_slli_epi16(psi_r_m5_m5, 1); - psi_r_m5_m7 = _mm_mulhi_epi16(psi_r_m5_m7, ONE_OVER_SQRT_2); - psi_r_m5_m7 = _mm_slli_epi16(psi_r_m5_m7, 1); - psi_r_m7_p7 = _mm_mulhi_epi16(psi_r_m7_p7, ONE_OVER_SQRT_2); - psi_r_m7_p7 = _mm_slli_epi16(psi_r_m7_p7, 1); - psi_r_m7_p5 = _mm_mulhi_epi16(psi_r_m7_p5, ONE_OVER_SQRT_2); - psi_r_m7_p5 = _mm_slli_epi16(psi_r_m7_p5, 1); - psi_r_m7_p3 = _mm_mulhi_epi16(psi_r_m7_p3, ONE_OVER_SQRT_2); - psi_r_m7_p3 = _mm_slli_epi16(psi_r_m7_p3, 1); - psi_r_m7_p1 = _mm_mulhi_epi16(psi_r_m7_p1, ONE_OVER_SQRT_2); - psi_r_m7_p1 = _mm_slli_epi16(psi_r_m7_p1, 1); - psi_r_m7_m1 = _mm_mulhi_epi16(psi_r_m7_m1, ONE_OVER_SQRT_2); - psi_r_m7_m1 = _mm_slli_epi16(psi_r_m7_m1, 1); - psi_r_m7_m3 = _mm_mulhi_epi16(psi_r_m7_m3, ONE_OVER_SQRT_2); - psi_r_m7_m3 = _mm_slli_epi16(psi_r_m7_m3, 1); - psi_r_m7_m5 = _mm_mulhi_epi16(psi_r_m7_m5, ONE_OVER_SQRT_2); - psi_r_m7_m5 = _mm_slli_epi16(psi_r_m7_m5, 1); - psi_r_m7_m7 = _mm_mulhi_epi16(psi_r_m7_m7, ONE_OVER_SQRT_2); - psi_r_m7_m7 = _mm_slli_epi16(psi_r_m7_m7, 1); - - psi_i_p7_p7 = _mm_mulhi_epi16(psi_i_p7_p7, ONE_OVER_SQRT_2); - psi_i_p7_p7 = _mm_slli_epi16(psi_i_p7_p7, 1); - psi_i_p7_p5 = _mm_mulhi_epi16(psi_i_p7_p5, ONE_OVER_SQRT_2); - psi_i_p7_p5 = _mm_slli_epi16(psi_i_p7_p5, 1); - psi_i_p7_p3 = _mm_mulhi_epi16(psi_i_p7_p3, ONE_OVER_SQRT_2); - psi_i_p7_p3 = _mm_slli_epi16(psi_i_p7_p3, 1); - psi_i_p7_p1 = _mm_mulhi_epi16(psi_i_p7_p1, ONE_OVER_SQRT_2); - psi_i_p7_p1 = _mm_slli_epi16(psi_i_p7_p1, 1); - psi_i_p7_m1 = _mm_mulhi_epi16(psi_i_p7_m1, ONE_OVER_SQRT_2); - psi_i_p7_m1 = _mm_slli_epi16(psi_i_p7_m1, 1); - psi_i_p7_m3 = _mm_mulhi_epi16(psi_i_p7_m3, ONE_OVER_SQRT_2); - psi_i_p7_m3 = _mm_slli_epi16(psi_i_p7_m3, 1); - psi_i_p7_m5 = _mm_mulhi_epi16(psi_i_p7_m5, ONE_OVER_SQRT_2); - psi_i_p7_m5 = _mm_slli_epi16(psi_i_p7_m5, 1); - psi_i_p7_m7 = _mm_mulhi_epi16(psi_i_p7_m7, ONE_OVER_SQRT_2); - psi_i_p7_m7 = _mm_slli_epi16(psi_i_p7_m7, 1); - psi_i_p5_p7 = _mm_mulhi_epi16(psi_i_p5_p7, ONE_OVER_SQRT_2); - psi_i_p5_p7 = _mm_slli_epi16(psi_i_p5_p7, 1); - psi_i_p5_p5 = _mm_mulhi_epi16(psi_i_p5_p5, ONE_OVER_SQRT_2); - psi_i_p5_p5 = _mm_slli_epi16(psi_i_p5_p5, 1); - psi_i_p5_p3 = _mm_mulhi_epi16(psi_i_p5_p3, ONE_OVER_SQRT_2); - psi_i_p5_p3 = _mm_slli_epi16(psi_i_p5_p3, 1); - psi_i_p5_p1 = _mm_mulhi_epi16(psi_i_p5_p1, ONE_OVER_SQRT_2); - psi_i_p5_p1 = _mm_slli_epi16(psi_i_p5_p1, 1); - psi_i_p5_m1 = _mm_mulhi_epi16(psi_i_p5_m1, ONE_OVER_SQRT_2); - psi_i_p5_m1 = _mm_slli_epi16(psi_i_p5_m1, 1); - psi_i_p5_m3 = _mm_mulhi_epi16(psi_i_p5_m3, ONE_OVER_SQRT_2); - psi_i_p5_m3 = _mm_slli_epi16(psi_i_p5_m3, 1); - psi_i_p5_m5 = _mm_mulhi_epi16(psi_i_p5_m5, ONE_OVER_SQRT_2); - psi_i_p5_m5 = _mm_slli_epi16(psi_i_p5_m5, 1); - psi_i_p5_m7 = _mm_mulhi_epi16(psi_i_p5_m7, ONE_OVER_SQRT_2); - psi_i_p5_m7 = _mm_slli_epi16(psi_i_p5_m7, 1); - psi_i_p3_p7 = _mm_mulhi_epi16(psi_i_p3_p7, ONE_OVER_SQRT_2); - psi_i_p3_p7 = _mm_slli_epi16(psi_i_p3_p7, 1); - psi_i_p3_p5 = _mm_mulhi_epi16(psi_i_p3_p5, ONE_OVER_SQRT_2); - psi_i_p3_p5 = _mm_slli_epi16(psi_i_p3_p5, 1); - psi_i_p3_p3 = _mm_mulhi_epi16(psi_i_p3_p3, ONE_OVER_SQRT_2); - psi_i_p3_p3 = _mm_slli_epi16(psi_i_p3_p3, 1); - psi_i_p3_p1 = _mm_mulhi_epi16(psi_i_p3_p1, ONE_OVER_SQRT_2); - psi_i_p3_p1 = _mm_slli_epi16(psi_i_p3_p1, 1); - psi_i_p3_m1 = _mm_mulhi_epi16(psi_i_p3_m1, ONE_OVER_SQRT_2); - psi_i_p3_m1 = _mm_slli_epi16(psi_i_p3_m1, 1); - psi_i_p3_m3 = _mm_mulhi_epi16(psi_i_p3_m3, ONE_OVER_SQRT_2); - psi_i_p3_m3 = _mm_slli_epi16(psi_i_p3_m3, 1); - psi_i_p3_m5 = _mm_mulhi_epi16(psi_i_p3_m5, ONE_OVER_SQRT_2); - psi_i_p3_m5 = _mm_slli_epi16(psi_i_p3_m5, 1); - psi_i_p3_m7 = _mm_mulhi_epi16(psi_i_p3_m7, ONE_OVER_SQRT_2); - psi_i_p3_m7 = _mm_slli_epi16(psi_i_p3_m7, 1); - psi_i_p1_p7 = _mm_mulhi_epi16(psi_i_p1_p7, ONE_OVER_SQRT_2); - psi_i_p1_p7 = _mm_slli_epi16(psi_i_p1_p7, 1); - psi_i_p1_p5 = _mm_mulhi_epi16(psi_i_p1_p5, ONE_OVER_SQRT_2); - psi_i_p1_p5 = _mm_slli_epi16(psi_i_p1_p5, 1); - psi_i_p1_p3 = _mm_mulhi_epi16(psi_i_p1_p3, ONE_OVER_SQRT_2); - psi_i_p1_p3 = _mm_slli_epi16(psi_i_p1_p3, 1); - psi_i_p1_p1 = _mm_mulhi_epi16(psi_i_p1_p1, ONE_OVER_SQRT_2); - psi_i_p1_p1 = _mm_slli_epi16(psi_i_p1_p1, 1); - psi_i_p1_m1 = _mm_mulhi_epi16(psi_i_p1_m1, ONE_OVER_SQRT_2); - psi_i_p1_m1 = _mm_slli_epi16(psi_i_p1_m1, 1); - psi_i_p1_m3 = _mm_mulhi_epi16(psi_i_p1_m3, ONE_OVER_SQRT_2); - psi_i_p1_m3 = _mm_slli_epi16(psi_i_p1_m3, 1); - psi_i_p1_m5 = _mm_mulhi_epi16(psi_i_p1_m5, ONE_OVER_SQRT_2); - psi_i_p1_m5 = _mm_slli_epi16(psi_i_p1_m5, 1); - psi_i_p1_m7 = _mm_mulhi_epi16(psi_i_p1_m7, ONE_OVER_SQRT_2); - psi_i_p1_m7 = _mm_slli_epi16(psi_i_p1_m7, 1); - psi_i_m1_p7 = _mm_mulhi_epi16(psi_i_m1_p7, ONE_OVER_SQRT_2); - psi_i_m1_p7 = _mm_slli_epi16(psi_i_m1_p7, 1); - psi_i_m1_p5 = _mm_mulhi_epi16(psi_i_m1_p5, ONE_OVER_SQRT_2); - psi_i_m1_p5 = _mm_slli_epi16(psi_i_m1_p5, 1); - psi_i_m1_p3 = _mm_mulhi_epi16(psi_i_m1_p3, ONE_OVER_SQRT_2); - psi_i_m1_p3 = _mm_slli_epi16(psi_i_m1_p3, 1); - psi_i_m1_p1 = _mm_mulhi_epi16(psi_i_m1_p1, ONE_OVER_SQRT_2); - psi_i_m1_p1 = _mm_slli_epi16(psi_i_m1_p1, 1); - psi_i_m1_m1 = _mm_mulhi_epi16(psi_i_m1_m1, ONE_OVER_SQRT_2); - psi_i_m1_m1 = _mm_slli_epi16(psi_i_m1_m1, 1); - psi_i_m1_m3 = _mm_mulhi_epi16(psi_i_m1_m3, ONE_OVER_SQRT_2); - psi_i_m1_m3 = _mm_slli_epi16(psi_i_m1_m3, 1); - psi_i_m1_m5 = _mm_mulhi_epi16(psi_i_m1_m5, ONE_OVER_SQRT_2); - psi_i_m1_m5 = _mm_slli_epi16(psi_i_m1_m5, 1); - psi_i_m1_m7 = _mm_mulhi_epi16(psi_i_m1_m7, ONE_OVER_SQRT_2); - psi_i_m1_m7 = _mm_slli_epi16(psi_i_m1_m7, 1); - psi_i_m3_p7 = _mm_mulhi_epi16(psi_i_m3_p7, ONE_OVER_SQRT_2); - psi_i_m3_p7 = _mm_slli_epi16(psi_i_m3_p7, 1); - psi_i_m3_p5 = _mm_mulhi_epi16(psi_i_m3_p5, ONE_OVER_SQRT_2); - psi_i_m3_p5 = _mm_slli_epi16(psi_i_m3_p5, 1); - psi_i_m3_p3 = _mm_mulhi_epi16(psi_i_m3_p3, ONE_OVER_SQRT_2); - psi_i_m3_p3 = _mm_slli_epi16(psi_i_m3_p3, 1); - psi_i_m3_p1 = _mm_mulhi_epi16(psi_i_m3_p1, ONE_OVER_SQRT_2); - psi_i_m3_p1 = _mm_slli_epi16(psi_i_m3_p1, 1); - psi_i_m3_m1 = _mm_mulhi_epi16(psi_i_m3_m1, ONE_OVER_SQRT_2); - psi_i_m3_m1 = _mm_slli_epi16(psi_i_m3_m1, 1); - psi_i_m3_m3 = _mm_mulhi_epi16(psi_i_m3_m3, ONE_OVER_SQRT_2); - psi_i_m3_m3 = _mm_slli_epi16(psi_i_m3_m3, 1); - psi_i_m3_m5 = _mm_mulhi_epi16(psi_i_m3_m5, ONE_OVER_SQRT_2); - psi_i_m3_m5 = _mm_slli_epi16(psi_i_m3_m5, 1); - psi_i_m3_m7 = _mm_mulhi_epi16(psi_i_m3_m7, ONE_OVER_SQRT_2); - psi_i_m3_m7 = _mm_slli_epi16(psi_i_m3_m7, 1); - psi_i_m5_p7 = _mm_mulhi_epi16(psi_i_m5_p7, ONE_OVER_SQRT_2); - psi_i_m5_p7 = _mm_slli_epi16(psi_i_m5_p7, 1); - psi_i_m5_p5 = _mm_mulhi_epi16(psi_i_m5_p5, ONE_OVER_SQRT_2); - psi_i_m5_p5 = _mm_slli_epi16(psi_i_m5_p5, 1); - psi_i_m5_p3 = _mm_mulhi_epi16(psi_i_m5_p3, ONE_OVER_SQRT_2); - psi_i_m5_p3 = _mm_slli_epi16(psi_i_m5_p3, 1); - psi_i_m5_p1 = _mm_mulhi_epi16(psi_i_m5_p1, ONE_OVER_SQRT_2); - psi_i_m5_p1 = _mm_slli_epi16(psi_i_m5_p1, 1); - psi_i_m5_m1 = _mm_mulhi_epi16(psi_i_m5_m1, ONE_OVER_SQRT_2); - psi_i_m5_m1 = _mm_slli_epi16(psi_i_m5_m1, 1); - psi_i_m5_m3 = _mm_mulhi_epi16(psi_i_m5_m3, ONE_OVER_SQRT_2); - psi_i_m5_m3 = _mm_slli_epi16(psi_i_m5_m3, 1); - psi_i_m5_m5 = _mm_mulhi_epi16(psi_i_m5_m5, ONE_OVER_SQRT_2); - psi_i_m5_m5 = _mm_slli_epi16(psi_i_m5_m5, 1); - psi_i_m5_m7 = _mm_mulhi_epi16(psi_i_m5_m7, ONE_OVER_SQRT_2); - psi_i_m5_m7 = _mm_slli_epi16(psi_i_m5_m7, 1); - psi_i_m7_p7 = _mm_mulhi_epi16(psi_i_m7_p7, ONE_OVER_SQRT_2); - psi_i_m7_p7 = _mm_slli_epi16(psi_i_m7_p7, 1); - psi_i_m7_p5 = _mm_mulhi_epi16(psi_i_m7_p5, ONE_OVER_SQRT_2); - psi_i_m7_p5 = _mm_slli_epi16(psi_i_m7_p5, 1); - psi_i_m7_p3 = _mm_mulhi_epi16(psi_i_m7_p3, ONE_OVER_SQRT_2); - psi_i_m7_p3 = _mm_slli_epi16(psi_i_m7_p3, 1); - psi_i_m7_p1 = _mm_mulhi_epi16(psi_i_m7_p1, ONE_OVER_SQRT_2); - psi_i_m7_p1 = _mm_slli_epi16(psi_i_m7_p1, 1); - psi_i_m7_m1 = _mm_mulhi_epi16(psi_i_m7_m1, ONE_OVER_SQRT_2); - psi_i_m7_m1 = _mm_slli_epi16(psi_i_m7_m1, 1); - psi_i_m7_m3 = _mm_mulhi_epi16(psi_i_m7_m3, ONE_OVER_SQRT_2); - psi_i_m7_m3 = _mm_slli_epi16(psi_i_m7_m3, 1); - psi_i_m7_m5 = _mm_mulhi_epi16(psi_i_m7_m5, ONE_OVER_SQRT_2); - psi_i_m7_m5 = _mm_slli_epi16(psi_i_m7_m5, 1); - psi_i_m7_m7 = _mm_mulhi_epi16(psi_i_m7_m7, ONE_OVER_SQRT_2); - psi_i_m7_m7 = _mm_slli_epi16(psi_i_m7_m7, 1); - - psi_a_p7_p7 = _mm_adds_epi16(psi_r_p7_p7, psi_i_p7_p7); - psi_a_p7_p5 = _mm_adds_epi16(psi_r_p7_p5, psi_i_p7_p5); - psi_a_p7_p3 = _mm_adds_epi16(psi_r_p7_p3, psi_i_p7_p3); - psi_a_p7_p1 = _mm_adds_epi16(psi_r_p7_p1, psi_i_p7_p1); - psi_a_p7_m1 = _mm_adds_epi16(psi_r_p7_m1, psi_i_p7_m1); - psi_a_p7_m3 = _mm_adds_epi16(psi_r_p7_m3, psi_i_p7_m3); - psi_a_p7_m5 = _mm_adds_epi16(psi_r_p7_m5, psi_i_p7_m5); - psi_a_p7_m7 = _mm_adds_epi16(psi_r_p7_m7, psi_i_p7_m7); - psi_a_p5_p7 = _mm_adds_epi16(psi_r_p5_p7, psi_i_p5_p7); - psi_a_p5_p5 = _mm_adds_epi16(psi_r_p5_p5, psi_i_p5_p5); - psi_a_p5_p3 = _mm_adds_epi16(psi_r_p5_p3, psi_i_p5_p3); - psi_a_p5_p1 = _mm_adds_epi16(psi_r_p5_p1, psi_i_p5_p1); - psi_a_p5_m1 = _mm_adds_epi16(psi_r_p5_m1, psi_i_p5_m1); - psi_a_p5_m3 = _mm_adds_epi16(psi_r_p5_m3, psi_i_p5_m3); - psi_a_p5_m5 = _mm_adds_epi16(psi_r_p5_m5, psi_i_p5_m5); - psi_a_p5_m7 = _mm_adds_epi16(psi_r_p5_m7, psi_i_p5_m7); - psi_a_p3_p7 = _mm_adds_epi16(psi_r_p3_p7, psi_i_p3_p7); - psi_a_p3_p5 = _mm_adds_epi16(psi_r_p3_p5, psi_i_p3_p5); - psi_a_p3_p3 = _mm_adds_epi16(psi_r_p3_p3, psi_i_p3_p3); - psi_a_p3_p1 = _mm_adds_epi16(psi_r_p3_p1, psi_i_p3_p1); - psi_a_p3_m1 = _mm_adds_epi16(psi_r_p3_m1, psi_i_p3_m1); - psi_a_p3_m3 = _mm_adds_epi16(psi_r_p3_m3, psi_i_p3_m3); - psi_a_p3_m5 = _mm_adds_epi16(psi_r_p3_m5, psi_i_p3_m5); - psi_a_p3_m7 = _mm_adds_epi16(psi_r_p3_m7, psi_i_p3_m7); - psi_a_p1_p7 = _mm_adds_epi16(psi_r_p1_p7, psi_i_p1_p7); - psi_a_p1_p5 = _mm_adds_epi16(psi_r_p1_p5, psi_i_p1_p5); - psi_a_p1_p3 = _mm_adds_epi16(psi_r_p1_p3, psi_i_p1_p3); - psi_a_p1_p1 = _mm_adds_epi16(psi_r_p1_p1, psi_i_p1_p1); - psi_a_p1_m1 = _mm_adds_epi16(psi_r_p1_m1, psi_i_p1_m1); - psi_a_p1_m3 = _mm_adds_epi16(psi_r_p1_m3, psi_i_p1_m3); - psi_a_p1_m5 = _mm_adds_epi16(psi_r_p1_m5, psi_i_p1_m5); - psi_a_p1_m7 = _mm_adds_epi16(psi_r_p1_m7, psi_i_p1_m7); - psi_a_m1_p7 = _mm_adds_epi16(psi_r_m1_p7, psi_i_m1_p7); - psi_a_m1_p5 = _mm_adds_epi16(psi_r_m1_p5, psi_i_m1_p5); - psi_a_m1_p3 = _mm_adds_epi16(psi_r_m1_p3, psi_i_m1_p3); - psi_a_m1_p1 = _mm_adds_epi16(psi_r_m1_p1, psi_i_m1_p1); - psi_a_m1_m1 = _mm_adds_epi16(psi_r_m1_m1, psi_i_m1_m1); - psi_a_m1_m3 = _mm_adds_epi16(psi_r_m1_m3, psi_i_m1_m3); - psi_a_m1_m5 = _mm_adds_epi16(psi_r_m1_m5, psi_i_m1_m5); - psi_a_m1_m7 = _mm_adds_epi16(psi_r_m1_m7, psi_i_m1_m7); - psi_a_m3_p7 = _mm_adds_epi16(psi_r_m3_p7, psi_i_m3_p7); - psi_a_m3_p5 = _mm_adds_epi16(psi_r_m3_p5, psi_i_m3_p5); - psi_a_m3_p3 = _mm_adds_epi16(psi_r_m3_p3, psi_i_m3_p3); - psi_a_m3_p1 = _mm_adds_epi16(psi_r_m3_p1, psi_i_m3_p1); - psi_a_m3_m1 = _mm_adds_epi16(psi_r_m3_m1, psi_i_m3_m1); - psi_a_m3_m3 = _mm_adds_epi16(psi_r_m3_m3, psi_i_m3_m3); - psi_a_m3_m5 = _mm_adds_epi16(psi_r_m3_m5, psi_i_m3_m5); - psi_a_m3_m7 = _mm_adds_epi16(psi_r_m3_m7, psi_i_m3_m7); - psi_a_m5_p7 = _mm_adds_epi16(psi_r_m5_p7, psi_i_m5_p7); - psi_a_m5_p5 = _mm_adds_epi16(psi_r_m5_p5, psi_i_m5_p5); - psi_a_m5_p3 = _mm_adds_epi16(psi_r_m5_p3, psi_i_m5_p3); - psi_a_m5_p1 = _mm_adds_epi16(psi_r_m5_p1, psi_i_m5_p1); - psi_a_m5_m1 = _mm_adds_epi16(psi_r_m5_m1, psi_i_m5_m1); - psi_a_m5_m3 = _mm_adds_epi16(psi_r_m5_m3, psi_i_m5_m3); - psi_a_m5_m5 = _mm_adds_epi16(psi_r_m5_m5, psi_i_m5_m5); - psi_a_m5_m7 = _mm_adds_epi16(psi_r_m5_m7, psi_i_m5_m7); - psi_a_m7_p7 = _mm_adds_epi16(psi_r_m7_p7, psi_i_m7_p7); - psi_a_m7_p5 = _mm_adds_epi16(psi_r_m7_p5, psi_i_m7_p5); - psi_a_m7_p3 = _mm_adds_epi16(psi_r_m7_p3, psi_i_m7_p3); - psi_a_m7_p1 = _mm_adds_epi16(psi_r_m7_p1, psi_i_m7_p1); - psi_a_m7_m1 = _mm_adds_epi16(psi_r_m7_m1, psi_i_m7_m1); - psi_a_m7_m3 = _mm_adds_epi16(psi_r_m7_m3, psi_i_m7_m3); - psi_a_m7_m5 = _mm_adds_epi16(psi_r_m7_m5, psi_i_m7_m5); - psi_a_m7_m7 = _mm_adds_epi16(psi_r_m7_m7, psi_i_m7_m7); - - // Computing different multiples of ||h0||^2 - // x=1, y=1 - ch_mag_2_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,ONE_OVER_FOUR_SQRT_42); - ch_mag_2_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_2_over_42_with_sigma2,1); - // x=1, y=3 - ch_mag_10_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FIVE_OVER_FOUR_SQRT_42); - ch_mag_10_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_10_over_42_with_sigma2,1); - // x=1, x=5 - ch_mag_26_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTEEN_OVER_FOUR_SQRT_42); - ch_mag_26_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_26_over_42_with_sigma2,1); - // x=1, y=7 - ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42); - ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1); - // x=3, y=3 - ch_mag_18_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,NINE_OVER_FOUR_SQRT_42); - ch_mag_18_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_18_over_42_with_sigma2,1); - // x=3, y=5 - ch_mag_34_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,SEVENTEEN_OVER_FOUR_SQRT_42); - ch_mag_34_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_34_over_42_with_sigma2,1); - // x=3, y=7 - ch_mag_58_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYNINE_OVER_FOUR_SQRT_42); - ch_mag_58_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_58_over_42_with_sigma2,2); - // x=5, y=5 - ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42); - ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1); - // x=5, y=7 - ch_mag_74_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTYSEVEN_OVER_FOUR_SQRT_42); - ch_mag_74_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_74_over_42_with_sigma2,2); - // x=7, y=7 - ch_mag_98_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FORTYNINE_OVER_FOUR_SQRT_42); - ch_mag_98_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_98_over_42_with_sigma2,2); - - // Computing Metrics - xmm1 = _mm_adds_epi16(psi_a_p7_p7, y0_p_7_7); - bit_met_p7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p7_p5, y0_p_7_5); - bit_met_p7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p7_p3, y0_p_7_3); - bit_met_p7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p7_p1, y0_p_7_1); - bit_met_p7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p7_m1, y0_m_7_1); - bit_met_p7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p7_m3, y0_m_7_3); - bit_met_p7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p7_m5, y0_m_7_5); - bit_met_p7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p7_m7, y0_m_7_7); - bit_met_p7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p5_p7, y0_p_5_7); - bit_met_p5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p5_p5, y0_p_5_5); - bit_met_p5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p5_p3, y0_p_5_3); - bit_met_p5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p5_p1, y0_p_5_1); - bit_met_p5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p5_m1, y0_m_5_1); - bit_met_p5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p5_m3, y0_m_5_3); - bit_met_p5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p5_m5, y0_m_5_5); - bit_met_p5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p5_m7, y0_m_5_7); - bit_met_p5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p3_p7, y0_p_3_7); - bit_met_p3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p3_p5, y0_p_3_5); - bit_met_p3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p3_p3, y0_p_3_3); - bit_met_p3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p3_p1, y0_p_3_1); - bit_met_p3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p3_m1, y0_m_3_1); - bit_met_p3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p3_m3, y0_m_3_3); - bit_met_p3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p3_m5, y0_m_3_5); - bit_met_p3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p3_m7, y0_m_3_7); - bit_met_p3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p1_p7, y0_p_1_7); - bit_met_p1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p1_p5, y0_p_1_5); - bit_met_p1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p1_p3, y0_p_1_3); - bit_met_p1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p1_p1, y0_p_1_1); - bit_met_p1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p1_m1, y0_m_1_1); - bit_met_p1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p1_m3, y0_m_1_3); - bit_met_p1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p1_m5, y0_m_1_5); - bit_met_p1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm1 = _mm_adds_epi16(psi_a_p1_m7, y0_m_1_7); - bit_met_p1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - - xmm1 = _mm_subs_epi16(psi_a_m1_p7, y0_m_1_7); - bit_met_m1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m1_p5, y0_m_1_5); - bit_met_m1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m1_p3, y0_m_1_3); - bit_met_m1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m1_p1, y0_m_1_1); - bit_met_m1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m1_m1, y0_p_1_1); - bit_met_m1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m1_m3, y0_p_1_3); - bit_met_m1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m1_m5, y0_p_1_5); - bit_met_m1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m1_m7, y0_p_1_7); - bit_met_m1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m3_p7, y0_m_3_7); - bit_met_m3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m3_p5, y0_m_3_5); - bit_met_m3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m3_p3, y0_m_3_3); - bit_met_m3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m3_p1, y0_m_3_1); - bit_met_m3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m3_m1, y0_p_3_1); - bit_met_m3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m3_m3, y0_p_3_3); - bit_met_m3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m3_m5, y0_p_3_5); - bit_met_m3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m3_m7, y0_p_3_7); - bit_met_m3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m5_p7, y0_m_5_7); - bit_met_m5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m5_p5, y0_m_5_5); - bit_met_m5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m5_p3, y0_m_5_3); - bit_met_m5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m5_p1, y0_m_5_1); - bit_met_m5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m5_m1, y0_p_5_1); - bit_met_m5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m5_m3, y0_p_5_3); - bit_met_m5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m5_m5, y0_p_5_5); - bit_met_m5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m5_m7, y0_p_5_7); - bit_met_m5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m7_p7, y0_m_7_7); - bit_met_m7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m7_p5, y0_m_7_5); - bit_met_m7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m7_p3, y0_m_7_3); - bit_met_m7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m7_p1, y0_m_7_1); - bit_met_m7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m7_m1, y0_p_7_1); - bit_met_m7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m7_m3, y0_p_7_3); - bit_met_m7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m7_m5, y0_p_7_5); - bit_met_m7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm1 = _mm_subs_epi16(psi_a_m7_m7, y0_p_7_7); - bit_met_m7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); - - // Detection for 1st bit (LTE mapping) - // bit = 1 - xmm0 = _mm_max_epi16(bit_met_m7_p7, bit_met_m7_p5); - xmm1 = _mm_max_epi16(bit_met_m7_p3, bit_met_m7_p1); - xmm2 = _mm_max_epi16(bit_met_m7_m1, bit_met_m7_m3); - xmm3 = _mm_max_epi16(bit_met_m7_m5, bit_met_m7_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_m5_p7, bit_met_m5_p5); - xmm1 = _mm_max_epi16(bit_met_m5_p3, bit_met_m5_p1); - xmm2 = _mm_max_epi16(bit_met_m5_m1, bit_met_m5_m3); - xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m5_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_m3_p7, bit_met_m3_p5); - xmm1 = _mm_max_epi16(bit_met_m3_p3, bit_met_m3_p1); - xmm2 = _mm_max_epi16(bit_met_m3_m1, bit_met_m3_m3); - xmm3 = _mm_max_epi16(bit_met_m3_m5, bit_met_m3_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_m1_p7, bit_met_m1_p5); - xmm1 = _mm_max_epi16(bit_met_m1_p3, bit_met_m1_p1); - xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m1_m3); - xmm3 = _mm_max_epi16(bit_met_m1_m5, bit_met_m1_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - // bit = 0 - xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p7_p5); - xmm1 = _mm_max_epi16(bit_met_p7_p3, bit_met_p7_p1); - xmm2 = _mm_max_epi16(bit_met_p7_m1, bit_met_p7_m3); - xmm3 = _mm_max_epi16(bit_met_p7_m5, bit_met_p7_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p5_p7, bit_met_p5_p5); - xmm1 = _mm_max_epi16(bit_met_p5_p3, bit_met_p5_p1); - xmm2 = _mm_max_epi16(bit_met_p5_m1, bit_met_p5_m3); - xmm3 = _mm_max_epi16(bit_met_p5_m5, bit_met_p5_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p3_p7, bit_met_p3_p5); - xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p3_p1); - xmm2 = _mm_max_epi16(bit_met_p3_m1, bit_met_p3_m3); - xmm3 = _mm_max_epi16(bit_met_p3_m5, bit_met_p3_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p1_p7, bit_met_p1_p5); - xmm1 = _mm_max_epi16(bit_met_p1_p3, bit_met_p1_p1); - xmm2 = _mm_max_epi16(bit_met_p1_m1, bit_met_p1_m3); - xmm3 = _mm_max_epi16(bit_met_p1_m5, bit_met_p1_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y0r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - // Detection for 2nd bit (LTE mapping) - // bit = 1 - xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); - xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); - xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); - xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); - xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); - xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); - xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); - xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); - xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); - xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); - xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); - xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); - xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - // bit = 0 - xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); - xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); - xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); - xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); - xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); - xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); - xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); - xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); - xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); - xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); - xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); - xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y1r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - // Detection for 3rd bit (LTE mapping) - xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5); - xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1); - xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3); - xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5); - xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1); - xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3); - xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5); - xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1); - xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3); - xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5); - xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1); - xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3); - xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5); - xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1); - xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5); - xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1); - xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3); - xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5); - xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1); - xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3); - xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5); - xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1); - xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y2r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - // Detection for 4th bit (LTE mapping) - xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); - xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); - xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); - xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); - xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); - xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); - xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); - xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); - xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); - xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); - xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); - xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); - xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); - xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); - xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); - xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); - xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); - xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); - xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); - xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); - xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); - xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); - xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); - xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y0i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - - // Detection for 5th bit (LTE mapping) - xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5); - xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1); - xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3); - xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5); - xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1); - xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3); - xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5); - xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1); - xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3); - xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5); - xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1); - xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3); - xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5); - xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1); - xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3); - xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5); - xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1); - xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5); - xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1); - xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5); - xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1); - xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3); - xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y1i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - // Detection for 6th bit (LTE mapping) - xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); - xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); - xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); - xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); - xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); - xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); - xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); - xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); - xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); - xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); - xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); - xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); - xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); - xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); - xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); - xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); - xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); - xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); - xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); - xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); - xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); - xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); - xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); - xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y2i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - - // map to output stream, difficult to do in SIMD since we have 6 16bit LLRs - // RE 1 - j = 24*i; - stream0_out[j + 0] = ((short *)&y0r)[0]; - stream0_out[j + 1] = ((short *)&y1r)[0]; - stream0_out[j + 2] = ((short *)&y2r)[0]; - stream0_out[j + 3] = ((short *)&y0i)[0]; - stream0_out[j + 4] = ((short *)&y1i)[0]; - stream0_out[j + 5] = ((short *)&y2i)[0]; - // RE 2 - stream0_out[j + 6] = ((short *)&y0r)[1]; - stream0_out[j + 7] = ((short *)&y1r)[1]; - stream0_out[j + 8] = ((short *)&y2r)[1]; - stream0_out[j + 9] = ((short *)&y0i)[1]; - stream0_out[j + 10] = ((short *)&y1i)[1]; - stream0_out[j + 11] = ((short *)&y2i)[1]; - // RE 3 - stream0_out[j + 12] = ((short *)&y0r)[2]; - stream0_out[j + 13] = ((short *)&y1r)[2]; - stream0_out[j + 14] = ((short *)&y2r)[2]; - stream0_out[j + 15] = ((short *)&y0i)[2]; - stream0_out[j + 16] = ((short *)&y1i)[2]; - stream0_out[j + 17] = ((short *)&y2i)[2]; - // RE 4 - stream0_out[j + 18] = ((short *)&y0r)[3]; - stream0_out[j + 19] = ((short *)&y1r)[3]; - stream0_out[j + 20] = ((short *)&y2r)[3]; - stream0_out[j + 21] = ((short *)&y0i)[3]; - stream0_out[j + 22] = ((short *)&y1i)[3]; - stream0_out[j + 23] = ((short *)&y2i)[3]; - // RE 5 - stream0_out[j + 24] = ((short *)&y0r)[4]; - stream0_out[j + 25] = ((short *)&y1r)[4]; - stream0_out[j + 26] = ((short *)&y2r)[4]; - stream0_out[j + 27] = ((short *)&y0i)[4]; - stream0_out[j + 28] = ((short *)&y1i)[4]; - stream0_out[j + 29] = ((short *)&y2i)[4]; - // RE 6 - stream0_out[j + 30] = ((short *)&y0r)[5]; - stream0_out[j + 31] = ((short *)&y1r)[5]; - stream0_out[j + 32] = ((short *)&y2r)[5]; - stream0_out[j + 33] = ((short *)&y0i)[5]; - stream0_out[j + 34] = ((short *)&y1i)[5]; - stream0_out[j + 35] = ((short *)&y2i)[5]; - // RE 7 - stream0_out[j + 36] = ((short *)&y0r)[6]; - stream0_out[j + 37] = ((short *)&y1r)[6]; - stream0_out[j + 38] = ((short *)&y2r)[6]; - stream0_out[j + 39] = ((short *)&y0i)[6]; - stream0_out[j + 40] = ((short *)&y1i)[6]; - stream0_out[j + 41] = ((short *)&y2i)[6]; - // RE 8 - stream0_out[j + 42] = ((short *)&y0r)[7]; - stream0_out[j + 43] = ((short *)&y1r)[7]; - stream0_out[j + 44] = ((short *)&y2r)[7]; - stream0_out[j + 45] = ((short *)&y0i)[7]; - stream0_out[j + 46] = ((short *)&y1i)[7]; - stream0_out[j + 47] = ((short *)&y2i)[7]; -#elif defined(__arm__) - -#endif - } - -#if defined(__x86_64__) || defined(__i386__) - _mm_empty(); - _m_empty(); -#endif -} - - -int dlsch_64qam_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms, - int32_t **rxdataF_comp, - int32_t **rxdataF_comp_i, - int32_t **dl_ch_mag, - int32_t **rho_i, - int16_t *dlsch_llr, - uint8_t symbol, - uint8_t first_symbol_flag, - uint16_t nb_rb, - uint16_t pbch_pss_sss_adjust, - int16_t **llr16p) -{ - - int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *llr16; - int len; - uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; - - //first symbol has different structure due to more pilots - if (first_symbol_flag == 1) { - llr16 = (int16_t*)dlsch_llr; - } else { - llr16 = (int16_t*)(*llr16p); - } - - AssertFatal(llr16!=NULL,"dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol); - - if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { - // if symbol has pilots - if (frame_parms->nb_antenna_ports_eNB!=1) - // in 2 antenna ports we have 8 REs per symbol per RB - len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); - else - // for 1 antenna port we have 10 REs per symbol per RB - len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); - } else { - // symbol has no pilots - len = (nb_rb*12) - pbch_pss_sss_adjust; - } - - qam64_qpsk((short *)rxF, - (short *)rxF_i, - (short *)ch_mag, - (short *)llr16, - (short *)rho, - len); - - llr16 += (6*len); - *llr16p = (short *)llr16; - return(0); -} - - - -void qam64_qam16(short *stream0_in, - short *stream1_in, - short *ch_mag, - short *ch_mag_i, - short *stream0_out, - short *rho01, - int length - ) -{ - - /* - Author: S. Wagner - Date: 31-07-12 - - Input: - stream0_in: MF filter for 1st stream, i.e., y0=h0'*y - stream1_in: MF filter for 2nd stream, i.e., y1=h1'*y - ch_mag: 4*h0/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc - ch_mag_i: 4*h1/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc - rho01: Channel cross correlation, i.e., h1'*h0 - - Output: - stream0_out: output LLRs for 1st stream - */ - -#if defined(__x86_64__) || defined(__i386__) - - __m128i *rho01_128i = (__m128i *)rho01; - __m128i *stream0_128i_in = (__m128i *)stream0_in; - __m128i *stream1_128i_in = (__m128i *)stream1_in; - __m128i *ch_mag_128i = (__m128i *)ch_mag; - __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i; - - __m128i ONE_OVER_SQRT_42 = _mm_set1_epi16(10112); // round(1/sqrt(42)*2^16) - __m128i THREE_OVER_SQRT_42 = _mm_set1_epi16(30337); // round(3/sqrt(42)*2^16) - __m128i FIVE_OVER_SQRT_42 = _mm_set1_epi16(25281); // round(5/sqrt(42)*2^15) - __m128i SEVEN_OVER_SQRT_42 = _mm_set1_epi16(17697); // round(5/sqrt(42)*2^15) - __m128i FORTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(30969); // round(49/(4*sqrt(42))*2^14), Q2.14 - __m128i THIRTYSEVEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(23385); // round(37/(4*sqrt(42))*2^14), Q2.14 - __m128i TWENTYFIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(31601); // round(25/(4*sqrt(42))*2^15) - __m128i TWENTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(18329); // round(29/(4*sqrt(42))*2^15), Q2.14 - __m128i SEVENTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(21489); // round(17/(4*sqrt(42))*2^15) - __m128i NINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(11376); // round(9/(4*sqrt(42))*2^15) - __m128i THIRTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(16433); // round(13/(4*sqrt(42))*2^15) - __m128i FIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(6320); // round(5/(4*sqrt(42))*2^15) - __m128i ONE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(1264); // round(1/(4*sqrt(42))*2^15) - __m128i ONE_OVER_SQRT_10_Q15 = _mm_set1_epi16(10362); // round(1/sqrt(10)*2^15) - __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15) - __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15) - - - __m128i ch_mag_int; - __m128i ch_mag_des; - __m128i ch_mag_98_over_42_with_sigma2; - __m128i ch_mag_74_over_42_with_sigma2; - __m128i ch_mag_58_over_42_with_sigma2; - __m128i ch_mag_50_over_42_with_sigma2; - __m128i ch_mag_34_over_42_with_sigma2; - __m128i ch_mag_18_over_42_with_sigma2; - __m128i ch_mag_26_over_42_with_sigma2; - __m128i ch_mag_10_over_42_with_sigma2; - __m128i ch_mag_2_over_42_with_sigma2; - __m128i y0r_one_over_sqrt_21; - __m128i y0r_three_over_sqrt_21; - __m128i y0r_five_over_sqrt_21; - __m128i y0r_seven_over_sqrt_21; - __m128i y0i_one_over_sqrt_21; - __m128i y0i_three_over_sqrt_21; - __m128i y0i_five_over_sqrt_21; - __m128i y0i_seven_over_sqrt_21; - -#elif defined(__arm__) - -#endif - int i,j; - - - - for (i=0; i<length>>2; i+=2) { - -#if defined(__x86_64__) || defined(__i386__) - // Get rho - xmm0 = rho01_128i[i]; - xmm1 = rho01_128i[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) - xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) - rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) - rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) - - // Compute the different rhos - rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42); - rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42); - rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42); - rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42); - rho_rpi_5_5 = _mm_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42); - rho_rmi_5_5 = _mm_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42); - rho_rpi_7_7 = _mm_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42); - rho_rmi_7_7 = _mm_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42); - - rho_rpi_5_5 = _mm_slli_epi16(rho_rpi_5_5, 1); - rho_rmi_5_5 = _mm_slli_epi16(rho_rmi_5_5, 1); - rho_rpi_7_7 = _mm_slli_epi16(rho_rpi_7_7, 2); - rho_rmi_7_7 = _mm_slli_epi16(rho_rmi_7_7, 2); - - xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_42); - xmm5 = _mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_42); - xmm6 = _mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_42); - xmm7 = _mm_mulhi_epi16(xmm3, FIVE_OVER_SQRT_42); - xmm8 = _mm_mulhi_epi16(xmm3, SEVEN_OVER_SQRT_42); - xmm7 = _mm_slli_epi16(xmm7, 1); - xmm8 = _mm_slli_epi16(xmm8, 2); - - rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm6); - rho_rmi_1_3 = _mm_subs_epi16(xmm4, xmm6); - rho_rpi_1_5 = _mm_adds_epi16(xmm4, xmm7); - rho_rmi_1_5 = _mm_subs_epi16(xmm4, xmm7); - rho_rpi_1_7 = _mm_adds_epi16(xmm4, xmm8); - rho_rmi_1_7 = _mm_subs_epi16(xmm4, xmm8); - - xmm4 = _mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_42); - rho_rpi_3_1 = _mm_adds_epi16(xmm4, xmm5); - rho_rmi_3_1 = _mm_subs_epi16(xmm4, xmm5); - rho_rpi_3_5 = _mm_adds_epi16(xmm4, xmm7); - rho_rmi_3_5 = _mm_subs_epi16(xmm4, xmm7); - rho_rpi_3_7 = _mm_adds_epi16(xmm4, xmm8); - rho_rmi_3_7 = _mm_subs_epi16(xmm4, xmm8); - - xmm4 = _mm_mulhi_epi16(xmm2, FIVE_OVER_SQRT_42); - xmm4 = _mm_slli_epi16(xmm4, 1); - rho_rpi_5_1 = _mm_adds_epi16(xmm4, xmm5); - rho_rmi_5_1 = _mm_subs_epi16(xmm4, xmm5); - rho_rpi_5_3 = _mm_adds_epi16(xmm4, xmm6); - rho_rmi_5_3 = _mm_subs_epi16(xmm4, xmm6); - rho_rpi_5_7 = _mm_adds_epi16(xmm4, xmm8); - rho_rmi_5_7 = _mm_subs_epi16(xmm4, xmm8); - - xmm4 = _mm_mulhi_epi16(xmm2, SEVEN_OVER_SQRT_42); - xmm4 = _mm_slli_epi16(xmm4, 2); - rho_rpi_7_1 = _mm_adds_epi16(xmm4, xmm5); - rho_rmi_7_1 = _mm_subs_epi16(xmm4, xmm5); - rho_rpi_7_3 = _mm_adds_epi16(xmm4, xmm6); - rho_rmi_7_3 = _mm_subs_epi16(xmm4, xmm6); - rho_rpi_7_5 = _mm_adds_epi16(xmm4, xmm7); - rho_rmi_7_5 = _mm_subs_epi16(xmm4, xmm7); - - // Rearrange interfering MF output - xmm0 = stream1_128i_in[i]; - xmm1 = stream1_128i_in[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] - y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] - - // Psi_r calculation from rho_rpi or rho_rmi - xmm0 = _mm_setzero_si128(); // ZERO for abs_pi16 - xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1r); - psi_r_p7_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1r); - psi_r_p7_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1r); - psi_r_p7_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1r); - psi_r_p7_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1r); - psi_r_p7_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1r); - psi_r_p7_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1r); - psi_r_p7_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1r); - psi_r_p7_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1r); - psi_r_p5_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1r); - psi_r_p5_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1r); - psi_r_p5_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1r); - psi_r_p5_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1r); - psi_r_p5_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1r); - psi_r_p5_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1r); - psi_r_p5_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1r); - psi_r_p5_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1r); - psi_r_p3_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1r); - psi_r_p3_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1r); - psi_r_p3_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1r); - psi_r_p3_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1r); - psi_r_p3_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1r); - psi_r_p3_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1r); - psi_r_p3_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1r); - psi_r_p3_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1r); - psi_r_p1_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1r); - psi_r_p1_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1r); - psi_r_p1_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1r); - psi_r_p1_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1r); - psi_r_p1_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1r); - psi_r_p1_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1r); - psi_r_p1_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1r); - psi_r_p1_m7 = _mm_abs_epi16(xmm2); - - xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1r); - psi_r_m1_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1r); - psi_r_m1_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1r); - psi_r_m1_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1r); - psi_r_m1_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1r); - psi_r_m1_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1r); - psi_r_m1_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1r); - psi_r_m1_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1r); - psi_r_m1_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1r); - psi_r_m3_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1r); - psi_r_m3_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1r); - psi_r_m3_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1r); - psi_r_m3_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1r); - psi_r_m3_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1r); - psi_r_m3_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1r); - psi_r_m3_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1r); - psi_r_m3_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1r); - psi_r_m5_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1r); - psi_r_m5_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1r); - psi_r_m5_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1r); - psi_r_m5_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1r); - psi_r_m5_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1r); - psi_r_m5_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1r); - psi_r_m5_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1r); - psi_r_m5_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1r); - psi_r_m7_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1r); - psi_r_m7_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1r); - psi_r_m7_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1r); - psi_r_m7_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1r); - psi_r_m7_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1r); - psi_r_m7_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1r); - psi_r_m7_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1r); - psi_r_m7_m7 = _mm_abs_epi16(xmm2); - - // Psi_i calculation from rho_rpi or rho_rmi - xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1i); - psi_i_p7_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1i); - psi_i_p7_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1i); - psi_i_p7_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1i); - psi_i_p7_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1i); - psi_i_p7_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1i); - psi_i_p7_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1i); - psi_i_p7_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1i); - psi_i_p7_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1i); - psi_i_p5_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1i); - psi_i_p5_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1i); - psi_i_p5_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1i); - psi_i_p5_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1i); - psi_i_p5_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1i); - psi_i_p5_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1i); - psi_i_p5_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1i); - psi_i_p5_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1i); - psi_i_p3_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1i); - psi_i_p3_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1i); - psi_i_p3_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1i); - psi_i_p3_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1i); - psi_i_p3_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1i); - psi_i_p3_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1i); - psi_i_p3_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1i); - psi_i_p3_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1i); - psi_i_p1_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1i); - psi_i_p1_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1i); - psi_i_p1_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1i); - psi_i_p1_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1i); - psi_i_p1_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1i); - psi_i_p1_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1i); - psi_i_p1_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1i); - psi_i_p1_m7 = _mm_abs_epi16(xmm2); - - xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1i); - psi_i_m1_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1i); - psi_i_m1_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1i); - psi_i_m1_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1i); - psi_i_m1_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1i); - psi_i_m1_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1i); - psi_i_m1_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1i); - psi_i_m1_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1i); - psi_i_m1_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1i); - psi_i_m3_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1i); - psi_i_m3_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1i); - psi_i_m3_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1i); - psi_i_m3_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1i); - psi_i_m3_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1i); - psi_i_m3_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1i); - psi_i_m3_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1i); - psi_i_m3_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1i); - psi_i_m5_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1i); - psi_i_m5_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1i); - psi_i_m5_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1i); - psi_i_m5_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1i); - psi_i_m5_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1i); - psi_i_m5_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1i); - psi_i_m5_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1i); - psi_i_m5_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1i); - psi_i_m7_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1i); - psi_i_m7_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1i); - psi_i_m7_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1i); - psi_i_m7_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1i); - psi_i_m7_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1i); - psi_i_m7_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1i); - psi_i_m7_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1i); - psi_i_m7_m7 = _mm_abs_epi16(xmm2); - - - // Rearrange desired MF output - xmm0 = stream0_128i_in[i]; - xmm1 = stream0_128i_in[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] - y0i = _mm_unpackhi_epi64(xmm0,xmm1); - - // Rearrange desired channel magnitudes - xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10)) - xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10)) - xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); - - // Rearrange interfering channel magnitudes - xmm2 = ch_mag_128i_i[i]; - xmm3 = ch_mag_128i_i[i+1]; - xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3); - - y0r_one_over_sqrt_21 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_42); - y0r_three_over_sqrt_21 = _mm_mulhi_epi16(y0r, THREE_OVER_SQRT_42); - y0r_five_over_sqrt_21 = _mm_mulhi_epi16(y0r, FIVE_OVER_SQRT_42); - y0r_five_over_sqrt_21 = _mm_slli_epi16(y0r_five_over_sqrt_21, 1); - y0r_seven_over_sqrt_21 = _mm_mulhi_epi16(y0r, SEVEN_OVER_SQRT_42); - y0r_seven_over_sqrt_21 = _mm_slli_epi16(y0r_seven_over_sqrt_21, 2); // Q2.14 - - y0i_one_over_sqrt_21 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_42); - y0i_three_over_sqrt_21 = _mm_mulhi_epi16(y0i, THREE_OVER_SQRT_42); - y0i_five_over_sqrt_21 = _mm_mulhi_epi16(y0i, FIVE_OVER_SQRT_42); - y0i_five_over_sqrt_21 = _mm_slli_epi16(y0i_five_over_sqrt_21, 1); - y0i_seven_over_sqrt_21 = _mm_mulhi_epi16(y0i, SEVEN_OVER_SQRT_42); - y0i_seven_over_sqrt_21 = _mm_slli_epi16(y0i_seven_over_sqrt_21, 2); // Q2.14 - - y0_p_7_1 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_7_3 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_7_5 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_7_7 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_p_5_1 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_5_3 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_5_5 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_5_7 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_3_5 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_3_7 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_p_1_1 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_1_3 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_1_5 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_1_7 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); - - y0_m_1_1 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_1_3 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_1_5 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_1_7 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_3_5 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_3_7 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_m_5_1 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_5_3 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_5_5 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_5_7 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_m_7_1 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_7_3 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_7_5 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_7_7 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); - - interference_abs_epi16(psi_r_p7_p7, ch_mag_int, a_r_p7_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p7_p5, ch_mag_int, a_r_p7_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p7_p3, ch_mag_int, a_r_p7_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p7_p1, ch_mag_int, a_r_p7_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p7_m1, ch_mag_int, a_r_p7_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p7_m3, ch_mag_int, a_r_p7_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p7_m5, ch_mag_int, a_r_p7_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p7_m7, ch_mag_int, a_r_p7_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p5_p7, ch_mag_int, a_r_p5_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p5_p5, ch_mag_int, a_r_p5_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p5_p3, ch_mag_int, a_r_p5_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p5_p1, ch_mag_int, a_r_p5_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p5_m1, ch_mag_int, a_r_p5_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p5_m3, ch_mag_int, a_r_p5_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p5_m5, ch_mag_int, a_r_p5_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p5_m7, ch_mag_int, a_r_p5_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p3_p7, ch_mag_int, a_r_p3_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p3_p5, ch_mag_int, a_r_p3_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p3_p3, ch_mag_int, a_r_p3_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p3_p1, ch_mag_int, a_r_p3_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p3_m1, ch_mag_int, a_r_p3_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p3_m3, ch_mag_int, a_r_p3_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p3_m5, ch_mag_int, a_r_p3_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p3_m7, ch_mag_int, a_r_p3_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p1_p7, ch_mag_int, a_r_p1_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p1_p5, ch_mag_int, a_r_p1_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p1_p3, ch_mag_int, a_r_p1_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p1_p1, ch_mag_int, a_r_p1_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p1_m1, ch_mag_int, a_r_p1_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p1_m3, ch_mag_int, a_r_p1_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p1_m5, ch_mag_int, a_r_p1_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_p1_m7, ch_mag_int, a_r_p1_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m1_p7, ch_mag_int, a_r_m1_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m1_p5, ch_mag_int, a_r_m1_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m1_p3, ch_mag_int, a_r_m1_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m1_p1, ch_mag_int, a_r_m1_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m1_m1, ch_mag_int, a_r_m1_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m1_m3, ch_mag_int, a_r_m1_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m1_m5, ch_mag_int, a_r_m1_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m1_m7, ch_mag_int, a_r_m1_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m3_p7, ch_mag_int, a_r_m3_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m3_p5, ch_mag_int, a_r_m3_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m3_p3, ch_mag_int, a_r_m3_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m3_p1, ch_mag_int, a_r_m3_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m3_m1, ch_mag_int, a_r_m3_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m3_m3, ch_mag_int, a_r_m3_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m3_m5, ch_mag_int, a_r_m3_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m3_m7, ch_mag_int, a_r_m3_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m5_p7, ch_mag_int, a_r_m5_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m5_p5, ch_mag_int, a_r_m5_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m5_p3, ch_mag_int, a_r_m5_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m5_p1, ch_mag_int, a_r_m5_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m5_m1, ch_mag_int, a_r_m5_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m5_m3, ch_mag_int, a_r_m5_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m5_m5, ch_mag_int, a_r_m5_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m5_m7, ch_mag_int, a_r_m5_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m7_p7, ch_mag_int, a_r_m7_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m7_p5, ch_mag_int, a_r_m7_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m7_p3, ch_mag_int, a_r_m7_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m7_p1, ch_mag_int, a_r_m7_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m7_m1, ch_mag_int, a_r_m7_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m7_m3, ch_mag_int, a_r_m7_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m7_m5, ch_mag_int, a_r_m7_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_r_m7_m7, ch_mag_int, a_r_m7_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - - interference_abs_epi16(psi_i_p7_p7, ch_mag_int, a_i_p7_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p7_p5, ch_mag_int, a_i_p7_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p7_p3, ch_mag_int, a_i_p7_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p7_p1, ch_mag_int, a_i_p7_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p7_m1, ch_mag_int, a_i_p7_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p7_m3, ch_mag_int, a_i_p7_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p7_m5, ch_mag_int, a_i_p7_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p7_m7, ch_mag_int, a_i_p7_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p5_p7, ch_mag_int, a_i_p5_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p5_p5, ch_mag_int, a_i_p5_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p5_p3, ch_mag_int, a_i_p5_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p5_p1, ch_mag_int, a_i_p5_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p5_m1, ch_mag_int, a_i_p5_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p5_m3, ch_mag_int, a_i_p5_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p5_m5, ch_mag_int, a_i_p5_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p5_m7, ch_mag_int, a_i_p5_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p3_p7, ch_mag_int, a_i_p3_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p3_p5, ch_mag_int, a_i_p3_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p3_p3, ch_mag_int, a_i_p3_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p3_p1, ch_mag_int, a_i_p3_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p3_m1, ch_mag_int, a_i_p3_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p3_m3, ch_mag_int, a_i_p3_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p3_m5, ch_mag_int, a_i_p3_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p3_m7, ch_mag_int, a_i_p3_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p1_p7, ch_mag_int, a_i_p1_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p1_p5, ch_mag_int, a_i_p1_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p1_p3, ch_mag_int, a_i_p1_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p1_p1, ch_mag_int, a_i_p1_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p1_m1, ch_mag_int, a_i_p1_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p1_m3, ch_mag_int, a_i_p1_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p1_m5, ch_mag_int, a_i_p1_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_p1_m7, ch_mag_int, a_i_p1_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m1_p7, ch_mag_int, a_i_m1_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m1_p5, ch_mag_int, a_i_m1_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m1_p3, ch_mag_int, a_i_m1_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m1_p1, ch_mag_int, a_i_m1_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m1_m1, ch_mag_int, a_i_m1_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m1_m3, ch_mag_int, a_i_m1_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m1_m5, ch_mag_int, a_i_m1_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m1_m7, ch_mag_int, a_i_m1_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m3_p7, ch_mag_int, a_i_m3_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m3_p5, ch_mag_int, a_i_m3_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m3_p3, ch_mag_int, a_i_m3_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m3_p1, ch_mag_int, a_i_m3_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m3_m1, ch_mag_int, a_i_m3_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m3_m3, ch_mag_int, a_i_m3_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m3_m5, ch_mag_int, a_i_m3_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m3_m7, ch_mag_int, a_i_m3_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m5_p7, ch_mag_int, a_i_m5_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m5_p5, ch_mag_int, a_i_m5_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m5_p3, ch_mag_int, a_i_m5_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m5_p1, ch_mag_int, a_i_m5_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m5_m1, ch_mag_int, a_i_m5_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m5_m3, ch_mag_int, a_i_m5_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m5_m5, ch_mag_int, a_i_m5_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m5_m7, ch_mag_int, a_i_m5_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m7_p7, ch_mag_int, a_i_m7_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m7_p5, ch_mag_int, a_i_m7_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m7_p3, ch_mag_int, a_i_m7_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m7_p1, ch_mag_int, a_i_m7_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m7_m1, ch_mag_int, a_i_m7_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m7_m3, ch_mag_int, a_i_m7_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m7_m5, ch_mag_int, a_i_m7_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - interference_abs_epi16(psi_i_m7_m7, ch_mag_int, a_i_m7_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); - - // Calculation of a group of two terms in the bit metric involving product of psi and interference - prodsum_psi_a_epi16(psi_r_p7_p7, a_r_p7_p7, psi_i_p7_p7, a_i_p7_p7, psi_a_p7_p7); - prodsum_psi_a_epi16(psi_r_p7_p5, a_r_p7_p5, psi_i_p7_p5, a_i_p7_p5, psi_a_p7_p5); - prodsum_psi_a_epi16(psi_r_p7_p3, a_r_p7_p3, psi_i_p7_p3, a_i_p7_p3, psi_a_p7_p3); - prodsum_psi_a_epi16(psi_r_p7_p1, a_r_p7_p1, psi_i_p7_p1, a_i_p7_p1, psi_a_p7_p1); - prodsum_psi_a_epi16(psi_r_p7_m1, a_r_p7_m1, psi_i_p7_m1, a_i_p7_m1, psi_a_p7_m1); - prodsum_psi_a_epi16(psi_r_p7_m3, a_r_p7_m3, psi_i_p7_m3, a_i_p7_m3, psi_a_p7_m3); - prodsum_psi_a_epi16(psi_r_p7_m5, a_r_p7_m5, psi_i_p7_m5, a_i_p7_m5, psi_a_p7_m5); - prodsum_psi_a_epi16(psi_r_p7_m7, a_r_p7_m7, psi_i_p7_m7, a_i_p7_m7, psi_a_p7_m7); - prodsum_psi_a_epi16(psi_r_p5_p7, a_r_p5_p7, psi_i_p5_p7, a_i_p5_p7, psi_a_p5_p7); - prodsum_psi_a_epi16(psi_r_p5_p5, a_r_p5_p5, psi_i_p5_p5, a_i_p5_p5, psi_a_p5_p5); - prodsum_psi_a_epi16(psi_r_p5_p3, a_r_p5_p3, psi_i_p5_p3, a_i_p5_p3, psi_a_p5_p3); - prodsum_psi_a_epi16(psi_r_p5_p1, a_r_p5_p1, psi_i_p5_p1, a_i_p5_p1, psi_a_p5_p1); - prodsum_psi_a_epi16(psi_r_p5_m1, a_r_p5_m1, psi_i_p5_m1, a_i_p5_m1, psi_a_p5_m1); - prodsum_psi_a_epi16(psi_r_p5_m3, a_r_p5_m3, psi_i_p5_m3, a_i_p5_m3, psi_a_p5_m3); - prodsum_psi_a_epi16(psi_r_p5_m5, a_r_p5_m5, psi_i_p5_m5, a_i_p5_m5, psi_a_p5_m5); - prodsum_psi_a_epi16(psi_r_p5_m7, a_r_p5_m7, psi_i_p5_m7, a_i_p5_m7, psi_a_p5_m7); - prodsum_psi_a_epi16(psi_r_p3_p7, a_r_p3_p7, psi_i_p3_p7, a_i_p3_p7, psi_a_p3_p7); - prodsum_psi_a_epi16(psi_r_p3_p5, a_r_p3_p5, psi_i_p3_p5, a_i_p3_p5, psi_a_p3_p5); - prodsum_psi_a_epi16(psi_r_p3_p3, a_r_p3_p3, psi_i_p3_p3, a_i_p3_p3, psi_a_p3_p3); - prodsum_psi_a_epi16(psi_r_p3_p1, a_r_p3_p1, psi_i_p3_p1, a_i_p3_p1, psi_a_p3_p1); - prodsum_psi_a_epi16(psi_r_p3_m1, a_r_p3_m1, psi_i_p3_m1, a_i_p3_m1, psi_a_p3_m1); - prodsum_psi_a_epi16(psi_r_p3_m3, a_r_p3_m3, psi_i_p3_m3, a_i_p3_m3, psi_a_p3_m3); - prodsum_psi_a_epi16(psi_r_p3_m5, a_r_p3_m5, psi_i_p3_m5, a_i_p3_m5, psi_a_p3_m5); - prodsum_psi_a_epi16(psi_r_p3_m7, a_r_p3_m7, psi_i_p3_m7, a_i_p3_m7, psi_a_p3_m7); - prodsum_psi_a_epi16(psi_r_p1_p7, a_r_p1_p7, psi_i_p1_p7, a_i_p1_p7, psi_a_p1_p7); - prodsum_psi_a_epi16(psi_r_p1_p5, a_r_p1_p5, psi_i_p1_p5, a_i_p1_p5, psi_a_p1_p5); - prodsum_psi_a_epi16(psi_r_p1_p3, a_r_p1_p3, psi_i_p1_p3, a_i_p1_p3, psi_a_p1_p3); - prodsum_psi_a_epi16(psi_r_p1_p1, a_r_p1_p1, psi_i_p1_p1, a_i_p1_p1, psi_a_p1_p1); - prodsum_psi_a_epi16(psi_r_p1_m1, a_r_p1_m1, psi_i_p1_m1, a_i_p1_m1, psi_a_p1_m1); - prodsum_psi_a_epi16(psi_r_p1_m3, a_r_p1_m3, psi_i_p1_m3, a_i_p1_m3, psi_a_p1_m3); - prodsum_psi_a_epi16(psi_r_p1_m5, a_r_p1_m5, psi_i_p1_m5, a_i_p1_m5, psi_a_p1_m5); - prodsum_psi_a_epi16(psi_r_p1_m7, a_r_p1_m7, psi_i_p1_m7, a_i_p1_m7, psi_a_p1_m7); - prodsum_psi_a_epi16(psi_r_m1_p7, a_r_m1_p7, psi_i_m1_p7, a_i_m1_p7, psi_a_m1_p7); - prodsum_psi_a_epi16(psi_r_m1_p5, a_r_m1_p5, psi_i_m1_p5, a_i_m1_p5, psi_a_m1_p5); - prodsum_psi_a_epi16(psi_r_m1_p3, a_r_m1_p3, psi_i_m1_p3, a_i_m1_p3, psi_a_m1_p3); - prodsum_psi_a_epi16(psi_r_m1_p1, a_r_m1_p1, psi_i_m1_p1, a_i_m1_p1, psi_a_m1_p1); - prodsum_psi_a_epi16(psi_r_m1_m1, a_r_m1_m1, psi_i_m1_m1, a_i_m1_m1, psi_a_m1_m1); - prodsum_psi_a_epi16(psi_r_m1_m3, a_r_m1_m3, psi_i_m1_m3, a_i_m1_m3, psi_a_m1_m3); - prodsum_psi_a_epi16(psi_r_m1_m5, a_r_m1_m5, psi_i_m1_m5, a_i_m1_m5, psi_a_m1_m5); - prodsum_psi_a_epi16(psi_r_m1_m7, a_r_m1_m7, psi_i_m1_m7, a_i_m1_m7, psi_a_m1_m7); - prodsum_psi_a_epi16(psi_r_m3_p7, a_r_m3_p7, psi_i_m3_p7, a_i_m3_p7, psi_a_m3_p7); - prodsum_psi_a_epi16(psi_r_m3_p5, a_r_m3_p5, psi_i_m3_p5, a_i_m3_p5, psi_a_m3_p5); - prodsum_psi_a_epi16(psi_r_m3_p3, a_r_m3_p3, psi_i_m3_p3, a_i_m3_p3, psi_a_m3_p3); - prodsum_psi_a_epi16(psi_r_m3_p1, a_r_m3_p1, psi_i_m3_p1, a_i_m3_p1, psi_a_m3_p1); - prodsum_psi_a_epi16(psi_r_m3_m1, a_r_m3_m1, psi_i_m3_m1, a_i_m3_m1, psi_a_m3_m1); - prodsum_psi_a_epi16(psi_r_m3_m3, a_r_m3_m3, psi_i_m3_m3, a_i_m3_m3, psi_a_m3_m3); - prodsum_psi_a_epi16(psi_r_m3_m5, a_r_m3_m5, psi_i_m3_m5, a_i_m3_m5, psi_a_m3_m5); - prodsum_psi_a_epi16(psi_r_m3_m7, a_r_m3_m7, psi_i_m3_m7, a_i_m3_m7, psi_a_m3_m7); - prodsum_psi_a_epi16(psi_r_m5_p7, a_r_m5_p7, psi_i_m5_p7, a_i_m5_p7, psi_a_m5_p7); - prodsum_psi_a_epi16(psi_r_m5_p5, a_r_m5_p5, psi_i_m5_p5, a_i_m5_p5, psi_a_m5_p5); - prodsum_psi_a_epi16(psi_r_m5_p3, a_r_m5_p3, psi_i_m5_p3, a_i_m5_p3, psi_a_m5_p3); - prodsum_psi_a_epi16(psi_r_m5_p1, a_r_m5_p1, psi_i_m5_p1, a_i_m5_p1, psi_a_m5_p1); - prodsum_psi_a_epi16(psi_r_m5_m1, a_r_m5_m1, psi_i_m5_m1, a_i_m5_m1, psi_a_m5_m1); - prodsum_psi_a_epi16(psi_r_m5_m3, a_r_m5_m3, psi_i_m5_m3, a_i_m5_m3, psi_a_m5_m3); - prodsum_psi_a_epi16(psi_r_m5_m5, a_r_m5_m5, psi_i_m5_m5, a_i_m5_m5, psi_a_m5_m5); - prodsum_psi_a_epi16(psi_r_m5_m7, a_r_m5_m7, psi_i_m5_m7, a_i_m5_m7, psi_a_m5_m7); - prodsum_psi_a_epi16(psi_r_m7_p7, a_r_m7_p7, psi_i_m7_p7, a_i_m7_p7, psi_a_m7_p7); - prodsum_psi_a_epi16(psi_r_m7_p5, a_r_m7_p5, psi_i_m7_p5, a_i_m7_p5, psi_a_m7_p5); - prodsum_psi_a_epi16(psi_r_m7_p3, a_r_m7_p3, psi_i_m7_p3, a_i_m7_p3, psi_a_m7_p3); - prodsum_psi_a_epi16(psi_r_m7_p1, a_r_m7_p1, psi_i_m7_p1, a_i_m7_p1, psi_a_m7_p1); - prodsum_psi_a_epi16(psi_r_m7_m1, a_r_m7_m1, psi_i_m7_m1, a_i_m7_m1, psi_a_m7_m1); - prodsum_psi_a_epi16(psi_r_m7_m3, a_r_m7_m3, psi_i_m7_m3, a_i_m7_m3, psi_a_m7_m3); - prodsum_psi_a_epi16(psi_r_m7_m5, a_r_m7_m5, psi_i_m7_m5, a_i_m7_m5, psi_a_m7_m5); - prodsum_psi_a_epi16(psi_r_m7_m7, a_r_m7_m7, psi_i_m7_m7, a_i_m7_m7, psi_a_m7_m7); - - // Calculation of a group of two terms in the bit metric involving squares of interference - square_a_epi16(a_r_p7_p7, a_i_p7_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_p7); - square_a_epi16(a_r_p7_p5, a_i_p7_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_p5); - square_a_epi16(a_r_p7_p3, a_i_p7_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_p3); - square_a_epi16(a_r_p7_p1, a_i_p7_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_p1); - square_a_epi16(a_r_p7_m1, a_i_p7_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_m1); - square_a_epi16(a_r_p7_m3, a_i_p7_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_m3); - square_a_epi16(a_r_p7_m5, a_i_p7_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_m5); - square_a_epi16(a_r_p7_m7, a_i_p7_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_m7); - square_a_epi16(a_r_p5_p7, a_i_p5_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_p7); - square_a_epi16(a_r_p5_p5, a_i_p5_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_p5); - square_a_epi16(a_r_p5_p3, a_i_p5_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_p3); - square_a_epi16(a_r_p5_p1, a_i_p5_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_p1); - square_a_epi16(a_r_p5_m1, a_i_p5_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_m1); - square_a_epi16(a_r_p5_m3, a_i_p5_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_m3); - square_a_epi16(a_r_p5_m5, a_i_p5_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_m5); - square_a_epi16(a_r_p5_m7, a_i_p5_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_m7); - square_a_epi16(a_r_p3_p7, a_i_p3_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_p7); - square_a_epi16(a_r_p3_p5, a_i_p3_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_p5); - square_a_epi16(a_r_p3_p3, a_i_p3_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_p3); - square_a_epi16(a_r_p3_p1, a_i_p3_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_p1); - square_a_epi16(a_r_p3_m1, a_i_p3_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_m1); - square_a_epi16(a_r_p3_m3, a_i_p3_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_m3); - square_a_epi16(a_r_p3_m5, a_i_p3_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_m5); - square_a_epi16(a_r_p3_m7, a_i_p3_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_m7); - square_a_epi16(a_r_p1_p7, a_i_p1_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p7); - square_a_epi16(a_r_p1_p5, a_i_p1_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p5); - square_a_epi16(a_r_p1_p3, a_i_p1_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p3); - square_a_epi16(a_r_p1_p1, a_i_p1_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p1); - square_a_epi16(a_r_p1_m1, a_i_p1_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m1); - square_a_epi16(a_r_p1_m3, a_i_p1_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m3); - square_a_epi16(a_r_p1_m5, a_i_p1_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m5); - square_a_epi16(a_r_p1_m7, a_i_p1_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m7); - square_a_epi16(a_r_m1_p7, a_i_m1_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p7); - square_a_epi16(a_r_m1_p5, a_i_m1_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p5); - square_a_epi16(a_r_m1_p3, a_i_m1_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p3); - square_a_epi16(a_r_m1_p1, a_i_m1_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p1); - square_a_epi16(a_r_m1_m1, a_i_m1_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m1); - square_a_epi16(a_r_m1_m3, a_i_m1_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m3); - square_a_epi16(a_r_m1_m5, a_i_m1_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m5); - square_a_epi16(a_r_m1_m7, a_i_m1_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m7); - square_a_epi16(a_r_m3_p7, a_i_m3_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_p7); - square_a_epi16(a_r_m3_p5, a_i_m3_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_p5); - square_a_epi16(a_r_m3_p3, a_i_m3_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_p3); - square_a_epi16(a_r_m3_p1, a_i_m3_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_p1); - square_a_epi16(a_r_m3_m1, a_i_m3_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_m1); - square_a_epi16(a_r_m3_m3, a_i_m3_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_m3); - square_a_epi16(a_r_m3_m5, a_i_m3_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_m5); - square_a_epi16(a_r_m3_m7, a_i_m3_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_m7); - square_a_epi16(a_r_m5_p7, a_i_m5_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_p7); - square_a_epi16(a_r_m5_p5, a_i_m5_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_p5); - square_a_epi16(a_r_m5_p3, a_i_m5_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_p3); - square_a_epi16(a_r_m5_p1, a_i_m5_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_p1); - square_a_epi16(a_r_m5_m1, a_i_m5_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_m1); - square_a_epi16(a_r_m5_m3, a_i_m5_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_m3); - square_a_epi16(a_r_m5_m5, a_i_m5_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_m5); - square_a_epi16(a_r_m5_m7, a_i_m5_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_m7); - square_a_epi16(a_r_m7_p7, a_i_m7_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_p7); - square_a_epi16(a_r_m7_p5, a_i_m7_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_p5); - square_a_epi16(a_r_m7_p3, a_i_m7_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_p3); - square_a_epi16(a_r_m7_p1, a_i_m7_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_p1); - square_a_epi16(a_r_m7_m1, a_i_m7_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_m1); - square_a_epi16(a_r_m7_m3, a_i_m7_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_m3); - square_a_epi16(a_r_m7_m5, a_i_m7_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_m5); - square_a_epi16(a_r_m7_m7, a_i_m7_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_m7); - - // Computing different multiples of ||h0||^2 - // x=1, y=1 - ch_mag_2_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,ONE_OVER_FOUR_SQRT_42); - ch_mag_2_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_2_over_42_with_sigma2,1); - // x=1, y=3 - ch_mag_10_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FIVE_OVER_FOUR_SQRT_42); - ch_mag_10_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_10_over_42_with_sigma2,1); - // x=1, x=5 - ch_mag_26_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTEEN_OVER_FOUR_SQRT_42); - ch_mag_26_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_26_over_42_with_sigma2,1); - // x=1, y=7 - ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42); - ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1); - // x=3, y=3 - ch_mag_18_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,NINE_OVER_FOUR_SQRT_42); - ch_mag_18_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_18_over_42_with_sigma2,1); - // x=3, y=5 - ch_mag_34_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,SEVENTEEN_OVER_FOUR_SQRT_42); - ch_mag_34_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_34_over_42_with_sigma2,1); - // x=3, y=7 - ch_mag_58_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYNINE_OVER_FOUR_SQRT_42); - ch_mag_58_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_58_over_42_with_sigma2,2); - // x=5, y=5 - ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42); - ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1); - // x=5, y=7 - ch_mag_74_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTYSEVEN_OVER_FOUR_SQRT_42); - ch_mag_74_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_74_over_42_with_sigma2,2); - // x=7, y=7 - ch_mag_98_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FORTYNINE_OVER_FOUR_SQRT_42); - ch_mag_98_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_98_over_42_with_sigma2,2); - - // Computing Metrics - xmm0 = _mm_subs_epi16(psi_a_p7_p7, a_sq_p7_p7); - xmm1 = _mm_adds_epi16(xmm0, y0_p_7_7); - bit_met_p7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p7_p5, a_sq_p7_p5); - xmm1 = _mm_adds_epi16(xmm0, y0_p_7_5); - bit_met_p7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p7_p3, a_sq_p7_p3); - xmm1 = _mm_adds_epi16(xmm0, y0_p_7_3); - bit_met_p7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p7_p1, a_sq_p7_p1); - xmm1 = _mm_adds_epi16(xmm0, y0_p_7_1); - bit_met_p7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p7_m1, a_sq_p7_m1); - xmm1 = _mm_adds_epi16(xmm0, y0_m_7_1); - bit_met_p7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p7_m3, a_sq_p7_m3); - xmm1 = _mm_adds_epi16(xmm0, y0_m_7_3); - bit_met_p7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p7_m5, a_sq_p7_m5); - xmm1 = _mm_adds_epi16(xmm0, y0_m_7_5); - bit_met_p7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p7_m7, a_sq_p7_m7); - xmm1 = _mm_adds_epi16(xmm0, y0_m_7_7); - bit_met_p7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p5_p7, a_sq_p5_p7); - xmm1 = _mm_adds_epi16(xmm0, y0_p_5_7); - bit_met_p5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p5_p5, a_sq_p5_p5); - xmm1 = _mm_adds_epi16(xmm0, y0_p_5_5); - bit_met_p5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p5_p3, a_sq_p5_p3); - xmm1 = _mm_adds_epi16(xmm0, y0_p_5_3); - bit_met_p5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p5_p1, a_sq_p5_p1); - xmm1 = _mm_adds_epi16(xmm0, y0_p_5_1); - bit_met_p5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p5_m1, a_sq_p5_m1); - xmm1 = _mm_adds_epi16(xmm0, y0_m_5_1); - bit_met_p5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p5_m3, a_sq_p5_m3); - xmm1 = _mm_adds_epi16(xmm0, y0_m_5_3); - bit_met_p5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p5_m5, a_sq_p5_m5); - xmm1 = _mm_adds_epi16(xmm0, y0_m_5_5); - bit_met_p5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p5_m7, a_sq_p5_m7); - xmm1 = _mm_adds_epi16(xmm0, y0_m_5_7); - bit_met_p5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p3_p7, a_sq_p3_p7); - xmm1 = _mm_adds_epi16(xmm0, y0_p_3_7); - bit_met_p3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p3_p5, a_sq_p3_p5); - xmm1 = _mm_adds_epi16(xmm0, y0_p_3_5); - bit_met_p3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p3_p3, a_sq_p3_p3); - xmm1 = _mm_adds_epi16(xmm0, y0_p_3_3); - bit_met_p3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p3_p1, a_sq_p3_p1); - xmm1 = _mm_adds_epi16(xmm0, y0_p_3_1); - bit_met_p3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p3_m1, a_sq_p3_m1); - xmm1 = _mm_adds_epi16(xmm0, y0_m_3_1); - bit_met_p3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p3_m3, a_sq_p3_m3); - xmm1 = _mm_adds_epi16(xmm0, y0_m_3_3); - bit_met_p3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p3_m5, a_sq_p3_m5); - xmm1 = _mm_adds_epi16(xmm0, y0_m_3_5); - bit_met_p3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p3_m7, a_sq_p3_m7); - xmm1 = _mm_adds_epi16(xmm0, y0_m_3_7); - bit_met_p3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p1_p7, a_sq_p1_p7); - xmm1 = _mm_adds_epi16(xmm0, y0_p_1_7); - bit_met_p1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p1_p5, a_sq_p1_p5); - xmm1 = _mm_adds_epi16(xmm0, y0_p_1_5); - bit_met_p1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p1_p3, a_sq_p1_p3); - xmm1 = _mm_adds_epi16(xmm0, y0_p_1_3); - bit_met_p1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p1_p1, a_sq_p1_p1); - xmm1 = _mm_adds_epi16(xmm0, y0_p_1_1); - bit_met_p1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p1_m1, a_sq_p1_m1); - xmm1 = _mm_adds_epi16(xmm0, y0_m_1_1); - bit_met_p1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p1_m3, a_sq_p1_m3); - xmm1 = _mm_adds_epi16(xmm0, y0_m_1_3); - bit_met_p1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p1_m5, a_sq_p1_m5); - xmm1 = _mm_adds_epi16(xmm0, y0_m_1_5); - bit_met_p1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p1_m7, a_sq_p1_m7); - xmm1 = _mm_adds_epi16(xmm0, y0_m_1_7); - bit_met_p1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - - xmm0 = _mm_subs_epi16(psi_a_m1_p7, a_sq_m1_p7); - xmm1 = _mm_subs_epi16(xmm0, y0_m_1_7); - bit_met_m1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m1_p5, a_sq_m1_p5); - xmm1 = _mm_subs_epi16(xmm0, y0_m_1_5); - bit_met_m1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m1_p3, a_sq_m1_p3); - xmm1 = _mm_subs_epi16(xmm0, y0_m_1_3); - bit_met_m1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m1_p1, a_sq_m1_p1); - xmm1 = _mm_subs_epi16(xmm0, y0_m_1_1); - bit_met_m1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m1_m1, a_sq_m1_m1); - xmm1 = _mm_subs_epi16(xmm0, y0_p_1_1); - bit_met_m1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m1_m3, a_sq_m1_m3); - xmm1 = _mm_subs_epi16(xmm0, y0_p_1_3); - bit_met_m1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m1_m5, a_sq_m1_m5); - xmm1 = _mm_subs_epi16(xmm0, y0_p_1_5); - bit_met_m1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m1_m7, a_sq_m1_m7); - xmm1 = _mm_subs_epi16(xmm0, y0_p_1_7); - bit_met_m1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m3_p7, a_sq_m3_p7); - xmm1 = _mm_subs_epi16(xmm0, y0_m_3_7); - bit_met_m3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m3_p5, a_sq_m3_p5); - xmm1 = _mm_subs_epi16(xmm0, y0_m_3_5); - bit_met_m3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m3_p3, a_sq_m3_p3); - xmm1 = _mm_subs_epi16(xmm0, y0_m_3_3); - bit_met_m3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m3_p1, a_sq_m3_p1); - xmm1 = _mm_subs_epi16(xmm0, y0_m_3_1); - bit_met_m3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m3_m1, a_sq_m3_m1); - xmm1 = _mm_subs_epi16(xmm0, y0_p_3_1); - bit_met_m3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m3_m3, a_sq_m3_m3); - xmm1 = _mm_subs_epi16(xmm0, y0_p_3_3); - bit_met_m3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m3_m5, a_sq_m3_m5); - xmm1 = _mm_subs_epi16(xmm0, y0_p_3_5); - bit_met_m3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m3_m7, a_sq_m3_m7); - xmm1 = _mm_subs_epi16(xmm0, y0_p_3_7); - bit_met_m3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m5_p7, a_sq_m5_p7); - xmm1 = _mm_subs_epi16(xmm0, y0_m_5_7); - bit_met_m5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m5_p5, a_sq_m5_p5); - xmm1 = _mm_subs_epi16(xmm0, y0_m_5_5); - bit_met_m5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m5_p3, a_sq_m5_p3); - xmm1 = _mm_subs_epi16(xmm0, y0_m_5_3); - bit_met_m5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m5_p1, a_sq_m5_p1); - xmm1 = _mm_subs_epi16(xmm0, y0_m_5_1); - bit_met_m5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m5_m1, a_sq_m5_m1); - xmm1 = _mm_subs_epi16(xmm0, y0_p_5_1); - bit_met_m5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m5_m3, a_sq_m5_m3); - xmm1 = _mm_subs_epi16(xmm0, y0_p_5_3); - bit_met_m5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m5_m5, a_sq_m5_m5); - xmm1 = _mm_subs_epi16(xmm0, y0_p_5_5); - bit_met_m5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m5_m7, a_sq_m5_m7); - xmm1 = _mm_subs_epi16(xmm0, y0_p_5_7); - bit_met_m5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m7_p7, a_sq_m7_p7); - xmm1 = _mm_subs_epi16(xmm0, y0_m_7_7); - bit_met_m7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m7_p5, a_sq_m7_p5); - xmm1 = _mm_subs_epi16(xmm0, y0_m_7_5); - bit_met_m7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m7_p3, a_sq_m7_p3); - xmm1 = _mm_subs_epi16(xmm0, y0_m_7_3); - bit_met_m7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m7_p1, a_sq_m7_p1); - xmm1 = _mm_subs_epi16(xmm0, y0_m_7_1); - bit_met_m7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m7_m1, a_sq_m7_m1); - xmm1 = _mm_subs_epi16(xmm0, y0_p_7_1); - bit_met_m7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m7_m3, a_sq_m7_m3); - xmm1 = _mm_subs_epi16(xmm0, y0_p_7_3); - bit_met_m7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m7_m5, a_sq_m7_m5); - xmm1 = _mm_subs_epi16(xmm0, y0_p_7_5); - bit_met_m7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m7_m7, a_sq_m7_m7); - xmm1 = _mm_subs_epi16(xmm0, y0_p_7_7); - bit_met_m7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); - - // Detection for 1st bit (LTE mapping) - // bit = 1 - xmm0 = _mm_max_epi16(bit_met_m7_p7, bit_met_m7_p5); - xmm1 = _mm_max_epi16(bit_met_m7_p3, bit_met_m7_p1); - xmm2 = _mm_max_epi16(bit_met_m7_m1, bit_met_m7_m3); - xmm3 = _mm_max_epi16(bit_met_m7_m5, bit_met_m7_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_m5_p7, bit_met_m5_p5); - xmm1 = _mm_max_epi16(bit_met_m5_p3, bit_met_m5_p1); - xmm2 = _mm_max_epi16(bit_met_m5_m1, bit_met_m5_m3); - xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m5_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_m3_p7, bit_met_m3_p5); - xmm1 = _mm_max_epi16(bit_met_m3_p3, bit_met_m3_p1); - xmm2 = _mm_max_epi16(bit_met_m3_m1, bit_met_m3_m3); - xmm3 = _mm_max_epi16(bit_met_m3_m5, bit_met_m3_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_m1_p7, bit_met_m1_p5); - xmm1 = _mm_max_epi16(bit_met_m1_p3, bit_met_m1_p1); - xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m1_m3); - xmm3 = _mm_max_epi16(bit_met_m1_m5, bit_met_m1_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - // bit = 0 - xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p7_p5); - xmm1 = _mm_max_epi16(bit_met_p7_p3, bit_met_p7_p1); - xmm2 = _mm_max_epi16(bit_met_p7_m1, bit_met_p7_m3); - xmm3 = _mm_max_epi16(bit_met_p7_m5, bit_met_p7_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p5_p7, bit_met_p5_p5); - xmm1 = _mm_max_epi16(bit_met_p5_p3, bit_met_p5_p1); - xmm2 = _mm_max_epi16(bit_met_p5_m1, bit_met_p5_m3); - xmm3 = _mm_max_epi16(bit_met_p5_m5, bit_met_p5_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p3_p7, bit_met_p3_p5); - xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p3_p1); - xmm2 = _mm_max_epi16(bit_met_p3_m1, bit_met_p3_m3); - xmm3 = _mm_max_epi16(bit_met_p3_m5, bit_met_p3_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p1_p7, bit_met_p1_p5); - xmm1 = _mm_max_epi16(bit_met_p1_p3, bit_met_p1_p1); - xmm2 = _mm_max_epi16(bit_met_p1_m1, bit_met_p1_m3); - xmm3 = _mm_max_epi16(bit_met_p1_m5, bit_met_p1_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y0r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - // Detection for 2nd bit (LTE mapping) - // bit = 1 - xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); - xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); - xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); - xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); - xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); - xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); - xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); - xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); - xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); - xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); - xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); - xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); - xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - // bit = 0 - xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); - xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); - xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); - xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); - xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); - xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); - xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); - xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); - xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); - xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); - xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); - xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y1r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - // Detection for 3rd bit (LTE mapping) - xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5); - xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1); - xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3); - xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5); - xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1); - xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3); - xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5); - xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1); - xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3); - xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5); - xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1); - xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3); - xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5); - xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1); - xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5); - xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1); - xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3); - xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5); - xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1); - xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3); - xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5); - xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1); - xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y2r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - // Detection for 4th bit (LTE mapping) - xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); - xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); - xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); - xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); - xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); - xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); - xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); - xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); - xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); - xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); - xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); - xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); - xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); - xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); - xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); - xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); - xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); - xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); - xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); - xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); - xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); - xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); - xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); - xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y0i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - - // Detection for 5th bit (LTE mapping) - xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5); - xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1); - xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3); - xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5); - xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1); - xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3); - xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5); - xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1); - xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3); - xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5); - xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1); - xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3); - xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5); - xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1); - xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3); - xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5); - xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1); - xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5); - xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1); - xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5); - xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1); - xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3); - xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y1i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - // Detection for 6th bit (LTE mapping) - xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); - xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); - xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); - xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); - xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); - xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); - xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); - xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); - xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); - xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); - xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); - xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); - xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); - xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); - xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); - xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); - xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); - xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); - xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); - xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); - xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); - xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); - xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); - xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y2i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - - // map to output stream, difficult to do in SIMD since we have 6 16bit LLRs - // RE 1 - j = 24*i; - stream0_out[j + 0] = ((short *)&y0r)[0]; - stream0_out[j + 1] = ((short *)&y1r)[0]; - stream0_out[j + 2] = ((short *)&y2r)[0]; - stream0_out[j + 3] = ((short *)&y0i)[0]; - stream0_out[j + 4] = ((short *)&y1i)[0]; - stream0_out[j + 5] = ((short *)&y2i)[0]; - // RE 2 - stream0_out[j + 6] = ((short *)&y0r)[1]; - stream0_out[j + 7] = ((short *)&y1r)[1]; - stream0_out[j + 8] = ((short *)&y2r)[1]; - stream0_out[j + 9] = ((short *)&y0i)[1]; - stream0_out[j + 10] = ((short *)&y1i)[1]; - stream0_out[j + 11] = ((short *)&y2i)[1]; - // RE 3 - stream0_out[j + 12] = ((short *)&y0r)[2]; - stream0_out[j + 13] = ((short *)&y1r)[2]; - stream0_out[j + 14] = ((short *)&y2r)[2]; - stream0_out[j + 15] = ((short *)&y0i)[2]; - stream0_out[j + 16] = ((short *)&y1i)[2]; - stream0_out[j + 17] = ((short *)&y2i)[2]; - // RE 4 - stream0_out[j + 18] = ((short *)&y0r)[3]; - stream0_out[j + 19] = ((short *)&y1r)[3]; - stream0_out[j + 20] = ((short *)&y2r)[3]; - stream0_out[j + 21] = ((short *)&y0i)[3]; - stream0_out[j + 22] = ((short *)&y1i)[3]; - stream0_out[j + 23] = ((short *)&y2i)[3]; - // RE 5 - stream0_out[j + 24] = ((short *)&y0r)[4]; - stream0_out[j + 25] = ((short *)&y1r)[4]; - stream0_out[j + 26] = ((short *)&y2r)[4]; - stream0_out[j + 27] = ((short *)&y0i)[4]; - stream0_out[j + 28] = ((short *)&y1i)[4]; - stream0_out[j + 29] = ((short *)&y2i)[4]; - // RE 6 - stream0_out[j + 30] = ((short *)&y0r)[5]; - stream0_out[j + 31] = ((short *)&y1r)[5]; - stream0_out[j + 32] = ((short *)&y2r)[5]; - stream0_out[j + 33] = ((short *)&y0i)[5]; - stream0_out[j + 34] = ((short *)&y1i)[5]; - stream0_out[j + 35] = ((short *)&y2i)[5]; - // RE 7 - stream0_out[j + 36] = ((short *)&y0r)[6]; - stream0_out[j + 37] = ((short *)&y1r)[6]; - stream0_out[j + 38] = ((short *)&y2r)[6]; - stream0_out[j + 39] = ((short *)&y0i)[6]; - stream0_out[j + 40] = ((short *)&y1i)[6]; - stream0_out[j + 41] = ((short *)&y2i)[6]; - // RE 8 - stream0_out[j + 42] = ((short *)&y0r)[7]; - stream0_out[j + 43] = ((short *)&y1r)[7]; - stream0_out[j + 44] = ((short *)&y2r)[7]; - stream0_out[j + 45] = ((short *)&y0i)[7]; - stream0_out[j + 46] = ((short *)&y1i)[7]; - stream0_out[j + 47] = ((short *)&y2i)[7]; - -#elif defined(__arm__) - -#endif - } - -#if defined(__x86_64__) || defined(__i386__) - _mm_empty(); - _m_empty(); -#endif - -} - - -int dlsch_64qam_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms, - int32_t **rxdataF_comp, - int32_t **rxdataF_comp_i, - int32_t **dl_ch_mag, - int32_t **dl_ch_mag_i, - int32_t **rho_i, - int16_t *dlsch_llr, - uint8_t symbol, - uint8_t first_symbol_flag, - uint16_t nb_rb, - uint16_t pbch_pss_sss_adjust, - int16_t **llr16p) -{ - - int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *llr16; - int len; - uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; - - //first symbol has different structure due to more pilots - if (first_symbol_flag == 1) { - llr16 = (int16_t*)dlsch_llr; - } else { - llr16 = (int16_t*)(*llr16p); - } - - AssertFatal(llr16!=NULL,"dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol); - - if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { - // if symbol has pilots - if (frame_parms->nb_antenna_ports_eNB!=1) - // in 2 antenna ports we have 8 REs per symbol per RB - len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); - else - // for 1 antenna port we have 10 REs per symbol per RB - len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); - } else { - // symbol has no pilots - len = (nb_rb*12) - pbch_pss_sss_adjust; - } - - qam64_qam16((short *)rxF, - (short *)rxF_i, - (short *)ch_mag, - (short *)ch_mag_i, - (short *)llr16, - (short *)rho, - len); - - llr16 += (6*len); - *llr16p = (short *)llr16; - return(0); -} - -void qam64_qam64(short *stream0_in, - short *stream1_in, - short *ch_mag, - short *ch_mag_i, - short *stream0_out, - short *rho01, - int length - ) -{ - - /* - Author: S. Wagner - Date: 31-07-12 - - Input: - stream0_in: MF filter for 1st stream, i.e., y0=h0'*y - stream1_in: MF filter for 2nd stream, i.e., y1=h1'*y - ch_mag: 4*h0/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc - ch_mag_i: 4*h1/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc - rho01: Channel cross correlation, i.e., h1'*h0 - - Output: - stream0_out: output LLRs for 1st stream - */ - -#if defined(__x86_64__) || defined(__i386__) - - __m128i *rho01_128i = (__m128i *)rho01; - __m128i *stream0_128i_in = (__m128i *)stream0_in; - __m128i *stream1_128i_in = (__m128i *)stream1_in; - __m128i *ch_mag_128i = (__m128i *)ch_mag; - __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i; - - __m128i ONE_OVER_SQRT_42 = _mm_set1_epi16(10112); // round(1/sqrt(42)*2^16) - __m128i THREE_OVER_SQRT_42 = _mm_set1_epi16(30337); // round(3/sqrt(42)*2^16) - __m128i FIVE_OVER_SQRT_42 = _mm_set1_epi16(25281); // round(5/sqrt(42)*2^15) - __m128i SEVEN_OVER_SQRT_42 = _mm_set1_epi16(17697); // round(7/sqrt(42)*2^14) Q2.14 - __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15) - __m128i ONE_OVER_SQRT_2_42 = _mm_set1_epi16(3575); // round(1/sqrt(2*42)*2^15) - __m128i THREE_OVER_SQRT_2_42 = _mm_set1_epi16(10726); // round(3/sqrt(2*42)*2^15) - __m128i FIVE_OVER_SQRT_2_42 = _mm_set1_epi16(17876); // round(5/sqrt(2*42)*2^15) - __m128i SEVEN_OVER_SQRT_2_42 = _mm_set1_epi16(25027); // round(7/sqrt(2*42)*2^15) - __m128i FORTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(30969); // round(49/(4*sqrt(42))*2^14), Q2.14 - __m128i THIRTYSEVEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(23385); // round(37/(4*sqrt(42))*2^14), Q2.14 - __m128i TWENTYFIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(31601); // round(25/(4*sqrt(42))*2^15) - __m128i TWENTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(18329); // round(29/(4*sqrt(42))*2^15), Q2.14 - __m128i SEVENTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(21489); // round(17/(4*sqrt(42))*2^15) - __m128i NINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(11376); // round(9/(4*sqrt(42))*2^15) - __m128i THIRTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(16433); // round(13/(4*sqrt(42))*2^15) - __m128i FIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(6320); // round(5/(4*sqrt(42))*2^15) - __m128i ONE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(1264); // round(1/(4*sqrt(42))*2^15) - __m128i SQRT_42_OVER_FOUR = _mm_set1_epi16(13272); // round(sqrt(42)/4*2^13), Q3.12 - - __m128i ch_mag_des; - __m128i ch_mag_int; - __m128i ch_mag_98_over_42_with_sigma2; - __m128i ch_mag_74_over_42_with_sigma2; - __m128i ch_mag_58_over_42_with_sigma2; - __m128i ch_mag_50_over_42_with_sigma2; - __m128i ch_mag_34_over_42_with_sigma2; - __m128i ch_mag_18_over_42_with_sigma2; - __m128i ch_mag_26_over_42_with_sigma2; - __m128i ch_mag_10_over_42_with_sigma2; - __m128i ch_mag_2_over_42_with_sigma2; - __m128i y0r_one_over_sqrt_21; - __m128i y0r_three_over_sqrt_21; - __m128i y0r_five_over_sqrt_21; - __m128i y0r_seven_over_sqrt_21; - __m128i y0i_one_over_sqrt_21; - __m128i y0i_three_over_sqrt_21; - __m128i y0i_five_over_sqrt_21; - __m128i y0i_seven_over_sqrt_21; - __m128i ch_mag_int_with_sigma2; - __m128i two_ch_mag_int_with_sigma2; - __m128i three_ch_mag_int_with_sigma2; -#elif defined(__arm__) - -#endif - - int i,j; - - - for (i=0; i<length>>2; i+=2) { - -#if defined(__x86_64__) || defined(__i386__) - - // Get rho - xmm0 = rho01_128i[i]; - xmm1 = rho01_128i[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) - xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) - rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) - rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) - - // Compute the different rhos - rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42); - rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42); - rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42); - rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42); - rho_rpi_5_5 = _mm_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42); - rho_rmi_5_5 = _mm_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42); - rho_rpi_7_7 = _mm_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42); - rho_rmi_7_7 = _mm_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42); - - rho_rpi_5_5 = _mm_slli_epi16(rho_rpi_5_5, 1); - rho_rmi_5_5 = _mm_slli_epi16(rho_rmi_5_5, 1); - rho_rpi_7_7 = _mm_slli_epi16(rho_rpi_7_7, 2); - rho_rmi_7_7 = _mm_slli_epi16(rho_rmi_7_7, 2); - - xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_42); - xmm5 = _mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_42); - xmm6 = _mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_42); - xmm7 = _mm_mulhi_epi16(xmm3, FIVE_OVER_SQRT_42); - xmm8 = _mm_mulhi_epi16(xmm3, SEVEN_OVER_SQRT_42); - xmm7 = _mm_slli_epi16(xmm7, 1); - xmm8 = _mm_slli_epi16(xmm8, 2); - - rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm6); - rho_rmi_1_3 = _mm_subs_epi16(xmm4, xmm6); - rho_rpi_1_5 = _mm_adds_epi16(xmm4, xmm7); - rho_rmi_1_5 = _mm_subs_epi16(xmm4, xmm7); - rho_rpi_1_7 = _mm_adds_epi16(xmm4, xmm8); - rho_rmi_1_7 = _mm_subs_epi16(xmm4, xmm8); - - xmm4 = _mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_42); - rho_rpi_3_1 = _mm_adds_epi16(xmm4, xmm5); - rho_rmi_3_1 = _mm_subs_epi16(xmm4, xmm5); - rho_rpi_3_5 = _mm_adds_epi16(xmm4, xmm7); - rho_rmi_3_5 = _mm_subs_epi16(xmm4, xmm7); - rho_rpi_3_7 = _mm_adds_epi16(xmm4, xmm8); - rho_rmi_3_7 = _mm_subs_epi16(xmm4, xmm8); - - xmm4 = _mm_mulhi_epi16(xmm2, FIVE_OVER_SQRT_42); - xmm4 = _mm_slli_epi16(xmm4, 1); - rho_rpi_5_1 = _mm_adds_epi16(xmm4, xmm5); - rho_rmi_5_1 = _mm_subs_epi16(xmm4, xmm5); - rho_rpi_5_3 = _mm_adds_epi16(xmm4, xmm6); - rho_rmi_5_3 = _mm_subs_epi16(xmm4, xmm6); - rho_rpi_5_7 = _mm_adds_epi16(xmm4, xmm8); - rho_rmi_5_7 = _mm_subs_epi16(xmm4, xmm8); - - xmm4 = _mm_mulhi_epi16(xmm2, SEVEN_OVER_SQRT_42); - xmm4 = _mm_slli_epi16(xmm4, 2); - rho_rpi_7_1 = _mm_adds_epi16(xmm4, xmm5); - rho_rmi_7_1 = _mm_subs_epi16(xmm4, xmm5); - rho_rpi_7_3 = _mm_adds_epi16(xmm4, xmm6); - rho_rmi_7_3 = _mm_subs_epi16(xmm4, xmm6); - rho_rpi_7_5 = _mm_adds_epi16(xmm4, xmm7); - rho_rmi_7_5 = _mm_subs_epi16(xmm4, xmm7); - - // Rearrange interfering MF output - xmm0 = stream1_128i_in[i]; - xmm1 = stream1_128i_in[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] - y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] - - // Psi_r calculation from rho_rpi or rho_rmi - xmm0 = _mm_setzero_si128(); // ZERO for abs_pi16 - xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1r); - psi_r_p7_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1r); - psi_r_p7_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1r); - psi_r_p7_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1r); - psi_r_p7_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1r); - psi_r_p7_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1r); - psi_r_p7_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1r); - psi_r_p7_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1r); - psi_r_p7_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1r); - psi_r_p5_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1r); - psi_r_p5_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1r); - psi_r_p5_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1r); - psi_r_p5_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1r); - psi_r_p5_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1r); - psi_r_p5_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1r); - psi_r_p5_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1r); - psi_r_p5_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1r); - psi_r_p3_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1r); - psi_r_p3_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1r); - psi_r_p3_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1r); - psi_r_p3_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1r); - psi_r_p3_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1r); - psi_r_p3_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1r); - psi_r_p3_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1r); - psi_r_p3_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1r); - psi_r_p1_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1r); - psi_r_p1_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1r); - psi_r_p1_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1r); - psi_r_p1_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1r); - psi_r_p1_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1r); - psi_r_p1_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1r); - psi_r_p1_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1r); - psi_r_p1_m7 = _mm_abs_epi16(xmm2); - - xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1r); - psi_r_m1_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1r); - psi_r_m1_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1r); - psi_r_m1_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1r); - psi_r_m1_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1r); - psi_r_m1_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1r); - psi_r_m1_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1r); - psi_r_m1_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1r); - psi_r_m1_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1r); - psi_r_m3_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1r); - psi_r_m3_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1r); - psi_r_m3_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1r); - psi_r_m3_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1r); - psi_r_m3_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1r); - psi_r_m3_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1r); - psi_r_m3_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1r); - psi_r_m3_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1r); - psi_r_m5_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1r); - psi_r_m5_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1r); - psi_r_m5_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1r); - psi_r_m5_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1r); - psi_r_m5_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1r); - psi_r_m5_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1r); - psi_r_m5_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1r); - psi_r_m5_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1r); - psi_r_m7_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1r); - psi_r_m7_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1r); - psi_r_m7_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1r); - psi_r_m7_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1r); - psi_r_m7_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1r); - psi_r_m7_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1r); - psi_r_m7_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1r); - psi_r_m7_m7 = _mm_abs_epi16(xmm2); - - // Psi_i calculation from rho_rpi or rho_rmi - xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1i); - psi_i_p7_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1i); - psi_i_p7_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1i); - psi_i_p7_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1i); - psi_i_p7_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1i); - psi_i_p7_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1i); - psi_i_p7_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1i); - psi_i_p7_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1i); - psi_i_p7_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1i); - psi_i_p5_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1i); - psi_i_p5_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1i); - psi_i_p5_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1i); - psi_i_p5_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1i); - psi_i_p5_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1i); - psi_i_p5_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1i); - psi_i_p5_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1i); - psi_i_p5_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1i); - psi_i_p3_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1i); - psi_i_p3_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1i); - psi_i_p3_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1i); - psi_i_p3_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1i); - psi_i_p3_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1i); - psi_i_p3_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1i); - psi_i_p3_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1i); - psi_i_p3_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1i); - psi_i_p1_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1i); - psi_i_p1_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1i); - psi_i_p1_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1i); - psi_i_p1_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1i); - psi_i_p1_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1i); - psi_i_p1_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1i); - psi_i_p1_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1i); - psi_i_p1_m7 = _mm_abs_epi16(xmm2); - - xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1i); - psi_i_m1_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1i); - psi_i_m1_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1i); - psi_i_m1_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1i); - psi_i_m1_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1i); - psi_i_m1_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1i); - psi_i_m1_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1i); - psi_i_m1_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1i); - psi_i_m1_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1i); - psi_i_m3_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1i); - psi_i_m3_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1i); - psi_i_m3_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1i); - psi_i_m3_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1i); - psi_i_m3_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1i); - psi_i_m3_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1i); - psi_i_m3_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1i); - psi_i_m3_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1i); - psi_i_m5_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1i); - psi_i_m5_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1i); - psi_i_m5_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1i); - psi_i_m5_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1i); - psi_i_m5_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1i); - psi_i_m5_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1i); - psi_i_m5_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1i); - psi_i_m5_m7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1i); - psi_i_m7_p7 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1i); - psi_i_m7_p5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1i); - psi_i_m7_p3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1i); - psi_i_m7_p1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1i); - psi_i_m7_m1 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1i); - psi_i_m7_m3 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1i); - psi_i_m7_m5 = _mm_abs_epi16(xmm2); - xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1i); - psi_i_m7_m7 = _mm_abs_epi16(xmm2); - - - // Rearrange desired MF output - xmm0 = stream0_128i_in[i]; - xmm1 = stream0_128i_in[i+1]; - xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] - //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] - y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] - y0i = _mm_unpackhi_epi64(xmm0,xmm1); - - // Rearrange desired channel magnitudes - xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10)) - xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10)) - xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); - - // Rearrange interfering channel magnitudes - xmm2 = ch_mag_128i_i[i]; - xmm3 = ch_mag_128i_i[i+1]; - xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); - ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3); - - y0r_one_over_sqrt_21 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_42); - y0r_three_over_sqrt_21 = _mm_mulhi_epi16(y0r, THREE_OVER_SQRT_42); - y0r_five_over_sqrt_21 = _mm_mulhi_epi16(y0r, FIVE_OVER_SQRT_42); - y0r_five_over_sqrt_21 = _mm_slli_epi16(y0r_five_over_sqrt_21, 1); - y0r_seven_over_sqrt_21 = _mm_mulhi_epi16(y0r, SEVEN_OVER_SQRT_42); - y0r_seven_over_sqrt_21 = _mm_slli_epi16(y0r_seven_over_sqrt_21, 2); // Q2.14 - - y0i_one_over_sqrt_21 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_42); - y0i_three_over_sqrt_21 = _mm_mulhi_epi16(y0i, THREE_OVER_SQRT_42); - y0i_five_over_sqrt_21 = _mm_mulhi_epi16(y0i, FIVE_OVER_SQRT_42); - y0i_five_over_sqrt_21 = _mm_slli_epi16(y0i_five_over_sqrt_21, 1); - y0i_seven_over_sqrt_21 = _mm_mulhi_epi16(y0i, SEVEN_OVER_SQRT_42); - y0i_seven_over_sqrt_21 = _mm_slli_epi16(y0i_seven_over_sqrt_21, 2); // Q2.14 - - y0_p_7_1 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_7_3 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_7_5 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_7_7 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_p_5_1 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_5_3 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_5_5 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_5_7 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_3_5 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_3_7 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_p_1_1 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_1_3 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_1_5 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_1_7 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); - - y0_m_1_1 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_1_3 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_1_5 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_1_7 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_3_5 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_3_7 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_m_5_1 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_5_3 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_5_5 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_5_7 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_m_7_1 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_7_3 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_7_5 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_7_7 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); - - // Detection of interference term - ch_mag_int_with_sigma2 = _mm_srai_epi16(ch_mag_int, 1); // *2 - two_ch_mag_int_with_sigma2 = ch_mag_int; // *4 - three_ch_mag_int_with_sigma2 = _mm_adds_epi16(ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2); // *6 - - interference_abs_64qam_epi16(psi_r_p7_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p7_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p7_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p7_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p7_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p7_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p7_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p7_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p5_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p5_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p5_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p5_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p5_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p5_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p5_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p5_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p3_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p3_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p3_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p3_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p3_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p3_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p3_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p3_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p1_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p1_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p1_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p1_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p1_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_p1_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m1_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m1_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m1_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m1_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m1_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m1_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m3_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m3_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m3_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m3_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m3_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m3_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m3_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m3_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m5_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m5_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m5_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m5_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m5_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m5_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m5_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m5_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m7_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m7_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m7_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m7_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m7_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m7_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m7_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_r_m7_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - - interference_abs_64qam_epi16(psi_i_p7_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p7_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p7_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p7_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p7_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p7_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p7_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p7_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p5_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p5_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p5_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p5_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p5_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p5_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p5_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p5_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p3_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p3_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p3_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p3_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p3_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p3_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p3_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p3_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p1_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p1_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p1_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p1_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p1_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_p1_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m1_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m1_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m1_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m1_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m1_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m1_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m3_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m3_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m3_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m3_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m3_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m3_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m3_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m3_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m5_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m5_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m5_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m5_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m5_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m5_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m5_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m5_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m7_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m7_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m7_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m7_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m7_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m7_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m7_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16(psi_i_m7_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - - // Calculation of a group of two terms in the bit metric involving product of psi and interference - prodsum_psi_a_epi16(psi_r_p7_p7, a_r_p7_p7, psi_i_p7_p7, a_i_p7_p7, psi_a_p7_p7); - prodsum_psi_a_epi16(psi_r_p7_p5, a_r_p7_p5, psi_i_p7_p5, a_i_p7_p5, psi_a_p7_p5); - prodsum_psi_a_epi16(psi_r_p7_p3, a_r_p7_p3, psi_i_p7_p3, a_i_p7_p3, psi_a_p7_p3); - prodsum_psi_a_epi16(psi_r_p7_p1, a_r_p7_p1, psi_i_p7_p1, a_i_p7_p1, psi_a_p7_p1); - prodsum_psi_a_epi16(psi_r_p7_m1, a_r_p7_m1, psi_i_p7_m1, a_i_p7_m1, psi_a_p7_m1); - prodsum_psi_a_epi16(psi_r_p7_m3, a_r_p7_m3, psi_i_p7_m3, a_i_p7_m3, psi_a_p7_m3); - prodsum_psi_a_epi16(psi_r_p7_m5, a_r_p7_m5, psi_i_p7_m5, a_i_p7_m5, psi_a_p7_m5); - prodsum_psi_a_epi16(psi_r_p7_m7, a_r_p7_m7, psi_i_p7_m7, a_i_p7_m7, psi_a_p7_m7); - prodsum_psi_a_epi16(psi_r_p5_p7, a_r_p5_p7, psi_i_p5_p7, a_i_p5_p7, psi_a_p5_p7); - prodsum_psi_a_epi16(psi_r_p5_p5, a_r_p5_p5, psi_i_p5_p5, a_i_p5_p5, psi_a_p5_p5); - prodsum_psi_a_epi16(psi_r_p5_p3, a_r_p5_p3, psi_i_p5_p3, a_i_p5_p3, psi_a_p5_p3); - prodsum_psi_a_epi16(psi_r_p5_p1, a_r_p5_p1, psi_i_p5_p1, a_i_p5_p1, psi_a_p5_p1); - prodsum_psi_a_epi16(psi_r_p5_m1, a_r_p5_m1, psi_i_p5_m1, a_i_p5_m1, psi_a_p5_m1); - prodsum_psi_a_epi16(psi_r_p5_m3, a_r_p5_m3, psi_i_p5_m3, a_i_p5_m3, psi_a_p5_m3); - prodsum_psi_a_epi16(psi_r_p5_m5, a_r_p5_m5, psi_i_p5_m5, a_i_p5_m5, psi_a_p5_m5); - prodsum_psi_a_epi16(psi_r_p5_m7, a_r_p5_m7, psi_i_p5_m7, a_i_p5_m7, psi_a_p5_m7); - prodsum_psi_a_epi16(psi_r_p3_p7, a_r_p3_p7, psi_i_p3_p7, a_i_p3_p7, psi_a_p3_p7); - prodsum_psi_a_epi16(psi_r_p3_p5, a_r_p3_p5, psi_i_p3_p5, a_i_p3_p5, psi_a_p3_p5); - prodsum_psi_a_epi16(psi_r_p3_p3, a_r_p3_p3, psi_i_p3_p3, a_i_p3_p3, psi_a_p3_p3); - prodsum_psi_a_epi16(psi_r_p3_p1, a_r_p3_p1, psi_i_p3_p1, a_i_p3_p1, psi_a_p3_p1); - prodsum_psi_a_epi16(psi_r_p3_m1, a_r_p3_m1, psi_i_p3_m1, a_i_p3_m1, psi_a_p3_m1); - prodsum_psi_a_epi16(psi_r_p3_m3, a_r_p3_m3, psi_i_p3_m3, a_i_p3_m3, psi_a_p3_m3); - prodsum_psi_a_epi16(psi_r_p3_m5, a_r_p3_m5, psi_i_p3_m5, a_i_p3_m5, psi_a_p3_m5); - prodsum_psi_a_epi16(psi_r_p3_m7, a_r_p3_m7, psi_i_p3_m7, a_i_p3_m7, psi_a_p3_m7); - prodsum_psi_a_epi16(psi_r_p1_p7, a_r_p1_p7, psi_i_p1_p7, a_i_p1_p7, psi_a_p1_p7); - prodsum_psi_a_epi16(psi_r_p1_p5, a_r_p1_p5, psi_i_p1_p5, a_i_p1_p5, psi_a_p1_p5); - prodsum_psi_a_epi16(psi_r_p1_p3, a_r_p1_p3, psi_i_p1_p3, a_i_p1_p3, psi_a_p1_p3); - prodsum_psi_a_epi16(psi_r_p1_p1, a_r_p1_p1, psi_i_p1_p1, a_i_p1_p1, psi_a_p1_p1); - prodsum_psi_a_epi16(psi_r_p1_m1, a_r_p1_m1, psi_i_p1_m1, a_i_p1_m1, psi_a_p1_m1); - prodsum_psi_a_epi16(psi_r_p1_m3, a_r_p1_m3, psi_i_p1_m3, a_i_p1_m3, psi_a_p1_m3); - prodsum_psi_a_epi16(psi_r_p1_m5, a_r_p1_m5, psi_i_p1_m5, a_i_p1_m5, psi_a_p1_m5); - prodsum_psi_a_epi16(psi_r_p1_m7, a_r_p1_m7, psi_i_p1_m7, a_i_p1_m7, psi_a_p1_m7); - prodsum_psi_a_epi16(psi_r_m1_p7, a_r_m1_p7, psi_i_m1_p7, a_i_m1_p7, psi_a_m1_p7); - prodsum_psi_a_epi16(psi_r_m1_p5, a_r_m1_p5, psi_i_m1_p5, a_i_m1_p5, psi_a_m1_p5); - prodsum_psi_a_epi16(psi_r_m1_p3, a_r_m1_p3, psi_i_m1_p3, a_i_m1_p3, psi_a_m1_p3); - prodsum_psi_a_epi16(psi_r_m1_p1, a_r_m1_p1, psi_i_m1_p1, a_i_m1_p1, psi_a_m1_p1); - prodsum_psi_a_epi16(psi_r_m1_m1, a_r_m1_m1, psi_i_m1_m1, a_i_m1_m1, psi_a_m1_m1); - prodsum_psi_a_epi16(psi_r_m1_m3, a_r_m1_m3, psi_i_m1_m3, a_i_m1_m3, psi_a_m1_m3); - prodsum_psi_a_epi16(psi_r_m1_m5, a_r_m1_m5, psi_i_m1_m5, a_i_m1_m5, psi_a_m1_m5); - prodsum_psi_a_epi16(psi_r_m1_m7, a_r_m1_m7, psi_i_m1_m7, a_i_m1_m7, psi_a_m1_m7); - prodsum_psi_a_epi16(psi_r_m3_p7, a_r_m3_p7, psi_i_m3_p7, a_i_m3_p7, psi_a_m3_p7); - prodsum_psi_a_epi16(psi_r_m3_p5, a_r_m3_p5, psi_i_m3_p5, a_i_m3_p5, psi_a_m3_p5); - prodsum_psi_a_epi16(psi_r_m3_p3, a_r_m3_p3, psi_i_m3_p3, a_i_m3_p3, psi_a_m3_p3); - prodsum_psi_a_epi16(psi_r_m3_p1, a_r_m3_p1, psi_i_m3_p1, a_i_m3_p1, psi_a_m3_p1); - prodsum_psi_a_epi16(psi_r_m3_m1, a_r_m3_m1, psi_i_m3_m1, a_i_m3_m1, psi_a_m3_m1); - prodsum_psi_a_epi16(psi_r_m3_m3, a_r_m3_m3, psi_i_m3_m3, a_i_m3_m3, psi_a_m3_m3); - prodsum_psi_a_epi16(psi_r_m3_m5, a_r_m3_m5, psi_i_m3_m5, a_i_m3_m5, psi_a_m3_m5); - prodsum_psi_a_epi16(psi_r_m3_m7, a_r_m3_m7, psi_i_m3_m7, a_i_m3_m7, psi_a_m3_m7); - prodsum_psi_a_epi16(psi_r_m5_p7, a_r_m5_p7, psi_i_m5_p7, a_i_m5_p7, psi_a_m5_p7); - prodsum_psi_a_epi16(psi_r_m5_p5, a_r_m5_p5, psi_i_m5_p5, a_i_m5_p5, psi_a_m5_p5); - prodsum_psi_a_epi16(psi_r_m5_p3, a_r_m5_p3, psi_i_m5_p3, a_i_m5_p3, psi_a_m5_p3); - prodsum_psi_a_epi16(psi_r_m5_p1, a_r_m5_p1, psi_i_m5_p1, a_i_m5_p1, psi_a_m5_p1); - prodsum_psi_a_epi16(psi_r_m5_m1, a_r_m5_m1, psi_i_m5_m1, a_i_m5_m1, psi_a_m5_m1); - prodsum_psi_a_epi16(psi_r_m5_m3, a_r_m5_m3, psi_i_m5_m3, a_i_m5_m3, psi_a_m5_m3); - prodsum_psi_a_epi16(psi_r_m5_m5, a_r_m5_m5, psi_i_m5_m5, a_i_m5_m5, psi_a_m5_m5); - prodsum_psi_a_epi16(psi_r_m5_m7, a_r_m5_m7, psi_i_m5_m7, a_i_m5_m7, psi_a_m5_m7); - prodsum_psi_a_epi16(psi_r_m7_p7, a_r_m7_p7, psi_i_m7_p7, a_i_m7_p7, psi_a_m7_p7); - prodsum_psi_a_epi16(psi_r_m7_p5, a_r_m7_p5, psi_i_m7_p5, a_i_m7_p5, psi_a_m7_p5); - prodsum_psi_a_epi16(psi_r_m7_p3, a_r_m7_p3, psi_i_m7_p3, a_i_m7_p3, psi_a_m7_p3); - prodsum_psi_a_epi16(psi_r_m7_p1, a_r_m7_p1, psi_i_m7_p1, a_i_m7_p1, psi_a_m7_p1); - prodsum_psi_a_epi16(psi_r_m7_m1, a_r_m7_m1, psi_i_m7_m1, a_i_m7_m1, psi_a_m7_m1); - prodsum_psi_a_epi16(psi_r_m7_m3, a_r_m7_m3, psi_i_m7_m3, a_i_m7_m3, psi_a_m7_m3); - prodsum_psi_a_epi16(psi_r_m7_m5, a_r_m7_m5, psi_i_m7_m5, a_i_m7_m5, psi_a_m7_m5); - prodsum_psi_a_epi16(psi_r_m7_m7, a_r_m7_m7, psi_i_m7_m7, a_i_m7_m7, psi_a_m7_m7); - - // Multiply by sqrt(2) - psi_a_p7_p7 = _mm_mulhi_epi16(psi_a_p7_p7, ONE_OVER_SQRT_2); - psi_a_p7_p7 = _mm_slli_epi16(psi_a_p7_p7, 2); - psi_a_p7_p5 = _mm_mulhi_epi16(psi_a_p7_p5, ONE_OVER_SQRT_2); - psi_a_p7_p5 = _mm_slli_epi16(psi_a_p7_p5, 2); - psi_a_p7_p3 = _mm_mulhi_epi16(psi_a_p7_p3, ONE_OVER_SQRT_2); - psi_a_p7_p3 = _mm_slli_epi16(psi_a_p7_p3, 2); - psi_a_p7_p1 = _mm_mulhi_epi16(psi_a_p7_p1, ONE_OVER_SQRT_2); - psi_a_p7_p1 = _mm_slli_epi16(psi_a_p7_p1, 2); - psi_a_p7_m1 = _mm_mulhi_epi16(psi_a_p7_m1, ONE_OVER_SQRT_2); - psi_a_p7_m1 = _mm_slli_epi16(psi_a_p7_m1, 2); - psi_a_p7_m3 = _mm_mulhi_epi16(psi_a_p7_m3, ONE_OVER_SQRT_2); - psi_a_p7_m3 = _mm_slli_epi16(psi_a_p7_m3, 2); - psi_a_p7_m5 = _mm_mulhi_epi16(psi_a_p7_m5, ONE_OVER_SQRT_2); - psi_a_p7_m5 = _mm_slli_epi16(psi_a_p7_m5, 2); - psi_a_p7_m7 = _mm_mulhi_epi16(psi_a_p7_m7, ONE_OVER_SQRT_2); - psi_a_p7_m7 = _mm_slli_epi16(psi_a_p7_m7, 2); - psi_a_p5_p7 = _mm_mulhi_epi16(psi_a_p5_p7, ONE_OVER_SQRT_2); - psi_a_p5_p7 = _mm_slli_epi16(psi_a_p5_p7, 2); - psi_a_p5_p5 = _mm_mulhi_epi16(psi_a_p5_p5, ONE_OVER_SQRT_2); - psi_a_p5_p5 = _mm_slli_epi16(psi_a_p5_p5, 2); - psi_a_p5_p3 = _mm_mulhi_epi16(psi_a_p5_p3, ONE_OVER_SQRT_2); - psi_a_p5_p3 = _mm_slli_epi16(psi_a_p5_p3, 2); - psi_a_p5_p1 = _mm_mulhi_epi16(psi_a_p5_p1, ONE_OVER_SQRT_2); - psi_a_p5_p1 = _mm_slli_epi16(psi_a_p5_p1, 2); - psi_a_p5_m1 = _mm_mulhi_epi16(psi_a_p5_m1, ONE_OVER_SQRT_2); - psi_a_p5_m1 = _mm_slli_epi16(psi_a_p5_m1, 2); - psi_a_p5_m3 = _mm_mulhi_epi16(psi_a_p5_m3, ONE_OVER_SQRT_2); - psi_a_p5_m3 = _mm_slli_epi16(psi_a_p5_m3, 2); - psi_a_p5_m5 = _mm_mulhi_epi16(psi_a_p5_m5, ONE_OVER_SQRT_2); - psi_a_p5_m5 = _mm_slli_epi16(psi_a_p5_m5, 2); - psi_a_p5_m7 = _mm_mulhi_epi16(psi_a_p5_m7, ONE_OVER_SQRT_2); - psi_a_p5_m7 = _mm_slli_epi16(psi_a_p5_m7, 2); - psi_a_p3_p7 = _mm_mulhi_epi16(psi_a_p3_p7, ONE_OVER_SQRT_2); - psi_a_p3_p7 = _mm_slli_epi16(psi_a_p3_p7, 2); - psi_a_p3_p5 = _mm_mulhi_epi16(psi_a_p3_p5, ONE_OVER_SQRT_2); - psi_a_p3_p5 = _mm_slli_epi16(psi_a_p3_p5, 2); - psi_a_p3_p3 = _mm_mulhi_epi16(psi_a_p3_p3, ONE_OVER_SQRT_2); - psi_a_p3_p3 = _mm_slli_epi16(psi_a_p3_p3, 2); - psi_a_p3_p1 = _mm_mulhi_epi16(psi_a_p3_p1, ONE_OVER_SQRT_2); - psi_a_p3_p1 = _mm_slli_epi16(psi_a_p3_p1, 2); - psi_a_p3_m1 = _mm_mulhi_epi16(psi_a_p3_m1, ONE_OVER_SQRT_2); - psi_a_p3_m1 = _mm_slli_epi16(psi_a_p3_m1, 2); - psi_a_p3_m3 = _mm_mulhi_epi16(psi_a_p3_m3, ONE_OVER_SQRT_2); - psi_a_p3_m3 = _mm_slli_epi16(psi_a_p3_m3, 2); - psi_a_p3_m5 = _mm_mulhi_epi16(psi_a_p3_m5, ONE_OVER_SQRT_2); - psi_a_p3_m5 = _mm_slli_epi16(psi_a_p3_m5, 2); - psi_a_p3_m7 = _mm_mulhi_epi16(psi_a_p3_m7, ONE_OVER_SQRT_2); - psi_a_p3_m7 = _mm_slli_epi16(psi_a_p3_m7, 2); - psi_a_p1_p7 = _mm_mulhi_epi16(psi_a_p1_p7, ONE_OVER_SQRT_2); - psi_a_p1_p7 = _mm_slli_epi16(psi_a_p1_p7, 2); - psi_a_p1_p5 = _mm_mulhi_epi16(psi_a_p1_p5, ONE_OVER_SQRT_2); - psi_a_p1_p5 = _mm_slli_epi16(psi_a_p1_p5, 2); - psi_a_p1_p3 = _mm_mulhi_epi16(psi_a_p1_p3, ONE_OVER_SQRT_2); - psi_a_p1_p3 = _mm_slli_epi16(psi_a_p1_p3, 2); - psi_a_p1_p1 = _mm_mulhi_epi16(psi_a_p1_p1, ONE_OVER_SQRT_2); - psi_a_p1_p1 = _mm_slli_epi16(psi_a_p1_p1, 2); - psi_a_p1_m1 = _mm_mulhi_epi16(psi_a_p1_m1, ONE_OVER_SQRT_2); - psi_a_p1_m1 = _mm_slli_epi16(psi_a_p1_m1, 2); - psi_a_p1_m3 = _mm_mulhi_epi16(psi_a_p1_m3, ONE_OVER_SQRT_2); - psi_a_p1_m3 = _mm_slli_epi16(psi_a_p1_m3, 2); - psi_a_p1_m5 = _mm_mulhi_epi16(psi_a_p1_m5, ONE_OVER_SQRT_2); - psi_a_p1_m5 = _mm_slli_epi16(psi_a_p1_m5, 2); - psi_a_p1_m7 = _mm_mulhi_epi16(psi_a_p1_m7, ONE_OVER_SQRT_2); - psi_a_p1_m7 = _mm_slli_epi16(psi_a_p1_m7, 2); - psi_a_m1_p7 = _mm_mulhi_epi16(psi_a_m1_p7, ONE_OVER_SQRT_2); - psi_a_m1_p7 = _mm_slli_epi16(psi_a_m1_p7, 2); - psi_a_m1_p5 = _mm_mulhi_epi16(psi_a_m1_p5, ONE_OVER_SQRT_2); - psi_a_m1_p5 = _mm_slli_epi16(psi_a_m1_p5, 2); - psi_a_m1_p3 = _mm_mulhi_epi16(psi_a_m1_p3, ONE_OVER_SQRT_2); - psi_a_m1_p3 = _mm_slli_epi16(psi_a_m1_p3, 2); - psi_a_m1_p1 = _mm_mulhi_epi16(psi_a_m1_p1, ONE_OVER_SQRT_2); - psi_a_m1_p1 = _mm_slli_epi16(psi_a_m1_p1, 2); - psi_a_m1_m1 = _mm_mulhi_epi16(psi_a_m1_m1, ONE_OVER_SQRT_2); - psi_a_m1_m1 = _mm_slli_epi16(psi_a_m1_m1, 2); - psi_a_m1_m3 = _mm_mulhi_epi16(psi_a_m1_m3, ONE_OVER_SQRT_2); - psi_a_m1_m3 = _mm_slli_epi16(psi_a_m1_m3, 2); - psi_a_m1_m5 = _mm_mulhi_epi16(psi_a_m1_m5, ONE_OVER_SQRT_2); - psi_a_m1_m5 = _mm_slli_epi16(psi_a_m1_m5, 2); - psi_a_m1_m7 = _mm_mulhi_epi16(psi_a_m1_m7, ONE_OVER_SQRT_2); - psi_a_m1_m7 = _mm_slli_epi16(psi_a_m1_m7, 2); - psi_a_m3_p7 = _mm_mulhi_epi16(psi_a_m3_p7, ONE_OVER_SQRT_2); - psi_a_m3_p7 = _mm_slli_epi16(psi_a_m3_p7, 2); - psi_a_m3_p5 = _mm_mulhi_epi16(psi_a_m3_p5, ONE_OVER_SQRT_2); - psi_a_m3_p5 = _mm_slli_epi16(psi_a_m3_p5, 2); - psi_a_m3_p3 = _mm_mulhi_epi16(psi_a_m3_p3, ONE_OVER_SQRT_2); - psi_a_m3_p3 = _mm_slli_epi16(psi_a_m3_p3, 2); - psi_a_m3_p1 = _mm_mulhi_epi16(psi_a_m3_p1, ONE_OVER_SQRT_2); - psi_a_m3_p1 = _mm_slli_epi16(psi_a_m3_p1, 2); - psi_a_m3_m1 = _mm_mulhi_epi16(psi_a_m3_m1, ONE_OVER_SQRT_2); - psi_a_m3_m1 = _mm_slli_epi16(psi_a_m3_m1, 2); - psi_a_m3_m3 = _mm_mulhi_epi16(psi_a_m3_m3, ONE_OVER_SQRT_2); - psi_a_m3_m3 = _mm_slli_epi16(psi_a_m3_m3, 2); - psi_a_m3_m5 = _mm_mulhi_epi16(psi_a_m3_m5, ONE_OVER_SQRT_2); - psi_a_m3_m5 = _mm_slli_epi16(psi_a_m3_m5, 2); - psi_a_m3_m7 = _mm_mulhi_epi16(psi_a_m3_m7, ONE_OVER_SQRT_2); - psi_a_m3_m7 = _mm_slli_epi16(psi_a_m3_m7, 2); - psi_a_m5_p7 = _mm_mulhi_epi16(psi_a_m5_p7, ONE_OVER_SQRT_2); - psi_a_m5_p7 = _mm_slli_epi16(psi_a_m5_p7, 2); - psi_a_m5_p5 = _mm_mulhi_epi16(psi_a_m5_p5, ONE_OVER_SQRT_2); - psi_a_m5_p5 = _mm_slli_epi16(psi_a_m5_p5, 2); - psi_a_m5_p3 = _mm_mulhi_epi16(psi_a_m5_p3, ONE_OVER_SQRT_2); - psi_a_m5_p3 = _mm_slli_epi16(psi_a_m5_p3, 2); - psi_a_m5_p1 = _mm_mulhi_epi16(psi_a_m5_p1, ONE_OVER_SQRT_2); - psi_a_m5_p1 = _mm_slli_epi16(psi_a_m5_p1, 2); - psi_a_m5_m1 = _mm_mulhi_epi16(psi_a_m5_m1, ONE_OVER_SQRT_2); - psi_a_m5_m1 = _mm_slli_epi16(psi_a_m5_m1, 2); - psi_a_m5_m3 = _mm_mulhi_epi16(psi_a_m5_m3, ONE_OVER_SQRT_2); - psi_a_m5_m3 = _mm_slli_epi16(psi_a_m5_m3, 2); - psi_a_m5_m5 = _mm_mulhi_epi16(psi_a_m5_m5, ONE_OVER_SQRT_2); - psi_a_m5_m5 = _mm_slli_epi16(psi_a_m5_m5, 2); - psi_a_m5_m7 = _mm_mulhi_epi16(psi_a_m5_m7, ONE_OVER_SQRT_2); - psi_a_m5_m7 = _mm_slli_epi16(psi_a_m5_m7, 2); - psi_a_m7_p7 = _mm_mulhi_epi16(psi_a_m7_p7, ONE_OVER_SQRT_2); - psi_a_m7_p7 = _mm_slli_epi16(psi_a_m7_p7, 2); - psi_a_m7_p5 = _mm_mulhi_epi16(psi_a_m7_p5, ONE_OVER_SQRT_2); - psi_a_m7_p5 = _mm_slli_epi16(psi_a_m7_p5, 2); - psi_a_m7_p3 = _mm_mulhi_epi16(psi_a_m7_p3, ONE_OVER_SQRT_2); - psi_a_m7_p3 = _mm_slli_epi16(psi_a_m7_p3, 2); - psi_a_m7_p1 = _mm_mulhi_epi16(psi_a_m7_p1, ONE_OVER_SQRT_2); - psi_a_m7_p1 = _mm_slli_epi16(psi_a_m7_p1, 2); - psi_a_m7_m1 = _mm_mulhi_epi16(psi_a_m7_m1, ONE_OVER_SQRT_2); - psi_a_m7_m1 = _mm_slli_epi16(psi_a_m7_m1, 2); - psi_a_m7_m3 = _mm_mulhi_epi16(psi_a_m7_m3, ONE_OVER_SQRT_2); - psi_a_m7_m3 = _mm_slli_epi16(psi_a_m7_m3, 2); - psi_a_m7_m5 = _mm_mulhi_epi16(psi_a_m7_m5, ONE_OVER_SQRT_2); - psi_a_m7_m5 = _mm_slli_epi16(psi_a_m7_m5, 2); - psi_a_m7_m7 = _mm_mulhi_epi16(psi_a_m7_m7, ONE_OVER_SQRT_2); - psi_a_m7_m7 = _mm_slli_epi16(psi_a_m7_m7, 2); - - // Calculation of a group of two terms in the bit metric involving squares of interference - square_a_64qam_epi16(a_r_p7_p7, a_i_p7_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p7); - square_a_64qam_epi16(a_r_p7_p5, a_i_p7_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p5); - square_a_64qam_epi16(a_r_p7_p3, a_i_p7_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p3); - square_a_64qam_epi16(a_r_p7_p1, a_i_p7_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p1); - square_a_64qam_epi16(a_r_p7_m1, a_i_p7_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m1); - square_a_64qam_epi16(a_r_p7_m3, a_i_p7_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m3); - square_a_64qam_epi16(a_r_p7_m5, a_i_p7_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m5); - square_a_64qam_epi16(a_r_p7_m7, a_i_p7_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m7); - square_a_64qam_epi16(a_r_p5_p7, a_i_p5_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p7); - square_a_64qam_epi16(a_r_p5_p5, a_i_p5_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p5); - square_a_64qam_epi16(a_r_p5_p3, a_i_p5_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p3); - square_a_64qam_epi16(a_r_p5_p1, a_i_p5_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p1); - square_a_64qam_epi16(a_r_p5_m1, a_i_p5_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m1); - square_a_64qam_epi16(a_r_p5_m3, a_i_p5_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m3); - square_a_64qam_epi16(a_r_p5_m5, a_i_p5_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m5); - square_a_64qam_epi16(a_r_p5_m7, a_i_p5_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m7); - square_a_64qam_epi16(a_r_p3_p7, a_i_p3_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p7); - square_a_64qam_epi16(a_r_p3_p5, a_i_p3_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p5); - square_a_64qam_epi16(a_r_p3_p3, a_i_p3_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p3); - square_a_64qam_epi16(a_r_p3_p1, a_i_p3_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p1); - square_a_64qam_epi16(a_r_p3_m1, a_i_p3_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m1); - square_a_64qam_epi16(a_r_p3_m3, a_i_p3_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m3); - square_a_64qam_epi16(a_r_p3_m5, a_i_p3_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m5); - square_a_64qam_epi16(a_r_p3_m7, a_i_p3_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m7); - square_a_64qam_epi16(a_r_p1_p7, a_i_p1_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p7); - square_a_64qam_epi16(a_r_p1_p5, a_i_p1_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p5); - square_a_64qam_epi16(a_r_p1_p3, a_i_p1_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p3); - square_a_64qam_epi16(a_r_p1_p1, a_i_p1_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p1); - square_a_64qam_epi16(a_r_p1_m1, a_i_p1_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m1); - square_a_64qam_epi16(a_r_p1_m3, a_i_p1_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m3); - square_a_64qam_epi16(a_r_p1_m5, a_i_p1_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m5); - square_a_64qam_epi16(a_r_p1_m7, a_i_p1_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m7); - square_a_64qam_epi16(a_r_m1_p7, a_i_m1_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p7); - square_a_64qam_epi16(a_r_m1_p5, a_i_m1_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p5); - square_a_64qam_epi16(a_r_m1_p3, a_i_m1_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p3); - square_a_64qam_epi16(a_r_m1_p1, a_i_m1_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p1); - square_a_64qam_epi16(a_r_m1_m1, a_i_m1_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m1); - square_a_64qam_epi16(a_r_m1_m3, a_i_m1_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m3); - square_a_64qam_epi16(a_r_m1_m5, a_i_m1_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m5); - square_a_64qam_epi16(a_r_m1_m7, a_i_m1_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m7); - square_a_64qam_epi16(a_r_m3_p7, a_i_m3_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p7); - square_a_64qam_epi16(a_r_m3_p5, a_i_m3_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p5); - square_a_64qam_epi16(a_r_m3_p3, a_i_m3_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p3); - square_a_64qam_epi16(a_r_m3_p1, a_i_m3_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p1); - square_a_64qam_epi16(a_r_m3_m1, a_i_m3_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m1); - square_a_64qam_epi16(a_r_m3_m3, a_i_m3_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m3); - square_a_64qam_epi16(a_r_m3_m5, a_i_m3_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m5); - square_a_64qam_epi16(a_r_m3_m7, a_i_m3_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m7); - square_a_64qam_epi16(a_r_m5_p7, a_i_m5_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p7); - square_a_64qam_epi16(a_r_m5_p5, a_i_m5_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p5); - square_a_64qam_epi16(a_r_m5_p3, a_i_m5_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p3); - square_a_64qam_epi16(a_r_m5_p1, a_i_m5_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p1); - square_a_64qam_epi16(a_r_m5_m1, a_i_m5_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m1); - square_a_64qam_epi16(a_r_m5_m3, a_i_m5_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m3); - square_a_64qam_epi16(a_r_m5_m5, a_i_m5_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m5); - square_a_64qam_epi16(a_r_m5_m7, a_i_m5_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m7); - square_a_64qam_epi16(a_r_m7_p7, a_i_m7_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p7); - square_a_64qam_epi16(a_r_m7_p5, a_i_m7_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p5); - square_a_64qam_epi16(a_r_m7_p3, a_i_m7_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p3); - square_a_64qam_epi16(a_r_m7_p1, a_i_m7_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p1); - square_a_64qam_epi16(a_r_m7_m1, a_i_m7_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m1); - square_a_64qam_epi16(a_r_m7_m3, a_i_m7_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m3); - square_a_64qam_epi16(a_r_m7_m5, a_i_m7_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m5); - square_a_64qam_epi16(a_r_m7_m7, a_i_m7_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m7); - - // Computing different multiples of ||h0||^2 - // x=1, y=1 - ch_mag_2_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,ONE_OVER_FOUR_SQRT_42); - ch_mag_2_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_2_over_42_with_sigma2,1); - // x=1, y=3 - ch_mag_10_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FIVE_OVER_FOUR_SQRT_42); - ch_mag_10_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_10_over_42_with_sigma2,1); - // x=1, x=5 - ch_mag_26_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTEEN_OVER_FOUR_SQRT_42); - ch_mag_26_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_26_over_42_with_sigma2,1); - // x=1, y=7 - ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42); - ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1); - // x=3, y=3 - ch_mag_18_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,NINE_OVER_FOUR_SQRT_42); - ch_mag_18_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_18_over_42_with_sigma2,1); - // x=3, y=5 - ch_mag_34_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,SEVENTEEN_OVER_FOUR_SQRT_42); - ch_mag_34_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_34_over_42_with_sigma2,1); - // x=3, y=7 - ch_mag_58_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYNINE_OVER_FOUR_SQRT_42); - ch_mag_58_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_58_over_42_with_sigma2,2); - // x=5, y=5 - ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42); - ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1); - // x=5, y=7 - ch_mag_74_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTYSEVEN_OVER_FOUR_SQRT_42); - ch_mag_74_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_74_over_42_with_sigma2,2); - // x=7, y=7 - ch_mag_98_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FORTYNINE_OVER_FOUR_SQRT_42); - ch_mag_98_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_98_over_42_with_sigma2,2); - - // Computing Metrics - xmm0 = _mm_subs_epi16(psi_a_p7_p7, a_sq_p7_p7); - xmm1 = _mm_adds_epi16(xmm0, y0_p_7_7); - bit_met_p7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p7_p5, a_sq_p7_p5); - xmm1 = _mm_adds_epi16(xmm0, y0_p_7_5); - bit_met_p7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p7_p3, a_sq_p7_p3); - xmm1 = _mm_adds_epi16(xmm0, y0_p_7_3); - bit_met_p7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p7_p1, a_sq_p7_p1); - xmm1 = _mm_adds_epi16(xmm0, y0_p_7_1); - bit_met_p7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p7_m1, a_sq_p7_m1); - xmm1 = _mm_adds_epi16(xmm0, y0_m_7_1); - bit_met_p7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p7_m3, a_sq_p7_m3); - xmm1 = _mm_adds_epi16(xmm0, y0_m_7_3); - bit_met_p7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p7_m5, a_sq_p7_m5); - xmm1 = _mm_adds_epi16(xmm0, y0_m_7_5); - bit_met_p7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p7_m7, a_sq_p7_m7); - xmm1 = _mm_adds_epi16(xmm0, y0_m_7_7); - bit_met_p7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p5_p7, a_sq_p5_p7); - xmm1 = _mm_adds_epi16(xmm0, y0_p_5_7); - bit_met_p5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p5_p5, a_sq_p5_p5); - xmm1 = _mm_adds_epi16(xmm0, y0_p_5_5); - bit_met_p5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p5_p3, a_sq_p5_p3); - xmm1 = _mm_adds_epi16(xmm0, y0_p_5_3); - bit_met_p5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p5_p1, a_sq_p5_p1); - xmm1 = _mm_adds_epi16(xmm0, y0_p_5_1); - bit_met_p5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p5_m1, a_sq_p5_m1); - xmm1 = _mm_adds_epi16(xmm0, y0_m_5_1); - bit_met_p5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p5_m3, a_sq_p5_m3); - xmm1 = _mm_adds_epi16(xmm0, y0_m_5_3); - bit_met_p5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p5_m5, a_sq_p5_m5); - xmm1 = _mm_adds_epi16(xmm0, y0_m_5_5); - bit_met_p5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p5_m7, a_sq_p5_m7); - xmm1 = _mm_adds_epi16(xmm0, y0_m_5_7); - bit_met_p5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p3_p7, a_sq_p3_p7); - xmm1 = _mm_adds_epi16(xmm0, y0_p_3_7); - bit_met_p3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p3_p5, a_sq_p3_p5); - xmm1 = _mm_adds_epi16(xmm0, y0_p_3_5); - bit_met_p3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p3_p3, a_sq_p3_p3); - xmm1 = _mm_adds_epi16(xmm0, y0_p_3_3); - bit_met_p3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p3_p1, a_sq_p3_p1); - xmm1 = _mm_adds_epi16(xmm0, y0_p_3_1); - bit_met_p3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p3_m1, a_sq_p3_m1); - xmm1 = _mm_adds_epi16(xmm0, y0_m_3_1); - bit_met_p3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p3_m3, a_sq_p3_m3); - xmm1 = _mm_adds_epi16(xmm0, y0_m_3_3); - bit_met_p3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p3_m5, a_sq_p3_m5); - xmm1 = _mm_adds_epi16(xmm0, y0_m_3_5); - bit_met_p3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p3_m7, a_sq_p3_m7); - xmm1 = _mm_adds_epi16(xmm0, y0_m_3_7); - bit_met_p3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p1_p7, a_sq_p1_p7); - xmm1 = _mm_adds_epi16(xmm0, y0_p_1_7); - bit_met_p1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p1_p5, a_sq_p1_p5); - xmm1 = _mm_adds_epi16(xmm0, y0_p_1_5); - bit_met_p1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p1_p3, a_sq_p1_p3); - xmm1 = _mm_adds_epi16(xmm0, y0_p_1_3); - bit_met_p1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p1_p1, a_sq_p1_p1); - xmm1 = _mm_adds_epi16(xmm0, y0_p_1_1); - bit_met_p1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p1_m1, a_sq_p1_m1); - xmm1 = _mm_adds_epi16(xmm0, y0_m_1_1); - bit_met_p1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p1_m3, a_sq_p1_m3); - xmm1 = _mm_adds_epi16(xmm0, y0_m_1_3); - bit_met_p1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p1_m5, a_sq_p1_m5); - xmm1 = _mm_adds_epi16(xmm0, y0_m_1_5); - bit_met_p1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_p1_m7, a_sq_p1_m7); - xmm1 = _mm_adds_epi16(xmm0, y0_m_1_7); - bit_met_p1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - - xmm0 = _mm_subs_epi16(psi_a_m1_p7, a_sq_m1_p7); - xmm1 = _mm_subs_epi16(xmm0, y0_m_1_7); - bit_met_m1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m1_p5, a_sq_m1_p5); - xmm1 = _mm_subs_epi16(xmm0, y0_m_1_5); - bit_met_m1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m1_p3, a_sq_m1_p3); - xmm1 = _mm_subs_epi16(xmm0, y0_m_1_3); - bit_met_m1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m1_p1, a_sq_m1_p1); - xmm1 = _mm_subs_epi16(xmm0, y0_m_1_1); - bit_met_m1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m1_m1, a_sq_m1_m1); - xmm1 = _mm_subs_epi16(xmm0, y0_p_1_1); - bit_met_m1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m1_m3, a_sq_m1_m3); - xmm1 = _mm_subs_epi16(xmm0, y0_p_1_3); - bit_met_m1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m1_m5, a_sq_m1_m5); - xmm1 = _mm_subs_epi16(xmm0, y0_p_1_5); - bit_met_m1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m1_m7, a_sq_m1_m7); - xmm1 = _mm_subs_epi16(xmm0, y0_p_1_7); - bit_met_m1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m3_p7, a_sq_m3_p7); - xmm1 = _mm_subs_epi16(xmm0, y0_m_3_7); - bit_met_m3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m3_p5, a_sq_m3_p5); - xmm1 = _mm_subs_epi16(xmm0, y0_m_3_5); - bit_met_m3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m3_p3, a_sq_m3_p3); - xmm1 = _mm_subs_epi16(xmm0, y0_m_3_3); - bit_met_m3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m3_p1, a_sq_m3_p1); - xmm1 = _mm_subs_epi16(xmm0, y0_m_3_1); - bit_met_m3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m3_m1, a_sq_m3_m1); - xmm1 = _mm_subs_epi16(xmm0, y0_p_3_1); - bit_met_m3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m3_m3, a_sq_m3_m3); - xmm1 = _mm_subs_epi16(xmm0, y0_p_3_3); - bit_met_m3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m3_m5, a_sq_m3_m5); - xmm1 = _mm_subs_epi16(xmm0, y0_p_3_5); - bit_met_m3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m3_m7, a_sq_m3_m7); - xmm1 = _mm_subs_epi16(xmm0, y0_p_3_7); - bit_met_m3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m5_p7, a_sq_m5_p7); - xmm1 = _mm_subs_epi16(xmm0, y0_m_5_7); - bit_met_m5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m5_p5, a_sq_m5_p5); - xmm1 = _mm_subs_epi16(xmm0, y0_m_5_5); - bit_met_m5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m5_p3, a_sq_m5_p3); - xmm1 = _mm_subs_epi16(xmm0, y0_m_5_3); - bit_met_m5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m5_p1, a_sq_m5_p1); - xmm1 = _mm_subs_epi16(xmm0, y0_m_5_1); - bit_met_m5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m5_m1, a_sq_m5_m1); - xmm1 = _mm_subs_epi16(xmm0, y0_p_5_1); - bit_met_m5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m5_m3, a_sq_m5_m3); - xmm1 = _mm_subs_epi16(xmm0, y0_p_5_3); - bit_met_m5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m5_m5, a_sq_m5_m5); - xmm1 = _mm_subs_epi16(xmm0, y0_p_5_5); - bit_met_m5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m5_m7, a_sq_m5_m7); - xmm1 = _mm_subs_epi16(xmm0, y0_p_5_7); - bit_met_m5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m7_p7, a_sq_m7_p7); - xmm1 = _mm_subs_epi16(xmm0, y0_m_7_7); - bit_met_m7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m7_p5, a_sq_m7_p5); - xmm1 = _mm_subs_epi16(xmm0, y0_m_7_5); - bit_met_m7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m7_p3, a_sq_m7_p3); - xmm1 = _mm_subs_epi16(xmm0, y0_m_7_3); - bit_met_m7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m7_p1, a_sq_m7_p1); - xmm1 = _mm_subs_epi16(xmm0, y0_m_7_1); - bit_met_m7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m7_m1, a_sq_m7_m1); - xmm1 = _mm_subs_epi16(xmm0, y0_p_7_1); - bit_met_m7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m7_m3, a_sq_m7_m3); - xmm1 = _mm_subs_epi16(xmm0, y0_p_7_3); - bit_met_m7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m7_m5, a_sq_m7_m5); - xmm1 = _mm_subs_epi16(xmm0, y0_p_7_5); - bit_met_m7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = _mm_subs_epi16(psi_a_m7_m7, a_sq_m7_m7); - xmm1 = _mm_subs_epi16(xmm0, y0_p_7_7); - bit_met_m7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); - - // Detection for 1st bit (LTE mapping) - // bit = 1 - xmm0 = _mm_max_epi16(bit_met_m7_p7, bit_met_m7_p5); - xmm1 = _mm_max_epi16(bit_met_m7_p3, bit_met_m7_p1); - xmm2 = _mm_max_epi16(bit_met_m7_m1, bit_met_m7_m3); - xmm3 = _mm_max_epi16(bit_met_m7_m5, bit_met_m7_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_m5_p7, bit_met_m5_p5); - xmm1 = _mm_max_epi16(bit_met_m5_p3, bit_met_m5_p1); - xmm2 = _mm_max_epi16(bit_met_m5_m1, bit_met_m5_m3); - xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m5_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_m3_p7, bit_met_m3_p5); - xmm1 = _mm_max_epi16(bit_met_m3_p3, bit_met_m3_p1); - xmm2 = _mm_max_epi16(bit_met_m3_m1, bit_met_m3_m3); - xmm3 = _mm_max_epi16(bit_met_m3_m5, bit_met_m3_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_m1_p7, bit_met_m1_p5); - xmm1 = _mm_max_epi16(bit_met_m1_p3, bit_met_m1_p1); - xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m1_m3); - xmm3 = _mm_max_epi16(bit_met_m1_m5, bit_met_m1_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - // bit = 0 - xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p7_p5); - xmm1 = _mm_max_epi16(bit_met_p7_p3, bit_met_p7_p1); - xmm2 = _mm_max_epi16(bit_met_p7_m1, bit_met_p7_m3); - xmm3 = _mm_max_epi16(bit_met_p7_m5, bit_met_p7_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p5_p7, bit_met_p5_p5); - xmm1 = _mm_max_epi16(bit_met_p5_p3, bit_met_p5_p1); - xmm2 = _mm_max_epi16(bit_met_p5_m1, bit_met_p5_m3); - xmm3 = _mm_max_epi16(bit_met_p5_m5, bit_met_p5_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p3_p7, bit_met_p3_p5); - xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p3_p1); - xmm2 = _mm_max_epi16(bit_met_p3_m1, bit_met_p3_m3); - xmm3 = _mm_max_epi16(bit_met_p3_m5, bit_met_p3_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p1_p7, bit_met_p1_p5); - xmm1 = _mm_max_epi16(bit_met_p1_p3, bit_met_p1_p1); - xmm2 = _mm_max_epi16(bit_met_p1_m1, bit_met_p1_m3); - xmm3 = _mm_max_epi16(bit_met_p1_m5, bit_met_p1_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y0r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - // Detection for 2nd bit (LTE mapping) - // bit = 1 - xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); - xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); - xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); - xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); - xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); - xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); - xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); - xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); - xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); - xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); - xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); - xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); - xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - // bit = 0 - xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); - xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); - xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); - xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); - xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); - xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); - xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); - xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); - xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); - xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); - xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); - xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y1r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - // Detection for 3rd bit (LTE mapping) - xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5); - xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1); - xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3); - xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5); - xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1); - xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3); - xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5); - xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1); - xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3); - xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5); - xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1); - xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3); - xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5); - xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1); - xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5); - xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1); - xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3); - xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5); - xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1); - xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3); - xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5); - xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1); - xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y2r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - // Detection for 4th bit (LTE mapping) - xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); - xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); - xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); - xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); - xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); - xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); - xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); - xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); - xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); - xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); - xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); - xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); - xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); - xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); - xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); - xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); - xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); - xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); - xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); - xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); - xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); - xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); - xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); - xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y0i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - - // Detection for 5th bit (LTE mapping) - xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5); - xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1); - xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3); - xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5); - xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1); - xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3); - xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5); - xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1); - xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3); - xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5); - xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1); - xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3); - xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5); - xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1); - xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3); - xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5); - xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1); - xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5); - xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1); - xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3); - xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5); - xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1); - xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3); - xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y1i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - // Detection for 6th bit (LTE mapping) - xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); - xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); - xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); - xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); - xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); - xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); - xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); - xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); - xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); - xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); - xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); - xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); - xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); - - xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); - xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); - xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); - xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); - xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); - xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); - xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); - xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); - xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); - xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); - xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); - xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); - xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5); - xmm4 = _mm_max_epi16(xmm0, xmm1); - xmm5 = _mm_max_epi16(xmm2, xmm3); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); - - y2i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); - - - // map to output stream, difficult to do in SIMD since we have 6 16bit LLRs - // RE 1 - j = 24*i; - stream0_out[j + 0] = ((short *)&y0r)[0]; - stream0_out[j + 1] = ((short *)&y1r)[0]; - stream0_out[j + 2] = ((short *)&y2r)[0]; - stream0_out[j + 3] = ((short *)&y0i)[0]; - stream0_out[j + 4] = ((short *)&y1i)[0]; - stream0_out[j + 5] = ((short *)&y2i)[0]; - // RE 2 - stream0_out[j + 6] = ((short *)&y0r)[1]; - stream0_out[j + 7] = ((short *)&y1r)[1]; - stream0_out[j + 8] = ((short *)&y2r)[1]; - stream0_out[j + 9] = ((short *)&y0i)[1]; - stream0_out[j + 10] = ((short *)&y1i)[1]; - stream0_out[j + 11] = ((short *)&y2i)[1]; - // RE 3 - stream0_out[j + 12] = ((short *)&y0r)[2]; - stream0_out[j + 13] = ((short *)&y1r)[2]; - stream0_out[j + 14] = ((short *)&y2r)[2]; - stream0_out[j + 15] = ((short *)&y0i)[2]; - stream0_out[j + 16] = ((short *)&y1i)[2]; - stream0_out[j + 17] = ((short *)&y2i)[2]; - // RE 4 - stream0_out[j + 18] = ((short *)&y0r)[3]; - stream0_out[j + 19] = ((short *)&y1r)[3]; - stream0_out[j + 20] = ((short *)&y2r)[3]; - stream0_out[j + 21] = ((short *)&y0i)[3]; - stream0_out[j + 22] = ((short *)&y1i)[3]; - stream0_out[j + 23] = ((short *)&y2i)[3]; - // RE 5 - stream0_out[j + 24] = ((short *)&y0r)[4]; - stream0_out[j + 25] = ((short *)&y1r)[4]; - stream0_out[j + 26] = ((short *)&y2r)[4]; - stream0_out[j + 27] = ((short *)&y0i)[4]; - stream0_out[j + 28] = ((short *)&y1i)[4]; - stream0_out[j + 29] = ((short *)&y2i)[4]; - // RE 6 - stream0_out[j + 30] = ((short *)&y0r)[5]; - stream0_out[j + 31] = ((short *)&y1r)[5]; - stream0_out[j + 32] = ((short *)&y2r)[5]; - stream0_out[j + 33] = ((short *)&y0i)[5]; - stream0_out[j + 34] = ((short *)&y1i)[5]; - stream0_out[j + 35] = ((short *)&y2i)[5]; - // RE 7 - stream0_out[j + 36] = ((short *)&y0r)[6]; - stream0_out[j + 37] = ((short *)&y1r)[6]; - stream0_out[j + 38] = ((short *)&y2r)[6]; - stream0_out[j + 39] = ((short *)&y0i)[6]; - stream0_out[j + 40] = ((short *)&y1i)[6]; - stream0_out[j + 41] = ((short *)&y2i)[6]; - // RE 8 - stream0_out[j + 42] = ((short *)&y0r)[7]; - stream0_out[j + 43] = ((short *)&y1r)[7]; - stream0_out[j + 44] = ((short *)&y2r)[7]; - stream0_out[j + 45] = ((short *)&y0i)[7]; - stream0_out[j + 46] = ((short *)&y1i)[7]; - stream0_out[j + 47] = ((short *)&y2i)[7]; - -#elif defined(__arm__) - -#endif - - } - -#if defined(__x86_64__) || defined(__i386__) - _mm_empty(); - _m_empty(); -#endif -} - - -int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, - int32_t **rxdataF_comp, - int32_t **rxdataF_comp_i, - int32_t **dl_ch_mag, - int32_t **dl_ch_mag_i, - int32_t **rho_i, - int16_t *dlsch_llr, - uint8_t symbol, - uint8_t first_symbol_flag, - uint16_t nb_rb, - uint16_t pbch_pss_sss_adjust, - //int16_t **llr16p, - uint32_t llr_offset) -{ - - int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; - int16_t *llr16; - int8_t *pllr_symbol; // pointer where llrs should filled for this ofdm symbol - int len; - uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; - - //first symbol has different structure due to more pilots - /*if (first_symbol_flag == 1) { - llr16 = (int16_t*)dlsch_llr; - } else { - llr16 = (int16_t*)(*llr16p); - }*/ - - llr16 = (int16_t*)dlsch_llr; - - AssertFatal(llr16!=NULL,"dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol); - - - if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { - // if symbol has pilots - if (frame_parms->nb_antenna_ports_eNB!=1) - // in 2 antenna ports we have 8 REs per symbol per RB - len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); - else - // for 1 antenna port we have 10 REs per symbol per RB - len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); - } else { - // symbol has no pilots - len = (nb_rb*12) - pbch_pss_sss_adjust; - } - - pllr_symbol = (int8_t*)dlsch_llr; - pllr_symbol += llr_offset; - //printf("dlsch_64qam_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust); - /*LOG_I(PHY,"dlsch_64qam_64qam_llr [symb %d / FirstSym %d / Length %d / LLR Offset %d]: @LLR Buff %x, @LLR Buff(symb) %x, , @Compute LLR Buff(symb) %x \n", - symbol, - first_symbol_flag, - len, - llr_offset, - (int16_t*)dlsch_llr, - llr16, - pllr_symbol);*/ - -#ifdef __AVX2__ - - // Round length up to multiple of 16 words - uint32_t len256i = ((len+16)>>4)*16; - int32_t *rxF_256i = (int32_t*) malloc16_clear(len256i*4); - int32_t *rxF_i_256i = (int32_t*) malloc16_clear(len256i*4); - int32_t *ch_mag_256i = (int32_t*) malloc16_clear(len256i*4); - int32_t *ch_mag_i_256i = (int32_t*) malloc16_clear(len256i*4); - int32_t *rho_256i = (int32_t*) malloc16_clear(len256i*4); - - memcpy(rxF_256i, rxF, len*4); - memcpy(rxF_i_256i, rxF_i, len*4); - memcpy(ch_mag_256i, ch_mag, len*4); - memcpy(ch_mag_i_256i, ch_mag_i, len*4); - memcpy(rho_256i, rho, len*4); - -#if 0 - qam64_qam16_avx2((short *)rxF_256i, - (short *)rxF_i_256i, - (short *)ch_mag_256i, - (short *)ch_mag_i_256i, - (short *)llr16, - (short *) rho_256i, - len); -#else - qam64_qam64_avx2((int32_t *)rxF_256i, - (int32_t *)rxF_i_256i, - (int32_t *)ch_mag_256i, - (int32_t *)ch_mag_i_256i, - (int16_t *)llr16, - (int32_t *) rho_256i, - len); -#endif - - free16(rxF_256i, sizeof(rxF_256i)); - free16(rxF_i_256i, sizeof(rxF_i_256i)); - free16(ch_mag_256i, sizeof(ch_mag_256i)); - free16(ch_mag_i_256i, sizeof(ch_mag_i_256i)); - free16(rho_256i, sizeof(rho_256i)); - -#else - qam64_qam64((short *)rxF, - (short *)rxF_i, - (short *)ch_mag, - (short *)ch_mag_i, - (short *)llr16, - (short *)rho, - len); -#endif - - llr16 += (6*len); - //*llr16p = (short *)llr16; - - return(0); -} diff --git a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c deleted file mode 100644 index a0bde219b57706e59b5d5746f8408bc1307f46be..0000000000000000000000000000000000000000 --- a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file PHY/LTE_TRANSPORT/drs_modulation.c -* \brief Top-level routines for generating the Demodulation Reference Signals from 36-211, V8.6 2009-03 -* \author R. Knopp, F. Kaltenberger, A. Bhamri -* \date 2011 -* \version 0.1 -* \company Eurecom -* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,ankit.bhamri@eurecom.fr -* \note -* \warning -*/ -#include "PHY/defs.h" -#include "PHY/extern.h" -#include "PHY/sse_intrin.h" -//#define DEBUG_DRS - -int generate_drs_pusch(PHY_VARS_UE *ue, - UE_rxtx_proc_t *proc, - uint8_t eNB_id, - short amp, - unsigned int subframe, - unsigned int first_rb, - unsigned int nb_rb, - uint8_t ant) -{ - - uint16_t k,l,Msc_RS,Msc_RS_idx,rb,drs_offset; - uint16_t * Msc_idx_ptr; - int subframe_offset,re_offset,symbol_offset; - - //uint32_t phase_shift; // phase shift for cyclic delay in DM RS - //uint8_t alpha_ind; - - int16_t alpha_re[12] = {32767, 28377, 16383, 0,-16384, -28378,-32768,-28378,-16384, -1, 16383, 28377}; - int16_t alpha_im[12] = {0, 16383, 28377, 32767, 28377, 16383, 0,-16384,-28378,-32768,-28378,-16384}; - - uint8_t cyclic_shift,cyclic_shift0,cyclic_shift1; - LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; - int32_t *txdataF = ue->common_vars.txdataF[ant]; - uint32_t u,v,alpha_ind; - uint32_t u0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[subframe<<1]; - uint32_t u1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)]; - uint32_t v0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1]; - uint32_t v1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)]; - int32_t ref_re,ref_im; - uint8_t harq_pid = subframe2harq_pid(frame_parms,proc->frame_tx,subframe); - - cyclic_shift0 = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + - ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2 + - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]+ - ((ue->ulsch[0]->cooperation_flag==2)?10:0)+ - ant*6) % 12; - // printf("PUSCH.cyclicShift %d, n_DMRS2 %d, nPRS %d\n",frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,ue->ulsch[eNB_id]->n_DMRS2,ue->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]); - cyclic_shift1 = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + - ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2 + - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[(subframe<<1)+1]+ - ((ue->ulsch[0]->cooperation_flag==2)?10:0)+ - ant*6) % 12; - - // cyclic_shift0 = 0; - // cyclic_shift1 = 0; - Msc_RS = 12*nb_rb; - - Msc_idx_ptr = (uint16_t*) bsearch(&Msc_RS, dftsizes, 33, sizeof(uint16_t), compareints); - - if (Msc_idx_ptr) - Msc_RS_idx = Msc_idx_ptr - dftsizes; - else { - LOG_I(PHY,"generate_drs_pusch: index for Msc_RS=%d not found\n",Msc_RS); - return(-1); - } - - for (l = (3 - frame_parms->Ncp),u=u0,v=v0,cyclic_shift=cyclic_shift0; - l<frame_parms->symbols_per_tti; - l += (7 - frame_parms->Ncp),u=u1,v=v1,cyclic_shift=cyclic_shift1) { - - drs_offset = 0; -#ifdef DEBUG_DRS - printf("drs_modulation: Msc_RS = %d, Msc_RS_idx = %d, u=%d,v=%d\n",Msc_RS, Msc_RS_idx,u,v); -#endif - - - re_offset = frame_parms->first_carrier_offset; - subframe_offset = subframe*frame_parms->symbols_per_tti*frame_parms->ofdm_symbol_size; - symbol_offset = subframe_offset + frame_parms->ofdm_symbol_size*l; - - -#ifdef DEBUG_DRS - printf("generate_drs_pusch: symbol_offset %d, subframe offset %d, cyclic shift %d\n",symbol_offset,subframe_offset,cyclic_shift); -#endif - alpha_ind = 0; - - for (rb=0; rb<frame_parms->N_RB_UL; rb++) { - - if ((rb >= first_rb) && (rb<(first_rb+nb_rb))) { - -#ifdef DEBUG_DRS - printf("generate_drs_pusch: doing RB %d, re_offset=%d, drs_offset=%d,cyclic shift %d\n",rb,re_offset,drs_offset,cyclic_shift); -#endif - - for (k=0; k<12; k++) { - ref_re = (int32_t) ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1]; - ref_im = (int32_t) ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1]; - - ((int16_t*) txdataF)[2*(symbol_offset + re_offset)] = (int16_t) (((ref_re*alpha_re[alpha_ind]) - - (ref_im*alpha_im[alpha_ind]))>>15); - ((int16_t*) txdataF)[2*(symbol_offset + re_offset)+1] = (int16_t) (((ref_re*alpha_im[alpha_ind]) + - (ref_im*alpha_re[alpha_ind]))>>15); - ((short*) txdataF)[2*(symbol_offset + re_offset)] = (short) ((((short*) txdataF)[2*(symbol_offset + re_offset)]*(int32_t)amp)>>15); - ((short*) txdataF)[2*(symbol_offset + re_offset)+1] = (short) ((((short*) txdataF)[2*(symbol_offset + re_offset)+1]*(int32_t)amp)>>15); - - - alpha_ind = (alpha_ind + cyclic_shift); - - if (alpha_ind > 11) - alpha_ind-=12; - -#ifdef DEBUG_DRS - printf("symbol_offset %d, alpha_ind %d , re_offset %d : (%d,%d)\n", - symbol_offset, - alpha_ind, - re_offset, - ((short*) txdataF)[2*(symbol_offset + re_offset)], - ((short*) txdataF)[2*(symbol_offset + re_offset)+1]); - -#endif // DEBUG_DRS - re_offset++; - drs_offset++; - - if (re_offset >= frame_parms->ofdm_symbol_size) - re_offset = 0; - } - - } else { - re_offset+=12; // go to next RB - - // check if we crossed the symbol boundary and skip DC - - if (re_offset >= frame_parms->ofdm_symbol_size) { - if (frame_parms->N_RB_DL&1) // odd number of RBs - re_offset=6; - else // even number of RBs (doesn't straddle DC) - re_offset=0; - } - - - } - } - } - - return(0); -} - diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c deleted file mode 100644 index 09420f48ab1a7029fdbbb2015fd7f28f47ffcd8c..0000000000000000000000000000000000000000 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c +++ /dev/null @@ -1,933 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file PHY/LTE_TRANSPORT/ulsch_coding.c -* \brief Top-level routines for coding the ULSCH transport channel as described in 36.212 V8.6 2009-03 -* \author R. Knopp -* \date 2011 -* \version 0.1 -* \company Eurecom -* \email: knopp@eurecom.fr -* \note -* \warning -*/ - -#include "PHY/defs.h" -#include "PHY/extern.h" - -#include "PHY/CODING/defs.h" -#include "PHY/CODING/extern.h" -#include "PHY/CODING/lte_interleaver_inline.h" -#include "PHY/LTE_TRANSPORT/defs.h" -#include "defs.h" -#include "extern.h" -#include "SIMULATION/ETH_TRANSPORT/extern.h" -#include "UTIL/LOG/vcd_signal_dumper.h" - -//#define DEBUG_ULSCH_CODING -//#define DEBUG_ULSCH_FREE 1 - -/* -#define is_not_pilot(pilots,first_pilot,re) (pilots==0) || \ - ((pilots==1)&&(first_pilot==1)&&(((re>2)&&(re<6))||((re>8)&&(re<12)))) || \ - ((pilots==1)&&(first_pilot==0)&&(((re<3))||((re>5)&&(re<9)))) \ -*/ -#define is_not_pilot(pilots,first_pilot,re) (1) - - - - -void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch) -{ - int i; - int r; - - if (ulsch) { -#ifdef DEBUG_ULSCH_FREE - printf("Freeing ulsch %p\n",ulsch); -#endif - - for (i=0; i<8; i++) { - if (ulsch->harq_processes[i]) { - if (ulsch->harq_processes[i]->b) { - free16(ulsch->harq_processes[i]->b,MAX_ULSCH_PAYLOAD_BYTES); - ulsch->harq_processes[i]->b = NULL; - } - for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) { - if (ulsch->harq_processes[i]->c[r]) { - free16(ulsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768); - ulsch->harq_processes[i]->c[r] = NULL; - } - } - - free16(ulsch->harq_processes[i],sizeof(LTE_UL_UE_HARQ_t)); - ulsch->harq_processes[i] = NULL; - } - } - free16(ulsch,sizeof(LTE_UE_ULSCH_t)); - ulsch = NULL; - } - -} - -LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) -{ - - LTE_UE_ULSCH_t *ulsch; - unsigned char exit_flag = 0,i,j,r; - unsigned char bw_scaling =1; - - switch (N_RB_UL) { - case 6: - bw_scaling =16; - break; - - case 25: - bw_scaling =4; - break; - - case 50: - bw_scaling =2; - break; - - default: - bw_scaling =1; - break; - } - - ulsch = (LTE_UE_ULSCH_t *)malloc16(sizeof(LTE_UE_ULSCH_t)); - - if (ulsch) { - memset(ulsch,0,sizeof(LTE_UE_ULSCH_t)); - - ulsch->Mlimit = 4; - - for (i=0; i<8; i++) { - - ulsch->harq_processes[i] = (LTE_UL_UE_HARQ_t *)malloc16(sizeof(LTE_UL_UE_HARQ_t)); - - // printf("ulsch->harq_processes[%d] %p\n",i,ulsch->harq_processes[i]); - if (ulsch->harq_processes[i]) { - memset(ulsch->harq_processes[i], 0, sizeof(LTE_UL_UE_HARQ_t)); - ulsch->harq_processes[i]->b = (unsigned char*)malloc16(MAX_ULSCH_PAYLOAD_BYTES/bw_scaling); - - if (ulsch->harq_processes[i]->b) - memset(ulsch->harq_processes[i]->b,0,MAX_ULSCH_PAYLOAD_BYTES/bw_scaling); - else { - LOG_E(PHY,"Can't get b\n"); - exit_flag=1; - } - - if (abstraction_flag==0) { - for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) { - ulsch->harq_processes[i]->c[r] = (unsigned char*)malloc16(((r==0)?8:0) + 3+768); // account for filler in first segment and CRCs for multiple segment case - - if (ulsch->harq_processes[i]->c[r]) - memset(ulsch->harq_processes[i]->c[r],0,((r==0)?8:0) + 3+768); - else { - LOG_E(PHY,"Can't get c\n"); - exit_flag=2; - } - } - } - - ulsch->harq_processes[i]->subframe_scheduling_flag = 0; - ulsch->harq_processes[i]->first_tx = 1; - } else { - LOG_E(PHY,"Can't get harq_p %d\n",i); - exit_flag=3; - } - } - - if ((abstraction_flag == 0) && (exit_flag==0)) { - for (i=0; i<8; i++) - for (j=0; j<96; j++) - for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) - ulsch->harq_processes[i]->d[r][j] = LTE_NULL; - - return(ulsch); - } else if (abstraction_flag==1) - return(ulsch); - } - - LOG_E(PHY,"new_ue_ulsch exit flag, size of %d , %zu\n",exit_flag, sizeof(LTE_UE_ULSCH_t)); - free_ue_ulsch(ulsch); - return(NULL); - - -} - - -uint32_t ulsch_encoding(uint8_t *a, - PHY_VARS_UE *ue, - uint8_t harq_pid, - uint8_t eNB_id, - uint8_t subframe_rx, - uint8_t tmode, - uint8_t control_only_flag, - uint8_t Nbundled) -{ - - time_stats_t *seg_stats=&ue->ulsch_segmentation_stats; - time_stats_t *rm_stats=&ue->ulsch_rate_matching_stats; - time_stats_t *te_stats=&ue->ulsch_turbo_encoding_stats; - time_stats_t *i_stats=&ue->ulsch_interleaving_stats; - time_stats_t *m_stats=&ue->ulsch_multiplexing_stats; - - // uint16_t offset; - uint32_t crc=1; - uint16_t iind; - uint32_t A; - uint8_t Q_m=0; - uint32_t Kr=0,Kr_bytes,r,r_offset=0; - uint8_t y[6*14*1200],*yptr;; - uint8_t *columnset; - uint32_t sumKr=0; - uint32_t Qprime,L,G,Q_CQI=0,Q_RI=0,Q_ACK=0,H=0,Hprime=0,Hpp=0,Cmux=0,Rmux=0,Rmux_prime=0; - uint32_t Qprime_ACK=0,Qprime_CQI=0,Qprime_RI=0,len_ACK=0,len_RI=0; - // uint32_t E; - uint8_t ack_parity; - uint32_t i,q,j,iprime,j2; - uint16_t o_RCC; - uint8_t o_flip[8]; - uint32_t wACK_idx; - LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; - PHY_MEASUREMENTS *meas = &ue->measurements; - LTE_UE_ULSCH_t *ulsch=ue->ulsch[eNB_id]; - LTE_UE_DLSCH_t **dlsch = ue->dlsch[0][eNB_id]; - uint16_t rnti = 0xffff; - - if (!ulsch) { - LOG_E(PHY,"Null ulsch ptr %p\n",ulsch); - return(-1); - } - - if (harq_pid >= 8) { - LOG_E(PHY,"Illegal harq_pid %d\n",harq_pid); - return(-1); - } - - if (ulsch->harq_processes[harq_pid]->O_ACK > 2) { - LOG_E(PHY,"Illegal O_ACK %d\n",ulsch->harq_processes[harq_pid]->O_ACK); - return(-1); - } - - if (ulsch->O_RI > 1) { - LOG_E(PHY,"Illegal O_RI %d\n",ulsch->O_RI); - return(-1); - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING, VCD_FUNCTION_IN); - - // fill CQI/PMI information - if (ulsch->O>0) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING_FILL_CQI, VCD_FUNCTION_IN); - rnti = ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti; - fill_CQI(ulsch,meas,0,harq_pid,ue->frame_parms.N_RB_DL,rnti, tmode,ue->sinr_eff); - - LOG_D(PHY,"ULSCH Encoding rnti %x \n", rnti); - print_CQI(ulsch->o,ulsch->uci_format,0,ue->frame_parms.N_RB_DL); - - // save PUSCH pmi for later (transmission modes 4,5,6) - if (dlsch[0]) { - //LOG_I(PHY,"XXX saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi)); - dlsch[0]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi; - } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING_FILL_CQI, VCD_FUNCTION_OUT); - } - - if (ulsch->O<=32) { - o_flip[0] = ulsch->o[3]; - o_flip[1] = ulsch->o[2]; - o_flip[2] = ulsch->o[1]; - o_flip[3] = ulsch->o[0]; - } else { - o_flip[0] = ulsch->o[7]; - o_flip[1] = ulsch->o[6]; - o_flip[2] = ulsch->o[5]; - o_flip[3] = ulsch->o[4]; - o_flip[4] = ulsch->o[3]; - o_flip[5] = ulsch->o[2]; - o_flip[6] = ulsch->o[1]; - o_flip[7] = ulsch->o[0]; - } - - if (control_only_flag == 0) { - A=ulsch->harq_processes[harq_pid]->TBS; - Q_m = get_Qm_ul(ulsch->harq_processes[harq_pid]->mcs); - - ulsch->harq_processes[harq_pid]->control_only = 0; - -#ifdef DEBUG_ULSCH_CODING - printf("[PHY][UE] ULSCH coding : A %d, Qm %d, mcs %d, harq_pid %d, round %d, RV %d\n", - ulsch->harq_processes[harq_pid]->TBS, - Q_m, - ulsch->harq_processes[harq_pid]->mcs, - harq_pid, - ulsch->harq_processes[harq_pid]->round, - ulsch->harq_processes[harq_pid]->rvidx); - - for (i=0; i<ulsch->harq_processes[harq_pid]->O_ACK; i++) - printf("ulsch_coding: o_ACK[%d] %d\n",i,ulsch->o_ACK[i]); - - for (i=0; i<ulsch->O_RI; i++) - printf("ulsch_coding: o_RI[%d] %d\n",i,ulsch->o_RI[i]); - - printf("ulsch_coding: O=%d\n",ulsch->O); - - for (i=0; i<1+((8+ulsch->O)/8); i++) { - // ulsch->o[i] = i; - printf("ulsch_coding: O[%d] %d\n",i,ulsch->o[i]); - } - - if ((tmode != 4)) - print_CQI(ulsch->o,wideband_cqi_rank1_2A,0,ue->frame_parms.N_RB_DL); - else - print_CQI(ulsch->o,HLC_subband_cqi_rank1_2A,0,ue->frame_parms.N_RB_DL); - -#endif - - if (ulsch->harq_processes[harq_pid]->round == 0) { // this is a new packet - - start_meas(seg_stats); - // Add 24-bit crc (polynomial A) to payload - crc = crc24a(a, - A)>>8; - - a[A>>3] = ((uint8_t*)&crc)[2]; - a[1+(A>>3)] = ((uint8_t*)&crc)[1]; - a[2+(A>>3)] = ((uint8_t*)&crc)[0]; - - ulsch->harq_processes[harq_pid]->B = A+24; - ulsch->harq_processes[harq_pid]->b = a; - lte_segmentation(ulsch->harq_processes[harq_pid]->b, - ulsch->harq_processes[harq_pid]->c, - ulsch->harq_processes[harq_pid]->B, - &ulsch->harq_processes[harq_pid]->C, - &ulsch->harq_processes[harq_pid]->Cplus, - &ulsch->harq_processes[harq_pid]->Cminus, - &ulsch->harq_processes[harq_pid]->Kplus, - &ulsch->harq_processes[harq_pid]->Kminus, - &ulsch->harq_processes[harq_pid]->F); - - stop_meas(seg_stats); - - for (r=0; r<ulsch->harq_processes[harq_pid]->C; r++) { - if (r<ulsch->harq_processes[harq_pid]->Cminus) - Kr = ulsch->harq_processes[harq_pid]->Kminus; - else - Kr = ulsch->harq_processes[harq_pid]->Kplus; - - Kr_bytes = Kr>>3; - - // get interleaver index for Turbo code (lookup in Table 5.1.3-3 36-212, V8.6 2009-03, p. 13-14) - if (Kr_bytes<=64) - iind = (Kr_bytes-5); - else if (Kr_bytes <=128) - iind = 59 + ((Kr_bytes-64)>>1); - else if (Kr_bytes <= 256) - iind = 91 + ((Kr_bytes-128)>>2); - else if (Kr_bytes <= 768) - iind = 123 + ((Kr_bytes-256)>>3); - else { - LOG_E(PHY,"ulsch_coding: Illegal codeword size %d!!!\n",Kr_bytes); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT); - return(-1); - } - - -#ifdef DEBUG_ULSCH_CODING - printf("Generating Code Segment %d (%d bits)\n",r,Kr); - // generate codewords - - printf("bits_per_codeword (Kr)= %d\n",Kr); - printf("N_RB = %d\n",ulsch->harq_processes[harq_pid]->nb_rb); - printf("Ncp %d\n",frame_parms->Ncp); - printf("Qm %d\n",Q_m); -#endif - - // offset=0; - - -#ifdef DEBUG_ULSCH_CODING - printf("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]); -#endif - start_meas(te_stats); - encoder(ulsch->harq_processes[harq_pid]->c[r], - Kr>>3, - &ulsch->harq_processes[harq_pid]->d[r][96], - (r==0) ? ulsch->harq_processes[harq_pid]->F : 0, - f1f2mat_old[iind*2], // f1 (see 36212-820, page 14) - f1f2mat_old[(iind*2)+1] // f2 (see 36212-820, page 14) - ); - stop_meas(te_stats); -#ifdef DEBUG_ULSCH_CODING - - if (r==0) - write_output("enc_output0.m","enc0",&ulsch->harq_processes[harq_pid]->d[r][96],(3*8*Kr_bytes)+12,1,4); - -#endif - start_meas(i_stats); - ulsch->harq_processes[harq_pid]->RTC[r] = - sub_block_interleaving_turbo(4+(Kr_bytes*8), - &ulsch->harq_processes[harq_pid]->d[r][96], - ulsch->harq_processes[harq_pid]->w[r]); - stop_meas(i_stats); - } - - } - - if (ulsch->harq_processes[harq_pid]->C == 0) { - LOG_E(PHY,"null segment\n"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT); - return(-1); - } - - sumKr = 0; - - for (r=0; r<ulsch->harq_processes[harq_pid]->C; r++) { - if (r<ulsch->harq_processes[harq_pid]->Cminus) - Kr = ulsch->harq_processes[harq_pid]->Kminus; - else - Kr = ulsch->harq_processes[harq_pid]->Kplus; - - sumKr += Kr; - } - } else { // This is a control-only PUSCH, set sumKr to O_CQI-MIN - ulsch->harq_processes[harq_pid]->control_only = 1; - sumKr = ulsch->O_CQI_MIN; - } - - ulsch->harq_processes[harq_pid]->sumKr = sumKr; - // Compute Q_ri (p. 23 36-212) - - Qprime = ulsch->O_RI*ulsch->harq_processes[harq_pid]->Msc_initial*ulsch->harq_processes[harq_pid]->Nsymb_initial * ulsch->beta_offset_ri_times8; - - if (Qprime > 0) { - if ((Qprime % (8*sumKr)) > 0) - Qprime = 1+(Qprime/(8*sumKr)); - else - Qprime = Qprime/(8*sumKr); - - if (Qprime > 4*ulsch->harq_processes[harq_pid]->nb_rb * 12) - Qprime = 4*ulsch->harq_processes[harq_pid]->nb_rb * 12; - } - - Q_RI = Q_m*Qprime; - Qprime_RI = Qprime; - - // Compute Q_ack (p. 23 36-212) - Qprime = ulsch->harq_processes[harq_pid]->O_ACK*ulsch->harq_processes[harq_pid]->Msc_initial*ulsch->harq_processes[harq_pid]->Nsymb_initial * ulsch->beta_offset_harqack_times8; - - if (Qprime > 0) { - if ((Qprime % (8*sumKr)) > 0) - Qprime = 1+(Qprime/(8*sumKr)); - else - Qprime = Qprime/(8*sumKr); - - if (Qprime > 4*ulsch->harq_processes[harq_pid]->nb_rb * 12) - Qprime = 4*ulsch->harq_processes[harq_pid]->nb_rb * 12; - } - - Q_ACK = Qprime * Q_m; - Qprime_ACK = Qprime; - - LOG_D(PHY,"UE (%x/%d) O_ACK %d, Mcs_initial %d, Nsymb_initial %d, beta_offset_harqack*8 %d, sum Kr %d, Qprime_ACK %d, Q_ACK %d\n", - rnti, harq_pid, - ulsch->harq_processes[harq_pid]->O_ACK, - ulsch->harq_processes[harq_pid]->Msc_initial, - ulsch->harq_processes[harq_pid]->Nsymb_initial, - ulsch->beta_offset_harqack_times8, - sumKr, - Qprime_ACK, - Q_ACK); - - // Compute Q_cqi, assume O>11, p. 26 36-212 - if (control_only_flag == 0) { - - if (ulsch->O < 12) - L=0; - else - L=8; - - if (ulsch->O > 0) - Qprime = (ulsch->O + L) * ulsch->harq_processes[harq_pid]->Msc_initial*ulsch->harq_processes[harq_pid]->Nsymb_initial * ulsch->beta_offset_cqi_times8; - else - Qprime = 0; - - if (Qprime > 0) { - if ((Qprime % (8*sumKr)) > 0) - Qprime = 1+(Qprime/(8*sumKr)); - else - Qprime = Qprime/(8*sumKr); - } - - G = ulsch->harq_processes[harq_pid]->nb_rb * (12 * Q_m) * (ulsch->Nsymb_pusch); - - if (Qprime > (G - ulsch->O_RI)) - Qprime = G - ulsch->O_RI; - - Q_CQI = Q_m * Qprime; - Qprime_CQI = Qprime; - - - - G = G - Q_RI - Q_CQI; - ulsch->harq_processes[harq_pid]->G = G; - -/* - LOG_I(PHY,"ULSCH Encoding G %d, Q_RI %d (O_RI%d, Msc_initial %d, Nsymb_initial%d, beta_offset_ri_times8 %d), Q_CQI %d, Q_ACK %d \n",G,Q_RI,ulsch->O_RI,ulsch->harq_processes[harq_pid]->Msc_initial,ulsch->harq_processes[harq_pid]->Nsymb_initial,ulsch->beta_offset_ri_times8,Q_CQI,Q_ACK); - - LOG_I(PHY,"ULSCH Encoding (Nid_cell %d, rnti %x): harq_pid %d round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d\n", - frame_parms->Nid_cell,ulsch->rnti, - harq_pid, - ulsch->harq_processes[harq_pid]->round, - ulsch->harq_processes[harq_pid]->rvidx, - ulsch->harq_processes[harq_pid]->mcs, - ulsch->O_RI, - ulsch->harq_processes[harq_pid]->O_ACK, - G); -*/ - - if ((int)G < 0) { - LOG_E(PHY,"FATAL: ulsch_coding.c G < 0 (%d) : Q_RI %d, Q_CQI %d, O %d, betaCQI_times8 %d)\n",G,Q_RI,Q_CQI,ulsch->O,ulsch->beta_offset_cqi_times8); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT); - return(-1); - } - - - // Data and control multiplexing (5.2.2.7 36-212) - - H = G + Q_CQI; - Hprime = H/Q_m; - - - - // Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the - // outputs for each code segment, see Section 5.1.5 p.20 - - for (r=0; r<ulsch->harq_processes[harq_pid]->C; r++) { -#ifdef DEBUG_ULSCH_CODING - printf("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n", - r, - G, - Kr*3, - Q_m,ulsch->harq_processes[harq_pid]->nb_rb); -#endif - - start_meas(rm_stats); - r_offset += lte_rate_matching_turbo(ulsch->harq_processes[harq_pid]->RTC[r], - G, - ulsch->harq_processes[harq_pid]->w[r], - ulsch->e+r_offset, - ulsch->harq_processes[harq_pid]->C, // C - NSOFT, // Nsoft, - 0, // this means UL - 1, - ulsch->harq_processes[harq_pid]->rvidx, - get_Qm_ul(ulsch->harq_processes[harq_pid]->mcs), - 1, - r, - ulsch->harq_processes[harq_pid]->nb_rb); - //ulsch->harq_processes[harq_pid]->mcs); // r - stop_meas(rm_stats); -#ifdef DEBUG_ULSCH_CODING - - if (r==ulsch->harq_processes[harq_pid]->C-1) - write_output("enc_output.m","enc",ulsch->e,r_offset,1,4); - -#endif - } - } else { //control-only PUSCH - Q_CQI = (ulsch->harq_processes[harq_pid]->nb_rb * (12 * Q_m) * (ulsch->Nsymb_pusch)) - Q_RI; - H = Q_CQI; - Hprime = H/Q_m; - } - - - // Do CQI coding - if ((ulsch->O>1) && (ulsch->O < 12)) { - LOG_E(PHY,"short CQI sizes not supported yet\n"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT); - return(-1); - } else { - // add 8-bit CRC - crc = crc8(o_flip, - ulsch->O)>>24; -#ifdef DEBUG_ULSCH_CODING - printf("crc(cqi) tx : %x\n",crc); -#endif - memset((void *)&ulsch->o_d[0],LTE_NULL,96); - - ccodelte_encode(ulsch->O, - 1, - o_flip, - &ulsch->o_d[96], - 0); - - - o_RCC = sub_block_interleaving_cc(8+ulsch->O, - &ulsch->o_d[96], - ulsch->o_w); - - lte_rate_matching_cc(o_RCC, - Q_CQI, - ulsch->o_w, - ulsch->q); - - } - - i=0; - - // Do RI coding - if (ulsch->O_RI == 1) { - switch (Q_m) { - case 2: - ulsch->q_RI[0] = ulsch->o_RI[0]; - ulsch->q_RI[1] = PUSCH_y;//ulsch->o_RI[0]; - len_RI=2; - break; - - case 4: - ulsch->q_RI[0] = ulsch->o_RI[0]; - ulsch->q_RI[1] = PUSCH_y;//1; - ulsch->q_RI[2] = PUSCH_x;//ulsch->o_RI[0]; - ulsch->q_RI[3] = PUSCH_x;//1; - len_RI=4; - break; - - case 6: - ulsch->q_RI[0] = ulsch->o_RI[0]; - ulsch->q_RI[1] = PUSCH_y;//1; - ulsch->q_RI[2] = PUSCH_x;//1; - ulsch->q_RI[3] = PUSCH_x;//ulsch->o_RI[0]; - ulsch->q_RI[4] = PUSCH_x;//1; - ulsch->q_RI[5] = PUSCH_x;//1; - len_RI=6; - break; - } - } else if (ulsch->O_RI>1) { - LOG_E(PHY,"RI cannot be more than 1 bit yet\n"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT); - return(-1); - } - - // Do ACK coding, Section 5.2.2.6 36.213 (p.23-24 in v8.6) - wACK_idx = (ulsch->bundling==0) ? 4 : ((Nbundled-1)&3); -#ifdef DEBUG_ULSCH_CODING - printf("ulsch_coding.c: Bundling %d, Nbundled %d, wACK_idx %d\n", - ulsch->bundling,Nbundled,wACK_idx); -#endif - - // 1-bit ACK/NAK - if (ulsch->harq_processes[harq_pid]->O_ACK == 1) { - switch (Q_m) { - case 2: - ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1; - ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1);//ulsch->o_ACK[0]; - len_ACK = 2; - break; - - case 4: - ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1; - ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1); - ulsch->q_ACK[2] = PUSCH_x; - ulsch->q_ACK[3] = PUSCH_x; - len_ACK = 4; - break; - - case 6: - ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1; - ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1); - ulsch->q_ACK[2] = PUSCH_x; - ulsch->q_ACK[3] = PUSCH_x; - ulsch->q_ACK[4] = PUSCH_x; - ulsch->q_ACK[6] = PUSCH_x; - len_ACK = 6; - break; - } - } - - // two-bit ACK/NAK - if (ulsch->harq_processes[harq_pid]->O_ACK == 2) { - ack_parity = (ulsch->o_ACK[0]+ulsch->o_ACK[1])&1; - - switch (Q_m) { - case 2: - ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1; - ulsch->q_ACK[1] = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1; - ulsch->q_ACK[2] = (ack_parity+wACK[wACK_idx][0])&1; - ulsch->q_ACK[3] = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1; - ulsch->q_ACK[4] = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1; - ulsch->q_ACK[5] = (ack_parity+wACK[wACK_idx][1])&1; - len_ACK = 6; - break; - - case 4: - ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1; - ulsch->q_ACK[1] = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1; - ulsch->q_ACK[2] = PUSCH_x; - ulsch->q_ACK[3] = PUSCH_x;//1; - ulsch->q_ACK[4] = (ack_parity+wACK[wACK_idx][0])&1; - ulsch->q_ACK[5] = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1; - ulsch->q_ACK[6] = PUSCH_x; - ulsch->q_ACK[7] = PUSCH_x;//1; - ulsch->q_ACK[8] = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1; - ulsch->q_ACK[9] = (ack_parity+wACK[wACK_idx][1])&1; - ulsch->q_ACK[10] = PUSCH_x; - ulsch->q_ACK[11] = PUSCH_x;//1; - len_ACK = 12; - break; - - case 6: - ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1; - ulsch->q_ACK[1] = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1; - ulsch->q_ACK[2] = PUSCH_x; - ulsch->q_ACK[3] = PUSCH_x; - ulsch->q_ACK[4] = PUSCH_x; - ulsch->q_ACK[5] = PUSCH_x; - - ulsch->q_ACK[6] = (ack_parity+wACK[wACK_idx][0])&1; - ulsch->q_ACK[7] = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1; - ulsch->q_ACK[8] = PUSCH_x; - ulsch->q_ACK[9] = PUSCH_x; - ulsch->q_ACK[10] = PUSCH_x; - ulsch->q_ACK[11] = PUSCH_x; - - ulsch->q_ACK[12] = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1; - ulsch->q_ACK[13] = (ack_parity+wACK[wACK_idx][1])&1; - ulsch->q_ACK[14] = PUSCH_x; - ulsch->q_ACK[15] = PUSCH_x; - ulsch->q_ACK[16] = PUSCH_x; - ulsch->q_ACK[17] = PUSCH_x; - len_ACK = 18; - - break; - } - } - - if (ulsch->harq_processes[harq_pid]->O_ACK > 2) { - LOG_E(PHY,"ACK cannot be more than 2 bits yet\n"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT); - return(-1); - } - - - // channel multiplexing/interleaving - - start_meas(m_stats); - Hpp = Hprime + Q_RI; - - Cmux = ulsch->Nsymb_pusch; - Rmux = Hpp*Q_m/Cmux; - Rmux_prime = Rmux/Q_m; - - Qprime_RI = Q_RI / Q_m; - Qprime_ACK = Q_ACK / Q_m; - Qprime_CQI = Q_CQI / Q_m; - - // printf("Qprime_CQI = %d\n",Qprime_CQI); - // RI BITS - - memset(y,LTE_NULL,Q_m*Hpp); - - if (frame_parms->Ncp == 0) - columnset = cs_ri_normal; - else - columnset = cs_ri_extended; - - j=0; - - for (i=0; i<Qprime_RI; i++) { - r = Rmux_prime - 1 - (i>>2); - - for (q=0; q<Q_m; q++) { - y[q+(Q_m*((r*Cmux) + columnset[j]))] = ulsch->q_RI[(q+(Q_m*i))%len_RI]; - // printf("ri[%d] %d => y[%d]\n",q+(Q_m*i)%len_RI,ulsch->q_RI[(q+(Q_m*i))%len_RI],q+(Q_m*((r*Cmux) + columnset[j])),y[q+(Q_m*((r*Cmux) + columnset[j]))]); - } - - j=(j+3)&3; - - } - - - // CQI and Data bits - j=0; - /* - for (i=0,iprime=-Qprime_CQI;i<Hprime;i++,iprime++) { - - while (y[Q_m*j] != LTE_NULL) j++; - - if (i<Qprime_CQI) { - for (q=0;q<Q_m;q++) { - y[q+(Q_m*j)] = ulsch->q[q+(Q_m*i)]; - //printf("cqi[%d] %d => y[%d]\n",q+(Q_m*i),ulsch->q[q+(Q_m*i)],q+(Q_m*j)); - } - } - else { - for (q=0;q<Q_m;q++) { - y[q+(Q_m*j)] = ulsch->e[q+(Q_m*iprime)]; - // printf("e[%d] %d => y[%d]\n",q+(Q_m*iprime),ulsch->e[q+(Q_m*iprime)],q+(Q_m*j)); - } - } - j++; - } - */ - - for (i=0; i<Qprime_CQI; i++) { - - while (y[Q_m*j] != LTE_NULL) j++; - - for (q=0; q<Q_m; q++) { - y[q+(Q_m*j)] = ulsch->q[q+(Q_m*i)]; - // printf("cqi[%d] %d => y[%d] (j %d)\n",q+(Q_m*i),ulsch->q[q+(Q_m*i)],q+(Q_m*j),j); - } - - j++; - } - - j2 = j*Q_m; - - switch (Q_m) { - - case 2: - - for (iprime=0; iprime<(Hprime-Qprime_CQI)<<1; iprime+=2) { - while (y[j2] != LTE_NULL) j2+=2; - - y[j2] = ulsch->e[iprime]; - y[1+j2] = ulsch->e[1+iprime]; - j2+=2; - } - - break; - - case 4: - for (iprime=0; iprime<(Hprime-Qprime_CQI)<<2; iprime+=4) { - while (y[j2] != LTE_NULL) j2+=4; - - y[j2] = ulsch->e[iprime]; - y[1+j2] = ulsch->e[1+iprime]; - y[2+j2] = ulsch->e[2+iprime]; - y[3+j2] = ulsch->e[3+iprime]; - j2+=4; - } - - break; - - case 6: - for (iprime=0; iprime<(Hprime-Qprime_CQI)*6; iprime+=6) { - while (y[j2] != LTE_NULL) j2+=6; - - y[j2] = ulsch->e[iprime]; - y[1+j2] = ulsch->e[1+iprime]; - y[2+j2] = ulsch->e[2+iprime]; - y[3+j2] = ulsch->e[3+iprime]; - y[4+j2] = ulsch->e[4+iprime]; - y[5+j2] = ulsch->e[5+iprime]; - j2+=6; - } - - break; - - } - - // HARQ-ACK Bits (Note these overwrite some bits) - - if (frame_parms->Ncp == 0) - columnset = cs_ack_normal; - else - columnset = cs_ack_extended; - - j=0; - - for (i=0; i<Qprime_ACK; i++) { - r = Rmux_prime - 1 - (i>>2); - - for (q=0; q<Q_m; q++) { - y[q+(Q_m*((r*Cmux) + columnset[j]))] = ulsch->q_ACK[(q+(Q_m*i))%len_ACK]; -#ifdef DEBUG_ULSCH_CODING - printf("ulsch_coding.c: ACK %d => y[%d]=%d (i %d, r*Cmux %d, columnset %d)\n",q+(Q_m*i), - q+(Q_m*((r*Cmux) + columnset[j])),ulsch->q_ACK[(q+(Q_m*i))%len_ACK], - i,r*Cmux,columnset[j]); -#endif - } - - j=(j+3)&3; - - } - - // write out buffer - j=0; - - switch (Q_m) { - case 2: - for (i=0; i<Cmux; i++) - for (r=0; r<Rmux_prime; r++) { - yptr=&y[((r*Cmux)+i)<<1]; - ulsch->h[j++] = *yptr++; - ulsch->h[j++] = *yptr++; - } - - break; - - case 4: - for (i=0; i<Cmux; i++) - for (r=0; r<Rmux_prime; r++) { - yptr = &y[((r*Cmux)+i)<<2]; - ulsch->h[j++] = *yptr++; - ulsch->h[j++] = *yptr++; - ulsch->h[j++] = *yptr++; - ulsch->h[j++] = *yptr++; - } - - break; - - case 6: - for (i=0; i<Cmux; i++) - for (r=0; r<Rmux_prime; r++) { - yptr = &y[((r*Cmux)+i)*6]; - ulsch->h[j++] = *yptr++; - ulsch->h[j++] = *yptr++; - ulsch->h[j++] = *yptr++; - ulsch->h[j++] = *yptr++; - ulsch->h[j++] = *yptr++; - ulsch->h[j++] = *yptr++; - } - - break; - - default: - break; - } - - stop_meas(m_stats); - - if (j!=(H+Q_RI)) { - LOG_E(PHY,"Error in output buffer length (j %d, H+Q_RI %d)\n",j,H+Q_RI); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT); - return(-1); - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT); - return(0); -} - diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c deleted file mode 100644 index d1718f6e90f600927f5d93f3a18e93213bea86f8..0000000000000000000000000000000000000000 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c +++ /dev/null @@ -1,777 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file PHY/LTE_TRANSPORT/ulsch_modulation.c -* \brief Top-level routines for generating PUSCH physical channel from 36.211 V8.6 2009-03 -* \author R. Knopp, F. Kaltenberger, A. Bhamri -* \date 2011 -* \version 0.1 -* \company Eurecom -* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,ankit.bhamri@eurecom.fr -* \note -* \warning -*/ -#include "PHY/defs.h" -#include "PHY/extern.h" -#include "PHY/CODING/defs.h" -#include "PHY/CODING/extern.h" -#include "PHY/LTE_TRANSPORT/defs.h" -#include "defs.h" -#include "UTIL/LOG/vcd_signal_dumper.h" - - - -//#define DEBUG_ULSCH_MODULATION - -#ifndef OFDMA_ULSCH -void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb) -{ - -#if defined(__x86_64__) || defined(__i386__) - __m128i dft_in128[4][1200],dft_out128[4][1200]; -#elif defined(__arm__) - int16x8_t dft_in128[4][1200],dft_out128[4][1200]; -#endif - uint32_t *dft_in0=(uint32_t*)dft_in128[0],*dft_out0=(uint32_t*)dft_out128[0]; - uint32_t *dft_in1=(uint32_t*)dft_in128[1],*dft_out1=(uint32_t*)dft_out128[1]; - uint32_t *dft_in2=(uint32_t*)dft_in128[2],*dft_out2=(uint32_t*)dft_out128[2]; - // uint32_t *dft_in3=(uint32_t*)dft_in128[3],*dft_out3=(uint32_t*)dft_out128[3]; - - uint32_t *d0,*d1,*d2,*d3,*d4,*d5,*d6,*d7,*d8,*d9,*d10,*d11; - - uint32_t *z0,*z1,*z2,*z3,*z4,*z5,*z6,*z7,*z8,*z9,*z10,*z11; - uint32_t i,ip; -#if defined(__x86_64__) || defined(__i386__) - __m128i norm128; -#elif defined(__arm__) - int16x8_t norm128; -#endif - // printf("Doing lte_dft for Msc_PUSCH %d\n",Msc_PUSCH); - - d0 = (uint32_t *)d; - d1 = d0+Msc_PUSCH; - d2 = d1+Msc_PUSCH; - d3 = d2+Msc_PUSCH; - d4 = d3+Msc_PUSCH; - d5 = d4+Msc_PUSCH; - d6 = d5+Msc_PUSCH; - d7 = d6+Msc_PUSCH; - d8 = d7+Msc_PUSCH; - d9 = d8+Msc_PUSCH; - d10 = d9+Msc_PUSCH; - d11 = d10+Msc_PUSCH; - - // printf("symbol 0 (d0 %p, d %p)\n",d0,d); - for (i=0,ip=0; i<Msc_PUSCH; i++,ip+=4) { - dft_in0[ip] = d0[i]; - dft_in0[ip+1] = d1[i]; - dft_in0[ip+2] = d2[i]; - dft_in0[ip+3] = d3[i]; - dft_in1[ip] = d4[i]; - dft_in1[ip+1] = d5[i]; - dft_in1[ip+2] = d6[i]; - dft_in1[ip+3] = d7[i]; - dft_in2[ip] = d8[i]; - dft_in2[ip+1] = d9[i]; - dft_in2[ip+2] = d10[i]; - dft_in2[ip+3] = d11[i]; - // printf("dft%d %d: %d,%d,%d,%d\n",Msc_PUSCH,ip,d0[i],d1[i],d2[i],d3[i]); - - // dft_in_re2[ip+1] = d9[i]; - // dft_in_re2[ip+2] = d10[i]; - } - - // printf("\n"); - - switch (Msc_PUSCH) { - case 12: - dft12((int16_t *)dft_in0,(int16_t *)dft_out0); - dft12((int16_t *)dft_in1,(int16_t *)dft_out1); - dft12((int16_t *)dft_in2,(int16_t *)dft_out2); - - /* - dft12f(&((__m128i *)dft_in0)[0],&((__m128i *)dft_in0)[1],&((__m128i *)dft_in0)[2],&((__m128i *)dft_in0)[3],&((__m128i *)dft_in0)[4],&((__m128i *)dft_in0)[5],&((__m128i *)dft_in0)[6],&((__m128i *)dft_in0)[7],&((__m128i *)dft_in0)[8],&((__m128i *)dft_in0)[9],&((__m128i *)dft_in0)[10],&((__m128i *)dft_in0)[11], - &((__m128i *)dft_out0)[0],&((__m128i *)dft_out0)[1],&((__m128i *)dft_out0)[2],&((__m128i *)dft_out0)[3],&((__m128i *)dft_out0)[4],&((__m128i *)dft_out0)[5],&((__m128i *)dft_out0)[6],&((__m128i *)dft_out0)[7],&((__m128i *)dft_out0)[8],&((__m128i *)dft_out0)[9],&((__m128i *)dft_out0)[10],&((__m128i *)dft_out0)[11]); - - dft12f(&((__m128i *)dft_in1)[0],&((__m128i *)dft_in1)[1],&((__m128i *)dft_in1)[2],&((__m128i *)dft_in1)[3],&((__m128i *)dft_in1)[4],&((__m128i *)dft_in1)[5],&((__m128i *)dft_in1)[6],&((__m128i *)dft_in1)[7],&((__m128i *)dft_in1)[8],&((__m128i *)dft_in1)[9],&((__m128i *)dft_in1)[10],&((__m128i *)dft_in1)[11], - &((__m128i *)dft_out1)[0],&((__m128i *)dft_out1)[1],&((__m128i *)dft_out1)[2],&((__m128i *)dft_out1)[3],&((__m128i *)dft_out1)[4],&((__m128i *)dft_out1)[5],&((__m128i *)dft_out1)[6],&((__m128i *)dft_out1)[7],&((__m128i *)dft_out1)[8],&((__m128i *)dft_out1)[9],&((__m128i *)dft_out1)[10],&((__m128i *)dft_out1)[11]); - - dft12f(&((__m128i *)dft_in2)[0],&((__m128i *)dft_in2)[1],&((__m128i *)dft_in2)[2],&((__m128i *)dft_in2)[3],&((__m128i *)dft_in2)[4],&((__m128i *)dft_in2)[5],&((__m128i *)dft_in2)[6],&((__m128i *)dft_in2)[7],&((__m128i *)dft_in2)[8],&((__m128i *)dft_in2)[9],&((__m128i *)dft_in2)[10],&((__m128i *)dft_in2)[11], - &((__m128i *)dft_out2)[0],&((__m128i *)dft_out2)[1],&((__m128i *)dft_out2)[2],&((__m128i *)dft_out2)[3],&((__m128i *)dft_out2)[4],&((__m128i *)dft_out2)[5],&((__m128i *)dft_out2)[6],&((__m128i *)dft_out2)[7],&((__m128i *)dft_out2)[8],&((__m128i *)dft_out2)[9],&((__m128i *)dft_out2)[10],&((__m128i *)dft_out2)[11]); - */ -#if defined(__x86_64__) || defined(__i386__) - norm128 = _mm_set1_epi16(9459); -#elif defined(__arm__) - norm128 = vdupq_n_s16(9459); -#endif - for (i=0; i<12; i++) { -#if defined(__x86_64__) || defined(__i386__) - ((__m128i*)dft_out0)[i] = _mm_slli_epi16(_mm_mulhi_epi16(((__m128i*)dft_out0)[i],norm128),1); - ((__m128i*)dft_out1)[i] = _mm_slli_epi16(_mm_mulhi_epi16(((__m128i*)dft_out1)[i],norm128),1); - ((__m128i*)dft_out2)[i] = _mm_slli_epi16(_mm_mulhi_epi16(((__m128i*)dft_out2)[i],norm128),1); -#elif defined(__arm__) - ((int16x8_t*)dft_out0)[i] = vqdmulhq_s16(((int16x8_t*)dft_out0)[i],norm128); - ((int16x8_t*)dft_out1)[i] = vqdmulhq_s16(((int16x8_t*)dft_out1)[i],norm128); - ((int16x8_t*)dft_out2)[i] = vqdmulhq_s16(((int16x8_t*)dft_out2)[i],norm128); -#endif - } - - break; - - case 24: - dft24((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft24((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft24((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 36: - dft36((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft36((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft36((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 48: - dft48((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft48((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft48((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 60: - dft60((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft60((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft60((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 72: - dft72((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft72((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft72((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 96: - dft96((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft96((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft96((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 108: - dft108((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft108((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft108((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 120: - dft120((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft120((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft120((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 144: - dft144((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft144((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft144((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 180: - dft180((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft180((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft180((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 192: - dft192((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft192((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft192((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 216: - dft216((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft216((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft216((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 240: - dft240((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft240((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft240((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 288: - dft288((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft288((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft288((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 300: - dft300((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft300((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft300((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 324: - dft324((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft324((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft324((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 360: - dft360((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft360((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft360((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 384: - dft384((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft384((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft384((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 432: - dft432((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft432((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft432((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 480: - dft480((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft480((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft480((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 540: - dft540((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft540((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft540((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 576: - dft576((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft576((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft576((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 600: - dft600((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft600((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft600((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 648: - dft648((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft648((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft648((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 720: - dft720((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft720((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft720((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 864: - dft864((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft864((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft864((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 900: - dft900((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft900((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft900((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 960: - dft960((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft960((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft960((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 972: - dft972((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft972((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft972((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 1080: - dft1080((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft1080((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft1080((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 1152: - dft1152((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft1152((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft1152((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - - case 1200: - dft1200((int16_t*)dft_in0,(int16_t*)dft_out0,1); - dft1200((int16_t*)dft_in1,(int16_t*)dft_out1,1); - dft1200((int16_t*)dft_in2,(int16_t*)dft_out2,1); - break; - } - - z0 = (uint32_t *)z; - z1 = z0+Msc_PUSCH; - z2 = z1+Msc_PUSCH; - z3 = z2+Msc_PUSCH; - z4 = z3+Msc_PUSCH; - z5 = z4+Msc_PUSCH; - z6 = z5+Msc_PUSCH; - z7 = z6+Msc_PUSCH; - z8 = z7+Msc_PUSCH; - z9 = z8+Msc_PUSCH; - z10 = z9+Msc_PUSCH; - z11 = z10+Msc_PUSCH; - - // printf("symbol0 (dft)\n"); - for (i=0,ip=0; i<Msc_PUSCH; i++,ip+=4) { - z0[i] = dft_out0[ip]; - // printf("%d,%d,",((short*)&z0[i])[0],((short*)&z0[i])[1]); - z1[i] = dft_out0[ip+1]; - z2[i] = dft_out0[ip+2]; - z3[i] = dft_out0[ip+3]; - z4[i] = dft_out1[ip+0]; - z5[i] = dft_out1[ip+1]; - z6[i] = dft_out1[ip+2]; - z7[i] = dft_out1[ip+3]; - z8[i] = dft_out2[ip]; - z9[i] = dft_out2[ip+1]; - z10[i] = dft_out2[ip+2]; - z11[i] = dft_out2[ip+3]; - // printf("out dft%d %d: %d,%d,%d,%d,%d,%d,%d,%d\n",Msc_PUSCH,ip,z0[i],z1[i],z2[i],z3[i],z4[i],z5[i],z6[i],z7[i]); - - } - - // printf("\n"); -} - -#endif -void ulsch_modulation(int32_t **txdataF, - short amp, - uint32_t frame, - uint32_t subframe, - LTE_DL_FRAME_PARMS *frame_parms, - LTE_UE_ULSCH_t *ulsch) -{ - - uint8_t qam64_table_offset_re = 0; - uint8_t qam64_table_offset_im = 0; - uint8_t qam16_table_offset_re = 0; - uint8_t qam16_table_offset_im = 0; - short gain_lin_QPSK; - - DevAssert(frame_parms); - - int re_offset,re_offset0,i,Msymb,j,k,nsymb,Msc_PUSCH,l; - // uint8_t harq_pid = (rag_flag == 1) ? 0 : subframe2harq_pid_tdd(frame_parms->tdd_config,subframe); - uint8_t harq_pid = subframe2harq_pid(frame_parms,frame,subframe); - uint8_t Q_m; - int32_t *txptr; - uint32_t symbol_offset; - uint16_t first_rb; - uint16_t nb_rb; - int G; - - uint32_t x1, x2, s=0; - uint8_t c; - - if (!ulsch) { - printf("ulsch_modulation.c: Null ulsch\n"); - return; - } - - // x1 is set in lte_gold_generic - x2 = (ulsch->rnti<<14) + (subframe<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.3.1 - - if (harq_pid>=8) { - printf("ulsch_modulation.c: Illegal harq_pid %d\n",harq_pid); - return; - } - - first_rb = ulsch->harq_processes[harq_pid]->first_rb; - nb_rb = ulsch->harq_processes[harq_pid]->nb_rb; - - if (nb_rb == 0) { - printf("ulsch_modulation.c: Frame %d, Subframe %d Illegal nb_rb %d\n",frame,subframe,nb_rb); - return; - } - - if (first_rb > frame_parms->N_RB_UL) { - printf("ulsch_modulation.c: Frame %d, Subframe %d Illegal first_rb %d\n",frame,subframe,first_rb); - return; - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_MODULATION, VCD_FUNCTION_IN); - - Q_m = get_Qm_ul(ulsch->harq_processes[harq_pid]->mcs); - - G = (int)ulsch->harq_processes[harq_pid]->nb_rb * (12 * Q_m) * (ulsch->Nsymb_pusch); - - - // Mapping - nsymb = (frame_parms->Ncp==0) ? 14:12; - Msc_PUSCH = ulsch->harq_processes[harq_pid]->nb_rb*12; - -#ifdef DEBUG_ULSCH_MODULATION - LOG_D(PHY,"ulsch_modulation.c: Doing modulation (rnti %x,x2 %x) for G=%d bits, harq_pid %d , nb_rb %d, Q_m %d, Nsymb_pusch %d (nsymb %d), subframe %d\n", - ulsch->rnti,x2,G,harq_pid,ulsch->harq_processes[harq_pid]->nb_rb,Q_m, ulsch->Nsymb_pusch,nsymb,subframe); -#endif - - // scrambling (Note the placeholding bits are handled in ulsch_coding.c directly!) - //printf("ulsch bits: "); - s = lte_gold_generic(&x1, &x2, 1); - k=0; - - //printf("G %d\n",G); - for (i=0; i<(1+(G>>5)); i++) { - for (j=0; j<32; j++,k++) { - c = (uint8_t)((s>>j)&1); - - if (ulsch->h[k] == PUSCH_x) { - // printf("i %d: PUSCH_x\n",i); - ulsch->b_tilde[k] = 1; - } else if (ulsch->h[k] == PUSCH_y) { - // printf("i %d: PUSCH_y\n",i); - ulsch->b_tilde[k] = ulsch->b_tilde[k-1]; - } else { - ulsch->b_tilde[k] = (ulsch->h[k]+c)&1; - // printf("i %d : %d (h %d c %d)\n", (i<<5)+j,ulsch->b_tilde[k],ulsch->h[k],c); - } - - } - - s = lte_gold_generic(&x1, &x2, 0); - } - - //printf("\n"); - - - gain_lin_QPSK = (short)((amp*ONE_OVER_SQRT2_Q15)>>15); - - - // Modulation - - Msymb = G/Q_m; - - if(ulsch->cooperation_flag == 2) - // For Distributed Alamouti Scheme in Collabrative Communication - { - for (i=0,j=Q_m; i<Msymb; i+=2,j+=2*Q_m) { - - switch (Q_m) { - - case 2: - - - //UE1, -x1* - ((int16_t*)&ulsch->d[i])[0] = (ulsch->b_tilde[j] == 1) ? (gain_lin_QPSK) : -gain_lin_QPSK; - ((int16_t*)&ulsch->d[i])[1] = (ulsch->b_tilde[j+1] == 1)? (-gain_lin_QPSK) : gain_lin_QPSK; - // if (i<Msc_PUSCH) - // printf("input %d (%p): %d,%d\n", i,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]); - - // UE1, x0* - ((int16_t*)&ulsch->d[i+1])[0] = (ulsch->b_tilde[j-2] == 1) ? (-gain_lin_QPSK) : gain_lin_QPSK; - ((int16_t*)&ulsch->d[i+1])[1] = (ulsch->b_tilde[j-1] == 1)? (gain_lin_QPSK) : -gain_lin_QPSK; - - break; - - case 4: - - - //UE1,-x1* - qam16_table_offset_re = 0; - qam16_table_offset_im = 0; - - if (ulsch->b_tilde[j] == 1) - qam16_table_offset_re+=2; - - if (ulsch->b_tilde[j+1] == 1) - qam16_table_offset_im+=2; - - - - if (ulsch->b_tilde[j+2] == 1) - qam16_table_offset_re+=1; - - if (ulsch->b_tilde[j+3] == 1) - qam16_table_offset_im+=1; - - - ((int16_t*)&ulsch->d[i])[0]=-(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); - ((int16_t*)&ulsch->d[i])[1]=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); - - //UE1,x0* - qam16_table_offset_re = 0; - qam16_table_offset_im = 0; - - if (ulsch->b_tilde[j-4] == 1) - qam16_table_offset_re+=2; - - if (ulsch->b_tilde[j-3] == 1) - qam16_table_offset_im+=2; - - - if (ulsch->b_tilde[j-2] == 1) - qam16_table_offset_re+=1; - - if (ulsch->b_tilde[j-1] == 1) - qam16_table_offset_im+=1; - - - // ((int16_t*)&ulsch->d[i+1])[0]=-(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); - // ((int16_t*)&ulsch->d[i+1])[1]=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); - ((int16_t*)&ulsch->d[i+1])[0]=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); - ((int16_t*)&ulsch->d[i+1])[1]=-(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); - - - break; - - case 6: - - - - //UE1,-x1*FPGA_UE - qam64_table_offset_re = 0; - qam64_table_offset_im = 0; - - if (ulsch->b_tilde[j] == 1) - qam64_table_offset_re+=4; - - if (ulsch->b_tilde[j+1] == 1) - qam64_table_offset_im+=4; - - if (ulsch->b_tilde[j+2] == 1) - qam64_table_offset_re+=2; - - - if (ulsch->b_tilde[j+3] == 1) - qam64_table_offset_im+=2; - - if (ulsch->b_tilde[j+4] == 1) - qam64_table_offset_re+=1; - - if (ulsch->b_tilde[j+5] == 1) - qam64_table_offset_im+=1; - - - ((int16_t*)&ulsch->d[i])[0]=-(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); - ((int16_t*)&ulsch->d[i])[1]=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); - - //UE1,x0* - qam64_table_offset_re = 0; - qam64_table_offset_im = 0; - - if (ulsch->b_tilde[j-6] == 1) - qam64_table_offset_re+=4; - - if (ulsch->b_tilde[j-5] == 1) - qam64_table_offset_im+=4; - - if (ulsch->b_tilde[j-4] == 1) - qam64_table_offset_re+=2; - - - if (ulsch->b_tilde[j-3] == 1) - qam64_table_offset_im+=2; - - if (ulsch->b_tilde[j-2] == 1) - qam64_table_offset_re+=1; - - if (ulsch->b_tilde[j-1] == 1) - qam64_table_offset_im+=1; - - - ((int16_t*)&ulsch->d[i+1])[0]=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); - ((int16_t*)&ulsch->d[i+1])[1]=-(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); - - break; - - }//switch - }//for - }//cooperation_flag == 2 - else { - for (i=0,j=0; i<Msymb; i++,j+=Q_m) { - - switch (Q_m) { - - case 2: - // TODO: this has to be updated!!! - - ((int16_t*)&ulsch->d[i])[0] = (ulsch->b_tilde[j] == 1) ? (-gain_lin_QPSK) : gain_lin_QPSK; - ((int16_t*)&ulsch->d[i])[1] = (ulsch->b_tilde[j+1] == 1)? (-gain_lin_QPSK) : gain_lin_QPSK; - // if (i<Msc_PUSCH) - // printf("input %d/%d Msc_PUSCH %d (%p): %d,%d\n", i,Msymb,Msc_PUSCH,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]); - - break; - - case 4: - - qam16_table_offset_re = 0; - qam16_table_offset_im = 0; - - if (ulsch->b_tilde[j] == 1) - qam16_table_offset_re+=2; - - if (ulsch->b_tilde[j+1] == 1) - qam16_table_offset_im+=2; - - if (ulsch->b_tilde[j+2] == 1) - qam16_table_offset_re+=1; - - if (ulsch->b_tilde[j+3] == 1) - qam16_table_offset_im+=1; - - - ((int16_t*)&ulsch->d[i])[0]=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); - ((int16_t*)&ulsch->d[i])[1]=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); - // printf("input(16qam) %d (%p): %d,%d\n", i,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]); - break; - - case 6: - - - qam64_table_offset_re = 0; - qam64_table_offset_im = 0; - - if (ulsch->b_tilde[j] == 1) - qam64_table_offset_re+=4; - - if (ulsch->b_tilde[j+1] == 1) - qam64_table_offset_im+=4; - - if (ulsch->b_tilde[j+2] == 1) - qam64_table_offset_re+=2; - - if (ulsch->b_tilde[j+3] == 1) - qam64_table_offset_im+=2; - - if (ulsch->b_tilde[j+4] == 1) - qam64_table_offset_re+=1; - - if (ulsch->b_tilde[j+5] == 1) - qam64_table_offset_im+=1; - - - ((int16_t*)&ulsch->d[i])[0]=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); - ((int16_t*)&ulsch->d[i])[1]=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); - - break; - - } - } - }// normal symbols - - - // Transform Precoding - -#ifdef OFDMA_ULSCH - - for (i=0; i<Msymb; i++) { - ulsch->z[i] = ulsch->d[i]; - } - -#else - dft_lte(ulsch->z,ulsch->d,Msc_PUSCH,ulsch->Nsymb_pusch); -#endif - - DevAssert(txdataF); - -#ifdef OFDMA_ULSCH - re_offset0 = frame_parms->first_carrier_offset + (ulsch->harq_processes[harq_pid]->first_rb*12); - - if (re_offset0>frame_parms->ofdm_symbol_size) { - re_offset0 -= frame_parms->ofdm_symbol_size; - // re_offset0++; - } - - // printf("re_offset0 %d\n",re_offset0); - - - for (j=0,l=0; l<(nsymb-ulsch->srs_active); l++) { - re_offset = re_offset0; - symbol_offset = (int)frame_parms->ofdm_symbol_size*(l+(subframe*nsymb)); -#ifdef DEBUG_ULSCH_MODULATION - printf("symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset); -#endif - txptr = &txdataF[0][symbol_offset]; - - if (((frame_parms->Ncp == 0) && ((l==3) || (l==10)))|| - ((frame_parms->Ncp == 1) && ((l==2) || (l==8)))) { - } - // Skip reference symbols - else { - - // printf("copying %d REs\n",Msc_PUSCH); - for (i=0; i<Msc_PUSCH; i++,j++) { -#ifdef DEBUG_ULSCH_MODULATION - printf("re_offset %d (%p): %d,%d\n", re_offset,&ulsch->z[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1]); -#endif - txptr[re_offset++] = ulsch->z[j]; - - if (re_offset==frame_parms->ofdm_symbol_size) - re_offset = 0; - } - } - } - -# else // OFDMA_ULSCH = 0 - re_offset0 = frame_parms->first_carrier_offset + (ulsch->harq_processes[harq_pid]->first_rb*12); - - if (re_offset0>frame_parms->ofdm_symbol_size) { - re_offset0 -= frame_parms->ofdm_symbol_size; - // re_offset0++; - } - - // printf("re_offset0 %d\n",re_offset0); - // printf("txdataF %p\n",&txdataF[0][0]); - for (j=0,l=0; l<(nsymb-ulsch->srs_active); l++) { - re_offset = re_offset0; - symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*(l+(subframe*nsymb)); -#ifdef DEBUG_ULSCH_MODULATION - printf("ulsch_mod (SC-FDMA) symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset); -#endif - txptr = &txdataF[0][symbol_offset]; - - if (((frame_parms->Ncp == 0) && ((l==3) || (l==10)))|| - ((frame_parms->Ncp == 1) && ((l==2) || (l==8)))) { - } - // Skip reference symbols - else { - // printf("copying %d REs\n",Msc_PUSCH); - for (i=0; i<Msc_PUSCH; i++,j++) { - -#ifdef DEBUG_ULSCH_MODULATION - printf("re_offset %d (%p): %d,%d => %p\n", re_offset,&ulsch->z[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1],&txptr[re_offset]); -#endif //DEBUG_ULSCH_MODULATION - txptr[re_offset++] = ulsch->z[j]; - - if (re_offset==frame_parms->ofdm_symbol_size) - re_offset = 0; - } - } - } - -#endif - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_MODULATION, VCD_FUNCTION_OUT); - -} - diff --git a/openair1/PHY/defs_RU.h b/openair1/PHY/defs_RU.h index 0bda340c27e8e5917d407ba7773efb03f263f860..3ad007813e5dbcb0b2a2c63fd5cac26628964bc5 100644 --- a/openair1/PHY/defs_RU.h +++ b/openair1/PHY/defs_RU.h @@ -35,7 +35,6 @@ #define MAX_BANDS_PER_RRU 4 -#define MAX_NUM_RU_PER_gNB MAX_NUM_RU_PER_eNB #ifdef OCP_FRAMEWORK diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index f5e9efa3cbed1d3d3b2d474ae57affdaa6c64dae..18c2ba5cce345955af6e529dcbc63cf948760c7a 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -38,6 +38,7 @@ #include "CODING/nrPolar_tools/nr_polar_pbch_defs.h" #include "openair2/NR_PHY_INTERFACE/NR_IF_Module.h" +#define MAX_NUM_RU_PER_gNB MAX_NUM_RU_PER_eNB typedef struct { uint8_t pbch_a[NR_POLAR_PBCH_PAYLOAD_BITS>>3]; diff --git a/openair2/LAYER2/MAC/mac.h b/openair2/LAYER2/MAC/mac.h index 3b57d8240b56bec2b366a26995a652327c012ed8..d9e914f087009858a77e323fb2c3597609ca3d38 100644 --- a/openair2/LAYER2/MAC/mac.h +++ b/openair2/LAYER2/MAC/mac.h @@ -77,11 +77,6 @@ #include "targets/ARCH/COMMON/common_lib.h" -//solve implicit declaration -#include "PHY/LTE_ESTIMATION/lte_estimation.h" -#include "PHY/LTE_TRANSPORT/transport_proto.h" -#include "PHY/LTE_TRANSPORT/transport_common_proto.h" - /** @defgroup _mac MAC * @ingroup _oai2 * @{ diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 3b567b257b2b20b17807d8b24a80f6406465e167..a299d3d1c51e6dacaf2e6658cf72d97b308f2b11 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -207,7 +207,7 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam // **************************************** // Common RX procedures subframe n - T(T_GNB_PHY_DL_TICK, T_INT(eNB->Mod_id), T_INT(proc->frame_tx), T_INT(proc->subframe_tx)); + T(T_ENB_PHY_DL_TICK, T_INT(eNB->Mod_id), T_INT(proc->frame_tx), T_INT(proc->subframe_tx)); // if this is IF5 or 3GPP_eNB if (eNB && eNB->RU_list && eNB->RU_list[0] && eNB->RU_list[0]->function < NGFI_RAU_IF4p5) { diff --git a/targets/RT/USER/nr-softmodem.c b/targets/RT/USER/nr-softmodem.c index fffdecce9cd3758f88d23eb11f8153b78bd63def..58b41d1a12528b10c31ee52d3518ad9a7c096030 100644 --- a/targets/RT/USER/nr-softmodem.c +++ b/targets/RT/USER/nr-softmodem.c @@ -886,7 +886,6 @@ static void wait_nfapi_init(char *thread_name) { int main( int argc, char **argv ) { - crcTableInit(); int i; #if defined (XFORMS) //void *status;