From b6d66003170db20e2f43d436ec110354f6ea04b2 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Tue, 10 Sep 2013 21:06:45 +0000 Subject: [PATCH] git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4144 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- openair1/PHY/CODING/defs.h | 1 + openair1/PHY/LTE_TRANSPORT/dci_tools.c | 1 + .../PHY/LTE_TRANSPORT/dlsch_llr_computation.c | 2 +- openair1/PHY/LTE_TRANSPORT/phich.c | 12 +- openair1/PHY/LTE_TRANSPORT/pmch.c | 152 +- openair1/PHY/LTE_TRANSPORT/ulsch_coding.c | 2 +- openair1/PHY/TOOLS/lte_dfts.c | 8776 ++++++++++++++++- openair1/SCHED/phy_procedures_lte_common.c | 12 +- openair1/SCHED/phy_procedures_lte_eNb.c | 119 +- openair1/SIMULATION/LTE_PHY/ulsim.c | 6 +- 10 files changed, 8952 insertions(+), 131 deletions(-) diff --git a/openair1/PHY/CODING/defs.h b/openair1/PHY/CODING/defs.h index a548d8ebd0..81acb24d28 100644 --- a/openair1/PHY/CODING/defs.h +++ b/openair1/PHY/CODING/defs.h @@ -11,6 +11,7 @@ #ifndef NO_OPENAIR1 #include "PHY/defs.h" #else +#include "PHY/TOOLS/time_meas.h" #define u32 uint32_t #define s32 int32_t #define u16 uint16_t diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 77bbc0ef58..0f48974297 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -1155,6 +1155,7 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, } #ifdef DEBUG_DCI if (dlsch0) { + msg("dlsch0 eNB: dlsch0 %p\n",dlsch0); msg("dlsch0 eNB: rnti %x\n",dlsch0->rnti); msg("dlsch0 eNB: NBRB %d\n",dlsch0->nb_rb); msg("dlsch0 eNB: rballoc %x\n",dlsch0->rb_alloc[0]); diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c index 5189067d18..dcaf9fd975 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c @@ -820,7 +820,7 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, len2=len>>2; // length in quad words (4 REs) len2+=(len_mod4?0:1); - for (i=0;iframe_type == 0) + if (frame_parms->frame_type == FDD) return 1; // for TDD @@ -104,7 +104,7 @@ uint8_t get_mi(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe) { unsigned char subframe2_ul_harq(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subframe) { - if (frame_parms->frame_type == 0) + if (frame_parms->frame_type == FDD) return(subframe&7); switch (frame_parms->tdd_config) { @@ -126,7 +126,7 @@ unsigned char subframe2_ul_harq(LTE_DL_FRAME_PARMS *frame_parms,unsigned char su } uint8_t phich_frame2_pusch_frame(LTE_DL_FRAME_PARMS *frame_parms,uint8_t frame,uint8_t subframe) { - if (frame_parms->frame_type == 0) { + if (frame_parms->frame_type == FDD) { return((subframe<4) ? (frame - 1) : frame); } else { @@ -137,7 +137,7 @@ uint8_t phich_frame2_pusch_frame(LTE_DL_FRAME_PARMS *frame_parms,uint8_t frame,u uint8_t phich_subframe2_pusch_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe) { - if (frame_parms->frame_type == 0) + if (frame_parms->frame_type == FDD) return(subframe<4 ? ((subframe+8)%10) : subframe-4); switch (frame_parms->tdd_config) { @@ -1013,7 +1013,7 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue, ngroup_PHICH = (ulsch->harq_processes[harq_pid]->first_rb + ulsch->harq_processes[harq_pid]->n_DMRS)%Ngroup_PHICH; - if ((frame_parms->tdd_config == 0) && (frame_parms->frame_type == 1) ) { + if ((frame_parms->tdd_config == 0) && (frame_parms->frame_type == TDD) ) { pusch_subframe = phich_subframe2_pusch_subframe(frame_parms,subframe); if ((pusch_subframe == 4) || (pusch_subframe == 9)) ngroup_PHICH += Ngroup_PHICH; @@ -1351,7 +1351,7 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, ngroup_PHICH = (ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb + ulsch_eNB[UE_id]->harq_processes[harq_pid]->n_DMRS)%Ngroup_PHICH; - if ((frame_parms->tdd_config == 0) && (frame_parms->frame_type == 1) ) { + if ((frame_parms->tdd_config == 0) && (frame_parms->frame_type == TDD) ) { if ((pusch_subframe == 4) || (pusch_subframe == 9)) ngroup_PHICH += Ngroup_PHICH; diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c index 5754d9e6cc..3bf509246b 100644 --- a/openair1/PHY/LTE_TRANSPORT/pmch.c +++ b/openair1/PHY/LTE_TRANSPORT/pmch.c @@ -16,14 +16,17 @@ #define MBSFN_FDD_SF6 0x10 #define MBSFN_FDD_SF7 0x08 #define MBSFN_FDD_SF8 0x04 + #ifndef __SSE3__ +#warning SSE3 instruction set not preset __m128i zeroM;//,tmp_over_sqrt_10,tmp_sum_4_over_sqrt_10,tmp_sign,tmp_sign_3_over_sqrt_10; //#define _mm_abs_epi16(xmmx) _mm_xor_si128((xmmx),_mm_cmpgt_epi16(zero,(xmmx))) #define _mm_abs_epi16(xmmx) _mm_add_epi16(_mm_xor_si128((xmmx),_mm_cmpgt_epi16(zeroM,(xmmx))),_mm_srli_epi16(_mm_cmpgt_epi16(zeroM,(xmmx)),15)) #define _mm_sign_epi16(xmmx,xmmy) _mm_xor_si128((xmmx),_mm_cmpgt_epi16(zeroM,(xmmy))) #endif + void dump_mch(PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u16 coded_bits_per_codeword,int subframe) { unsigned int nsymb_pmch=12; @@ -62,10 +65,10 @@ void dump_mch(PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u16 coded_bits_per_codeword,int write_output("rxsig_mch.m","rxs_mch", &phy_vars_ue->lte_ue_common_vars.rxdata[0][subframe*phy_vars_ue->lte_frame_parms.samples_per_tti], phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); - - write_output("txsig_mch.m","txs_mch", - &PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][0][subframe*phy_vars_ue->lte_frame_parms.samples_per_tti], - phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); + if (PHY_vars_eNB_g) + write_output("txsig_mch.m","txs_mch", + &PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][0][subframe*phy_vars_ue->lte_frame_parms.samples_per_tti], + phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); } int is_pmch_subframe(uint32_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_parms) { @@ -619,58 +622,97 @@ void mch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, unsigned char symbol, short **llr_save) { - __m128i *rxF = (__m128i*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; - __m128i *ch_mag,*ch_magb,xmm1,xmm2; - int j=0,i,len,len2; - unsigned char len_mod4; - short *llr; - s16 *llr2; + __m128i xmm1,xmm2,*ch_mag,*ch_magb; + __m128i *rxF = (__m128i*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; + + int j=0,i,len,len2; + unsigned char len_mod4; + short *llr; + s16 *llr2; + + if (symbol==2) + llr = dlsch_llr; + else + llr = *llr_save; + + 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)]; + + if ((symbol==2) || (symbol==6) || (symbol==10)) { + len = frame_parms->N_RB_DL*6; + } + else { + len = frame_parms->N_RB_DL*12; + } + + + llr2 = llr; + llr += (len*6); + + len_mod4 =len&3; + len2=len>>2; // length in quad words (4 REs) + len2+=(len_mod4?0:1); + + + for (i=0;iN_RB_DL*12)]; - ch_magb = (__m128i*)&dl_ch_magb[0][(symbol*frame_parms->N_RB_DL*12)]; - - if ((symbol==2) || (symbol==6) || (symbol==10)) { - len = frame_parms->N_RB_DL*6; + 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); + /* + printf("pmch i: %d => mag (%d,%d) (%d,%d)\n",i,((short *)&ch_mag[i])[0],((short *)&ch_magb[i])[0], + ((short *)&rxF[i])[0],((short *)&rxF[i])[1]); + */ + // 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] = _mm_extract_epi16(xmm1,j); + llr2[3] = _mm_extract_epi16(xmm1,j+1);//((short *)&xmm1)[j+1]; + llr2[4] = _mm_extract_epi16(xmm2,j);//((short *)&xmm2)[j]; + llr2[5] = _mm_extract_epi16(xmm2,j+1);//((short *)&xmm2)[j+1]; + + llr2+=6; } - else { - len = frame_parms->N_RB_DL*12; - } - - - llr2 = llr; - llr += (len*6); - - len_mod4 =len&3; - len2=len>>2; // length in quad words (4 REs) - len2+=(len_mod4?0:1); - - for (i=0;i>2;i++) { - - 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); - - // 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; - } - } - *llr_save = llr; - _mm_empty(); - _m_empty(); + */ + llr2[0] = ((short *)&rxF[i])[0]; + llr2[1] = ((short *)&rxF[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 *)&rxF[i])[2]; + llr2[1] = ((short *)&rxF[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 *)&rxF[i])[4]; + llr2[1] = ((short *)&rxF[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 *)&rxF[i])[6]; + llr2[1] = ((short *)&rxF[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(); } int avg_pmch[4]; @@ -685,6 +727,8 @@ int rx_pmch(PHY_VARS_UE *phy_vars_ue, LTE_UE_DLSCH_t **dlsch_ue = &phy_vars_ue->dlsch_ue_MCH[eNB_id]; int avgs,aarx; + //printf("*********************mch: symbol %d\n",symbol); + mch_extract_rbs(lte_ue_common_vars->rxdataF, lte_ue_common_vars->dl_ch_estimates[eNB_id], lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c index 74699bce45..743698d6fc 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c @@ -250,7 +250,7 @@ u32 ulsch_encoding(u8 *a, // save PUSCH pmi for later (transmission modes 4,5,6) // msg("ulsch: saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi)); if (dlsch[0]) - dlsch[0]->harq_processes[harq_pid]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi; + dlsch[0]->harq_processes[harq_pid]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi; } if (ulsch->O<=32) { diff --git a/openair1/PHY/TOOLS/lte_dfts.c b/openair1/PHY/TOOLS/lte_dfts.c index 3b47b2d8cf..fa652f46ff 100644 --- a/openair1/PHY/TOOLS/lte_dfts.c +++ b/openair1/PHY/TOOLS/lte_dfts.c @@ -685,7 +685,7 @@ static inline void dft16(int16_t *x,int16_t *y) __attribute__((always_inline)); static inline void dft16(int16_t *x,int16_t *y) { - __m128i ytmp[4],*tw16a_128=(__m128i *)tw16a,*tw16b_128=(__m128i *)tw16b,*x128=(__m128i *)x,*y128=(__m128i *)y; + __m128i *tw16a_128=(__m128i *)tw16a,*tw16b_128=(__m128i *)tw16b,*x128=(__m128i *)x,*y128=(__m128i *)y; /* bfly4_tw1(x128,x128+1,x128+2,x128+3, @@ -773,7 +773,7 @@ static inline void idft16(int16_t *x,int16_t *y) __attribute__((always_inline)); static inline void idft16(int16_t *x,int16_t *y) { - __m128i ytmp[4],*tw16a_128=(__m128i *)tw16,*tw16b_128=(__m128i *)tw16c,*x128=(__m128i *)x,*y128=(__m128i *)y; + __m128i *tw16a_128=(__m128i *)tw16,*tw16b_128=(__m128i *)tw16c,*x128=(__m128i *)x,*y128=(__m128i *)y; /* bfly4_tw1(x128,x128+1,x128+2,x128+3, @@ -1371,7 +1371,7 @@ void dft256(int16_t *x,int16_t *y,int scale) { __m128i xtmp[64],ytmp[64],*tw256a_128p=(__m128i *)tw256a,*tw256b_128p=(__m128i *)tw256b,*x128=(__m128i *)x,*y128=(__m128i *)y,*y128p=(__m128i *)y; __m128i *ytmpp = &ytmp[0]; - int i,j; + int i; #ifdef D256STATS time_stats_t ts_t,ts_d,ts_b; @@ -5123,6 +5123,8776 @@ void dft300(int16_t *x,int16_t *y,unsigned char scale_flag){ } +/* Twiddles generated with +twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:107)/324)); +twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:107)/324)); +twa2 = zeros(1,2*107); +twb2 = zeros(1,2*107); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +twb2(1:2:end) = real(twb); +twb2(2:2:end) = imag(twb); +fd=fopen("twiddle_tmp.txt","w"); +fprintf(fd,"static int16_t twa324[107*2*4] = {"); +for i=1:2:(2*106) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +fprintf(fd,"static int16_t twb324[107*2*4] = {"); +for i=1:2:(2*106) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +fclose(fd); + */ +static int16_t twa324[107*2*4] = {32760,-636,32760,-636,32760,-636,32760,-636, +32742,-1271,32742,-1271,32742,-1271,32742,-1271, +32711,-1906,32711,-1906,32711,-1906,32711,-1906, +32668,-2540,32668,-2540,32668,-2540,32668,-2540, +32613,-3173,32613,-3173,32613,-3173,32613,-3173, +32545,-3805,32545,-3805,32545,-3805,32545,-3805, +32465,-4435,32465,-4435,32465,-4435,32465,-4435, +32373,-5064,32373,-5064,32373,-5064,32373,-5064, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32152,-6315,32152,-6315,32152,-6315,32152,-6315, +32024,-6937,32024,-6937,32024,-6937,32024,-6937, +31883,-7557,31883,-7557,31883,-7557,31883,-7557, +31731,-8174,31731,-8174,31731,-8174,31731,-8174, +31566,-8788,31566,-8788,31566,-8788,31566,-8788, +31390,-9398,31390,-9398,31390,-9398,31390,-9398, +31202,-10005,31202,-10005,31202,-10005,31202,-10005, +31002,-10608,31002,-10608,31002,-10608,31002,-10608, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30567,-11802,30567,-11802,30567,-11802,30567,-11802, +30333,-12393,30333,-12393,30333,-12393,30333,-12393, +30087,-12979,30087,-12979,30087,-12979,30087,-12979, +29829,-13560,29829,-13560,29829,-13560,29829,-13560, +29561,-14136,29561,-14136,29561,-14136,29561,-14136, +29281,-14706,29281,-14706,29281,-14706,29281,-14706, +28990,-15271,28990,-15271,28990,-15271,28990,-15271, +28689,-15831,28689,-15831,28689,-15831,28689,-15831, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28054,-16931,28054,-16931,28054,-16931,28054,-16931, +27720,-17472,27720,-17472,27720,-17472,27720,-17472, +27376,-18006,27376,-18006,27376,-18006,27376,-18006, +27022,-18534,27022,-18534,27022,-18534,27022,-18534, +26657,-19054,26657,-19054,26657,-19054,26657,-19054, +26283,-19568,26283,-19568,26283,-19568,26283,-19568, +25898,-20074,25898,-20074,25898,-20074,25898,-20074, +25504,-20572,25504,-20572,25504,-20572,25504,-20572, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24687,-21546,24687,-21546,24687,-21546,24687,-21546, +24265,-22020,24265,-22020,24265,-22020,24265,-22020, +23833,-22487,23833,-22487,23833,-22487,23833,-22487, +23393,-22945,23393,-22945,23393,-22945,23393,-22945, +22944,-23394,22944,-23394,22944,-23394,22944,-23394, +22486,-23834,22486,-23834,22486,-23834,22486,-23834, +22019,-24266,22019,-24266,22019,-24266,22019,-24266, +21545,-24688,21545,-24688,21545,-24688,21545,-24688, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20571,-25505,20571,-25505,20571,-25505,20571,-25505, +20073,-25899,20073,-25899,20073,-25899,20073,-25899, +19567,-26284,19567,-26284,19567,-26284,19567,-26284, +19053,-26658,19053,-26658,19053,-26658,19053,-26658, +18533,-27023,18533,-27023,18533,-27023,18533,-27023, +18005,-27377,18005,-27377,18005,-27377,18005,-27377, +17471,-27721,17471,-27721,17471,-27721,17471,-27721, +16930,-28055,16930,-28055,16930,-28055,16930,-28055, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15830,-28690,15830,-28690,15830,-28690,15830,-28690, +15270,-28991,15270,-28991,15270,-28991,15270,-28991, +14705,-29282,14705,-29282,14705,-29282,14705,-29282, +14135,-29562,14135,-29562,14135,-29562,14135,-29562, +13559,-29830,13559,-29830,13559,-29830,13559,-29830, +12978,-30088,12978,-30088,12978,-30088,12978,-30088, +12392,-30334,12392,-30334,12392,-30334,12392,-30334, +11801,-30568,11801,-30568,11801,-30568,11801,-30568, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +10607,-31003,10607,-31003,10607,-31003,10607,-31003, +10004,-31203,10004,-31203,10004,-31203,10004,-31203, +9397,-31391,9397,-31391,9397,-31391,9397,-31391, +8787,-31567,8787,-31567,8787,-31567,8787,-31567, +8173,-31732,8173,-31732,8173,-31732,8173,-31732, +7556,-31884,7556,-31884,7556,-31884,7556,-31884, +6936,-32025,6936,-32025,6936,-32025,6936,-32025, +6314,-32153,6314,-32153,6314,-32153,6314,-32153, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5063,-32374,5063,-32374,5063,-32374,5063,-32374, +4434,-32466,4434,-32466,4434,-32466,4434,-32466, +3804,-32546,3804,-32546,3804,-32546,3804,-32546, +3172,-32614,3172,-32614,3172,-32614,3172,-32614, +2539,-32669,2539,-32669,2539,-32669,2539,-32669, +1905,-32712,1905,-32712,1905,-32712,1905,-32712, +1270,-32743,1270,-32743,1270,-32743,1270,-32743, +635,-32761,635,-32761,635,-32761,635,-32761, +0,-32767,0,-32767,0,-32767,0,-32767, +-636,-32761,-636,-32761,-636,-32761,-636,-32761, +-1271,-32743,-1271,-32743,-1271,-32743,-1271,-32743, +-1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, +-2540,-32669,-2540,-32669,-2540,-32669,-2540,-32669, +-3173,-32614,-3173,-32614,-3173,-32614,-3173,-32614, +-3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, +-4435,-32466,-4435,-32466,-4435,-32466,-4435,-32466, +-5064,-32374,-5064,-32374,-5064,-32374,-5064,-32374, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-6315,-32153,-6315,-32153,-6315,-32153,-6315,-32153, +-6937,-32025,-6937,-32025,-6937,-32025,-6937,-32025, +-7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, +-8174,-31732,-8174,-31732,-8174,-31732,-8174,-31732, +-8788,-31567,-8788,-31567,-8788,-31567,-8788,-31567, +-9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, +-10005,-31203,-10005,-31203,-10005,-31203,-10005,-31203, +-10608,-31003,-10608,-31003,-10608,-31003,-10608,-31003, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-11802,-30568,-11802,-30568,-11802,-30568,-11802,-30568, +-12393,-30334,-12393,-30334,-12393,-30334,-12393,-30334, +-12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, +-13560,-29830,-13560,-29830,-13560,-29830,-13560,-29830, +-14136,-29562,-14136,-29562,-14136,-29562,-14136,-29562, +-14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, +-15271,-28991,-15271,-28991,-15271,-28991,-15271,-28991, +-15831,-28690,-15831,-28690,-15831,-28690,-15831,-28690}; +static int16_t twb324[107*2*4] = {32742,-1271,32742,-1271,32742,-1271,32742,-1271, +32668,-2540,32668,-2540,32668,-2540,32668,-2540, +32545,-3805,32545,-3805,32545,-3805,32545,-3805, +32373,-5064,32373,-5064,32373,-5064,32373,-5064, +32152,-6315,32152,-6315,32152,-6315,32152,-6315, +31883,-7557,31883,-7557,31883,-7557,31883,-7557, +31566,-8788,31566,-8788,31566,-8788,31566,-8788, +31202,-10005,31202,-10005,31202,-10005,31202,-10005, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30333,-12393,30333,-12393,30333,-12393,30333,-12393, +29829,-13560,29829,-13560,29829,-13560,29829,-13560, +29281,-14706,29281,-14706,29281,-14706,29281,-14706, +28689,-15831,28689,-15831,28689,-15831,28689,-15831, +28054,-16931,28054,-16931,28054,-16931,28054,-16931, +27376,-18006,27376,-18006,27376,-18006,27376,-18006, +26657,-19054,26657,-19054,26657,-19054,26657,-19054, +25898,-20074,25898,-20074,25898,-20074,25898,-20074, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24265,-22020,24265,-22020,24265,-22020,24265,-22020, +23393,-22945,23393,-22945,23393,-22945,23393,-22945, +22486,-23834,22486,-23834,22486,-23834,22486,-23834, +21545,-24688,21545,-24688,21545,-24688,21545,-24688, +20571,-25505,20571,-25505,20571,-25505,20571,-25505, +19567,-26284,19567,-26284,19567,-26284,19567,-26284, +18533,-27023,18533,-27023,18533,-27023,18533,-27023, +17471,-27721,17471,-27721,17471,-27721,17471,-27721, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15270,-28991,15270,-28991,15270,-28991,15270,-28991, +14135,-29562,14135,-29562,14135,-29562,14135,-29562, +12978,-30088,12978,-30088,12978,-30088,12978,-30088, +11801,-30568,11801,-30568,11801,-30568,11801,-30568, +10607,-31003,10607,-31003,10607,-31003,10607,-31003, +9397,-31391,9397,-31391,9397,-31391,9397,-31391, +8173,-31732,8173,-31732,8173,-31732,8173,-31732, +6936,-32025,6936,-32025,6936,-32025,6936,-32025, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +4434,-32466,4434,-32466,4434,-32466,4434,-32466, +3172,-32614,3172,-32614,3172,-32614,3172,-32614, +1905,-32712,1905,-32712,1905,-32712,1905,-32712, +635,-32761,635,-32761,635,-32761,635,-32761, +-636,-32761,-636,-32761,-636,-32761,-636,-32761, +-1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, +-3173,-32614,-3173,-32614,-3173,-32614,-3173,-32614, +-4435,-32466,-4435,-32466,-4435,-32466,-4435,-32466, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-6937,-32025,-6937,-32025,-6937,-32025,-6937,-32025, +-8174,-31732,-8174,-31732,-8174,-31732,-8174,-31732, +-9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, +-10608,-31003,-10608,-31003,-10608,-31003,-10608,-31003, +-11802,-30568,-11802,-30568,-11802,-30568,-11802,-30568, +-12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, +-14136,-29562,-14136,-29562,-14136,-29562,-14136,-29562, +-15271,-28991,-15271,-28991,-15271,-28991,-15271,-28991, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-17472,-27721,-17472,-27721,-17472,-27721,-17472,-27721, +-18534,-27023,-18534,-27023,-18534,-27023,-18534,-27023, +-19568,-26284,-19568,-26284,-19568,-26284,-19568,-26284, +-20572,-25505,-20572,-25505,-20572,-25505,-20572,-25505, +-21546,-24688,-21546,-24688,-21546,-24688,-21546,-24688, +-22487,-23834,-22487,-23834,-22487,-23834,-22487,-23834, +-23394,-22945,-23394,-22945,-23394,-22945,-23394,-22945, +-24266,-22020,-24266,-22020,-24266,-22020,-24266,-22020, +-25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, +-25899,-20074,-25899,-20074,-25899,-20074,-25899,-20074, +-26658,-19054,-26658,-19054,-26658,-19054,-26658,-19054, +-27377,-18006,-27377,-18006,-27377,-18006,-27377,-18006, +-28055,-16931,-28055,-16931,-28055,-16931,-28055,-16931, +-28690,-15831,-28690,-15831,-28690,-15831,-28690,-15831, +-29282,-14706,-29282,-14706,-29282,-14706,-29282,-14706, +-29830,-13560,-29830,-13560,-29830,-13560,-29830,-13560, +-30334,-12393,-30334,-12393,-30334,-12393,-30334,-12393, +-30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, +-31203,-10005,-31203,-10005,-31203,-10005,-31203,-10005, +-31567,-8788,-31567,-8788,-31567,-8788,-31567,-8788, +-31884,-7557,-31884,-7557,-31884,-7557,-31884,-7557, +-32153,-6315,-32153,-6315,-32153,-6315,-32153,-6315, +-32374,-5064,-32374,-5064,-32374,-5064,-32374,-5064, +-32546,-3805,-32546,-3805,-32546,-3805,-32546,-3805, +-32669,-2540,-32669,-2540,-32669,-2540,-32669,-2540, +-32743,-1271,-32743,-1271,-32743,-1271,-32743,-1271, +-32767,-1,-32767,-1,-32767,-1,-32767,-1, +-32743,1270,-32743,1270,-32743,1270,-32743,1270, +-32669,2539,-32669,2539,-32669,2539,-32669,2539, +-32546,3804,-32546,3804,-32546,3804,-32546,3804, +-32374,5063,-32374,5063,-32374,5063,-32374,5063, +-32153,6314,-32153,6314,-32153,6314,-32153,6314, +-31884,7556,-31884,7556,-31884,7556,-31884,7556, +-31567,8787,-31567,8787,-31567,8787,-31567,8787, +-31203,10004,-31203,10004,-31203,10004,-31203,10004, +-30791,11206,-30791,11206,-30791,11206,-30791,11206, +-30334,12392,-30334,12392,-30334,12392,-30334,12392, +-29830,13559,-29830,13559,-29830,13559,-29830,13559, +-29282,14705,-29282,14705,-29282,14705,-29282,14705, +-28690,15830,-28690,15830,-28690,15830,-28690,15830, +-28055,16930,-28055,16930,-28055,16930,-28055,16930, +-27377,18005,-27377,18005,-27377,18005,-27377,18005, +-26658,19053,-26658,19053,-26658,19053,-26658,19053, +-25899,20073,-25899,20073,-25899,20073,-25899,20073, +-25101,21062,-25101,21062,-25101,21062,-25101,21062, +-24266,22019,-24266,22019,-24266,22019,-24266,22019, +-23394,22944,-23394,22944,-23394,22944,-23394,22944, +-22487,23833,-22487,23833,-22487,23833,-22487,23833, +-21546,24687,-21546,24687,-21546,24687,-21546,24687, +-20572,25504,-20572,25504,-20572,25504,-20572,25504, +-19568,26283,-19568,26283,-19568,26283,-19568,26283, +-18534,27022,-18534,27022,-18534,27022,-18534,27022, +-17472,27720,-17472,27720,-17472,27720,-17472,27720}; + +void dft324(int16_t *x,int16_t *y,unsigned char scale_flag){ // 108 x 3 + int i,j; + __m128i *x128=(__m128i *)x; + __m128i *y128=(__m128i *)y; + __m128i *twa128=(__m128i *)&twa324[0]; + __m128i *twb128=(__m128i *)&twb324[0]; + __m128i x2128[324];// = (__m128i *)&x2128array[0]; + __m128i ytmp128[324];//=&ytmp128array3[0]; + + + + for (i=0,j=0;i<108;i++,j+=3) { + x2128[i] = x128[j]; + x2128[i+108] = x128[j+1]; + x2128[i+216] = x128[j+2]; + } + + dft96((int16_t *)x2128,(int16_t *)ytmp128,1); + dft96((int16_t *)(x2128+108),(int16_t *)(ytmp128+108),1); + dft96((int16_t *)(x2128+216),(int16_t *)(ytmp128+216),1); + + bfly3_tw1(ytmp128,ytmp128+108,ytmp128+216,y128,y128+108,y128+216); + for (i=1,j=0;i<96;i++,j++) { + bfly3(ytmp128+i, + ytmp128+108+i, + ytmp128+216+i, + y128+i, + y128+108+i, + y128+216+i, + twa128+j, + twb128+j); + } + + if (scale_flag==1) { + norm128 = _mm_set1_epi16(dft_norm_table[14]); + + for (i=0;i<324;i++) { + y128[i] = _mm_slli_epi16(_mm_mulhi_epi16(y128[i],norm128),1); + } + } + + _mm_empty(); + _m_empty(); + +}; + +/* Twiddles generated with +twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:119)/360)); +twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:119)/360)); +twa2 = zeros(1,2*119); +twb2 = zeros(1,2*119); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +twb2(1:2:end) = real(twb); +twb2(2:2:end) = imag(twb); +fd=fopen("twiddle_tmp.txt","w"); +fprintf(fd,"static int16_t twa360[119*2*4] = {"); +for i=1:2:(2*118) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +fprintf(fd,"static int16_t twb360[119*2*4] = {"); +for i=1:2:(2*118) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +fclose(fd); + */ +static int16_t twa360[119*2*4] = {32762,-572,32762,-572,32762,-572,32762,-572, +32747,-1144,32747,-1144,32747,-1144,32747,-1144, +32722,-1715,32722,-1715,32722,-1715,32722,-1715, +32687,-2286,32687,-2286,32687,-2286,32687,-2286, +32642,-2856,32642,-2856,32642,-2856,32642,-2856, +32587,-3426,32587,-3426,32587,-3426,32587,-3426, +32522,-3994,32522,-3994,32522,-3994,32522,-3994, +32448,-4561,32448,-4561,32448,-4561,32448,-4561, +32363,-5126,32363,-5126,32363,-5126,32363,-5126, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32164,-6253,32164,-6253,32164,-6253,32164,-6253, +32050,-6813,32050,-6813,32050,-6813,32050,-6813, +31927,-7371,31927,-7371,31927,-7371,31927,-7371, +31793,-7928,31793,-7928,31793,-7928,31793,-7928, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31497,-9032,31497,-9032,31497,-9032,31497,-9032, +31335,-9581,31335,-9581,31335,-9581,31335,-9581, +31163,-10126,31163,-10126,31163,-10126,31163,-10126, +30981,-10668,30981,-10668,30981,-10668,30981,-10668, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30590,-11743,30590,-11743,30590,-11743,30590,-11743, +30381,-12275,30381,-12275,30381,-12275,30381,-12275, +30162,-12804,30162,-12804,30162,-12804,30162,-12804, +29934,-13328,29934,-13328,29934,-13328,29934,-13328, +29696,-13848,29696,-13848,29696,-13848,29696,-13848, +29450,-14365,29450,-14365,29450,-14365,29450,-14365, +29195,-14876,29195,-14876,29195,-14876,29195,-14876, +28931,-15384,28931,-15384,28931,-15384,28931,-15384, +28658,-15886,28658,-15886,28658,-15886,28658,-15886, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28086,-16877,28086,-16877,28086,-16877,28086,-16877, +27787,-17364,27787,-17364,27787,-17364,27787,-17364, +27480,-17847,27480,-17847,27480,-17847,27480,-17847, +27165,-18324,27165,-18324,27165,-18324,27165,-18324, +26841,-18795,26841,-18795,26841,-18795,26841,-18795, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +26168,-19720,26168,-19720,26168,-19720,26168,-19720, +25820,-20174,25820,-20174,25820,-20174,25820,-20174, +25464,-20621,25464,-20621,25464,-20621,25464,-20621, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24729,-21498,24729,-21498,24729,-21498,24729,-21498, +24350,-21926,24350,-21926,24350,-21926,24350,-21926, +23964,-22348,23964,-22348,23964,-22348,23964,-22348, +23570,-22762,23570,-22762,23570,-22762,23570,-22762, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22761,-23571,22761,-23571,22761,-23571,22761,-23571, +22347,-23965,22347,-23965,22347,-23965,22347,-23965, +21925,-24351,21925,-24351,21925,-24351,21925,-24351, +21497,-24730,21497,-24730,21497,-24730,21497,-24730, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20620,-25465,20620,-25465,20620,-25465,20620,-25465, +20173,-25821,20173,-25821,20173,-25821,20173,-25821, +19719,-26169,19719,-26169,19719,-26169,19719,-26169, +19259,-26510,19259,-26510,19259,-26510,19259,-26510, +18794,-26842,18794,-26842,18794,-26842,18794,-26842, +18323,-27166,18323,-27166,18323,-27166,18323,-27166, +17846,-27481,17846,-27481,17846,-27481,17846,-27481, +17363,-27788,17363,-27788,17363,-27788,17363,-27788, +16876,-28087,16876,-28087,16876,-28087,16876,-28087, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15885,-28659,15885,-28659,15885,-28659,15885,-28659, +15383,-28932,15383,-28932,15383,-28932,15383,-28932, +14875,-29196,14875,-29196,14875,-29196,14875,-29196, +14364,-29451,14364,-29451,14364,-29451,14364,-29451, +13847,-29697,13847,-29697,13847,-29697,13847,-29697, +13327,-29935,13327,-29935,13327,-29935,13327,-29935, +12803,-30163,12803,-30163,12803,-30163,12803,-30163, +12274,-30382,12274,-30382,12274,-30382,12274,-30382, +11742,-30591,11742,-30591,11742,-30591,11742,-30591, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +10667,-30982,10667,-30982,10667,-30982,10667,-30982, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +9580,-31336,9580,-31336,9580,-31336,9580,-31336, +9031,-31498,9031,-31498,9031,-31498,9031,-31498, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +7927,-31794,7927,-31794,7927,-31794,7927,-31794, +7370,-31928,7370,-31928,7370,-31928,7370,-31928, +6812,-32051,6812,-32051,6812,-32051,6812,-32051, +6252,-32165,6252,-32165,6252,-32165,6252,-32165, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5125,-32364,5125,-32364,5125,-32364,5125,-32364, +4560,-32449,4560,-32449,4560,-32449,4560,-32449, +3993,-32523,3993,-32523,3993,-32523,3993,-32523, +3425,-32588,3425,-32588,3425,-32588,3425,-32588, +2855,-32643,2855,-32643,2855,-32643,2855,-32643, +2285,-32688,2285,-32688,2285,-32688,2285,-32688, +1714,-32723,1714,-32723,1714,-32723,1714,-32723, +1143,-32748,1143,-32748,1143,-32748,1143,-32748, +571,-32763,571,-32763,571,-32763,571,-32763, +0,-32767,0,-32767,0,-32767,0,-32767, +-572,-32763,-572,-32763,-572,-32763,-572,-32763, +-1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, +-1715,-32723,-1715,-32723,-1715,-32723,-1715,-32723, +-2286,-32688,-2286,-32688,-2286,-32688,-2286,-32688, +-2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, +-3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, +-3994,-32523,-3994,-32523,-3994,-32523,-3994,-32523, +-4561,-32449,-4561,-32449,-4561,-32449,-4561,-32449, +-5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-6253,-32165,-6253,-32165,-6253,-32165,-6253,-32165, +-6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, +-7371,-31928,-7371,-31928,-7371,-31928,-7371,-31928, +-7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, +-8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, +-9032,-31498,-9032,-31498,-9032,-31498,-9032,-31498, +-9581,-31336,-9581,-31336,-9581,-31336,-9581,-31336, +-10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, +-10668,-30982,-10668,-30982,-10668,-30982,-10668,-30982, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-11743,-30591,-11743,-30591,-11743,-30591,-11743,-30591, +-12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, +-12804,-30163,-12804,-30163,-12804,-30163,-12804,-30163, +-13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, +-13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, +-14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, +-14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, +-15384,-28932,-15384,-28932,-15384,-28932,-15384,-28932, +-15886,-28659,-15886,-28659,-15886,-28659,-15886,-28659}; +static int16_t twb360[119*2*4] = {32747,-1144,32747,-1144,32747,-1144,32747,-1144, +32687,-2286,32687,-2286,32687,-2286,32687,-2286, +32587,-3426,32587,-3426,32587,-3426,32587,-3426, +32448,-4561,32448,-4561,32448,-4561,32448,-4561, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32050,-6813,32050,-6813,32050,-6813,32050,-6813, +31793,-7928,31793,-7928,31793,-7928,31793,-7928, +31497,-9032,31497,-9032,31497,-9032,31497,-9032, +31163,-10126,31163,-10126,31163,-10126,31163,-10126, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30381,-12275,30381,-12275,30381,-12275,30381,-12275, +29934,-13328,29934,-13328,29934,-13328,29934,-13328, +29450,-14365,29450,-14365,29450,-14365,29450,-14365, +28931,-15384,28931,-15384,28931,-15384,28931,-15384, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +27787,-17364,27787,-17364,27787,-17364,27787,-17364, +27165,-18324,27165,-18324,27165,-18324,27165,-18324, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +25820,-20174,25820,-20174,25820,-20174,25820,-20174, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24350,-21926,24350,-21926,24350,-21926,24350,-21926, +23570,-22762,23570,-22762,23570,-22762,23570,-22762, +22761,-23571,22761,-23571,22761,-23571,22761,-23571, +21925,-24351,21925,-24351,21925,-24351,21925,-24351, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20173,-25821,20173,-25821,20173,-25821,20173,-25821, +19259,-26510,19259,-26510,19259,-26510,19259,-26510, +18323,-27166,18323,-27166,18323,-27166,18323,-27166, +17363,-27788,17363,-27788,17363,-27788,17363,-27788, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15383,-28932,15383,-28932,15383,-28932,15383,-28932, +14364,-29451,14364,-29451,14364,-29451,14364,-29451, +13327,-29935,13327,-29935,13327,-29935,13327,-29935, +12274,-30382,12274,-30382,12274,-30382,12274,-30382, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +9031,-31498,9031,-31498,9031,-31498,9031,-31498, +7927,-31794,7927,-31794,7927,-31794,7927,-31794, +6812,-32051,6812,-32051,6812,-32051,6812,-32051, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +4560,-32449,4560,-32449,4560,-32449,4560,-32449, +3425,-32588,3425,-32588,3425,-32588,3425,-32588, +2285,-32688,2285,-32688,2285,-32688,2285,-32688, +1143,-32748,1143,-32748,1143,-32748,1143,-32748, +0,-32767,0,-32767,0,-32767,0,-32767, +-1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, +-2286,-32688,-2286,-32688,-2286,-32688,-2286,-32688, +-3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, +-4561,-32449,-4561,-32449,-4561,-32449,-4561,-32449, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, +-7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, +-9032,-31498,-9032,-31498,-9032,-31498,-9032,-31498, +-10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, +-13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, +-14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, +-15384,-28932,-15384,-28932,-15384,-28932,-15384,-28932, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-17364,-27788,-17364,-27788,-17364,-27788,-17364,-27788, +-18324,-27166,-18324,-27166,-18324,-27166,-18324,-27166, +-19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, +-20174,-25821,-20174,-25821,-20174,-25821,-20174,-25821, +-21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, +-21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, +-22762,-23571,-22762,-23571,-22762,-23571,-22762,-23571, +-23571,-22762,-23571,-22762,-23571,-22762,-23571,-22762, +-24351,-21926,-24351,-21926,-24351,-21926,-24351,-21926, +-25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, +-25821,-20174,-25821,-20174,-25821,-20174,-25821,-20174, +-26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, +-27166,-18324,-27166,-18324,-27166,-18324,-27166,-18324, +-27788,-17364,-27788,-17364,-27788,-17364,-27788,-17364, +-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, +-28932,-15384,-28932,-15384,-28932,-15384,-28932,-15384, +-29451,-14365,-29451,-14365,-29451,-14365,-29451,-14365, +-29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, +-30382,-12275,-30382,-12275,-30382,-12275,-30382,-12275, +-30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, +-31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, +-31498,-9032,-31498,-9032,-31498,-9032,-31498,-9032, +-31794,-7928,-31794,-7928,-31794,-7928,-31794,-7928, +-32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, +-32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, +-32449,-4561,-32449,-4561,-32449,-4561,-32449,-4561, +-32588,-3426,-32588,-3426,-32588,-3426,-32588,-3426, +-32688,-2286,-32688,-2286,-32688,-2286,-32688,-2286, +-32748,-1144,-32748,-1144,-32748,-1144,-32748,-1144, +-32767,-1,-32767,-1,-32767,-1,-32767,-1, +-32748,1143,-32748,1143,-32748,1143,-32748,1143, +-32688,2285,-32688,2285,-32688,2285,-32688,2285, +-32588,3425,-32588,3425,-32588,3425,-32588,3425, +-32449,4560,-32449,4560,-32449,4560,-32449,4560, +-32270,5689,-32270,5689,-32270,5689,-32270,5689, +-32051,6812,-32051,6812,-32051,6812,-32051,6812, +-31794,7927,-31794,7927,-31794,7927,-31794,7927, +-31498,9031,-31498,9031,-31498,9031,-31498,9031, +-31164,10125,-31164,10125,-31164,10125,-31164,10125, +-30791,11206,-30791,11206,-30791,11206,-30791,11206, +-30382,12274,-30382,12274,-30382,12274,-30382,12274, +-29935,13327,-29935,13327,-29935,13327,-29935,13327, +-29451,14364,-29451,14364,-29451,14364,-29451,14364, +-28932,15383,-28932,15383,-28932,15383,-28932,15383, +-28378,16383,-28378,16383,-28378,16383,-28378,16383, +-27788,17363,-27788,17363,-27788,17363,-27788,17363, +-27166,18323,-27166,18323,-27166,18323,-27166,18323, +-26510,19259,-26510,19259,-26510,19259,-26510,19259, +-25821,20173,-25821,20173,-25821,20173,-25821,20173, +-25101,21062,-25101,21062,-25101,21062,-25101,21062, +-24351,21925,-24351,21925,-24351,21925,-24351,21925, +-23571,22761,-23571,22761,-23571,22761,-23571,22761, +-22762,23570,-22762,23570,-22762,23570,-22762,23570, +-21926,24350,-21926,24350,-21926,24350,-21926,24350, +-21063,25100,-21063,25100,-21063,25100,-21063,25100, +-20174,25820,-20174,25820,-20174,25820,-20174,25820, +-19260,26509,-19260,26509,-19260,26509,-19260,26509, +-18324,27165,-18324,27165,-18324,27165,-18324,27165, +-17364,27787,-17364,27787,-17364,27787,-17364,27787}; + + +void dft360(int16_t *x,int16_t *y,unsigned char scale_flag){ // 120 x 3 + int i,j; + __m128i *x128=(__m128i *)x; + __m128i *y128=(__m128i *)y; + __m128i *twa128=(__m128i *)&twa360[0]; + __m128i *twb128=(__m128i *)&twb360[0]; + __m128i x2128[360];// = (__m128i *)&x2128array[0]; + __m128i ytmp128[360];//=&ytmp128array3[0]; + + + + for (i=0,j=0;i<120;i++,j+=3) { + x2128[i] = x128[j]; + x2128[i+120] = x128[j+1]; + x2128[i+240] = x128[j+2]; + } + + dft120((int16_t *)x2128,(int16_t *)ytmp128,1); + dft120((int16_t *)(x2128+120),(int16_t *)(ytmp128+120),1); + dft120((int16_t *)(x2128+240),(int16_t *)(ytmp128+240),1); + + bfly3_tw1(ytmp128,ytmp128+120,ytmp128+240,y128,y128+120,y128+240); + for (i=1,j=0;i<120;i++,j++) { + bfly3(ytmp128+i, + ytmp128+120+i, + ytmp128+240+i, + y128+i, + y128+120+i, + y128+240+i, + twa128+j, + twb128+j); + } + + if (scale_flag==1) { + norm128 = _mm_set1_epi16(dft_norm_table[14]); + + for (i=0;i<360;i++) { + y128[i] = _mm_slli_epi16(_mm_mulhi_epi16(y128[i],norm128),1); + } + } + + _mm_empty(); + _m_empty(); + +}; + +/* Twiddles generated with +twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:95)/384)); +twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:95)/384)); +twc = floor(32767*exp(-sqrt(-1)*2*pi*3*(1:95)/384)); +twa2 = zeros(1,2*95); +twb2 = zeros(1,2*95); +twc2 = zeros(1,2*95); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +twb2(1:2:end) = real(twb); +twb2(2:2:end) = imag(twb); +twc2(1:2:end) = real(twc); +twc2(2:2:end) = imag(twc); +fd=fopen("twiddle_tmp.txt","w"); +fprintf(fd,"static int16_t twa384[95*2*4] = {"); +for i=1:2:(2*94) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +fprintf(fd,"static int16_t twb384[95*2*4] = {"); +for i=1:2:(2*94) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +fprintf(fd,"static int16_t twc384[95*2*4] = {"); +for i=1:2:(2*94) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); +fclose(fd); + */ + +static int16_t twa384[95*2*4] = {32762,-537,32762,-537,32762,-537,32762,-537, +32749,-1073,32749,-1073,32749,-1073,32749,-1073, +32727,-1608,32727,-1608,32727,-1608,32727,-1608, +32696,-2144,32696,-2144,32696,-2144,32696,-2144, +32657,-2678,32657,-2678,32657,-2678,32657,-2678, +32609,-3212,32609,-3212,32609,-3212,32609,-3212, +32552,-3745,32552,-3745,32552,-3745,32552,-3745, +32486,-4277,32486,-4277,32486,-4277,32486,-4277, +32412,-4808,32412,-4808,32412,-4808,32412,-4808, +32329,-5338,32329,-5338,32329,-5338,32329,-5338, +32237,-5866,32237,-5866,32237,-5866,32237,-5866, +32137,-6393,32137,-6393,32137,-6393,32137,-6393, +32028,-6918,32028,-6918,32028,-6918,32028,-6918, +31911,-7441,31911,-7441,31911,-7441,31911,-7441, +31785,-7962,31785,-7962,31785,-7962,31785,-7962, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31507,-8998,31507,-8998,31507,-8998,31507,-8998, +31356,-9512,31356,-9512,31356,-9512,31356,-9512, +31196,-10024,31196,-10024,31196,-10024,31196,-10024, +31028,-10533,31028,-10533,31028,-10533,31028,-10533, +30851,-11039,30851,-11039,30851,-11039,30851,-11039, +30666,-11543,30666,-11543,30666,-11543,30666,-11543, +30473,-12043,30473,-12043,30473,-12043,30473,-12043, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +30063,-13034,30063,-13034,30063,-13034,30063,-13034, +29846,-13524,29846,-13524,29846,-13524,29846,-13524, +29621,-14010,29621,-14010,29621,-14010,29621,-14010, +29387,-14493,29387,-14493,29387,-14493,29387,-14493, +29146,-14972,29146,-14972,29146,-14972,29146,-14972, +28897,-15447,28897,-15447,28897,-15447,28897,-15447, +28641,-15918,28641,-15918,28641,-15918,28641,-15918, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28105,-16846,28105,-16846,28105,-16846,28105,-16846, +27825,-17304,27825,-17304,27825,-17304,27825,-17304, +27538,-17757,27538,-17757,27538,-17757,27538,-17757, +27244,-18205,27244,-18205,27244,-18205,27244,-18205, +26943,-18648,26943,-18648,26943,-18648,26943,-18648, +26634,-19087,26634,-19087,26634,-19087,26634,-19087, +26318,-19520,26318,-19520,26318,-19520,26318,-19520, +25995,-19948,25995,-19948,25995,-19948,25995,-19948, +25665,-20370,25665,-20370,25665,-20370,25665,-20370, +25329,-20788,25329,-20788,25329,-20788,25329,-20788, +24985,-21199,24985,-21199,24985,-21199,24985,-21199, +24635,-21605,24635,-21605,24635,-21605,24635,-21605, +24278,-22005,24278,-22005,24278,-22005,24278,-22005, +23915,-22400,23915,-22400,23915,-22400,23915,-22400, +23545,-22788,23545,-22788,23545,-22788,23545,-22788, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22787,-23546,22787,-23546,22787,-23546,22787,-23546, +22399,-23916,22399,-23916,22399,-23916,22399,-23916, +22004,-24279,22004,-24279,22004,-24279,22004,-24279, +21604,-24636,21604,-24636,21604,-24636,21604,-24636, +21198,-24986,21198,-24986,21198,-24986,21198,-24986, +20787,-25330,20787,-25330,20787,-25330,20787,-25330, +20369,-25666,20369,-25666,20369,-25666,20369,-25666, +19947,-25996,19947,-25996,19947,-25996,19947,-25996, +19519,-26319,19519,-26319,19519,-26319,19519,-26319, +19086,-26635,19086,-26635,19086,-26635,19086,-26635, +18647,-26944,18647,-26944,18647,-26944,18647,-26944, +18204,-27245,18204,-27245,18204,-27245,18204,-27245, +17756,-27539,17756,-27539,17756,-27539,17756,-27539, +17303,-27826,17303,-27826,17303,-27826,17303,-27826, +16845,-28106,16845,-28106,16845,-28106,16845,-28106, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15917,-28642,15917,-28642,15917,-28642,15917,-28642, +15446,-28898,15446,-28898,15446,-28898,15446,-28898, +14971,-29147,14971,-29147,14971,-29147,14971,-29147, +14492,-29388,14492,-29388,14492,-29388,14492,-29388, +14009,-29622,14009,-29622,14009,-29622,14009,-29622, +13523,-29847,13523,-29847,13523,-29847,13523,-29847, +13033,-30064,13033,-30064,13033,-30064,13033,-30064, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +12042,-30474,12042,-30474,12042,-30474,12042,-30474, +11542,-30667,11542,-30667,11542,-30667,11542,-30667, +11038,-30852,11038,-30852,11038,-30852,11038,-30852, +10532,-31029,10532,-31029,10532,-31029,10532,-31029, +10023,-31197,10023,-31197,10023,-31197,10023,-31197, +9511,-31357,9511,-31357,9511,-31357,9511,-31357, +8997,-31508,8997,-31508,8997,-31508,8997,-31508, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +7961,-31786,7961,-31786,7961,-31786,7961,-31786, +7440,-31912,7440,-31912,7440,-31912,7440,-31912, +6917,-32029,6917,-32029,6917,-32029,6917,-32029, +6392,-32138,6392,-32138,6392,-32138,6392,-32138, +5865,-32238,5865,-32238,5865,-32238,5865,-32238, +5337,-32330,5337,-32330,5337,-32330,5337,-32330, +4807,-32413,4807,-32413,4807,-32413,4807,-32413, +4276,-32487,4276,-32487,4276,-32487,4276,-32487, +3744,-32553,3744,-32553,3744,-32553,3744,-32553, +3211,-32610,3211,-32610,3211,-32610,3211,-32610, +2677,-32658,2677,-32658,2677,-32658,2677,-32658, +2143,-32697,2143,-32697,2143,-32697,2143,-32697, +1607,-32728,1607,-32728,1607,-32728,1607,-32728, +1072,-32750,1072,-32750,1072,-32750,1072,-32750, +536,-32763,536,-32763,536,-32763,536,-32763}; +static int16_t twb384[95*2*4] = {32749,-1073,32749,-1073,32749,-1073,32749,-1073, +32696,-2144,32696,-2144,32696,-2144,32696,-2144, +32609,-3212,32609,-3212,32609,-3212,32609,-3212, +32486,-4277,32486,-4277,32486,-4277,32486,-4277, +32329,-5338,32329,-5338,32329,-5338,32329,-5338, +32137,-6393,32137,-6393,32137,-6393,32137,-6393, +31911,-7441,31911,-7441,31911,-7441,31911,-7441, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31356,-9512,31356,-9512,31356,-9512,31356,-9512, +31028,-10533,31028,-10533,31028,-10533,31028,-10533, +30666,-11543,30666,-11543,30666,-11543,30666,-11543, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +29846,-13524,29846,-13524,29846,-13524,29846,-13524, +29387,-14493,29387,-14493,29387,-14493,29387,-14493, +28897,-15447,28897,-15447,28897,-15447,28897,-15447, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +27825,-17304,27825,-17304,27825,-17304,27825,-17304, +27244,-18205,27244,-18205,27244,-18205,27244,-18205, +26634,-19087,26634,-19087,26634,-19087,26634,-19087, +25995,-19948,25995,-19948,25995,-19948,25995,-19948, +25329,-20788,25329,-20788,25329,-20788,25329,-20788, +24635,-21605,24635,-21605,24635,-21605,24635,-21605, +23915,-22400,23915,-22400,23915,-22400,23915,-22400, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22399,-23916,22399,-23916,22399,-23916,22399,-23916, +21604,-24636,21604,-24636,21604,-24636,21604,-24636, +20787,-25330,20787,-25330,20787,-25330,20787,-25330, +19947,-25996,19947,-25996,19947,-25996,19947,-25996, +19086,-26635,19086,-26635,19086,-26635,19086,-26635, +18204,-27245,18204,-27245,18204,-27245,18204,-27245, +17303,-27826,17303,-27826,17303,-27826,17303,-27826, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15446,-28898,15446,-28898,15446,-28898,15446,-28898, +14492,-29388,14492,-29388,14492,-29388,14492,-29388, +13523,-29847,13523,-29847,13523,-29847,13523,-29847, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +11542,-30667,11542,-30667,11542,-30667,11542,-30667, +10532,-31029,10532,-31029,10532,-31029,10532,-31029, +9511,-31357,9511,-31357,9511,-31357,9511,-31357, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +7440,-31912,7440,-31912,7440,-31912,7440,-31912, +6392,-32138,6392,-32138,6392,-32138,6392,-32138, +5337,-32330,5337,-32330,5337,-32330,5337,-32330, +4276,-32487,4276,-32487,4276,-32487,4276,-32487, +3211,-32610,3211,-32610,3211,-32610,3211,-32610, +2143,-32697,2143,-32697,2143,-32697,2143,-32697, +1072,-32750,1072,-32750,1072,-32750,1072,-32750, +0,-32767,0,-32767,0,-32767,0,-32767, +-1073,-32750,-1073,-32750,-1073,-32750,-1073,-32750, +-2144,-32697,-2144,-32697,-2144,-32697,-2144,-32697, +-3212,-32610,-3212,-32610,-3212,-32610,-3212,-32610, +-4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, +-5338,-32330,-5338,-32330,-5338,-32330,-5338,-32330, +-6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, +-7441,-31912,-7441,-31912,-7441,-31912,-7441,-31912, +-8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, +-9512,-31357,-9512,-31357,-9512,-31357,-9512,-31357, +-10533,-31029,-10533,-31029,-10533,-31029,-10533,-31029, +-11543,-30667,-11543,-30667,-11543,-30667,-11543,-30667, +-12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, +-13524,-29847,-13524,-29847,-13524,-29847,-13524,-29847, +-14493,-29388,-14493,-29388,-14493,-29388,-14493,-29388, +-15447,-28898,-15447,-28898,-15447,-28898,-15447,-28898, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-17304,-27826,-17304,-27826,-17304,-27826,-17304,-27826, +-18205,-27245,-18205,-27245,-18205,-27245,-18205,-27245, +-19087,-26635,-19087,-26635,-19087,-26635,-19087,-26635, +-19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, +-20788,-25330,-20788,-25330,-20788,-25330,-20788,-25330, +-21605,-24636,-21605,-24636,-21605,-24636,-21605,-24636, +-22400,-23916,-22400,-23916,-22400,-23916,-22400,-23916, +-23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, +-23916,-22400,-23916,-22400,-23916,-22400,-23916,-22400, +-24636,-21605,-24636,-21605,-24636,-21605,-24636,-21605, +-25330,-20788,-25330,-20788,-25330,-20788,-25330,-20788, +-25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, +-26635,-19087,-26635,-19087,-26635,-19087,-26635,-19087, +-27245,-18205,-27245,-18205,-27245,-18205,-27245,-18205, +-27826,-17304,-27826,-17304,-27826,-17304,-27826,-17304, +-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, +-28898,-15447,-28898,-15447,-28898,-15447,-28898,-15447, +-29388,-14493,-29388,-14493,-29388,-14493,-29388,-14493, +-29847,-13524,-29847,-13524,-29847,-13524,-29847,-13524, +-30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, +-30667,-11543,-30667,-11543,-30667,-11543,-30667,-11543, +-31029,-10533,-31029,-10533,-31029,-10533,-31029,-10533, +-31357,-9512,-31357,-9512,-31357,-9512,-31357,-9512, +-31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, +-31912,-7441,-31912,-7441,-31912,-7441,-31912,-7441, +-32138,-6393,-32138,-6393,-32138,-6393,-32138,-6393, +-32330,-5338,-32330,-5338,-32330,-5338,-32330,-5338, +-32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, +-32610,-3212,-32610,-3212,-32610,-3212,-32610,-3212, +-32697,-2144,-32697,-2144,-32697,-2144,-32697,-2144, +-32750,-1073,-32750,-1073,-32750,-1073,-32750,-1073}; +static int16_t twc384[95*2*4] = {32727,-1608,32727,-1608,32727,-1608,32727,-1608, +32609,-3212,32609,-3212,32609,-3212,32609,-3212, +32412,-4808,32412,-4808,32412,-4808,32412,-4808, +32137,-6393,32137,-6393,32137,-6393,32137,-6393, +31785,-7962,31785,-7962,31785,-7962,31785,-7962, +31356,-9512,31356,-9512,31356,-9512,31356,-9512, +30851,-11039,30851,-11039,30851,-11039,30851,-11039, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +29621,-14010,29621,-14010,29621,-14010,29621,-14010, +28897,-15447,28897,-15447,28897,-15447,28897,-15447, +28105,-16846,28105,-16846,28105,-16846,28105,-16846, +27244,-18205,27244,-18205,27244,-18205,27244,-18205, +26318,-19520,26318,-19520,26318,-19520,26318,-19520, +25329,-20788,25329,-20788,25329,-20788,25329,-20788, +24278,-22005,24278,-22005,24278,-22005,24278,-22005, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22004,-24279,22004,-24279,22004,-24279,22004,-24279, +20787,-25330,20787,-25330,20787,-25330,20787,-25330, +19519,-26319,19519,-26319,19519,-26319,19519,-26319, +18204,-27245,18204,-27245,18204,-27245,18204,-27245, +16845,-28106,16845,-28106,16845,-28106,16845,-28106, +15446,-28898,15446,-28898,15446,-28898,15446,-28898, +14009,-29622,14009,-29622,14009,-29622,14009,-29622, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +11038,-30852,11038,-30852,11038,-30852,11038,-30852, +9511,-31357,9511,-31357,9511,-31357,9511,-31357, +7961,-31786,7961,-31786,7961,-31786,7961,-31786, +6392,-32138,6392,-32138,6392,-32138,6392,-32138, +4807,-32413,4807,-32413,4807,-32413,4807,-32413, +3211,-32610,3211,-32610,3211,-32610,3211,-32610, +1607,-32728,1607,-32728,1607,-32728,1607,-32728, +0,-32767,0,-32767,0,-32767,0,-32767, +-1608,-32728,-1608,-32728,-1608,-32728,-1608,-32728, +-3212,-32610,-3212,-32610,-3212,-32610,-3212,-32610, +-4808,-32413,-4808,-32413,-4808,-32413,-4808,-32413, +-6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, +-7962,-31786,-7962,-31786,-7962,-31786,-7962,-31786, +-9512,-31357,-9512,-31357,-9512,-31357,-9512,-31357, +-11039,-30852,-11039,-30852,-11039,-30852,-11039,-30852, +-12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, +-14010,-29622,-14010,-29622,-14010,-29622,-14010,-29622, +-15447,-28898,-15447,-28898,-15447,-28898,-15447,-28898, +-16846,-28106,-16846,-28106,-16846,-28106,-16846,-28106, +-18205,-27245,-18205,-27245,-18205,-27245,-18205,-27245, +-19520,-26319,-19520,-26319,-19520,-26319,-19520,-26319, +-20788,-25330,-20788,-25330,-20788,-25330,-20788,-25330, +-22005,-24279,-22005,-24279,-22005,-24279,-22005,-24279, +-23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, +-24279,-22005,-24279,-22005,-24279,-22005,-24279,-22005, +-25330,-20788,-25330,-20788,-25330,-20788,-25330,-20788, +-26319,-19520,-26319,-19520,-26319,-19520,-26319,-19520, +-27245,-18205,-27245,-18205,-27245,-18205,-27245,-18205, +-28106,-16846,-28106,-16846,-28106,-16846,-28106,-16846, +-28898,-15447,-28898,-15447,-28898,-15447,-28898,-15447, +-29622,-14010,-29622,-14010,-29622,-14010,-29622,-14010, +-30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, +-30852,-11039,-30852,-11039,-30852,-11039,-30852,-11039, +-31357,-9512,-31357,-9512,-31357,-9512,-31357,-9512, +-31786,-7962,-31786,-7962,-31786,-7962,-31786,-7962, +-32138,-6393,-32138,-6393,-32138,-6393,-32138,-6393, +-32413,-4808,-32413,-4808,-32413,-4808,-32413,-4808, +-32610,-3212,-32610,-3212,-32610,-3212,-32610,-3212, +-32728,-1608,-32728,-1608,-32728,-1608,-32728,-1608, +-32767,-1,-32767,-1,-32767,-1,-32767,-1, +-32728,1607,-32728,1607,-32728,1607,-32728,1607, +-32610,3211,-32610,3211,-32610,3211,-32610,3211, +-32413,4807,-32413,4807,-32413,4807,-32413,4807, +-32138,6392,-32138,6392,-32138,6392,-32138,6392, +-31786,7961,-31786,7961,-31786,7961,-31786,7961, +-31357,9511,-31357,9511,-31357,9511,-31357,9511, +-30852,11038,-30852,11038,-30852,11038,-30852,11038, +-30273,12539,-30273,12539,-30273,12539,-30273,12539, +-29622,14009,-29622,14009,-29622,14009,-29622,14009, +-28898,15446,-28898,15446,-28898,15446,-28898,15446, +-28106,16845,-28106,16845,-28106,16845,-28106,16845, +-27245,18204,-27245,18204,-27245,18204,-27245,18204, +-26319,19519,-26319,19519,-26319,19519,-26319,19519, +-25330,20787,-25330,20787,-25330,20787,-25330,20787, +-24279,22004,-24279,22004,-24279,22004,-24279,22004, +-23170,23169,-23170,23169,-23170,23169,-23170,23169, +-22005,24278,-22005,24278,-22005,24278,-22005,24278, +-20788,25329,-20788,25329,-20788,25329,-20788,25329, +-19520,26318,-19520,26318,-19520,26318,-19520,26318, +-18205,27244,-18205,27244,-18205,27244,-18205,27244, +-16846,28105,-16846,28105,-16846,28105,-16846,28105, +-15447,28897,-15447,28897,-15447,28897,-15447,28897, +-14010,29621,-14010,29621,-14010,29621,-14010,29621, +-12540,30272,-12540,30272,-12540,30272,-12540,30272, +-11039,30851,-11039,30851,-11039,30851,-11039,30851, +-9512,31356,-9512,31356,-9512,31356,-9512,31356, +-7962,31785,-7962,31785,-7962,31785,-7962,31785, +-6393,32137,-6393,32137,-6393,32137,-6393,32137, +-4808,32412,-4808,32412,-4808,32412,-4808,32412, +-3212,32609,-3212,32609,-3212,32609,-3212,32609, +-1608,32727,-1608,32727,-1608,32727,-1608,32727}; + +void dft384(int16_t *x,int16_t *y,unsigned char scale_flag){ // 96 x 4 + int i,j; + __m128i *x128=(__m128i *)x; + __m128i *y128=(__m128i *)y; + __m128i *twa128=(__m128i *)&twa384[0]; + __m128i *twb128=(__m128i *)&twb384[0]; + __m128i *twc128=(__m128i *)&twc384[0]; + __m128i x2128[384];// = (__m128i *)&x2128array[0]; + __m128i ytmp128[384];//=&ytmp128array2[0]; + + + + for (i=0,j=0;i<96;i++,j+=4) { + x2128[i] = x128[j]; + x2128[i+96] = x128[j+1]; + x2128[i+192] = x128[j+2]; + x2128[i+288] = x128[j+3]; + } + + dft96((int16_t *)x2128,(int16_t *)ytmp128,1); + dft96((int16_t *)(x2128+96),(int16_t *)(ytmp128+96),1); + dft96((int16_t *)(x2128+192),(int16_t *)(ytmp128+192),1); + dft96((int16_t *)(x2128+288),(int16_t *)(ytmp128+288),1); + + bfly4_tw1(ytmp128,ytmp128+96,ytmp128+192,ytmp128+288,y128,y128+96,y128+192,y128+288); + for (i=1,j=0;i<96;i++,j++) { + bfly4(ytmp128+i, + ytmp128+96+i, + ytmp128+192+i, + ytmp128+288+i, + y128+i, + y128+96+i, + y128+192+i, + y128+288+i, + twa128+j, + twb128+j, + twc128+j); + } + + if (scale_flag==1) { + norm128 = _mm_set1_epi16(16384);//dft_norm_table[13]); + + for (i=0;i<384;i++) { + y128[i] = _mm_slli_epi16(_mm_mulhi_epi16(y128[i],norm128),1); + } + } + + _mm_empty(); + _m_empty(); + +}; + +/* Twiddles generated with +twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:107)/432)); +twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:107)/432)); +twc = floor(32767*exp(-sqrt(-1)*2*pi*3*(1:107)/432)); +twa2 = zeros(1,2*107); +twb2 = zeros(1,2*107); +twc2 = zeros(1,2*107); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +twb2(1:2:end) = real(twb); +twb2(2:2:end) = imag(twb); +twc2(1:2:end) = real(twc); +twc2(2:2:end) = imag(twc); +fd=fopen("twiddle_tmp.txt","w"); +fprintf(fd,"static int16_t twa432[107*2*4] = {"); +for i=1:2:(2*106) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +fprintf(fd,"static int16_t twb432[107*2*4] = {"); +for i=1:2:(2*106) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +fprintf(fd,"static int16_t twc432[107*2*4] = {"); +for i=1:2:(2*106) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); +fclose(fd); + */ + +static int16_t twa432[107*2*4] = {32763,-477,32763,-477,32763,-477,32763,-477, +32753,-954,32753,-954,32753,-954,32753,-954, +32735,-1430,32735,-1430,32735,-1430,32735,-1430, +32711,-1906,32711,-1906,32711,-1906,32711,-1906, +32680,-2381,32680,-2381,32680,-2381,32680,-2381, +32642,-2856,32642,-2856,32642,-2856,32642,-2856, +32597,-3331,32597,-3331,32597,-3331,32597,-3331, +32545,-3805,32545,-3805,32545,-3805,32545,-3805, +32486,-4277,32486,-4277,32486,-4277,32486,-4277, +32421,-4749,32421,-4749,32421,-4749,32421,-4749, +32348,-5221,32348,-5221,32348,-5221,32348,-5221, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32183,-6159,32183,-6159,32183,-6159,32183,-6159, +32090,-6627,32090,-6627,32090,-6627,32090,-6627, +31990,-7093,31990,-7093,31990,-7093,31990,-7093, +31883,-7557,31883,-7557,31883,-7557,31883,-7557, +31770,-8020,31770,-8020,31770,-8020,31770,-8020, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31523,-8941,31523,-8941,31523,-8941,31523,-8941, +31390,-9398,31390,-9398,31390,-9398,31390,-9398, +31250,-9854,31250,-9854,31250,-9854,31250,-9854, +31103,-10307,31103,-10307,31103,-10307,31103,-10307, +30950,-10758,30950,-10758,30950,-10758,30950,-10758, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30624,-11654,30624,-11654,30624,-11654,30624,-11654, +30451,-12098,30451,-12098,30451,-12098,30451,-12098, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +30087,-12979,30087,-12979,30087,-12979,30087,-12979, +29895,-13415,29895,-13415,29895,-13415,29895,-13415, +29696,-13848,29696,-13848,29696,-13848,29696,-13848, +29492,-14279,29492,-14279,29492,-14279,29492,-14279, +29281,-14706,29281,-14706,29281,-14706,29281,-14706, +29064,-15131,29064,-15131,29064,-15131,29064,-15131, +28841,-15552,28841,-15552,28841,-15552,28841,-15552, +28612,-15970,28612,-15970,28612,-15970,28612,-15970, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28135,-16795,28135,-16795,28135,-16795,28135,-16795, +27888,-17202,27888,-17202,27888,-17202,27888,-17202, +27635,-17606,27635,-17606,27635,-17606,27635,-17606, +27376,-18006,27376,-18006,27376,-18006,27376,-18006, +27111,-18403,27111,-18403,27111,-18403,27111,-18403, +26841,-18795,26841,-18795,26841,-18795,26841,-18795, +26564,-19183,26564,-19183,26564,-19183,26564,-19183, +26283,-19568,26283,-19568,26283,-19568,26283,-19568, +25995,-19948,25995,-19948,25995,-19948,25995,-19948, +25702,-20324,25702,-20324,25702,-20324,25702,-20324, +25404,-20695,25404,-20695,25404,-20695,25404,-20695, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24791,-21426,24791,-21426,24791,-21426,24791,-21426, +24477,-21784,24477,-21784,24477,-21784,24477,-21784, +24158,-22138,24158,-22138,24158,-22138,24158,-22138, +23833,-22487,23833,-22487,23833,-22487,23833,-22487, +23504,-22831,23504,-22831,23504,-22831,23504,-22831, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22830,-23505,22830,-23505,22830,-23505,22830,-23505, +22486,-23834,22486,-23834,22486,-23834,22486,-23834, +22137,-24159,22137,-24159,22137,-24159,22137,-24159, +21783,-24478,21783,-24478,21783,-24478,21783,-24478, +21425,-24792,21425,-24792,21425,-24792,21425,-24792, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20694,-25405,20694,-25405,20694,-25405,20694,-25405, +20323,-25703,20323,-25703,20323,-25703,20323,-25703, +19947,-25996,19947,-25996,19947,-25996,19947,-25996, +19567,-26284,19567,-26284,19567,-26284,19567,-26284, +19182,-26565,19182,-26565,19182,-26565,19182,-26565, +18794,-26842,18794,-26842,18794,-26842,18794,-26842, +18402,-27112,18402,-27112,18402,-27112,18402,-27112, +18005,-27377,18005,-27377,18005,-27377,18005,-27377, +17605,-27636,17605,-27636,17605,-27636,17605,-27636, +17201,-27889,17201,-27889,17201,-27889,17201,-27889, +16794,-28136,16794,-28136,16794,-28136,16794,-28136, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15969,-28613,15969,-28613,15969,-28613,15969,-28613, +15551,-28842,15551,-28842,15551,-28842,15551,-28842, +15130,-29065,15130,-29065,15130,-29065,15130,-29065, +14705,-29282,14705,-29282,14705,-29282,14705,-29282, +14278,-29493,14278,-29493,14278,-29493,14278,-29493, +13847,-29697,13847,-29697,13847,-29697,13847,-29697, +13414,-29896,13414,-29896,13414,-29896,13414,-29896, +12978,-30088,12978,-30088,12978,-30088,12978,-30088, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +12097,-30452,12097,-30452,12097,-30452,12097,-30452, +11653,-30625,11653,-30625,11653,-30625,11653,-30625, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +10757,-30951,10757,-30951,10757,-30951,10757,-30951, +10306,-31104,10306,-31104,10306,-31104,10306,-31104, +9853,-31251,9853,-31251,9853,-31251,9853,-31251, +9397,-31391,9397,-31391,9397,-31391,9397,-31391, +8940,-31524,8940,-31524,8940,-31524,8940,-31524, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +8019,-31771,8019,-31771,8019,-31771,8019,-31771, +7556,-31884,7556,-31884,7556,-31884,7556,-31884, +7092,-31991,7092,-31991,7092,-31991,7092,-31991, +6626,-32091,6626,-32091,6626,-32091,6626,-32091, +6158,-32184,6158,-32184,6158,-32184,6158,-32184, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5220,-32349,5220,-32349,5220,-32349,5220,-32349, +4748,-32422,4748,-32422,4748,-32422,4748,-32422, +4276,-32487,4276,-32487,4276,-32487,4276,-32487, +3804,-32546,3804,-32546,3804,-32546,3804,-32546, +3330,-32598,3330,-32598,3330,-32598,3330,-32598, +2855,-32643,2855,-32643,2855,-32643,2855,-32643, +2380,-32681,2380,-32681,2380,-32681,2380,-32681, +1905,-32712,1905,-32712,1905,-32712,1905,-32712, +1429,-32736,1429,-32736,1429,-32736,1429,-32736, +953,-32754,953,-32754,953,-32754,953,-32754, +476,-32764,476,-32764,476,-32764,476,-32764}; +static int16_t twb432[107*2*4] = {32753,-954,32753,-954,32753,-954,32753,-954, +32711,-1906,32711,-1906,32711,-1906,32711,-1906, +32642,-2856,32642,-2856,32642,-2856,32642,-2856, +32545,-3805,32545,-3805,32545,-3805,32545,-3805, +32421,-4749,32421,-4749,32421,-4749,32421,-4749, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32090,-6627,32090,-6627,32090,-6627,32090,-6627, +31883,-7557,31883,-7557,31883,-7557,31883,-7557, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31390,-9398,31390,-9398,31390,-9398,31390,-9398, +31103,-10307,31103,-10307,31103,-10307,31103,-10307, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30451,-12098,30451,-12098,30451,-12098,30451,-12098, +30087,-12979,30087,-12979,30087,-12979,30087,-12979, +29696,-13848,29696,-13848,29696,-13848,29696,-13848, +29281,-14706,29281,-14706,29281,-14706,29281,-14706, +28841,-15552,28841,-15552,28841,-15552,28841,-15552, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +27888,-17202,27888,-17202,27888,-17202,27888,-17202, +27376,-18006,27376,-18006,27376,-18006,27376,-18006, +26841,-18795,26841,-18795,26841,-18795,26841,-18795, +26283,-19568,26283,-19568,26283,-19568,26283,-19568, +25702,-20324,25702,-20324,25702,-20324,25702,-20324, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24477,-21784,24477,-21784,24477,-21784,24477,-21784, +23833,-22487,23833,-22487,23833,-22487,23833,-22487, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22486,-23834,22486,-23834,22486,-23834,22486,-23834, +21783,-24478,21783,-24478,21783,-24478,21783,-24478, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20323,-25703,20323,-25703,20323,-25703,20323,-25703, +19567,-26284,19567,-26284,19567,-26284,19567,-26284, +18794,-26842,18794,-26842,18794,-26842,18794,-26842, +18005,-27377,18005,-27377,18005,-27377,18005,-27377, +17201,-27889,17201,-27889,17201,-27889,17201,-27889, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15551,-28842,15551,-28842,15551,-28842,15551,-28842, +14705,-29282,14705,-29282,14705,-29282,14705,-29282, +13847,-29697,13847,-29697,13847,-29697,13847,-29697, +12978,-30088,12978,-30088,12978,-30088,12978,-30088, +12097,-30452,12097,-30452,12097,-30452,12097,-30452, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +10306,-31104,10306,-31104,10306,-31104,10306,-31104, +9397,-31391,9397,-31391,9397,-31391,9397,-31391, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +7556,-31884,7556,-31884,7556,-31884,7556,-31884, +6626,-32091,6626,-32091,6626,-32091,6626,-32091, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +4748,-32422,4748,-32422,4748,-32422,4748,-32422, +3804,-32546,3804,-32546,3804,-32546,3804,-32546, +2855,-32643,2855,-32643,2855,-32643,2855,-32643, +1905,-32712,1905,-32712,1905,-32712,1905,-32712, +953,-32754,953,-32754,953,-32754,953,-32754, +0,-32767,0,-32767,0,-32767,0,-32767, +-954,-32754,-954,-32754,-954,-32754,-954,-32754, +-1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, +-2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, +-3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, +-4749,-32422,-4749,-32422,-4749,-32422,-4749,-32422, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-6627,-32091,-6627,-32091,-6627,-32091,-6627,-32091, +-7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, +-8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, +-9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, +-10307,-31104,-10307,-31104,-10307,-31104,-10307,-31104, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-12098,-30452,-12098,-30452,-12098,-30452,-12098,-30452, +-12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, +-13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, +-14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, +-15552,-28842,-15552,-28842,-15552,-28842,-15552,-28842, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-17202,-27889,-17202,-27889,-17202,-27889,-17202,-27889, +-18006,-27377,-18006,-27377,-18006,-27377,-18006,-27377, +-18795,-26842,-18795,-26842,-18795,-26842,-18795,-26842, +-19568,-26284,-19568,-26284,-19568,-26284,-19568,-26284, +-20324,-25703,-20324,-25703,-20324,-25703,-20324,-25703, +-21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, +-21784,-24478,-21784,-24478,-21784,-24478,-21784,-24478, +-22487,-23834,-22487,-23834,-22487,-23834,-22487,-23834, +-23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, +-23834,-22487,-23834,-22487,-23834,-22487,-23834,-22487, +-24478,-21784,-24478,-21784,-24478,-21784,-24478,-21784, +-25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, +-25703,-20324,-25703,-20324,-25703,-20324,-25703,-20324, +-26284,-19568,-26284,-19568,-26284,-19568,-26284,-19568, +-26842,-18795,-26842,-18795,-26842,-18795,-26842,-18795, +-27377,-18006,-27377,-18006,-27377,-18006,-27377,-18006, +-27889,-17202,-27889,-17202,-27889,-17202,-27889,-17202, +-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, +-28842,-15552,-28842,-15552,-28842,-15552,-28842,-15552, +-29282,-14706,-29282,-14706,-29282,-14706,-29282,-14706, +-29697,-13848,-29697,-13848,-29697,-13848,-29697,-13848, +-30088,-12979,-30088,-12979,-30088,-12979,-30088,-12979, +-30452,-12098,-30452,-12098,-30452,-12098,-30452,-12098, +-30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, +-31104,-10307,-31104,-10307,-31104,-10307,-31104,-10307, +-31391,-9398,-31391,-9398,-31391,-9398,-31391,-9398, +-31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, +-31884,-7557,-31884,-7557,-31884,-7557,-31884,-7557, +-32091,-6627,-32091,-6627,-32091,-6627,-32091,-6627, +-32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, +-32422,-4749,-32422,-4749,-32422,-4749,-32422,-4749, +-32546,-3805,-32546,-3805,-32546,-3805,-32546,-3805, +-32643,-2856,-32643,-2856,-32643,-2856,-32643,-2856, +-32712,-1906,-32712,-1906,-32712,-1906,-32712,-1906, +-32754,-954,-32754,-954,-32754,-954,-32754,-954}; +static int16_t twc432[107*2*4] = {32735,-1430,32735,-1430,32735,-1430,32735,-1430, +32642,-2856,32642,-2856,32642,-2856,32642,-2856, +32486,-4277,32486,-4277,32486,-4277,32486,-4277, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +31990,-7093,31990,-7093,31990,-7093,31990,-7093, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31250,-9854,31250,-9854,31250,-9854,31250,-9854, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +29696,-13848,29696,-13848,29696,-13848,29696,-13848, +29064,-15131,29064,-15131,29064,-15131,29064,-15131, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +27635,-17606,27635,-17606,27635,-17606,27635,-17606, +26841,-18795,26841,-18795,26841,-18795,26841,-18795, +25995,-19948,25995,-19948,25995,-19948,25995,-19948, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24158,-22138,24158,-22138,24158,-22138,24158,-22138, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22137,-24159,22137,-24159,22137,-24159,22137,-24159, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +19947,-25996,19947,-25996,19947,-25996,19947,-25996, +18794,-26842,18794,-26842,18794,-26842,18794,-26842, +17605,-27636,17605,-27636,17605,-27636,17605,-27636, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15130,-29065,15130,-29065,15130,-29065,15130,-29065, +13847,-29697,13847,-29697,13847,-29697,13847,-29697, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +9853,-31251,9853,-31251,9853,-31251,9853,-31251, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +7092,-31991,7092,-31991,7092,-31991,7092,-31991, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +4276,-32487,4276,-32487,4276,-32487,4276,-32487, +2855,-32643,2855,-32643,2855,-32643,2855,-32643, +1429,-32736,1429,-32736,1429,-32736,1429,-32736, +0,-32767,0,-32767,0,-32767,0,-32767, +-1430,-32736,-1430,-32736,-1430,-32736,-1430,-32736, +-2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, +-4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-7093,-31991,-7093,-31991,-7093,-31991,-7093,-31991, +-8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, +-9854,-31251,-9854,-31251,-9854,-31251,-9854,-31251, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, +-13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, +-15131,-29065,-15131,-29065,-15131,-29065,-15131,-29065, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-17606,-27636,-17606,-27636,-17606,-27636,-17606,-27636, +-18795,-26842,-18795,-26842,-18795,-26842,-18795,-26842, +-19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, +-21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, +-22138,-24159,-22138,-24159,-22138,-24159,-22138,-24159, +-23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, +-24159,-22138,-24159,-22138,-24159,-22138,-24159,-22138, +-25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, +-25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, +-26842,-18795,-26842,-18795,-26842,-18795,-26842,-18795, +-27636,-17606,-27636,-17606,-27636,-17606,-27636,-17606, +-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, +-29065,-15131,-29065,-15131,-29065,-15131,-29065,-15131, +-29697,-13848,-29697,-13848,-29697,-13848,-29697,-13848, +-30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, +-30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, +-31251,-9854,-31251,-9854,-31251,-9854,-31251,-9854, +-31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, +-31991,-7093,-31991,-7093,-31991,-7093,-31991,-7093, +-32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, +-32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, +-32643,-2856,-32643,-2856,-32643,-2856,-32643,-2856, +-32736,-1430,-32736,-1430,-32736,-1430,-32736,-1430, +-32767,-1,-32767,-1,-32767,-1,-32767,-1, +-32736,1429,-32736,1429,-32736,1429,-32736,1429, +-32643,2855,-32643,2855,-32643,2855,-32643,2855, +-32487,4276,-32487,4276,-32487,4276,-32487,4276, +-32270,5689,-32270,5689,-32270,5689,-32270,5689, +-31991,7092,-31991,7092,-31991,7092,-31991,7092, +-31651,8480,-31651,8480,-31651,8480,-31651,8480, +-31251,9853,-31251,9853,-31251,9853,-31251,9853, +-30791,11206,-30791,11206,-30791,11206,-30791,11206, +-30273,12539,-30273,12539,-30273,12539,-30273,12539, +-29697,13847,-29697,13847,-29697,13847,-29697,13847, +-29065,15130,-29065,15130,-29065,15130,-29065,15130, +-28378,16383,-28378,16383,-28378,16383,-28378,16383, +-27636,17605,-27636,17605,-27636,17605,-27636,17605, +-26842,18794,-26842,18794,-26842,18794,-26842,18794, +-25996,19947,-25996,19947,-25996,19947,-25996,19947, +-25101,21062,-25101,21062,-25101,21062,-25101,21062, +-24159,22137,-24159,22137,-24159,22137,-24159,22137, +-23170,23169,-23170,23169,-23170,23169,-23170,23169, +-22138,24158,-22138,24158,-22138,24158,-22138,24158, +-21063,25100,-21063,25100,-21063,25100,-21063,25100, +-19948,25995,-19948,25995,-19948,25995,-19948,25995, +-18795,26841,-18795,26841,-18795,26841,-18795,26841, +-17606,27635,-17606,27635,-17606,27635,-17606,27635, +-16384,28377,-16384,28377,-16384,28377,-16384,28377, +-15131,29064,-15131,29064,-15131,29064,-15131,29064, +-13848,29696,-13848,29696,-13848,29696,-13848,29696, +-12540,30272,-12540,30272,-12540,30272,-12540,30272, +-11207,30790,-11207,30790,-11207,30790,-11207,30790, +-9854,31250,-9854,31250,-9854,31250,-9854,31250, +-8481,31650,-8481,31650,-8481,31650,-8481,31650, +-7093,31990,-7093,31990,-7093,31990,-7093,31990, +-5690,32269,-5690,32269,-5690,32269,-5690,32269, +-4277,32486,-4277,32486,-4277,32486,-4277,32486, +-2856,32642,-2856,32642,-2856,32642,-2856,32642, +-1430,32735,-1430,32735,-1430,32735,-1430,32735}; + + +void dft432(int16_t *x,int16_t *y,unsigned char scale_flag){ // 108 x 4 + int i,j; + __m128i *x128=(__m128i *)x; + __m128i *y128=(__m128i *)y; + __m128i *twa128=(__m128i *)&twa432[0]; + __m128i *twb128=(__m128i *)&twb432[0]; + __m128i *twc128=(__m128i *)&twc432[0]; + __m128i x2128[432];// = (__m128i *)&x2128array[0]; + __m128i ytmp128[432];//=&ytmp128array2[0]; + + + for (i=0,j=0;i<108;i++,j+=4) { + x2128[i] = x128[j]; + x2128[i+108] = x128[j+1]; + x2128[i+216] = x128[j+2]; + x2128[i+324] = x128[j+3]; + } + + dft108((int16_t *)x2128,(int16_t *)ytmp128,1); + dft108((int16_t *)(x2128+108),(int16_t *)(ytmp128+108),1); + dft108((int16_t *)(x2128+216),(int16_t *)(ytmp128+216),1); + dft108((int16_t *)(x2128+324),(int16_t *)(ytmp128+324),1); + + bfly4_tw1(ytmp128,ytmp128+108,ytmp128+216,ytmp128+324,y128,y128+108,y128+216,y128+324); + for (i=1,j=0;i<108;i++,j++) { + bfly4(ytmp128+i, + ytmp128+108+i, + ytmp128+216+i, + ytmp128+324+i, + y128+i, + y128+108+i, + y128+216+i, + y128+324+i, + twa128+j, + twb128+j, + twc128+j); + } + + if (scale_flag==1) { + norm128 = _mm_set1_epi16(16384);//dft_norm_table[13]); + + for (i=0;i<432;i++) { + y128[i] = _mm_slli_epi16(_mm_mulhi_epi16(y128[i],norm128),1); + } + } + + _mm_empty(); + _m_empty(); + +}; +/* +Twiddles generated with + +twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:119)/480)); +twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:119)/480)); +twc = floor(32767*exp(-sqrt(-1)*2*pi*3*(1:119)/480)); +twa2 = zeros(1,2*119); +twb2 = zeros(1,2*119); +twc2 = zeros(1,2*119); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +twb2(1:2:end) = real(twb); +twb2(2:2:end) = imag(twb); +twc2(1:2:end) = real(twc); +twc2(2:2:end) = imag(twc); +fd=fopen("twiddle_tmp.txt","w"); +fprintf(fd,"static int16_t twa480[119*2*4] = {"); +for i=1:2:(2*118) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +fprintf(fd,"static int16_t twb480[119*2*4] = {"); +for i=1:2:(2*118) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +fprintf(fd,"static int16_t twc480[119*2*4] = {"); +for i=1:2:(2*118) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); +fclose(fd); +*/ +static int16_t twa480[119*2*4] = {32764,-429,32764,-429,32764,-429,32764,-429, +32755,-858,32755,-858,32755,-858,32755,-858, +32741,-1287,32741,-1287,32741,-1287,32741,-1287, +32722,-1715,32722,-1715,32722,-1715,32722,-1715, +32696,-2144,32696,-2144,32696,-2144,32696,-2144, +32665,-2571,32665,-2571,32665,-2571,32665,-2571, +32629,-2999,32629,-2999,32629,-2999,32629,-2999, +32587,-3426,32587,-3426,32587,-3426,32587,-3426, +32539,-3852,32539,-3852,32539,-3852,32539,-3852, +32486,-4277,32486,-4277,32486,-4277,32486,-4277, +32427,-4702,32427,-4702,32427,-4702,32427,-4702, +32363,-5126,32363,-5126,32363,-5126,32363,-5126, +32293,-5550,32293,-5550,32293,-5550,32293,-5550, +32218,-5972,32218,-5972,32218,-5972,32218,-5972, +32137,-6393,32137,-6393,32137,-6393,32137,-6393, +32050,-6813,32050,-6813,32050,-6813,32050,-6813, +31959,-7232,31959,-7232,31959,-7232,31959,-7232, +31861,-7650,31861,-7650,31861,-7650,31861,-7650, +31758,-8066,31758,-8066,31758,-8066,31758,-8066, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31536,-8895,31536,-8895,31536,-8895,31536,-8895, +31417,-9307,31417,-9307,31417,-9307,31417,-9307, +31293,-9717,31293,-9717,31293,-9717,31293,-9717, +31163,-10126,31163,-10126,31163,-10126,31163,-10126, +31028,-10533,31028,-10533,31028,-10533,31028,-10533, +30887,-10938,30887,-10938,30887,-10938,30887,-10938, +30741,-11342,30741,-11342,30741,-11342,30741,-11342, +30590,-11743,30590,-11743,30590,-11743,30590,-11743, +30434,-12143,30434,-12143,30434,-12143,30434,-12143, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +30106,-12935,30106,-12935,30106,-12935,30106,-12935, +29934,-13328,29934,-13328,29934,-13328,29934,-13328, +29757,-13719,29757,-13719,29757,-13719,29757,-13719, +29575,-14107,29575,-14107,29575,-14107,29575,-14107, +29387,-14493,29387,-14493,29387,-14493,29387,-14493, +29195,-14876,29195,-14876,29195,-14876,29195,-14876, +28998,-15257,28998,-15257,28998,-15257,28998,-15257, +28796,-15636,28796,-15636,28796,-15636,28796,-15636, +28589,-16011,28589,-16011,28589,-16011,28589,-16011, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28160,-16754,28160,-16754,28160,-16754,28160,-16754, +27938,-17121,27938,-17121,27938,-17121,27938,-17121, +27711,-17485,27711,-17485,27711,-17485,27711,-17485, +27480,-17847,27480,-17847,27480,-17847,27480,-17847, +27244,-18205,27244,-18205,27244,-18205,27244,-18205, +27004,-18560,27004,-18560,27004,-18560,27004,-18560, +26758,-18912,26758,-18912,26758,-18912,26758,-18912, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +26254,-19606,26254,-19606,26254,-19606,26254,-19606, +25995,-19948,25995,-19948,25995,-19948,25995,-19948, +25732,-20286,25732,-20286,25732,-20286,25732,-20286, +25464,-20621,25464,-20621,25464,-20621,25464,-20621, +25192,-20953,25192,-20953,25192,-20953,25192,-20953, +24916,-21281,24916,-21281,24916,-21281,24916,-21281, +24635,-21605,24635,-21605,24635,-21605,24635,-21605, +24350,-21926,24350,-21926,24350,-21926,24350,-21926, +24061,-22243,24061,-22243,24061,-22243,24061,-22243, +23768,-22556,23768,-22556,23768,-22556,23768,-22556, +23471,-22865,23471,-22865,23471,-22865,23471,-22865, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22864,-23472,22864,-23472,22864,-23472,22864,-23472, +22555,-23769,22555,-23769,22555,-23769,22555,-23769, +22242,-24062,22242,-24062,22242,-24062,22242,-24062, +21925,-24351,21925,-24351,21925,-24351,21925,-24351, +21604,-24636,21604,-24636,21604,-24636,21604,-24636, +21280,-24917,21280,-24917,21280,-24917,21280,-24917, +20952,-25193,20952,-25193,20952,-25193,20952,-25193, +20620,-25465,20620,-25465,20620,-25465,20620,-25465, +20285,-25733,20285,-25733,20285,-25733,20285,-25733, +19947,-25996,19947,-25996,19947,-25996,19947,-25996, +19605,-26255,19605,-26255,19605,-26255,19605,-26255, +19259,-26510,19259,-26510,19259,-26510,19259,-26510, +18911,-26759,18911,-26759,18911,-26759,18911,-26759, +18559,-27005,18559,-27005,18559,-27005,18559,-27005, +18204,-27245,18204,-27245,18204,-27245,18204,-27245, +17846,-27481,17846,-27481,17846,-27481,17846,-27481, +17484,-27712,17484,-27712,17484,-27712,17484,-27712, +17120,-27939,17120,-27939,17120,-27939,17120,-27939, +16753,-28161,16753,-28161,16753,-28161,16753,-28161, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +16010,-28590,16010,-28590,16010,-28590,16010,-28590, +15635,-28797,15635,-28797,15635,-28797,15635,-28797, +15256,-28999,15256,-28999,15256,-28999,15256,-28999, +14875,-29196,14875,-29196,14875,-29196,14875,-29196, +14492,-29388,14492,-29388,14492,-29388,14492,-29388, +14106,-29576,14106,-29576,14106,-29576,14106,-29576, +13718,-29758,13718,-29758,13718,-29758,13718,-29758, +13327,-29935,13327,-29935,13327,-29935,13327,-29935, +12934,-30107,12934,-30107,12934,-30107,12934,-30107, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +12142,-30435,12142,-30435,12142,-30435,12142,-30435, +11742,-30591,11742,-30591,11742,-30591,11742,-30591, +11341,-30742,11341,-30742,11341,-30742,11341,-30742, +10937,-30888,10937,-30888,10937,-30888,10937,-30888, +10532,-31029,10532,-31029,10532,-31029,10532,-31029, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +9716,-31294,9716,-31294,9716,-31294,9716,-31294, +9306,-31418,9306,-31418,9306,-31418,9306,-31418, +8894,-31537,8894,-31537,8894,-31537,8894,-31537, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +8065,-31759,8065,-31759,8065,-31759,8065,-31759, +7649,-31862,7649,-31862,7649,-31862,7649,-31862, +7231,-31960,7231,-31960,7231,-31960,7231,-31960, +6812,-32051,6812,-32051,6812,-32051,6812,-32051, +6392,-32138,6392,-32138,6392,-32138,6392,-32138, +5971,-32219,5971,-32219,5971,-32219,5971,-32219, +5549,-32294,5549,-32294,5549,-32294,5549,-32294, +5125,-32364,5125,-32364,5125,-32364,5125,-32364, +4701,-32428,4701,-32428,4701,-32428,4701,-32428, +4276,-32487,4276,-32487,4276,-32487,4276,-32487, +3851,-32540,3851,-32540,3851,-32540,3851,-32540, +3425,-32588,3425,-32588,3425,-32588,3425,-32588, +2998,-32630,2998,-32630,2998,-32630,2998,-32630, +2570,-32666,2570,-32666,2570,-32666,2570,-32666, +2143,-32697,2143,-32697,2143,-32697,2143,-32697, +1714,-32723,1714,-32723,1714,-32723,1714,-32723, +1286,-32742,1286,-32742,1286,-32742,1286,-32742, +857,-32756,857,-32756,857,-32756,857,-32756, +428,-32765,428,-32765,428,-32765,428,-32765}; +static int16_t twb480[119*2*4] = {32755,-858,32755,-858,32755,-858,32755,-858, +32722,-1715,32722,-1715,32722,-1715,32722,-1715, +32665,-2571,32665,-2571,32665,-2571,32665,-2571, +32587,-3426,32587,-3426,32587,-3426,32587,-3426, +32486,-4277,32486,-4277,32486,-4277,32486,-4277, +32363,-5126,32363,-5126,32363,-5126,32363,-5126, +32218,-5972,32218,-5972,32218,-5972,32218,-5972, +32050,-6813,32050,-6813,32050,-6813,32050,-6813, +31861,-7650,31861,-7650,31861,-7650,31861,-7650, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31417,-9307,31417,-9307,31417,-9307,31417,-9307, +31163,-10126,31163,-10126,31163,-10126,31163,-10126, +30887,-10938,30887,-10938,30887,-10938,30887,-10938, +30590,-11743,30590,-11743,30590,-11743,30590,-11743, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +29934,-13328,29934,-13328,29934,-13328,29934,-13328, +29575,-14107,29575,-14107,29575,-14107,29575,-14107, +29195,-14876,29195,-14876,29195,-14876,29195,-14876, +28796,-15636,28796,-15636,28796,-15636,28796,-15636, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +27938,-17121,27938,-17121,27938,-17121,27938,-17121, +27480,-17847,27480,-17847,27480,-17847,27480,-17847, +27004,-18560,27004,-18560,27004,-18560,27004,-18560, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +25995,-19948,25995,-19948,25995,-19948,25995,-19948, +25464,-20621,25464,-20621,25464,-20621,25464,-20621, +24916,-21281,24916,-21281,24916,-21281,24916,-21281, +24350,-21926,24350,-21926,24350,-21926,24350,-21926, +23768,-22556,23768,-22556,23768,-22556,23768,-22556, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22555,-23769,22555,-23769,22555,-23769,22555,-23769, +21925,-24351,21925,-24351,21925,-24351,21925,-24351, +21280,-24917,21280,-24917,21280,-24917,21280,-24917, +20620,-25465,20620,-25465,20620,-25465,20620,-25465, +19947,-25996,19947,-25996,19947,-25996,19947,-25996, +19259,-26510,19259,-26510,19259,-26510,19259,-26510, +18559,-27005,18559,-27005,18559,-27005,18559,-27005, +17846,-27481,17846,-27481,17846,-27481,17846,-27481, +17120,-27939,17120,-27939,17120,-27939,17120,-27939, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15635,-28797,15635,-28797,15635,-28797,15635,-28797, +14875,-29196,14875,-29196,14875,-29196,14875,-29196, +14106,-29576,14106,-29576,14106,-29576,14106,-29576, +13327,-29935,13327,-29935,13327,-29935,13327,-29935, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +11742,-30591,11742,-30591,11742,-30591,11742,-30591, +10937,-30888,10937,-30888,10937,-30888,10937,-30888, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +9306,-31418,9306,-31418,9306,-31418,9306,-31418, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +7649,-31862,7649,-31862,7649,-31862,7649,-31862, +6812,-32051,6812,-32051,6812,-32051,6812,-32051, +5971,-32219,5971,-32219,5971,-32219,5971,-32219, +5125,-32364,5125,-32364,5125,-32364,5125,-32364, +4276,-32487,4276,-32487,4276,-32487,4276,-32487, +3425,-32588,3425,-32588,3425,-32588,3425,-32588, +2570,-32666,2570,-32666,2570,-32666,2570,-32666, +1714,-32723,1714,-32723,1714,-32723,1714,-32723, +857,-32756,857,-32756,857,-32756,857,-32756, +0,-32767,0,-32767,0,-32767,0,-32767, +-858,-32756,-858,-32756,-858,-32756,-858,-32756, +-1715,-32723,-1715,-32723,-1715,-32723,-1715,-32723, +-2571,-32666,-2571,-32666,-2571,-32666,-2571,-32666, +-3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, +-4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, +-5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, +-5972,-32219,-5972,-32219,-5972,-32219,-5972,-32219, +-6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, +-7650,-31862,-7650,-31862,-7650,-31862,-7650,-31862, +-8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, +-9307,-31418,-9307,-31418,-9307,-31418,-9307,-31418, +-10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, +-10938,-30888,-10938,-30888,-10938,-30888,-10938,-30888, +-11743,-30591,-11743,-30591,-11743,-30591,-11743,-30591, +-12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, +-13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, +-14107,-29576,-14107,-29576,-14107,-29576,-14107,-29576, +-14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, +-15636,-28797,-15636,-28797,-15636,-28797,-15636,-28797, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-17121,-27939,-17121,-27939,-17121,-27939,-17121,-27939, +-17847,-27481,-17847,-27481,-17847,-27481,-17847,-27481, +-18560,-27005,-18560,-27005,-18560,-27005,-18560,-27005, +-19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, +-19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, +-20621,-25465,-20621,-25465,-20621,-25465,-20621,-25465, +-21281,-24917,-21281,-24917,-21281,-24917,-21281,-24917, +-21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, +-22556,-23769,-22556,-23769,-22556,-23769,-22556,-23769, +-23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, +-23769,-22556,-23769,-22556,-23769,-22556,-23769,-22556, +-24351,-21926,-24351,-21926,-24351,-21926,-24351,-21926, +-24917,-21281,-24917,-21281,-24917,-21281,-24917,-21281, +-25465,-20621,-25465,-20621,-25465,-20621,-25465,-20621, +-25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, +-26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, +-27005,-18560,-27005,-18560,-27005,-18560,-27005,-18560, +-27481,-17847,-27481,-17847,-27481,-17847,-27481,-17847, +-27939,-17121,-27939,-17121,-27939,-17121,-27939,-17121, +-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, +-28797,-15636,-28797,-15636,-28797,-15636,-28797,-15636, +-29196,-14876,-29196,-14876,-29196,-14876,-29196,-14876, +-29576,-14107,-29576,-14107,-29576,-14107,-29576,-14107, +-29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, +-30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, +-30591,-11743,-30591,-11743,-30591,-11743,-30591,-11743, +-30888,-10938,-30888,-10938,-30888,-10938,-30888,-10938, +-31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, +-31418,-9307,-31418,-9307,-31418,-9307,-31418,-9307, +-31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, +-31862,-7650,-31862,-7650,-31862,-7650,-31862,-7650, +-32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, +-32219,-5972,-32219,-5972,-32219,-5972,-32219,-5972, +-32364,-5126,-32364,-5126,-32364,-5126,-32364,-5126, +-32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, +-32588,-3426,-32588,-3426,-32588,-3426,-32588,-3426, +-32666,-2571,-32666,-2571,-32666,-2571,-32666,-2571, +-32723,-1715,-32723,-1715,-32723,-1715,-32723,-1715, +-32756,-858,-32756,-858,-32756,-858,-32756,-858}; +static int16_t twc480[119*2*4] = {32741,-1287,32741,-1287,32741,-1287,32741,-1287, +32665,-2571,32665,-2571,32665,-2571,32665,-2571, +32539,-3852,32539,-3852,32539,-3852,32539,-3852, +32363,-5126,32363,-5126,32363,-5126,32363,-5126, +32137,-6393,32137,-6393,32137,-6393,32137,-6393, +31861,-7650,31861,-7650,31861,-7650,31861,-7650, +31536,-8895,31536,-8895,31536,-8895,31536,-8895, +31163,-10126,31163,-10126,31163,-10126,31163,-10126, +30741,-11342,30741,-11342,30741,-11342,30741,-11342, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +29757,-13719,29757,-13719,29757,-13719,29757,-13719, +29195,-14876,29195,-14876,29195,-14876,29195,-14876, +28589,-16011,28589,-16011,28589,-16011,28589,-16011, +27938,-17121,27938,-17121,27938,-17121,27938,-17121, +27244,-18205,27244,-18205,27244,-18205,27244,-18205, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +25732,-20286,25732,-20286,25732,-20286,25732,-20286, +24916,-21281,24916,-21281,24916,-21281,24916,-21281, +24061,-22243,24061,-22243,24061,-22243,24061,-22243, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22242,-24062,22242,-24062,22242,-24062,22242,-24062, +21280,-24917,21280,-24917,21280,-24917,21280,-24917, +20285,-25733,20285,-25733,20285,-25733,20285,-25733, +19259,-26510,19259,-26510,19259,-26510,19259,-26510, +18204,-27245,18204,-27245,18204,-27245,18204,-27245, +17120,-27939,17120,-27939,17120,-27939,17120,-27939, +16010,-28590,16010,-28590,16010,-28590,16010,-28590, +14875,-29196,14875,-29196,14875,-29196,14875,-29196, +13718,-29758,13718,-29758,13718,-29758,13718,-29758, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +11341,-30742,11341,-30742,11341,-30742,11341,-30742, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +8894,-31537,8894,-31537,8894,-31537,8894,-31537, +7649,-31862,7649,-31862,7649,-31862,7649,-31862, +6392,-32138,6392,-32138,6392,-32138,6392,-32138, +5125,-32364,5125,-32364,5125,-32364,5125,-32364, +3851,-32540,3851,-32540,3851,-32540,3851,-32540, +2570,-32666,2570,-32666,2570,-32666,2570,-32666, +1286,-32742,1286,-32742,1286,-32742,1286,-32742, +0,-32767,0,-32767,0,-32767,0,-32767, +-1287,-32742,-1287,-32742,-1287,-32742,-1287,-32742, +-2571,-32666,-2571,-32666,-2571,-32666,-2571,-32666, +-3852,-32540,-3852,-32540,-3852,-32540,-3852,-32540, +-5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, +-6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, +-7650,-31862,-7650,-31862,-7650,-31862,-7650,-31862, +-8895,-31537,-8895,-31537,-8895,-31537,-8895,-31537, +-10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, +-11342,-30742,-11342,-30742,-11342,-30742,-11342,-30742, +-12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, +-13719,-29758,-13719,-29758,-13719,-29758,-13719,-29758, +-14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, +-16011,-28590,-16011,-28590,-16011,-28590,-16011,-28590, +-17121,-27939,-17121,-27939,-17121,-27939,-17121,-27939, +-18205,-27245,-18205,-27245,-18205,-27245,-18205,-27245, +-19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, +-20286,-25733,-20286,-25733,-20286,-25733,-20286,-25733, +-21281,-24917,-21281,-24917,-21281,-24917,-21281,-24917, +-22243,-24062,-22243,-24062,-22243,-24062,-22243,-24062, +-23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, +-24062,-22243,-24062,-22243,-24062,-22243,-24062,-22243, +-24917,-21281,-24917,-21281,-24917,-21281,-24917,-21281, +-25733,-20286,-25733,-20286,-25733,-20286,-25733,-20286, +-26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, +-27245,-18205,-27245,-18205,-27245,-18205,-27245,-18205, +-27939,-17121,-27939,-17121,-27939,-17121,-27939,-17121, +-28590,-16011,-28590,-16011,-28590,-16011,-28590,-16011, +-29196,-14876,-29196,-14876,-29196,-14876,-29196,-14876, +-29758,-13719,-29758,-13719,-29758,-13719,-29758,-13719, +-30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, +-30742,-11342,-30742,-11342,-30742,-11342,-30742,-11342, +-31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, +-31537,-8895,-31537,-8895,-31537,-8895,-31537,-8895, +-31862,-7650,-31862,-7650,-31862,-7650,-31862,-7650, +-32138,-6393,-32138,-6393,-32138,-6393,-32138,-6393, +-32364,-5126,-32364,-5126,-32364,-5126,-32364,-5126, +-32540,-3852,-32540,-3852,-32540,-3852,-32540,-3852, +-32666,-2571,-32666,-2571,-32666,-2571,-32666,-2571, +-32742,-1287,-32742,-1287,-32742,-1287,-32742,-1287, +-32767,-1,-32767,-1,-32767,-1,-32767,-1, +-32742,1286,-32742,1286,-32742,1286,-32742,1286, +-32666,2570,-32666,2570,-32666,2570,-32666,2570, +-32540,3851,-32540,3851,-32540,3851,-32540,3851, +-32364,5125,-32364,5125,-32364,5125,-32364,5125, +-32138,6392,-32138,6392,-32138,6392,-32138,6392, +-31862,7649,-31862,7649,-31862,7649,-31862,7649, +-31537,8894,-31537,8894,-31537,8894,-31537,8894, +-31164,10125,-31164,10125,-31164,10125,-31164,10125, +-30742,11341,-30742,11341,-30742,11341,-30742,11341, +-30273,12539,-30273,12539,-30273,12539,-30273,12539, +-29758,13718,-29758,13718,-29758,13718,-29758,13718, +-29196,14875,-29196,14875,-29196,14875,-29196,14875, +-28590,16010,-28590,16010,-28590,16010,-28590,16010, +-27939,17120,-27939,17120,-27939,17120,-27939,17120, +-27245,18204,-27245,18204,-27245,18204,-27245,18204, +-26510,19259,-26510,19259,-26510,19259,-26510,19259, +-25733,20285,-25733,20285,-25733,20285,-25733,20285, +-24917,21280,-24917,21280,-24917,21280,-24917,21280, +-24062,22242,-24062,22242,-24062,22242,-24062,22242, +-23170,23169,-23170,23169,-23170,23169,-23170,23169, +-22243,24061,-22243,24061,-22243,24061,-22243,24061, +-21281,24916,-21281,24916,-21281,24916,-21281,24916, +-20286,25732,-20286,25732,-20286,25732,-20286,25732, +-19260,26509,-19260,26509,-19260,26509,-19260,26509, +-18205,27244,-18205,27244,-18205,27244,-18205,27244, +-17121,27938,-17121,27938,-17121,27938,-17121,27938, +-16011,28589,-16011,28589,-16011,28589,-16011,28589, +-14876,29195,-14876,29195,-14876,29195,-14876,29195, +-13719,29757,-13719,29757,-13719,29757,-13719,29757, +-12540,30272,-12540,30272,-12540,30272,-12540,30272, +-11342,30741,-11342,30741,-11342,30741,-11342,30741, +-10126,31163,-10126,31163,-10126,31163,-10126,31163, +-8895,31536,-8895,31536,-8895,31536,-8895,31536, +-7650,31861,-7650,31861,-7650,31861,-7650,31861, +-6393,32137,-6393,32137,-6393,32137,-6393,32137, +-5126,32363,-5126,32363,-5126,32363,-5126,32363, +-3852,32539,-3852,32539,-3852,32539,-3852,32539, +-2571,32665,-2571,32665,-2571,32665,-2571,32665, +-1287,32741,-1287,32741,-1287,32741,-1287,32741}; + +void dft480(int16_t *x,int16_t *y,unsigned char scale_flag){ // 120 x 4 + int i,j; + __m128i *x128=(__m128i *)x; + __m128i *y128=(__m128i *)y; + __m128i *twa128=(__m128i *)&twa480[0]; + __m128i *twb128=(__m128i *)&twb480[0]; + __m128i *twc128=(__m128i *)&twc480[0]; + __m128i x2128[480];// = (__m128i *)&x2128array[0]; + __m128i ytmp128[480];//=&ytmp128array2[0]; + + + + for (i=0,j=0;i<240;i++,j+=4) { + x2128[i] = x128[j]; + x2128[i+240] = x128[j+1]; + x2128[i+480] = x128[j+2]; + x2128[i+720] = x128[j+3]; + } + + dft120((int16_t *)x2128,(int16_t *)ytmp128,1); + dft120((int16_t *)(x2128+120),(int16_t *)(ytmp128+120),1); + dft120((int16_t *)(x2128+240),(int16_t *)(ytmp128+240),1); + dft120((int16_t *)(x2128+360),(int16_t *)(ytmp128+360),1); + + bfly4_tw1(ytmp128,ytmp128+120,ytmp128+240,ytmp128+360,y128,y128+120,y128+240,y128+360); + for (i=1,j=0;i<120;i++,j++) { + bfly4(ytmp128+i, + ytmp128+120+i, + ytmp128+240+i, + ytmp128+360+i, + y128+i, + y128+120+i, + y128+240+i, + y128+360+i, + twa128+j, + twb128+j, + twc128+j); + } + + if (scale_flag==1) { + norm128 = _mm_set1_epi16(16384);//dft_norm_table[13]); + + for (i=0;i<480;i++) { + y128[i] = _mm_slli_epi16(_mm_mulhi_epi16(y128[i],norm128),1); + } + } + + _mm_empty(); + _m_empty(); + +}; + +/* +Twiddles generated with + +twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:179)/540)); +twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:179)/540)); +twa2 = zeros(1,2*179); +twb2 = zeros(1,2*179); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +twb2(1:2:end) = real(twb); +twb2(2:2:end) = imag(twb); +fd=fopen("twiddle_tmp.txt","w"); +fprintf(fd,"static int16_t twa540[179*2*4] = {"); +for i=1:2:(2*178) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +fprintf(fd,"static int16_t twb540[179*2*4] = {"); +for i=1:2:(2*178) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +fclose(fd); +*/ +static int16_t twa540[179*2*4] = {32764,-382,32764,-382,32764,-382,32764,-382, +32758,-763,32758,-763,32758,-763,32758,-763, +32747,-1144,32747,-1144,32747,-1144,32747,-1144, +32731,-1525,32731,-1525,32731,-1525,32731,-1525, +32711,-1906,32711,-1906,32711,-1906,32711,-1906, +32687,-2286,32687,-2286,32687,-2286,32687,-2286, +32658,-2666,32658,-2666,32658,-2666,32658,-2666, +32625,-3046,32625,-3046,32625,-3046,32625,-3046, +32587,-3426,32587,-3426,32587,-3426,32587,-3426, +32545,-3805,32545,-3805,32545,-3805,32545,-3805, +32498,-4183,32498,-4183,32498,-4183,32498,-4183, +32448,-4561,32448,-4561,32448,-4561,32448,-4561, +32392,-4938,32392,-4938,32392,-4938,32392,-4938, +32333,-5315,32333,-5315,32333,-5315,32333,-5315, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32200,-6066,32200,-6066,32200,-6066,32200,-6066, +32128,-6440,32128,-6440,32128,-6440,32128,-6440, +32050,-6813,32050,-6813,32050,-6813,32050,-6813, +31969,-7186,31969,-7186,31969,-7186,31969,-7186, +31883,-7557,31883,-7557,31883,-7557,31883,-7557, +31793,-7928,31793,-7928,31793,-7928,31793,-7928, +31699,-8297,31699,-8297,31699,-8297,31699,-8297, +31600,-8665,31600,-8665,31600,-8665,31600,-8665, +31497,-9032,31497,-9032,31497,-9032,31497,-9032, +31390,-9398,31390,-9398,31390,-9398,31390,-9398, +31278,-9763,31278,-9763,31278,-9763,31278,-9763, +31163,-10126,31163,-10126,31163,-10126,31163,-10126, +31043,-10488,31043,-10488,31043,-10488,31043,-10488, +30919,-10848,30919,-10848,30919,-10848,30919,-10848, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30658,-11565,30658,-11565,30658,-11565,30658,-11565, +30521,-11921,30521,-11921,30521,-11921,30521,-11921, +30381,-12275,30381,-12275,30381,-12275,30381,-12275, +30236,-12628,30236,-12628,30236,-12628,30236,-12628, +30087,-12979,30087,-12979,30087,-12979,30087,-12979, +29934,-13328,29934,-13328,29934,-13328,29934,-13328, +29777,-13675,29777,-13675,29777,-13675,29777,-13675, +29615,-14021,29615,-14021,29615,-14021,29615,-14021, +29450,-14365,29450,-14365,29450,-14365,29450,-14365, +29281,-14706,29281,-14706,29281,-14706,29281,-14706, +29108,-15046,29108,-15046,29108,-15046,29108,-15046, +28931,-15384,28931,-15384,28931,-15384,28931,-15384, +28750,-15719,28750,-15719,28750,-15719,28750,-15719, +28565,-16053,28565,-16053,28565,-16053,28565,-16053, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28184,-16713,28184,-16713,28184,-16713,28184,-16713, +27988,-17040,27988,-17040,27988,-17040,27988,-17040, +27787,-17364,27787,-17364,27787,-17364,27787,-17364, +27584,-17687,27584,-17687,27584,-17687,27584,-17687, +27376,-18006,27376,-18006,27376,-18006,27376,-18006, +27165,-18324,27165,-18324,27165,-18324,27165,-18324, +26950,-18638,26950,-18638,26950,-18638,26950,-18638, +26731,-18951,26731,-18951,26731,-18951,26731,-18951, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +26283,-19568,26283,-19568,26283,-19568,26283,-19568, +26053,-19872,26053,-19872,26053,-19872,26053,-19872, +25820,-20174,25820,-20174,25820,-20174,25820,-20174, +25584,-20473,25584,-20473,25584,-20473,25584,-20473, +25344,-20769,25344,-20769,25344,-20769,25344,-20769, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24854,-21353,24854,-21353,24854,-21353,24854,-21353, +24604,-21641,24604,-21641,24604,-21641,24604,-21641, +24350,-21926,24350,-21926,24350,-21926,24350,-21926, +24093,-22208,24093,-22208,24093,-22208,24093,-22208, +23833,-22487,23833,-22487,23833,-22487,23833,-22487, +23570,-22762,23570,-22762,23570,-22762,23570,-22762, +23304,-23035,23304,-23035,23304,-23035,23304,-23035, +23034,-23305,23034,-23305,23034,-23305,23034,-23305, +22761,-23571,22761,-23571,22761,-23571,22761,-23571, +22486,-23834,22486,-23834,22486,-23834,22486,-23834, +22207,-24094,22207,-24094,22207,-24094,22207,-24094, +21925,-24351,21925,-24351,21925,-24351,21925,-24351, +21640,-24605,21640,-24605,21640,-24605,21640,-24605, +21352,-24855,21352,-24855,21352,-24855,21352,-24855, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20768,-25345,20768,-25345,20768,-25345,20768,-25345, +20472,-25585,20472,-25585,20472,-25585,20472,-25585, +20173,-25821,20173,-25821,20173,-25821,20173,-25821, +19871,-26054,19871,-26054,19871,-26054,19871,-26054, +19567,-26284,19567,-26284,19567,-26284,19567,-26284, +19259,-26510,19259,-26510,19259,-26510,19259,-26510, +18950,-26732,18950,-26732,18950,-26732,18950,-26732, +18637,-26951,18637,-26951,18637,-26951,18637,-26951, +18323,-27166,18323,-27166,18323,-27166,18323,-27166, +18005,-27377,18005,-27377,18005,-27377,18005,-27377, +17686,-27585,17686,-27585,17686,-27585,17686,-27585, +17363,-27788,17363,-27788,17363,-27788,17363,-27788, +17039,-27989,17039,-27989,17039,-27989,17039,-27989, +16712,-28185,16712,-28185,16712,-28185,16712,-28185, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +16052,-28566,16052,-28566,16052,-28566,16052,-28566, +15718,-28751,15718,-28751,15718,-28751,15718,-28751, +15383,-28932,15383,-28932,15383,-28932,15383,-28932, +15045,-29109,15045,-29109,15045,-29109,15045,-29109, +14705,-29282,14705,-29282,14705,-29282,14705,-29282, +14364,-29451,14364,-29451,14364,-29451,14364,-29451, +14020,-29616,14020,-29616,14020,-29616,14020,-29616, +13674,-29778,13674,-29778,13674,-29778,13674,-29778, +13327,-29935,13327,-29935,13327,-29935,13327,-29935, +12978,-30088,12978,-30088,12978,-30088,12978,-30088, +12627,-30237,12627,-30237,12627,-30237,12627,-30237, +12274,-30382,12274,-30382,12274,-30382,12274,-30382, +11920,-30522,11920,-30522,11920,-30522,11920,-30522, +11564,-30659,11564,-30659,11564,-30659,11564,-30659, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +10847,-30920,10847,-30920,10847,-30920,10847,-30920, +10487,-31044,10487,-31044,10487,-31044,10487,-31044, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +9762,-31279,9762,-31279,9762,-31279,9762,-31279, +9397,-31391,9397,-31391,9397,-31391,9397,-31391, +9031,-31498,9031,-31498,9031,-31498,9031,-31498, +8664,-31601,8664,-31601,8664,-31601,8664,-31601, +8296,-31700,8296,-31700,8296,-31700,8296,-31700, +7927,-31794,7927,-31794,7927,-31794,7927,-31794, +7556,-31884,7556,-31884,7556,-31884,7556,-31884, +7185,-31970,7185,-31970,7185,-31970,7185,-31970, +6812,-32051,6812,-32051,6812,-32051,6812,-32051, +6439,-32129,6439,-32129,6439,-32129,6439,-32129, +6065,-32201,6065,-32201,6065,-32201,6065,-32201, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5314,-32334,5314,-32334,5314,-32334,5314,-32334, +4937,-32393,4937,-32393,4937,-32393,4937,-32393, +4560,-32449,4560,-32449,4560,-32449,4560,-32449, +4182,-32499,4182,-32499,4182,-32499,4182,-32499, +3804,-32546,3804,-32546,3804,-32546,3804,-32546, +3425,-32588,3425,-32588,3425,-32588,3425,-32588, +3045,-32626,3045,-32626,3045,-32626,3045,-32626, +2665,-32659,2665,-32659,2665,-32659,2665,-32659, +2285,-32688,2285,-32688,2285,-32688,2285,-32688, +1905,-32712,1905,-32712,1905,-32712,1905,-32712, +1524,-32732,1524,-32732,1524,-32732,1524,-32732, +1143,-32748,1143,-32748,1143,-32748,1143,-32748, +762,-32759,762,-32759,762,-32759,762,-32759, +381,-32765,381,-32765,381,-32765,381,-32765, +0,-32767,0,-32767,0,-32767,0,-32767, +-382,-32765,-382,-32765,-382,-32765,-382,-32765, +-763,-32759,-763,-32759,-763,-32759,-763,-32759, +-1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, +-1525,-32732,-1525,-32732,-1525,-32732,-1525,-32732, +-1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, +-2286,-32688,-2286,-32688,-2286,-32688,-2286,-32688, +-2666,-32659,-2666,-32659,-2666,-32659,-2666,-32659, +-3046,-32626,-3046,-32626,-3046,-32626,-3046,-32626, +-3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, +-3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, +-4183,-32499,-4183,-32499,-4183,-32499,-4183,-32499, +-4561,-32449,-4561,-32449,-4561,-32449,-4561,-32449, +-4938,-32393,-4938,-32393,-4938,-32393,-4938,-32393, +-5315,-32334,-5315,-32334,-5315,-32334,-5315,-32334, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-6066,-32201,-6066,-32201,-6066,-32201,-6066,-32201, +-6440,-32129,-6440,-32129,-6440,-32129,-6440,-32129, +-6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, +-7186,-31970,-7186,-31970,-7186,-31970,-7186,-31970, +-7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, +-7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, +-8297,-31700,-8297,-31700,-8297,-31700,-8297,-31700, +-8665,-31601,-8665,-31601,-8665,-31601,-8665,-31601, +-9032,-31498,-9032,-31498,-9032,-31498,-9032,-31498, +-9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, +-9763,-31279,-9763,-31279,-9763,-31279,-9763,-31279, +-10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, +-10488,-31044,-10488,-31044,-10488,-31044,-10488,-31044, +-10848,-30920,-10848,-30920,-10848,-30920,-10848,-30920, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-11565,-30659,-11565,-30659,-11565,-30659,-11565,-30659, +-11921,-30522,-11921,-30522,-11921,-30522,-11921,-30522, +-12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, +-12628,-30237,-12628,-30237,-12628,-30237,-12628,-30237, +-12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, +-13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, +-13675,-29778,-13675,-29778,-13675,-29778,-13675,-29778, +-14021,-29616,-14021,-29616,-14021,-29616,-14021,-29616, +-14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, +-14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, +-15046,-29109,-15046,-29109,-15046,-29109,-15046,-29109, +-15384,-28932,-15384,-28932,-15384,-28932,-15384,-28932, +-15719,-28751,-15719,-28751,-15719,-28751,-15719,-28751, +-16053,-28566,-16053,-28566,-16053,-28566,-16053,-28566}; +static int16_t twb540[179*2*4] = {32758,-763,32758,-763,32758,-763,32758,-763, +32731,-1525,32731,-1525,32731,-1525,32731,-1525, +32687,-2286,32687,-2286,32687,-2286,32687,-2286, +32625,-3046,32625,-3046,32625,-3046,32625,-3046, +32545,-3805,32545,-3805,32545,-3805,32545,-3805, +32448,-4561,32448,-4561,32448,-4561,32448,-4561, +32333,-5315,32333,-5315,32333,-5315,32333,-5315, +32200,-6066,32200,-6066,32200,-6066,32200,-6066, +32050,-6813,32050,-6813,32050,-6813,32050,-6813, +31883,-7557,31883,-7557,31883,-7557,31883,-7557, +31699,-8297,31699,-8297,31699,-8297,31699,-8297, +31497,-9032,31497,-9032,31497,-9032,31497,-9032, +31278,-9763,31278,-9763,31278,-9763,31278,-9763, +31043,-10488,31043,-10488,31043,-10488,31043,-10488, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30521,-11921,30521,-11921,30521,-11921,30521,-11921, +30236,-12628,30236,-12628,30236,-12628,30236,-12628, +29934,-13328,29934,-13328,29934,-13328,29934,-13328, +29615,-14021,29615,-14021,29615,-14021,29615,-14021, +29281,-14706,29281,-14706,29281,-14706,29281,-14706, +28931,-15384,28931,-15384,28931,-15384,28931,-15384, +28565,-16053,28565,-16053,28565,-16053,28565,-16053, +28184,-16713,28184,-16713,28184,-16713,28184,-16713, +27787,-17364,27787,-17364,27787,-17364,27787,-17364, +27376,-18006,27376,-18006,27376,-18006,27376,-18006, +26950,-18638,26950,-18638,26950,-18638,26950,-18638, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +26053,-19872,26053,-19872,26053,-19872,26053,-19872, +25584,-20473,25584,-20473,25584,-20473,25584,-20473, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24604,-21641,24604,-21641,24604,-21641,24604,-21641, +24093,-22208,24093,-22208,24093,-22208,24093,-22208, +23570,-22762,23570,-22762,23570,-22762,23570,-22762, +23034,-23305,23034,-23305,23034,-23305,23034,-23305, +22486,-23834,22486,-23834,22486,-23834,22486,-23834, +21925,-24351,21925,-24351,21925,-24351,21925,-24351, +21352,-24855,21352,-24855,21352,-24855,21352,-24855, +20768,-25345,20768,-25345,20768,-25345,20768,-25345, +20173,-25821,20173,-25821,20173,-25821,20173,-25821, +19567,-26284,19567,-26284,19567,-26284,19567,-26284, +18950,-26732,18950,-26732,18950,-26732,18950,-26732, +18323,-27166,18323,-27166,18323,-27166,18323,-27166, +17686,-27585,17686,-27585,17686,-27585,17686,-27585, +17039,-27989,17039,-27989,17039,-27989,17039,-27989, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15718,-28751,15718,-28751,15718,-28751,15718,-28751, +15045,-29109,15045,-29109,15045,-29109,15045,-29109, +14364,-29451,14364,-29451,14364,-29451,14364,-29451, +13674,-29778,13674,-29778,13674,-29778,13674,-29778, +12978,-30088,12978,-30088,12978,-30088,12978,-30088, +12274,-30382,12274,-30382,12274,-30382,12274,-30382, +11564,-30659,11564,-30659,11564,-30659,11564,-30659, +10847,-30920,10847,-30920,10847,-30920,10847,-30920, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +9397,-31391,9397,-31391,9397,-31391,9397,-31391, +8664,-31601,8664,-31601,8664,-31601,8664,-31601, +7927,-31794,7927,-31794,7927,-31794,7927,-31794, +7185,-31970,7185,-31970,7185,-31970,7185,-31970, +6439,-32129,6439,-32129,6439,-32129,6439,-32129, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +4937,-32393,4937,-32393,4937,-32393,4937,-32393, +4182,-32499,4182,-32499,4182,-32499,4182,-32499, +3425,-32588,3425,-32588,3425,-32588,3425,-32588, +2665,-32659,2665,-32659,2665,-32659,2665,-32659, +1905,-32712,1905,-32712,1905,-32712,1905,-32712, +1143,-32748,1143,-32748,1143,-32748,1143,-32748, +381,-32765,381,-32765,381,-32765,381,-32765, +-382,-32765,-382,-32765,-382,-32765,-382,-32765, +-1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, +-1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, +-2666,-32659,-2666,-32659,-2666,-32659,-2666,-32659, +-3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, +-4183,-32499,-4183,-32499,-4183,-32499,-4183,-32499, +-4938,-32393,-4938,-32393,-4938,-32393,-4938,-32393, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-6440,-32129,-6440,-32129,-6440,-32129,-6440,-32129, +-7186,-31970,-7186,-31970,-7186,-31970,-7186,-31970, +-7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, +-8665,-31601,-8665,-31601,-8665,-31601,-8665,-31601, +-9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, +-10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, +-10848,-30920,-10848,-30920,-10848,-30920,-10848,-30920, +-11565,-30659,-11565,-30659,-11565,-30659,-11565,-30659, +-12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, +-12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, +-13675,-29778,-13675,-29778,-13675,-29778,-13675,-29778, +-14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, +-15046,-29109,-15046,-29109,-15046,-29109,-15046,-29109, +-15719,-28751,-15719,-28751,-15719,-28751,-15719,-28751, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-17040,-27989,-17040,-27989,-17040,-27989,-17040,-27989, +-17687,-27585,-17687,-27585,-17687,-27585,-17687,-27585, +-18324,-27166,-18324,-27166,-18324,-27166,-18324,-27166, +-18951,-26732,-18951,-26732,-18951,-26732,-18951,-26732, +-19568,-26284,-19568,-26284,-19568,-26284,-19568,-26284, +-20174,-25821,-20174,-25821,-20174,-25821,-20174,-25821, +-20769,-25345,-20769,-25345,-20769,-25345,-20769,-25345, +-21353,-24855,-21353,-24855,-21353,-24855,-21353,-24855, +-21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, +-22487,-23834,-22487,-23834,-22487,-23834,-22487,-23834, +-23035,-23305,-23035,-23305,-23035,-23305,-23035,-23305, +-23571,-22762,-23571,-22762,-23571,-22762,-23571,-22762, +-24094,-22208,-24094,-22208,-24094,-22208,-24094,-22208, +-24605,-21641,-24605,-21641,-24605,-21641,-24605,-21641, +-25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, +-25585,-20473,-25585,-20473,-25585,-20473,-25585,-20473, +-26054,-19872,-26054,-19872,-26054,-19872,-26054,-19872, +-26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, +-26951,-18638,-26951,-18638,-26951,-18638,-26951,-18638, +-27377,-18006,-27377,-18006,-27377,-18006,-27377,-18006, +-27788,-17364,-27788,-17364,-27788,-17364,-27788,-17364, +-28185,-16713,-28185,-16713,-28185,-16713,-28185,-16713, +-28566,-16053,-28566,-16053,-28566,-16053,-28566,-16053, +-28932,-15384,-28932,-15384,-28932,-15384,-28932,-15384, +-29282,-14706,-29282,-14706,-29282,-14706,-29282,-14706, +-29616,-14021,-29616,-14021,-29616,-14021,-29616,-14021, +-29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, +-30237,-12628,-30237,-12628,-30237,-12628,-30237,-12628, +-30522,-11921,-30522,-11921,-30522,-11921,-30522,-11921, +-30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, +-31044,-10488,-31044,-10488,-31044,-10488,-31044,-10488, +-31279,-9763,-31279,-9763,-31279,-9763,-31279,-9763, +-31498,-9032,-31498,-9032,-31498,-9032,-31498,-9032, +-31700,-8297,-31700,-8297,-31700,-8297,-31700,-8297, +-31884,-7557,-31884,-7557,-31884,-7557,-31884,-7557, +-32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, +-32201,-6066,-32201,-6066,-32201,-6066,-32201,-6066, +-32334,-5315,-32334,-5315,-32334,-5315,-32334,-5315, +-32449,-4561,-32449,-4561,-32449,-4561,-32449,-4561, +-32546,-3805,-32546,-3805,-32546,-3805,-32546,-3805, +-32626,-3046,-32626,-3046,-32626,-3046,-32626,-3046, +-32688,-2286,-32688,-2286,-32688,-2286,-32688,-2286, +-32732,-1525,-32732,-1525,-32732,-1525,-32732,-1525, +-32759,-763,-32759,-763,-32759,-763,-32759,-763, +-32767,-1,-32767,-1,-32767,-1,-32767,-1, +-32759,762,-32759,762,-32759,762,-32759,762, +-32732,1524,-32732,1524,-32732,1524,-32732,1524, +-32688,2285,-32688,2285,-32688,2285,-32688,2285, +-32626,3045,-32626,3045,-32626,3045,-32626,3045, +-32546,3804,-32546,3804,-32546,3804,-32546,3804, +-32449,4560,-32449,4560,-32449,4560,-32449,4560, +-32334,5314,-32334,5314,-32334,5314,-32334,5314, +-32201,6065,-32201,6065,-32201,6065,-32201,6065, +-32051,6812,-32051,6812,-32051,6812,-32051,6812, +-31884,7556,-31884,7556,-31884,7556,-31884,7556, +-31700,8296,-31700,8296,-31700,8296,-31700,8296, +-31498,9031,-31498,9031,-31498,9031,-31498,9031, +-31279,9762,-31279,9762,-31279,9762,-31279,9762, +-31044,10487,-31044,10487,-31044,10487,-31044,10487, +-30791,11206,-30791,11206,-30791,11206,-30791,11206, +-30522,11920,-30522,11920,-30522,11920,-30522,11920, +-30237,12627,-30237,12627,-30237,12627,-30237,12627, +-29935,13327,-29935,13327,-29935,13327,-29935,13327, +-29616,14020,-29616,14020,-29616,14020,-29616,14020, +-29282,14705,-29282,14705,-29282,14705,-29282,14705, +-28932,15383,-28932,15383,-28932,15383,-28932,15383, +-28566,16052,-28566,16052,-28566,16052,-28566,16052, +-28185,16712,-28185,16712,-28185,16712,-28185,16712, +-27788,17363,-27788,17363,-27788,17363,-27788,17363, +-27377,18005,-27377,18005,-27377,18005,-27377,18005, +-26951,18637,-26951,18637,-26951,18637,-26951,18637, +-26510,19259,-26510,19259,-26510,19259,-26510,19259, +-26054,19871,-26054,19871,-26054,19871,-26054,19871, +-25585,20472,-25585,20472,-25585,20472,-25585,20472, +-25101,21062,-25101,21062,-25101,21062,-25101,21062, +-24605,21640,-24605,21640,-24605,21640,-24605,21640, +-24094,22207,-24094,22207,-24094,22207,-24094,22207, +-23571,22761,-23571,22761,-23571,22761,-23571,22761, +-23035,23304,-23035,23304,-23035,23304,-23035,23304, +-22487,23833,-22487,23833,-22487,23833,-22487,23833, +-21926,24350,-21926,24350,-21926,24350,-21926,24350, +-21353,24854,-21353,24854,-21353,24854,-21353,24854, +-20769,25344,-20769,25344,-20769,25344,-20769,25344, +-20174,25820,-20174,25820,-20174,25820,-20174,25820, +-19568,26283,-19568,26283,-19568,26283,-19568,26283, +-18951,26731,-18951,26731,-18951,26731,-18951,26731, +-18324,27165,-18324,27165,-18324,27165,-18324,27165, +-17687,27584,-17687,27584,-17687,27584,-17687,27584, +-17040,27988,-17040,27988,-17040,27988,-17040,27988}; + +void dft540(int16_t *x,int16_t *y,unsigned char scale_flag){ // 180 x 3 + int i,j; + __m128i *x128=(__m128i *)x; + __m128i *y128=(__m128i *)y; + __m128i *twa128=(__m128i *)&twa540[0]; + __m128i *twb128=(__m128i *)&twb540[0]; + __m128i x2128[540];// = (__m128i *)&x2128array[0]; + __m128i ytmp128[540];//=&ytmp128array3[0]; + + + + for (i=0,j=0;i<180;i++,j+=3) { + x2128[i] = x128[j]; + x2128[i+180] = x128[j+1]; + x2128[i+360] = x128[j+2]; + } + + dft180((int16_t *)x2128,(int16_t *)ytmp128,1); + dft180((int16_t *)(x2128+180),(int16_t *)(ytmp128+180),1); + dft180((int16_t *)(x2128+360),(int16_t *)(ytmp128+360),1); + + bfly3_tw1(ytmp128,ytmp128+180,ytmp128+360,y128,y128+180,y128+360); + for (i=1,j=0;i<180;i++,j++) { + bfly3(ytmp128+i, + ytmp128+180+i, + ytmp128+360+i, + y128+i, + y128+180+i, + y128+360+i, + twa128+j, + twb128+j); + } + + if (scale_flag==1) { + norm128 = _mm_set1_epi16(dft_norm_table[14]); + + for (i=0;i<540;i++) { + y128[i] = _mm_slli_epi16(_mm_mulhi_epi16(y128[i],norm128),1); + } + } + + _mm_empty(); + _m_empty(); + +}; + +/* +Twiddles generated with + +twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:191)/576)); +twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:191)/576)); +twa2 = zeros(1,2*191); +twb2 = zeros(1,2*191); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +twb2(1:2:end) = real(twb); +twb2(2:2:end) = imag(twb); +fd=fopen("twiddle_tmp.txt","w"); +fprintf(fd,"static int16_t twa576[191*2*4] = {"); +for i=1:2:(2*190) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +fprintf(fd,"static int16_t twb576[191*2*4] = {"); +for i=1:2:(2*190) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +fclose(fd); +*/ +static int16_t twa576[191*2*4] = {32765,-358,32765,-358,32765,-358,32765,-358, +32759,-715,32759,-715,32759,-715,32759,-715, +32749,-1073,32749,-1073,32749,-1073,32749,-1073, +32735,-1430,32735,-1430,32735,-1430,32735,-1430, +32718,-1787,32718,-1787,32718,-1787,32718,-1787, +32696,-2144,32696,-2144,32696,-2144,32696,-2144, +32671,-2500,32671,-2500,32671,-2500,32671,-2500, +32642,-2856,32642,-2856,32642,-2856,32642,-2856, +32609,-3212,32609,-3212,32609,-3212,32609,-3212, +32572,-3568,32572,-3568,32572,-3568,32572,-3568, +32531,-3923,32531,-3923,32531,-3923,32531,-3923, +32486,-4277,32486,-4277,32486,-4277,32486,-4277, +32438,-4632,32438,-4632,32438,-4632,32438,-4632, +32385,-4985,32385,-4985,32385,-4985,32385,-4985, +32329,-5338,32329,-5338,32329,-5338,32329,-5338, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32205,-6042,32205,-6042,32205,-6042,32205,-6042, +32137,-6393,32137,-6393,32137,-6393,32137,-6393, +32065,-6743,32065,-6743,32065,-6743,32065,-6743, +31990,-7093,31990,-7093,31990,-7093,31990,-7093, +31911,-7441,31911,-7441,31911,-7441,31911,-7441, +31827,-7789,31827,-7789,31827,-7789,31827,-7789, +31741,-8135,31741,-8135,31741,-8135,31741,-8135, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31556,-8826,31556,-8826,31556,-8826,31556,-8826, +31457,-9170,31457,-9170,31457,-9170,31457,-9170, +31356,-9512,31356,-9512,31356,-9512,31356,-9512, +31250,-9854,31250,-9854,31250,-9854,31250,-9854, +31141,-10194,31141,-10194,31141,-10194,31141,-10194, +31028,-10533,31028,-10533,31028,-10533,31028,-10533, +30911,-10871,30911,-10871,30911,-10871,30911,-10871, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30666,-11543,30666,-11543,30666,-11543,30666,-11543, +30539,-11877,30539,-11877,30539,-11877,30539,-11877, +30407,-12209,30407,-12209,30407,-12209,30407,-12209, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +30134,-12869,30134,-12869,30134,-12869,30134,-12869, +29992,-13197,29992,-13197,29992,-13197,29992,-13197, +29846,-13524,29846,-13524,29846,-13524,29846,-13524, +29696,-13848,29696,-13848,29696,-13848,29696,-13848, +29544,-14172,29544,-14172,29544,-14172,29544,-14172, +29387,-14493,29387,-14493,29387,-14493,29387,-14493, +29227,-14813,29227,-14813,29227,-14813,29227,-14813, +29064,-15131,29064,-15131,29064,-15131,29064,-15131, +28897,-15447,28897,-15447,28897,-15447,28897,-15447, +28727,-15761,28727,-15761,28727,-15761,28727,-15761, +28554,-16073,28554,-16073,28554,-16073,28554,-16073, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28196,-16693,28196,-16693,28196,-16693,28196,-16693, +28012,-16999,28012,-16999,28012,-16999,28012,-16999, +27825,-17304,27825,-17304,27825,-17304,27825,-17304, +27635,-17606,27635,-17606,27635,-17606,27635,-17606, +27441,-17907,27441,-17907,27441,-17907,27441,-17907, +27244,-18205,27244,-18205,27244,-18205,27244,-18205, +27044,-18501,27044,-18501,27044,-18501,27044,-18501, +26841,-18795,26841,-18795,26841,-18795,26841,-18795, +26634,-19087,26634,-19087,26634,-19087,26634,-19087, +26424,-19376,26424,-19376,26424,-19376,26424,-19376, +26211,-19663,26211,-19663,26211,-19663,26211,-19663, +25995,-19948,25995,-19948,25995,-19948,25995,-19948, +25776,-20230,25776,-20230,25776,-20230,25776,-20230, +25554,-20510,25554,-20510,25554,-20510,25554,-20510, +25329,-20788,25329,-20788,25329,-20788,25329,-20788, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24869,-21335,24869,-21335,24869,-21335,24869,-21335, +24635,-21605,24635,-21605,24635,-21605,24635,-21605, +24398,-21873,24398,-21873,24398,-21873,24398,-21873, +24158,-22138,24158,-22138,24158,-22138,24158,-22138, +23915,-22400,23915,-22400,23915,-22400,23915,-22400, +23669,-22659,23669,-22659,23669,-22659,23669,-22659, +23421,-22916,23421,-22916,23421,-22916,23421,-22916, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22915,-23422,22915,-23422,22915,-23422,22915,-23422, +22658,-23670,22658,-23670,22658,-23670,22658,-23670, +22399,-23916,22399,-23916,22399,-23916,22399,-23916, +22137,-24159,22137,-24159,22137,-24159,22137,-24159, +21872,-24399,21872,-24399,21872,-24399,21872,-24399, +21604,-24636,21604,-24636,21604,-24636,21604,-24636, +21334,-24870,21334,-24870,21334,-24870,21334,-24870, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20787,-25330,20787,-25330,20787,-25330,20787,-25330, +20509,-25555,20509,-25555,20509,-25555,20509,-25555, +20229,-25777,20229,-25777,20229,-25777,20229,-25777, +19947,-25996,19947,-25996,19947,-25996,19947,-25996, +19662,-26212,19662,-26212,19662,-26212,19662,-26212, +19375,-26425,19375,-26425,19375,-26425,19375,-26425, +19086,-26635,19086,-26635,19086,-26635,19086,-26635, +18794,-26842,18794,-26842,18794,-26842,18794,-26842, +18500,-27045,18500,-27045,18500,-27045,18500,-27045, +18204,-27245,18204,-27245,18204,-27245,18204,-27245, +17906,-27442,17906,-27442,17906,-27442,17906,-27442, +17605,-27636,17605,-27636,17605,-27636,17605,-27636, +17303,-27826,17303,-27826,17303,-27826,17303,-27826, +16998,-28013,16998,-28013,16998,-28013,16998,-28013, +16692,-28197,16692,-28197,16692,-28197,16692,-28197, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +16072,-28555,16072,-28555,16072,-28555,16072,-28555, +15760,-28728,15760,-28728,15760,-28728,15760,-28728, +15446,-28898,15446,-28898,15446,-28898,15446,-28898, +15130,-29065,15130,-29065,15130,-29065,15130,-29065, +14812,-29228,14812,-29228,14812,-29228,14812,-29228, +14492,-29388,14492,-29388,14492,-29388,14492,-29388, +14171,-29545,14171,-29545,14171,-29545,14171,-29545, +13847,-29697,13847,-29697,13847,-29697,13847,-29697, +13523,-29847,13523,-29847,13523,-29847,13523,-29847, +13196,-29993,13196,-29993,13196,-29993,13196,-29993, +12868,-30135,12868,-30135,12868,-30135,12868,-30135, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +12208,-30408,12208,-30408,12208,-30408,12208,-30408, +11876,-30540,11876,-30540,11876,-30540,11876,-30540, +11542,-30667,11542,-30667,11542,-30667,11542,-30667, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +10870,-30912,10870,-30912,10870,-30912,10870,-30912, +10532,-31029,10532,-31029,10532,-31029,10532,-31029, +10193,-31142,10193,-31142,10193,-31142,10193,-31142, +9853,-31251,9853,-31251,9853,-31251,9853,-31251, +9511,-31357,9511,-31357,9511,-31357,9511,-31357, +9169,-31458,9169,-31458,9169,-31458,9169,-31458, +8825,-31557,8825,-31557,8825,-31557,8825,-31557, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +8134,-31742,8134,-31742,8134,-31742,8134,-31742, +7788,-31828,7788,-31828,7788,-31828,7788,-31828, +7440,-31912,7440,-31912,7440,-31912,7440,-31912, +7092,-31991,7092,-31991,7092,-31991,7092,-31991, +6742,-32066,6742,-32066,6742,-32066,6742,-32066, +6392,-32138,6392,-32138,6392,-32138,6392,-32138, +6041,-32206,6041,-32206,6041,-32206,6041,-32206, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5337,-32330,5337,-32330,5337,-32330,5337,-32330, +4984,-32386,4984,-32386,4984,-32386,4984,-32386, +4631,-32439,4631,-32439,4631,-32439,4631,-32439, +4276,-32487,4276,-32487,4276,-32487,4276,-32487, +3922,-32532,3922,-32532,3922,-32532,3922,-32532, +3567,-32573,3567,-32573,3567,-32573,3567,-32573, +3211,-32610,3211,-32610,3211,-32610,3211,-32610, +2855,-32643,2855,-32643,2855,-32643,2855,-32643, +2499,-32672,2499,-32672,2499,-32672,2499,-32672, +2143,-32697,2143,-32697,2143,-32697,2143,-32697, +1786,-32719,1786,-32719,1786,-32719,1786,-32719, +1429,-32736,1429,-32736,1429,-32736,1429,-32736, +1072,-32750,1072,-32750,1072,-32750,1072,-32750, +714,-32760,714,-32760,714,-32760,714,-32760, +357,-32766,357,-32766,357,-32766,357,-32766, +0,-32767,0,-32767,0,-32767,0,-32767, +-358,-32766,-358,-32766,-358,-32766,-358,-32766, +-715,-32760,-715,-32760,-715,-32760,-715,-32760, +-1073,-32750,-1073,-32750,-1073,-32750,-1073,-32750, +-1430,-32736,-1430,-32736,-1430,-32736,-1430,-32736, +-1787,-32719,-1787,-32719,-1787,-32719,-1787,-32719, +-2144,-32697,-2144,-32697,-2144,-32697,-2144,-32697, +-2500,-32672,-2500,-32672,-2500,-32672,-2500,-32672, +-2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, +-3212,-32610,-3212,-32610,-3212,-32610,-3212,-32610, +-3568,-32573,-3568,-32573,-3568,-32573,-3568,-32573, +-3923,-32532,-3923,-32532,-3923,-32532,-3923,-32532, +-4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, +-4632,-32439,-4632,-32439,-4632,-32439,-4632,-32439, +-4985,-32386,-4985,-32386,-4985,-32386,-4985,-32386, +-5338,-32330,-5338,-32330,-5338,-32330,-5338,-32330, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-6042,-32206,-6042,-32206,-6042,-32206,-6042,-32206, +-6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, +-6743,-32066,-6743,-32066,-6743,-32066,-6743,-32066, +-7093,-31991,-7093,-31991,-7093,-31991,-7093,-31991, +-7441,-31912,-7441,-31912,-7441,-31912,-7441,-31912, +-7789,-31828,-7789,-31828,-7789,-31828,-7789,-31828, +-8135,-31742,-8135,-31742,-8135,-31742,-8135,-31742, +-8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, +-8826,-31557,-8826,-31557,-8826,-31557,-8826,-31557, +-9170,-31458,-9170,-31458,-9170,-31458,-9170,-31458, +-9512,-31357,-9512,-31357,-9512,-31357,-9512,-31357, +-9854,-31251,-9854,-31251,-9854,-31251,-9854,-31251, +-10194,-31142,-10194,-31142,-10194,-31142,-10194,-31142, +-10533,-31029,-10533,-31029,-10533,-31029,-10533,-31029, +-10871,-30912,-10871,-30912,-10871,-30912,-10871,-30912, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-11543,-30667,-11543,-30667,-11543,-30667,-11543,-30667, +-11877,-30540,-11877,-30540,-11877,-30540,-11877,-30540, +-12209,-30408,-12209,-30408,-12209,-30408,-12209,-30408, +-12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, +-12869,-30135,-12869,-30135,-12869,-30135,-12869,-30135, +-13197,-29993,-13197,-29993,-13197,-29993,-13197,-29993, +-13524,-29847,-13524,-29847,-13524,-29847,-13524,-29847, +-13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, +-14172,-29545,-14172,-29545,-14172,-29545,-14172,-29545, +-14493,-29388,-14493,-29388,-14493,-29388,-14493,-29388, +-14813,-29228,-14813,-29228,-14813,-29228,-14813,-29228, +-15131,-29065,-15131,-29065,-15131,-29065,-15131,-29065, +-15447,-28898,-15447,-28898,-15447,-28898,-15447,-28898, +-15761,-28728,-15761,-28728,-15761,-28728,-15761,-28728, +-16073,-28555,-16073,-28555,-16073,-28555,-16073,-28555}; +static int16_t twb576[191*2*4] = {32759,-715,32759,-715,32759,-715,32759,-715, +32735,-1430,32735,-1430,32735,-1430,32735,-1430, +32696,-2144,32696,-2144,32696,-2144,32696,-2144, +32642,-2856,32642,-2856,32642,-2856,32642,-2856, +32572,-3568,32572,-3568,32572,-3568,32572,-3568, +32486,-4277,32486,-4277,32486,-4277,32486,-4277, +32385,-4985,32385,-4985,32385,-4985,32385,-4985, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32137,-6393,32137,-6393,32137,-6393,32137,-6393, +31990,-7093,31990,-7093,31990,-7093,31990,-7093, +31827,-7789,31827,-7789,31827,-7789,31827,-7789, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31457,-9170,31457,-9170,31457,-9170,31457,-9170, +31250,-9854,31250,-9854,31250,-9854,31250,-9854, +31028,-10533,31028,-10533,31028,-10533,31028,-10533, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30539,-11877,30539,-11877,30539,-11877,30539,-11877, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +29992,-13197,29992,-13197,29992,-13197,29992,-13197, +29696,-13848,29696,-13848,29696,-13848,29696,-13848, +29387,-14493,29387,-14493,29387,-14493,29387,-14493, +29064,-15131,29064,-15131,29064,-15131,29064,-15131, +28727,-15761,28727,-15761,28727,-15761,28727,-15761, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28012,-16999,28012,-16999,28012,-16999,28012,-16999, +27635,-17606,27635,-17606,27635,-17606,27635,-17606, +27244,-18205,27244,-18205,27244,-18205,27244,-18205, +26841,-18795,26841,-18795,26841,-18795,26841,-18795, +26424,-19376,26424,-19376,26424,-19376,26424,-19376, +25995,-19948,25995,-19948,25995,-19948,25995,-19948, +25554,-20510,25554,-20510,25554,-20510,25554,-20510, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24635,-21605,24635,-21605,24635,-21605,24635,-21605, +24158,-22138,24158,-22138,24158,-22138,24158,-22138, +23669,-22659,23669,-22659,23669,-22659,23669,-22659, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22658,-23670,22658,-23670,22658,-23670,22658,-23670, +22137,-24159,22137,-24159,22137,-24159,22137,-24159, +21604,-24636,21604,-24636,21604,-24636,21604,-24636, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20509,-25555,20509,-25555,20509,-25555,20509,-25555, +19947,-25996,19947,-25996,19947,-25996,19947,-25996, +19375,-26425,19375,-26425,19375,-26425,19375,-26425, +18794,-26842,18794,-26842,18794,-26842,18794,-26842, +18204,-27245,18204,-27245,18204,-27245,18204,-27245, +17605,-27636,17605,-27636,17605,-27636,17605,-27636, +16998,-28013,16998,-28013,16998,-28013,16998,-28013, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15760,-28728,15760,-28728,15760,-28728,15760,-28728, +15130,-29065,15130,-29065,15130,-29065,15130,-29065, +14492,-29388,14492,-29388,14492,-29388,14492,-29388, +13847,-29697,13847,-29697,13847,-29697,13847,-29697, +13196,-29993,13196,-29993,13196,-29993,13196,-29993, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +11876,-30540,11876,-30540,11876,-30540,11876,-30540, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +10532,-31029,10532,-31029,10532,-31029,10532,-31029, +9853,-31251,9853,-31251,9853,-31251,9853,-31251, +9169,-31458,9169,-31458,9169,-31458,9169,-31458, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +7788,-31828,7788,-31828,7788,-31828,7788,-31828, +7092,-31991,7092,-31991,7092,-31991,7092,-31991, +6392,-32138,6392,-32138,6392,-32138,6392,-32138, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +4984,-32386,4984,-32386,4984,-32386,4984,-32386, +4276,-32487,4276,-32487,4276,-32487,4276,-32487, +3567,-32573,3567,-32573,3567,-32573,3567,-32573, +2855,-32643,2855,-32643,2855,-32643,2855,-32643, +2143,-32697,2143,-32697,2143,-32697,2143,-32697, +1429,-32736,1429,-32736,1429,-32736,1429,-32736, +714,-32760,714,-32760,714,-32760,714,-32760, +0,-32767,0,-32767,0,-32767,0,-32767, +-715,-32760,-715,-32760,-715,-32760,-715,-32760, +-1430,-32736,-1430,-32736,-1430,-32736,-1430,-32736, +-2144,-32697,-2144,-32697,-2144,-32697,-2144,-32697, +-2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, +-3568,-32573,-3568,-32573,-3568,-32573,-3568,-32573, +-4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, +-4985,-32386,-4985,-32386,-4985,-32386,-4985,-32386, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, +-7093,-31991,-7093,-31991,-7093,-31991,-7093,-31991, +-7789,-31828,-7789,-31828,-7789,-31828,-7789,-31828, +-8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, +-9170,-31458,-9170,-31458,-9170,-31458,-9170,-31458, +-9854,-31251,-9854,-31251,-9854,-31251,-9854,-31251, +-10533,-31029,-10533,-31029,-10533,-31029,-10533,-31029, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-11877,-30540,-11877,-30540,-11877,-30540,-11877,-30540, +-12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, +-13197,-29993,-13197,-29993,-13197,-29993,-13197,-29993, +-13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, +-14493,-29388,-14493,-29388,-14493,-29388,-14493,-29388, +-15131,-29065,-15131,-29065,-15131,-29065,-15131,-29065, +-15761,-28728,-15761,-28728,-15761,-28728,-15761,-28728, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-16999,-28013,-16999,-28013,-16999,-28013,-16999,-28013, +-17606,-27636,-17606,-27636,-17606,-27636,-17606,-27636, +-18205,-27245,-18205,-27245,-18205,-27245,-18205,-27245, +-18795,-26842,-18795,-26842,-18795,-26842,-18795,-26842, +-19376,-26425,-19376,-26425,-19376,-26425,-19376,-26425, +-19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, +-20510,-25555,-20510,-25555,-20510,-25555,-20510,-25555, +-21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, +-21605,-24636,-21605,-24636,-21605,-24636,-21605,-24636, +-22138,-24159,-22138,-24159,-22138,-24159,-22138,-24159, +-22659,-23670,-22659,-23670,-22659,-23670,-22659,-23670, +-23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, +-23670,-22659,-23670,-22659,-23670,-22659,-23670,-22659, +-24159,-22138,-24159,-22138,-24159,-22138,-24159,-22138, +-24636,-21605,-24636,-21605,-24636,-21605,-24636,-21605, +-25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, +-25555,-20510,-25555,-20510,-25555,-20510,-25555,-20510, +-25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, +-26425,-19376,-26425,-19376,-26425,-19376,-26425,-19376, +-26842,-18795,-26842,-18795,-26842,-18795,-26842,-18795, +-27245,-18205,-27245,-18205,-27245,-18205,-27245,-18205, +-27636,-17606,-27636,-17606,-27636,-17606,-27636,-17606, +-28013,-16999,-28013,-16999,-28013,-16999,-28013,-16999, +-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, +-28728,-15761,-28728,-15761,-28728,-15761,-28728,-15761, +-29065,-15131,-29065,-15131,-29065,-15131,-29065,-15131, +-29388,-14493,-29388,-14493,-29388,-14493,-29388,-14493, +-29697,-13848,-29697,-13848,-29697,-13848,-29697,-13848, +-29993,-13197,-29993,-13197,-29993,-13197,-29993,-13197, +-30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, +-30540,-11877,-30540,-11877,-30540,-11877,-30540,-11877, +-30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, +-31029,-10533,-31029,-10533,-31029,-10533,-31029,-10533, +-31251,-9854,-31251,-9854,-31251,-9854,-31251,-9854, +-31458,-9170,-31458,-9170,-31458,-9170,-31458,-9170, +-31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, +-31828,-7789,-31828,-7789,-31828,-7789,-31828,-7789, +-31991,-7093,-31991,-7093,-31991,-7093,-31991,-7093, +-32138,-6393,-32138,-6393,-32138,-6393,-32138,-6393, +-32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, +-32386,-4985,-32386,-4985,-32386,-4985,-32386,-4985, +-32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, +-32573,-3568,-32573,-3568,-32573,-3568,-32573,-3568, +-32643,-2856,-32643,-2856,-32643,-2856,-32643,-2856, +-32697,-2144,-32697,-2144,-32697,-2144,-32697,-2144, +-32736,-1430,-32736,-1430,-32736,-1430,-32736,-1430, +-32760,-715,-32760,-715,-32760,-715,-32760,-715, +-32767,-1,-32767,-1,-32767,-1,-32767,-1, +-32760,714,-32760,714,-32760,714,-32760,714, +-32736,1429,-32736,1429,-32736,1429,-32736,1429, +-32697,2143,-32697,2143,-32697,2143,-32697,2143, +-32643,2855,-32643,2855,-32643,2855,-32643,2855, +-32573,3567,-32573,3567,-32573,3567,-32573,3567, +-32487,4276,-32487,4276,-32487,4276,-32487,4276, +-32386,4984,-32386,4984,-32386,4984,-32386,4984, +-32270,5689,-32270,5689,-32270,5689,-32270,5689, +-32138,6392,-32138,6392,-32138,6392,-32138,6392, +-31991,7092,-31991,7092,-31991,7092,-31991,7092, +-31828,7788,-31828,7788,-31828,7788,-31828,7788, +-31651,8480,-31651,8480,-31651,8480,-31651,8480, +-31458,9169,-31458,9169,-31458,9169,-31458,9169, +-31251,9853,-31251,9853,-31251,9853,-31251,9853, +-31029,10532,-31029,10532,-31029,10532,-31029,10532, +-30791,11206,-30791,11206,-30791,11206,-30791,11206, +-30540,11876,-30540,11876,-30540,11876,-30540,11876, +-30273,12539,-30273,12539,-30273,12539,-30273,12539, +-29993,13196,-29993,13196,-29993,13196,-29993,13196, +-29697,13847,-29697,13847,-29697,13847,-29697,13847, +-29388,14492,-29388,14492,-29388,14492,-29388,14492, +-29065,15130,-29065,15130,-29065,15130,-29065,15130, +-28728,15760,-28728,15760,-28728,15760,-28728,15760, +-28378,16383,-28378,16383,-28378,16383,-28378,16383, +-28013,16998,-28013,16998,-28013,16998,-28013,16998, +-27636,17605,-27636,17605,-27636,17605,-27636,17605, +-27245,18204,-27245,18204,-27245,18204,-27245,18204, +-26842,18794,-26842,18794,-26842,18794,-26842,18794, +-26425,19375,-26425,19375,-26425,19375,-26425,19375, +-25996,19947,-25996,19947,-25996,19947,-25996,19947, +-25555,20509,-25555,20509,-25555,20509,-25555,20509, +-25101,21062,-25101,21062,-25101,21062,-25101,21062, +-24636,21604,-24636,21604,-24636,21604,-24636,21604, +-24159,22137,-24159,22137,-24159,22137,-24159,22137, +-23670,22658,-23670,22658,-23670,22658,-23670,22658, +-23170,23169,-23170,23169,-23170,23169,-23170,23169, +-22659,23669,-22659,23669,-22659,23669,-22659,23669, +-22138,24158,-22138,24158,-22138,24158,-22138,24158, +-21605,24635,-21605,24635,-21605,24635,-21605,24635, +-21063,25100,-21063,25100,-21063,25100,-21063,25100, +-20510,25554,-20510,25554,-20510,25554,-20510,25554, +-19948,25995,-19948,25995,-19948,25995,-19948,25995, +-19376,26424,-19376,26424,-19376,26424,-19376,26424, +-18795,26841,-18795,26841,-18795,26841,-18795,26841, +-18205,27244,-18205,27244,-18205,27244,-18205,27244, +-17606,27635,-17606,27635,-17606,27635,-17606,27635, +-16999,28012,-16999,28012,-16999,28012,-16999,28012}; + +void dft576(int16_t *x,int16_t *y,unsigned char scale_flag){ // 192 x 3 + int i,j; + __m128i *x128=(__m128i *)x; + __m128i *y128=(__m128i *)y; + __m128i *twa128=(__m128i *)&twa576[0]; + __m128i *twb128=(__m128i *)&twb576[0]; + __m128i x2128[576];// = (__m128i *)&x2128array[0]; + __m128i ytmp128[576];//=&ytmp128array3[0]; + + + + for (i=0,j=0;i<192;i++,j+=3) { + x2128[i] = x128[j]; + x2128[i+192] = x128[j+1]; + x2128[i+384] = x128[j+2]; + } + + dft192((int16_t *)x2128,(int16_t *)ytmp128,1); + dft192((int16_t *)(x2128+192),(int16_t *)(ytmp128+192),1); + dft192((int16_t *)(x2128+384),(int16_t *)(ytmp128+384),1); + + bfly3_tw1(ytmp128,ytmp128+192,ytmp128+384,y128,y128+192,y128+384); + for (i=1,j=0;i<192;i++,j++) { + bfly3(ytmp128+i, + ytmp128+192+i, + ytmp128+384+i, + y128+i, + y128+192+i, + y128+384+i, + twa128+j, + twb128+j); + } + + if (scale_flag==1) { + norm128 = _mm_set1_epi16(dft_norm_table[14]); + + for (i=0;i<576;i++) { + y128[i] = _mm_slli_epi16(_mm_mulhi_epi16(y128[i],norm128),1); + } + } + + _mm_empty(); + _m_empty(); + +}; + +/* Twiddles generated with +twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:299)/600)); +twa2 = zeros(1,2*299); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +fd=fopen("twiddle_tmp.txt","w"); +fprintf(fd,"static int16_t twa600[299*2*4] = {"); +for i=1:2:(2*298) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +fclose(fd); + */ +static int16_t twa600[299*2*4] = {32765,-344,32765,-344,32765,-344,32765,-344, +32759,-687,32759,-687,32759,-687,32759,-687, +32750,-1030,32750,-1030,32750,-1030,32750,-1030, +32738,-1373,32738,-1373,32738,-1373,32738,-1373, +32722,-1715,32722,-1715,32722,-1715,32722,-1715, +32702,-2058,32702,-2058,32702,-2058,32702,-2058, +32679,-2400,32679,-2400,32679,-2400,32679,-2400, +32652,-2742,32652,-2742,32652,-2742,32652,-2742, +32621,-3084,32621,-3084,32621,-3084,32621,-3084, +32587,-3426,32587,-3426,32587,-3426,32587,-3426, +32549,-3767,32549,-3767,32549,-3767,32549,-3767, +32508,-4107,32508,-4107,32508,-4107,32508,-4107, +32463,-4447,32463,-4447,32463,-4447,32463,-4447, +32415,-4787,32415,-4787,32415,-4787,32415,-4787, +32363,-5126,32363,-5126,32363,-5126,32363,-5126, +32308,-5465,32308,-5465,32308,-5465,32308,-5465, +32249,-5803,32249,-5803,32249,-5803,32249,-5803, +32186,-6140,32186,-6140,32186,-6140,32186,-6140, +32120,-6477,32120,-6477,32120,-6477,32120,-6477, +32050,-6813,32050,-6813,32050,-6813,32050,-6813, +31977,-7148,31977,-7148,31977,-7148,31977,-7148, +31901,-7483,31901,-7483,31901,-7483,31901,-7483, +31821,-7817,31821,-7817,31821,-7817,31821,-7817, +31737,-8149,31737,-8149,31737,-8149,31737,-8149, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31559,-8812,31559,-8812,31559,-8812,31559,-8812, +31465,-9142,31465,-9142,31465,-9142,31465,-9142, +31368,-9471,31368,-9471,31368,-9471,31368,-9471, +31267,-9799,31267,-9799,31267,-9799,31267,-9799, +31163,-10126,31163,-10126,31163,-10126,31163,-10126, +31055,-10452,31055,-10452,31055,-10452,31055,-10452, +30944,-10776,30944,-10776,30944,-10776,30944,-10776, +30829,-11100,30829,-11100,30829,-11100,30829,-11100, +30711,-11422,30711,-11422,30711,-11422,30711,-11422, +30590,-11743,30590,-11743,30590,-11743,30590,-11743, +30465,-12063,30465,-12063,30465,-12063,30465,-12063, +30338,-12381,30338,-12381,30338,-12381,30338,-12381, +30206,-12698,30206,-12698,30206,-12698,30206,-12698, +30072,-13014,30072,-13014,30072,-13014,30072,-13014, +29934,-13328,29934,-13328,29934,-13328,29934,-13328, +29792,-13641,29792,-13641,29792,-13641,29792,-13641, +29648,-13952,29648,-13952,29648,-13952,29648,-13952, +29500,-14262,29500,-14262,29500,-14262,29500,-14262, +29349,-14570,29349,-14570,29349,-14570,29349,-14570, +29195,-14876,29195,-14876,29195,-14876,29195,-14876, +29038,-15181,29038,-15181,29038,-15181,29038,-15181, +28877,-15485,28877,-15485,28877,-15485,28877,-15485, +28713,-15786,28713,-15786,28713,-15786,28713,-15786, +28547,-16086,28547,-16086,28547,-16086,28547,-16086, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28203,-16680,28203,-16680,28203,-16680,28203,-16680, +28027,-16975,28027,-16975,28027,-16975,28027,-16975, +27848,-17267,27848,-17267,27848,-17267,27848,-17267, +27666,-17558,27666,-17558,27666,-17558,27666,-17558, +27480,-17847,27480,-17847,27480,-17847,27480,-17847, +27292,-18133,27292,-18133,27292,-18133,27292,-18133, +27100,-18418,27100,-18418,27100,-18418,27100,-18418, +26906,-18701,26906,-18701,26906,-18701,26906,-18701, +26709,-18982,26709,-18982,26709,-18982,26709,-18982, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +26305,-19537,26305,-19537,26305,-19537,26305,-19537, +26099,-19811,26099,-19811,26099,-19811,26099,-19811, +25891,-20084,25891,-20084,25891,-20084,25891,-20084, +25679,-20354,25679,-20354,25679,-20354,25679,-20354, +25464,-20621,25464,-20621,25464,-20621,25464,-20621, +25247,-20887,25247,-20887,25247,-20887,25247,-20887, +25027,-21150,25027,-21150,25027,-21150,25027,-21150, +24804,-21411,24804,-21411,24804,-21411,24804,-21411, +24578,-21670,24578,-21670,24578,-21670,24578,-21670, +24350,-21926,24350,-21926,24350,-21926,24350,-21926, +24119,-22180,24119,-22180,24119,-22180,24119,-22180, +23886,-22431,23886,-22431,23886,-22431,23886,-22431, +23649,-22680,23649,-22680,23649,-22680,23649,-22680, +23411,-22926,23411,-22926,23411,-22926,23411,-22926, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22925,-23412,22925,-23412,22925,-23412,22925,-23412, +22679,-23650,22679,-23650,22679,-23650,22679,-23650, +22430,-23887,22430,-23887,22430,-23887,22430,-23887, +22179,-24120,22179,-24120,22179,-24120,22179,-24120, +21925,-24351,21925,-24351,21925,-24351,21925,-24351, +21669,-24579,21669,-24579,21669,-24579,21669,-24579, +21410,-24805,21410,-24805,21410,-24805,21410,-24805, +21149,-25028,21149,-25028,21149,-25028,21149,-25028, +20886,-25248,20886,-25248,20886,-25248,20886,-25248, +20620,-25465,20620,-25465,20620,-25465,20620,-25465, +20353,-25680,20353,-25680,20353,-25680,20353,-25680, +20083,-25892,20083,-25892,20083,-25892,20083,-25892, +19810,-26100,19810,-26100,19810,-26100,19810,-26100, +19536,-26306,19536,-26306,19536,-26306,19536,-26306, +19259,-26510,19259,-26510,19259,-26510,19259,-26510, +18981,-26710,18981,-26710,18981,-26710,18981,-26710, +18700,-26907,18700,-26907,18700,-26907,18700,-26907, +18417,-27101,18417,-27101,18417,-27101,18417,-27101, +18132,-27293,18132,-27293,18132,-27293,18132,-27293, +17846,-27481,17846,-27481,17846,-27481,17846,-27481, +17557,-27667,17557,-27667,17557,-27667,17557,-27667, +17266,-27849,17266,-27849,17266,-27849,17266,-27849, +16974,-28028,16974,-28028,16974,-28028,16974,-28028, +16679,-28204,16679,-28204,16679,-28204,16679,-28204, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +16085,-28548,16085,-28548,16085,-28548,16085,-28548, +15785,-28714,15785,-28714,15785,-28714,15785,-28714, +15484,-28878,15484,-28878,15484,-28878,15484,-28878, +15180,-29039,15180,-29039,15180,-29039,15180,-29039, +14875,-29196,14875,-29196,14875,-29196,14875,-29196, +14569,-29350,14569,-29350,14569,-29350,14569,-29350, +14261,-29501,14261,-29501,14261,-29501,14261,-29501, +13951,-29649,13951,-29649,13951,-29649,13951,-29649, +13640,-29793,13640,-29793,13640,-29793,13640,-29793, +13327,-29935,13327,-29935,13327,-29935,13327,-29935, +13013,-30073,13013,-30073,13013,-30073,13013,-30073, +12697,-30207,12697,-30207,12697,-30207,12697,-30207, +12380,-30339,12380,-30339,12380,-30339,12380,-30339, +12062,-30466,12062,-30466,12062,-30466,12062,-30466, +11742,-30591,11742,-30591,11742,-30591,11742,-30591, +11421,-30712,11421,-30712,11421,-30712,11421,-30712, +11099,-30830,11099,-30830,11099,-30830,11099,-30830, +10775,-30945,10775,-30945,10775,-30945,10775,-30945, +10451,-31056,10451,-31056,10451,-31056,10451,-31056, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +9798,-31268,9798,-31268,9798,-31268,9798,-31268, +9470,-31369,9470,-31369,9470,-31369,9470,-31369, +9141,-31466,9141,-31466,9141,-31466,9141,-31466, +8811,-31560,8811,-31560,8811,-31560,8811,-31560, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +8148,-31738,8148,-31738,8148,-31738,8148,-31738, +7816,-31822,7816,-31822,7816,-31822,7816,-31822, +7482,-31902,7482,-31902,7482,-31902,7482,-31902, +7147,-31978,7147,-31978,7147,-31978,7147,-31978, +6812,-32051,6812,-32051,6812,-32051,6812,-32051, +6476,-32121,6476,-32121,6476,-32121,6476,-32121, +6139,-32187,6139,-32187,6139,-32187,6139,-32187, +5802,-32250,5802,-32250,5802,-32250,5802,-32250, +5464,-32309,5464,-32309,5464,-32309,5464,-32309, +5125,-32364,5125,-32364,5125,-32364,5125,-32364, +4786,-32416,4786,-32416,4786,-32416,4786,-32416, +4446,-32464,4446,-32464,4446,-32464,4446,-32464, +4106,-32509,4106,-32509,4106,-32509,4106,-32509, +3766,-32550,3766,-32550,3766,-32550,3766,-32550, +3425,-32588,3425,-32588,3425,-32588,3425,-32588, +3083,-32622,3083,-32622,3083,-32622,3083,-32622, +2741,-32653,2741,-32653,2741,-32653,2741,-32653, +2399,-32680,2399,-32680,2399,-32680,2399,-32680, +2057,-32703,2057,-32703,2057,-32703,2057,-32703, +1714,-32723,1714,-32723,1714,-32723,1714,-32723, +1372,-32739,1372,-32739,1372,-32739,1372,-32739, +1029,-32751,1029,-32751,1029,-32751,1029,-32751, +686,-32760,686,-32760,686,-32760,686,-32760, +343,-32766,343,-32766,343,-32766,343,-32766, +0,-32767,0,-32767,0,-32767,0,-32767, +-344,-32766,-344,-32766,-344,-32766,-344,-32766, +-687,-32760,-687,-32760,-687,-32760,-687,-32760, +-1030,-32751,-1030,-32751,-1030,-32751,-1030,-32751, +-1373,-32739,-1373,-32739,-1373,-32739,-1373,-32739, +-1715,-32723,-1715,-32723,-1715,-32723,-1715,-32723, +-2058,-32703,-2058,-32703,-2058,-32703,-2058,-32703, +-2400,-32680,-2400,-32680,-2400,-32680,-2400,-32680, +-2742,-32653,-2742,-32653,-2742,-32653,-2742,-32653, +-3084,-32622,-3084,-32622,-3084,-32622,-3084,-32622, +-3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, +-3767,-32550,-3767,-32550,-3767,-32550,-3767,-32550, +-4107,-32509,-4107,-32509,-4107,-32509,-4107,-32509, +-4447,-32464,-4447,-32464,-4447,-32464,-4447,-32464, +-4787,-32416,-4787,-32416,-4787,-32416,-4787,-32416, +-5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, +-5465,-32309,-5465,-32309,-5465,-32309,-5465,-32309, +-5803,-32250,-5803,-32250,-5803,-32250,-5803,-32250, +-6140,-32187,-6140,-32187,-6140,-32187,-6140,-32187, +-6477,-32121,-6477,-32121,-6477,-32121,-6477,-32121, +-6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, +-7148,-31978,-7148,-31978,-7148,-31978,-7148,-31978, +-7483,-31902,-7483,-31902,-7483,-31902,-7483,-31902, +-7817,-31822,-7817,-31822,-7817,-31822,-7817,-31822, +-8149,-31738,-8149,-31738,-8149,-31738,-8149,-31738, +-8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, +-8812,-31560,-8812,-31560,-8812,-31560,-8812,-31560, +-9142,-31466,-9142,-31466,-9142,-31466,-9142,-31466, +-9471,-31369,-9471,-31369,-9471,-31369,-9471,-31369, +-9799,-31268,-9799,-31268,-9799,-31268,-9799,-31268, +-10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, +-10452,-31056,-10452,-31056,-10452,-31056,-10452,-31056, +-10776,-30945,-10776,-30945,-10776,-30945,-10776,-30945, +-11100,-30830,-11100,-30830,-11100,-30830,-11100,-30830, +-11422,-30712,-11422,-30712,-11422,-30712,-11422,-30712, +-11743,-30591,-11743,-30591,-11743,-30591,-11743,-30591, +-12063,-30466,-12063,-30466,-12063,-30466,-12063,-30466, +-12381,-30339,-12381,-30339,-12381,-30339,-12381,-30339, +-12698,-30207,-12698,-30207,-12698,-30207,-12698,-30207, +-13014,-30073,-13014,-30073,-13014,-30073,-13014,-30073, +-13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, +-13641,-29793,-13641,-29793,-13641,-29793,-13641,-29793, +-13952,-29649,-13952,-29649,-13952,-29649,-13952,-29649, +-14262,-29501,-14262,-29501,-14262,-29501,-14262,-29501, +-14570,-29350,-14570,-29350,-14570,-29350,-14570,-29350, +-14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, +-15181,-29039,-15181,-29039,-15181,-29039,-15181,-29039, +-15485,-28878,-15485,-28878,-15485,-28878,-15485,-28878, +-15786,-28714,-15786,-28714,-15786,-28714,-15786,-28714, +-16086,-28548,-16086,-28548,-16086,-28548,-16086,-28548, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-16680,-28204,-16680,-28204,-16680,-28204,-16680,-28204, +-16975,-28028,-16975,-28028,-16975,-28028,-16975,-28028, +-17267,-27849,-17267,-27849,-17267,-27849,-17267,-27849, +-17558,-27667,-17558,-27667,-17558,-27667,-17558,-27667, +-17847,-27481,-17847,-27481,-17847,-27481,-17847,-27481, +-18133,-27293,-18133,-27293,-18133,-27293,-18133,-27293, +-18418,-27101,-18418,-27101,-18418,-27101,-18418,-27101, +-18701,-26907,-18701,-26907,-18701,-26907,-18701,-26907, +-18982,-26710,-18982,-26710,-18982,-26710,-18982,-26710, +-19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, +-19537,-26306,-19537,-26306,-19537,-26306,-19537,-26306, +-19811,-26100,-19811,-26100,-19811,-26100,-19811,-26100, +-20084,-25892,-20084,-25892,-20084,-25892,-20084,-25892, +-20354,-25680,-20354,-25680,-20354,-25680,-20354,-25680, +-20621,-25465,-20621,-25465,-20621,-25465,-20621,-25465, +-20887,-25248,-20887,-25248,-20887,-25248,-20887,-25248, +-21150,-25028,-21150,-25028,-21150,-25028,-21150,-25028, +-21411,-24805,-21411,-24805,-21411,-24805,-21411,-24805, +-21670,-24579,-21670,-24579,-21670,-24579,-21670,-24579, +-21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, +-22180,-24120,-22180,-24120,-22180,-24120,-22180,-24120, +-22431,-23887,-22431,-23887,-22431,-23887,-22431,-23887, +-22680,-23650,-22680,-23650,-22680,-23650,-22680,-23650, +-22926,-23412,-22926,-23412,-22926,-23412,-22926,-23412, +-23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, +-23412,-22926,-23412,-22926,-23412,-22926,-23412,-22926, +-23650,-22680,-23650,-22680,-23650,-22680,-23650,-22680, +-23887,-22431,-23887,-22431,-23887,-22431,-23887,-22431, +-24120,-22180,-24120,-22180,-24120,-22180,-24120,-22180, +-24351,-21926,-24351,-21926,-24351,-21926,-24351,-21926, +-24579,-21670,-24579,-21670,-24579,-21670,-24579,-21670, +-24805,-21411,-24805,-21411,-24805,-21411,-24805,-21411, +-25028,-21150,-25028,-21150,-25028,-21150,-25028,-21150, +-25248,-20887,-25248,-20887,-25248,-20887,-25248,-20887, +-25465,-20621,-25465,-20621,-25465,-20621,-25465,-20621, +-25680,-20354,-25680,-20354,-25680,-20354,-25680,-20354, +-25892,-20084,-25892,-20084,-25892,-20084,-25892,-20084, +-26100,-19811,-26100,-19811,-26100,-19811,-26100,-19811, +-26306,-19537,-26306,-19537,-26306,-19537,-26306,-19537, +-26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, +-26710,-18982,-26710,-18982,-26710,-18982,-26710,-18982, +-26907,-18701,-26907,-18701,-26907,-18701,-26907,-18701, +-27101,-18418,-27101,-18418,-27101,-18418,-27101,-18418, +-27293,-18133,-27293,-18133,-27293,-18133,-27293,-18133, +-27481,-17847,-27481,-17847,-27481,-17847,-27481,-17847, +-27667,-17558,-27667,-17558,-27667,-17558,-27667,-17558, +-27849,-17267,-27849,-17267,-27849,-17267,-27849,-17267, +-28028,-16975,-28028,-16975,-28028,-16975,-28028,-16975, +-28204,-16680,-28204,-16680,-28204,-16680,-28204,-16680, +-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, +-28548,-16086,-28548,-16086,-28548,-16086,-28548,-16086, +-28714,-15786,-28714,-15786,-28714,-15786,-28714,-15786, +-28878,-15485,-28878,-15485,-28878,-15485,-28878,-15485, +-29039,-15181,-29039,-15181,-29039,-15181,-29039,-15181, +-29196,-14876,-29196,-14876,-29196,-14876,-29196,-14876, +-29350,-14570,-29350,-14570,-29350,-14570,-29350,-14570, +-29501,-14262,-29501,-14262,-29501,-14262,-29501,-14262, +-29649,-13952,-29649,-13952,-29649,-13952,-29649,-13952, +-29793,-13641,-29793,-13641,-29793,-13641,-29793,-13641, +-29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, +-30073,-13014,-30073,-13014,-30073,-13014,-30073,-13014, +-30207,-12698,-30207,-12698,-30207,-12698,-30207,-12698, +-30339,-12381,-30339,-12381,-30339,-12381,-30339,-12381, +-30466,-12063,-30466,-12063,-30466,-12063,-30466,-12063, +-30591,-11743,-30591,-11743,-30591,-11743,-30591,-11743, +-30712,-11422,-30712,-11422,-30712,-11422,-30712,-11422, +-30830,-11100,-30830,-11100,-30830,-11100,-30830,-11100, +-30945,-10776,-30945,-10776,-30945,-10776,-30945,-10776, +-31056,-10452,-31056,-10452,-31056,-10452,-31056,-10452, +-31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, +-31268,-9799,-31268,-9799,-31268,-9799,-31268,-9799, +-31369,-9471,-31369,-9471,-31369,-9471,-31369,-9471, +-31466,-9142,-31466,-9142,-31466,-9142,-31466,-9142, +-31560,-8812,-31560,-8812,-31560,-8812,-31560,-8812, +-31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, +-31738,-8149,-31738,-8149,-31738,-8149,-31738,-8149, +-31822,-7817,-31822,-7817,-31822,-7817,-31822,-7817, +-31902,-7483,-31902,-7483,-31902,-7483,-31902,-7483, +-31978,-7148,-31978,-7148,-31978,-7148,-31978,-7148, +-32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, +-32121,-6477,-32121,-6477,-32121,-6477,-32121,-6477, +-32187,-6140,-32187,-6140,-32187,-6140,-32187,-6140, +-32250,-5803,-32250,-5803,-32250,-5803,-32250,-5803, +-32309,-5465,-32309,-5465,-32309,-5465,-32309,-5465, +-32364,-5126,-32364,-5126,-32364,-5126,-32364,-5126, +-32416,-4787,-32416,-4787,-32416,-4787,-32416,-4787, +-32464,-4447,-32464,-4447,-32464,-4447,-32464,-4447, +-32509,-4107,-32509,-4107,-32509,-4107,-32509,-4107, +-32550,-3767,-32550,-3767,-32550,-3767,-32550,-3767, +-32588,-3426,-32588,-3426,-32588,-3426,-32588,-3426, +-32622,-3084,-32622,-3084,-32622,-3084,-32622,-3084, +-32653,-2742,-32653,-2742,-32653,-2742,-32653,-2742, +-32680,-2400,-32680,-2400,-32680,-2400,-32680,-2400, +-32703,-2058,-32703,-2058,-32703,-2058,-32703,-2058, +-32723,-1715,-32723,-1715,-32723,-1715,-32723,-1715, +-32739,-1373,-32739,-1373,-32739,-1373,-32739,-1373, +-32751,-1030,-32751,-1030,-32751,-1030,-32751,-1030, +-32760,-687,-32760,-687,-32760,-687,-32760,-687, +-32766,-344,-32766,-344,-32766,-344,-32766,-344}; + +void dft600(int16_t *x,int16_t *y,unsigned char scale_flag){ // 300 x 2 + int i,j; + __m128i *x128=(__m128i *)x; + __m128i *y128=(__m128i *)y; + __m128i *tw128=(__m128i *)&twa600[0]; + __m128i x2128[600];// = (__m128i *)&x2128array[0]; + __m128i ytmp128[600];//=&ytmp128array2[0]; + + + for (i=0,j=0;i<300;i++,j+=2) { + x2128[i] = x128[j]; + x2128[i+300] = x128[j+1]; + } + + dft300((int16_t *)x2128,(int16_t *)ytmp128,0); + dft300((int16_t *)(x2128+300),(int16_t *)(ytmp128+300),0); + + + bfly2_tw1(ytmp128,ytmp128+300,y128,y128+300); + for (i=1,j=0;i<300;i++,j++) { + bfly2(ytmp128+i, + ytmp128+300+i, + y128+i, + y128+300+i, + tw128+j); + } + + if (scale_flag==1) { + norm128 = _mm_set1_epi16(dft_norm_table[8]); + + for (i=0;i<600;i++) { + y128[i] = _mm_slli_epi16(_mm_mulhi_epi16(y128[i],norm128),1); + } + } + + _mm_empty(); + _m_empty(); +}; + + +/* +Twiddles generated with + +twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:215)/648)); +twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:215)/648)); +twa2 = zeros(1,2*215); +twb2 = zeros(1,2*215); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +twb2(1:2:end) = real(twb); +twb2(2:2:end) = imag(twb); +fd=fopen("twiddle_tmp.txt","w"); +fprintf(fd,"static int16_t twa648[215*2*4] = {"); +for i=1:2:(2*214) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +fprintf(fd,"static int16_t twb648[215*2*4] = {"); +for i=1:2:(2*214) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +fclose(fd); +*/ +static int16_t twa648[215*2*4] = {32765,-318,32765,-318,32765,-318,32765,-318, +32760,-636,32760,-636,32760,-636,32760,-636, +32753,-954,32753,-954,32753,-954,32753,-954, +32742,-1271,32742,-1271,32742,-1271,32742,-1271, +32728,-1588,32728,-1588,32728,-1588,32728,-1588, +32711,-1906,32711,-1906,32711,-1906,32711,-1906, +32691,-2223,32691,-2223,32691,-2223,32691,-2223, +32668,-2540,32668,-2540,32668,-2540,32668,-2540, +32642,-2856,32642,-2856,32642,-2856,32642,-2856, +32613,-3173,32613,-3173,32613,-3173,32613,-3173, +32580,-3489,32580,-3489,32580,-3489,32580,-3489, +32545,-3805,32545,-3805,32545,-3805,32545,-3805, +32507,-4120,32507,-4120,32507,-4120,32507,-4120, +32465,-4435,32465,-4435,32465,-4435,32465,-4435, +32421,-4749,32421,-4749,32421,-4749,32421,-4749, +32373,-5064,32373,-5064,32373,-5064,32373,-5064, +32322,-5377,32322,-5377,32322,-5377,32322,-5377, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32212,-6003,32212,-6003,32212,-6003,32212,-6003, +32152,-6315,32152,-6315,32152,-6315,32152,-6315, +32090,-6627,32090,-6627,32090,-6627,32090,-6627, +32024,-6937,32024,-6937,32024,-6937,32024,-6937, +31955,-7248,31955,-7248,31955,-7248,31955,-7248, +31883,-7557,31883,-7557,31883,-7557,31883,-7557, +31808,-7866,31808,-7866,31808,-7866,31808,-7866, +31731,-8174,31731,-8174,31731,-8174,31731,-8174, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31566,-8788,31566,-8788,31566,-8788,31566,-8788, +31480,-9093,31480,-9093,31480,-9093,31480,-9093, +31390,-9398,31390,-9398,31390,-9398,31390,-9398, +31297,-9702,31297,-9702,31297,-9702,31297,-9702, +31202,-10005,31202,-10005,31202,-10005,31202,-10005, +31103,-10307,31103,-10307,31103,-10307,31103,-10307, +31002,-10608,31002,-10608,31002,-10608,31002,-10608, +30898,-10908,30898,-10908,30898,-10908,30898,-10908, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30680,-11505,30680,-11505,30680,-11505,30680,-11505, +30567,-11802,30567,-11802,30567,-11802,30567,-11802, +30451,-12098,30451,-12098,30451,-12098,30451,-12098, +30333,-12393,30333,-12393,30333,-12393,30333,-12393, +30211,-12687,30211,-12687,30211,-12687,30211,-12687, +30087,-12979,30087,-12979,30087,-12979,30087,-12979, +29959,-13270,29959,-13270,29959,-13270,29959,-13270, +29829,-13560,29829,-13560,29829,-13560,29829,-13560, +29696,-13848,29696,-13848,29696,-13848,29696,-13848, +29561,-14136,29561,-14136,29561,-14136,29561,-14136, +29422,-14422,29422,-14422,29422,-14422,29422,-14422, +29281,-14706,29281,-14706,29281,-14706,29281,-14706, +29137,-14990,29137,-14990,29137,-14990,29137,-14990, +28990,-15271,28990,-15271,28990,-15271,28990,-15271, +28841,-15552,28841,-15552,28841,-15552,28841,-15552, +28689,-15831,28689,-15831,28689,-15831,28689,-15831, +28534,-16108,28534,-16108,28534,-16108,28534,-16108, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28216,-16658,28216,-16658,28216,-16658,28216,-16658, +28054,-16931,28054,-16931,28054,-16931,28054,-16931, +27888,-17202,27888,-17202,27888,-17202,27888,-17202, +27720,-17472,27720,-17472,27720,-17472,27720,-17472, +27549,-17740,27549,-17740,27549,-17740,27549,-17740, +27376,-18006,27376,-18006,27376,-18006,27376,-18006, +27200,-18271,27200,-18271,27200,-18271,27200,-18271, +27022,-18534,27022,-18534,27022,-18534,27022,-18534, +26841,-18795,26841,-18795,26841,-18795,26841,-18795, +26657,-19054,26657,-19054,26657,-19054,26657,-19054, +26471,-19312,26471,-19312,26471,-19312,26471,-19312, +26283,-19568,26283,-19568,26283,-19568,26283,-19568, +26092,-19822,26092,-19822,26092,-19822,26092,-19822, +25898,-20074,25898,-20074,25898,-20074,25898,-20074, +25702,-20324,25702,-20324,25702,-20324,25702,-20324, +25504,-20572,25504,-20572,25504,-20572,25504,-20572, +25304,-20818,25304,-20818,25304,-20818,25304,-20818, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24895,-21305,24895,-21305,24895,-21305,24895,-21305, +24687,-21546,24687,-21546,24687,-21546,24687,-21546, +24477,-21784,24477,-21784,24477,-21784,24477,-21784, +24265,-22020,24265,-22020,24265,-22020,24265,-22020, +24050,-22254,24050,-22254,24050,-22254,24050,-22254, +23833,-22487,23833,-22487,23833,-22487,23833,-22487, +23614,-22717,23614,-22717,23614,-22717,23614,-22717, +23393,-22945,23393,-22945,23393,-22945,23393,-22945, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22944,-23394,22944,-23394,22944,-23394,22944,-23394, +22716,-23615,22716,-23615,22716,-23615,22716,-23615, +22486,-23834,22486,-23834,22486,-23834,22486,-23834, +22253,-24051,22253,-24051,22253,-24051,22253,-24051, +22019,-24266,22019,-24266,22019,-24266,22019,-24266, +21783,-24478,21783,-24478,21783,-24478,21783,-24478, +21545,-24688,21545,-24688,21545,-24688,21545,-24688, +21304,-24896,21304,-24896,21304,-24896,21304,-24896, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20817,-25305,20817,-25305,20817,-25305,20817,-25305, +20571,-25505,20571,-25505,20571,-25505,20571,-25505, +20323,-25703,20323,-25703,20323,-25703,20323,-25703, +20073,-25899,20073,-25899,20073,-25899,20073,-25899, +19821,-26093,19821,-26093,19821,-26093,19821,-26093, +19567,-26284,19567,-26284,19567,-26284,19567,-26284, +19311,-26472,19311,-26472,19311,-26472,19311,-26472, +19053,-26658,19053,-26658,19053,-26658,19053,-26658, +18794,-26842,18794,-26842,18794,-26842,18794,-26842, +18533,-27023,18533,-27023,18533,-27023,18533,-27023, +18270,-27201,18270,-27201,18270,-27201,18270,-27201, +18005,-27377,18005,-27377,18005,-27377,18005,-27377, +17739,-27550,17739,-27550,17739,-27550,17739,-27550, +17471,-27721,17471,-27721,17471,-27721,17471,-27721, +17201,-27889,17201,-27889,17201,-27889,17201,-27889, +16930,-28055,16930,-28055,16930,-28055,16930,-28055, +16657,-28217,16657,-28217,16657,-28217,16657,-28217, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +16107,-28535,16107,-28535,16107,-28535,16107,-28535, +15830,-28690,15830,-28690,15830,-28690,15830,-28690, +15551,-28842,15551,-28842,15551,-28842,15551,-28842, +15270,-28991,15270,-28991,15270,-28991,15270,-28991, +14989,-29138,14989,-29138,14989,-29138,14989,-29138, +14705,-29282,14705,-29282,14705,-29282,14705,-29282, +14421,-29423,14421,-29423,14421,-29423,14421,-29423, +14135,-29562,14135,-29562,14135,-29562,14135,-29562, +13847,-29697,13847,-29697,13847,-29697,13847,-29697, +13559,-29830,13559,-29830,13559,-29830,13559,-29830, +13269,-29960,13269,-29960,13269,-29960,13269,-29960, +12978,-30088,12978,-30088,12978,-30088,12978,-30088, +12686,-30212,12686,-30212,12686,-30212,12686,-30212, +12392,-30334,12392,-30334,12392,-30334,12392,-30334, +12097,-30452,12097,-30452,12097,-30452,12097,-30452, +11801,-30568,11801,-30568,11801,-30568,11801,-30568, +11504,-30681,11504,-30681,11504,-30681,11504,-30681, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +10907,-30899,10907,-30899,10907,-30899,10907,-30899, +10607,-31003,10607,-31003,10607,-31003,10607,-31003, +10306,-31104,10306,-31104,10306,-31104,10306,-31104, +10004,-31203,10004,-31203,10004,-31203,10004,-31203, +9701,-31298,9701,-31298,9701,-31298,9701,-31298, +9397,-31391,9397,-31391,9397,-31391,9397,-31391, +9092,-31481,9092,-31481,9092,-31481,9092,-31481, +8787,-31567,8787,-31567,8787,-31567,8787,-31567, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +8173,-31732,8173,-31732,8173,-31732,8173,-31732, +7865,-31809,7865,-31809,7865,-31809,7865,-31809, +7556,-31884,7556,-31884,7556,-31884,7556,-31884, +7247,-31956,7247,-31956,7247,-31956,7247,-31956, +6936,-32025,6936,-32025,6936,-32025,6936,-32025, +6626,-32091,6626,-32091,6626,-32091,6626,-32091, +6314,-32153,6314,-32153,6314,-32153,6314,-32153, +6002,-32213,6002,-32213,6002,-32213,6002,-32213, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5376,-32323,5376,-32323,5376,-32323,5376,-32323, +5063,-32374,5063,-32374,5063,-32374,5063,-32374, +4748,-32422,4748,-32422,4748,-32422,4748,-32422, +4434,-32466,4434,-32466,4434,-32466,4434,-32466, +4119,-32508,4119,-32508,4119,-32508,4119,-32508, +3804,-32546,3804,-32546,3804,-32546,3804,-32546, +3488,-32581,3488,-32581,3488,-32581,3488,-32581, +3172,-32614,3172,-32614,3172,-32614,3172,-32614, +2855,-32643,2855,-32643,2855,-32643,2855,-32643, +2539,-32669,2539,-32669,2539,-32669,2539,-32669, +2222,-32692,2222,-32692,2222,-32692,2222,-32692, +1905,-32712,1905,-32712,1905,-32712,1905,-32712, +1587,-32729,1587,-32729,1587,-32729,1587,-32729, +1270,-32743,1270,-32743,1270,-32743,1270,-32743, +953,-32754,953,-32754,953,-32754,953,-32754, +635,-32761,635,-32761,635,-32761,635,-32761, +317,-32766,317,-32766,317,-32766,317,-32766, +0,-32767,0,-32767,0,-32767,0,-32767, +-318,-32766,-318,-32766,-318,-32766,-318,-32766, +-636,-32761,-636,-32761,-636,-32761,-636,-32761, +-954,-32754,-954,-32754,-954,-32754,-954,-32754, +-1271,-32743,-1271,-32743,-1271,-32743,-1271,-32743, +-1588,-32729,-1588,-32729,-1588,-32729,-1588,-32729, +-1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, +-2223,-32692,-2223,-32692,-2223,-32692,-2223,-32692, +-2540,-32669,-2540,-32669,-2540,-32669,-2540,-32669, +-2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, +-3173,-32614,-3173,-32614,-3173,-32614,-3173,-32614, +-3489,-32581,-3489,-32581,-3489,-32581,-3489,-32581, +-3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, +-4120,-32508,-4120,-32508,-4120,-32508,-4120,-32508, +-4435,-32466,-4435,-32466,-4435,-32466,-4435,-32466, +-4749,-32422,-4749,-32422,-4749,-32422,-4749,-32422, +-5064,-32374,-5064,-32374,-5064,-32374,-5064,-32374, +-5377,-32323,-5377,-32323,-5377,-32323,-5377,-32323, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-6003,-32213,-6003,-32213,-6003,-32213,-6003,-32213, +-6315,-32153,-6315,-32153,-6315,-32153,-6315,-32153, +-6627,-32091,-6627,-32091,-6627,-32091,-6627,-32091, +-6937,-32025,-6937,-32025,-6937,-32025,-6937,-32025, +-7248,-31956,-7248,-31956,-7248,-31956,-7248,-31956, +-7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, +-7866,-31809,-7866,-31809,-7866,-31809,-7866,-31809, +-8174,-31732,-8174,-31732,-8174,-31732,-8174,-31732, +-8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, +-8788,-31567,-8788,-31567,-8788,-31567,-8788,-31567, +-9093,-31481,-9093,-31481,-9093,-31481,-9093,-31481, +-9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, +-9702,-31298,-9702,-31298,-9702,-31298,-9702,-31298, +-10005,-31203,-10005,-31203,-10005,-31203,-10005,-31203, +-10307,-31104,-10307,-31104,-10307,-31104,-10307,-31104, +-10608,-31003,-10608,-31003,-10608,-31003,-10608,-31003, +-10908,-30899,-10908,-30899,-10908,-30899,-10908,-30899, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-11505,-30681,-11505,-30681,-11505,-30681,-11505,-30681, +-11802,-30568,-11802,-30568,-11802,-30568,-11802,-30568, +-12098,-30452,-12098,-30452,-12098,-30452,-12098,-30452, +-12393,-30334,-12393,-30334,-12393,-30334,-12393,-30334, +-12687,-30212,-12687,-30212,-12687,-30212,-12687,-30212, +-12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, +-13270,-29960,-13270,-29960,-13270,-29960,-13270,-29960, +-13560,-29830,-13560,-29830,-13560,-29830,-13560,-29830, +-13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, +-14136,-29562,-14136,-29562,-14136,-29562,-14136,-29562, +-14422,-29423,-14422,-29423,-14422,-29423,-14422,-29423, +-14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, +-14990,-29138,-14990,-29138,-14990,-29138,-14990,-29138, +-15271,-28991,-15271,-28991,-15271,-28991,-15271,-28991, +-15552,-28842,-15552,-28842,-15552,-28842,-15552,-28842, +-15831,-28690,-15831,-28690,-15831,-28690,-15831,-28690, +-16108,-28535,-16108,-28535,-16108,-28535,-16108,-28535}; +static int16_t twb648[215*2*4] = {32760,-636,32760,-636,32760,-636,32760,-636, +32742,-1271,32742,-1271,32742,-1271,32742,-1271, +32711,-1906,32711,-1906,32711,-1906,32711,-1906, +32668,-2540,32668,-2540,32668,-2540,32668,-2540, +32613,-3173,32613,-3173,32613,-3173,32613,-3173, +32545,-3805,32545,-3805,32545,-3805,32545,-3805, +32465,-4435,32465,-4435,32465,-4435,32465,-4435, +32373,-5064,32373,-5064,32373,-5064,32373,-5064, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32152,-6315,32152,-6315,32152,-6315,32152,-6315, +32024,-6937,32024,-6937,32024,-6937,32024,-6937, +31883,-7557,31883,-7557,31883,-7557,31883,-7557, +31731,-8174,31731,-8174,31731,-8174,31731,-8174, +31566,-8788,31566,-8788,31566,-8788,31566,-8788, +31390,-9398,31390,-9398,31390,-9398,31390,-9398, +31202,-10005,31202,-10005,31202,-10005,31202,-10005, +31002,-10608,31002,-10608,31002,-10608,31002,-10608, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30567,-11802,30567,-11802,30567,-11802,30567,-11802, +30333,-12393,30333,-12393,30333,-12393,30333,-12393, +30087,-12979,30087,-12979,30087,-12979,30087,-12979, +29829,-13560,29829,-13560,29829,-13560,29829,-13560, +29561,-14136,29561,-14136,29561,-14136,29561,-14136, +29281,-14706,29281,-14706,29281,-14706,29281,-14706, +28990,-15271,28990,-15271,28990,-15271,28990,-15271, +28689,-15831,28689,-15831,28689,-15831,28689,-15831, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28054,-16931,28054,-16931,28054,-16931,28054,-16931, +27720,-17472,27720,-17472,27720,-17472,27720,-17472, +27376,-18006,27376,-18006,27376,-18006,27376,-18006, +27022,-18534,27022,-18534,27022,-18534,27022,-18534, +26657,-19054,26657,-19054,26657,-19054,26657,-19054, +26283,-19568,26283,-19568,26283,-19568,26283,-19568, +25898,-20074,25898,-20074,25898,-20074,25898,-20074, +25504,-20572,25504,-20572,25504,-20572,25504,-20572, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24687,-21546,24687,-21546,24687,-21546,24687,-21546, +24265,-22020,24265,-22020,24265,-22020,24265,-22020, +23833,-22487,23833,-22487,23833,-22487,23833,-22487, +23393,-22945,23393,-22945,23393,-22945,23393,-22945, +22944,-23394,22944,-23394,22944,-23394,22944,-23394, +22486,-23834,22486,-23834,22486,-23834,22486,-23834, +22019,-24266,22019,-24266,22019,-24266,22019,-24266, +21545,-24688,21545,-24688,21545,-24688,21545,-24688, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20571,-25505,20571,-25505,20571,-25505,20571,-25505, +20073,-25899,20073,-25899,20073,-25899,20073,-25899, +19567,-26284,19567,-26284,19567,-26284,19567,-26284, +19053,-26658,19053,-26658,19053,-26658,19053,-26658, +18533,-27023,18533,-27023,18533,-27023,18533,-27023, +18005,-27377,18005,-27377,18005,-27377,18005,-27377, +17471,-27721,17471,-27721,17471,-27721,17471,-27721, +16930,-28055,16930,-28055,16930,-28055,16930,-28055, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15830,-28690,15830,-28690,15830,-28690,15830,-28690, +15270,-28991,15270,-28991,15270,-28991,15270,-28991, +14705,-29282,14705,-29282,14705,-29282,14705,-29282, +14135,-29562,14135,-29562,14135,-29562,14135,-29562, +13559,-29830,13559,-29830,13559,-29830,13559,-29830, +12978,-30088,12978,-30088,12978,-30088,12978,-30088, +12392,-30334,12392,-30334,12392,-30334,12392,-30334, +11801,-30568,11801,-30568,11801,-30568,11801,-30568, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +10607,-31003,10607,-31003,10607,-31003,10607,-31003, +10004,-31203,10004,-31203,10004,-31203,10004,-31203, +9397,-31391,9397,-31391,9397,-31391,9397,-31391, +8787,-31567,8787,-31567,8787,-31567,8787,-31567, +8173,-31732,8173,-31732,8173,-31732,8173,-31732, +7556,-31884,7556,-31884,7556,-31884,7556,-31884, +6936,-32025,6936,-32025,6936,-32025,6936,-32025, +6314,-32153,6314,-32153,6314,-32153,6314,-32153, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5063,-32374,5063,-32374,5063,-32374,5063,-32374, +4434,-32466,4434,-32466,4434,-32466,4434,-32466, +3804,-32546,3804,-32546,3804,-32546,3804,-32546, +3172,-32614,3172,-32614,3172,-32614,3172,-32614, +2539,-32669,2539,-32669,2539,-32669,2539,-32669, +1905,-32712,1905,-32712,1905,-32712,1905,-32712, +1270,-32743,1270,-32743,1270,-32743,1270,-32743, +635,-32761,635,-32761,635,-32761,635,-32761, +0,-32767,0,-32767,0,-32767,0,-32767, +-636,-32761,-636,-32761,-636,-32761,-636,-32761, +-1271,-32743,-1271,-32743,-1271,-32743,-1271,-32743, +-1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, +-2540,-32669,-2540,-32669,-2540,-32669,-2540,-32669, +-3173,-32614,-3173,-32614,-3173,-32614,-3173,-32614, +-3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, +-4435,-32466,-4435,-32466,-4435,-32466,-4435,-32466, +-5064,-32374,-5064,-32374,-5064,-32374,-5064,-32374, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-6315,-32153,-6315,-32153,-6315,-32153,-6315,-32153, +-6937,-32025,-6937,-32025,-6937,-32025,-6937,-32025, +-7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, +-8174,-31732,-8174,-31732,-8174,-31732,-8174,-31732, +-8788,-31567,-8788,-31567,-8788,-31567,-8788,-31567, +-9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, +-10005,-31203,-10005,-31203,-10005,-31203,-10005,-31203, +-10608,-31003,-10608,-31003,-10608,-31003,-10608,-31003, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-11802,-30568,-11802,-30568,-11802,-30568,-11802,-30568, +-12393,-30334,-12393,-30334,-12393,-30334,-12393,-30334, +-12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, +-13560,-29830,-13560,-29830,-13560,-29830,-13560,-29830, +-14136,-29562,-14136,-29562,-14136,-29562,-14136,-29562, +-14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, +-15271,-28991,-15271,-28991,-15271,-28991,-15271,-28991, +-15831,-28690,-15831,-28690,-15831,-28690,-15831,-28690, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-16931,-28055,-16931,-28055,-16931,-28055,-16931,-28055, +-17472,-27721,-17472,-27721,-17472,-27721,-17472,-27721, +-18006,-27377,-18006,-27377,-18006,-27377,-18006,-27377, +-18534,-27023,-18534,-27023,-18534,-27023,-18534,-27023, +-19054,-26658,-19054,-26658,-19054,-26658,-19054,-26658, +-19568,-26284,-19568,-26284,-19568,-26284,-19568,-26284, +-20074,-25899,-20074,-25899,-20074,-25899,-20074,-25899, +-20572,-25505,-20572,-25505,-20572,-25505,-20572,-25505, +-21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, +-21546,-24688,-21546,-24688,-21546,-24688,-21546,-24688, +-22020,-24266,-22020,-24266,-22020,-24266,-22020,-24266, +-22487,-23834,-22487,-23834,-22487,-23834,-22487,-23834, +-22945,-23394,-22945,-23394,-22945,-23394,-22945,-23394, +-23394,-22945,-23394,-22945,-23394,-22945,-23394,-22945, +-23834,-22487,-23834,-22487,-23834,-22487,-23834,-22487, +-24266,-22020,-24266,-22020,-24266,-22020,-24266,-22020, +-24688,-21546,-24688,-21546,-24688,-21546,-24688,-21546, +-25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, +-25505,-20572,-25505,-20572,-25505,-20572,-25505,-20572, +-25899,-20074,-25899,-20074,-25899,-20074,-25899,-20074, +-26284,-19568,-26284,-19568,-26284,-19568,-26284,-19568, +-26658,-19054,-26658,-19054,-26658,-19054,-26658,-19054, +-27023,-18534,-27023,-18534,-27023,-18534,-27023,-18534, +-27377,-18006,-27377,-18006,-27377,-18006,-27377,-18006, +-27721,-17472,-27721,-17472,-27721,-17472,-27721,-17472, +-28055,-16931,-28055,-16931,-28055,-16931,-28055,-16931, +-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, +-28690,-15831,-28690,-15831,-28690,-15831,-28690,-15831, +-28991,-15271,-28991,-15271,-28991,-15271,-28991,-15271, +-29282,-14706,-29282,-14706,-29282,-14706,-29282,-14706, +-29562,-14136,-29562,-14136,-29562,-14136,-29562,-14136, +-29830,-13560,-29830,-13560,-29830,-13560,-29830,-13560, +-30088,-12979,-30088,-12979,-30088,-12979,-30088,-12979, +-30334,-12393,-30334,-12393,-30334,-12393,-30334,-12393, +-30568,-11802,-30568,-11802,-30568,-11802,-30568,-11802, +-30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, +-31003,-10608,-31003,-10608,-31003,-10608,-31003,-10608, +-31203,-10005,-31203,-10005,-31203,-10005,-31203,-10005, +-31391,-9398,-31391,-9398,-31391,-9398,-31391,-9398, +-31567,-8788,-31567,-8788,-31567,-8788,-31567,-8788, +-31732,-8174,-31732,-8174,-31732,-8174,-31732,-8174, +-31884,-7557,-31884,-7557,-31884,-7557,-31884,-7557, +-32025,-6937,-32025,-6937,-32025,-6937,-32025,-6937, +-32153,-6315,-32153,-6315,-32153,-6315,-32153,-6315, +-32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, +-32374,-5064,-32374,-5064,-32374,-5064,-32374,-5064, +-32466,-4435,-32466,-4435,-32466,-4435,-32466,-4435, +-32546,-3805,-32546,-3805,-32546,-3805,-32546,-3805, +-32614,-3173,-32614,-3173,-32614,-3173,-32614,-3173, +-32669,-2540,-32669,-2540,-32669,-2540,-32669,-2540, +-32712,-1906,-32712,-1906,-32712,-1906,-32712,-1906, +-32743,-1271,-32743,-1271,-32743,-1271,-32743,-1271, +-32761,-636,-32761,-636,-32761,-636,-32761,-636, +-32767,-1,-32767,-1,-32767,-1,-32767,-1, +-32761,635,-32761,635,-32761,635,-32761,635, +-32743,1270,-32743,1270,-32743,1270,-32743,1270, +-32712,1905,-32712,1905,-32712,1905,-32712,1905, +-32669,2539,-32669,2539,-32669,2539,-32669,2539, +-32614,3172,-32614,3172,-32614,3172,-32614,3172, +-32546,3804,-32546,3804,-32546,3804,-32546,3804, +-32466,4434,-32466,4434,-32466,4434,-32466,4434, +-32374,5063,-32374,5063,-32374,5063,-32374,5063, +-32270,5689,-32270,5689,-32270,5689,-32270,5689, +-32153,6314,-32153,6314,-32153,6314,-32153,6314, +-32025,6936,-32025,6936,-32025,6936,-32025,6936, +-31884,7556,-31884,7556,-31884,7556,-31884,7556, +-31732,8173,-31732,8173,-31732,8173,-31732,8173, +-31567,8787,-31567,8787,-31567,8787,-31567,8787, +-31391,9397,-31391,9397,-31391,9397,-31391,9397, +-31203,10004,-31203,10004,-31203,10004,-31203,10004, +-31003,10607,-31003,10607,-31003,10607,-31003,10607, +-30791,11206,-30791,11206,-30791,11206,-30791,11206, +-30568,11801,-30568,11801,-30568,11801,-30568,11801, +-30334,12392,-30334,12392,-30334,12392,-30334,12392, +-30088,12978,-30088,12978,-30088,12978,-30088,12978, +-29830,13559,-29830,13559,-29830,13559,-29830,13559, +-29562,14135,-29562,14135,-29562,14135,-29562,14135, +-29282,14705,-29282,14705,-29282,14705,-29282,14705, +-28991,15270,-28991,15270,-28991,15270,-28991,15270, +-28690,15830,-28690,15830,-28690,15830,-28690,15830, +-28378,16383,-28378,16383,-28378,16383,-28378,16383, +-28055,16930,-28055,16930,-28055,16930,-28055,16930, +-27721,17471,-27721,17471,-27721,17471,-27721,17471, +-27377,18005,-27377,18005,-27377,18005,-27377,18005, +-27023,18533,-27023,18533,-27023,18533,-27023,18533, +-26658,19053,-26658,19053,-26658,19053,-26658,19053, +-26284,19567,-26284,19567,-26284,19567,-26284,19567, +-25899,20073,-25899,20073,-25899,20073,-25899,20073, +-25505,20571,-25505,20571,-25505,20571,-25505,20571, +-25101,21062,-25101,21062,-25101,21062,-25101,21062, +-24688,21545,-24688,21545,-24688,21545,-24688,21545, +-24266,22019,-24266,22019,-24266,22019,-24266,22019, +-23834,22486,-23834,22486,-23834,22486,-23834,22486, +-23394,22944,-23394,22944,-23394,22944,-23394,22944, +-22945,23393,-22945,23393,-22945,23393,-22945,23393, +-22487,23833,-22487,23833,-22487,23833,-22487,23833, +-22020,24265,-22020,24265,-22020,24265,-22020,24265, +-21546,24687,-21546,24687,-21546,24687,-21546,24687, +-21063,25100,-21063,25100,-21063,25100,-21063,25100, +-20572,25504,-20572,25504,-20572,25504,-20572,25504, +-20074,25898,-20074,25898,-20074,25898,-20074,25898, +-19568,26283,-19568,26283,-19568,26283,-19568,26283, +-19054,26657,-19054,26657,-19054,26657,-19054,26657, +-18534,27022,-18534,27022,-18534,27022,-18534,27022, +-18006,27376,-18006,27376,-18006,27376,-18006,27376, +-17472,27720,-17472,27720,-17472,27720,-17472,27720, +-16931,28054,-16931,28054,-16931,28054,-16931,28054}; + +void dft648(int16_t *x,int16_t *y,unsigned char scale_flag){ // 216 x 3 + int i,j; + __m128i *x128=(__m128i *)x; + __m128i *y128=(__m128i *)y; + __m128i *twa128=(__m128i *)&twa648[0]; + __m128i *twb128=(__m128i *)&twb648[0]; + __m128i x2128[648];// = (__m128i *)&x2128array[0]; + __m128i ytmp128[648];//=&ytmp128array3[0]; + + + + for (i=0,j=0;i<216;i++,j+=3) { + x2128[i] = x128[j]; + x2128[i+216] = x128[j+1]; + x2128[i+432] = x128[j+2]; + } + + dft96((int16_t *)x2128,(int16_t *)ytmp128,1); + dft96((int16_t *)(x2128+216),(int16_t *)(ytmp128+216),1); + dft96((int16_t *)(x2128+432),(int16_t *)(ytmp128+432),1); + + bfly3_tw1(ytmp128,ytmp128+216,ytmp128+432,y128,y128+216,y128+432); + for (i=1,j=0;i<216;i++,j++) { + bfly3(ytmp128+i, + ytmp128+216+i, + ytmp128+432+i, + y128+i, + y128+216+i, + y128+432+i, + twa128+j, + twb128+j); + } + + if (scale_flag==1) { + norm128 = _mm_set1_epi16(dft_norm_table[14]); + + for (i=0;i<648;i++) { + y128[i] = _mm_slli_epi16(_mm_mulhi_epi16(y128[i],norm128),1); + } + } + + _mm_empty(); + _m_empty(); + +}; + + +/* Twiddles generated with +twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:179)/720)); +twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:179)/720)); +twc = floor(32767*exp(-sqrt(-1)*2*pi*3*(1:179)/720)); +twa2 = zeros(1,2*179); +twb2 = zeros(1,2*179); +twc2 = zeros(1,2*179); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +twb2(1:2:end) = real(twb); +twb2(2:2:end) = imag(twb); +twc2(1:2:end) = real(twc); +twc2(2:2:end) = imag(twc); +fd=fopen("twiddle_tmp.txt","w"); +fprintf(fd,"static int16_t twa720[179*2*4] = {"); +for i=1:2:(2*178) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +fprintf(fd,"\nstatic int16_t twb720[179*2*4] = {"); +for i=1:2:(2*178) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +fprintf(fd,"\nstatic int16_t twc720[179*2*4] = {"); +for i=1:2:(2*178) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); +fclose(fd); + */ + +static int16_t twa720[179*2*4] = {32765,-286,32765,-286,32765,-286,32765,-286, +32762,-572,32762,-572,32762,-572,32762,-572, +32755,-858,32755,-858,32755,-858,32755,-858, +32747,-1144,32747,-1144,32747,-1144,32747,-1144, +32735,-1430,32735,-1430,32735,-1430,32735,-1430, +32722,-1715,32722,-1715,32722,-1715,32722,-1715, +32705,-2001,32705,-2001,32705,-2001,32705,-2001, +32687,-2286,32687,-2286,32687,-2286,32687,-2286, +32665,-2571,32665,-2571,32665,-2571,32665,-2571, +32642,-2856,32642,-2856,32642,-2856,32642,-2856, +32616,-3141,32616,-3141,32616,-3141,32616,-3141, +32587,-3426,32587,-3426,32587,-3426,32587,-3426, +32556,-3710,32556,-3710,32556,-3710,32556,-3710, +32522,-3994,32522,-3994,32522,-3994,32522,-3994, +32486,-4277,32486,-4277,32486,-4277,32486,-4277, +32448,-4561,32448,-4561,32448,-4561,32448,-4561, +32407,-4844,32407,-4844,32407,-4844,32407,-4844, +32363,-5126,32363,-5126,32363,-5126,32363,-5126, +32317,-5409,32317,-5409,32317,-5409,32317,-5409, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32218,-5972,32218,-5972,32218,-5972,32218,-5972, +32164,-6253,32164,-6253,32164,-6253,32164,-6253, +32109,-6533,32109,-6533,32109,-6533,32109,-6533, +32050,-6813,32050,-6813,32050,-6813,32050,-6813, +31990,-7093,31990,-7093,31990,-7093,31990,-7093, +31927,-7371,31927,-7371,31927,-7371,31927,-7371, +31861,-7650,31861,-7650,31861,-7650,31861,-7650, +31793,-7928,31793,-7928,31793,-7928,31793,-7928, +31723,-8205,31723,-8205,31723,-8205,31723,-8205, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31575,-8757,31575,-8757,31575,-8757,31575,-8757, +31497,-9032,31497,-9032,31497,-9032,31497,-9032, +31417,-9307,31417,-9307,31417,-9307,31417,-9307, +31335,-9581,31335,-9581,31335,-9581,31335,-9581, +31250,-9854,31250,-9854,31250,-9854,31250,-9854, +31163,-10126,31163,-10126,31163,-10126,31163,-10126, +31073,-10398,31073,-10398,31073,-10398,31073,-10398, +30981,-10668,30981,-10668,30981,-10668,30981,-10668, +30887,-10938,30887,-10938,30887,-10938,30887,-10938, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30691,-11476,30691,-11476,30691,-11476,30691,-11476, +30590,-11743,30590,-11743,30590,-11743,30590,-11743, +30486,-12010,30486,-12010,30486,-12010,30486,-12010, +30381,-12275,30381,-12275,30381,-12275,30381,-12275, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +30162,-12804,30162,-12804,30162,-12804,30162,-12804, +30049,-13066,30049,-13066,30049,-13066,30049,-13066, +29934,-13328,29934,-13328,29934,-13328,29934,-13328, +29816,-13589,29816,-13589,29816,-13589,29816,-13589, +29696,-13848,29696,-13848,29696,-13848,29696,-13848, +29575,-14107,29575,-14107,29575,-14107,29575,-14107, +29450,-14365,29450,-14365,29450,-14365,29450,-14365, +29324,-14621,29324,-14621,29324,-14621,29324,-14621, +29195,-14876,29195,-14876,29195,-14876,29195,-14876, +29064,-15131,29064,-15131,29064,-15131,29064,-15131, +28931,-15384,28931,-15384,28931,-15384,28931,-15384, +28796,-15636,28796,-15636,28796,-15636,28796,-15636, +28658,-15886,28658,-15886,28658,-15886,28658,-15886, +28518,-16136,28518,-16136,28518,-16136,28518,-16136, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28233,-16631,28233,-16631,28233,-16631,28233,-16631, +28086,-16877,28086,-16877,28086,-16877,28086,-16877, +27938,-17121,27938,-17121,27938,-17121,27938,-17121, +27787,-17364,27787,-17364,27787,-17364,27787,-17364, +27635,-17606,27635,-17606,27635,-17606,27635,-17606, +27480,-17847,27480,-17847,27480,-17847,27480,-17847, +27323,-18086,27323,-18086,27323,-18086,27323,-18086, +27165,-18324,27165,-18324,27165,-18324,27165,-18324, +27004,-18560,27004,-18560,27004,-18560,27004,-18560, +26841,-18795,26841,-18795,26841,-18795,26841,-18795, +26676,-19028,26676,-19028,26676,-19028,26676,-19028, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +26339,-19491,26339,-19491,26339,-19491,26339,-19491, +26168,-19720,26168,-19720,26168,-19720,26168,-19720, +25995,-19948,25995,-19948,25995,-19948,25995,-19948, +25820,-20174,25820,-20174,25820,-20174,25820,-20174, +25643,-20398,25643,-20398,25643,-20398,25643,-20398, +25464,-20621,25464,-20621,25464,-20621,25464,-20621, +25283,-20843,25283,-20843,25283,-20843,25283,-20843, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24916,-21281,24916,-21281,24916,-21281,24916,-21281, +24729,-21498,24729,-21498,24729,-21498,24729,-21498, +24541,-21713,24541,-21713,24541,-21713,24541,-21713, +24350,-21926,24350,-21926,24350,-21926,24350,-21926, +24158,-22138,24158,-22138,24158,-22138,24158,-22138, +23964,-22348,23964,-22348,23964,-22348,23964,-22348, +23768,-22556,23768,-22556,23768,-22556,23768,-22556, +23570,-22762,23570,-22762,23570,-22762,23570,-22762, +23371,-22967,23371,-22967,23371,-22967,23371,-22967, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22966,-23372,22966,-23372,22966,-23372,22966,-23372, +22761,-23571,22761,-23571,22761,-23571,22761,-23571, +22555,-23769,22555,-23769,22555,-23769,22555,-23769, +22347,-23965,22347,-23965,22347,-23965,22347,-23965, +22137,-24159,22137,-24159,22137,-24159,22137,-24159, +21925,-24351,21925,-24351,21925,-24351,21925,-24351, +21712,-24542,21712,-24542,21712,-24542,21712,-24542, +21497,-24730,21497,-24730,21497,-24730,21497,-24730, +21280,-24917,21280,-24917,21280,-24917,21280,-24917, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20842,-25284,20842,-25284,20842,-25284,20842,-25284, +20620,-25465,20620,-25465,20620,-25465,20620,-25465, +20397,-25644,20397,-25644,20397,-25644,20397,-25644, +20173,-25821,20173,-25821,20173,-25821,20173,-25821, +19947,-25996,19947,-25996,19947,-25996,19947,-25996, +19719,-26169,19719,-26169,19719,-26169,19719,-26169, +19490,-26340,19490,-26340,19490,-26340,19490,-26340, +19259,-26510,19259,-26510,19259,-26510,19259,-26510, +19027,-26677,19027,-26677,19027,-26677,19027,-26677, +18794,-26842,18794,-26842,18794,-26842,18794,-26842, +18559,-27005,18559,-27005,18559,-27005,18559,-27005, +18323,-27166,18323,-27166,18323,-27166,18323,-27166, +18085,-27324,18085,-27324,18085,-27324,18085,-27324, +17846,-27481,17846,-27481,17846,-27481,17846,-27481, +17605,-27636,17605,-27636,17605,-27636,17605,-27636, +17363,-27788,17363,-27788,17363,-27788,17363,-27788, +17120,-27939,17120,-27939,17120,-27939,17120,-27939, +16876,-28087,16876,-28087,16876,-28087,16876,-28087, +16630,-28234,16630,-28234,16630,-28234,16630,-28234, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +16135,-28519,16135,-28519,16135,-28519,16135,-28519, +15885,-28659,15885,-28659,15885,-28659,15885,-28659, +15635,-28797,15635,-28797,15635,-28797,15635,-28797, +15383,-28932,15383,-28932,15383,-28932,15383,-28932, +15130,-29065,15130,-29065,15130,-29065,15130,-29065, +14875,-29196,14875,-29196,14875,-29196,14875,-29196, +14620,-29325,14620,-29325,14620,-29325,14620,-29325, +14364,-29451,14364,-29451,14364,-29451,14364,-29451, +14106,-29576,14106,-29576,14106,-29576,14106,-29576, +13847,-29697,13847,-29697,13847,-29697,13847,-29697, +13588,-29817,13588,-29817,13588,-29817,13588,-29817, +13327,-29935,13327,-29935,13327,-29935,13327,-29935, +13065,-30050,13065,-30050,13065,-30050,13065,-30050, +12803,-30163,12803,-30163,12803,-30163,12803,-30163, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +12274,-30382,12274,-30382,12274,-30382,12274,-30382, +12009,-30487,12009,-30487,12009,-30487,12009,-30487, +11742,-30591,11742,-30591,11742,-30591,11742,-30591, +11475,-30692,11475,-30692,11475,-30692,11475,-30692, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +10937,-30888,10937,-30888,10937,-30888,10937,-30888, +10667,-30982,10667,-30982,10667,-30982,10667,-30982, +10397,-31074,10397,-31074,10397,-31074,10397,-31074, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +9853,-31251,9853,-31251,9853,-31251,9853,-31251, +9580,-31336,9580,-31336,9580,-31336,9580,-31336, +9306,-31418,9306,-31418,9306,-31418,9306,-31418, +9031,-31498,9031,-31498,9031,-31498,9031,-31498, +8756,-31576,8756,-31576,8756,-31576,8756,-31576, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +8204,-31724,8204,-31724,8204,-31724,8204,-31724, +7927,-31794,7927,-31794,7927,-31794,7927,-31794, +7649,-31862,7649,-31862,7649,-31862,7649,-31862, +7370,-31928,7370,-31928,7370,-31928,7370,-31928, +7092,-31991,7092,-31991,7092,-31991,7092,-31991, +6812,-32051,6812,-32051,6812,-32051,6812,-32051, +6532,-32110,6532,-32110,6532,-32110,6532,-32110, +6252,-32165,6252,-32165,6252,-32165,6252,-32165, +5971,-32219,5971,-32219,5971,-32219,5971,-32219, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5408,-32318,5408,-32318,5408,-32318,5408,-32318, +5125,-32364,5125,-32364,5125,-32364,5125,-32364, +4843,-32408,4843,-32408,4843,-32408,4843,-32408, +4560,-32449,4560,-32449,4560,-32449,4560,-32449, +4276,-32487,4276,-32487,4276,-32487,4276,-32487, +3993,-32523,3993,-32523,3993,-32523,3993,-32523, +3709,-32557,3709,-32557,3709,-32557,3709,-32557, +3425,-32588,3425,-32588,3425,-32588,3425,-32588, +3140,-32617,3140,-32617,3140,-32617,3140,-32617, +2855,-32643,2855,-32643,2855,-32643,2855,-32643, +2570,-32666,2570,-32666,2570,-32666,2570,-32666, +2285,-32688,2285,-32688,2285,-32688,2285,-32688, +2000,-32706,2000,-32706,2000,-32706,2000,-32706, +1714,-32723,1714,-32723,1714,-32723,1714,-32723, +1429,-32736,1429,-32736,1429,-32736,1429,-32736, +1143,-32748,1143,-32748,1143,-32748,1143,-32748, +857,-32756,857,-32756,857,-32756,857,-32756, +571,-32763,571,-32763,571,-32763,571,-32763, +285,-32766,285,-32766,285,-32766,285,-32766}; + +static int16_t twb720[179*2*4] = {32762,-572,32762,-572,32762,-572,32762,-572, +32747,-1144,32747,-1144,32747,-1144,32747,-1144, +32722,-1715,32722,-1715,32722,-1715,32722,-1715, +32687,-2286,32687,-2286,32687,-2286,32687,-2286, +32642,-2856,32642,-2856,32642,-2856,32642,-2856, +32587,-3426,32587,-3426,32587,-3426,32587,-3426, +32522,-3994,32522,-3994,32522,-3994,32522,-3994, +32448,-4561,32448,-4561,32448,-4561,32448,-4561, +32363,-5126,32363,-5126,32363,-5126,32363,-5126, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32164,-6253,32164,-6253,32164,-6253,32164,-6253, +32050,-6813,32050,-6813,32050,-6813,32050,-6813, +31927,-7371,31927,-7371,31927,-7371,31927,-7371, +31793,-7928,31793,-7928,31793,-7928,31793,-7928, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31497,-9032,31497,-9032,31497,-9032,31497,-9032, +31335,-9581,31335,-9581,31335,-9581,31335,-9581, +31163,-10126,31163,-10126,31163,-10126,31163,-10126, +30981,-10668,30981,-10668,30981,-10668,30981,-10668, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30590,-11743,30590,-11743,30590,-11743,30590,-11743, +30381,-12275,30381,-12275,30381,-12275,30381,-12275, +30162,-12804,30162,-12804,30162,-12804,30162,-12804, +29934,-13328,29934,-13328,29934,-13328,29934,-13328, +29696,-13848,29696,-13848,29696,-13848,29696,-13848, +29450,-14365,29450,-14365,29450,-14365,29450,-14365, +29195,-14876,29195,-14876,29195,-14876,29195,-14876, +28931,-15384,28931,-15384,28931,-15384,28931,-15384, +28658,-15886,28658,-15886,28658,-15886,28658,-15886, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28086,-16877,28086,-16877,28086,-16877,28086,-16877, +27787,-17364,27787,-17364,27787,-17364,27787,-17364, +27480,-17847,27480,-17847,27480,-17847,27480,-17847, +27165,-18324,27165,-18324,27165,-18324,27165,-18324, +26841,-18795,26841,-18795,26841,-18795,26841,-18795, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +26168,-19720,26168,-19720,26168,-19720,26168,-19720, +25820,-20174,25820,-20174,25820,-20174,25820,-20174, +25464,-20621,25464,-20621,25464,-20621,25464,-20621, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24729,-21498,24729,-21498,24729,-21498,24729,-21498, +24350,-21926,24350,-21926,24350,-21926,24350,-21926, +23964,-22348,23964,-22348,23964,-22348,23964,-22348, +23570,-22762,23570,-22762,23570,-22762,23570,-22762, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22761,-23571,22761,-23571,22761,-23571,22761,-23571, +22347,-23965,22347,-23965,22347,-23965,22347,-23965, +21925,-24351,21925,-24351,21925,-24351,21925,-24351, +21497,-24730,21497,-24730,21497,-24730,21497,-24730, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20620,-25465,20620,-25465,20620,-25465,20620,-25465, +20173,-25821,20173,-25821,20173,-25821,20173,-25821, +19719,-26169,19719,-26169,19719,-26169,19719,-26169, +19259,-26510,19259,-26510,19259,-26510,19259,-26510, +18794,-26842,18794,-26842,18794,-26842,18794,-26842, +18323,-27166,18323,-27166,18323,-27166,18323,-27166, +17846,-27481,17846,-27481,17846,-27481,17846,-27481, +17363,-27788,17363,-27788,17363,-27788,17363,-27788, +16876,-28087,16876,-28087,16876,-28087,16876,-28087, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15885,-28659,15885,-28659,15885,-28659,15885,-28659, +15383,-28932,15383,-28932,15383,-28932,15383,-28932, +14875,-29196,14875,-29196,14875,-29196,14875,-29196, +14364,-29451,14364,-29451,14364,-29451,14364,-29451, +13847,-29697,13847,-29697,13847,-29697,13847,-29697, +13327,-29935,13327,-29935,13327,-29935,13327,-29935, +12803,-30163,12803,-30163,12803,-30163,12803,-30163, +12274,-30382,12274,-30382,12274,-30382,12274,-30382, +11742,-30591,11742,-30591,11742,-30591,11742,-30591, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +10667,-30982,10667,-30982,10667,-30982,10667,-30982, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +9580,-31336,9580,-31336,9580,-31336,9580,-31336, +9031,-31498,9031,-31498,9031,-31498,9031,-31498, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +7927,-31794,7927,-31794,7927,-31794,7927,-31794, +7370,-31928,7370,-31928,7370,-31928,7370,-31928, +6812,-32051,6812,-32051,6812,-32051,6812,-32051, +6252,-32165,6252,-32165,6252,-32165,6252,-32165, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5125,-32364,5125,-32364,5125,-32364,5125,-32364, +4560,-32449,4560,-32449,4560,-32449,4560,-32449, +3993,-32523,3993,-32523,3993,-32523,3993,-32523, +3425,-32588,3425,-32588,3425,-32588,3425,-32588, +2855,-32643,2855,-32643,2855,-32643,2855,-32643, +2285,-32688,2285,-32688,2285,-32688,2285,-32688, +1714,-32723,1714,-32723,1714,-32723,1714,-32723, +1143,-32748,1143,-32748,1143,-32748,1143,-32748, +571,-32763,571,-32763,571,-32763,571,-32763, +0,-32767,0,-32767,0,-32767,0,-32767, +-572,-32763,-572,-32763,-572,-32763,-572,-32763, +-1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, +-1715,-32723,-1715,-32723,-1715,-32723,-1715,-32723, +-2286,-32688,-2286,-32688,-2286,-32688,-2286,-32688, +-2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, +-3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, +-3994,-32523,-3994,-32523,-3994,-32523,-3994,-32523, +-4561,-32449,-4561,-32449,-4561,-32449,-4561,-32449, +-5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-6253,-32165,-6253,-32165,-6253,-32165,-6253,-32165, +-6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, +-7371,-31928,-7371,-31928,-7371,-31928,-7371,-31928, +-7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, +-8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, +-9032,-31498,-9032,-31498,-9032,-31498,-9032,-31498, +-9581,-31336,-9581,-31336,-9581,-31336,-9581,-31336, +-10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, +-10668,-30982,-10668,-30982,-10668,-30982,-10668,-30982, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-11743,-30591,-11743,-30591,-11743,-30591,-11743,-30591, +-12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, +-12804,-30163,-12804,-30163,-12804,-30163,-12804,-30163, +-13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, +-13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, +-14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, +-14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, +-15384,-28932,-15384,-28932,-15384,-28932,-15384,-28932, +-15886,-28659,-15886,-28659,-15886,-28659,-15886,-28659, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-16877,-28087,-16877,-28087,-16877,-28087,-16877,-28087, +-17364,-27788,-17364,-27788,-17364,-27788,-17364,-27788, +-17847,-27481,-17847,-27481,-17847,-27481,-17847,-27481, +-18324,-27166,-18324,-27166,-18324,-27166,-18324,-27166, +-18795,-26842,-18795,-26842,-18795,-26842,-18795,-26842, +-19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, +-19720,-26169,-19720,-26169,-19720,-26169,-19720,-26169, +-20174,-25821,-20174,-25821,-20174,-25821,-20174,-25821, +-20621,-25465,-20621,-25465,-20621,-25465,-20621,-25465, +-21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, +-21498,-24730,-21498,-24730,-21498,-24730,-21498,-24730, +-21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, +-22348,-23965,-22348,-23965,-22348,-23965,-22348,-23965, +-22762,-23571,-22762,-23571,-22762,-23571,-22762,-23571, +-23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, +-23571,-22762,-23571,-22762,-23571,-22762,-23571,-22762, +-23965,-22348,-23965,-22348,-23965,-22348,-23965,-22348, +-24351,-21926,-24351,-21926,-24351,-21926,-24351,-21926, +-24730,-21498,-24730,-21498,-24730,-21498,-24730,-21498, +-25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, +-25465,-20621,-25465,-20621,-25465,-20621,-25465,-20621, +-25821,-20174,-25821,-20174,-25821,-20174,-25821,-20174, +-26169,-19720,-26169,-19720,-26169,-19720,-26169,-19720, +-26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, +-26842,-18795,-26842,-18795,-26842,-18795,-26842,-18795, +-27166,-18324,-27166,-18324,-27166,-18324,-27166,-18324, +-27481,-17847,-27481,-17847,-27481,-17847,-27481,-17847, +-27788,-17364,-27788,-17364,-27788,-17364,-27788,-17364, +-28087,-16877,-28087,-16877,-28087,-16877,-28087,-16877, +-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, +-28659,-15886,-28659,-15886,-28659,-15886,-28659,-15886, +-28932,-15384,-28932,-15384,-28932,-15384,-28932,-15384, +-29196,-14876,-29196,-14876,-29196,-14876,-29196,-14876, +-29451,-14365,-29451,-14365,-29451,-14365,-29451,-14365, +-29697,-13848,-29697,-13848,-29697,-13848,-29697,-13848, +-29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, +-30163,-12804,-30163,-12804,-30163,-12804,-30163,-12804, +-30382,-12275,-30382,-12275,-30382,-12275,-30382,-12275, +-30591,-11743,-30591,-11743,-30591,-11743,-30591,-11743, +-30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, +-30982,-10668,-30982,-10668,-30982,-10668,-30982,-10668, +-31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, +-31336,-9581,-31336,-9581,-31336,-9581,-31336,-9581, +-31498,-9032,-31498,-9032,-31498,-9032,-31498,-9032, +-31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, +-31794,-7928,-31794,-7928,-31794,-7928,-31794,-7928, +-31928,-7371,-31928,-7371,-31928,-7371,-31928,-7371, +-32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, +-32165,-6253,-32165,-6253,-32165,-6253,-32165,-6253, +-32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, +-32364,-5126,-32364,-5126,-32364,-5126,-32364,-5126, +-32449,-4561,-32449,-4561,-32449,-4561,-32449,-4561, +-32523,-3994,-32523,-3994,-32523,-3994,-32523,-3994, +-32588,-3426,-32588,-3426,-32588,-3426,-32588,-3426, +-32643,-2856,-32643,-2856,-32643,-2856,-32643,-2856, +-32688,-2286,-32688,-2286,-32688,-2286,-32688,-2286, +-32723,-1715,-32723,-1715,-32723,-1715,-32723,-1715, +-32748,-1144,-32748,-1144,-32748,-1144,-32748,-1144, +-32763,-572,-32763,-572,-32763,-572,-32763,-572}; + +static int16_t twc720[179*2*4] = {32755,-858,32755,-858,32755,-858,32755,-858, +32722,-1715,32722,-1715,32722,-1715,32722,-1715, +32665,-2571,32665,-2571,32665,-2571,32665,-2571, +32587,-3426,32587,-3426,32587,-3426,32587,-3426, +32486,-4277,32486,-4277,32486,-4277,32486,-4277, +32363,-5126,32363,-5126,32363,-5126,32363,-5126, +32218,-5972,32218,-5972,32218,-5972,32218,-5972, +32050,-6813,32050,-6813,32050,-6813,32050,-6813, +31861,-7650,31861,-7650,31861,-7650,31861,-7650, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31417,-9307,31417,-9307,31417,-9307,31417,-9307, +31163,-10126,31163,-10126,31163,-10126,31163,-10126, +30887,-10938,30887,-10938,30887,-10938,30887,-10938, +30590,-11743,30590,-11743,30590,-11743,30590,-11743, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +29934,-13328,29934,-13328,29934,-13328,29934,-13328, +29575,-14107,29575,-14107,29575,-14107,29575,-14107, +29195,-14876,29195,-14876,29195,-14876,29195,-14876, +28796,-15636,28796,-15636,28796,-15636,28796,-15636, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +27938,-17121,27938,-17121,27938,-17121,27938,-17121, +27480,-17847,27480,-17847,27480,-17847,27480,-17847, +27004,-18560,27004,-18560,27004,-18560,27004,-18560, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +25995,-19948,25995,-19948,25995,-19948,25995,-19948, +25464,-20621,25464,-20621,25464,-20621,25464,-20621, +24916,-21281,24916,-21281,24916,-21281,24916,-21281, +24350,-21926,24350,-21926,24350,-21926,24350,-21926, +23768,-22556,23768,-22556,23768,-22556,23768,-22556, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22555,-23769,22555,-23769,22555,-23769,22555,-23769, +21925,-24351,21925,-24351,21925,-24351,21925,-24351, +21280,-24917,21280,-24917,21280,-24917,21280,-24917, +20620,-25465,20620,-25465,20620,-25465,20620,-25465, +19947,-25996,19947,-25996,19947,-25996,19947,-25996, +19259,-26510,19259,-26510,19259,-26510,19259,-26510, +18559,-27005,18559,-27005,18559,-27005,18559,-27005, +17846,-27481,17846,-27481,17846,-27481,17846,-27481, +17120,-27939,17120,-27939,17120,-27939,17120,-27939, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15635,-28797,15635,-28797,15635,-28797,15635,-28797, +14875,-29196,14875,-29196,14875,-29196,14875,-29196, +14106,-29576,14106,-29576,14106,-29576,14106,-29576, +13327,-29935,13327,-29935,13327,-29935,13327,-29935, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +11742,-30591,11742,-30591,11742,-30591,11742,-30591, +10937,-30888,10937,-30888,10937,-30888,10937,-30888, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +9306,-31418,9306,-31418,9306,-31418,9306,-31418, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +7649,-31862,7649,-31862,7649,-31862,7649,-31862, +6812,-32051,6812,-32051,6812,-32051,6812,-32051, +5971,-32219,5971,-32219,5971,-32219,5971,-32219, +5125,-32364,5125,-32364,5125,-32364,5125,-32364, +4276,-32487,4276,-32487,4276,-32487,4276,-32487, +3425,-32588,3425,-32588,3425,-32588,3425,-32588, +2570,-32666,2570,-32666,2570,-32666,2570,-32666, +1714,-32723,1714,-32723,1714,-32723,1714,-32723, +857,-32756,857,-32756,857,-32756,857,-32756, +0,-32767,0,-32767,0,-32767,0,-32767, +-858,-32756,-858,-32756,-858,-32756,-858,-32756, +-1715,-32723,-1715,-32723,-1715,-32723,-1715,-32723, +-2571,-32666,-2571,-32666,-2571,-32666,-2571,-32666, +-3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, +-4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, +-5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, +-5972,-32219,-5972,-32219,-5972,-32219,-5972,-32219, +-6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, +-7650,-31862,-7650,-31862,-7650,-31862,-7650,-31862, +-8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, +-9307,-31418,-9307,-31418,-9307,-31418,-9307,-31418, +-10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, +-10938,-30888,-10938,-30888,-10938,-30888,-10938,-30888, +-11743,-30591,-11743,-30591,-11743,-30591,-11743,-30591, +-12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, +-13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, +-14107,-29576,-14107,-29576,-14107,-29576,-14107,-29576, +-14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, +-15636,-28797,-15636,-28797,-15636,-28797,-15636,-28797, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-17121,-27939,-17121,-27939,-17121,-27939,-17121,-27939, +-17847,-27481,-17847,-27481,-17847,-27481,-17847,-27481, +-18560,-27005,-18560,-27005,-18560,-27005,-18560,-27005, +-19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, +-19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, +-20621,-25465,-20621,-25465,-20621,-25465,-20621,-25465, +-21281,-24917,-21281,-24917,-21281,-24917,-21281,-24917, +-21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, +-22556,-23769,-22556,-23769,-22556,-23769,-22556,-23769, +-23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, +-23769,-22556,-23769,-22556,-23769,-22556,-23769,-22556, +-24351,-21926,-24351,-21926,-24351,-21926,-24351,-21926, +-24917,-21281,-24917,-21281,-24917,-21281,-24917,-21281, +-25465,-20621,-25465,-20621,-25465,-20621,-25465,-20621, +-25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, +-26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, +-27005,-18560,-27005,-18560,-27005,-18560,-27005,-18560, +-27481,-17847,-27481,-17847,-27481,-17847,-27481,-17847, +-27939,-17121,-27939,-17121,-27939,-17121,-27939,-17121, +-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, +-28797,-15636,-28797,-15636,-28797,-15636,-28797,-15636, +-29196,-14876,-29196,-14876,-29196,-14876,-29196,-14876, +-29576,-14107,-29576,-14107,-29576,-14107,-29576,-14107, +-29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, +-30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, +-30591,-11743,-30591,-11743,-30591,-11743,-30591,-11743, +-30888,-10938,-30888,-10938,-30888,-10938,-30888,-10938, +-31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, +-31418,-9307,-31418,-9307,-31418,-9307,-31418,-9307, +-31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, +-31862,-7650,-31862,-7650,-31862,-7650,-31862,-7650, +-32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, +-32219,-5972,-32219,-5972,-32219,-5972,-32219,-5972, +-32364,-5126,-32364,-5126,-32364,-5126,-32364,-5126, +-32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, +-32588,-3426,-32588,-3426,-32588,-3426,-32588,-3426, +-32666,-2571,-32666,-2571,-32666,-2571,-32666,-2571, +-32723,-1715,-32723,-1715,-32723,-1715,-32723,-1715, +-32756,-858,-32756,-858,-32756,-858,-32756,-858, +-32767,-1,-32767,-1,-32767,-1,-32767,-1, +-32756,857,-32756,857,-32756,857,-32756,857, +-32723,1714,-32723,1714,-32723,1714,-32723,1714, +-32666,2570,-32666,2570,-32666,2570,-32666,2570, +-32588,3425,-32588,3425,-32588,3425,-32588,3425, +-32487,4276,-32487,4276,-32487,4276,-32487,4276, +-32364,5125,-32364,5125,-32364,5125,-32364,5125, +-32219,5971,-32219,5971,-32219,5971,-32219,5971, +-32051,6812,-32051,6812,-32051,6812,-32051,6812, +-31862,7649,-31862,7649,-31862,7649,-31862,7649, +-31651,8480,-31651,8480,-31651,8480,-31651,8480, +-31418,9306,-31418,9306,-31418,9306,-31418,9306, +-31164,10125,-31164,10125,-31164,10125,-31164,10125, +-30888,10937,-30888,10937,-30888,10937,-30888,10937, +-30591,11742,-30591,11742,-30591,11742,-30591,11742, +-30273,12539,-30273,12539,-30273,12539,-30273,12539, +-29935,13327,-29935,13327,-29935,13327,-29935,13327, +-29576,14106,-29576,14106,-29576,14106,-29576,14106, +-29196,14875,-29196,14875,-29196,14875,-29196,14875, +-28797,15635,-28797,15635,-28797,15635,-28797,15635, +-28378,16383,-28378,16383,-28378,16383,-28378,16383, +-27939,17120,-27939,17120,-27939,17120,-27939,17120, +-27481,17846,-27481,17846,-27481,17846,-27481,17846, +-27005,18559,-27005,18559,-27005,18559,-27005,18559, +-26510,19259,-26510,19259,-26510,19259,-26510,19259, +-25996,19947,-25996,19947,-25996,19947,-25996,19947, +-25465,20620,-25465,20620,-25465,20620,-25465,20620, +-24917,21280,-24917,21280,-24917,21280,-24917,21280, +-24351,21925,-24351,21925,-24351,21925,-24351,21925, +-23769,22555,-23769,22555,-23769,22555,-23769,22555, +-23170,23169,-23170,23169,-23170,23169,-23170,23169, +-22556,23768,-22556,23768,-22556,23768,-22556,23768, +-21926,24350,-21926,24350,-21926,24350,-21926,24350, +-21281,24916,-21281,24916,-21281,24916,-21281,24916, +-20621,25464,-20621,25464,-20621,25464,-20621,25464, +-19948,25995,-19948,25995,-19948,25995,-19948,25995, +-19260,26509,-19260,26509,-19260,26509,-19260,26509, +-18560,27004,-18560,27004,-18560,27004,-18560,27004, +-17847,27480,-17847,27480,-17847,27480,-17847,27480, +-17121,27938,-17121,27938,-17121,27938,-17121,27938, +-16384,28377,-16384,28377,-16384,28377,-16384,28377, +-15636,28796,-15636,28796,-15636,28796,-15636,28796, +-14876,29195,-14876,29195,-14876,29195,-14876,29195, +-14107,29575,-14107,29575,-14107,29575,-14107,29575, +-13328,29934,-13328,29934,-13328,29934,-13328,29934, +-12540,30272,-12540,30272,-12540,30272,-12540,30272, +-11743,30590,-11743,30590,-11743,30590,-11743,30590, +-10938,30887,-10938,30887,-10938,30887,-10938,30887, +-10126,31163,-10126,31163,-10126,31163,-10126,31163, +-9307,31417,-9307,31417,-9307,31417,-9307,31417, +-8481,31650,-8481,31650,-8481,31650,-8481,31650, +-7650,31861,-7650,31861,-7650,31861,-7650,31861, +-6813,32050,-6813,32050,-6813,32050,-6813,32050, +-5972,32218,-5972,32218,-5972,32218,-5972,32218, +-5126,32363,-5126,32363,-5126,32363,-5126,32363, +-4277,32486,-4277,32486,-4277,32486,-4277,32486, +-3426,32587,-3426,32587,-3426,32587,-3426,32587, +-2571,32665,-2571,32665,-2571,32665,-2571,32665, +-1715,32722,-1715,32722,-1715,32722,-1715,32722, +-858,32755,-858,32755,-858,32755,-858,32755}; + +void dft720(int16_t *x,int16_t *y,unsigned char scale_flag){ // 180 x 4 + int i,j; + __m128i *x128=(__m128i *)x; + __m128i *y128=(__m128i *)y; + __m128i *twa128=(__m128i *)&twa720[0]; + __m128i *twb128=(__m128i *)&twb720[0]; + __m128i *twc128=(__m128i *)&twc720[0]; + __m128i x2128[720];// = (__m128i *)&x2128array[0]; + __m128i ytmp128[720];//=&ytmp128array2[0]; + + + + for (i=0,j=0;i<180;i++,j+=4) { + x2128[i] = x128[j]; + x2128[i+180] = x128[j+1]; + x2128[i+360] = x128[j+2]; + x2128[i+540] = x128[j+3]; + } + + dft180((int16_t *)x2128,(int16_t *)ytmp128,1); + dft180((int16_t *)(x2128+180),(int16_t *)(ytmp128+180),1); + dft180((int16_t *)(x2128+360),(int16_t *)(ytmp128+360),1); + dft180((int16_t *)(x2128+540),(int16_t *)(ytmp128+540),1); + + bfly4_tw1(ytmp128,ytmp128+180,ytmp128+360,ytmp128+540,y128,y128+180,y128+360,y128+540); + for (i=1,j=0;i<180;i++,j++) { + bfly4(ytmp128+i, + ytmp128+180+i, + ytmp128+360+i, + ytmp128+540+i, + y128+i, + y128+180+i, + y128+360+i, + y128+540+i, + twa128+j, + twb128+j, + twc128+j); + } + + if (scale_flag==1) { + norm128 = _mm_set1_epi16(16384);//dft_norm_table[13]); + + for (i=0;i<720;i++) { + y128[i] = _mm_slli_epi16(_mm_mulhi_epi16(y128[i],norm128),1); + } + } + + _mm_empty(); + _m_empty(); + +}; + +/* Twiddles generated with +twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:287)/864)); +twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:287)/864)); +twa2 = zeros(1,2*287); +twb2 = zeros(1,2*287); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +twb2(1:2:end) = real(twb); +twb2(2:2:end) = imag(twb); +fd=fopen("twiddle_tmp.txt","w"); +fprintf(fd,"static int16_t twa864[287*2*4] = {"); +for i=1:2:(2*286) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +fprintf(fd,"static int16_t twb864[287*2*4] = {"); +for i=1:2:(2*286) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +fclose(fd); +*/ +static int16_t twa864[287*2*4] = {32766,-239,32766,-239,32766,-239,32766,-239, +32763,-477,32763,-477,32763,-477,32763,-477, +32759,-715,32759,-715,32759,-715,32759,-715, +32753,-954,32753,-954,32753,-954,32753,-954, +32745,-1192,32745,-1192,32745,-1192,32745,-1192, +32735,-1430,32735,-1430,32735,-1430,32735,-1430, +32724,-1668,32724,-1668,32724,-1668,32724,-1668, +32711,-1906,32711,-1906,32711,-1906,32711,-1906, +32696,-2144,32696,-2144,32696,-2144,32696,-2144, +32680,-2381,32680,-2381,32680,-2381,32680,-2381, +32662,-2619,32662,-2619,32662,-2619,32662,-2619, +32642,-2856,32642,-2856,32642,-2856,32642,-2856, +32620,-3094,32620,-3094,32620,-3094,32620,-3094, +32597,-3331,32597,-3331,32597,-3331,32597,-3331, +32572,-3568,32572,-3568,32572,-3568,32572,-3568, +32545,-3805,32545,-3805,32545,-3805,32545,-3805, +32516,-4041,32516,-4041,32516,-4041,32516,-4041, +32486,-4277,32486,-4277,32486,-4277,32486,-4277, +32454,-4514,32454,-4514,32454,-4514,32454,-4514, +32421,-4749,32421,-4749,32421,-4749,32421,-4749, +32385,-4985,32385,-4985,32385,-4985,32385,-4985, +32348,-5221,32348,-5221,32348,-5221,32348,-5221, +32309,-5456,32309,-5456,32309,-5456,32309,-5456, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32226,-5925,32226,-5925,32226,-5925,32226,-5925, +32183,-6159,32183,-6159,32183,-6159,32183,-6159, +32137,-6393,32137,-6393,32137,-6393,32137,-6393, +32090,-6627,32090,-6627,32090,-6627,32090,-6627, +32041,-6860,32041,-6860,32041,-6860,32041,-6860, +31990,-7093,31990,-7093,31990,-7093,31990,-7093, +31937,-7325,31937,-7325,31937,-7325,31937,-7325, +31883,-7557,31883,-7557,31883,-7557,31883,-7557, +31827,-7789,31827,-7789,31827,-7789,31827,-7789, +31770,-8020,31770,-8020,31770,-8020,31770,-8020, +31711,-8251,31711,-8251,31711,-8251,31711,-8251, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31587,-8711,31587,-8711,31587,-8711,31587,-8711, +31523,-8941,31523,-8941,31523,-8941,31523,-8941, +31457,-9170,31457,-9170,31457,-9170,31457,-9170, +31390,-9398,31390,-9398,31390,-9398,31390,-9398, +31321,-9626,31321,-9626,31321,-9626,31321,-9626, +31250,-9854,31250,-9854,31250,-9854,31250,-9854, +31177,-10081,31177,-10081,31177,-10081,31177,-10081, +31103,-10307,31103,-10307,31103,-10307,31103,-10307, +31028,-10533,31028,-10533,31028,-10533,31028,-10533, +30950,-10758,30950,-10758,30950,-10758,30950,-10758, +30871,-10983,30871,-10983,30871,-10983,30871,-10983, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30708,-11431,30708,-11431,30708,-11431,30708,-11431, +30624,-11654,30624,-11654,30624,-11654,30624,-11654, +30539,-11877,30539,-11877,30539,-11877,30539,-11877, +30451,-12098,30451,-12098,30451,-12098,30451,-12098, +30363,-12319,30363,-12319,30363,-12319,30363,-12319, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +30180,-12760,30180,-12760,30180,-12760,30180,-12760, +30087,-12979,30087,-12979,30087,-12979,30087,-12979, +29992,-13197,29992,-13197,29992,-13197,29992,-13197, +29895,-13415,29895,-13415,29895,-13415,29895,-13415, +29796,-13632,29796,-13632,29796,-13632,29796,-13632, +29696,-13848,29696,-13848,29696,-13848,29696,-13848, +29595,-14064,29595,-14064,29595,-14064,29595,-14064, +29492,-14279,29492,-14279,29492,-14279,29492,-14279, +29387,-14493,29387,-14493,29387,-14493,29387,-14493, +29281,-14706,29281,-14706,29281,-14706,29281,-14706, +29173,-14919,29173,-14919,29173,-14919,29173,-14919, +29064,-15131,29064,-15131,29064,-15131,29064,-15131, +28953,-15342,28953,-15342,28953,-15342,28953,-15342, +28841,-15552,28841,-15552,28841,-15552,28841,-15552, +28727,-15761,28727,-15761,28727,-15761,28727,-15761, +28612,-15970,28612,-15970,28612,-15970,28612,-15970, +28495,-16177,28495,-16177,28495,-16177,28495,-16177, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28257,-16590,28257,-16590,28257,-16590,28257,-16590, +28135,-16795,28135,-16795,28135,-16795,28135,-16795, +28012,-16999,28012,-16999,28012,-16999,28012,-16999, +27888,-17202,27888,-17202,27888,-17202,27888,-17202, +27762,-17405,27762,-17405,27762,-17405,27762,-17405, +27635,-17606,27635,-17606,27635,-17606,27635,-17606, +27506,-17807,27506,-17807,27506,-17807,27506,-17807, +27376,-18006,27376,-18006,27376,-18006,27376,-18006, +27244,-18205,27244,-18205,27244,-18205,27244,-18205, +27111,-18403,27111,-18403,27111,-18403,27111,-18403, +26977,-18599,26977,-18599,26977,-18599,26977,-18599, +26841,-18795,26841,-18795,26841,-18795,26841,-18795, +26703,-18990,26703,-18990,26703,-18990,26703,-18990, +26564,-19183,26564,-19183,26564,-19183,26564,-19183, +26424,-19376,26424,-19376,26424,-19376,26424,-19376, +26283,-19568,26283,-19568,26283,-19568,26283,-19568, +26140,-19758,26140,-19758,26140,-19758,26140,-19758, +25995,-19948,25995,-19948,25995,-19948,25995,-19948, +25850,-20136,25850,-20136,25850,-20136,25850,-20136, +25702,-20324,25702,-20324,25702,-20324,25702,-20324, +25554,-20510,25554,-20510,25554,-20510,25554,-20510, +25404,-20695,25404,-20695,25404,-20695,25404,-20695, +25253,-20880,25253,-20880,25253,-20880,25253,-20880, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24947,-21245,24947,-21245,24947,-21245,24947,-21245, +24791,-21426,24791,-21426,24791,-21426,24791,-21426, +24635,-21605,24635,-21605,24635,-21605,24635,-21605, +24477,-21784,24477,-21784,24477,-21784,24477,-21784, +24318,-21961,24318,-21961,24318,-21961,24318,-21961, +24158,-22138,24158,-22138,24158,-22138,24158,-22138, +23996,-22313,23996,-22313,23996,-22313,23996,-22313, +23833,-22487,23833,-22487,23833,-22487,23833,-22487, +23669,-22659,23669,-22659,23669,-22659,23669,-22659, +23504,-22831,23504,-22831,23504,-22831,23504,-22831, +23337,-23001,23337,-23001,23337,-23001,23337,-23001, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +23000,-23338,23000,-23338,23000,-23338,23000,-23338, +22830,-23505,22830,-23505,22830,-23505,22830,-23505, +22658,-23670,22658,-23670,22658,-23670,22658,-23670, +22486,-23834,22486,-23834,22486,-23834,22486,-23834, +22312,-23997,22312,-23997,22312,-23997,22312,-23997, +22137,-24159,22137,-24159,22137,-24159,22137,-24159, +21960,-24319,21960,-24319,21960,-24319,21960,-24319, +21783,-24478,21783,-24478,21783,-24478,21783,-24478, +21604,-24636,21604,-24636,21604,-24636,21604,-24636, +21425,-24792,21425,-24792,21425,-24792,21425,-24792, +21244,-24948,21244,-24948,21244,-24948,21244,-24948, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20879,-25254,20879,-25254,20879,-25254,20879,-25254, +20694,-25405,20694,-25405,20694,-25405,20694,-25405, +20509,-25555,20509,-25555,20509,-25555,20509,-25555, +20323,-25703,20323,-25703,20323,-25703,20323,-25703, +20135,-25851,20135,-25851,20135,-25851,20135,-25851, +19947,-25996,19947,-25996,19947,-25996,19947,-25996, +19757,-26141,19757,-26141,19757,-26141,19757,-26141, +19567,-26284,19567,-26284,19567,-26284,19567,-26284, +19375,-26425,19375,-26425,19375,-26425,19375,-26425, +19182,-26565,19182,-26565,19182,-26565,19182,-26565, +18989,-26704,18989,-26704,18989,-26704,18989,-26704, +18794,-26842,18794,-26842,18794,-26842,18794,-26842, +18598,-26978,18598,-26978,18598,-26978,18598,-26978, +18402,-27112,18402,-27112,18402,-27112,18402,-27112, +18204,-27245,18204,-27245,18204,-27245,18204,-27245, +18005,-27377,18005,-27377,18005,-27377,18005,-27377, +17806,-27507,17806,-27507,17806,-27507,17806,-27507, +17605,-27636,17605,-27636,17605,-27636,17605,-27636, +17404,-27763,17404,-27763,17404,-27763,17404,-27763, +17201,-27889,17201,-27889,17201,-27889,17201,-27889, +16998,-28013,16998,-28013,16998,-28013,16998,-28013, +16794,-28136,16794,-28136,16794,-28136,16794,-28136, +16589,-28258,16589,-28258,16589,-28258,16589,-28258, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +16176,-28496,16176,-28496,16176,-28496,16176,-28496, +15969,-28613,15969,-28613,15969,-28613,15969,-28613, +15760,-28728,15760,-28728,15760,-28728,15760,-28728, +15551,-28842,15551,-28842,15551,-28842,15551,-28842, +15341,-28954,15341,-28954,15341,-28954,15341,-28954, +15130,-29065,15130,-29065,15130,-29065,15130,-29065, +14918,-29174,14918,-29174,14918,-29174,14918,-29174, +14705,-29282,14705,-29282,14705,-29282,14705,-29282, +14492,-29388,14492,-29388,14492,-29388,14492,-29388, +14278,-29493,14278,-29493,14278,-29493,14278,-29493, +14063,-29596,14063,-29596,14063,-29596,14063,-29596, +13847,-29697,13847,-29697,13847,-29697,13847,-29697, +13631,-29797,13631,-29797,13631,-29797,13631,-29797, +13414,-29896,13414,-29896,13414,-29896,13414,-29896, +13196,-29993,13196,-29993,13196,-29993,13196,-29993, +12978,-30088,12978,-30088,12978,-30088,12978,-30088, +12759,-30181,12759,-30181,12759,-30181,12759,-30181, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +12318,-30364,12318,-30364,12318,-30364,12318,-30364, +12097,-30452,12097,-30452,12097,-30452,12097,-30452, +11876,-30540,11876,-30540,11876,-30540,11876,-30540, +11653,-30625,11653,-30625,11653,-30625,11653,-30625, +11430,-30709,11430,-30709,11430,-30709,11430,-30709, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +10982,-30872,10982,-30872,10982,-30872,10982,-30872, +10757,-30951,10757,-30951,10757,-30951,10757,-30951, +10532,-31029,10532,-31029,10532,-31029,10532,-31029, +10306,-31104,10306,-31104,10306,-31104,10306,-31104, +10080,-31178,10080,-31178,10080,-31178,10080,-31178, +9853,-31251,9853,-31251,9853,-31251,9853,-31251, +9625,-31322,9625,-31322,9625,-31322,9625,-31322, +9397,-31391,9397,-31391,9397,-31391,9397,-31391, +9169,-31458,9169,-31458,9169,-31458,9169,-31458, +8940,-31524,8940,-31524,8940,-31524,8940,-31524, +8710,-31588,8710,-31588,8710,-31588,8710,-31588, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +8250,-31712,8250,-31712,8250,-31712,8250,-31712, +8019,-31771,8019,-31771,8019,-31771,8019,-31771, +7788,-31828,7788,-31828,7788,-31828,7788,-31828, +7556,-31884,7556,-31884,7556,-31884,7556,-31884, +7324,-31938,7324,-31938,7324,-31938,7324,-31938, +7092,-31991,7092,-31991,7092,-31991,7092,-31991, +6859,-32042,6859,-32042,6859,-32042,6859,-32042, +6626,-32091,6626,-32091,6626,-32091,6626,-32091, +6392,-32138,6392,-32138,6392,-32138,6392,-32138, +6158,-32184,6158,-32184,6158,-32184,6158,-32184, +5924,-32227,5924,-32227,5924,-32227,5924,-32227, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5455,-32310,5455,-32310,5455,-32310,5455,-32310, +5220,-32349,5220,-32349,5220,-32349,5220,-32349, +4984,-32386,4984,-32386,4984,-32386,4984,-32386, +4748,-32422,4748,-32422,4748,-32422,4748,-32422, +4513,-32455,4513,-32455,4513,-32455,4513,-32455, +4276,-32487,4276,-32487,4276,-32487,4276,-32487, +4040,-32517,4040,-32517,4040,-32517,4040,-32517, +3804,-32546,3804,-32546,3804,-32546,3804,-32546, +3567,-32573,3567,-32573,3567,-32573,3567,-32573, +3330,-32598,3330,-32598,3330,-32598,3330,-32598, +3093,-32621,3093,-32621,3093,-32621,3093,-32621, +2855,-32643,2855,-32643,2855,-32643,2855,-32643, +2618,-32663,2618,-32663,2618,-32663,2618,-32663, +2380,-32681,2380,-32681,2380,-32681,2380,-32681, +2143,-32697,2143,-32697,2143,-32697,2143,-32697, +1905,-32712,1905,-32712,1905,-32712,1905,-32712, +1667,-32725,1667,-32725,1667,-32725,1667,-32725, +1429,-32736,1429,-32736,1429,-32736,1429,-32736, +1191,-32746,1191,-32746,1191,-32746,1191,-32746, +953,-32754,953,-32754,953,-32754,953,-32754, +714,-32760,714,-32760,714,-32760,714,-32760, +476,-32764,476,-32764,476,-32764,476,-32764, +238,-32767,238,-32767,238,-32767,238,-32767, +0,-32767,0,-32767,0,-32767,0,-32767, +-239,-32767,-239,-32767,-239,-32767,-239,-32767, +-477,-32764,-477,-32764,-477,-32764,-477,-32764, +-715,-32760,-715,-32760,-715,-32760,-715,-32760, +-954,-32754,-954,-32754,-954,-32754,-954,-32754, +-1192,-32746,-1192,-32746,-1192,-32746,-1192,-32746, +-1430,-32736,-1430,-32736,-1430,-32736,-1430,-32736, +-1668,-32725,-1668,-32725,-1668,-32725,-1668,-32725, +-1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, +-2144,-32697,-2144,-32697,-2144,-32697,-2144,-32697, +-2381,-32681,-2381,-32681,-2381,-32681,-2381,-32681, +-2619,-32663,-2619,-32663,-2619,-32663,-2619,-32663, +-2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, +-3094,-32621,-3094,-32621,-3094,-32621,-3094,-32621, +-3331,-32598,-3331,-32598,-3331,-32598,-3331,-32598, +-3568,-32573,-3568,-32573,-3568,-32573,-3568,-32573, +-3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, +-4041,-32517,-4041,-32517,-4041,-32517,-4041,-32517, +-4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, +-4514,-32455,-4514,-32455,-4514,-32455,-4514,-32455, +-4749,-32422,-4749,-32422,-4749,-32422,-4749,-32422, +-4985,-32386,-4985,-32386,-4985,-32386,-4985,-32386, +-5221,-32349,-5221,-32349,-5221,-32349,-5221,-32349, +-5456,-32310,-5456,-32310,-5456,-32310,-5456,-32310, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-5925,-32227,-5925,-32227,-5925,-32227,-5925,-32227, +-6159,-32184,-6159,-32184,-6159,-32184,-6159,-32184, +-6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, +-6627,-32091,-6627,-32091,-6627,-32091,-6627,-32091, +-6860,-32042,-6860,-32042,-6860,-32042,-6860,-32042, +-7093,-31991,-7093,-31991,-7093,-31991,-7093,-31991, +-7325,-31938,-7325,-31938,-7325,-31938,-7325,-31938, +-7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, +-7789,-31828,-7789,-31828,-7789,-31828,-7789,-31828, +-8020,-31771,-8020,-31771,-8020,-31771,-8020,-31771, +-8251,-31712,-8251,-31712,-8251,-31712,-8251,-31712, +-8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, +-8711,-31588,-8711,-31588,-8711,-31588,-8711,-31588, +-8941,-31524,-8941,-31524,-8941,-31524,-8941,-31524, +-9170,-31458,-9170,-31458,-9170,-31458,-9170,-31458, +-9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, +-9626,-31322,-9626,-31322,-9626,-31322,-9626,-31322, +-9854,-31251,-9854,-31251,-9854,-31251,-9854,-31251, +-10081,-31178,-10081,-31178,-10081,-31178,-10081,-31178, +-10307,-31104,-10307,-31104,-10307,-31104,-10307,-31104, +-10533,-31029,-10533,-31029,-10533,-31029,-10533,-31029, +-10758,-30951,-10758,-30951,-10758,-30951,-10758,-30951, +-10983,-30872,-10983,-30872,-10983,-30872,-10983,-30872, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-11431,-30709,-11431,-30709,-11431,-30709,-11431,-30709, +-11654,-30625,-11654,-30625,-11654,-30625,-11654,-30625, +-11877,-30540,-11877,-30540,-11877,-30540,-11877,-30540, +-12098,-30452,-12098,-30452,-12098,-30452,-12098,-30452, +-12319,-30364,-12319,-30364,-12319,-30364,-12319,-30364, +-12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, +-12760,-30181,-12760,-30181,-12760,-30181,-12760,-30181, +-12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, +-13197,-29993,-13197,-29993,-13197,-29993,-13197,-29993, +-13415,-29896,-13415,-29896,-13415,-29896,-13415,-29896, +-13632,-29797,-13632,-29797,-13632,-29797,-13632,-29797, +-13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, +-14064,-29596,-14064,-29596,-14064,-29596,-14064,-29596, +-14279,-29493,-14279,-29493,-14279,-29493,-14279,-29493, +-14493,-29388,-14493,-29388,-14493,-29388,-14493,-29388, +-14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, +-14919,-29174,-14919,-29174,-14919,-29174,-14919,-29174, +-15131,-29065,-15131,-29065,-15131,-29065,-15131,-29065, +-15342,-28954,-15342,-28954,-15342,-28954,-15342,-28954, +-15552,-28842,-15552,-28842,-15552,-28842,-15552,-28842, +-15761,-28728,-15761,-28728,-15761,-28728,-15761,-28728, +-15970,-28613,-15970,-28613,-15970,-28613,-15970,-28613, +-16177,-28496,-16177,-28496,-16177,-28496,-16177,-28496}; +static int16_t twb864[287*2*4] = {32763,-477,32763,-477,32763,-477,32763,-477, +32753,-954,32753,-954,32753,-954,32753,-954, +32735,-1430,32735,-1430,32735,-1430,32735,-1430, +32711,-1906,32711,-1906,32711,-1906,32711,-1906, +32680,-2381,32680,-2381,32680,-2381,32680,-2381, +32642,-2856,32642,-2856,32642,-2856,32642,-2856, +32597,-3331,32597,-3331,32597,-3331,32597,-3331, +32545,-3805,32545,-3805,32545,-3805,32545,-3805, +32486,-4277,32486,-4277,32486,-4277,32486,-4277, +32421,-4749,32421,-4749,32421,-4749,32421,-4749, +32348,-5221,32348,-5221,32348,-5221,32348,-5221, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32183,-6159,32183,-6159,32183,-6159,32183,-6159, +32090,-6627,32090,-6627,32090,-6627,32090,-6627, +31990,-7093,31990,-7093,31990,-7093,31990,-7093, +31883,-7557,31883,-7557,31883,-7557,31883,-7557, +31770,-8020,31770,-8020,31770,-8020,31770,-8020, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31523,-8941,31523,-8941,31523,-8941,31523,-8941, +31390,-9398,31390,-9398,31390,-9398,31390,-9398, +31250,-9854,31250,-9854,31250,-9854,31250,-9854, +31103,-10307,31103,-10307,31103,-10307,31103,-10307, +30950,-10758,30950,-10758,30950,-10758,30950,-10758, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30624,-11654,30624,-11654,30624,-11654,30624,-11654, +30451,-12098,30451,-12098,30451,-12098,30451,-12098, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +30087,-12979,30087,-12979,30087,-12979,30087,-12979, +29895,-13415,29895,-13415,29895,-13415,29895,-13415, +29696,-13848,29696,-13848,29696,-13848,29696,-13848, +29492,-14279,29492,-14279,29492,-14279,29492,-14279, +29281,-14706,29281,-14706,29281,-14706,29281,-14706, +29064,-15131,29064,-15131,29064,-15131,29064,-15131, +28841,-15552,28841,-15552,28841,-15552,28841,-15552, +28612,-15970,28612,-15970,28612,-15970,28612,-15970, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28135,-16795,28135,-16795,28135,-16795,28135,-16795, +27888,-17202,27888,-17202,27888,-17202,27888,-17202, +27635,-17606,27635,-17606,27635,-17606,27635,-17606, +27376,-18006,27376,-18006,27376,-18006,27376,-18006, +27111,-18403,27111,-18403,27111,-18403,27111,-18403, +26841,-18795,26841,-18795,26841,-18795,26841,-18795, +26564,-19183,26564,-19183,26564,-19183,26564,-19183, +26283,-19568,26283,-19568,26283,-19568,26283,-19568, +25995,-19948,25995,-19948,25995,-19948,25995,-19948, +25702,-20324,25702,-20324,25702,-20324,25702,-20324, +25404,-20695,25404,-20695,25404,-20695,25404,-20695, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24791,-21426,24791,-21426,24791,-21426,24791,-21426, +24477,-21784,24477,-21784,24477,-21784,24477,-21784, +24158,-22138,24158,-22138,24158,-22138,24158,-22138, +23833,-22487,23833,-22487,23833,-22487,23833,-22487, +23504,-22831,23504,-22831,23504,-22831,23504,-22831, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22830,-23505,22830,-23505,22830,-23505,22830,-23505, +22486,-23834,22486,-23834,22486,-23834,22486,-23834, +22137,-24159,22137,-24159,22137,-24159,22137,-24159, +21783,-24478,21783,-24478,21783,-24478,21783,-24478, +21425,-24792,21425,-24792,21425,-24792,21425,-24792, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20694,-25405,20694,-25405,20694,-25405,20694,-25405, +20323,-25703,20323,-25703,20323,-25703,20323,-25703, +19947,-25996,19947,-25996,19947,-25996,19947,-25996, +19567,-26284,19567,-26284,19567,-26284,19567,-26284, +19182,-26565,19182,-26565,19182,-26565,19182,-26565, +18794,-26842,18794,-26842,18794,-26842,18794,-26842, +18402,-27112,18402,-27112,18402,-27112,18402,-27112, +18005,-27377,18005,-27377,18005,-27377,18005,-27377, +17605,-27636,17605,-27636,17605,-27636,17605,-27636, +17201,-27889,17201,-27889,17201,-27889,17201,-27889, +16794,-28136,16794,-28136,16794,-28136,16794,-28136, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15969,-28613,15969,-28613,15969,-28613,15969,-28613, +15551,-28842,15551,-28842,15551,-28842,15551,-28842, +15130,-29065,15130,-29065,15130,-29065,15130,-29065, +14705,-29282,14705,-29282,14705,-29282,14705,-29282, +14278,-29493,14278,-29493,14278,-29493,14278,-29493, +13847,-29697,13847,-29697,13847,-29697,13847,-29697, +13414,-29896,13414,-29896,13414,-29896,13414,-29896, +12978,-30088,12978,-30088,12978,-30088,12978,-30088, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +12097,-30452,12097,-30452,12097,-30452,12097,-30452, +11653,-30625,11653,-30625,11653,-30625,11653,-30625, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +10757,-30951,10757,-30951,10757,-30951,10757,-30951, +10306,-31104,10306,-31104,10306,-31104,10306,-31104, +9853,-31251,9853,-31251,9853,-31251,9853,-31251, +9397,-31391,9397,-31391,9397,-31391,9397,-31391, +8940,-31524,8940,-31524,8940,-31524,8940,-31524, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +8019,-31771,8019,-31771,8019,-31771,8019,-31771, +7556,-31884,7556,-31884,7556,-31884,7556,-31884, +7092,-31991,7092,-31991,7092,-31991,7092,-31991, +6626,-32091,6626,-32091,6626,-32091,6626,-32091, +6158,-32184,6158,-32184,6158,-32184,6158,-32184, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5220,-32349,5220,-32349,5220,-32349,5220,-32349, +4748,-32422,4748,-32422,4748,-32422,4748,-32422, +4276,-32487,4276,-32487,4276,-32487,4276,-32487, +3804,-32546,3804,-32546,3804,-32546,3804,-32546, +3330,-32598,3330,-32598,3330,-32598,3330,-32598, +2855,-32643,2855,-32643,2855,-32643,2855,-32643, +2380,-32681,2380,-32681,2380,-32681,2380,-32681, +1905,-32712,1905,-32712,1905,-32712,1905,-32712, +1429,-32736,1429,-32736,1429,-32736,1429,-32736, +953,-32754,953,-32754,953,-32754,953,-32754, +476,-32764,476,-32764,476,-32764,476,-32764, +0,-32767,0,-32767,0,-32767,0,-32767, +-477,-32764,-477,-32764,-477,-32764,-477,-32764, +-954,-32754,-954,-32754,-954,-32754,-954,-32754, +-1430,-32736,-1430,-32736,-1430,-32736,-1430,-32736, +-1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, +-2381,-32681,-2381,-32681,-2381,-32681,-2381,-32681, +-2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, +-3331,-32598,-3331,-32598,-3331,-32598,-3331,-32598, +-3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, +-4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, +-4749,-32422,-4749,-32422,-4749,-32422,-4749,-32422, +-5221,-32349,-5221,-32349,-5221,-32349,-5221,-32349, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-6159,-32184,-6159,-32184,-6159,-32184,-6159,-32184, +-6627,-32091,-6627,-32091,-6627,-32091,-6627,-32091, +-7093,-31991,-7093,-31991,-7093,-31991,-7093,-31991, +-7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, +-8020,-31771,-8020,-31771,-8020,-31771,-8020,-31771, +-8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, +-8941,-31524,-8941,-31524,-8941,-31524,-8941,-31524, +-9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, +-9854,-31251,-9854,-31251,-9854,-31251,-9854,-31251, +-10307,-31104,-10307,-31104,-10307,-31104,-10307,-31104, +-10758,-30951,-10758,-30951,-10758,-30951,-10758,-30951, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-11654,-30625,-11654,-30625,-11654,-30625,-11654,-30625, +-12098,-30452,-12098,-30452,-12098,-30452,-12098,-30452, +-12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, +-12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, +-13415,-29896,-13415,-29896,-13415,-29896,-13415,-29896, +-13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, +-14279,-29493,-14279,-29493,-14279,-29493,-14279,-29493, +-14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, +-15131,-29065,-15131,-29065,-15131,-29065,-15131,-29065, +-15552,-28842,-15552,-28842,-15552,-28842,-15552,-28842, +-15970,-28613,-15970,-28613,-15970,-28613,-15970,-28613, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-16795,-28136,-16795,-28136,-16795,-28136,-16795,-28136, +-17202,-27889,-17202,-27889,-17202,-27889,-17202,-27889, +-17606,-27636,-17606,-27636,-17606,-27636,-17606,-27636, +-18006,-27377,-18006,-27377,-18006,-27377,-18006,-27377, +-18403,-27112,-18403,-27112,-18403,-27112,-18403,-27112, +-18795,-26842,-18795,-26842,-18795,-26842,-18795,-26842, +-19183,-26565,-19183,-26565,-19183,-26565,-19183,-26565, +-19568,-26284,-19568,-26284,-19568,-26284,-19568,-26284, +-19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, +-20324,-25703,-20324,-25703,-20324,-25703,-20324,-25703, +-20695,-25405,-20695,-25405,-20695,-25405,-20695,-25405, +-21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, +-21426,-24792,-21426,-24792,-21426,-24792,-21426,-24792, +-21784,-24478,-21784,-24478,-21784,-24478,-21784,-24478, +-22138,-24159,-22138,-24159,-22138,-24159,-22138,-24159, +-22487,-23834,-22487,-23834,-22487,-23834,-22487,-23834, +-22831,-23505,-22831,-23505,-22831,-23505,-22831,-23505, +-23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, +-23505,-22831,-23505,-22831,-23505,-22831,-23505,-22831, +-23834,-22487,-23834,-22487,-23834,-22487,-23834,-22487, +-24159,-22138,-24159,-22138,-24159,-22138,-24159,-22138, +-24478,-21784,-24478,-21784,-24478,-21784,-24478,-21784, +-24792,-21426,-24792,-21426,-24792,-21426,-24792,-21426, +-25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, +-25405,-20695,-25405,-20695,-25405,-20695,-25405,-20695, +-25703,-20324,-25703,-20324,-25703,-20324,-25703,-20324, +-25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, +-26284,-19568,-26284,-19568,-26284,-19568,-26284,-19568, +-26565,-19183,-26565,-19183,-26565,-19183,-26565,-19183, +-26842,-18795,-26842,-18795,-26842,-18795,-26842,-18795, +-27112,-18403,-27112,-18403,-27112,-18403,-27112,-18403, +-27377,-18006,-27377,-18006,-27377,-18006,-27377,-18006, +-27636,-17606,-27636,-17606,-27636,-17606,-27636,-17606, +-27889,-17202,-27889,-17202,-27889,-17202,-27889,-17202, +-28136,-16795,-28136,-16795,-28136,-16795,-28136,-16795, +-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, +-28613,-15970,-28613,-15970,-28613,-15970,-28613,-15970, +-28842,-15552,-28842,-15552,-28842,-15552,-28842,-15552, +-29065,-15131,-29065,-15131,-29065,-15131,-29065,-15131, +-29282,-14706,-29282,-14706,-29282,-14706,-29282,-14706, +-29493,-14279,-29493,-14279,-29493,-14279,-29493,-14279, +-29697,-13848,-29697,-13848,-29697,-13848,-29697,-13848, +-29896,-13415,-29896,-13415,-29896,-13415,-29896,-13415, +-30088,-12979,-30088,-12979,-30088,-12979,-30088,-12979, +-30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, +-30452,-12098,-30452,-12098,-30452,-12098,-30452,-12098, +-30625,-11654,-30625,-11654,-30625,-11654,-30625,-11654, +-30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, +-30951,-10758,-30951,-10758,-30951,-10758,-30951,-10758, +-31104,-10307,-31104,-10307,-31104,-10307,-31104,-10307, +-31251,-9854,-31251,-9854,-31251,-9854,-31251,-9854, +-31391,-9398,-31391,-9398,-31391,-9398,-31391,-9398, +-31524,-8941,-31524,-8941,-31524,-8941,-31524,-8941, +-31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, +-31771,-8020,-31771,-8020,-31771,-8020,-31771,-8020, +-31884,-7557,-31884,-7557,-31884,-7557,-31884,-7557, +-31991,-7093,-31991,-7093,-31991,-7093,-31991,-7093, +-32091,-6627,-32091,-6627,-32091,-6627,-32091,-6627, +-32184,-6159,-32184,-6159,-32184,-6159,-32184,-6159, +-32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, +-32349,-5221,-32349,-5221,-32349,-5221,-32349,-5221, +-32422,-4749,-32422,-4749,-32422,-4749,-32422,-4749, +-32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, +-32546,-3805,-32546,-3805,-32546,-3805,-32546,-3805, +-32598,-3331,-32598,-3331,-32598,-3331,-32598,-3331, +-32643,-2856,-32643,-2856,-32643,-2856,-32643,-2856, +-32681,-2381,-32681,-2381,-32681,-2381,-32681,-2381, +-32712,-1906,-32712,-1906,-32712,-1906,-32712,-1906, +-32736,-1430,-32736,-1430,-32736,-1430,-32736,-1430, +-32754,-954,-32754,-954,-32754,-954,-32754,-954, +-32764,-477,-32764,-477,-32764,-477,-32764,-477, +-32767,-1,-32767,-1,-32767,-1,-32767,-1, +-32764,476,-32764,476,-32764,476,-32764,476, +-32754,953,-32754,953,-32754,953,-32754,953, +-32736,1429,-32736,1429,-32736,1429,-32736,1429, +-32712,1905,-32712,1905,-32712,1905,-32712,1905, +-32681,2380,-32681,2380,-32681,2380,-32681,2380, +-32643,2855,-32643,2855,-32643,2855,-32643,2855, +-32598,3330,-32598,3330,-32598,3330,-32598,3330, +-32546,3804,-32546,3804,-32546,3804,-32546,3804, +-32487,4276,-32487,4276,-32487,4276,-32487,4276, +-32422,4748,-32422,4748,-32422,4748,-32422,4748, +-32349,5220,-32349,5220,-32349,5220,-32349,5220, +-32270,5689,-32270,5689,-32270,5689,-32270,5689, +-32184,6158,-32184,6158,-32184,6158,-32184,6158, +-32091,6626,-32091,6626,-32091,6626,-32091,6626, +-31991,7092,-31991,7092,-31991,7092,-31991,7092, +-31884,7556,-31884,7556,-31884,7556,-31884,7556, +-31771,8019,-31771,8019,-31771,8019,-31771,8019, +-31651,8480,-31651,8480,-31651,8480,-31651,8480, +-31524,8940,-31524,8940,-31524,8940,-31524,8940, +-31391,9397,-31391,9397,-31391,9397,-31391,9397, +-31251,9853,-31251,9853,-31251,9853,-31251,9853, +-31104,10306,-31104,10306,-31104,10306,-31104,10306, +-30951,10757,-30951,10757,-30951,10757,-30951,10757, +-30791,11206,-30791,11206,-30791,11206,-30791,11206, +-30625,11653,-30625,11653,-30625,11653,-30625,11653, +-30452,12097,-30452,12097,-30452,12097,-30452,12097, +-30273,12539,-30273,12539,-30273,12539,-30273,12539, +-30088,12978,-30088,12978,-30088,12978,-30088,12978, +-29896,13414,-29896,13414,-29896,13414,-29896,13414, +-29697,13847,-29697,13847,-29697,13847,-29697,13847, +-29493,14278,-29493,14278,-29493,14278,-29493,14278, +-29282,14705,-29282,14705,-29282,14705,-29282,14705, +-29065,15130,-29065,15130,-29065,15130,-29065,15130, +-28842,15551,-28842,15551,-28842,15551,-28842,15551, +-28613,15969,-28613,15969,-28613,15969,-28613,15969, +-28378,16383,-28378,16383,-28378,16383,-28378,16383, +-28136,16794,-28136,16794,-28136,16794,-28136,16794, +-27889,17201,-27889,17201,-27889,17201,-27889,17201, +-27636,17605,-27636,17605,-27636,17605,-27636,17605, +-27377,18005,-27377,18005,-27377,18005,-27377,18005, +-27112,18402,-27112,18402,-27112,18402,-27112,18402, +-26842,18794,-26842,18794,-26842,18794,-26842,18794, +-26565,19182,-26565,19182,-26565,19182,-26565,19182, +-26284,19567,-26284,19567,-26284,19567,-26284,19567, +-25996,19947,-25996,19947,-25996,19947,-25996,19947, +-25703,20323,-25703,20323,-25703,20323,-25703,20323, +-25405,20694,-25405,20694,-25405,20694,-25405,20694, +-25101,21062,-25101,21062,-25101,21062,-25101,21062, +-24792,21425,-24792,21425,-24792,21425,-24792,21425, +-24478,21783,-24478,21783,-24478,21783,-24478,21783, +-24159,22137,-24159,22137,-24159,22137,-24159,22137, +-23834,22486,-23834,22486,-23834,22486,-23834,22486, +-23505,22830,-23505,22830,-23505,22830,-23505,22830, +-23170,23169,-23170,23169,-23170,23169,-23170,23169, +-22831,23504,-22831,23504,-22831,23504,-22831,23504, +-22487,23833,-22487,23833,-22487,23833,-22487,23833, +-22138,24158,-22138,24158,-22138,24158,-22138,24158, +-21784,24477,-21784,24477,-21784,24477,-21784,24477, +-21426,24791,-21426,24791,-21426,24791,-21426,24791, +-21063,25100,-21063,25100,-21063,25100,-21063,25100, +-20695,25404,-20695,25404,-20695,25404,-20695,25404, +-20324,25702,-20324,25702,-20324,25702,-20324,25702, +-19948,25995,-19948,25995,-19948,25995,-19948,25995, +-19568,26283,-19568,26283,-19568,26283,-19568,26283, +-19183,26564,-19183,26564,-19183,26564,-19183,26564, +-18795,26841,-18795,26841,-18795,26841,-18795,26841, +-18403,27111,-18403,27111,-18403,27111,-18403,27111, +-18006,27376,-18006,27376,-18006,27376,-18006,27376, +-17606,27635,-17606,27635,-17606,27635,-17606,27635, +-17202,27888,-17202,27888,-17202,27888,-17202,27888, +-16795,28135,-16795,28135,-16795,28135,-16795,28135}; + +void dft864(int16_t *x,int16_t *y,unsigned char scale_flag){ // 288 x 3 + int i,j; + __m128i *x128=(__m128i *)x; + __m128i *y128=(__m128i *)y; + __m128i *twa128=(__m128i *)&twa864[0]; + __m128i *twb128=(__m128i *)&twb864[0]; + __m128i x2128[864];// = (__m128i *)&x2128array[0]; + __m128i ytmp128[864];//=&ytmp128array3[0]; + + + + for (i=0,j=0;i<288;i++,j+=3) { + x2128[i] = x128[j]; + x2128[i+288] = x128[j+1]; + x2128[i+288] = x128[j+2]; + } + + dft288((int16_t *)x2128,(int16_t *)ytmp128,1); + dft288((int16_t *)(x2128+288),(int16_t *)(ytmp128+288),1); + dft288((int16_t *)(x2128+576),(int16_t *)(ytmp128+576),1); + + bfly3_tw1(ytmp128,ytmp128+288,ytmp128+576,y128,y128+288,y128+576); + for (i=1,j=0;i<288;i++,j++) { + bfly3(ytmp128+i, + ytmp128+288+i, + ytmp128+576+i, + y128+i, + y128+288+i, + y128+576+i, + twa128+j, + twb128+j); + } + + if (scale_flag==1) { + norm128 = _mm_set1_epi16(dft_norm_table[14]); + + for (i=0;i<864;i++) { + y128[i] = _mm_slli_epi16(_mm_mulhi_epi16(y128[i],norm128),1); + } + } + + _mm_empty(); + _m_empty(); + +}; + +/* Twiddles generated with +twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:299)/900)); +twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:299)/900)); +twa2 = zeros(1,2*299); +twb2 = zeros(1,2*299); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +twb2(1:2:end) = real(twb); +twb2(2:2:end) = imag(twb); +fd=fopen("twiddle_tmp.txt","w"); +fprintf(fd,"static int16_t twa900[299*2*4] = {"); +for i=1:2:(2*298) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +fprintf(fd,"static int16_t twb900[299*2*4] = {"); +for i=1:2:(2*298) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +fclose(fd); +*/ +static int16_t twa900[299*2*4] = {32766,-229,32766,-229,32766,-229,32766,-229, +32763,-458,32763,-458,32763,-458,32763,-458, +32759,-687,32759,-687,32759,-687,32759,-687, +32754,-915,32754,-915,32754,-915,32754,-915, +32747,-1144,32747,-1144,32747,-1144,32747,-1144, +32738,-1373,32738,-1373,32738,-1373,32738,-1373, +32727,-1601,32727,-1601,32727,-1601,32727,-1601, +32715,-1830,32715,-1830,32715,-1830,32715,-1830, +32702,-2058,32702,-2058,32702,-2058,32702,-2058, +32687,-2286,32687,-2286,32687,-2286,32687,-2286, +32670,-2514,32670,-2514,32670,-2514,32670,-2514, +32652,-2742,32652,-2742,32652,-2742,32652,-2742, +32632,-2970,32632,-2970,32632,-2970,32632,-2970, +32610,-3198,32610,-3198,32610,-3198,32610,-3198, +32587,-3426,32587,-3426,32587,-3426,32587,-3426, +32562,-3653,32562,-3653,32562,-3653,32562,-3653, +32536,-3880,32536,-3880,32536,-3880,32536,-3880, +32508,-4107,32508,-4107,32508,-4107,32508,-4107, +32479,-4334,32479,-4334,32479,-4334,32479,-4334, +32448,-4561,32448,-4561,32448,-4561,32448,-4561, +32415,-4787,32415,-4787,32415,-4787,32415,-4787, +32381,-5013,32381,-5013,32381,-5013,32381,-5013, +32345,-5239,32345,-5239,32345,-5239,32345,-5239, +32308,-5465,32308,-5465,32308,-5465,32308,-5465, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32228,-5916,32228,-5916,32228,-5916,32228,-5916, +32186,-6140,32186,-6140,32186,-6140,32186,-6140, +32142,-6365,32142,-6365,32142,-6365,32142,-6365, +32097,-6589,32097,-6589,32097,-6589,32097,-6589, +32050,-6813,32050,-6813,32050,-6813,32050,-6813, +32002,-7037,32002,-7037,32002,-7037,32002,-7037, +31952,-7260,31952,-7260,31952,-7260,31952,-7260, +31901,-7483,31901,-7483,31901,-7483,31901,-7483, +31848,-7705,31848,-7705,31848,-7705,31848,-7705, +31793,-7928,31793,-7928,31793,-7928,31793,-7928, +31737,-8149,31737,-8149,31737,-8149,31737,-8149, +31679,-8371,31679,-8371,31679,-8371,31679,-8371, +31620,-8592,31620,-8592,31620,-8592,31620,-8592, +31559,-8812,31559,-8812,31559,-8812,31559,-8812, +31497,-9032,31497,-9032,31497,-9032,31497,-9032, +31433,-9252,31433,-9252,31433,-9252,31433,-9252, +31368,-9471,31368,-9471,31368,-9471,31368,-9471, +31301,-9690,31301,-9690,31301,-9690,31301,-9690, +31233,-9908,31233,-9908,31233,-9908,31233,-9908, +31163,-10126,31163,-10126,31163,-10126,31163,-10126, +31091,-10343,31091,-10343,31091,-10343,31091,-10343, +31018,-10560,31018,-10560,31018,-10560,31018,-10560, +30944,-10776,30944,-10776,30944,-10776,30944,-10776, +30868,-10992,30868,-10992,30868,-10992,30868,-10992, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30711,-11422,30711,-11422,30711,-11422,30711,-11422, +30631,-11636,30631,-11636,30631,-11636,30631,-11636, +30549,-11850,30549,-11850,30549,-11850,30549,-11850, +30465,-12063,30465,-12063,30465,-12063,30465,-12063, +30381,-12275,30381,-12275,30381,-12275,30381,-12275, +30294,-12487,30294,-12487,30294,-12487,30294,-12487, +30206,-12698,30206,-12698,30206,-12698,30206,-12698, +30117,-12909,30117,-12909,30117,-12909,30117,-12909, +30026,-13119,30026,-13119,30026,-13119,30026,-13119, +29934,-13328,29934,-13328,29934,-13328,29934,-13328, +29840,-13537,29840,-13537,29840,-13537,29840,-13537, +29745,-13745,29745,-13745,29745,-13745,29745,-13745, +29648,-13952,29648,-13952,29648,-13952,29648,-13952, +29550,-14159,29550,-14159,29550,-14159,29550,-14159, +29450,-14365,29450,-14365,29450,-14365,29450,-14365, +29349,-14570,29349,-14570,29349,-14570,29349,-14570, +29247,-14774,29247,-14774,29247,-14774,29247,-14774, +29143,-14978,29143,-14978,29143,-14978,29143,-14978, +29038,-15181,29038,-15181,29038,-15181,29038,-15181, +28931,-15384,28931,-15384,28931,-15384,28931,-15384, +28823,-15585,28823,-15585,28823,-15585,28823,-15585, +28713,-15786,28713,-15786,28713,-15786,28713,-15786, +28603,-15986,28603,-15986,28603,-15986,28603,-15986, +28490,-16185,28490,-16185,28490,-16185,28490,-16185, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28261,-16582,28261,-16582,28261,-16582,28261,-16582, +28145,-16779,28145,-16779,28145,-16779,28145,-16779, +28027,-16975,28027,-16975,28027,-16975,28027,-16975, +27908,-17170,27908,-17170,27908,-17170,27908,-17170, +27787,-17364,27787,-17364,27787,-17364,27787,-17364, +27666,-17558,27666,-17558,27666,-17558,27666,-17558, +27542,-17751,27542,-17751,27542,-17751,27542,-17751, +27418,-17943,27418,-17943,27418,-17943,27418,-17943, +27292,-18133,27292,-18133,27292,-18133,27292,-18133, +27165,-18324,27165,-18324,27165,-18324,27165,-18324, +27036,-18513,27036,-18513,27036,-18513,27036,-18513, +26906,-18701,26906,-18701,26906,-18701,26906,-18701, +26775,-18888,26775,-18888,26775,-18888,26775,-18888, +26642,-19075,26642,-19075,26642,-19075,26642,-19075, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +26373,-19445,26373,-19445,26373,-19445,26373,-19445, +26237,-19629,26237,-19629,26237,-19629,26237,-19629, +26099,-19811,26099,-19811,26099,-19811,26099,-19811, +25960,-19993,25960,-19993,25960,-19993,25960,-19993, +25820,-20174,25820,-20174,25820,-20174,25820,-20174, +25679,-20354,25679,-20354,25679,-20354,25679,-20354, +25536,-20532,25536,-20532,25536,-20532,25536,-20532, +25392,-20710,25392,-20710,25392,-20710,25392,-20710, +25247,-20887,25247,-20887,25247,-20887,25247,-20887, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24953,-21237,24953,-21237,24953,-21237,24953,-21237, +24804,-21411,24804,-21411,24804,-21411,24804,-21411, +24654,-21584,24654,-21584,24654,-21584,24654,-21584, +24503,-21755,24503,-21755,24503,-21755,24503,-21755, +24350,-21926,24350,-21926,24350,-21926,24350,-21926, +24196,-22095,24196,-22095,24196,-22095,24196,-22095, +24042,-22264,24042,-22264,24042,-22264,24042,-22264, +23886,-22431,23886,-22431,23886,-22431,23886,-22431, +23728,-22597,23728,-22597,23728,-22597,23728,-22597, +23570,-22762,23570,-22762,23570,-22762,23570,-22762, +23411,-22926,23411,-22926,23411,-22926,23411,-22926, +23250,-23089,23250,-23089,23250,-23089,23250,-23089, +23088,-23251,23088,-23251,23088,-23251,23088,-23251, +22925,-23412,22925,-23412,22925,-23412,22925,-23412, +22761,-23571,22761,-23571,22761,-23571,22761,-23571, +22596,-23729,22596,-23729,22596,-23729,22596,-23729, +22430,-23887,22430,-23887,22430,-23887,22430,-23887, +22263,-24043,22263,-24043,22263,-24043,22263,-24043, +22094,-24197,22094,-24197,22094,-24197,22094,-24197, +21925,-24351,21925,-24351,21925,-24351,21925,-24351, +21754,-24504,21754,-24504,21754,-24504,21754,-24504, +21583,-24655,21583,-24655,21583,-24655,21583,-24655, +21410,-24805,21410,-24805,21410,-24805,21410,-24805, +21236,-24954,21236,-24954,21236,-24954,21236,-24954, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20886,-25248,20886,-25248,20886,-25248,20886,-25248, +20709,-25393,20709,-25393,20709,-25393,20709,-25393, +20531,-25537,20531,-25537,20531,-25537,20531,-25537, +20353,-25680,20353,-25680,20353,-25680,20353,-25680, +20173,-25821,20173,-25821,20173,-25821,20173,-25821, +19992,-25961,19992,-25961,19992,-25961,19992,-25961, +19810,-26100,19810,-26100,19810,-26100,19810,-26100, +19628,-26238,19628,-26238,19628,-26238,19628,-26238, +19444,-26374,19444,-26374,19444,-26374,19444,-26374, +19259,-26510,19259,-26510,19259,-26510,19259,-26510, +19074,-26643,19074,-26643,19074,-26643,19074,-26643, +18887,-26776,18887,-26776,18887,-26776,18887,-26776, +18700,-26907,18700,-26907,18700,-26907,18700,-26907, +18512,-27037,18512,-27037,18512,-27037,18512,-27037, +18323,-27166,18323,-27166,18323,-27166,18323,-27166, +18132,-27293,18132,-27293,18132,-27293,18132,-27293, +17942,-27419,17942,-27419,17942,-27419,17942,-27419, +17750,-27543,17750,-27543,17750,-27543,17750,-27543, +17557,-27667,17557,-27667,17557,-27667,17557,-27667, +17363,-27788,17363,-27788,17363,-27788,17363,-27788, +17169,-27909,17169,-27909,17169,-27909,17169,-27909, +16974,-28028,16974,-28028,16974,-28028,16974,-28028, +16778,-28146,16778,-28146,16778,-28146,16778,-28146, +16581,-28262,16581,-28262,16581,-28262,16581,-28262, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +16184,-28491,16184,-28491,16184,-28491,16184,-28491, +15985,-28604,15985,-28604,15985,-28604,15985,-28604, +15785,-28714,15785,-28714,15785,-28714,15785,-28714, +15584,-28824,15584,-28824,15584,-28824,15584,-28824, +15383,-28932,15383,-28932,15383,-28932,15383,-28932, +15180,-29039,15180,-29039,15180,-29039,15180,-29039, +14977,-29144,14977,-29144,14977,-29144,14977,-29144, +14773,-29248,14773,-29248,14773,-29248,14773,-29248, +14569,-29350,14569,-29350,14569,-29350,14569,-29350, +14364,-29451,14364,-29451,14364,-29451,14364,-29451, +14158,-29551,14158,-29551,14158,-29551,14158,-29551, +13951,-29649,13951,-29649,13951,-29649,13951,-29649, +13744,-29746,13744,-29746,13744,-29746,13744,-29746, +13536,-29841,13536,-29841,13536,-29841,13536,-29841, +13327,-29935,13327,-29935,13327,-29935,13327,-29935, +13118,-30027,13118,-30027,13118,-30027,13118,-30027, +12908,-30118,12908,-30118,12908,-30118,12908,-30118, +12697,-30207,12697,-30207,12697,-30207,12697,-30207, +12486,-30295,12486,-30295,12486,-30295,12486,-30295, +12274,-30382,12274,-30382,12274,-30382,12274,-30382, +12062,-30466,12062,-30466,12062,-30466,12062,-30466, +11849,-30550,11849,-30550,11849,-30550,11849,-30550, +11635,-30632,11635,-30632,11635,-30632,11635,-30632, +11421,-30712,11421,-30712,11421,-30712,11421,-30712, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +10991,-30869,10991,-30869,10991,-30869,10991,-30869, +10775,-30945,10775,-30945,10775,-30945,10775,-30945, +10559,-31019,10559,-31019,10559,-31019,10559,-31019, +10342,-31092,10342,-31092,10342,-31092,10342,-31092, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +9907,-31234,9907,-31234,9907,-31234,9907,-31234, +9689,-31302,9689,-31302,9689,-31302,9689,-31302, +9470,-31369,9470,-31369,9470,-31369,9470,-31369, +9251,-31434,9251,-31434,9251,-31434,9251,-31434, +9031,-31498,9031,-31498,9031,-31498,9031,-31498, +8811,-31560,8811,-31560,8811,-31560,8811,-31560, +8591,-31621,8591,-31621,8591,-31621,8591,-31621, +8370,-31680,8370,-31680,8370,-31680,8370,-31680, +8148,-31738,8148,-31738,8148,-31738,8148,-31738, +7927,-31794,7927,-31794,7927,-31794,7927,-31794, +7704,-31849,7704,-31849,7704,-31849,7704,-31849, +7482,-31902,7482,-31902,7482,-31902,7482,-31902, +7259,-31953,7259,-31953,7259,-31953,7259,-31953, +7036,-32003,7036,-32003,7036,-32003,7036,-32003, +6812,-32051,6812,-32051,6812,-32051,6812,-32051, +6588,-32098,6588,-32098,6588,-32098,6588,-32098, +6364,-32143,6364,-32143,6364,-32143,6364,-32143, +6139,-32187,6139,-32187,6139,-32187,6139,-32187, +5915,-32229,5915,-32229,5915,-32229,5915,-32229, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5464,-32309,5464,-32309,5464,-32309,5464,-32309, +5238,-32346,5238,-32346,5238,-32346,5238,-32346, +5012,-32382,5012,-32382,5012,-32382,5012,-32382, +4786,-32416,4786,-32416,4786,-32416,4786,-32416, +4560,-32449,4560,-32449,4560,-32449,4560,-32449, +4333,-32480,4333,-32480,4333,-32480,4333,-32480, +4106,-32509,4106,-32509,4106,-32509,4106,-32509, +3879,-32537,3879,-32537,3879,-32537,3879,-32537, +3652,-32563,3652,-32563,3652,-32563,3652,-32563, +3425,-32588,3425,-32588,3425,-32588,3425,-32588, +3197,-32611,3197,-32611,3197,-32611,3197,-32611, +2969,-32633,2969,-32633,2969,-32633,2969,-32633, +2741,-32653,2741,-32653,2741,-32653,2741,-32653, +2513,-32671,2513,-32671,2513,-32671,2513,-32671, +2285,-32688,2285,-32688,2285,-32688,2285,-32688, +2057,-32703,2057,-32703,2057,-32703,2057,-32703, +1829,-32716,1829,-32716,1829,-32716,1829,-32716, +1600,-32728,1600,-32728,1600,-32728,1600,-32728, +1372,-32739,1372,-32739,1372,-32739,1372,-32739, +1143,-32748,1143,-32748,1143,-32748,1143,-32748, +914,-32755,914,-32755,914,-32755,914,-32755, +686,-32760,686,-32760,686,-32760,686,-32760, +457,-32764,457,-32764,457,-32764,457,-32764, +228,-32767,228,-32767,228,-32767,228,-32767, +0,-32767,0,-32767,0,-32767,0,-32767, +-229,-32767,-229,-32767,-229,-32767,-229,-32767, +-458,-32764,-458,-32764,-458,-32764,-458,-32764, +-687,-32760,-687,-32760,-687,-32760,-687,-32760, +-915,-32755,-915,-32755,-915,-32755,-915,-32755, +-1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, +-1373,-32739,-1373,-32739,-1373,-32739,-1373,-32739, +-1601,-32728,-1601,-32728,-1601,-32728,-1601,-32728, +-1830,-32716,-1830,-32716,-1830,-32716,-1830,-32716, +-2058,-32703,-2058,-32703,-2058,-32703,-2058,-32703, +-2286,-32688,-2286,-32688,-2286,-32688,-2286,-32688, +-2514,-32671,-2514,-32671,-2514,-32671,-2514,-32671, +-2742,-32653,-2742,-32653,-2742,-32653,-2742,-32653, +-2970,-32633,-2970,-32633,-2970,-32633,-2970,-32633, +-3198,-32611,-3198,-32611,-3198,-32611,-3198,-32611, +-3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, +-3653,-32563,-3653,-32563,-3653,-32563,-3653,-32563, +-3880,-32537,-3880,-32537,-3880,-32537,-3880,-32537, +-4107,-32509,-4107,-32509,-4107,-32509,-4107,-32509, +-4334,-32480,-4334,-32480,-4334,-32480,-4334,-32480, +-4561,-32449,-4561,-32449,-4561,-32449,-4561,-32449, +-4787,-32416,-4787,-32416,-4787,-32416,-4787,-32416, +-5013,-32382,-5013,-32382,-5013,-32382,-5013,-32382, +-5239,-32346,-5239,-32346,-5239,-32346,-5239,-32346, +-5465,-32309,-5465,-32309,-5465,-32309,-5465,-32309, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-5916,-32229,-5916,-32229,-5916,-32229,-5916,-32229, +-6140,-32187,-6140,-32187,-6140,-32187,-6140,-32187, +-6365,-32143,-6365,-32143,-6365,-32143,-6365,-32143, +-6589,-32098,-6589,-32098,-6589,-32098,-6589,-32098, +-6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, +-7037,-32003,-7037,-32003,-7037,-32003,-7037,-32003, +-7260,-31953,-7260,-31953,-7260,-31953,-7260,-31953, +-7483,-31902,-7483,-31902,-7483,-31902,-7483,-31902, +-7705,-31849,-7705,-31849,-7705,-31849,-7705,-31849, +-7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, +-8149,-31738,-8149,-31738,-8149,-31738,-8149,-31738, +-8371,-31680,-8371,-31680,-8371,-31680,-8371,-31680, +-8592,-31621,-8592,-31621,-8592,-31621,-8592,-31621, +-8812,-31560,-8812,-31560,-8812,-31560,-8812,-31560, +-9032,-31498,-9032,-31498,-9032,-31498,-9032,-31498, +-9252,-31434,-9252,-31434,-9252,-31434,-9252,-31434, +-9471,-31369,-9471,-31369,-9471,-31369,-9471,-31369, +-9690,-31302,-9690,-31302,-9690,-31302,-9690,-31302, +-9908,-31234,-9908,-31234,-9908,-31234,-9908,-31234, +-10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, +-10343,-31092,-10343,-31092,-10343,-31092,-10343,-31092, +-10560,-31019,-10560,-31019,-10560,-31019,-10560,-31019, +-10776,-30945,-10776,-30945,-10776,-30945,-10776,-30945, +-10992,-30869,-10992,-30869,-10992,-30869,-10992,-30869, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-11422,-30712,-11422,-30712,-11422,-30712,-11422,-30712, +-11636,-30632,-11636,-30632,-11636,-30632,-11636,-30632, +-11850,-30550,-11850,-30550,-11850,-30550,-11850,-30550, +-12063,-30466,-12063,-30466,-12063,-30466,-12063,-30466, +-12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, +-12487,-30295,-12487,-30295,-12487,-30295,-12487,-30295, +-12698,-30207,-12698,-30207,-12698,-30207,-12698,-30207, +-12909,-30118,-12909,-30118,-12909,-30118,-12909,-30118, +-13119,-30027,-13119,-30027,-13119,-30027,-13119,-30027, +-13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, +-13537,-29841,-13537,-29841,-13537,-29841,-13537,-29841, +-13745,-29746,-13745,-29746,-13745,-29746,-13745,-29746, +-13952,-29649,-13952,-29649,-13952,-29649,-13952,-29649, +-14159,-29551,-14159,-29551,-14159,-29551,-14159,-29551, +-14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, +-14570,-29350,-14570,-29350,-14570,-29350,-14570,-29350, +-14774,-29248,-14774,-29248,-14774,-29248,-14774,-29248, +-14978,-29144,-14978,-29144,-14978,-29144,-14978,-29144, +-15181,-29039,-15181,-29039,-15181,-29039,-15181,-29039, +-15384,-28932,-15384,-28932,-15384,-28932,-15384,-28932, +-15585,-28824,-15585,-28824,-15585,-28824,-15585,-28824, +-15786,-28714,-15786,-28714,-15786,-28714,-15786,-28714, +-15986,-28604,-15986,-28604,-15986,-28604,-15986,-28604, +-16185,-28491,-16185,-28491,-16185,-28491,-16185,-28491}; +static int16_t twb900[299*2*4] = {32763,-458,32763,-458,32763,-458,32763,-458, +32754,-915,32754,-915,32754,-915,32754,-915, +32738,-1373,32738,-1373,32738,-1373,32738,-1373, +32715,-1830,32715,-1830,32715,-1830,32715,-1830, +32687,-2286,32687,-2286,32687,-2286,32687,-2286, +32652,-2742,32652,-2742,32652,-2742,32652,-2742, +32610,-3198,32610,-3198,32610,-3198,32610,-3198, +32562,-3653,32562,-3653,32562,-3653,32562,-3653, +32508,-4107,32508,-4107,32508,-4107,32508,-4107, +32448,-4561,32448,-4561,32448,-4561,32448,-4561, +32381,-5013,32381,-5013,32381,-5013,32381,-5013, +32308,-5465,32308,-5465,32308,-5465,32308,-5465, +32228,-5916,32228,-5916,32228,-5916,32228,-5916, +32142,-6365,32142,-6365,32142,-6365,32142,-6365, +32050,-6813,32050,-6813,32050,-6813,32050,-6813, +31952,-7260,31952,-7260,31952,-7260,31952,-7260, +31848,-7705,31848,-7705,31848,-7705,31848,-7705, +31737,-8149,31737,-8149,31737,-8149,31737,-8149, +31620,-8592,31620,-8592,31620,-8592,31620,-8592, +31497,-9032,31497,-9032,31497,-9032,31497,-9032, +31368,-9471,31368,-9471,31368,-9471,31368,-9471, +31233,-9908,31233,-9908,31233,-9908,31233,-9908, +31091,-10343,31091,-10343,31091,-10343,31091,-10343, +30944,-10776,30944,-10776,30944,-10776,30944,-10776, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30631,-11636,30631,-11636,30631,-11636,30631,-11636, +30465,-12063,30465,-12063,30465,-12063,30465,-12063, +30294,-12487,30294,-12487,30294,-12487,30294,-12487, +30117,-12909,30117,-12909,30117,-12909,30117,-12909, +29934,-13328,29934,-13328,29934,-13328,29934,-13328, +29745,-13745,29745,-13745,29745,-13745,29745,-13745, +29550,-14159,29550,-14159,29550,-14159,29550,-14159, +29349,-14570,29349,-14570,29349,-14570,29349,-14570, +29143,-14978,29143,-14978,29143,-14978,29143,-14978, +28931,-15384,28931,-15384,28931,-15384,28931,-15384, +28713,-15786,28713,-15786,28713,-15786,28713,-15786, +28490,-16185,28490,-16185,28490,-16185,28490,-16185, +28261,-16582,28261,-16582,28261,-16582,28261,-16582, +28027,-16975,28027,-16975,28027,-16975,28027,-16975, +27787,-17364,27787,-17364,27787,-17364,27787,-17364, +27542,-17751,27542,-17751,27542,-17751,27542,-17751, +27292,-18133,27292,-18133,27292,-18133,27292,-18133, +27036,-18513,27036,-18513,27036,-18513,27036,-18513, +26775,-18888,26775,-18888,26775,-18888,26775,-18888, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +26237,-19629,26237,-19629,26237,-19629,26237,-19629, +25960,-19993,25960,-19993,25960,-19993,25960,-19993, +25679,-20354,25679,-20354,25679,-20354,25679,-20354, +25392,-20710,25392,-20710,25392,-20710,25392,-20710, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24804,-21411,24804,-21411,24804,-21411,24804,-21411, +24503,-21755,24503,-21755,24503,-21755,24503,-21755, +24196,-22095,24196,-22095,24196,-22095,24196,-22095, +23886,-22431,23886,-22431,23886,-22431,23886,-22431, +23570,-22762,23570,-22762,23570,-22762,23570,-22762, +23250,-23089,23250,-23089,23250,-23089,23250,-23089, +22925,-23412,22925,-23412,22925,-23412,22925,-23412, +22596,-23729,22596,-23729,22596,-23729,22596,-23729, +22263,-24043,22263,-24043,22263,-24043,22263,-24043, +21925,-24351,21925,-24351,21925,-24351,21925,-24351, +21583,-24655,21583,-24655,21583,-24655,21583,-24655, +21236,-24954,21236,-24954,21236,-24954,21236,-24954, +20886,-25248,20886,-25248,20886,-25248,20886,-25248, +20531,-25537,20531,-25537,20531,-25537,20531,-25537, +20173,-25821,20173,-25821,20173,-25821,20173,-25821, +19810,-26100,19810,-26100,19810,-26100,19810,-26100, +19444,-26374,19444,-26374,19444,-26374,19444,-26374, +19074,-26643,19074,-26643,19074,-26643,19074,-26643, +18700,-26907,18700,-26907,18700,-26907,18700,-26907, +18323,-27166,18323,-27166,18323,-27166,18323,-27166, +17942,-27419,17942,-27419,17942,-27419,17942,-27419, +17557,-27667,17557,-27667,17557,-27667,17557,-27667, +17169,-27909,17169,-27909,17169,-27909,17169,-27909, +16778,-28146,16778,-28146,16778,-28146,16778,-28146, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15985,-28604,15985,-28604,15985,-28604,15985,-28604, +15584,-28824,15584,-28824,15584,-28824,15584,-28824, +15180,-29039,15180,-29039,15180,-29039,15180,-29039, +14773,-29248,14773,-29248,14773,-29248,14773,-29248, +14364,-29451,14364,-29451,14364,-29451,14364,-29451, +13951,-29649,13951,-29649,13951,-29649,13951,-29649, +13536,-29841,13536,-29841,13536,-29841,13536,-29841, +13118,-30027,13118,-30027,13118,-30027,13118,-30027, +12697,-30207,12697,-30207,12697,-30207,12697,-30207, +12274,-30382,12274,-30382,12274,-30382,12274,-30382, +11849,-30550,11849,-30550,11849,-30550,11849,-30550, +11421,-30712,11421,-30712,11421,-30712,11421,-30712, +10991,-30869,10991,-30869,10991,-30869,10991,-30869, +10559,-31019,10559,-31019,10559,-31019,10559,-31019, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +9689,-31302,9689,-31302,9689,-31302,9689,-31302, +9251,-31434,9251,-31434,9251,-31434,9251,-31434, +8811,-31560,8811,-31560,8811,-31560,8811,-31560, +8370,-31680,8370,-31680,8370,-31680,8370,-31680, +7927,-31794,7927,-31794,7927,-31794,7927,-31794, +7482,-31902,7482,-31902,7482,-31902,7482,-31902, +7036,-32003,7036,-32003,7036,-32003,7036,-32003, +6588,-32098,6588,-32098,6588,-32098,6588,-32098, +6139,-32187,6139,-32187,6139,-32187,6139,-32187, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5238,-32346,5238,-32346,5238,-32346,5238,-32346, +4786,-32416,4786,-32416,4786,-32416,4786,-32416, +4333,-32480,4333,-32480,4333,-32480,4333,-32480, +3879,-32537,3879,-32537,3879,-32537,3879,-32537, +3425,-32588,3425,-32588,3425,-32588,3425,-32588, +2969,-32633,2969,-32633,2969,-32633,2969,-32633, +2513,-32671,2513,-32671,2513,-32671,2513,-32671, +2057,-32703,2057,-32703,2057,-32703,2057,-32703, +1600,-32728,1600,-32728,1600,-32728,1600,-32728, +1143,-32748,1143,-32748,1143,-32748,1143,-32748, +686,-32760,686,-32760,686,-32760,686,-32760, +228,-32767,228,-32767,228,-32767,228,-32767, +-229,-32767,-229,-32767,-229,-32767,-229,-32767, +-687,-32760,-687,-32760,-687,-32760,-687,-32760, +-1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, +-1601,-32728,-1601,-32728,-1601,-32728,-1601,-32728, +-2058,-32703,-2058,-32703,-2058,-32703,-2058,-32703, +-2514,-32671,-2514,-32671,-2514,-32671,-2514,-32671, +-2970,-32633,-2970,-32633,-2970,-32633,-2970,-32633, +-3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, +-3880,-32537,-3880,-32537,-3880,-32537,-3880,-32537, +-4334,-32480,-4334,-32480,-4334,-32480,-4334,-32480, +-4787,-32416,-4787,-32416,-4787,-32416,-4787,-32416, +-5239,-32346,-5239,-32346,-5239,-32346,-5239,-32346, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-6140,-32187,-6140,-32187,-6140,-32187,-6140,-32187, +-6589,-32098,-6589,-32098,-6589,-32098,-6589,-32098, +-7037,-32003,-7037,-32003,-7037,-32003,-7037,-32003, +-7483,-31902,-7483,-31902,-7483,-31902,-7483,-31902, +-7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, +-8371,-31680,-8371,-31680,-8371,-31680,-8371,-31680, +-8812,-31560,-8812,-31560,-8812,-31560,-8812,-31560, +-9252,-31434,-9252,-31434,-9252,-31434,-9252,-31434, +-9690,-31302,-9690,-31302,-9690,-31302,-9690,-31302, +-10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, +-10560,-31019,-10560,-31019,-10560,-31019,-10560,-31019, +-10992,-30869,-10992,-30869,-10992,-30869,-10992,-30869, +-11422,-30712,-11422,-30712,-11422,-30712,-11422,-30712, +-11850,-30550,-11850,-30550,-11850,-30550,-11850,-30550, +-12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, +-12698,-30207,-12698,-30207,-12698,-30207,-12698,-30207, +-13119,-30027,-13119,-30027,-13119,-30027,-13119,-30027, +-13537,-29841,-13537,-29841,-13537,-29841,-13537,-29841, +-13952,-29649,-13952,-29649,-13952,-29649,-13952,-29649, +-14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, +-14774,-29248,-14774,-29248,-14774,-29248,-14774,-29248, +-15181,-29039,-15181,-29039,-15181,-29039,-15181,-29039, +-15585,-28824,-15585,-28824,-15585,-28824,-15585,-28824, +-15986,-28604,-15986,-28604,-15986,-28604,-15986,-28604, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-16779,-28146,-16779,-28146,-16779,-28146,-16779,-28146, +-17170,-27909,-17170,-27909,-17170,-27909,-17170,-27909, +-17558,-27667,-17558,-27667,-17558,-27667,-17558,-27667, +-17943,-27419,-17943,-27419,-17943,-27419,-17943,-27419, +-18324,-27166,-18324,-27166,-18324,-27166,-18324,-27166, +-18701,-26907,-18701,-26907,-18701,-26907,-18701,-26907, +-19075,-26643,-19075,-26643,-19075,-26643,-19075,-26643, +-19445,-26374,-19445,-26374,-19445,-26374,-19445,-26374, +-19811,-26100,-19811,-26100,-19811,-26100,-19811,-26100, +-20174,-25821,-20174,-25821,-20174,-25821,-20174,-25821, +-20532,-25537,-20532,-25537,-20532,-25537,-20532,-25537, +-20887,-25248,-20887,-25248,-20887,-25248,-20887,-25248, +-21237,-24954,-21237,-24954,-21237,-24954,-21237,-24954, +-21584,-24655,-21584,-24655,-21584,-24655,-21584,-24655, +-21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, +-22264,-24043,-22264,-24043,-22264,-24043,-22264,-24043, +-22597,-23729,-22597,-23729,-22597,-23729,-22597,-23729, +-22926,-23412,-22926,-23412,-22926,-23412,-22926,-23412, +-23251,-23089,-23251,-23089,-23251,-23089,-23251,-23089, +-23571,-22762,-23571,-22762,-23571,-22762,-23571,-22762, +-23887,-22431,-23887,-22431,-23887,-22431,-23887,-22431, +-24197,-22095,-24197,-22095,-24197,-22095,-24197,-22095, +-24504,-21755,-24504,-21755,-24504,-21755,-24504,-21755, +-24805,-21411,-24805,-21411,-24805,-21411,-24805,-21411, +-25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, +-25393,-20710,-25393,-20710,-25393,-20710,-25393,-20710, +-25680,-20354,-25680,-20354,-25680,-20354,-25680,-20354, +-25961,-19993,-25961,-19993,-25961,-19993,-25961,-19993, +-26238,-19629,-26238,-19629,-26238,-19629,-26238,-19629, +-26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, +-26776,-18888,-26776,-18888,-26776,-18888,-26776,-18888, +-27037,-18513,-27037,-18513,-27037,-18513,-27037,-18513, +-27293,-18133,-27293,-18133,-27293,-18133,-27293,-18133, +-27543,-17751,-27543,-17751,-27543,-17751,-27543,-17751, +-27788,-17364,-27788,-17364,-27788,-17364,-27788,-17364, +-28028,-16975,-28028,-16975,-28028,-16975,-28028,-16975, +-28262,-16582,-28262,-16582,-28262,-16582,-28262,-16582, +-28491,-16185,-28491,-16185,-28491,-16185,-28491,-16185, +-28714,-15786,-28714,-15786,-28714,-15786,-28714,-15786, +-28932,-15384,-28932,-15384,-28932,-15384,-28932,-15384, +-29144,-14978,-29144,-14978,-29144,-14978,-29144,-14978, +-29350,-14570,-29350,-14570,-29350,-14570,-29350,-14570, +-29551,-14159,-29551,-14159,-29551,-14159,-29551,-14159, +-29746,-13745,-29746,-13745,-29746,-13745,-29746,-13745, +-29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, +-30118,-12909,-30118,-12909,-30118,-12909,-30118,-12909, +-30295,-12487,-30295,-12487,-30295,-12487,-30295,-12487, +-30466,-12063,-30466,-12063,-30466,-12063,-30466,-12063, +-30632,-11636,-30632,-11636,-30632,-11636,-30632,-11636, +-30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, +-30945,-10776,-30945,-10776,-30945,-10776,-30945,-10776, +-31092,-10343,-31092,-10343,-31092,-10343,-31092,-10343, +-31234,-9908,-31234,-9908,-31234,-9908,-31234,-9908, +-31369,-9471,-31369,-9471,-31369,-9471,-31369,-9471, +-31498,-9032,-31498,-9032,-31498,-9032,-31498,-9032, +-31621,-8592,-31621,-8592,-31621,-8592,-31621,-8592, +-31738,-8149,-31738,-8149,-31738,-8149,-31738,-8149, +-31849,-7705,-31849,-7705,-31849,-7705,-31849,-7705, +-31953,-7260,-31953,-7260,-31953,-7260,-31953,-7260, +-32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, +-32143,-6365,-32143,-6365,-32143,-6365,-32143,-6365, +-32229,-5916,-32229,-5916,-32229,-5916,-32229,-5916, +-32309,-5465,-32309,-5465,-32309,-5465,-32309,-5465, +-32382,-5013,-32382,-5013,-32382,-5013,-32382,-5013, +-32449,-4561,-32449,-4561,-32449,-4561,-32449,-4561, +-32509,-4107,-32509,-4107,-32509,-4107,-32509,-4107, +-32563,-3653,-32563,-3653,-32563,-3653,-32563,-3653, +-32611,-3198,-32611,-3198,-32611,-3198,-32611,-3198, +-32653,-2742,-32653,-2742,-32653,-2742,-32653,-2742, +-32688,-2286,-32688,-2286,-32688,-2286,-32688,-2286, +-32716,-1830,-32716,-1830,-32716,-1830,-32716,-1830, +-32739,-1373,-32739,-1373,-32739,-1373,-32739,-1373, +-32755,-915,-32755,-915,-32755,-915,-32755,-915, +-32764,-458,-32764,-458,-32764,-458,-32764,-458, +-32767,-1,-32767,-1,-32767,-1,-32767,-1, +-32764,457,-32764,457,-32764,457,-32764,457, +-32755,914,-32755,914,-32755,914,-32755,914, +-32739,1372,-32739,1372,-32739,1372,-32739,1372, +-32716,1829,-32716,1829,-32716,1829,-32716,1829, +-32688,2285,-32688,2285,-32688,2285,-32688,2285, +-32653,2741,-32653,2741,-32653,2741,-32653,2741, +-32611,3197,-32611,3197,-32611,3197,-32611,3197, +-32563,3652,-32563,3652,-32563,3652,-32563,3652, +-32509,4106,-32509,4106,-32509,4106,-32509,4106, +-32449,4560,-32449,4560,-32449,4560,-32449,4560, +-32382,5012,-32382,5012,-32382,5012,-32382,5012, +-32309,5464,-32309,5464,-32309,5464,-32309,5464, +-32229,5915,-32229,5915,-32229,5915,-32229,5915, +-32143,6364,-32143,6364,-32143,6364,-32143,6364, +-32051,6812,-32051,6812,-32051,6812,-32051,6812, +-31953,7259,-31953,7259,-31953,7259,-31953,7259, +-31849,7704,-31849,7704,-31849,7704,-31849,7704, +-31738,8148,-31738,8148,-31738,8148,-31738,8148, +-31621,8591,-31621,8591,-31621,8591,-31621,8591, +-31498,9031,-31498,9031,-31498,9031,-31498,9031, +-31369,9470,-31369,9470,-31369,9470,-31369,9470, +-31234,9907,-31234,9907,-31234,9907,-31234,9907, +-31092,10342,-31092,10342,-31092,10342,-31092,10342, +-30945,10775,-30945,10775,-30945,10775,-30945,10775, +-30791,11206,-30791,11206,-30791,11206,-30791,11206, +-30632,11635,-30632,11635,-30632,11635,-30632,11635, +-30466,12062,-30466,12062,-30466,12062,-30466,12062, +-30295,12486,-30295,12486,-30295,12486,-30295,12486, +-30118,12908,-30118,12908,-30118,12908,-30118,12908, +-29935,13327,-29935,13327,-29935,13327,-29935,13327, +-29746,13744,-29746,13744,-29746,13744,-29746,13744, +-29551,14158,-29551,14158,-29551,14158,-29551,14158, +-29350,14569,-29350,14569,-29350,14569,-29350,14569, +-29144,14977,-29144,14977,-29144,14977,-29144,14977, +-28932,15383,-28932,15383,-28932,15383,-28932,15383, +-28714,15785,-28714,15785,-28714,15785,-28714,15785, +-28491,16184,-28491,16184,-28491,16184,-28491,16184, +-28262,16581,-28262,16581,-28262,16581,-28262,16581, +-28028,16974,-28028,16974,-28028,16974,-28028,16974, +-27788,17363,-27788,17363,-27788,17363,-27788,17363, +-27543,17750,-27543,17750,-27543,17750,-27543,17750, +-27293,18132,-27293,18132,-27293,18132,-27293,18132, +-27037,18512,-27037,18512,-27037,18512,-27037,18512, +-26776,18887,-26776,18887,-26776,18887,-26776,18887, +-26510,19259,-26510,19259,-26510,19259,-26510,19259, +-26238,19628,-26238,19628,-26238,19628,-26238,19628, +-25961,19992,-25961,19992,-25961,19992,-25961,19992, +-25680,20353,-25680,20353,-25680,20353,-25680,20353, +-25393,20709,-25393,20709,-25393,20709,-25393,20709, +-25101,21062,-25101,21062,-25101,21062,-25101,21062, +-24805,21410,-24805,21410,-24805,21410,-24805,21410, +-24504,21754,-24504,21754,-24504,21754,-24504,21754, +-24197,22094,-24197,22094,-24197,22094,-24197,22094, +-23887,22430,-23887,22430,-23887,22430,-23887,22430, +-23571,22761,-23571,22761,-23571,22761,-23571,22761, +-23251,23088,-23251,23088,-23251,23088,-23251,23088, +-22926,23411,-22926,23411,-22926,23411,-22926,23411, +-22597,23728,-22597,23728,-22597,23728,-22597,23728, +-22264,24042,-22264,24042,-22264,24042,-22264,24042, +-21926,24350,-21926,24350,-21926,24350,-21926,24350, +-21584,24654,-21584,24654,-21584,24654,-21584,24654, +-21237,24953,-21237,24953,-21237,24953,-21237,24953, +-20887,25247,-20887,25247,-20887,25247,-20887,25247, +-20532,25536,-20532,25536,-20532,25536,-20532,25536, +-20174,25820,-20174,25820,-20174,25820,-20174,25820, +-19811,26099,-19811,26099,-19811,26099,-19811,26099, +-19445,26373,-19445,26373,-19445,26373,-19445,26373, +-19075,26642,-19075,26642,-19075,26642,-19075,26642, +-18701,26906,-18701,26906,-18701,26906,-18701,26906, +-18324,27165,-18324,27165,-18324,27165,-18324,27165, +-17943,27418,-17943,27418,-17943,27418,-17943,27418, +-17558,27666,-17558,27666,-17558,27666,-17558,27666, +-17170,27908,-17170,27908,-17170,27908,-17170,27908, +-16779,28145,-16779,28145,-16779,28145,-16779,28145}; + +void dft900(int16_t *x,int16_t *y,unsigned char scale_flag){ // 300 x 3 + int i,j; + __m128i *x128=(__m128i *)x; + __m128i *y128=(__m128i *)y; + __m128i *twa128=(__m128i *)&twa900[0]; + __m128i *twb128=(__m128i *)&twb900[0]; + __m128i x2128[900];// = (__m128i *)&x2128array[0]; + __m128i ytmp128[900];//=&ytmp128array3[0]; + + + + for (i=0,j=0;i<300;i++,j+=3) { + x2128[i] = x128[j]; + x2128[i+300] = x128[j+1]; + x2128[i+600] = x128[j+2]; + } + + dft300((int16_t *)x2128,(int16_t *)ytmp128,1); + dft300((int16_t *)(x2128+300),(int16_t *)(ytmp128+300),1); + dft300((int16_t *)(x2128+600),(int16_t *)(ytmp128+600),1); + + bfly3_tw1(ytmp128,ytmp128+300,ytmp128+600,y128,y128+300,y128+600); + for (i=1,j=0;i<300;i++,j++) { + bfly3(ytmp128+i, + ytmp128+300+i, + ytmp128+600+i, + y128+i, + y128+300+i, + y128+600+i, + twa128+j, + twb128+j); + } + + if (scale_flag==1) { + norm128 = _mm_set1_epi16(dft_norm_table[14]); + + for (i=0;i<900;i++) { + y128[i] = _mm_slli_epi16(_mm_mulhi_epi16(y128[i],norm128),1); + } + } + + _mm_empty(); + _m_empty(); + +}; + + +/* Twiddles generated with +twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:239)/960)); +twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:239)/960)); +twc = floor(32767*exp(-sqrt(-1)*2*pi*3*(1:239)/960)); +twa2 = zeros(1,2*239); +twb2 = zeros(1,2*239); +twc2 = zeros(1,2*239); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +twb2(1:2:end) = real(twb); +twb2(2:2:end) = imag(twb); +twc2(1:2:end) = real(twc); +twc2(2:2:end) = imag(twc); +fd=fopen("twiddle_tmp.txt","w"); +fprintf(fd,"static int16_t twa960[239*2*4] = {"); +for i=1:2:(2*238) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +fprintf(fd,"\nstatic int16_t twb960[239*2*4] = {"); +for i=1:2:(2*238) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +fprintf(fd,"\nstatic int16_t twc960[239*2*4] = {"); +for i=1:2:(2*238) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); +fclose(fd); +*/ +static int16_t twa960[239*2*4] = {32766,-215,32766,-215,32766,-215,32766,-215, +32764,-429,32764,-429,32764,-429,32764,-429, +32760,-644,32760,-644,32760,-644,32760,-644, +32755,-858,32755,-858,32755,-858,32755,-858, +32749,-1073,32749,-1073,32749,-1073,32749,-1073, +32741,-1287,32741,-1287,32741,-1287,32741,-1287, +32732,-1501,32732,-1501,32732,-1501,32732,-1501, +32722,-1715,32722,-1715,32722,-1715,32722,-1715, +32710,-1930,32710,-1930,32710,-1930,32710,-1930, +32696,-2144,32696,-2144,32696,-2144,32696,-2144, +32682,-2358,32682,-2358,32682,-2358,32682,-2358, +32665,-2571,32665,-2571,32665,-2571,32665,-2571, +32648,-2785,32648,-2785,32648,-2785,32648,-2785, +32629,-2999,32629,-2999,32629,-2999,32629,-2999, +32609,-3212,32609,-3212,32609,-3212,32609,-3212, +32587,-3426,32587,-3426,32587,-3426,32587,-3426, +32564,-3639,32564,-3639,32564,-3639,32564,-3639, +32539,-3852,32539,-3852,32539,-3852,32539,-3852, +32513,-4065,32513,-4065,32513,-4065,32513,-4065, +32486,-4277,32486,-4277,32486,-4277,32486,-4277, +32457,-4490,32457,-4490,32457,-4490,32457,-4490, +32427,-4702,32427,-4702,32427,-4702,32427,-4702, +32396,-4914,32396,-4914,32396,-4914,32396,-4914, +32363,-5126,32363,-5126,32363,-5126,32363,-5126, +32329,-5338,32329,-5338,32329,-5338,32329,-5338, +32293,-5550,32293,-5550,32293,-5550,32293,-5550, +32256,-5761,32256,-5761,32256,-5761,32256,-5761, +32218,-5972,32218,-5972,32218,-5972,32218,-5972, +32178,-6183,32178,-6183,32178,-6183,32178,-6183, +32137,-6393,32137,-6393,32137,-6393,32137,-6393, +32094,-6603,32094,-6603,32094,-6603,32094,-6603, +32050,-6813,32050,-6813,32050,-6813,32050,-6813, +32005,-7023,32005,-7023,32005,-7023,32005,-7023, +31959,-7232,31959,-7232,31959,-7232,31959,-7232, +31911,-7441,31911,-7441,31911,-7441,31911,-7441, +31861,-7650,31861,-7650,31861,-7650,31861,-7650, +31810,-7858,31810,-7858,31810,-7858,31810,-7858, +31758,-8066,31758,-8066,31758,-8066,31758,-8066, +31705,-8274,31705,-8274,31705,-8274,31705,-8274, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31594,-8688,31594,-8688,31594,-8688,31594,-8688, +31536,-8895,31536,-8895,31536,-8895,31536,-8895, +31477,-9101,31477,-9101,31477,-9101,31477,-9101, +31417,-9307,31417,-9307,31417,-9307,31417,-9307, +31356,-9512,31356,-9512,31356,-9512,31356,-9512, +31293,-9717,31293,-9717,31293,-9717,31293,-9717, +31228,-9922,31228,-9922,31228,-9922,31228,-9922, +31163,-10126,31163,-10126,31163,-10126,31163,-10126, +31096,-10330,31096,-10330,31096,-10330,31096,-10330, +31028,-10533,31028,-10533,31028,-10533,31028,-10533, +30958,-10736,30958,-10736,30958,-10736,30958,-10736, +30887,-10938,30887,-10938,30887,-10938,30887,-10938, +30815,-11140,30815,-11140,30815,-11140,30815,-11140, +30741,-11342,30741,-11342,30741,-11342,30741,-11342, +30666,-11543,30666,-11543,30666,-11543,30666,-11543, +30590,-11743,30590,-11743,30590,-11743,30590,-11743, +30513,-11943,30513,-11943,30513,-11943,30513,-11943, +30434,-12143,30434,-12143,30434,-12143,30434,-12143, +30354,-12341,30354,-12341,30354,-12341,30354,-12341, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +30190,-12738,30190,-12738,30190,-12738,30190,-12738, +30106,-12935,30106,-12935,30106,-12935,30106,-12935, +30020,-13132,30020,-13132,30020,-13132,30020,-13132, +29934,-13328,29934,-13328,29934,-13328,29934,-13328, +29846,-13524,29846,-13524,29846,-13524,29846,-13524, +29757,-13719,29757,-13719,29757,-13719,29757,-13719, +29666,-13913,29666,-13913,29666,-13913,29666,-13913, +29575,-14107,29575,-14107,29575,-14107,29575,-14107, +29482,-14300,29482,-14300,29482,-14300,29482,-14300, +29387,-14493,29387,-14493,29387,-14493,29387,-14493, +29292,-14685,29292,-14685,29292,-14685,29292,-14685, +29195,-14876,29195,-14876,29195,-14876,29195,-14876, +29097,-15067,29097,-15067,29097,-15067,29097,-15067, +28998,-15257,28998,-15257,28998,-15257,28998,-15257, +28897,-15447,28897,-15447,28897,-15447,28897,-15447, +28796,-15636,28796,-15636,28796,-15636,28796,-15636, +28693,-15824,28693,-15824,28693,-15824,28693,-15824, +28589,-16011,28589,-16011,28589,-16011,28589,-16011, +28483,-16198,28483,-16198,28483,-16198,28483,-16198, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28269,-16569,28269,-16569,28269,-16569,28269,-16569, +28160,-16754,28160,-16754,28160,-16754,28160,-16754, +28049,-16938,28049,-16938,28049,-16938,28049,-16938, +27938,-17121,27938,-17121,27938,-17121,27938,-17121, +27825,-17304,27825,-17304,27825,-17304,27825,-17304, +27711,-17485,27711,-17485,27711,-17485,27711,-17485, +27596,-17666,27596,-17666,27596,-17666,27596,-17666, +27480,-17847,27480,-17847,27480,-17847,27480,-17847, +27363,-18026,27363,-18026,27363,-18026,27363,-18026, +27244,-18205,27244,-18205,27244,-18205,27244,-18205, +27125,-18383,27125,-18383,27125,-18383,27125,-18383, +27004,-18560,27004,-18560,27004,-18560,27004,-18560, +26882,-18736,26882,-18736,26882,-18736,26882,-18736, +26758,-18912,26758,-18912,26758,-18912,26758,-18912, +26634,-19087,26634,-19087,26634,-19087,26634,-19087, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +26382,-19434,26382,-19434,26382,-19434,26382,-19434, +26254,-19606,26254,-19606,26254,-19606,26254,-19606, +26125,-19777,26125,-19777,26125,-19777,26125,-19777, +25995,-19948,25995,-19948,25995,-19948,25995,-19948, +25864,-20117,25864,-20117,25864,-20117,25864,-20117, +25732,-20286,25732,-20286,25732,-20286,25732,-20286, +25599,-20454,25599,-20454,25599,-20454,25599,-20454, +25464,-20621,25464,-20621,25464,-20621,25464,-20621, +25329,-20788,25329,-20788,25329,-20788,25329,-20788, +25192,-20953,25192,-20953,25192,-20953,25192,-20953, +25054,-21117,25054,-21117,25054,-21117,25054,-21117, +24916,-21281,24916,-21281,24916,-21281,24916,-21281, +24776,-21444,24776,-21444,24776,-21444,24776,-21444, +24635,-21605,24635,-21605,24635,-21605,24635,-21605, +24493,-21766,24493,-21766,24493,-21766,24493,-21766, +24350,-21926,24350,-21926,24350,-21926,24350,-21926, +24206,-22085,24206,-22085,24206,-22085,24206,-22085, +24061,-22243,24061,-22243,24061,-22243,24061,-22243, +23915,-22400,23915,-22400,23915,-22400,23915,-22400, +23768,-22556,23768,-22556,23768,-22556,23768,-22556, +23620,-22711,23620,-22711,23620,-22711,23620,-22711, +23471,-22865,23471,-22865,23471,-22865,23471,-22865, +23320,-23018,23320,-23018,23320,-23018,23320,-23018, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +23017,-23321,23017,-23321,23017,-23321,23017,-23321, +22864,-23472,22864,-23472,22864,-23472,22864,-23472, +22710,-23621,22710,-23621,22710,-23621,22710,-23621, +22555,-23769,22555,-23769,22555,-23769,22555,-23769, +22399,-23916,22399,-23916,22399,-23916,22399,-23916, +22242,-24062,22242,-24062,22242,-24062,22242,-24062, +22084,-24207,22084,-24207,22084,-24207,22084,-24207, +21925,-24351,21925,-24351,21925,-24351,21925,-24351, +21765,-24494,21765,-24494,21765,-24494,21765,-24494, +21604,-24636,21604,-24636,21604,-24636,21604,-24636, +21443,-24777,21443,-24777,21443,-24777,21443,-24777, +21280,-24917,21280,-24917,21280,-24917,21280,-24917, +21116,-25055,21116,-25055,21116,-25055,21116,-25055, +20952,-25193,20952,-25193,20952,-25193,20952,-25193, +20787,-25330,20787,-25330,20787,-25330,20787,-25330, +20620,-25465,20620,-25465,20620,-25465,20620,-25465, +20453,-25600,20453,-25600,20453,-25600,20453,-25600, +20285,-25733,20285,-25733,20285,-25733,20285,-25733, +20116,-25865,20116,-25865,20116,-25865,20116,-25865, +19947,-25996,19947,-25996,19947,-25996,19947,-25996, +19776,-26126,19776,-26126,19776,-26126,19776,-26126, +19605,-26255,19605,-26255,19605,-26255,19605,-26255, +19433,-26383,19433,-26383,19433,-26383,19433,-26383, +19259,-26510,19259,-26510,19259,-26510,19259,-26510, +19086,-26635,19086,-26635,19086,-26635,19086,-26635, +18911,-26759,18911,-26759,18911,-26759,18911,-26759, +18735,-26883,18735,-26883,18735,-26883,18735,-26883, +18559,-27005,18559,-27005,18559,-27005,18559,-27005, +18382,-27126,18382,-27126,18382,-27126,18382,-27126, +18204,-27245,18204,-27245,18204,-27245,18204,-27245, +18025,-27364,18025,-27364,18025,-27364,18025,-27364, +17846,-27481,17846,-27481,17846,-27481,17846,-27481, +17665,-27597,17665,-27597,17665,-27597,17665,-27597, +17484,-27712,17484,-27712,17484,-27712,17484,-27712, +17303,-27826,17303,-27826,17303,-27826,17303,-27826, +17120,-27939,17120,-27939,17120,-27939,17120,-27939, +16937,-28050,16937,-28050,16937,-28050,16937,-28050, +16753,-28161,16753,-28161,16753,-28161,16753,-28161, +16568,-28270,16568,-28270,16568,-28270,16568,-28270, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +16197,-28484,16197,-28484,16197,-28484,16197,-28484, +16010,-28590,16010,-28590,16010,-28590,16010,-28590, +15823,-28694,15823,-28694,15823,-28694,15823,-28694, +15635,-28797,15635,-28797,15635,-28797,15635,-28797, +15446,-28898,15446,-28898,15446,-28898,15446,-28898, +15256,-28999,15256,-28999,15256,-28999,15256,-28999, +15066,-29098,15066,-29098,15066,-29098,15066,-29098, +14875,-29196,14875,-29196,14875,-29196,14875,-29196, +14684,-29293,14684,-29293,14684,-29293,14684,-29293, +14492,-29388,14492,-29388,14492,-29388,14492,-29388, +14299,-29483,14299,-29483,14299,-29483,14299,-29483, +14106,-29576,14106,-29576,14106,-29576,14106,-29576, +13912,-29667,13912,-29667,13912,-29667,13912,-29667, +13718,-29758,13718,-29758,13718,-29758,13718,-29758, +13523,-29847,13523,-29847,13523,-29847,13523,-29847, +13327,-29935,13327,-29935,13327,-29935,13327,-29935, +13131,-30021,13131,-30021,13131,-30021,13131,-30021, +12934,-30107,12934,-30107,12934,-30107,12934,-30107, +12737,-30191,12737,-30191,12737,-30191,12737,-30191, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +12340,-30355,12340,-30355,12340,-30355,12340,-30355, +12142,-30435,12142,-30435,12142,-30435,12142,-30435, +11942,-30514,11942,-30514,11942,-30514,11942,-30514, +11742,-30591,11742,-30591,11742,-30591,11742,-30591, +11542,-30667,11542,-30667,11542,-30667,11542,-30667, +11341,-30742,11341,-30742,11341,-30742,11341,-30742, +11139,-30816,11139,-30816,11139,-30816,11139,-30816, +10937,-30888,10937,-30888,10937,-30888,10937,-30888, +10735,-30959,10735,-30959,10735,-30959,10735,-30959, +10532,-31029,10532,-31029,10532,-31029,10532,-31029, +10329,-31097,10329,-31097,10329,-31097,10329,-31097, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +9921,-31229,9921,-31229,9921,-31229,9921,-31229, +9716,-31294,9716,-31294,9716,-31294,9716,-31294, +9511,-31357,9511,-31357,9511,-31357,9511,-31357, +9306,-31418,9306,-31418,9306,-31418,9306,-31418, +9100,-31478,9100,-31478,9100,-31478,9100,-31478, +8894,-31537,8894,-31537,8894,-31537,8894,-31537, +8687,-31595,8687,-31595,8687,-31595,8687,-31595, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +8273,-31706,8273,-31706,8273,-31706,8273,-31706, +8065,-31759,8065,-31759,8065,-31759,8065,-31759, +7857,-31811,7857,-31811,7857,-31811,7857,-31811, +7649,-31862,7649,-31862,7649,-31862,7649,-31862, +7440,-31912,7440,-31912,7440,-31912,7440,-31912, +7231,-31960,7231,-31960,7231,-31960,7231,-31960, +7022,-32006,7022,-32006,7022,-32006,7022,-32006, +6812,-32051,6812,-32051,6812,-32051,6812,-32051, +6602,-32095,6602,-32095,6602,-32095,6602,-32095, +6392,-32138,6392,-32138,6392,-32138,6392,-32138, +6182,-32179,6182,-32179,6182,-32179,6182,-32179, +5971,-32219,5971,-32219,5971,-32219,5971,-32219, +5760,-32257,5760,-32257,5760,-32257,5760,-32257, +5549,-32294,5549,-32294,5549,-32294,5549,-32294, +5337,-32330,5337,-32330,5337,-32330,5337,-32330, +5125,-32364,5125,-32364,5125,-32364,5125,-32364, +4913,-32397,4913,-32397,4913,-32397,4913,-32397, +4701,-32428,4701,-32428,4701,-32428,4701,-32428, +4489,-32458,4489,-32458,4489,-32458,4489,-32458, +4276,-32487,4276,-32487,4276,-32487,4276,-32487, +4064,-32514,4064,-32514,4064,-32514,4064,-32514, +3851,-32540,3851,-32540,3851,-32540,3851,-32540, +3638,-32565,3638,-32565,3638,-32565,3638,-32565, +3425,-32588,3425,-32588,3425,-32588,3425,-32588, +3211,-32610,3211,-32610,3211,-32610,3211,-32610, +2998,-32630,2998,-32630,2998,-32630,2998,-32630, +2784,-32649,2784,-32649,2784,-32649,2784,-32649, +2570,-32666,2570,-32666,2570,-32666,2570,-32666, +2357,-32683,2357,-32683,2357,-32683,2357,-32683, +2143,-32697,2143,-32697,2143,-32697,2143,-32697, +1929,-32711,1929,-32711,1929,-32711,1929,-32711, +1714,-32723,1714,-32723,1714,-32723,1714,-32723, +1500,-32733,1500,-32733,1500,-32733,1500,-32733, +1286,-32742,1286,-32742,1286,-32742,1286,-32742, +1072,-32750,1072,-32750,1072,-32750,1072,-32750, +857,-32756,857,-32756,857,-32756,857,-32756, +643,-32761,643,-32761,643,-32761,643,-32761, +428,-32765,428,-32765,428,-32765,428,-32765, +214,-32767,214,-32767,214,-32767,214,-32767}; + +static int16_t twb960[239*2*4] = {32764,-429,32764,-429,32764,-429,32764,-429, +32755,-858,32755,-858,32755,-858,32755,-858, +32741,-1287,32741,-1287,32741,-1287,32741,-1287, +32722,-1715,32722,-1715,32722,-1715,32722,-1715, +32696,-2144,32696,-2144,32696,-2144,32696,-2144, +32665,-2571,32665,-2571,32665,-2571,32665,-2571, +32629,-2999,32629,-2999,32629,-2999,32629,-2999, +32587,-3426,32587,-3426,32587,-3426,32587,-3426, +32539,-3852,32539,-3852,32539,-3852,32539,-3852, +32486,-4277,32486,-4277,32486,-4277,32486,-4277, +32427,-4702,32427,-4702,32427,-4702,32427,-4702, +32363,-5126,32363,-5126,32363,-5126,32363,-5126, +32293,-5550,32293,-5550,32293,-5550,32293,-5550, +32218,-5972,32218,-5972,32218,-5972,32218,-5972, +32137,-6393,32137,-6393,32137,-6393,32137,-6393, +32050,-6813,32050,-6813,32050,-6813,32050,-6813, +31959,-7232,31959,-7232,31959,-7232,31959,-7232, +31861,-7650,31861,-7650,31861,-7650,31861,-7650, +31758,-8066,31758,-8066,31758,-8066,31758,-8066, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31536,-8895,31536,-8895,31536,-8895,31536,-8895, +31417,-9307,31417,-9307,31417,-9307,31417,-9307, +31293,-9717,31293,-9717,31293,-9717,31293,-9717, +31163,-10126,31163,-10126,31163,-10126,31163,-10126, +31028,-10533,31028,-10533,31028,-10533,31028,-10533, +30887,-10938,30887,-10938,30887,-10938,30887,-10938, +30741,-11342,30741,-11342,30741,-11342,30741,-11342, +30590,-11743,30590,-11743,30590,-11743,30590,-11743, +30434,-12143,30434,-12143,30434,-12143,30434,-12143, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +30106,-12935,30106,-12935,30106,-12935,30106,-12935, +29934,-13328,29934,-13328,29934,-13328,29934,-13328, +29757,-13719,29757,-13719,29757,-13719,29757,-13719, +29575,-14107,29575,-14107,29575,-14107,29575,-14107, +29387,-14493,29387,-14493,29387,-14493,29387,-14493, +29195,-14876,29195,-14876,29195,-14876,29195,-14876, +28998,-15257,28998,-15257,28998,-15257,28998,-15257, +28796,-15636,28796,-15636,28796,-15636,28796,-15636, +28589,-16011,28589,-16011,28589,-16011,28589,-16011, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28160,-16754,28160,-16754,28160,-16754,28160,-16754, +27938,-17121,27938,-17121,27938,-17121,27938,-17121, +27711,-17485,27711,-17485,27711,-17485,27711,-17485, +27480,-17847,27480,-17847,27480,-17847,27480,-17847, +27244,-18205,27244,-18205,27244,-18205,27244,-18205, +27004,-18560,27004,-18560,27004,-18560,27004,-18560, +26758,-18912,26758,-18912,26758,-18912,26758,-18912, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +26254,-19606,26254,-19606,26254,-19606,26254,-19606, +25995,-19948,25995,-19948,25995,-19948,25995,-19948, +25732,-20286,25732,-20286,25732,-20286,25732,-20286, +25464,-20621,25464,-20621,25464,-20621,25464,-20621, +25192,-20953,25192,-20953,25192,-20953,25192,-20953, +24916,-21281,24916,-21281,24916,-21281,24916,-21281, +24635,-21605,24635,-21605,24635,-21605,24635,-21605, +24350,-21926,24350,-21926,24350,-21926,24350,-21926, +24061,-22243,24061,-22243,24061,-22243,24061,-22243, +23768,-22556,23768,-22556,23768,-22556,23768,-22556, +23471,-22865,23471,-22865,23471,-22865,23471,-22865, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22864,-23472,22864,-23472,22864,-23472,22864,-23472, +22555,-23769,22555,-23769,22555,-23769,22555,-23769, +22242,-24062,22242,-24062,22242,-24062,22242,-24062, +21925,-24351,21925,-24351,21925,-24351,21925,-24351, +21604,-24636,21604,-24636,21604,-24636,21604,-24636, +21280,-24917,21280,-24917,21280,-24917,21280,-24917, +20952,-25193,20952,-25193,20952,-25193,20952,-25193, +20620,-25465,20620,-25465,20620,-25465,20620,-25465, +20285,-25733,20285,-25733,20285,-25733,20285,-25733, +19947,-25996,19947,-25996,19947,-25996,19947,-25996, +19605,-26255,19605,-26255,19605,-26255,19605,-26255, +19259,-26510,19259,-26510,19259,-26510,19259,-26510, +18911,-26759,18911,-26759,18911,-26759,18911,-26759, +18559,-27005,18559,-27005,18559,-27005,18559,-27005, +18204,-27245,18204,-27245,18204,-27245,18204,-27245, +17846,-27481,17846,-27481,17846,-27481,17846,-27481, +17484,-27712,17484,-27712,17484,-27712,17484,-27712, +17120,-27939,17120,-27939,17120,-27939,17120,-27939, +16753,-28161,16753,-28161,16753,-28161,16753,-28161, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +16010,-28590,16010,-28590,16010,-28590,16010,-28590, +15635,-28797,15635,-28797,15635,-28797,15635,-28797, +15256,-28999,15256,-28999,15256,-28999,15256,-28999, +14875,-29196,14875,-29196,14875,-29196,14875,-29196, +14492,-29388,14492,-29388,14492,-29388,14492,-29388, +14106,-29576,14106,-29576,14106,-29576,14106,-29576, +13718,-29758,13718,-29758,13718,-29758,13718,-29758, +13327,-29935,13327,-29935,13327,-29935,13327,-29935, +12934,-30107,12934,-30107,12934,-30107,12934,-30107, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +12142,-30435,12142,-30435,12142,-30435,12142,-30435, +11742,-30591,11742,-30591,11742,-30591,11742,-30591, +11341,-30742,11341,-30742,11341,-30742,11341,-30742, +10937,-30888,10937,-30888,10937,-30888,10937,-30888, +10532,-31029,10532,-31029,10532,-31029,10532,-31029, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +9716,-31294,9716,-31294,9716,-31294,9716,-31294, +9306,-31418,9306,-31418,9306,-31418,9306,-31418, +8894,-31537,8894,-31537,8894,-31537,8894,-31537, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +8065,-31759,8065,-31759,8065,-31759,8065,-31759, +7649,-31862,7649,-31862,7649,-31862,7649,-31862, +7231,-31960,7231,-31960,7231,-31960,7231,-31960, +6812,-32051,6812,-32051,6812,-32051,6812,-32051, +6392,-32138,6392,-32138,6392,-32138,6392,-32138, +5971,-32219,5971,-32219,5971,-32219,5971,-32219, +5549,-32294,5549,-32294,5549,-32294,5549,-32294, +5125,-32364,5125,-32364,5125,-32364,5125,-32364, +4701,-32428,4701,-32428,4701,-32428,4701,-32428, +4276,-32487,4276,-32487,4276,-32487,4276,-32487, +3851,-32540,3851,-32540,3851,-32540,3851,-32540, +3425,-32588,3425,-32588,3425,-32588,3425,-32588, +2998,-32630,2998,-32630,2998,-32630,2998,-32630, +2570,-32666,2570,-32666,2570,-32666,2570,-32666, +2143,-32697,2143,-32697,2143,-32697,2143,-32697, +1714,-32723,1714,-32723,1714,-32723,1714,-32723, +1286,-32742,1286,-32742,1286,-32742,1286,-32742, +857,-32756,857,-32756,857,-32756,857,-32756, +428,-32765,428,-32765,428,-32765,428,-32765, +0,-32767,0,-32767,0,-32767,0,-32767, +-429,-32765,-429,-32765,-429,-32765,-429,-32765, +-858,-32756,-858,-32756,-858,-32756,-858,-32756, +-1287,-32742,-1287,-32742,-1287,-32742,-1287,-32742, +-1715,-32723,-1715,-32723,-1715,-32723,-1715,-32723, +-2144,-32697,-2144,-32697,-2144,-32697,-2144,-32697, +-2571,-32666,-2571,-32666,-2571,-32666,-2571,-32666, +-2999,-32630,-2999,-32630,-2999,-32630,-2999,-32630, +-3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, +-3852,-32540,-3852,-32540,-3852,-32540,-3852,-32540, +-4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, +-4702,-32428,-4702,-32428,-4702,-32428,-4702,-32428, +-5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, +-5550,-32294,-5550,-32294,-5550,-32294,-5550,-32294, +-5972,-32219,-5972,-32219,-5972,-32219,-5972,-32219, +-6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, +-6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, +-7232,-31960,-7232,-31960,-7232,-31960,-7232,-31960, +-7650,-31862,-7650,-31862,-7650,-31862,-7650,-31862, +-8066,-31759,-8066,-31759,-8066,-31759,-8066,-31759, +-8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, +-8895,-31537,-8895,-31537,-8895,-31537,-8895,-31537, +-9307,-31418,-9307,-31418,-9307,-31418,-9307,-31418, +-9717,-31294,-9717,-31294,-9717,-31294,-9717,-31294, +-10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, +-10533,-31029,-10533,-31029,-10533,-31029,-10533,-31029, +-10938,-30888,-10938,-30888,-10938,-30888,-10938,-30888, +-11342,-30742,-11342,-30742,-11342,-30742,-11342,-30742, +-11743,-30591,-11743,-30591,-11743,-30591,-11743,-30591, +-12143,-30435,-12143,-30435,-12143,-30435,-12143,-30435, +-12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, +-12935,-30107,-12935,-30107,-12935,-30107,-12935,-30107, +-13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, +-13719,-29758,-13719,-29758,-13719,-29758,-13719,-29758, +-14107,-29576,-14107,-29576,-14107,-29576,-14107,-29576, +-14493,-29388,-14493,-29388,-14493,-29388,-14493,-29388, +-14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, +-15257,-28999,-15257,-28999,-15257,-28999,-15257,-28999, +-15636,-28797,-15636,-28797,-15636,-28797,-15636,-28797, +-16011,-28590,-16011,-28590,-16011,-28590,-16011,-28590, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-16754,-28161,-16754,-28161,-16754,-28161,-16754,-28161, +-17121,-27939,-17121,-27939,-17121,-27939,-17121,-27939, +-17485,-27712,-17485,-27712,-17485,-27712,-17485,-27712, +-17847,-27481,-17847,-27481,-17847,-27481,-17847,-27481, +-18205,-27245,-18205,-27245,-18205,-27245,-18205,-27245, +-18560,-27005,-18560,-27005,-18560,-27005,-18560,-27005, +-18912,-26759,-18912,-26759,-18912,-26759,-18912,-26759, +-19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, +-19606,-26255,-19606,-26255,-19606,-26255,-19606,-26255, +-19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, +-20286,-25733,-20286,-25733,-20286,-25733,-20286,-25733, +-20621,-25465,-20621,-25465,-20621,-25465,-20621,-25465, +-20953,-25193,-20953,-25193,-20953,-25193,-20953,-25193, +-21281,-24917,-21281,-24917,-21281,-24917,-21281,-24917, +-21605,-24636,-21605,-24636,-21605,-24636,-21605,-24636, +-21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, +-22243,-24062,-22243,-24062,-22243,-24062,-22243,-24062, +-22556,-23769,-22556,-23769,-22556,-23769,-22556,-23769, +-22865,-23472,-22865,-23472,-22865,-23472,-22865,-23472, +-23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, +-23472,-22865,-23472,-22865,-23472,-22865,-23472,-22865, +-23769,-22556,-23769,-22556,-23769,-22556,-23769,-22556, +-24062,-22243,-24062,-22243,-24062,-22243,-24062,-22243, +-24351,-21926,-24351,-21926,-24351,-21926,-24351,-21926, +-24636,-21605,-24636,-21605,-24636,-21605,-24636,-21605, +-24917,-21281,-24917,-21281,-24917,-21281,-24917,-21281, +-25193,-20953,-25193,-20953,-25193,-20953,-25193,-20953, +-25465,-20621,-25465,-20621,-25465,-20621,-25465,-20621, +-25733,-20286,-25733,-20286,-25733,-20286,-25733,-20286, +-25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, +-26255,-19606,-26255,-19606,-26255,-19606,-26255,-19606, +-26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, +-26759,-18912,-26759,-18912,-26759,-18912,-26759,-18912, +-27005,-18560,-27005,-18560,-27005,-18560,-27005,-18560, +-27245,-18205,-27245,-18205,-27245,-18205,-27245,-18205, +-27481,-17847,-27481,-17847,-27481,-17847,-27481,-17847, +-27712,-17485,-27712,-17485,-27712,-17485,-27712,-17485, +-27939,-17121,-27939,-17121,-27939,-17121,-27939,-17121, +-28161,-16754,-28161,-16754,-28161,-16754,-28161,-16754, +-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, +-28590,-16011,-28590,-16011,-28590,-16011,-28590,-16011, +-28797,-15636,-28797,-15636,-28797,-15636,-28797,-15636, +-28999,-15257,-28999,-15257,-28999,-15257,-28999,-15257, +-29196,-14876,-29196,-14876,-29196,-14876,-29196,-14876, +-29388,-14493,-29388,-14493,-29388,-14493,-29388,-14493, +-29576,-14107,-29576,-14107,-29576,-14107,-29576,-14107, +-29758,-13719,-29758,-13719,-29758,-13719,-29758,-13719, +-29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, +-30107,-12935,-30107,-12935,-30107,-12935,-30107,-12935, +-30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, +-30435,-12143,-30435,-12143,-30435,-12143,-30435,-12143, +-30591,-11743,-30591,-11743,-30591,-11743,-30591,-11743, +-30742,-11342,-30742,-11342,-30742,-11342,-30742,-11342, +-30888,-10938,-30888,-10938,-30888,-10938,-30888,-10938, +-31029,-10533,-31029,-10533,-31029,-10533,-31029,-10533, +-31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, +-31294,-9717,-31294,-9717,-31294,-9717,-31294,-9717, +-31418,-9307,-31418,-9307,-31418,-9307,-31418,-9307, +-31537,-8895,-31537,-8895,-31537,-8895,-31537,-8895, +-31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, +-31759,-8066,-31759,-8066,-31759,-8066,-31759,-8066, +-31862,-7650,-31862,-7650,-31862,-7650,-31862,-7650, +-31960,-7232,-31960,-7232,-31960,-7232,-31960,-7232, +-32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, +-32138,-6393,-32138,-6393,-32138,-6393,-32138,-6393, +-32219,-5972,-32219,-5972,-32219,-5972,-32219,-5972, +-32294,-5550,-32294,-5550,-32294,-5550,-32294,-5550, +-32364,-5126,-32364,-5126,-32364,-5126,-32364,-5126, +-32428,-4702,-32428,-4702,-32428,-4702,-32428,-4702, +-32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, +-32540,-3852,-32540,-3852,-32540,-3852,-32540,-3852, +-32588,-3426,-32588,-3426,-32588,-3426,-32588,-3426, +-32630,-2999,-32630,-2999,-32630,-2999,-32630,-2999, +-32666,-2571,-32666,-2571,-32666,-2571,-32666,-2571, +-32697,-2144,-32697,-2144,-32697,-2144,-32697,-2144, +-32723,-1715,-32723,-1715,-32723,-1715,-32723,-1715, +-32742,-1287,-32742,-1287,-32742,-1287,-32742,-1287, +-32756,-858,-32756,-858,-32756,-858,-32756,-858, +-32765,-429,-32765,-429,-32765,-429,-32765,-429}; + +static int16_t twc960[239*2*4] = {32760,-644,32760,-644,32760,-644,32760,-644, +32741,-1287,32741,-1287,32741,-1287,32741,-1287, +32710,-1930,32710,-1930,32710,-1930,32710,-1930, +32665,-2571,32665,-2571,32665,-2571,32665,-2571, +32609,-3212,32609,-3212,32609,-3212,32609,-3212, +32539,-3852,32539,-3852,32539,-3852,32539,-3852, +32457,-4490,32457,-4490,32457,-4490,32457,-4490, +32363,-5126,32363,-5126,32363,-5126,32363,-5126, +32256,-5761,32256,-5761,32256,-5761,32256,-5761, +32137,-6393,32137,-6393,32137,-6393,32137,-6393, +32005,-7023,32005,-7023,32005,-7023,32005,-7023, +31861,-7650,31861,-7650,31861,-7650,31861,-7650, +31705,-8274,31705,-8274,31705,-8274,31705,-8274, +31536,-8895,31536,-8895,31536,-8895,31536,-8895, +31356,-9512,31356,-9512,31356,-9512,31356,-9512, +31163,-10126,31163,-10126,31163,-10126,31163,-10126, +30958,-10736,30958,-10736,30958,-10736,30958,-10736, +30741,-11342,30741,-11342,30741,-11342,30741,-11342, +30513,-11943,30513,-11943,30513,-11943,30513,-11943, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +30020,-13132,30020,-13132,30020,-13132,30020,-13132, +29757,-13719,29757,-13719,29757,-13719,29757,-13719, +29482,-14300,29482,-14300,29482,-14300,29482,-14300, +29195,-14876,29195,-14876,29195,-14876,29195,-14876, +28897,-15447,28897,-15447,28897,-15447,28897,-15447, +28589,-16011,28589,-16011,28589,-16011,28589,-16011, +28269,-16569,28269,-16569,28269,-16569,28269,-16569, +27938,-17121,27938,-17121,27938,-17121,27938,-17121, +27596,-17666,27596,-17666,27596,-17666,27596,-17666, +27244,-18205,27244,-18205,27244,-18205,27244,-18205, +26882,-18736,26882,-18736,26882,-18736,26882,-18736, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +26125,-19777,26125,-19777,26125,-19777,26125,-19777, +25732,-20286,25732,-20286,25732,-20286,25732,-20286, +25329,-20788,25329,-20788,25329,-20788,25329,-20788, +24916,-21281,24916,-21281,24916,-21281,24916,-21281, +24493,-21766,24493,-21766,24493,-21766,24493,-21766, +24061,-22243,24061,-22243,24061,-22243,24061,-22243, +23620,-22711,23620,-22711,23620,-22711,23620,-22711, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22710,-23621,22710,-23621,22710,-23621,22710,-23621, +22242,-24062,22242,-24062,22242,-24062,22242,-24062, +21765,-24494,21765,-24494,21765,-24494,21765,-24494, +21280,-24917,21280,-24917,21280,-24917,21280,-24917, +20787,-25330,20787,-25330,20787,-25330,20787,-25330, +20285,-25733,20285,-25733,20285,-25733,20285,-25733, +19776,-26126,19776,-26126,19776,-26126,19776,-26126, +19259,-26510,19259,-26510,19259,-26510,19259,-26510, +18735,-26883,18735,-26883,18735,-26883,18735,-26883, +18204,-27245,18204,-27245,18204,-27245,18204,-27245, +17665,-27597,17665,-27597,17665,-27597,17665,-27597, +17120,-27939,17120,-27939,17120,-27939,17120,-27939, +16568,-28270,16568,-28270,16568,-28270,16568,-28270, +16010,-28590,16010,-28590,16010,-28590,16010,-28590, +15446,-28898,15446,-28898,15446,-28898,15446,-28898, +14875,-29196,14875,-29196,14875,-29196,14875,-29196, +14299,-29483,14299,-29483,14299,-29483,14299,-29483, +13718,-29758,13718,-29758,13718,-29758,13718,-29758, +13131,-30021,13131,-30021,13131,-30021,13131,-30021, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +11942,-30514,11942,-30514,11942,-30514,11942,-30514, +11341,-30742,11341,-30742,11341,-30742,11341,-30742, +10735,-30959,10735,-30959,10735,-30959,10735,-30959, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +9511,-31357,9511,-31357,9511,-31357,9511,-31357, +8894,-31537,8894,-31537,8894,-31537,8894,-31537, +8273,-31706,8273,-31706,8273,-31706,8273,-31706, +7649,-31862,7649,-31862,7649,-31862,7649,-31862, +7022,-32006,7022,-32006,7022,-32006,7022,-32006, +6392,-32138,6392,-32138,6392,-32138,6392,-32138, +5760,-32257,5760,-32257,5760,-32257,5760,-32257, +5125,-32364,5125,-32364,5125,-32364,5125,-32364, +4489,-32458,4489,-32458,4489,-32458,4489,-32458, +3851,-32540,3851,-32540,3851,-32540,3851,-32540, +3211,-32610,3211,-32610,3211,-32610,3211,-32610, +2570,-32666,2570,-32666,2570,-32666,2570,-32666, +1929,-32711,1929,-32711,1929,-32711,1929,-32711, +1286,-32742,1286,-32742,1286,-32742,1286,-32742, +643,-32761,643,-32761,643,-32761,643,-32761, +0,-32767,0,-32767,0,-32767,0,-32767, +-644,-32761,-644,-32761,-644,-32761,-644,-32761, +-1287,-32742,-1287,-32742,-1287,-32742,-1287,-32742, +-1930,-32711,-1930,-32711,-1930,-32711,-1930,-32711, +-2571,-32666,-2571,-32666,-2571,-32666,-2571,-32666, +-3212,-32610,-3212,-32610,-3212,-32610,-3212,-32610, +-3852,-32540,-3852,-32540,-3852,-32540,-3852,-32540, +-4490,-32458,-4490,-32458,-4490,-32458,-4490,-32458, +-5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, +-5761,-32257,-5761,-32257,-5761,-32257,-5761,-32257, +-6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, +-7023,-32006,-7023,-32006,-7023,-32006,-7023,-32006, +-7650,-31862,-7650,-31862,-7650,-31862,-7650,-31862, +-8274,-31706,-8274,-31706,-8274,-31706,-8274,-31706, +-8895,-31537,-8895,-31537,-8895,-31537,-8895,-31537, +-9512,-31357,-9512,-31357,-9512,-31357,-9512,-31357, +-10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, +-10736,-30959,-10736,-30959,-10736,-30959,-10736,-30959, +-11342,-30742,-11342,-30742,-11342,-30742,-11342,-30742, +-11943,-30514,-11943,-30514,-11943,-30514,-11943,-30514, +-12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, +-13132,-30021,-13132,-30021,-13132,-30021,-13132,-30021, +-13719,-29758,-13719,-29758,-13719,-29758,-13719,-29758, +-14300,-29483,-14300,-29483,-14300,-29483,-14300,-29483, +-14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, +-15447,-28898,-15447,-28898,-15447,-28898,-15447,-28898, +-16011,-28590,-16011,-28590,-16011,-28590,-16011,-28590, +-16569,-28270,-16569,-28270,-16569,-28270,-16569,-28270, +-17121,-27939,-17121,-27939,-17121,-27939,-17121,-27939, +-17666,-27597,-17666,-27597,-17666,-27597,-17666,-27597, +-18205,-27245,-18205,-27245,-18205,-27245,-18205,-27245, +-18736,-26883,-18736,-26883,-18736,-26883,-18736,-26883, +-19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, +-19777,-26126,-19777,-26126,-19777,-26126,-19777,-26126, +-20286,-25733,-20286,-25733,-20286,-25733,-20286,-25733, +-20788,-25330,-20788,-25330,-20788,-25330,-20788,-25330, +-21281,-24917,-21281,-24917,-21281,-24917,-21281,-24917, +-21766,-24494,-21766,-24494,-21766,-24494,-21766,-24494, +-22243,-24062,-22243,-24062,-22243,-24062,-22243,-24062, +-22711,-23621,-22711,-23621,-22711,-23621,-22711,-23621, +-23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, +-23621,-22711,-23621,-22711,-23621,-22711,-23621,-22711, +-24062,-22243,-24062,-22243,-24062,-22243,-24062,-22243, +-24494,-21766,-24494,-21766,-24494,-21766,-24494,-21766, +-24917,-21281,-24917,-21281,-24917,-21281,-24917,-21281, +-25330,-20788,-25330,-20788,-25330,-20788,-25330,-20788, +-25733,-20286,-25733,-20286,-25733,-20286,-25733,-20286, +-26126,-19777,-26126,-19777,-26126,-19777,-26126,-19777, +-26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, +-26883,-18736,-26883,-18736,-26883,-18736,-26883,-18736, +-27245,-18205,-27245,-18205,-27245,-18205,-27245,-18205, +-27597,-17666,-27597,-17666,-27597,-17666,-27597,-17666, +-27939,-17121,-27939,-17121,-27939,-17121,-27939,-17121, +-28270,-16569,-28270,-16569,-28270,-16569,-28270,-16569, +-28590,-16011,-28590,-16011,-28590,-16011,-28590,-16011, +-28898,-15447,-28898,-15447,-28898,-15447,-28898,-15447, +-29196,-14876,-29196,-14876,-29196,-14876,-29196,-14876, +-29483,-14300,-29483,-14300,-29483,-14300,-29483,-14300, +-29758,-13719,-29758,-13719,-29758,-13719,-29758,-13719, +-30021,-13132,-30021,-13132,-30021,-13132,-30021,-13132, +-30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, +-30514,-11943,-30514,-11943,-30514,-11943,-30514,-11943, +-30742,-11342,-30742,-11342,-30742,-11342,-30742,-11342, +-30959,-10736,-30959,-10736,-30959,-10736,-30959,-10736, +-31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, +-31357,-9512,-31357,-9512,-31357,-9512,-31357,-9512, +-31537,-8895,-31537,-8895,-31537,-8895,-31537,-8895, +-31706,-8274,-31706,-8274,-31706,-8274,-31706,-8274, +-31862,-7650,-31862,-7650,-31862,-7650,-31862,-7650, +-32006,-7023,-32006,-7023,-32006,-7023,-32006,-7023, +-32138,-6393,-32138,-6393,-32138,-6393,-32138,-6393, +-32257,-5761,-32257,-5761,-32257,-5761,-32257,-5761, +-32364,-5126,-32364,-5126,-32364,-5126,-32364,-5126, +-32458,-4490,-32458,-4490,-32458,-4490,-32458,-4490, +-32540,-3852,-32540,-3852,-32540,-3852,-32540,-3852, +-32610,-3212,-32610,-3212,-32610,-3212,-32610,-3212, +-32666,-2571,-32666,-2571,-32666,-2571,-32666,-2571, +-32711,-1930,-32711,-1930,-32711,-1930,-32711,-1930, +-32742,-1287,-32742,-1287,-32742,-1287,-32742,-1287, +-32761,-644,-32761,-644,-32761,-644,-32761,-644, +-32767,-1,-32767,-1,-32767,-1,-32767,-1, +-32761,643,-32761,643,-32761,643,-32761,643, +-32742,1286,-32742,1286,-32742,1286,-32742,1286, +-32711,1929,-32711,1929,-32711,1929,-32711,1929, +-32666,2570,-32666,2570,-32666,2570,-32666,2570, +-32610,3211,-32610,3211,-32610,3211,-32610,3211, +-32540,3851,-32540,3851,-32540,3851,-32540,3851, +-32458,4489,-32458,4489,-32458,4489,-32458,4489, +-32364,5125,-32364,5125,-32364,5125,-32364,5125, +-32257,5760,-32257,5760,-32257,5760,-32257,5760, +-32138,6392,-32138,6392,-32138,6392,-32138,6392, +-32006,7022,-32006,7022,-32006,7022,-32006,7022, +-31862,7649,-31862,7649,-31862,7649,-31862,7649, +-31706,8273,-31706,8273,-31706,8273,-31706,8273, +-31537,8894,-31537,8894,-31537,8894,-31537,8894, +-31357,9511,-31357,9511,-31357,9511,-31357,9511, +-31164,10125,-31164,10125,-31164,10125,-31164,10125, +-30959,10735,-30959,10735,-30959,10735,-30959,10735, +-30742,11341,-30742,11341,-30742,11341,-30742,11341, +-30514,11942,-30514,11942,-30514,11942,-30514,11942, +-30273,12539,-30273,12539,-30273,12539,-30273,12539, +-30021,13131,-30021,13131,-30021,13131,-30021,13131, +-29758,13718,-29758,13718,-29758,13718,-29758,13718, +-29483,14299,-29483,14299,-29483,14299,-29483,14299, +-29196,14875,-29196,14875,-29196,14875,-29196,14875, +-28898,15446,-28898,15446,-28898,15446,-28898,15446, +-28590,16010,-28590,16010,-28590,16010,-28590,16010, +-28270,16568,-28270,16568,-28270,16568,-28270,16568, +-27939,17120,-27939,17120,-27939,17120,-27939,17120, +-27597,17665,-27597,17665,-27597,17665,-27597,17665, +-27245,18204,-27245,18204,-27245,18204,-27245,18204, +-26883,18735,-26883,18735,-26883,18735,-26883,18735, +-26510,19259,-26510,19259,-26510,19259,-26510,19259, +-26126,19776,-26126,19776,-26126,19776,-26126,19776, +-25733,20285,-25733,20285,-25733,20285,-25733,20285, +-25330,20787,-25330,20787,-25330,20787,-25330,20787, +-24917,21280,-24917,21280,-24917,21280,-24917,21280, +-24494,21765,-24494,21765,-24494,21765,-24494,21765, +-24062,22242,-24062,22242,-24062,22242,-24062,22242, +-23621,22710,-23621,22710,-23621,22710,-23621,22710, +-23170,23169,-23170,23169,-23170,23169,-23170,23169, +-22711,23620,-22711,23620,-22711,23620,-22711,23620, +-22243,24061,-22243,24061,-22243,24061,-22243,24061, +-21766,24493,-21766,24493,-21766,24493,-21766,24493, +-21281,24916,-21281,24916,-21281,24916,-21281,24916, +-20788,25329,-20788,25329,-20788,25329,-20788,25329, +-20286,25732,-20286,25732,-20286,25732,-20286,25732, +-19777,26125,-19777,26125,-19777,26125,-19777,26125, +-19260,26509,-19260,26509,-19260,26509,-19260,26509, +-18736,26882,-18736,26882,-18736,26882,-18736,26882, +-18205,27244,-18205,27244,-18205,27244,-18205,27244, +-17666,27596,-17666,27596,-17666,27596,-17666,27596, +-17121,27938,-17121,27938,-17121,27938,-17121,27938, +-16569,28269,-16569,28269,-16569,28269,-16569,28269, +-16011,28589,-16011,28589,-16011,28589,-16011,28589, +-15447,28897,-15447,28897,-15447,28897,-15447,28897, +-14876,29195,-14876,29195,-14876,29195,-14876,29195, +-14300,29482,-14300,29482,-14300,29482,-14300,29482, +-13719,29757,-13719,29757,-13719,29757,-13719,29757, +-13132,30020,-13132,30020,-13132,30020,-13132,30020, +-12540,30272,-12540,30272,-12540,30272,-12540,30272, +-11943,30513,-11943,30513,-11943,30513,-11943,30513, +-11342,30741,-11342,30741,-11342,30741,-11342,30741, +-10736,30958,-10736,30958,-10736,30958,-10736,30958, +-10126,31163,-10126,31163,-10126,31163,-10126,31163, +-9512,31356,-9512,31356,-9512,31356,-9512,31356, +-8895,31536,-8895,31536,-8895,31536,-8895,31536, +-8274,31705,-8274,31705,-8274,31705,-8274,31705, +-7650,31861,-7650,31861,-7650,31861,-7650,31861, +-7023,32005,-7023,32005,-7023,32005,-7023,32005, +-6393,32137,-6393,32137,-6393,32137,-6393,32137, +-5761,32256,-5761,32256,-5761,32256,-5761,32256, +-5126,32363,-5126,32363,-5126,32363,-5126,32363, +-4490,32457,-4490,32457,-4490,32457,-4490,32457, +-3852,32539,-3852,32539,-3852,32539,-3852,32539, +-3212,32609,-3212,32609,-3212,32609,-3212,32609, +-2571,32665,-2571,32665,-2571,32665,-2571,32665, +-1930,32710,-1930,32710,-1930,32710,-1930,32710, +-1287,32741,-1287,32741,-1287,32741,-1287,32741, +-644,32760,-644,32760,-644,32760,-644,32760}; + +void dft960(int16_t *x,int16_t *y,unsigned char scale_flag){ // 240 x 4 + int i,j; + __m128i *x128=(__m128i *)x; + __m128i *y128=(__m128i *)y; + __m128i *twa128=(__m128i *)&twa960[0]; + __m128i *twb128=(__m128i *)&twb960[0]; + __m128i *twc128=(__m128i *)&twc960[0]; + __m128i x2128[960];// = (__m128i *)&x2128array[0]; + __m128i ytmp128[960];//=&ytmp128array2[0]; + + + + for (i=0,j=0;i<240;i++,j+=4) { + x2128[i] = x128[j]; + x2128[i+240] = x128[j+1]; + x2128[i+480] = x128[j+2]; + x2128[i+720] = x128[j+3]; + } + + dft240((int16_t *)x2128,(int16_t *)ytmp128,1); + dft240((int16_t *)(x2128+240),(int16_t *)(ytmp128+240),1); + dft240((int16_t *)(x2128+480),(int16_t *)(ytmp128+480),1); + dft240((int16_t *)(x2128+720),(int16_t *)(ytmp128+720),1); + + bfly4_tw1(ytmp128,ytmp128+240,ytmp128+480,ytmp128+720,y128,y128+240,y128+480,y128+720); + for (i=1,j=0;i<240;i++,j++) { + bfly4(ytmp128+i, + ytmp128+240+i, + ytmp128+480+i, + ytmp128+720+i, + y128+i, + y128+240+i, + y128+480+i, + y128+720+i, + twa128+j, + twb128+j, + twc128+j); + } + + if (scale_flag==1) { + norm128 = _mm_set1_epi16(16384);//dft_norm_table[13]); + + for (i=0;i<960;i++) { + y128[i] = _mm_slli_epi16(_mm_mulhi_epi16(y128[i],norm128),1); + } + } + + _mm_empty(); + _m_empty(); + +}; + +/* Twiddles generated with +twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:323)/972)); +twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:323)/972)); +twa2 = zeros(1,2*323); +twb2 = zeros(1,2*323); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +twb2(1:2:end) = real(twb); +twb2(2:2:end) = imag(twb); +fd=fopen("twiddle_tmp.txt","w"); +fprintf(fd,"static int16_t twa972[323*2*4] = {"); +for i=1:2:(2*322) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +fprintf(fd,"static int16_t twb972[323*2*4] = {"); +for i=1:2:(2*322) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +fclose(fd); +*/ +static int16_t twa972[323*2*4] = {32766,-212,32766,-212,32766,-212,32766,-212, +32764,-424,32764,-424,32764,-424,32764,-424, +32760,-636,32760,-636,32760,-636,32760,-636, +32756,-848,32756,-848,32756,-848,32756,-848, +32749,-1059,32749,-1059,32749,-1059,32749,-1059, +32742,-1271,32742,-1271,32742,-1271,32742,-1271, +32733,-1483,32733,-1483,32733,-1483,32733,-1483, +32723,-1694,32723,-1694,32723,-1694,32723,-1694, +32711,-1906,32711,-1906,32711,-1906,32711,-1906, +32698,-2117,32698,-2117,32698,-2117,32698,-2117, +32684,-2328,32684,-2328,32684,-2328,32684,-2328, +32668,-2540,32668,-2540,32668,-2540,32668,-2540, +32651,-2751,32651,-2751,32651,-2751,32651,-2751, +32632,-2962,32632,-2962,32632,-2962,32632,-2962, +32613,-3173,32613,-3173,32613,-3173,32613,-3173, +32591,-3383,32591,-3383,32591,-3383,32591,-3383, +32569,-3594,32569,-3594,32569,-3594,32569,-3594, +32545,-3805,32545,-3805,32545,-3805,32545,-3805, +32520,-4015,32520,-4015,32520,-4015,32520,-4015, +32493,-4225,32493,-4225,32493,-4225,32493,-4225, +32465,-4435,32465,-4435,32465,-4435,32465,-4435, +32436,-4645,32436,-4645,32436,-4645,32436,-4645, +32405,-4854,32405,-4854,32405,-4854,32405,-4854, +32373,-5064,32373,-5064,32373,-5064,32373,-5064, +32340,-5273,32340,-5273,32340,-5273,32340,-5273, +32305,-5482,32305,-5482,32305,-5482,32305,-5482, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32231,-5899,32231,-5899,32231,-5899,32231,-5899, +32192,-6107,32192,-6107,32192,-6107,32192,-6107, +32152,-6315,32152,-6315,32152,-6315,32152,-6315, +32111,-6523,32111,-6523,32111,-6523,32111,-6523, +32068,-6730,32068,-6730,32068,-6730,32068,-6730, +32024,-6937,32024,-6937,32024,-6937,32024,-6937, +31978,-7144,31978,-7144,31978,-7144,31978,-7144, +31931,-7351,31931,-7351,31931,-7351,31931,-7351, +31883,-7557,31883,-7557,31883,-7557,31883,-7557, +31834,-7763,31834,-7763,31834,-7763,31834,-7763, +31783,-7969,31783,-7969,31783,-7969,31783,-7969, +31731,-8174,31731,-8174,31731,-8174,31731,-8174, +31677,-8379,31677,-8379,31677,-8379,31677,-8379, +31622,-8583,31622,-8583,31622,-8583,31622,-8583, +31566,-8788,31566,-8788,31566,-8788,31566,-8788, +31509,-8992,31509,-8992,31509,-8992,31509,-8992, +31450,-9195,31450,-9195,31450,-9195,31450,-9195, +31390,-9398,31390,-9398,31390,-9398,31390,-9398, +31329,-9601,31329,-9601,31329,-9601,31329,-9601, +31266,-9803,31266,-9803,31266,-9803,31266,-9803, +31202,-10005,31202,-10005,31202,-10005,31202,-10005, +31136,-10207,31136,-10207,31136,-10207,31136,-10207, +31070,-10408,31070,-10408,31070,-10408,31070,-10408, +31002,-10608,31002,-10608,31002,-10608,31002,-10608, +30933,-10808,30933,-10808,30933,-10808,30933,-10808, +30862,-11008,30862,-11008,30862,-11008,30862,-11008, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30717,-11406,30717,-11406,30717,-11406,30717,-11406, +30643,-11605,30643,-11605,30643,-11605,30643,-11605, +30567,-11802,30567,-11802,30567,-11802,30567,-11802, +30490,-12000,30490,-12000,30490,-12000,30490,-12000, +30412,-12197,30412,-12197,30412,-12197,30412,-12197, +30333,-12393,30333,-12393,30333,-12393,30333,-12393, +30252,-12589,30252,-12589,30252,-12589,30252,-12589, +30170,-12784,30170,-12784,30170,-12784,30170,-12784, +30087,-12979,30087,-12979,30087,-12979,30087,-12979, +30002,-13173,30002,-13173,30002,-13173,30002,-13173, +29916,-13367,29916,-13367,29916,-13367,29916,-13367, +29829,-13560,29829,-13560,29829,-13560,29829,-13560, +29741,-13752,29741,-13752,29741,-13752,29741,-13752, +29652,-13944,29652,-13944,29652,-13944,29652,-13944, +29561,-14136,29561,-14136,29561,-14136,29561,-14136, +29469,-14327,29469,-14327,29469,-14327,29469,-14327, +29376,-14517,29376,-14517,29376,-14517,29376,-14517, +29281,-14706,29281,-14706,29281,-14706,29281,-14706, +29185,-14895,29185,-14895,29185,-14895,29185,-14895, +29089,-15084,29089,-15084,29089,-15084,29089,-15084, +28990,-15271,28990,-15271,28990,-15271,28990,-15271, +28891,-15458,28891,-15458,28891,-15458,28891,-15458, +28791,-15645,28791,-15645,28791,-15645,28791,-15645, +28689,-15831,28689,-15831,28689,-15831,28689,-15831, +28586,-16016,28586,-16016,28586,-16016,28586,-16016, +28482,-16200,28482,-16200,28482,-16200,28482,-16200, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28270,-16567,28270,-16567,28270,-16567,28270,-16567, +28162,-16749,28162,-16749,28162,-16749,28162,-16749, +28054,-16931,28054,-16931,28054,-16931,28054,-16931, +27943,-17112,27943,-17112,27943,-17112,27943,-17112, +27832,-17292,27832,-17292,27832,-17292,27832,-17292, +27720,-17472,27720,-17472,27720,-17472,27720,-17472, +27606,-17651,27606,-17651,27606,-17651,27606,-17651, +27492,-17829,27492,-17829,27492,-17829,27492,-17829, +27376,-18006,27376,-18006,27376,-18006,27376,-18006, +27259,-18183,27259,-18183,27259,-18183,27259,-18183, +27141,-18359,27141,-18359,27141,-18359,27141,-18359, +27022,-18534,27022,-18534,27022,-18534,27022,-18534, +26901,-18708,26901,-18708,26901,-18708,26901,-18708, +26780,-18882,26780,-18882,26780,-18882,26780,-18882, +26657,-19054,26657,-19054,26657,-19054,26657,-19054, +26533,-19226,26533,-19226,26533,-19226,26533,-19226, +26409,-19397,26409,-19397,26409,-19397,26409,-19397, +26283,-19568,26283,-19568,26283,-19568,26283,-19568, +26156,-19737,26156,-19737,26156,-19737,26156,-19737, +26028,-19906,26028,-19906,26028,-19906,26028,-19906, +25898,-20074,25898,-20074,25898,-20074,25898,-20074, +25768,-20241,25768,-20241,25768,-20241,25768,-20241, +25637,-20407,25637,-20407,25637,-20407,25637,-20407, +25504,-20572,25504,-20572,25504,-20572,25504,-20572, +25371,-20736,25371,-20736,25371,-20736,25371,-20736, +25236,-20900,25236,-20900,25236,-20900,25236,-20900, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24964,-21225,24964,-21225,24964,-21225,24964,-21225, +24826,-21385,24826,-21385,24826,-21385,24826,-21385, +24687,-21546,24687,-21546,24687,-21546,24687,-21546, +24548,-21705,24548,-21705,24548,-21705,24548,-21705, +24407,-21863,24407,-21863,24407,-21863,24407,-21863, +24265,-22020,24265,-22020,24265,-22020,24265,-22020, +24122,-22177,24122,-22177,24122,-22177,24122,-22177, +23978,-22332,23978,-22332,23978,-22332,23978,-22332, +23833,-22487,23833,-22487,23833,-22487,23833,-22487, +23688,-22640,23688,-22640,23688,-22640,23688,-22640, +23541,-22793,23541,-22793,23541,-22793,23541,-22793, +23393,-22945,23393,-22945,23393,-22945,23393,-22945, +23244,-23095,23244,-23095,23244,-23095,23244,-23095, +23094,-23245,23094,-23245,23094,-23245,23094,-23245, +22944,-23394,22944,-23394,22944,-23394,22944,-23394, +22792,-23542,22792,-23542,22792,-23542,22792,-23542, +22639,-23689,22639,-23689,22639,-23689,22639,-23689, +22486,-23834,22486,-23834,22486,-23834,22486,-23834, +22331,-23979,22331,-23979,22331,-23979,22331,-23979, +22176,-24123,22176,-24123,22176,-24123,22176,-24123, +22019,-24266,22019,-24266,22019,-24266,22019,-24266, +21862,-24408,21862,-24408,21862,-24408,21862,-24408, +21704,-24549,21704,-24549,21704,-24549,21704,-24549, +21545,-24688,21545,-24688,21545,-24688,21545,-24688, +21384,-24827,21384,-24827,21384,-24827,21384,-24827, +21224,-24965,21224,-24965,21224,-24965,21224,-24965, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20899,-25237,20899,-25237,20899,-25237,20899,-25237, +20735,-25372,20735,-25372,20735,-25372,20735,-25372, +20571,-25505,20571,-25505,20571,-25505,20571,-25505, +20406,-25638,20406,-25638,20406,-25638,20406,-25638, +20240,-25769,20240,-25769,20240,-25769,20240,-25769, +20073,-25899,20073,-25899,20073,-25899,20073,-25899, +19905,-26029,19905,-26029,19905,-26029,19905,-26029, +19736,-26157,19736,-26157,19736,-26157,19736,-26157, +19567,-26284,19567,-26284,19567,-26284,19567,-26284, +19396,-26410,19396,-26410,19396,-26410,19396,-26410, +19225,-26534,19225,-26534,19225,-26534,19225,-26534, +19053,-26658,19053,-26658,19053,-26658,19053,-26658, +18881,-26781,18881,-26781,18881,-26781,18881,-26781, +18707,-26902,18707,-26902,18707,-26902,18707,-26902, +18533,-27023,18533,-27023,18533,-27023,18533,-27023, +18358,-27142,18358,-27142,18358,-27142,18358,-27142, +18182,-27260,18182,-27260,18182,-27260,18182,-27260, +18005,-27377,18005,-27377,18005,-27377,18005,-27377, +17828,-27493,17828,-27493,17828,-27493,17828,-27493, +17650,-27607,17650,-27607,17650,-27607,17650,-27607, +17471,-27721,17471,-27721,17471,-27721,17471,-27721, +17291,-27833,17291,-27833,17291,-27833,17291,-27833, +17111,-27944,17111,-27944,17111,-27944,17111,-27944, +16930,-28055,16930,-28055,16930,-28055,16930,-28055, +16748,-28163,16748,-28163,16748,-28163,16748,-28163, +16566,-28271,16566,-28271,16566,-28271,16566,-28271, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +16199,-28483,16199,-28483,16199,-28483,16199,-28483, +16015,-28587,16015,-28587,16015,-28587,16015,-28587, +15830,-28690,15830,-28690,15830,-28690,15830,-28690, +15644,-28792,15644,-28792,15644,-28792,15644,-28792, +15457,-28892,15457,-28892,15457,-28892,15457,-28892, +15270,-28991,15270,-28991,15270,-28991,15270,-28991, +15083,-29090,15083,-29090,15083,-29090,15083,-29090, +14894,-29186,14894,-29186,14894,-29186,14894,-29186, +14705,-29282,14705,-29282,14705,-29282,14705,-29282, +14516,-29377,14516,-29377,14516,-29377,14516,-29377, +14326,-29470,14326,-29470,14326,-29470,14326,-29470, +14135,-29562,14135,-29562,14135,-29562,14135,-29562, +13943,-29653,13943,-29653,13943,-29653,13943,-29653, +13751,-29742,13751,-29742,13751,-29742,13751,-29742, +13559,-29830,13559,-29830,13559,-29830,13559,-29830, +13366,-29917,13366,-29917,13366,-29917,13366,-29917, +13172,-30003,13172,-30003,13172,-30003,13172,-30003, +12978,-30088,12978,-30088,12978,-30088,12978,-30088, +12783,-30171,12783,-30171,12783,-30171,12783,-30171, +12588,-30253,12588,-30253,12588,-30253,12588,-30253, +12392,-30334,12392,-30334,12392,-30334,12392,-30334, +12196,-30413,12196,-30413,12196,-30413,12196,-30413, +11999,-30491,11999,-30491,11999,-30491,11999,-30491, +11801,-30568,11801,-30568,11801,-30568,11801,-30568, +11604,-30644,11604,-30644,11604,-30644,11604,-30644, +11405,-30718,11405,-30718,11405,-30718,11405,-30718, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +11007,-30863,11007,-30863,11007,-30863,11007,-30863, +10807,-30934,10807,-30934,10807,-30934,10807,-30934, +10607,-31003,10607,-31003,10607,-31003,10607,-31003, +10407,-31071,10407,-31071,10407,-31071,10407,-31071, +10206,-31137,10206,-31137,10206,-31137,10206,-31137, +10004,-31203,10004,-31203,10004,-31203,10004,-31203, +9802,-31267,9802,-31267,9802,-31267,9802,-31267, +9600,-31330,9600,-31330,9600,-31330,9600,-31330, +9397,-31391,9397,-31391,9397,-31391,9397,-31391, +9194,-31451,9194,-31451,9194,-31451,9194,-31451, +8991,-31510,8991,-31510,8991,-31510,8991,-31510, +8787,-31567,8787,-31567,8787,-31567,8787,-31567, +8582,-31623,8582,-31623,8582,-31623,8582,-31623, +8378,-31678,8378,-31678,8378,-31678,8378,-31678, +8173,-31732,8173,-31732,8173,-31732,8173,-31732, +7968,-31784,7968,-31784,7968,-31784,7968,-31784, +7762,-31835,7762,-31835,7762,-31835,7762,-31835, +7556,-31884,7556,-31884,7556,-31884,7556,-31884, +7350,-31932,7350,-31932,7350,-31932,7350,-31932, +7143,-31979,7143,-31979,7143,-31979,7143,-31979, +6936,-32025,6936,-32025,6936,-32025,6936,-32025, +6729,-32069,6729,-32069,6729,-32069,6729,-32069, +6522,-32112,6522,-32112,6522,-32112,6522,-32112, +6314,-32153,6314,-32153,6314,-32153,6314,-32153, +6106,-32193,6106,-32193,6106,-32193,6106,-32193, +5898,-32232,5898,-32232,5898,-32232,5898,-32232, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5481,-32306,5481,-32306,5481,-32306,5481,-32306, +5272,-32341,5272,-32341,5272,-32341,5272,-32341, +5063,-32374,5063,-32374,5063,-32374,5063,-32374, +4853,-32406,4853,-32406,4853,-32406,4853,-32406, +4644,-32437,4644,-32437,4644,-32437,4644,-32437, +4434,-32466,4434,-32466,4434,-32466,4434,-32466, +4224,-32494,4224,-32494,4224,-32494,4224,-32494, +4014,-32521,4014,-32521,4014,-32521,4014,-32521, +3804,-32546,3804,-32546,3804,-32546,3804,-32546, +3593,-32570,3593,-32570,3593,-32570,3593,-32570, +3382,-32592,3382,-32592,3382,-32592,3382,-32592, +3172,-32614,3172,-32614,3172,-32614,3172,-32614, +2961,-32633,2961,-32633,2961,-32633,2961,-32633, +2750,-32652,2750,-32652,2750,-32652,2750,-32652, +2539,-32669,2539,-32669,2539,-32669,2539,-32669, +2327,-32685,2327,-32685,2327,-32685,2327,-32685, +2116,-32699,2116,-32699,2116,-32699,2116,-32699, +1905,-32712,1905,-32712,1905,-32712,1905,-32712, +1693,-32724,1693,-32724,1693,-32724,1693,-32724, +1482,-32734,1482,-32734,1482,-32734,1482,-32734, +1270,-32743,1270,-32743,1270,-32743,1270,-32743, +1058,-32750,1058,-32750,1058,-32750,1058,-32750, +847,-32757,847,-32757,847,-32757,847,-32757, +635,-32761,635,-32761,635,-32761,635,-32761, +423,-32765,423,-32765,423,-32765,423,-32765, +211,-32767,211,-32767,211,-32767,211,-32767, +0,-32767,0,-32767,0,-32767,0,-32767, +-212,-32767,-212,-32767,-212,-32767,-212,-32767, +-424,-32765,-424,-32765,-424,-32765,-424,-32765, +-636,-32761,-636,-32761,-636,-32761,-636,-32761, +-848,-32757,-848,-32757,-848,-32757,-848,-32757, +-1059,-32750,-1059,-32750,-1059,-32750,-1059,-32750, +-1271,-32743,-1271,-32743,-1271,-32743,-1271,-32743, +-1483,-32734,-1483,-32734,-1483,-32734,-1483,-32734, +-1694,-32724,-1694,-32724,-1694,-32724,-1694,-32724, +-1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, +-2117,-32699,-2117,-32699,-2117,-32699,-2117,-32699, +-2328,-32685,-2328,-32685,-2328,-32685,-2328,-32685, +-2540,-32669,-2540,-32669,-2540,-32669,-2540,-32669, +-2751,-32652,-2751,-32652,-2751,-32652,-2751,-32652, +-2962,-32633,-2962,-32633,-2962,-32633,-2962,-32633, +-3173,-32614,-3173,-32614,-3173,-32614,-3173,-32614, +-3383,-32592,-3383,-32592,-3383,-32592,-3383,-32592, +-3594,-32570,-3594,-32570,-3594,-32570,-3594,-32570, +-3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, +-4015,-32521,-4015,-32521,-4015,-32521,-4015,-32521, +-4225,-32494,-4225,-32494,-4225,-32494,-4225,-32494, +-4435,-32466,-4435,-32466,-4435,-32466,-4435,-32466, +-4645,-32437,-4645,-32437,-4645,-32437,-4645,-32437, +-4854,-32406,-4854,-32406,-4854,-32406,-4854,-32406, +-5064,-32374,-5064,-32374,-5064,-32374,-5064,-32374, +-5273,-32341,-5273,-32341,-5273,-32341,-5273,-32341, +-5482,-32306,-5482,-32306,-5482,-32306,-5482,-32306, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-5899,-32232,-5899,-32232,-5899,-32232,-5899,-32232, +-6107,-32193,-6107,-32193,-6107,-32193,-6107,-32193, +-6315,-32153,-6315,-32153,-6315,-32153,-6315,-32153, +-6523,-32112,-6523,-32112,-6523,-32112,-6523,-32112, +-6730,-32069,-6730,-32069,-6730,-32069,-6730,-32069, +-6937,-32025,-6937,-32025,-6937,-32025,-6937,-32025, +-7144,-31979,-7144,-31979,-7144,-31979,-7144,-31979, +-7351,-31932,-7351,-31932,-7351,-31932,-7351,-31932, +-7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, +-7763,-31835,-7763,-31835,-7763,-31835,-7763,-31835, +-7969,-31784,-7969,-31784,-7969,-31784,-7969,-31784, +-8174,-31732,-8174,-31732,-8174,-31732,-8174,-31732, +-8379,-31678,-8379,-31678,-8379,-31678,-8379,-31678, +-8583,-31623,-8583,-31623,-8583,-31623,-8583,-31623, +-8788,-31567,-8788,-31567,-8788,-31567,-8788,-31567, +-8992,-31510,-8992,-31510,-8992,-31510,-8992,-31510, +-9195,-31451,-9195,-31451,-9195,-31451,-9195,-31451, +-9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, +-9601,-31330,-9601,-31330,-9601,-31330,-9601,-31330, +-9803,-31267,-9803,-31267,-9803,-31267,-9803,-31267, +-10005,-31203,-10005,-31203,-10005,-31203,-10005,-31203, +-10207,-31137,-10207,-31137,-10207,-31137,-10207,-31137, +-10408,-31071,-10408,-31071,-10408,-31071,-10408,-31071, +-10608,-31003,-10608,-31003,-10608,-31003,-10608,-31003, +-10808,-30934,-10808,-30934,-10808,-30934,-10808,-30934, +-11008,-30863,-11008,-30863,-11008,-30863,-11008,-30863, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-11406,-30718,-11406,-30718,-11406,-30718,-11406,-30718, +-11605,-30644,-11605,-30644,-11605,-30644,-11605,-30644, +-11802,-30568,-11802,-30568,-11802,-30568,-11802,-30568, +-12000,-30491,-12000,-30491,-12000,-30491,-12000,-30491, +-12197,-30413,-12197,-30413,-12197,-30413,-12197,-30413, +-12393,-30334,-12393,-30334,-12393,-30334,-12393,-30334, +-12589,-30253,-12589,-30253,-12589,-30253,-12589,-30253, +-12784,-30171,-12784,-30171,-12784,-30171,-12784,-30171, +-12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, +-13173,-30003,-13173,-30003,-13173,-30003,-13173,-30003, +-13367,-29917,-13367,-29917,-13367,-29917,-13367,-29917, +-13560,-29830,-13560,-29830,-13560,-29830,-13560,-29830, +-13752,-29742,-13752,-29742,-13752,-29742,-13752,-29742, +-13944,-29653,-13944,-29653,-13944,-29653,-13944,-29653, +-14136,-29562,-14136,-29562,-14136,-29562,-14136,-29562, +-14327,-29470,-14327,-29470,-14327,-29470,-14327,-29470, +-14517,-29377,-14517,-29377,-14517,-29377,-14517,-29377, +-14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, +-14895,-29186,-14895,-29186,-14895,-29186,-14895,-29186, +-15084,-29090,-15084,-29090,-15084,-29090,-15084,-29090, +-15271,-28991,-15271,-28991,-15271,-28991,-15271,-28991, +-15458,-28892,-15458,-28892,-15458,-28892,-15458,-28892, +-15645,-28792,-15645,-28792,-15645,-28792,-15645,-28792, +-15831,-28690,-15831,-28690,-15831,-28690,-15831,-28690, +-16016,-28587,-16016,-28587,-16016,-28587,-16016,-28587, +-16200,-28483,-16200,-28483,-16200,-28483,-16200,-28483}; +static int16_t twb972[323*2*4] = {32764,-424,32764,-424,32764,-424,32764,-424, +32756,-848,32756,-848,32756,-848,32756,-848, +32742,-1271,32742,-1271,32742,-1271,32742,-1271, +32723,-1694,32723,-1694,32723,-1694,32723,-1694, +32698,-2117,32698,-2117,32698,-2117,32698,-2117, +32668,-2540,32668,-2540,32668,-2540,32668,-2540, +32632,-2962,32632,-2962,32632,-2962,32632,-2962, +32591,-3383,32591,-3383,32591,-3383,32591,-3383, +32545,-3805,32545,-3805,32545,-3805,32545,-3805, +32493,-4225,32493,-4225,32493,-4225,32493,-4225, +32436,-4645,32436,-4645,32436,-4645,32436,-4645, +32373,-5064,32373,-5064,32373,-5064,32373,-5064, +32305,-5482,32305,-5482,32305,-5482,32305,-5482, +32231,-5899,32231,-5899,32231,-5899,32231,-5899, +32152,-6315,32152,-6315,32152,-6315,32152,-6315, +32068,-6730,32068,-6730,32068,-6730,32068,-6730, +31978,-7144,31978,-7144,31978,-7144,31978,-7144, +31883,-7557,31883,-7557,31883,-7557,31883,-7557, +31783,-7969,31783,-7969,31783,-7969,31783,-7969, +31677,-8379,31677,-8379,31677,-8379,31677,-8379, +31566,-8788,31566,-8788,31566,-8788,31566,-8788, +31450,-9195,31450,-9195,31450,-9195,31450,-9195, +31329,-9601,31329,-9601,31329,-9601,31329,-9601, +31202,-10005,31202,-10005,31202,-10005,31202,-10005, +31070,-10408,31070,-10408,31070,-10408,31070,-10408, +30933,-10808,30933,-10808,30933,-10808,30933,-10808, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30643,-11605,30643,-11605,30643,-11605,30643,-11605, +30490,-12000,30490,-12000,30490,-12000,30490,-12000, +30333,-12393,30333,-12393,30333,-12393,30333,-12393, +30170,-12784,30170,-12784,30170,-12784,30170,-12784, +30002,-13173,30002,-13173,30002,-13173,30002,-13173, +29829,-13560,29829,-13560,29829,-13560,29829,-13560, +29652,-13944,29652,-13944,29652,-13944,29652,-13944, +29469,-14327,29469,-14327,29469,-14327,29469,-14327, +29281,-14706,29281,-14706,29281,-14706,29281,-14706, +29089,-15084,29089,-15084,29089,-15084,29089,-15084, +28891,-15458,28891,-15458,28891,-15458,28891,-15458, +28689,-15831,28689,-15831,28689,-15831,28689,-15831, +28482,-16200,28482,-16200,28482,-16200,28482,-16200, +28270,-16567,28270,-16567,28270,-16567,28270,-16567, +28054,-16931,28054,-16931,28054,-16931,28054,-16931, +27832,-17292,27832,-17292,27832,-17292,27832,-17292, +27606,-17651,27606,-17651,27606,-17651,27606,-17651, +27376,-18006,27376,-18006,27376,-18006,27376,-18006, +27141,-18359,27141,-18359,27141,-18359,27141,-18359, +26901,-18708,26901,-18708,26901,-18708,26901,-18708, +26657,-19054,26657,-19054,26657,-19054,26657,-19054, +26409,-19397,26409,-19397,26409,-19397,26409,-19397, +26156,-19737,26156,-19737,26156,-19737,26156,-19737, +25898,-20074,25898,-20074,25898,-20074,25898,-20074, +25637,-20407,25637,-20407,25637,-20407,25637,-20407, +25371,-20736,25371,-20736,25371,-20736,25371,-20736, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24826,-21385,24826,-21385,24826,-21385,24826,-21385, +24548,-21705,24548,-21705,24548,-21705,24548,-21705, +24265,-22020,24265,-22020,24265,-22020,24265,-22020, +23978,-22332,23978,-22332,23978,-22332,23978,-22332, +23688,-22640,23688,-22640,23688,-22640,23688,-22640, +23393,-22945,23393,-22945,23393,-22945,23393,-22945, +23094,-23245,23094,-23245,23094,-23245,23094,-23245, +22792,-23542,22792,-23542,22792,-23542,22792,-23542, +22486,-23834,22486,-23834,22486,-23834,22486,-23834, +22176,-24123,22176,-24123,22176,-24123,22176,-24123, +21862,-24408,21862,-24408,21862,-24408,21862,-24408, +21545,-24688,21545,-24688,21545,-24688,21545,-24688, +21224,-24965,21224,-24965,21224,-24965,21224,-24965, +20899,-25237,20899,-25237,20899,-25237,20899,-25237, +20571,-25505,20571,-25505,20571,-25505,20571,-25505, +20240,-25769,20240,-25769,20240,-25769,20240,-25769, +19905,-26029,19905,-26029,19905,-26029,19905,-26029, +19567,-26284,19567,-26284,19567,-26284,19567,-26284, +19225,-26534,19225,-26534,19225,-26534,19225,-26534, +18881,-26781,18881,-26781,18881,-26781,18881,-26781, +18533,-27023,18533,-27023,18533,-27023,18533,-27023, +18182,-27260,18182,-27260,18182,-27260,18182,-27260, +17828,-27493,17828,-27493,17828,-27493,17828,-27493, +17471,-27721,17471,-27721,17471,-27721,17471,-27721, +17111,-27944,17111,-27944,17111,-27944,17111,-27944, +16748,-28163,16748,-28163,16748,-28163,16748,-28163, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +16015,-28587,16015,-28587,16015,-28587,16015,-28587, +15644,-28792,15644,-28792,15644,-28792,15644,-28792, +15270,-28991,15270,-28991,15270,-28991,15270,-28991, +14894,-29186,14894,-29186,14894,-29186,14894,-29186, +14516,-29377,14516,-29377,14516,-29377,14516,-29377, +14135,-29562,14135,-29562,14135,-29562,14135,-29562, +13751,-29742,13751,-29742,13751,-29742,13751,-29742, +13366,-29917,13366,-29917,13366,-29917,13366,-29917, +12978,-30088,12978,-30088,12978,-30088,12978,-30088, +12588,-30253,12588,-30253,12588,-30253,12588,-30253, +12196,-30413,12196,-30413,12196,-30413,12196,-30413, +11801,-30568,11801,-30568,11801,-30568,11801,-30568, +11405,-30718,11405,-30718,11405,-30718,11405,-30718, +11007,-30863,11007,-30863,11007,-30863,11007,-30863, +10607,-31003,10607,-31003,10607,-31003,10607,-31003, +10206,-31137,10206,-31137,10206,-31137,10206,-31137, +9802,-31267,9802,-31267,9802,-31267,9802,-31267, +9397,-31391,9397,-31391,9397,-31391,9397,-31391, +8991,-31510,8991,-31510,8991,-31510,8991,-31510, +8582,-31623,8582,-31623,8582,-31623,8582,-31623, +8173,-31732,8173,-31732,8173,-31732,8173,-31732, +7762,-31835,7762,-31835,7762,-31835,7762,-31835, +7350,-31932,7350,-31932,7350,-31932,7350,-31932, +6936,-32025,6936,-32025,6936,-32025,6936,-32025, +6522,-32112,6522,-32112,6522,-32112,6522,-32112, +6106,-32193,6106,-32193,6106,-32193,6106,-32193, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5272,-32341,5272,-32341,5272,-32341,5272,-32341, +4853,-32406,4853,-32406,4853,-32406,4853,-32406, +4434,-32466,4434,-32466,4434,-32466,4434,-32466, +4014,-32521,4014,-32521,4014,-32521,4014,-32521, +3593,-32570,3593,-32570,3593,-32570,3593,-32570, +3172,-32614,3172,-32614,3172,-32614,3172,-32614, +2750,-32652,2750,-32652,2750,-32652,2750,-32652, +2327,-32685,2327,-32685,2327,-32685,2327,-32685, +1905,-32712,1905,-32712,1905,-32712,1905,-32712, +1482,-32734,1482,-32734,1482,-32734,1482,-32734, +1058,-32750,1058,-32750,1058,-32750,1058,-32750, +635,-32761,635,-32761,635,-32761,635,-32761, +211,-32767,211,-32767,211,-32767,211,-32767, +-212,-32767,-212,-32767,-212,-32767,-212,-32767, +-636,-32761,-636,-32761,-636,-32761,-636,-32761, +-1059,-32750,-1059,-32750,-1059,-32750,-1059,-32750, +-1483,-32734,-1483,-32734,-1483,-32734,-1483,-32734, +-1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, +-2328,-32685,-2328,-32685,-2328,-32685,-2328,-32685, +-2751,-32652,-2751,-32652,-2751,-32652,-2751,-32652, +-3173,-32614,-3173,-32614,-3173,-32614,-3173,-32614, +-3594,-32570,-3594,-32570,-3594,-32570,-3594,-32570, +-4015,-32521,-4015,-32521,-4015,-32521,-4015,-32521, +-4435,-32466,-4435,-32466,-4435,-32466,-4435,-32466, +-4854,-32406,-4854,-32406,-4854,-32406,-4854,-32406, +-5273,-32341,-5273,-32341,-5273,-32341,-5273,-32341, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-6107,-32193,-6107,-32193,-6107,-32193,-6107,-32193, +-6523,-32112,-6523,-32112,-6523,-32112,-6523,-32112, +-6937,-32025,-6937,-32025,-6937,-32025,-6937,-32025, +-7351,-31932,-7351,-31932,-7351,-31932,-7351,-31932, +-7763,-31835,-7763,-31835,-7763,-31835,-7763,-31835, +-8174,-31732,-8174,-31732,-8174,-31732,-8174,-31732, +-8583,-31623,-8583,-31623,-8583,-31623,-8583,-31623, +-8992,-31510,-8992,-31510,-8992,-31510,-8992,-31510, +-9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, +-9803,-31267,-9803,-31267,-9803,-31267,-9803,-31267, +-10207,-31137,-10207,-31137,-10207,-31137,-10207,-31137, +-10608,-31003,-10608,-31003,-10608,-31003,-10608,-31003, +-11008,-30863,-11008,-30863,-11008,-30863,-11008,-30863, +-11406,-30718,-11406,-30718,-11406,-30718,-11406,-30718, +-11802,-30568,-11802,-30568,-11802,-30568,-11802,-30568, +-12197,-30413,-12197,-30413,-12197,-30413,-12197,-30413, +-12589,-30253,-12589,-30253,-12589,-30253,-12589,-30253, +-12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, +-13367,-29917,-13367,-29917,-13367,-29917,-13367,-29917, +-13752,-29742,-13752,-29742,-13752,-29742,-13752,-29742, +-14136,-29562,-14136,-29562,-14136,-29562,-14136,-29562, +-14517,-29377,-14517,-29377,-14517,-29377,-14517,-29377, +-14895,-29186,-14895,-29186,-14895,-29186,-14895,-29186, +-15271,-28991,-15271,-28991,-15271,-28991,-15271,-28991, +-15645,-28792,-15645,-28792,-15645,-28792,-15645,-28792, +-16016,-28587,-16016,-28587,-16016,-28587,-16016,-28587, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-16749,-28163,-16749,-28163,-16749,-28163,-16749,-28163, +-17112,-27944,-17112,-27944,-17112,-27944,-17112,-27944, +-17472,-27721,-17472,-27721,-17472,-27721,-17472,-27721, +-17829,-27493,-17829,-27493,-17829,-27493,-17829,-27493, +-18183,-27260,-18183,-27260,-18183,-27260,-18183,-27260, +-18534,-27023,-18534,-27023,-18534,-27023,-18534,-27023, +-18882,-26781,-18882,-26781,-18882,-26781,-18882,-26781, +-19226,-26534,-19226,-26534,-19226,-26534,-19226,-26534, +-19568,-26284,-19568,-26284,-19568,-26284,-19568,-26284, +-19906,-26029,-19906,-26029,-19906,-26029,-19906,-26029, +-20241,-25769,-20241,-25769,-20241,-25769,-20241,-25769, +-20572,-25505,-20572,-25505,-20572,-25505,-20572,-25505, +-20900,-25237,-20900,-25237,-20900,-25237,-20900,-25237, +-21225,-24965,-21225,-24965,-21225,-24965,-21225,-24965, +-21546,-24688,-21546,-24688,-21546,-24688,-21546,-24688, +-21863,-24408,-21863,-24408,-21863,-24408,-21863,-24408, +-22177,-24123,-22177,-24123,-22177,-24123,-22177,-24123, +-22487,-23834,-22487,-23834,-22487,-23834,-22487,-23834, +-22793,-23542,-22793,-23542,-22793,-23542,-22793,-23542, +-23095,-23245,-23095,-23245,-23095,-23245,-23095,-23245, +-23394,-22945,-23394,-22945,-23394,-22945,-23394,-22945, +-23689,-22640,-23689,-22640,-23689,-22640,-23689,-22640, +-23979,-22332,-23979,-22332,-23979,-22332,-23979,-22332, +-24266,-22020,-24266,-22020,-24266,-22020,-24266,-22020, +-24549,-21705,-24549,-21705,-24549,-21705,-24549,-21705, +-24827,-21385,-24827,-21385,-24827,-21385,-24827,-21385, +-25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, +-25372,-20736,-25372,-20736,-25372,-20736,-25372,-20736, +-25638,-20407,-25638,-20407,-25638,-20407,-25638,-20407, +-25899,-20074,-25899,-20074,-25899,-20074,-25899,-20074, +-26157,-19737,-26157,-19737,-26157,-19737,-26157,-19737, +-26410,-19397,-26410,-19397,-26410,-19397,-26410,-19397, +-26658,-19054,-26658,-19054,-26658,-19054,-26658,-19054, +-26902,-18708,-26902,-18708,-26902,-18708,-26902,-18708, +-27142,-18359,-27142,-18359,-27142,-18359,-27142,-18359, +-27377,-18006,-27377,-18006,-27377,-18006,-27377,-18006, +-27607,-17651,-27607,-17651,-27607,-17651,-27607,-17651, +-27833,-17292,-27833,-17292,-27833,-17292,-27833,-17292, +-28055,-16931,-28055,-16931,-28055,-16931,-28055,-16931, +-28271,-16567,-28271,-16567,-28271,-16567,-28271,-16567, +-28483,-16200,-28483,-16200,-28483,-16200,-28483,-16200, +-28690,-15831,-28690,-15831,-28690,-15831,-28690,-15831, +-28892,-15458,-28892,-15458,-28892,-15458,-28892,-15458, +-29090,-15084,-29090,-15084,-29090,-15084,-29090,-15084, +-29282,-14706,-29282,-14706,-29282,-14706,-29282,-14706, +-29470,-14327,-29470,-14327,-29470,-14327,-29470,-14327, +-29653,-13944,-29653,-13944,-29653,-13944,-29653,-13944, +-29830,-13560,-29830,-13560,-29830,-13560,-29830,-13560, +-30003,-13173,-30003,-13173,-30003,-13173,-30003,-13173, +-30171,-12784,-30171,-12784,-30171,-12784,-30171,-12784, +-30334,-12393,-30334,-12393,-30334,-12393,-30334,-12393, +-30491,-12000,-30491,-12000,-30491,-12000,-30491,-12000, +-30644,-11605,-30644,-11605,-30644,-11605,-30644,-11605, +-30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, +-30934,-10808,-30934,-10808,-30934,-10808,-30934,-10808, +-31071,-10408,-31071,-10408,-31071,-10408,-31071,-10408, +-31203,-10005,-31203,-10005,-31203,-10005,-31203,-10005, +-31330,-9601,-31330,-9601,-31330,-9601,-31330,-9601, +-31451,-9195,-31451,-9195,-31451,-9195,-31451,-9195, +-31567,-8788,-31567,-8788,-31567,-8788,-31567,-8788, +-31678,-8379,-31678,-8379,-31678,-8379,-31678,-8379, +-31784,-7969,-31784,-7969,-31784,-7969,-31784,-7969, +-31884,-7557,-31884,-7557,-31884,-7557,-31884,-7557, +-31979,-7144,-31979,-7144,-31979,-7144,-31979,-7144, +-32069,-6730,-32069,-6730,-32069,-6730,-32069,-6730, +-32153,-6315,-32153,-6315,-32153,-6315,-32153,-6315, +-32232,-5899,-32232,-5899,-32232,-5899,-32232,-5899, +-32306,-5482,-32306,-5482,-32306,-5482,-32306,-5482, +-32374,-5064,-32374,-5064,-32374,-5064,-32374,-5064, +-32437,-4645,-32437,-4645,-32437,-4645,-32437,-4645, +-32494,-4225,-32494,-4225,-32494,-4225,-32494,-4225, +-32546,-3805,-32546,-3805,-32546,-3805,-32546,-3805, +-32592,-3383,-32592,-3383,-32592,-3383,-32592,-3383, +-32633,-2962,-32633,-2962,-32633,-2962,-32633,-2962, +-32669,-2540,-32669,-2540,-32669,-2540,-32669,-2540, +-32699,-2117,-32699,-2117,-32699,-2117,-32699,-2117, +-32724,-1694,-32724,-1694,-32724,-1694,-32724,-1694, +-32743,-1271,-32743,-1271,-32743,-1271,-32743,-1271, +-32757,-848,-32757,-848,-32757,-848,-32757,-848, +-32765,-424,-32765,-424,-32765,-424,-32765,-424, +-32767,-1,-32767,-1,-32767,-1,-32767,-1, +-32765,423,-32765,423,-32765,423,-32765,423, +-32757,847,-32757,847,-32757,847,-32757,847, +-32743,1270,-32743,1270,-32743,1270,-32743,1270, +-32724,1693,-32724,1693,-32724,1693,-32724,1693, +-32699,2116,-32699,2116,-32699,2116,-32699,2116, +-32669,2539,-32669,2539,-32669,2539,-32669,2539, +-32633,2961,-32633,2961,-32633,2961,-32633,2961, +-32592,3382,-32592,3382,-32592,3382,-32592,3382, +-32546,3804,-32546,3804,-32546,3804,-32546,3804, +-32494,4224,-32494,4224,-32494,4224,-32494,4224, +-32437,4644,-32437,4644,-32437,4644,-32437,4644, +-32374,5063,-32374,5063,-32374,5063,-32374,5063, +-32306,5481,-32306,5481,-32306,5481,-32306,5481, +-32232,5898,-32232,5898,-32232,5898,-32232,5898, +-32153,6314,-32153,6314,-32153,6314,-32153,6314, +-32069,6729,-32069,6729,-32069,6729,-32069,6729, +-31979,7143,-31979,7143,-31979,7143,-31979,7143, +-31884,7556,-31884,7556,-31884,7556,-31884,7556, +-31784,7968,-31784,7968,-31784,7968,-31784,7968, +-31678,8378,-31678,8378,-31678,8378,-31678,8378, +-31567,8787,-31567,8787,-31567,8787,-31567,8787, +-31451,9194,-31451,9194,-31451,9194,-31451,9194, +-31330,9600,-31330,9600,-31330,9600,-31330,9600, +-31203,10004,-31203,10004,-31203,10004,-31203,10004, +-31071,10407,-31071,10407,-31071,10407,-31071,10407, +-30934,10807,-30934,10807,-30934,10807,-30934,10807, +-30791,11206,-30791,11206,-30791,11206,-30791,11206, +-30644,11604,-30644,11604,-30644,11604,-30644,11604, +-30491,11999,-30491,11999,-30491,11999,-30491,11999, +-30334,12392,-30334,12392,-30334,12392,-30334,12392, +-30171,12783,-30171,12783,-30171,12783,-30171,12783, +-30003,13172,-30003,13172,-30003,13172,-30003,13172, +-29830,13559,-29830,13559,-29830,13559,-29830,13559, +-29653,13943,-29653,13943,-29653,13943,-29653,13943, +-29470,14326,-29470,14326,-29470,14326,-29470,14326, +-29282,14705,-29282,14705,-29282,14705,-29282,14705, +-29090,15083,-29090,15083,-29090,15083,-29090,15083, +-28892,15457,-28892,15457,-28892,15457,-28892,15457, +-28690,15830,-28690,15830,-28690,15830,-28690,15830, +-28483,16199,-28483,16199,-28483,16199,-28483,16199, +-28271,16566,-28271,16566,-28271,16566,-28271,16566, +-28055,16930,-28055,16930,-28055,16930,-28055,16930, +-27833,17291,-27833,17291,-27833,17291,-27833,17291, +-27607,17650,-27607,17650,-27607,17650,-27607,17650, +-27377,18005,-27377,18005,-27377,18005,-27377,18005, +-27142,18358,-27142,18358,-27142,18358,-27142,18358, +-26902,18707,-26902,18707,-26902,18707,-26902,18707, +-26658,19053,-26658,19053,-26658,19053,-26658,19053, +-26410,19396,-26410,19396,-26410,19396,-26410,19396, +-26157,19736,-26157,19736,-26157,19736,-26157,19736, +-25899,20073,-25899,20073,-25899,20073,-25899,20073, +-25638,20406,-25638,20406,-25638,20406,-25638,20406, +-25372,20735,-25372,20735,-25372,20735,-25372,20735, +-25101,21062,-25101,21062,-25101,21062,-25101,21062, +-24827,21384,-24827,21384,-24827,21384,-24827,21384, +-24549,21704,-24549,21704,-24549,21704,-24549,21704, +-24266,22019,-24266,22019,-24266,22019,-24266,22019, +-23979,22331,-23979,22331,-23979,22331,-23979,22331, +-23689,22639,-23689,22639,-23689,22639,-23689,22639, +-23394,22944,-23394,22944,-23394,22944,-23394,22944, +-23095,23244,-23095,23244,-23095,23244,-23095,23244, +-22793,23541,-22793,23541,-22793,23541,-22793,23541, +-22487,23833,-22487,23833,-22487,23833,-22487,23833, +-22177,24122,-22177,24122,-22177,24122,-22177,24122, +-21863,24407,-21863,24407,-21863,24407,-21863,24407, +-21546,24687,-21546,24687,-21546,24687,-21546,24687, +-21225,24964,-21225,24964,-21225,24964,-21225,24964, +-20900,25236,-20900,25236,-20900,25236,-20900,25236, +-20572,25504,-20572,25504,-20572,25504,-20572,25504, +-20241,25768,-20241,25768,-20241,25768,-20241,25768, +-19906,26028,-19906,26028,-19906,26028,-19906,26028, +-19568,26283,-19568,26283,-19568,26283,-19568,26283, +-19226,26533,-19226,26533,-19226,26533,-19226,26533, +-18882,26780,-18882,26780,-18882,26780,-18882,26780, +-18534,27022,-18534,27022,-18534,27022,-18534,27022, +-18183,27259,-18183,27259,-18183,27259,-18183,27259, +-17829,27492,-17829,27492,-17829,27492,-17829,27492, +-17472,27720,-17472,27720,-17472,27720,-17472,27720, +-17112,27943,-17112,27943,-17112,27943,-17112,27943, +-16749,28162,-16749,28162,-16749,28162,-16749,28162}; + +void dft972(int16_t *x,int16_t *y,unsigned char scale_flag){ // 324 x 3 + int i,j; + __m128i *x128=(__m128i *)x; + __m128i *y128=(__m128i *)y; + __m128i *twa128=(__m128i *)&twa972[0]; + __m128i *twb128=(__m128i *)&twb972[0]; + __m128i x2128[972];// = (__m128i *)&x2128array[0]; + __m128i ytmp128[972];//=&ytmp128array3[0]; + + + + for (i=0,j=0;i<324;i++,j+=3) { + x2128[i] = x128[j]; + x2128[i+324] = x128[j+1]; + x2128[i+648] = x128[j+2]; + } + + dft324((int16_t *)x2128,(int16_t *)ytmp128,1); + dft324((int16_t *)(x2128+324),(int16_t *)(ytmp128+324),1); + dft324((int16_t *)(x2128+648),(int16_t *)(ytmp128+648),1); + + bfly3_tw1(ytmp128,ytmp128+324,ytmp128+648,y128,y128+324,y128+648); + for (i=1,j=0;i<324;i++,j++) { + bfly3(ytmp128+i, + ytmp128+324+i, + ytmp128+648+i, + y128+i, + y128+324+i, + y128+648+i, + twa128+j, + twb128+j); + } + + if (scale_flag==1) { + norm128 = _mm_set1_epi16(dft_norm_table[14]); + + for (i=0;i<972;i++) { + y128[i] = _mm_slli_epi16(_mm_mulhi_epi16(y128[i],norm128),1); + } + } + + _mm_empty(); + _m_empty(); + +}; + +/* Twiddles generated with +twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:359)/1080)); +twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:359)/1080)); +twa2 = zeros(1,2*359); +twb2 = zeros(1,2*359); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +twb2(1:2:end) = real(twb); +twb2(2:2:end) = imag(twb); +fd=fopen("twiddle_tmp.txt","w"); +fprintf(fd,"static int16_t twa1080[359*2*4] = {"); +for i=1:2:(2*358) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +fprintf(fd,"static int16_t twb1080[359*2*4] = {"); +for i=1:2:(2*358) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +fclose(fd); +*/ +static int16_t twa1080[359*2*4] = {32766,-191,32766,-191,32766,-191,32766,-191, +32764,-382,32764,-382,32764,-382,32764,-382, +32762,-572,32762,-572,32762,-572,32762,-572, +32758,-763,32758,-763,32758,-763,32758,-763, +32753,-954,32753,-954,32753,-954,32753,-954, +32747,-1144,32747,-1144,32747,-1144,32747,-1144, +32739,-1335,32739,-1335,32739,-1335,32739,-1335, +32731,-1525,32731,-1525,32731,-1525,32731,-1525, +32722,-1715,32722,-1715,32722,-1715,32722,-1715, +32711,-1906,32711,-1906,32711,-1906,32711,-1906, +32699,-2096,32699,-2096,32699,-2096,32699,-2096, +32687,-2286,32687,-2286,32687,-2286,32687,-2286, +32673,-2476,32673,-2476,32673,-2476,32673,-2476, +32658,-2666,32658,-2666,32658,-2666,32658,-2666, +32642,-2856,32642,-2856,32642,-2856,32642,-2856, +32625,-3046,32625,-3046,32625,-3046,32625,-3046, +32606,-3236,32606,-3236,32606,-3236,32606,-3236, +32587,-3426,32587,-3426,32587,-3426,32587,-3426, +32567,-3615,32567,-3615,32567,-3615,32567,-3615, +32545,-3805,32545,-3805,32545,-3805,32545,-3805, +32522,-3994,32522,-3994,32522,-3994,32522,-3994, +32498,-4183,32498,-4183,32498,-4183,32498,-4183, +32474,-4372,32474,-4372,32474,-4372,32474,-4372, +32448,-4561,32448,-4561,32448,-4561,32448,-4561, +32421,-4749,32421,-4749,32421,-4749,32421,-4749, +32392,-4938,32392,-4938,32392,-4938,32392,-4938, +32363,-5126,32363,-5126,32363,-5126,32363,-5126, +32333,-5315,32333,-5315,32333,-5315,32333,-5315, +32301,-5503,32301,-5503,32301,-5503,32301,-5503, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32235,-5878,32235,-5878,32235,-5878,32235,-5878, +32200,-6066,32200,-6066,32200,-6066,32200,-6066, +32164,-6253,32164,-6253,32164,-6253,32164,-6253, +32128,-6440,32128,-6440,32128,-6440,32128,-6440, +32090,-6627,32090,-6627,32090,-6627,32090,-6627, +32050,-6813,32050,-6813,32050,-6813,32050,-6813, +32010,-6999,32010,-6999,32010,-6999,32010,-6999, +31969,-7186,31969,-7186,31969,-7186,31969,-7186, +31927,-7371,31927,-7371,31927,-7371,31927,-7371, +31883,-7557,31883,-7557,31883,-7557,31883,-7557, +31839,-7742,31839,-7742,31839,-7742,31839,-7742, +31793,-7928,31793,-7928,31793,-7928,31793,-7928, +31747,-8112,31747,-8112,31747,-8112,31747,-8112, +31699,-8297,31699,-8297,31699,-8297,31699,-8297, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31600,-8665,31600,-8665,31600,-8665,31600,-8665, +31549,-8849,31549,-8849,31549,-8849,31549,-8849, +31497,-9032,31497,-9032,31497,-9032,31497,-9032, +31444,-9215,31444,-9215,31444,-9215,31444,-9215, +31390,-9398,31390,-9398,31390,-9398,31390,-9398, +31335,-9581,31335,-9581,31335,-9581,31335,-9581, +31278,-9763,31278,-9763,31278,-9763,31278,-9763, +31221,-9945,31221,-9945,31221,-9945,31221,-9945, +31163,-10126,31163,-10126,31163,-10126,31163,-10126, +31103,-10307,31103,-10307,31103,-10307,31103,-10307, +31043,-10488,31043,-10488,31043,-10488,31043,-10488, +30981,-10668,30981,-10668,30981,-10668,30981,-10668, +30919,-10848,30919,-10848,30919,-10848,30919,-10848, +30855,-11028,30855,-11028,30855,-11028,30855,-11028, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30725,-11386,30725,-11386,30725,-11386,30725,-11386, +30658,-11565,30658,-11565,30658,-11565,30658,-11565, +30590,-11743,30590,-11743,30590,-11743,30590,-11743, +30521,-11921,30521,-11921,30521,-11921,30521,-11921, +30451,-12098,30451,-12098,30451,-12098,30451,-12098, +30381,-12275,30381,-12275,30381,-12275,30381,-12275, +30309,-12452,30309,-12452,30309,-12452,30309,-12452, +30236,-12628,30236,-12628,30236,-12628,30236,-12628, +30162,-12804,30162,-12804,30162,-12804,30162,-12804, +30087,-12979,30087,-12979,30087,-12979,30087,-12979, +30011,-13154,30011,-13154,30011,-13154,30011,-13154, +29934,-13328,29934,-13328,29934,-13328,29934,-13328, +29856,-13502,29856,-13502,29856,-13502,29856,-13502, +29777,-13675,29777,-13675,29777,-13675,29777,-13675, +29696,-13848,29696,-13848,29696,-13848,29696,-13848, +29615,-14021,29615,-14021,29615,-14021,29615,-14021, +29533,-14193,29533,-14193,29533,-14193,29533,-14193, +29450,-14365,29450,-14365,29450,-14365,29450,-14365, +29366,-14536,29366,-14536,29366,-14536,29366,-14536, +29281,-14706,29281,-14706,29281,-14706,29281,-14706, +29195,-14876,29195,-14876,29195,-14876,29195,-14876, +29108,-15046,29108,-15046,29108,-15046,29108,-15046, +29020,-15215,29020,-15215,29020,-15215,29020,-15215, +28931,-15384,28931,-15384,28931,-15384,28931,-15384, +28841,-15552,28841,-15552,28841,-15552,28841,-15552, +28750,-15719,28750,-15719,28750,-15719,28750,-15719, +28658,-15886,28658,-15886,28658,-15886,28658,-15886, +28565,-16053,28565,-16053,28565,-16053,28565,-16053, +28471,-16219,28471,-16219,28471,-16219,28471,-16219, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28281,-16549,28281,-16549,28281,-16549,28281,-16549, +28184,-16713,28184,-16713,28184,-16713,28184,-16713, +28086,-16877,28086,-16877,28086,-16877,28086,-16877, +27988,-17040,27988,-17040,27988,-17040,27988,-17040, +27888,-17202,27888,-17202,27888,-17202,27888,-17202, +27787,-17364,27787,-17364,27787,-17364,27787,-17364, +27686,-17526,27686,-17526,27686,-17526,27686,-17526, +27584,-17687,27584,-17687,27584,-17687,27584,-17687, +27480,-17847,27480,-17847,27480,-17847,27480,-17847, +27376,-18006,27376,-18006,27376,-18006,27376,-18006, +27271,-18165,27271,-18165,27271,-18165,27271,-18165, +27165,-18324,27165,-18324,27165,-18324,27165,-18324, +27058,-18481,27058,-18481,27058,-18481,27058,-18481, +26950,-18638,26950,-18638,26950,-18638,26950,-18638, +26841,-18795,26841,-18795,26841,-18795,26841,-18795, +26731,-18951,26731,-18951,26731,-18951,26731,-18951, +26620,-19106,26620,-19106,26620,-19106,26620,-19106, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +26396,-19414,26396,-19414,26396,-19414,26396,-19414, +26283,-19568,26283,-19568,26283,-19568,26283,-19568, +26168,-19720,26168,-19720,26168,-19720,26168,-19720, +26053,-19872,26053,-19872,26053,-19872,26053,-19872, +25937,-20023,25937,-20023,25937,-20023,25937,-20023, +25820,-20174,25820,-20174,25820,-20174,25820,-20174, +25702,-20324,25702,-20324,25702,-20324,25702,-20324, +25584,-20473,25584,-20473,25584,-20473,25584,-20473, +25464,-20621,25464,-20621,25464,-20621,25464,-20621, +25344,-20769,25344,-20769,25344,-20769,25344,-20769, +25223,-20916,25223,-20916,25223,-20916,25223,-20916, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24978,-21208,24978,-21208,24978,-21208,24978,-21208, +24854,-21353,24854,-21353,24854,-21353,24854,-21353, +24729,-21498,24729,-21498,24729,-21498,24729,-21498, +24604,-21641,24604,-21641,24604,-21641,24604,-21641, +24477,-21784,24477,-21784,24477,-21784,24477,-21784, +24350,-21926,24350,-21926,24350,-21926,24350,-21926, +24222,-22067,24222,-22067,24222,-22067,24222,-22067, +24093,-22208,24093,-22208,24093,-22208,24093,-22208, +23964,-22348,23964,-22348,23964,-22348,23964,-22348, +23833,-22487,23833,-22487,23833,-22487,23833,-22487, +23702,-22625,23702,-22625,23702,-22625,23702,-22625, +23570,-22762,23570,-22762,23570,-22762,23570,-22762, +23437,-22899,23437,-22899,23437,-22899,23437,-22899, +23304,-23035,23304,-23035,23304,-23035,23304,-23035, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +23034,-23305,23034,-23305,23034,-23305,23034,-23305, +22898,-23438,22898,-23438,22898,-23438,22898,-23438, +22761,-23571,22761,-23571,22761,-23571,22761,-23571, +22624,-23703,22624,-23703,22624,-23703,22624,-23703, +22486,-23834,22486,-23834,22486,-23834,22486,-23834, +22347,-23965,22347,-23965,22347,-23965,22347,-23965, +22207,-24094,22207,-24094,22207,-24094,22207,-24094, +22066,-24223,22066,-24223,22066,-24223,22066,-24223, +21925,-24351,21925,-24351,21925,-24351,21925,-24351, +21783,-24478,21783,-24478,21783,-24478,21783,-24478, +21640,-24605,21640,-24605,21640,-24605,21640,-24605, +21497,-24730,21497,-24730,21497,-24730,21497,-24730, +21352,-24855,21352,-24855,21352,-24855,21352,-24855, +21207,-24979,21207,-24979,21207,-24979,21207,-24979, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20915,-25224,20915,-25224,20915,-25224,20915,-25224, +20768,-25345,20768,-25345,20768,-25345,20768,-25345, +20620,-25465,20620,-25465,20620,-25465,20620,-25465, +20472,-25585,20472,-25585,20472,-25585,20472,-25585, +20323,-25703,20323,-25703,20323,-25703,20323,-25703, +20173,-25821,20173,-25821,20173,-25821,20173,-25821, +20022,-25938,20022,-25938,20022,-25938,20022,-25938, +19871,-26054,19871,-26054,19871,-26054,19871,-26054, +19719,-26169,19719,-26169,19719,-26169,19719,-26169, +19567,-26284,19567,-26284,19567,-26284,19567,-26284, +19413,-26397,19413,-26397,19413,-26397,19413,-26397, +19259,-26510,19259,-26510,19259,-26510,19259,-26510, +19105,-26621,19105,-26621,19105,-26621,19105,-26621, +18950,-26732,18950,-26732,18950,-26732,18950,-26732, +18794,-26842,18794,-26842,18794,-26842,18794,-26842, +18637,-26951,18637,-26951,18637,-26951,18637,-26951, +18480,-27059,18480,-27059,18480,-27059,18480,-27059, +18323,-27166,18323,-27166,18323,-27166,18323,-27166, +18164,-27272,18164,-27272,18164,-27272,18164,-27272, +18005,-27377,18005,-27377,18005,-27377,18005,-27377, +17846,-27481,17846,-27481,17846,-27481,17846,-27481, +17686,-27585,17686,-27585,17686,-27585,17686,-27585, +17525,-27687,17525,-27687,17525,-27687,17525,-27687, +17363,-27788,17363,-27788,17363,-27788,17363,-27788, +17201,-27889,17201,-27889,17201,-27889,17201,-27889, +17039,-27989,17039,-27989,17039,-27989,17039,-27989, +16876,-28087,16876,-28087,16876,-28087,16876,-28087, +16712,-28185,16712,-28185,16712,-28185,16712,-28185, +16548,-28282,16548,-28282,16548,-28282,16548,-28282, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +16218,-28472,16218,-28472,16218,-28472,16218,-28472, +16052,-28566,16052,-28566,16052,-28566,16052,-28566, +15885,-28659,15885,-28659,15885,-28659,15885,-28659, +15718,-28751,15718,-28751,15718,-28751,15718,-28751, +15551,-28842,15551,-28842,15551,-28842,15551,-28842, +15383,-28932,15383,-28932,15383,-28932,15383,-28932, +15214,-29021,15214,-29021,15214,-29021,15214,-29021, +15045,-29109,15045,-29109,15045,-29109,15045,-29109, +14875,-29196,14875,-29196,14875,-29196,14875,-29196, +14705,-29282,14705,-29282,14705,-29282,14705,-29282, +14535,-29367,14535,-29367,14535,-29367,14535,-29367, +14364,-29451,14364,-29451,14364,-29451,14364,-29451, +14192,-29534,14192,-29534,14192,-29534,14192,-29534, +14020,-29616,14020,-29616,14020,-29616,14020,-29616, +13847,-29697,13847,-29697,13847,-29697,13847,-29697, +13674,-29778,13674,-29778,13674,-29778,13674,-29778, +13501,-29857,13501,-29857,13501,-29857,13501,-29857, +13327,-29935,13327,-29935,13327,-29935,13327,-29935, +13153,-30012,13153,-30012,13153,-30012,13153,-30012, +12978,-30088,12978,-30088,12978,-30088,12978,-30088, +12803,-30163,12803,-30163,12803,-30163,12803,-30163, +12627,-30237,12627,-30237,12627,-30237,12627,-30237, +12451,-30310,12451,-30310,12451,-30310,12451,-30310, +12274,-30382,12274,-30382,12274,-30382,12274,-30382, +12097,-30452,12097,-30452,12097,-30452,12097,-30452, +11920,-30522,11920,-30522,11920,-30522,11920,-30522, +11742,-30591,11742,-30591,11742,-30591,11742,-30591, +11564,-30659,11564,-30659,11564,-30659,11564,-30659, +11385,-30726,11385,-30726,11385,-30726,11385,-30726, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +11027,-30856,11027,-30856,11027,-30856,11027,-30856, +10847,-30920,10847,-30920,10847,-30920,10847,-30920, +10667,-30982,10667,-30982,10667,-30982,10667,-30982, +10487,-31044,10487,-31044,10487,-31044,10487,-31044, +10306,-31104,10306,-31104,10306,-31104,10306,-31104, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +9944,-31222,9944,-31222,9944,-31222,9944,-31222, +9762,-31279,9762,-31279,9762,-31279,9762,-31279, +9580,-31336,9580,-31336,9580,-31336,9580,-31336, +9397,-31391,9397,-31391,9397,-31391,9397,-31391, +9214,-31445,9214,-31445,9214,-31445,9214,-31445, +9031,-31498,9031,-31498,9031,-31498,9031,-31498, +8848,-31550,8848,-31550,8848,-31550,8848,-31550, +8664,-31601,8664,-31601,8664,-31601,8664,-31601, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +8296,-31700,8296,-31700,8296,-31700,8296,-31700, +8111,-31748,8111,-31748,8111,-31748,8111,-31748, +7927,-31794,7927,-31794,7927,-31794,7927,-31794, +7741,-31840,7741,-31840,7741,-31840,7741,-31840, +7556,-31884,7556,-31884,7556,-31884,7556,-31884, +7370,-31928,7370,-31928,7370,-31928,7370,-31928, +7185,-31970,7185,-31970,7185,-31970,7185,-31970, +6998,-32011,6998,-32011,6998,-32011,6998,-32011, +6812,-32051,6812,-32051,6812,-32051,6812,-32051, +6626,-32091,6626,-32091,6626,-32091,6626,-32091, +6439,-32129,6439,-32129,6439,-32129,6439,-32129, +6252,-32165,6252,-32165,6252,-32165,6252,-32165, +6065,-32201,6065,-32201,6065,-32201,6065,-32201, +5877,-32236,5877,-32236,5877,-32236,5877,-32236, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5502,-32302,5502,-32302,5502,-32302,5502,-32302, +5314,-32334,5314,-32334,5314,-32334,5314,-32334, +5125,-32364,5125,-32364,5125,-32364,5125,-32364, +4937,-32393,4937,-32393,4937,-32393,4937,-32393, +4748,-32422,4748,-32422,4748,-32422,4748,-32422, +4560,-32449,4560,-32449,4560,-32449,4560,-32449, +4371,-32475,4371,-32475,4371,-32475,4371,-32475, +4182,-32499,4182,-32499,4182,-32499,4182,-32499, +3993,-32523,3993,-32523,3993,-32523,3993,-32523, +3804,-32546,3804,-32546,3804,-32546,3804,-32546, +3614,-32568,3614,-32568,3614,-32568,3614,-32568, +3425,-32588,3425,-32588,3425,-32588,3425,-32588, +3235,-32607,3235,-32607,3235,-32607,3235,-32607, +3045,-32626,3045,-32626,3045,-32626,3045,-32626, +2855,-32643,2855,-32643,2855,-32643,2855,-32643, +2665,-32659,2665,-32659,2665,-32659,2665,-32659, +2475,-32674,2475,-32674,2475,-32674,2475,-32674, +2285,-32688,2285,-32688,2285,-32688,2285,-32688, +2095,-32700,2095,-32700,2095,-32700,2095,-32700, +1905,-32712,1905,-32712,1905,-32712,1905,-32712, +1714,-32723,1714,-32723,1714,-32723,1714,-32723, +1524,-32732,1524,-32732,1524,-32732,1524,-32732, +1334,-32740,1334,-32740,1334,-32740,1334,-32740, +1143,-32748,1143,-32748,1143,-32748,1143,-32748, +953,-32754,953,-32754,953,-32754,953,-32754, +762,-32759,762,-32759,762,-32759,762,-32759, +571,-32763,571,-32763,571,-32763,571,-32763, +381,-32765,381,-32765,381,-32765,381,-32765, +190,-32767,190,-32767,190,-32767,190,-32767, +0,-32767,0,-32767,0,-32767,0,-32767, +-191,-32767,-191,-32767,-191,-32767,-191,-32767, +-382,-32765,-382,-32765,-382,-32765,-382,-32765, +-572,-32763,-572,-32763,-572,-32763,-572,-32763, +-763,-32759,-763,-32759,-763,-32759,-763,-32759, +-954,-32754,-954,-32754,-954,-32754,-954,-32754, +-1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, +-1335,-32740,-1335,-32740,-1335,-32740,-1335,-32740, +-1525,-32732,-1525,-32732,-1525,-32732,-1525,-32732, +-1715,-32723,-1715,-32723,-1715,-32723,-1715,-32723, +-1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, +-2096,-32700,-2096,-32700,-2096,-32700,-2096,-32700, +-2286,-32688,-2286,-32688,-2286,-32688,-2286,-32688, +-2476,-32674,-2476,-32674,-2476,-32674,-2476,-32674, +-2666,-32659,-2666,-32659,-2666,-32659,-2666,-32659, +-2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, +-3046,-32626,-3046,-32626,-3046,-32626,-3046,-32626, +-3236,-32607,-3236,-32607,-3236,-32607,-3236,-32607, +-3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, +-3615,-32568,-3615,-32568,-3615,-32568,-3615,-32568, +-3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, +-3994,-32523,-3994,-32523,-3994,-32523,-3994,-32523, +-4183,-32499,-4183,-32499,-4183,-32499,-4183,-32499, +-4372,-32475,-4372,-32475,-4372,-32475,-4372,-32475, +-4561,-32449,-4561,-32449,-4561,-32449,-4561,-32449, +-4749,-32422,-4749,-32422,-4749,-32422,-4749,-32422, +-4938,-32393,-4938,-32393,-4938,-32393,-4938,-32393, +-5126,-32364,-5126,-32364,-5126,-32364,-5126,-32364, +-5315,-32334,-5315,-32334,-5315,-32334,-5315,-32334, +-5503,-32302,-5503,-32302,-5503,-32302,-5503,-32302, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-5878,-32236,-5878,-32236,-5878,-32236,-5878,-32236, +-6066,-32201,-6066,-32201,-6066,-32201,-6066,-32201, +-6253,-32165,-6253,-32165,-6253,-32165,-6253,-32165, +-6440,-32129,-6440,-32129,-6440,-32129,-6440,-32129, +-6627,-32091,-6627,-32091,-6627,-32091,-6627,-32091, +-6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, +-6999,-32011,-6999,-32011,-6999,-32011,-6999,-32011, +-7186,-31970,-7186,-31970,-7186,-31970,-7186,-31970, +-7371,-31928,-7371,-31928,-7371,-31928,-7371,-31928, +-7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, +-7742,-31840,-7742,-31840,-7742,-31840,-7742,-31840, +-7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, +-8112,-31748,-8112,-31748,-8112,-31748,-8112,-31748, +-8297,-31700,-8297,-31700,-8297,-31700,-8297,-31700, +-8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, +-8665,-31601,-8665,-31601,-8665,-31601,-8665,-31601, +-8849,-31550,-8849,-31550,-8849,-31550,-8849,-31550, +-9032,-31498,-9032,-31498,-9032,-31498,-9032,-31498, +-9215,-31445,-9215,-31445,-9215,-31445,-9215,-31445, +-9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, +-9581,-31336,-9581,-31336,-9581,-31336,-9581,-31336, +-9763,-31279,-9763,-31279,-9763,-31279,-9763,-31279, +-9945,-31222,-9945,-31222,-9945,-31222,-9945,-31222, +-10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, +-10307,-31104,-10307,-31104,-10307,-31104,-10307,-31104, +-10488,-31044,-10488,-31044,-10488,-31044,-10488,-31044, +-10668,-30982,-10668,-30982,-10668,-30982,-10668,-30982, +-10848,-30920,-10848,-30920,-10848,-30920,-10848,-30920, +-11028,-30856,-11028,-30856,-11028,-30856,-11028,-30856, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-11386,-30726,-11386,-30726,-11386,-30726,-11386,-30726, +-11565,-30659,-11565,-30659,-11565,-30659,-11565,-30659, +-11743,-30591,-11743,-30591,-11743,-30591,-11743,-30591, +-11921,-30522,-11921,-30522,-11921,-30522,-11921,-30522, +-12098,-30452,-12098,-30452,-12098,-30452,-12098,-30452, +-12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, +-12452,-30310,-12452,-30310,-12452,-30310,-12452,-30310, +-12628,-30237,-12628,-30237,-12628,-30237,-12628,-30237, +-12804,-30163,-12804,-30163,-12804,-30163,-12804,-30163, +-12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, +-13154,-30012,-13154,-30012,-13154,-30012,-13154,-30012, +-13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, +-13502,-29857,-13502,-29857,-13502,-29857,-13502,-29857, +-13675,-29778,-13675,-29778,-13675,-29778,-13675,-29778, +-13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, +-14021,-29616,-14021,-29616,-14021,-29616,-14021,-29616, +-14193,-29534,-14193,-29534,-14193,-29534,-14193,-29534, +-14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, +-14536,-29367,-14536,-29367,-14536,-29367,-14536,-29367, +-14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, +-14876,-29196,-14876,-29196,-14876,-29196,-14876,-29196, +-15046,-29109,-15046,-29109,-15046,-29109,-15046,-29109, +-15215,-29021,-15215,-29021,-15215,-29021,-15215,-29021, +-15384,-28932,-15384,-28932,-15384,-28932,-15384,-28932, +-15552,-28842,-15552,-28842,-15552,-28842,-15552,-28842, +-15719,-28751,-15719,-28751,-15719,-28751,-15719,-28751, +-15886,-28659,-15886,-28659,-15886,-28659,-15886,-28659, +-16053,-28566,-16053,-28566,-16053,-28566,-16053,-28566, +-16219,-28472,-16219,-28472,-16219,-28472,-16219,-28472}; +static int16_t twb1080[359*2*4] = {32764,-382,32764,-382,32764,-382,32764,-382, +32758,-763,32758,-763,32758,-763,32758,-763, +32747,-1144,32747,-1144,32747,-1144,32747,-1144, +32731,-1525,32731,-1525,32731,-1525,32731,-1525, +32711,-1906,32711,-1906,32711,-1906,32711,-1906, +32687,-2286,32687,-2286,32687,-2286,32687,-2286, +32658,-2666,32658,-2666,32658,-2666,32658,-2666, +32625,-3046,32625,-3046,32625,-3046,32625,-3046, +32587,-3426,32587,-3426,32587,-3426,32587,-3426, +32545,-3805,32545,-3805,32545,-3805,32545,-3805, +32498,-4183,32498,-4183,32498,-4183,32498,-4183, +32448,-4561,32448,-4561,32448,-4561,32448,-4561, +32392,-4938,32392,-4938,32392,-4938,32392,-4938, +32333,-5315,32333,-5315,32333,-5315,32333,-5315, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32200,-6066,32200,-6066,32200,-6066,32200,-6066, +32128,-6440,32128,-6440,32128,-6440,32128,-6440, +32050,-6813,32050,-6813,32050,-6813,32050,-6813, +31969,-7186,31969,-7186,31969,-7186,31969,-7186, +31883,-7557,31883,-7557,31883,-7557,31883,-7557, +31793,-7928,31793,-7928,31793,-7928,31793,-7928, +31699,-8297,31699,-8297,31699,-8297,31699,-8297, +31600,-8665,31600,-8665,31600,-8665,31600,-8665, +31497,-9032,31497,-9032,31497,-9032,31497,-9032, +31390,-9398,31390,-9398,31390,-9398,31390,-9398, +31278,-9763,31278,-9763,31278,-9763,31278,-9763, +31163,-10126,31163,-10126,31163,-10126,31163,-10126, +31043,-10488,31043,-10488,31043,-10488,31043,-10488, +30919,-10848,30919,-10848,30919,-10848,30919,-10848, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30658,-11565,30658,-11565,30658,-11565,30658,-11565, +30521,-11921,30521,-11921,30521,-11921,30521,-11921, +30381,-12275,30381,-12275,30381,-12275,30381,-12275, +30236,-12628,30236,-12628,30236,-12628,30236,-12628, +30087,-12979,30087,-12979,30087,-12979,30087,-12979, +29934,-13328,29934,-13328,29934,-13328,29934,-13328, +29777,-13675,29777,-13675,29777,-13675,29777,-13675, +29615,-14021,29615,-14021,29615,-14021,29615,-14021, +29450,-14365,29450,-14365,29450,-14365,29450,-14365, +29281,-14706,29281,-14706,29281,-14706,29281,-14706, +29108,-15046,29108,-15046,29108,-15046,29108,-15046, +28931,-15384,28931,-15384,28931,-15384,28931,-15384, +28750,-15719,28750,-15719,28750,-15719,28750,-15719, +28565,-16053,28565,-16053,28565,-16053,28565,-16053, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28184,-16713,28184,-16713,28184,-16713,28184,-16713, +27988,-17040,27988,-17040,27988,-17040,27988,-17040, +27787,-17364,27787,-17364,27787,-17364,27787,-17364, +27584,-17687,27584,-17687,27584,-17687,27584,-17687, +27376,-18006,27376,-18006,27376,-18006,27376,-18006, +27165,-18324,27165,-18324,27165,-18324,27165,-18324, +26950,-18638,26950,-18638,26950,-18638,26950,-18638, +26731,-18951,26731,-18951,26731,-18951,26731,-18951, +26509,-19260,26509,-19260,26509,-19260,26509,-19260, +26283,-19568,26283,-19568,26283,-19568,26283,-19568, +26053,-19872,26053,-19872,26053,-19872,26053,-19872, +25820,-20174,25820,-20174,25820,-20174,25820,-20174, +25584,-20473,25584,-20473,25584,-20473,25584,-20473, +25344,-20769,25344,-20769,25344,-20769,25344,-20769, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24854,-21353,24854,-21353,24854,-21353,24854,-21353, +24604,-21641,24604,-21641,24604,-21641,24604,-21641, +24350,-21926,24350,-21926,24350,-21926,24350,-21926, +24093,-22208,24093,-22208,24093,-22208,24093,-22208, +23833,-22487,23833,-22487,23833,-22487,23833,-22487, +23570,-22762,23570,-22762,23570,-22762,23570,-22762, +23304,-23035,23304,-23035,23304,-23035,23304,-23035, +23034,-23305,23034,-23305,23034,-23305,23034,-23305, +22761,-23571,22761,-23571,22761,-23571,22761,-23571, +22486,-23834,22486,-23834,22486,-23834,22486,-23834, +22207,-24094,22207,-24094,22207,-24094,22207,-24094, +21925,-24351,21925,-24351,21925,-24351,21925,-24351, +21640,-24605,21640,-24605,21640,-24605,21640,-24605, +21352,-24855,21352,-24855,21352,-24855,21352,-24855, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20768,-25345,20768,-25345,20768,-25345,20768,-25345, +20472,-25585,20472,-25585,20472,-25585,20472,-25585, +20173,-25821,20173,-25821,20173,-25821,20173,-25821, +19871,-26054,19871,-26054,19871,-26054,19871,-26054, +19567,-26284,19567,-26284,19567,-26284,19567,-26284, +19259,-26510,19259,-26510,19259,-26510,19259,-26510, +18950,-26732,18950,-26732,18950,-26732,18950,-26732, +18637,-26951,18637,-26951,18637,-26951,18637,-26951, +18323,-27166,18323,-27166,18323,-27166,18323,-27166, +18005,-27377,18005,-27377,18005,-27377,18005,-27377, +17686,-27585,17686,-27585,17686,-27585,17686,-27585, +17363,-27788,17363,-27788,17363,-27788,17363,-27788, +17039,-27989,17039,-27989,17039,-27989,17039,-27989, +16712,-28185,16712,-28185,16712,-28185,16712,-28185, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +16052,-28566,16052,-28566,16052,-28566,16052,-28566, +15718,-28751,15718,-28751,15718,-28751,15718,-28751, +15383,-28932,15383,-28932,15383,-28932,15383,-28932, +15045,-29109,15045,-29109,15045,-29109,15045,-29109, +14705,-29282,14705,-29282,14705,-29282,14705,-29282, +14364,-29451,14364,-29451,14364,-29451,14364,-29451, +14020,-29616,14020,-29616,14020,-29616,14020,-29616, +13674,-29778,13674,-29778,13674,-29778,13674,-29778, +13327,-29935,13327,-29935,13327,-29935,13327,-29935, +12978,-30088,12978,-30088,12978,-30088,12978,-30088, +12627,-30237,12627,-30237,12627,-30237,12627,-30237, +12274,-30382,12274,-30382,12274,-30382,12274,-30382, +11920,-30522,11920,-30522,11920,-30522,11920,-30522, +11564,-30659,11564,-30659,11564,-30659,11564,-30659, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +10847,-30920,10847,-30920,10847,-30920,10847,-30920, +10487,-31044,10487,-31044,10487,-31044,10487,-31044, +10125,-31164,10125,-31164,10125,-31164,10125,-31164, +9762,-31279,9762,-31279,9762,-31279,9762,-31279, +9397,-31391,9397,-31391,9397,-31391,9397,-31391, +9031,-31498,9031,-31498,9031,-31498,9031,-31498, +8664,-31601,8664,-31601,8664,-31601,8664,-31601, +8296,-31700,8296,-31700,8296,-31700,8296,-31700, +7927,-31794,7927,-31794,7927,-31794,7927,-31794, +7556,-31884,7556,-31884,7556,-31884,7556,-31884, +7185,-31970,7185,-31970,7185,-31970,7185,-31970, +6812,-32051,6812,-32051,6812,-32051,6812,-32051, +6439,-32129,6439,-32129,6439,-32129,6439,-32129, +6065,-32201,6065,-32201,6065,-32201,6065,-32201, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5314,-32334,5314,-32334,5314,-32334,5314,-32334, +4937,-32393,4937,-32393,4937,-32393,4937,-32393, +4560,-32449,4560,-32449,4560,-32449,4560,-32449, +4182,-32499,4182,-32499,4182,-32499,4182,-32499, +3804,-32546,3804,-32546,3804,-32546,3804,-32546, +3425,-32588,3425,-32588,3425,-32588,3425,-32588, +3045,-32626,3045,-32626,3045,-32626,3045,-32626, +2665,-32659,2665,-32659,2665,-32659,2665,-32659, +2285,-32688,2285,-32688,2285,-32688,2285,-32688, +1905,-32712,1905,-32712,1905,-32712,1905,-32712, +1524,-32732,1524,-32732,1524,-32732,1524,-32732, +1143,-32748,1143,-32748,1143,-32748,1143,-32748, +762,-32759,762,-32759,762,-32759,762,-32759, +381,-32765,381,-32765,381,-32765,381,-32765, +0,-32767,0,-32767,0,-32767,0,-32767, +-382,-32765,-382,-32765,-382,-32765,-382,-32765, +-763,-32759,-763,-32759,-763,-32759,-763,-32759, +-1144,-32748,-1144,-32748,-1144,-32748,-1144,-32748, +-1525,-32732,-1525,-32732,-1525,-32732,-1525,-32732, +-1906,-32712,-1906,-32712,-1906,-32712,-1906,-32712, +-2286,-32688,-2286,-32688,-2286,-32688,-2286,-32688, +-2666,-32659,-2666,-32659,-2666,-32659,-2666,-32659, +-3046,-32626,-3046,-32626,-3046,-32626,-3046,-32626, +-3426,-32588,-3426,-32588,-3426,-32588,-3426,-32588, +-3805,-32546,-3805,-32546,-3805,-32546,-3805,-32546, +-4183,-32499,-4183,-32499,-4183,-32499,-4183,-32499, +-4561,-32449,-4561,-32449,-4561,-32449,-4561,-32449, +-4938,-32393,-4938,-32393,-4938,-32393,-4938,-32393, +-5315,-32334,-5315,-32334,-5315,-32334,-5315,-32334, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-6066,-32201,-6066,-32201,-6066,-32201,-6066,-32201, +-6440,-32129,-6440,-32129,-6440,-32129,-6440,-32129, +-6813,-32051,-6813,-32051,-6813,-32051,-6813,-32051, +-7186,-31970,-7186,-31970,-7186,-31970,-7186,-31970, +-7557,-31884,-7557,-31884,-7557,-31884,-7557,-31884, +-7928,-31794,-7928,-31794,-7928,-31794,-7928,-31794, +-8297,-31700,-8297,-31700,-8297,-31700,-8297,-31700, +-8665,-31601,-8665,-31601,-8665,-31601,-8665,-31601, +-9032,-31498,-9032,-31498,-9032,-31498,-9032,-31498, +-9398,-31391,-9398,-31391,-9398,-31391,-9398,-31391, +-9763,-31279,-9763,-31279,-9763,-31279,-9763,-31279, +-10126,-31164,-10126,-31164,-10126,-31164,-10126,-31164, +-10488,-31044,-10488,-31044,-10488,-31044,-10488,-31044, +-10848,-30920,-10848,-30920,-10848,-30920,-10848,-30920, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-11565,-30659,-11565,-30659,-11565,-30659,-11565,-30659, +-11921,-30522,-11921,-30522,-11921,-30522,-11921,-30522, +-12275,-30382,-12275,-30382,-12275,-30382,-12275,-30382, +-12628,-30237,-12628,-30237,-12628,-30237,-12628,-30237, +-12979,-30088,-12979,-30088,-12979,-30088,-12979,-30088, +-13328,-29935,-13328,-29935,-13328,-29935,-13328,-29935, +-13675,-29778,-13675,-29778,-13675,-29778,-13675,-29778, +-14021,-29616,-14021,-29616,-14021,-29616,-14021,-29616, +-14365,-29451,-14365,-29451,-14365,-29451,-14365,-29451, +-14706,-29282,-14706,-29282,-14706,-29282,-14706,-29282, +-15046,-29109,-15046,-29109,-15046,-29109,-15046,-29109, +-15384,-28932,-15384,-28932,-15384,-28932,-15384,-28932, +-15719,-28751,-15719,-28751,-15719,-28751,-15719,-28751, +-16053,-28566,-16053,-28566,-16053,-28566,-16053,-28566, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-16713,-28185,-16713,-28185,-16713,-28185,-16713,-28185, +-17040,-27989,-17040,-27989,-17040,-27989,-17040,-27989, +-17364,-27788,-17364,-27788,-17364,-27788,-17364,-27788, +-17687,-27585,-17687,-27585,-17687,-27585,-17687,-27585, +-18006,-27377,-18006,-27377,-18006,-27377,-18006,-27377, +-18324,-27166,-18324,-27166,-18324,-27166,-18324,-27166, +-18638,-26951,-18638,-26951,-18638,-26951,-18638,-26951, +-18951,-26732,-18951,-26732,-18951,-26732,-18951,-26732, +-19260,-26510,-19260,-26510,-19260,-26510,-19260,-26510, +-19568,-26284,-19568,-26284,-19568,-26284,-19568,-26284, +-19872,-26054,-19872,-26054,-19872,-26054,-19872,-26054, +-20174,-25821,-20174,-25821,-20174,-25821,-20174,-25821, +-20473,-25585,-20473,-25585,-20473,-25585,-20473,-25585, +-20769,-25345,-20769,-25345,-20769,-25345,-20769,-25345, +-21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, +-21353,-24855,-21353,-24855,-21353,-24855,-21353,-24855, +-21641,-24605,-21641,-24605,-21641,-24605,-21641,-24605, +-21926,-24351,-21926,-24351,-21926,-24351,-21926,-24351, +-22208,-24094,-22208,-24094,-22208,-24094,-22208,-24094, +-22487,-23834,-22487,-23834,-22487,-23834,-22487,-23834, +-22762,-23571,-22762,-23571,-22762,-23571,-22762,-23571, +-23035,-23305,-23035,-23305,-23035,-23305,-23035,-23305, +-23305,-23035,-23305,-23035,-23305,-23035,-23305,-23035, +-23571,-22762,-23571,-22762,-23571,-22762,-23571,-22762, +-23834,-22487,-23834,-22487,-23834,-22487,-23834,-22487, +-24094,-22208,-24094,-22208,-24094,-22208,-24094,-22208, +-24351,-21926,-24351,-21926,-24351,-21926,-24351,-21926, +-24605,-21641,-24605,-21641,-24605,-21641,-24605,-21641, +-24855,-21353,-24855,-21353,-24855,-21353,-24855,-21353, +-25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, +-25345,-20769,-25345,-20769,-25345,-20769,-25345,-20769, +-25585,-20473,-25585,-20473,-25585,-20473,-25585,-20473, +-25821,-20174,-25821,-20174,-25821,-20174,-25821,-20174, +-26054,-19872,-26054,-19872,-26054,-19872,-26054,-19872, +-26284,-19568,-26284,-19568,-26284,-19568,-26284,-19568, +-26510,-19260,-26510,-19260,-26510,-19260,-26510,-19260, +-26732,-18951,-26732,-18951,-26732,-18951,-26732,-18951, +-26951,-18638,-26951,-18638,-26951,-18638,-26951,-18638, +-27166,-18324,-27166,-18324,-27166,-18324,-27166,-18324, +-27377,-18006,-27377,-18006,-27377,-18006,-27377,-18006, +-27585,-17687,-27585,-17687,-27585,-17687,-27585,-17687, +-27788,-17364,-27788,-17364,-27788,-17364,-27788,-17364, +-27989,-17040,-27989,-17040,-27989,-17040,-27989,-17040, +-28185,-16713,-28185,-16713,-28185,-16713,-28185,-16713, +-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, +-28566,-16053,-28566,-16053,-28566,-16053,-28566,-16053, +-28751,-15719,-28751,-15719,-28751,-15719,-28751,-15719, +-28932,-15384,-28932,-15384,-28932,-15384,-28932,-15384, +-29109,-15046,-29109,-15046,-29109,-15046,-29109,-15046, +-29282,-14706,-29282,-14706,-29282,-14706,-29282,-14706, +-29451,-14365,-29451,-14365,-29451,-14365,-29451,-14365, +-29616,-14021,-29616,-14021,-29616,-14021,-29616,-14021, +-29778,-13675,-29778,-13675,-29778,-13675,-29778,-13675, +-29935,-13328,-29935,-13328,-29935,-13328,-29935,-13328, +-30088,-12979,-30088,-12979,-30088,-12979,-30088,-12979, +-30237,-12628,-30237,-12628,-30237,-12628,-30237,-12628, +-30382,-12275,-30382,-12275,-30382,-12275,-30382,-12275, +-30522,-11921,-30522,-11921,-30522,-11921,-30522,-11921, +-30659,-11565,-30659,-11565,-30659,-11565,-30659,-11565, +-30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, +-30920,-10848,-30920,-10848,-30920,-10848,-30920,-10848, +-31044,-10488,-31044,-10488,-31044,-10488,-31044,-10488, +-31164,-10126,-31164,-10126,-31164,-10126,-31164,-10126, +-31279,-9763,-31279,-9763,-31279,-9763,-31279,-9763, +-31391,-9398,-31391,-9398,-31391,-9398,-31391,-9398, +-31498,-9032,-31498,-9032,-31498,-9032,-31498,-9032, +-31601,-8665,-31601,-8665,-31601,-8665,-31601,-8665, +-31700,-8297,-31700,-8297,-31700,-8297,-31700,-8297, +-31794,-7928,-31794,-7928,-31794,-7928,-31794,-7928, +-31884,-7557,-31884,-7557,-31884,-7557,-31884,-7557, +-31970,-7186,-31970,-7186,-31970,-7186,-31970,-7186, +-32051,-6813,-32051,-6813,-32051,-6813,-32051,-6813, +-32129,-6440,-32129,-6440,-32129,-6440,-32129,-6440, +-32201,-6066,-32201,-6066,-32201,-6066,-32201,-6066, +-32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, +-32334,-5315,-32334,-5315,-32334,-5315,-32334,-5315, +-32393,-4938,-32393,-4938,-32393,-4938,-32393,-4938, +-32449,-4561,-32449,-4561,-32449,-4561,-32449,-4561, +-32499,-4183,-32499,-4183,-32499,-4183,-32499,-4183, +-32546,-3805,-32546,-3805,-32546,-3805,-32546,-3805, +-32588,-3426,-32588,-3426,-32588,-3426,-32588,-3426, +-32626,-3046,-32626,-3046,-32626,-3046,-32626,-3046, +-32659,-2666,-32659,-2666,-32659,-2666,-32659,-2666, +-32688,-2286,-32688,-2286,-32688,-2286,-32688,-2286, +-32712,-1906,-32712,-1906,-32712,-1906,-32712,-1906, +-32732,-1525,-32732,-1525,-32732,-1525,-32732,-1525, +-32748,-1144,-32748,-1144,-32748,-1144,-32748,-1144, +-32759,-763,-32759,-763,-32759,-763,-32759,-763, +-32765,-382,-32765,-382,-32765,-382,-32765,-382, +-32767,-1,-32767,-1,-32767,-1,-32767,-1, +-32765,381,-32765,381,-32765,381,-32765,381, +-32759,762,-32759,762,-32759,762,-32759,762, +-32748,1143,-32748,1143,-32748,1143,-32748,1143, +-32732,1524,-32732,1524,-32732,1524,-32732,1524, +-32712,1905,-32712,1905,-32712,1905,-32712,1905, +-32688,2285,-32688,2285,-32688,2285,-32688,2285, +-32659,2665,-32659,2665,-32659,2665,-32659,2665, +-32626,3045,-32626,3045,-32626,3045,-32626,3045, +-32588,3425,-32588,3425,-32588,3425,-32588,3425, +-32546,3804,-32546,3804,-32546,3804,-32546,3804, +-32499,4182,-32499,4182,-32499,4182,-32499,4182, +-32449,4560,-32449,4560,-32449,4560,-32449,4560, +-32393,4937,-32393,4937,-32393,4937,-32393,4937, +-32334,5314,-32334,5314,-32334,5314,-32334,5314, +-32270,5689,-32270,5689,-32270,5689,-32270,5689, +-32201,6065,-32201,6065,-32201,6065,-32201,6065, +-32129,6439,-32129,6439,-32129,6439,-32129,6439, +-32051,6812,-32051,6812,-32051,6812,-32051,6812, +-31970,7185,-31970,7185,-31970,7185,-31970,7185, +-31884,7556,-31884,7556,-31884,7556,-31884,7556, +-31794,7927,-31794,7927,-31794,7927,-31794,7927, +-31700,8296,-31700,8296,-31700,8296,-31700,8296, +-31601,8664,-31601,8664,-31601,8664,-31601,8664, +-31498,9031,-31498,9031,-31498,9031,-31498,9031, +-31391,9397,-31391,9397,-31391,9397,-31391,9397, +-31279,9762,-31279,9762,-31279,9762,-31279,9762, +-31164,10125,-31164,10125,-31164,10125,-31164,10125, +-31044,10487,-31044,10487,-31044,10487,-31044,10487, +-30920,10847,-30920,10847,-30920,10847,-30920,10847, +-30791,11206,-30791,11206,-30791,11206,-30791,11206, +-30659,11564,-30659,11564,-30659,11564,-30659,11564, +-30522,11920,-30522,11920,-30522,11920,-30522,11920, +-30382,12274,-30382,12274,-30382,12274,-30382,12274, +-30237,12627,-30237,12627,-30237,12627,-30237,12627, +-30088,12978,-30088,12978,-30088,12978,-30088,12978, +-29935,13327,-29935,13327,-29935,13327,-29935,13327, +-29778,13674,-29778,13674,-29778,13674,-29778,13674, +-29616,14020,-29616,14020,-29616,14020,-29616,14020, +-29451,14364,-29451,14364,-29451,14364,-29451,14364, +-29282,14705,-29282,14705,-29282,14705,-29282,14705, +-29109,15045,-29109,15045,-29109,15045,-29109,15045, +-28932,15383,-28932,15383,-28932,15383,-28932,15383, +-28751,15718,-28751,15718,-28751,15718,-28751,15718, +-28566,16052,-28566,16052,-28566,16052,-28566,16052, +-28378,16383,-28378,16383,-28378,16383,-28378,16383, +-28185,16712,-28185,16712,-28185,16712,-28185,16712, +-27989,17039,-27989,17039,-27989,17039,-27989,17039, +-27788,17363,-27788,17363,-27788,17363,-27788,17363, +-27585,17686,-27585,17686,-27585,17686,-27585,17686, +-27377,18005,-27377,18005,-27377,18005,-27377,18005, +-27166,18323,-27166,18323,-27166,18323,-27166,18323, +-26951,18637,-26951,18637,-26951,18637,-26951,18637, +-26732,18950,-26732,18950,-26732,18950,-26732,18950, +-26510,19259,-26510,19259,-26510,19259,-26510,19259, +-26284,19567,-26284,19567,-26284,19567,-26284,19567, +-26054,19871,-26054,19871,-26054,19871,-26054,19871, +-25821,20173,-25821,20173,-25821,20173,-25821,20173, +-25585,20472,-25585,20472,-25585,20472,-25585,20472, +-25345,20768,-25345,20768,-25345,20768,-25345,20768, +-25101,21062,-25101,21062,-25101,21062,-25101,21062, +-24855,21352,-24855,21352,-24855,21352,-24855,21352, +-24605,21640,-24605,21640,-24605,21640,-24605,21640, +-24351,21925,-24351,21925,-24351,21925,-24351,21925, +-24094,22207,-24094,22207,-24094,22207,-24094,22207, +-23834,22486,-23834,22486,-23834,22486,-23834,22486, +-23571,22761,-23571,22761,-23571,22761,-23571,22761, +-23305,23034,-23305,23034,-23305,23034,-23305,23034, +-23035,23304,-23035,23304,-23035,23304,-23035,23304, +-22762,23570,-22762,23570,-22762,23570,-22762,23570, +-22487,23833,-22487,23833,-22487,23833,-22487,23833, +-22208,24093,-22208,24093,-22208,24093,-22208,24093, +-21926,24350,-21926,24350,-21926,24350,-21926,24350, +-21641,24604,-21641,24604,-21641,24604,-21641,24604, +-21353,24854,-21353,24854,-21353,24854,-21353,24854, +-21063,25100,-21063,25100,-21063,25100,-21063,25100, +-20769,25344,-20769,25344,-20769,25344,-20769,25344, +-20473,25584,-20473,25584,-20473,25584,-20473,25584, +-20174,25820,-20174,25820,-20174,25820,-20174,25820, +-19872,26053,-19872,26053,-19872,26053,-19872,26053, +-19568,26283,-19568,26283,-19568,26283,-19568,26283, +-19260,26509,-19260,26509,-19260,26509,-19260,26509, +-18951,26731,-18951,26731,-18951,26731,-18951,26731, +-18638,26950,-18638,26950,-18638,26950,-18638,26950, +-18324,27165,-18324,27165,-18324,27165,-18324,27165, +-18006,27376,-18006,27376,-18006,27376,-18006,27376, +-17687,27584,-17687,27584,-17687,27584,-17687,27584, +-17364,27787,-17364,27787,-17364,27787,-17364,27787, +-17040,27988,-17040,27988,-17040,27988,-17040,27988, +-16713,28184,-16713,28184,-16713,28184,-16713,28184}; + +void dft1080(int16_t *x,int16_t *y,unsigned char scale_flag){ // 360 x 3 + int i,j; + __m128i *x128=(__m128i *)x; + __m128i *y128=(__m128i *)y; + __m128i *twa128=(__m128i *)&twa1080[0]; + __m128i *twb128=(__m128i *)&twb1080[0]; + __m128i x2128[1080];// = (__m128i *)&x2128array[0]; + __m128i ytmp128[1080];//=&ytmp128array3[0]; + + + + for (i=0,j=0;i<360;i++,j+=3) { + x2128[i] = x128[j]; + x2128[i+360] = x128[j+1]; + x2128[i+360] = x128[j+2]; + } + + dft360((int16_t *)x2128,(int16_t *)ytmp128,1); + dft360((int16_t *)(x2128+360),(int16_t *)(ytmp128+360),1); + dft360((int16_t *)(x2128+720),(int16_t *)(ytmp128+720),1); + + bfly3_tw1(ytmp128,ytmp128+360,ytmp128+720,y128,y128+360,y128+720); + for (i=1,j=0;i<360;i++,j++) { + bfly3(ytmp128+i, + ytmp128+360+i, + ytmp128+720+i, + y128+i, + y128+360+i, + y128+720+i, + twa128+j, + twb128+j); + } + + if (scale_flag==1) { + norm128 = _mm_set1_epi16(dft_norm_table[14]); + + for (i=0;i<1080;i++) { + y128[i] = _mm_slli_epi16(_mm_mulhi_epi16(y128[i],norm128),1); + } + } + + _mm_empty(); + _m_empty(); + +}; + +/* Twiddles generated with +twa = floor(32767*exp(-sqrt(-1)*2*pi*(1:287)/1152)); +twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(1:287)/1152)); +twc = floor(32767*exp(-sqrt(-1)*2*pi*3*(1:287)/1152)); +twa2 = zeros(1,2*287); +twb2 = zeros(1,2*287); +twc2 = zeros(1,2*287); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +twb2(1:2:end) = real(twb); +twb2(2:2:end) = imag(twb); +twc2(1:2:end) = real(twc); +twc2(2:2:end) = imag(twc); +fd=fopen("twiddle_tmp.txt","w"); +fprintf(fd,"static int16_t twa1152[287*2*4] = {"); +for i=1:2:(2*286) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1),twa2(i),twa2(i+1)); +fprintf(fd,"\nstatic int16_t twb1152[287*2*4] = {"); +for i=1:2:(2*286) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); +fprintf(fd,"\nstatic int16_t twc1152[287*2*4] = {"); +for i=1:2:(2*286) + fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d,\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); +end +i=i+2; +fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1),twc2(i),twc2(i+1)); +fclose(fd); +*/ +static int16_t twa1152[287*2*4] = {32766,-179,32766,-179,32766,-179,32766,-179, +32765,-358,32765,-358,32765,-358,32765,-358, +32762,-537,32762,-537,32762,-537,32762,-537, +32759,-715,32759,-715,32759,-715,32759,-715, +32754,-894,32754,-894,32754,-894,32754,-894, +32749,-1073,32749,-1073,32749,-1073,32749,-1073, +32743,-1251,32743,-1251,32743,-1251,32743,-1251, +32735,-1430,32735,-1430,32735,-1430,32735,-1430, +32727,-1608,32727,-1608,32727,-1608,32727,-1608, +32718,-1787,32718,-1787,32718,-1787,32718,-1787, +32708,-1965,32708,-1965,32708,-1965,32708,-1965, +32696,-2144,32696,-2144,32696,-2144,32696,-2144, +32684,-2322,32684,-2322,32684,-2322,32684,-2322, +32671,-2500,32671,-2500,32671,-2500,32671,-2500, +32657,-2678,32657,-2678,32657,-2678,32657,-2678, +32642,-2856,32642,-2856,32642,-2856,32642,-2856, +32626,-3034,32626,-3034,32626,-3034,32626,-3034, +32609,-3212,32609,-3212,32609,-3212,32609,-3212, +32591,-3390,32591,-3390,32591,-3390,32591,-3390, +32572,-3568,32572,-3568,32572,-3568,32572,-3568, +32552,-3745,32552,-3745,32552,-3745,32552,-3745, +32531,-3923,32531,-3923,32531,-3923,32531,-3923, +32509,-4100,32509,-4100,32509,-4100,32509,-4100, +32486,-4277,32486,-4277,32486,-4277,32486,-4277, +32462,-4455,32462,-4455,32462,-4455,32462,-4455, +32438,-4632,32438,-4632,32438,-4632,32438,-4632, +32412,-4808,32412,-4808,32412,-4808,32412,-4808, +32385,-4985,32385,-4985,32385,-4985,32385,-4985, +32357,-5162,32357,-5162,32357,-5162,32357,-5162, +32329,-5338,32329,-5338,32329,-5338,32329,-5338, +32299,-5514,32299,-5514,32299,-5514,32299,-5514, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32237,-5866,32237,-5866,32237,-5866,32237,-5866, +32205,-6042,32205,-6042,32205,-6042,32205,-6042, +32171,-6218,32171,-6218,32171,-6218,32171,-6218, +32137,-6393,32137,-6393,32137,-6393,32137,-6393, +32102,-6568,32102,-6568,32102,-6568,32102,-6568, +32065,-6743,32065,-6743,32065,-6743,32065,-6743, +32028,-6918,32028,-6918,32028,-6918,32028,-6918, +31990,-7093,31990,-7093,31990,-7093,31990,-7093, +31951,-7267,31951,-7267,31951,-7267,31951,-7267, +31911,-7441,31911,-7441,31911,-7441,31911,-7441, +31869,-7615,31869,-7615,31869,-7615,31869,-7615, +31827,-7789,31827,-7789,31827,-7789,31827,-7789, +31785,-7962,31785,-7962,31785,-7962,31785,-7962, +31741,-8135,31741,-8135,31741,-8135,31741,-8135, +31696,-8308,31696,-8308,31696,-8308,31696,-8308, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31603,-8654,31603,-8654,31603,-8654,31603,-8654, +31556,-8826,31556,-8826,31556,-8826,31556,-8826, +31507,-8998,31507,-8998,31507,-8998,31507,-8998, +31457,-9170,31457,-9170,31457,-9170,31457,-9170, +31407,-9341,31407,-9341,31407,-9341,31407,-9341, +31356,-9512,31356,-9512,31356,-9512,31356,-9512, +31303,-9683,31303,-9683,31303,-9683,31303,-9683, +31250,-9854,31250,-9854,31250,-9854,31250,-9854, +31196,-10024,31196,-10024,31196,-10024,31196,-10024, +31141,-10194,31141,-10194,31141,-10194,31141,-10194, +31085,-10364,31085,-10364,31085,-10364,31085,-10364, +31028,-10533,31028,-10533,31028,-10533,31028,-10533, +30970,-10702,30970,-10702,30970,-10702,30970,-10702, +30911,-10871,30911,-10871,30911,-10871,30911,-10871, +30851,-11039,30851,-11039,30851,-11039,30851,-11039, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30729,-11375,30729,-11375,30729,-11375,30729,-11375, +30666,-11543,30666,-11543,30666,-11543,30666,-11543, +30603,-11710,30603,-11710,30603,-11710,30603,-11710, +30539,-11877,30539,-11877,30539,-11877,30539,-11877, +30473,-12043,30473,-12043,30473,-12043,30473,-12043, +30407,-12209,30407,-12209,30407,-12209,30407,-12209, +30340,-12375,30340,-12375,30340,-12375,30340,-12375, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +30203,-12705,30203,-12705,30203,-12705,30203,-12705, +30134,-12869,30134,-12869,30134,-12869,30134,-12869, +30063,-13034,30063,-13034,30063,-13034,30063,-13034, +29992,-13197,29992,-13197,29992,-13197,29992,-13197, +29919,-13361,29919,-13361,29919,-13361,29919,-13361, +29846,-13524,29846,-13524,29846,-13524,29846,-13524, +29772,-13686,29772,-13686,29772,-13686,29772,-13686, +29696,-13848,29696,-13848,29696,-13848,29696,-13848, +29621,-14010,29621,-14010,29621,-14010,29621,-14010, +29544,-14172,29544,-14172,29544,-14172,29544,-14172, +29466,-14332,29466,-14332,29466,-14332,29466,-14332, +29387,-14493,29387,-14493,29387,-14493,29387,-14493, +29308,-14653,29308,-14653,29308,-14653,29308,-14653, +29227,-14813,29227,-14813,29227,-14813,29227,-14813, +29146,-14972,29146,-14972,29146,-14972,29146,-14972, +29064,-15131,29064,-15131,29064,-15131,29064,-15131, +28981,-15289,28981,-15289,28981,-15289,28981,-15289, +28897,-15447,28897,-15447,28897,-15447,28897,-15447, +28813,-15604,28813,-15604,28813,-15604,28813,-15604, +28727,-15761,28727,-15761,28727,-15761,28727,-15761, +28641,-15918,28641,-15918,28641,-15918,28641,-15918, +28554,-16073,28554,-16073,28554,-16073,28554,-16073, +28465,-16229,28465,-16229,28465,-16229,28465,-16229, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28287,-16539,28287,-16539,28287,-16539,28287,-16539, +28196,-16693,28196,-16693,28196,-16693,28196,-16693, +28105,-16846,28105,-16846,28105,-16846,28105,-16846, +28012,-16999,28012,-16999,28012,-16999,28012,-16999, +27919,-17152,27919,-17152,27919,-17152,27919,-17152, +27825,-17304,27825,-17304,27825,-17304,27825,-17304, +27731,-17455,27731,-17455,27731,-17455,27731,-17455, +27635,-17606,27635,-17606,27635,-17606,27635,-17606, +27538,-17757,27538,-17757,27538,-17757,27538,-17757, +27441,-17907,27441,-17907,27441,-17907,27441,-17907, +27343,-18056,27343,-18056,27343,-18056,27343,-18056, +27244,-18205,27244,-18205,27244,-18205,27244,-18205, +27145,-18353,27145,-18353,27145,-18353,27145,-18353, +27044,-18501,27044,-18501,27044,-18501,27044,-18501, +26943,-18648,26943,-18648,26943,-18648,26943,-18648, +26841,-18795,26841,-18795,26841,-18795,26841,-18795, +26738,-18941,26738,-18941,26738,-18941,26738,-18941, +26634,-19087,26634,-19087,26634,-19087,26634,-19087, +26530,-19232,26530,-19232,26530,-19232,26530,-19232, +26424,-19376,26424,-19376,26424,-19376,26424,-19376, +26318,-19520,26318,-19520,26318,-19520,26318,-19520, +26211,-19663,26211,-19663,26211,-19663,26211,-19663, +26104,-19806,26104,-19806,26104,-19806,26104,-19806, +25995,-19948,25995,-19948,25995,-19948,25995,-19948, +25886,-20089,25886,-20089,25886,-20089,25886,-20089, +25776,-20230,25776,-20230,25776,-20230,25776,-20230, +25665,-20370,25665,-20370,25665,-20370,25665,-20370, +25554,-20510,25554,-20510,25554,-20510,25554,-20510, +25442,-20649,25442,-20649,25442,-20649,25442,-20649, +25329,-20788,25329,-20788,25329,-20788,25329,-20788, +25215,-20926,25215,-20926,25215,-20926,25215,-20926, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24985,-21199,24985,-21199,24985,-21199,24985,-21199, +24869,-21335,24869,-21335,24869,-21335,24869,-21335, +24753,-21471,24753,-21471,24753,-21471,24753,-21471, +24635,-21605,24635,-21605,24635,-21605,24635,-21605, +24517,-21739,24517,-21739,24517,-21739,24517,-21739, +24398,-21873,24398,-21873,24398,-21873,24398,-21873, +24278,-22005,24278,-22005,24278,-22005,24278,-22005, +24158,-22138,24158,-22138,24158,-22138,24158,-22138, +24037,-22269,24037,-22269,24037,-22269,24037,-22269, +23915,-22400,23915,-22400,23915,-22400,23915,-22400, +23792,-22530,23792,-22530,23792,-22530,23792,-22530, +23669,-22659,23669,-22659,23669,-22659,23669,-22659, +23545,-22788,23545,-22788,23545,-22788,23545,-22788, +23421,-22916,23421,-22916,23421,-22916,23421,-22916, +23295,-23044,23295,-23044,23295,-23044,23295,-23044, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +23043,-23296,23043,-23296,23043,-23296,23043,-23296, +22915,-23422,22915,-23422,22915,-23422,22915,-23422, +22787,-23546,22787,-23546,22787,-23546,22787,-23546, +22658,-23670,22658,-23670,22658,-23670,22658,-23670, +22529,-23793,22529,-23793,22529,-23793,22529,-23793, +22399,-23916,22399,-23916,22399,-23916,22399,-23916, +22268,-24038,22268,-24038,22268,-24038,22268,-24038, +22137,-24159,22137,-24159,22137,-24159,22137,-24159, +22004,-24279,22004,-24279,22004,-24279,22004,-24279, +21872,-24399,21872,-24399,21872,-24399,21872,-24399, +21738,-24518,21738,-24518,21738,-24518,21738,-24518, +21604,-24636,21604,-24636,21604,-24636,21604,-24636, +21470,-24754,21470,-24754,21470,-24754,21470,-24754, +21334,-24870,21334,-24870,21334,-24870,21334,-24870, +21198,-24986,21198,-24986,21198,-24986,21198,-24986, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20925,-25216,20925,-25216,20925,-25216,20925,-25216, +20787,-25330,20787,-25330,20787,-25330,20787,-25330, +20648,-25443,20648,-25443,20648,-25443,20648,-25443, +20509,-25555,20509,-25555,20509,-25555,20509,-25555, +20369,-25666,20369,-25666,20369,-25666,20369,-25666, +20229,-25777,20229,-25777,20229,-25777,20229,-25777, +20088,-25887,20088,-25887,20088,-25887,20088,-25887, +19947,-25996,19947,-25996,19947,-25996,19947,-25996, +19805,-26105,19805,-26105,19805,-26105,19805,-26105, +19662,-26212,19662,-26212,19662,-26212,19662,-26212, +19519,-26319,19519,-26319,19519,-26319,19519,-26319, +19375,-26425,19375,-26425,19375,-26425,19375,-26425, +19231,-26531,19231,-26531,19231,-26531,19231,-26531, +19086,-26635,19086,-26635,19086,-26635,19086,-26635, +18940,-26739,18940,-26739,18940,-26739,18940,-26739, +18794,-26842,18794,-26842,18794,-26842,18794,-26842, +18647,-26944,18647,-26944,18647,-26944,18647,-26944, +18500,-27045,18500,-27045,18500,-27045,18500,-27045, +18352,-27146,18352,-27146,18352,-27146,18352,-27146, +18204,-27245,18204,-27245,18204,-27245,18204,-27245, +18055,-27344,18055,-27344,18055,-27344,18055,-27344, +17906,-27442,17906,-27442,17906,-27442,17906,-27442, +17756,-27539,17756,-27539,17756,-27539,17756,-27539, +17605,-27636,17605,-27636,17605,-27636,17605,-27636, +17454,-27732,17454,-27732,17454,-27732,17454,-27732, +17303,-27826,17303,-27826,17303,-27826,17303,-27826, +17151,-27920,17151,-27920,17151,-27920,17151,-27920, +16998,-28013,16998,-28013,16998,-28013,16998,-28013, +16845,-28106,16845,-28106,16845,-28106,16845,-28106, +16692,-28197,16692,-28197,16692,-28197,16692,-28197, +16538,-28288,16538,-28288,16538,-28288,16538,-28288, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +16228,-28466,16228,-28466,16228,-28466,16228,-28466, +16072,-28555,16072,-28555,16072,-28555,16072,-28555, +15917,-28642,15917,-28642,15917,-28642,15917,-28642, +15760,-28728,15760,-28728,15760,-28728,15760,-28728, +15603,-28814,15603,-28814,15603,-28814,15603,-28814, +15446,-28898,15446,-28898,15446,-28898,15446,-28898, +15288,-28982,15288,-28982,15288,-28982,15288,-28982, +15130,-29065,15130,-29065,15130,-29065,15130,-29065, +14971,-29147,14971,-29147,14971,-29147,14971,-29147, +14812,-29228,14812,-29228,14812,-29228,14812,-29228, +14652,-29309,14652,-29309,14652,-29309,14652,-29309, +14492,-29388,14492,-29388,14492,-29388,14492,-29388, +14331,-29467,14331,-29467,14331,-29467,14331,-29467, +14171,-29545,14171,-29545,14171,-29545,14171,-29545, +14009,-29622,14009,-29622,14009,-29622,14009,-29622, +13847,-29697,13847,-29697,13847,-29697,13847,-29697, +13685,-29773,13685,-29773,13685,-29773,13685,-29773, +13523,-29847,13523,-29847,13523,-29847,13523,-29847, +13360,-29920,13360,-29920,13360,-29920,13360,-29920, +13196,-29993,13196,-29993,13196,-29993,13196,-29993, +13033,-30064,13033,-30064,13033,-30064,13033,-30064, +12868,-30135,12868,-30135,12868,-30135,12868,-30135, +12704,-30204,12704,-30204,12704,-30204,12704,-30204, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +12374,-30341,12374,-30341,12374,-30341,12374,-30341, +12208,-30408,12208,-30408,12208,-30408,12208,-30408, +12042,-30474,12042,-30474,12042,-30474,12042,-30474, +11876,-30540,11876,-30540,11876,-30540,11876,-30540, +11709,-30604,11709,-30604,11709,-30604,11709,-30604, +11542,-30667,11542,-30667,11542,-30667,11542,-30667, +11374,-30730,11374,-30730,11374,-30730,11374,-30730, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +11038,-30852,11038,-30852,11038,-30852,11038,-30852, +10870,-30912,10870,-30912,10870,-30912,10870,-30912, +10701,-30971,10701,-30971,10701,-30971,10701,-30971, +10532,-31029,10532,-31029,10532,-31029,10532,-31029, +10363,-31086,10363,-31086,10363,-31086,10363,-31086, +10193,-31142,10193,-31142,10193,-31142,10193,-31142, +10023,-31197,10023,-31197,10023,-31197,10023,-31197, +9853,-31251,9853,-31251,9853,-31251,9853,-31251, +9682,-31304,9682,-31304,9682,-31304,9682,-31304, +9511,-31357,9511,-31357,9511,-31357,9511,-31357, +9340,-31408,9340,-31408,9340,-31408,9340,-31408, +9169,-31458,9169,-31458,9169,-31458,9169,-31458, +8997,-31508,8997,-31508,8997,-31508,8997,-31508, +8825,-31557,8825,-31557,8825,-31557,8825,-31557, +8653,-31604,8653,-31604,8653,-31604,8653,-31604, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +8307,-31697,8307,-31697,8307,-31697,8307,-31697, +8134,-31742,8134,-31742,8134,-31742,8134,-31742, +7961,-31786,7961,-31786,7961,-31786,7961,-31786, +7788,-31828,7788,-31828,7788,-31828,7788,-31828, +7614,-31870,7614,-31870,7614,-31870,7614,-31870, +7440,-31912,7440,-31912,7440,-31912,7440,-31912, +7266,-31952,7266,-31952,7266,-31952,7266,-31952, +7092,-31991,7092,-31991,7092,-31991,7092,-31991, +6917,-32029,6917,-32029,6917,-32029,6917,-32029, +6742,-32066,6742,-32066,6742,-32066,6742,-32066, +6567,-32103,6567,-32103,6567,-32103,6567,-32103, +6392,-32138,6392,-32138,6392,-32138,6392,-32138, +6217,-32172,6217,-32172,6217,-32172,6217,-32172, +6041,-32206,6041,-32206,6041,-32206,6041,-32206, +5865,-32238,5865,-32238,5865,-32238,5865,-32238, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5513,-32300,5513,-32300,5513,-32300,5513,-32300, +5337,-32330,5337,-32330,5337,-32330,5337,-32330, +5161,-32358,5161,-32358,5161,-32358,5161,-32358, +4984,-32386,4984,-32386,4984,-32386,4984,-32386, +4807,-32413,4807,-32413,4807,-32413,4807,-32413, +4631,-32439,4631,-32439,4631,-32439,4631,-32439, +4454,-32463,4454,-32463,4454,-32463,4454,-32463, +4276,-32487,4276,-32487,4276,-32487,4276,-32487, +4099,-32510,4099,-32510,4099,-32510,4099,-32510, +3922,-32532,3922,-32532,3922,-32532,3922,-32532, +3744,-32553,3744,-32553,3744,-32553,3744,-32553, +3567,-32573,3567,-32573,3567,-32573,3567,-32573, +3389,-32592,3389,-32592,3389,-32592,3389,-32592, +3211,-32610,3211,-32610,3211,-32610,3211,-32610, +3033,-32627,3033,-32627,3033,-32627,3033,-32627, +2855,-32643,2855,-32643,2855,-32643,2855,-32643, +2677,-32658,2677,-32658,2677,-32658,2677,-32658, +2499,-32672,2499,-32672,2499,-32672,2499,-32672, +2321,-32685,2321,-32685,2321,-32685,2321,-32685, +2143,-32697,2143,-32697,2143,-32697,2143,-32697, +1964,-32709,1964,-32709,1964,-32709,1964,-32709, +1786,-32719,1786,-32719,1786,-32719,1786,-32719, +1607,-32728,1607,-32728,1607,-32728,1607,-32728, +1429,-32736,1429,-32736,1429,-32736,1429,-32736, +1250,-32744,1250,-32744,1250,-32744,1250,-32744, +1072,-32750,1072,-32750,1072,-32750,1072,-32750, +893,-32755,893,-32755,893,-32755,893,-32755, +714,-32760,714,-32760,714,-32760,714,-32760, +536,-32763,536,-32763,536,-32763,536,-32763, +357,-32766,357,-32766,357,-32766,357,-32766, +178,-32767,178,-32767,178,-32767,178,-32767}; + +static int16_t twb1152[287*2*4] = {32765,-358,32765,-358,32765,-358,32765,-358, +32759,-715,32759,-715,32759,-715,32759,-715, +32749,-1073,32749,-1073,32749,-1073,32749,-1073, +32735,-1430,32735,-1430,32735,-1430,32735,-1430, +32718,-1787,32718,-1787,32718,-1787,32718,-1787, +32696,-2144,32696,-2144,32696,-2144,32696,-2144, +32671,-2500,32671,-2500,32671,-2500,32671,-2500, +32642,-2856,32642,-2856,32642,-2856,32642,-2856, +32609,-3212,32609,-3212,32609,-3212,32609,-3212, +32572,-3568,32572,-3568,32572,-3568,32572,-3568, +32531,-3923,32531,-3923,32531,-3923,32531,-3923, +32486,-4277,32486,-4277,32486,-4277,32486,-4277, +32438,-4632,32438,-4632,32438,-4632,32438,-4632, +32385,-4985,32385,-4985,32385,-4985,32385,-4985, +32329,-5338,32329,-5338,32329,-5338,32329,-5338, +32269,-5690,32269,-5690,32269,-5690,32269,-5690, +32205,-6042,32205,-6042,32205,-6042,32205,-6042, +32137,-6393,32137,-6393,32137,-6393,32137,-6393, +32065,-6743,32065,-6743,32065,-6743,32065,-6743, +31990,-7093,31990,-7093,31990,-7093,31990,-7093, +31911,-7441,31911,-7441,31911,-7441,31911,-7441, +31827,-7789,31827,-7789,31827,-7789,31827,-7789, +31741,-8135,31741,-8135,31741,-8135,31741,-8135, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31556,-8826,31556,-8826,31556,-8826,31556,-8826, +31457,-9170,31457,-9170,31457,-9170,31457,-9170, +31356,-9512,31356,-9512,31356,-9512,31356,-9512, +31250,-9854,31250,-9854,31250,-9854,31250,-9854, +31141,-10194,31141,-10194,31141,-10194,31141,-10194, +31028,-10533,31028,-10533,31028,-10533,31028,-10533, +30911,-10871,30911,-10871,30911,-10871,30911,-10871, +30790,-11207,30790,-11207,30790,-11207,30790,-11207, +30666,-11543,30666,-11543,30666,-11543,30666,-11543, +30539,-11877,30539,-11877,30539,-11877,30539,-11877, +30407,-12209,30407,-12209,30407,-12209,30407,-12209, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +30134,-12869,30134,-12869,30134,-12869,30134,-12869, +29992,-13197,29992,-13197,29992,-13197,29992,-13197, +29846,-13524,29846,-13524,29846,-13524,29846,-13524, +29696,-13848,29696,-13848,29696,-13848,29696,-13848, +29544,-14172,29544,-14172,29544,-14172,29544,-14172, +29387,-14493,29387,-14493,29387,-14493,29387,-14493, +29227,-14813,29227,-14813,29227,-14813,29227,-14813, +29064,-15131,29064,-15131,29064,-15131,29064,-15131, +28897,-15447,28897,-15447,28897,-15447,28897,-15447, +28727,-15761,28727,-15761,28727,-15761,28727,-15761, +28554,-16073,28554,-16073,28554,-16073,28554,-16073, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28196,-16693,28196,-16693,28196,-16693,28196,-16693, +28012,-16999,28012,-16999,28012,-16999,28012,-16999, +27825,-17304,27825,-17304,27825,-17304,27825,-17304, +27635,-17606,27635,-17606,27635,-17606,27635,-17606, +27441,-17907,27441,-17907,27441,-17907,27441,-17907, +27244,-18205,27244,-18205,27244,-18205,27244,-18205, +27044,-18501,27044,-18501,27044,-18501,27044,-18501, +26841,-18795,26841,-18795,26841,-18795,26841,-18795, +26634,-19087,26634,-19087,26634,-19087,26634,-19087, +26424,-19376,26424,-19376,26424,-19376,26424,-19376, +26211,-19663,26211,-19663,26211,-19663,26211,-19663, +25995,-19948,25995,-19948,25995,-19948,25995,-19948, +25776,-20230,25776,-20230,25776,-20230,25776,-20230, +25554,-20510,25554,-20510,25554,-20510,25554,-20510, +25329,-20788,25329,-20788,25329,-20788,25329,-20788, +25100,-21063,25100,-21063,25100,-21063,25100,-21063, +24869,-21335,24869,-21335,24869,-21335,24869,-21335, +24635,-21605,24635,-21605,24635,-21605,24635,-21605, +24398,-21873,24398,-21873,24398,-21873,24398,-21873, +24158,-22138,24158,-22138,24158,-22138,24158,-22138, +23915,-22400,23915,-22400,23915,-22400,23915,-22400, +23669,-22659,23669,-22659,23669,-22659,23669,-22659, +23421,-22916,23421,-22916,23421,-22916,23421,-22916, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22915,-23422,22915,-23422,22915,-23422,22915,-23422, +22658,-23670,22658,-23670,22658,-23670,22658,-23670, +22399,-23916,22399,-23916,22399,-23916,22399,-23916, +22137,-24159,22137,-24159,22137,-24159,22137,-24159, +21872,-24399,21872,-24399,21872,-24399,21872,-24399, +21604,-24636,21604,-24636,21604,-24636,21604,-24636, +21334,-24870,21334,-24870,21334,-24870,21334,-24870, +21062,-25101,21062,-25101,21062,-25101,21062,-25101, +20787,-25330,20787,-25330,20787,-25330,20787,-25330, +20509,-25555,20509,-25555,20509,-25555,20509,-25555, +20229,-25777,20229,-25777,20229,-25777,20229,-25777, +19947,-25996,19947,-25996,19947,-25996,19947,-25996, +19662,-26212,19662,-26212,19662,-26212,19662,-26212, +19375,-26425,19375,-26425,19375,-26425,19375,-26425, +19086,-26635,19086,-26635,19086,-26635,19086,-26635, +18794,-26842,18794,-26842,18794,-26842,18794,-26842, +18500,-27045,18500,-27045,18500,-27045,18500,-27045, +18204,-27245,18204,-27245,18204,-27245,18204,-27245, +17906,-27442,17906,-27442,17906,-27442,17906,-27442, +17605,-27636,17605,-27636,17605,-27636,17605,-27636, +17303,-27826,17303,-27826,17303,-27826,17303,-27826, +16998,-28013,16998,-28013,16998,-28013,16998,-28013, +16692,-28197,16692,-28197,16692,-28197,16692,-28197, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +16072,-28555,16072,-28555,16072,-28555,16072,-28555, +15760,-28728,15760,-28728,15760,-28728,15760,-28728, +15446,-28898,15446,-28898,15446,-28898,15446,-28898, +15130,-29065,15130,-29065,15130,-29065,15130,-29065, +14812,-29228,14812,-29228,14812,-29228,14812,-29228, +14492,-29388,14492,-29388,14492,-29388,14492,-29388, +14171,-29545,14171,-29545,14171,-29545,14171,-29545, +13847,-29697,13847,-29697,13847,-29697,13847,-29697, +13523,-29847,13523,-29847,13523,-29847,13523,-29847, +13196,-29993,13196,-29993,13196,-29993,13196,-29993, +12868,-30135,12868,-30135,12868,-30135,12868,-30135, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +12208,-30408,12208,-30408,12208,-30408,12208,-30408, +11876,-30540,11876,-30540,11876,-30540,11876,-30540, +11542,-30667,11542,-30667,11542,-30667,11542,-30667, +11206,-30791,11206,-30791,11206,-30791,11206,-30791, +10870,-30912,10870,-30912,10870,-30912,10870,-30912, +10532,-31029,10532,-31029,10532,-31029,10532,-31029, +10193,-31142,10193,-31142,10193,-31142,10193,-31142, +9853,-31251,9853,-31251,9853,-31251,9853,-31251, +9511,-31357,9511,-31357,9511,-31357,9511,-31357, +9169,-31458,9169,-31458,9169,-31458,9169,-31458, +8825,-31557,8825,-31557,8825,-31557,8825,-31557, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +8134,-31742,8134,-31742,8134,-31742,8134,-31742, +7788,-31828,7788,-31828,7788,-31828,7788,-31828, +7440,-31912,7440,-31912,7440,-31912,7440,-31912, +7092,-31991,7092,-31991,7092,-31991,7092,-31991, +6742,-32066,6742,-32066,6742,-32066,6742,-32066, +6392,-32138,6392,-32138,6392,-32138,6392,-32138, +6041,-32206,6041,-32206,6041,-32206,6041,-32206, +5689,-32270,5689,-32270,5689,-32270,5689,-32270, +5337,-32330,5337,-32330,5337,-32330,5337,-32330, +4984,-32386,4984,-32386,4984,-32386,4984,-32386, +4631,-32439,4631,-32439,4631,-32439,4631,-32439, +4276,-32487,4276,-32487,4276,-32487,4276,-32487, +3922,-32532,3922,-32532,3922,-32532,3922,-32532, +3567,-32573,3567,-32573,3567,-32573,3567,-32573, +3211,-32610,3211,-32610,3211,-32610,3211,-32610, +2855,-32643,2855,-32643,2855,-32643,2855,-32643, +2499,-32672,2499,-32672,2499,-32672,2499,-32672, +2143,-32697,2143,-32697,2143,-32697,2143,-32697, +1786,-32719,1786,-32719,1786,-32719,1786,-32719, +1429,-32736,1429,-32736,1429,-32736,1429,-32736, +1072,-32750,1072,-32750,1072,-32750,1072,-32750, +714,-32760,714,-32760,714,-32760,714,-32760, +357,-32766,357,-32766,357,-32766,357,-32766, +0,-32767,0,-32767,0,-32767,0,-32767, +-358,-32766,-358,-32766,-358,-32766,-358,-32766, +-715,-32760,-715,-32760,-715,-32760,-715,-32760, +-1073,-32750,-1073,-32750,-1073,-32750,-1073,-32750, +-1430,-32736,-1430,-32736,-1430,-32736,-1430,-32736, +-1787,-32719,-1787,-32719,-1787,-32719,-1787,-32719, +-2144,-32697,-2144,-32697,-2144,-32697,-2144,-32697, +-2500,-32672,-2500,-32672,-2500,-32672,-2500,-32672, +-2856,-32643,-2856,-32643,-2856,-32643,-2856,-32643, +-3212,-32610,-3212,-32610,-3212,-32610,-3212,-32610, +-3568,-32573,-3568,-32573,-3568,-32573,-3568,-32573, +-3923,-32532,-3923,-32532,-3923,-32532,-3923,-32532, +-4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, +-4632,-32439,-4632,-32439,-4632,-32439,-4632,-32439, +-4985,-32386,-4985,-32386,-4985,-32386,-4985,-32386, +-5338,-32330,-5338,-32330,-5338,-32330,-5338,-32330, +-5690,-32270,-5690,-32270,-5690,-32270,-5690,-32270, +-6042,-32206,-6042,-32206,-6042,-32206,-6042,-32206, +-6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, +-6743,-32066,-6743,-32066,-6743,-32066,-6743,-32066, +-7093,-31991,-7093,-31991,-7093,-31991,-7093,-31991, +-7441,-31912,-7441,-31912,-7441,-31912,-7441,-31912, +-7789,-31828,-7789,-31828,-7789,-31828,-7789,-31828, +-8135,-31742,-8135,-31742,-8135,-31742,-8135,-31742, +-8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, +-8826,-31557,-8826,-31557,-8826,-31557,-8826,-31557, +-9170,-31458,-9170,-31458,-9170,-31458,-9170,-31458, +-9512,-31357,-9512,-31357,-9512,-31357,-9512,-31357, +-9854,-31251,-9854,-31251,-9854,-31251,-9854,-31251, +-10194,-31142,-10194,-31142,-10194,-31142,-10194,-31142, +-10533,-31029,-10533,-31029,-10533,-31029,-10533,-31029, +-10871,-30912,-10871,-30912,-10871,-30912,-10871,-30912, +-11207,-30791,-11207,-30791,-11207,-30791,-11207,-30791, +-11543,-30667,-11543,-30667,-11543,-30667,-11543,-30667, +-11877,-30540,-11877,-30540,-11877,-30540,-11877,-30540, +-12209,-30408,-12209,-30408,-12209,-30408,-12209,-30408, +-12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, +-12869,-30135,-12869,-30135,-12869,-30135,-12869,-30135, +-13197,-29993,-13197,-29993,-13197,-29993,-13197,-29993, +-13524,-29847,-13524,-29847,-13524,-29847,-13524,-29847, +-13848,-29697,-13848,-29697,-13848,-29697,-13848,-29697, +-14172,-29545,-14172,-29545,-14172,-29545,-14172,-29545, +-14493,-29388,-14493,-29388,-14493,-29388,-14493,-29388, +-14813,-29228,-14813,-29228,-14813,-29228,-14813,-29228, +-15131,-29065,-15131,-29065,-15131,-29065,-15131,-29065, +-15447,-28898,-15447,-28898,-15447,-28898,-15447,-28898, +-15761,-28728,-15761,-28728,-15761,-28728,-15761,-28728, +-16073,-28555,-16073,-28555,-16073,-28555,-16073,-28555, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-16693,-28197,-16693,-28197,-16693,-28197,-16693,-28197, +-16999,-28013,-16999,-28013,-16999,-28013,-16999,-28013, +-17304,-27826,-17304,-27826,-17304,-27826,-17304,-27826, +-17606,-27636,-17606,-27636,-17606,-27636,-17606,-27636, +-17907,-27442,-17907,-27442,-17907,-27442,-17907,-27442, +-18205,-27245,-18205,-27245,-18205,-27245,-18205,-27245, +-18501,-27045,-18501,-27045,-18501,-27045,-18501,-27045, +-18795,-26842,-18795,-26842,-18795,-26842,-18795,-26842, +-19087,-26635,-19087,-26635,-19087,-26635,-19087,-26635, +-19376,-26425,-19376,-26425,-19376,-26425,-19376,-26425, +-19663,-26212,-19663,-26212,-19663,-26212,-19663,-26212, +-19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, +-20230,-25777,-20230,-25777,-20230,-25777,-20230,-25777, +-20510,-25555,-20510,-25555,-20510,-25555,-20510,-25555, +-20788,-25330,-20788,-25330,-20788,-25330,-20788,-25330, +-21063,-25101,-21063,-25101,-21063,-25101,-21063,-25101, +-21335,-24870,-21335,-24870,-21335,-24870,-21335,-24870, +-21605,-24636,-21605,-24636,-21605,-24636,-21605,-24636, +-21873,-24399,-21873,-24399,-21873,-24399,-21873,-24399, +-22138,-24159,-22138,-24159,-22138,-24159,-22138,-24159, +-22400,-23916,-22400,-23916,-22400,-23916,-22400,-23916, +-22659,-23670,-22659,-23670,-22659,-23670,-22659,-23670, +-22916,-23422,-22916,-23422,-22916,-23422,-22916,-23422, +-23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, +-23422,-22916,-23422,-22916,-23422,-22916,-23422,-22916, +-23670,-22659,-23670,-22659,-23670,-22659,-23670,-22659, +-23916,-22400,-23916,-22400,-23916,-22400,-23916,-22400, +-24159,-22138,-24159,-22138,-24159,-22138,-24159,-22138, +-24399,-21873,-24399,-21873,-24399,-21873,-24399,-21873, +-24636,-21605,-24636,-21605,-24636,-21605,-24636,-21605, +-24870,-21335,-24870,-21335,-24870,-21335,-24870,-21335, +-25101,-21063,-25101,-21063,-25101,-21063,-25101,-21063, +-25330,-20788,-25330,-20788,-25330,-20788,-25330,-20788, +-25555,-20510,-25555,-20510,-25555,-20510,-25555,-20510, +-25777,-20230,-25777,-20230,-25777,-20230,-25777,-20230, +-25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, +-26212,-19663,-26212,-19663,-26212,-19663,-26212,-19663, +-26425,-19376,-26425,-19376,-26425,-19376,-26425,-19376, +-26635,-19087,-26635,-19087,-26635,-19087,-26635,-19087, +-26842,-18795,-26842,-18795,-26842,-18795,-26842,-18795, +-27045,-18501,-27045,-18501,-27045,-18501,-27045,-18501, +-27245,-18205,-27245,-18205,-27245,-18205,-27245,-18205, +-27442,-17907,-27442,-17907,-27442,-17907,-27442,-17907, +-27636,-17606,-27636,-17606,-27636,-17606,-27636,-17606, +-27826,-17304,-27826,-17304,-27826,-17304,-27826,-17304, +-28013,-16999,-28013,-16999,-28013,-16999,-28013,-16999, +-28197,-16693,-28197,-16693,-28197,-16693,-28197,-16693, +-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, +-28555,-16073,-28555,-16073,-28555,-16073,-28555,-16073, +-28728,-15761,-28728,-15761,-28728,-15761,-28728,-15761, +-28898,-15447,-28898,-15447,-28898,-15447,-28898,-15447, +-29065,-15131,-29065,-15131,-29065,-15131,-29065,-15131, +-29228,-14813,-29228,-14813,-29228,-14813,-29228,-14813, +-29388,-14493,-29388,-14493,-29388,-14493,-29388,-14493, +-29545,-14172,-29545,-14172,-29545,-14172,-29545,-14172, +-29697,-13848,-29697,-13848,-29697,-13848,-29697,-13848, +-29847,-13524,-29847,-13524,-29847,-13524,-29847,-13524, +-29993,-13197,-29993,-13197,-29993,-13197,-29993,-13197, +-30135,-12869,-30135,-12869,-30135,-12869,-30135,-12869, +-30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, +-30408,-12209,-30408,-12209,-30408,-12209,-30408,-12209, +-30540,-11877,-30540,-11877,-30540,-11877,-30540,-11877, +-30667,-11543,-30667,-11543,-30667,-11543,-30667,-11543, +-30791,-11207,-30791,-11207,-30791,-11207,-30791,-11207, +-30912,-10871,-30912,-10871,-30912,-10871,-30912,-10871, +-31029,-10533,-31029,-10533,-31029,-10533,-31029,-10533, +-31142,-10194,-31142,-10194,-31142,-10194,-31142,-10194, +-31251,-9854,-31251,-9854,-31251,-9854,-31251,-9854, +-31357,-9512,-31357,-9512,-31357,-9512,-31357,-9512, +-31458,-9170,-31458,-9170,-31458,-9170,-31458,-9170, +-31557,-8826,-31557,-8826,-31557,-8826,-31557,-8826, +-31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, +-31742,-8135,-31742,-8135,-31742,-8135,-31742,-8135, +-31828,-7789,-31828,-7789,-31828,-7789,-31828,-7789, +-31912,-7441,-31912,-7441,-31912,-7441,-31912,-7441, +-31991,-7093,-31991,-7093,-31991,-7093,-31991,-7093, +-32066,-6743,-32066,-6743,-32066,-6743,-32066,-6743, +-32138,-6393,-32138,-6393,-32138,-6393,-32138,-6393, +-32206,-6042,-32206,-6042,-32206,-6042,-32206,-6042, +-32270,-5690,-32270,-5690,-32270,-5690,-32270,-5690, +-32330,-5338,-32330,-5338,-32330,-5338,-32330,-5338, +-32386,-4985,-32386,-4985,-32386,-4985,-32386,-4985, +-32439,-4632,-32439,-4632,-32439,-4632,-32439,-4632, +-32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, +-32532,-3923,-32532,-3923,-32532,-3923,-32532,-3923, +-32573,-3568,-32573,-3568,-32573,-3568,-32573,-3568, +-32610,-3212,-32610,-3212,-32610,-3212,-32610,-3212, +-32643,-2856,-32643,-2856,-32643,-2856,-32643,-2856, +-32672,-2500,-32672,-2500,-32672,-2500,-32672,-2500, +-32697,-2144,-32697,-2144,-32697,-2144,-32697,-2144, +-32719,-1787,-32719,-1787,-32719,-1787,-32719,-1787, +-32736,-1430,-32736,-1430,-32736,-1430,-32736,-1430, +-32750,-1073,-32750,-1073,-32750,-1073,-32750,-1073, +-32760,-715,-32760,-715,-32760,-715,-32760,-715, +-32766,-358,-32766,-358,-32766,-358,-32766,-358}; + +static int16_t twc1152[287*2*4] = {32762,-537,32762,-537,32762,-537,32762,-537, +32749,-1073,32749,-1073,32749,-1073,32749,-1073, +32727,-1608,32727,-1608,32727,-1608,32727,-1608, +32696,-2144,32696,-2144,32696,-2144,32696,-2144, +32657,-2678,32657,-2678,32657,-2678,32657,-2678, +32609,-3212,32609,-3212,32609,-3212,32609,-3212, +32552,-3745,32552,-3745,32552,-3745,32552,-3745, +32486,-4277,32486,-4277,32486,-4277,32486,-4277, +32412,-4808,32412,-4808,32412,-4808,32412,-4808, +32329,-5338,32329,-5338,32329,-5338,32329,-5338, +32237,-5866,32237,-5866,32237,-5866,32237,-5866, +32137,-6393,32137,-6393,32137,-6393,32137,-6393, +32028,-6918,32028,-6918,32028,-6918,32028,-6918, +31911,-7441,31911,-7441,31911,-7441,31911,-7441, +31785,-7962,31785,-7962,31785,-7962,31785,-7962, +31650,-8481,31650,-8481,31650,-8481,31650,-8481, +31507,-8998,31507,-8998,31507,-8998,31507,-8998, +31356,-9512,31356,-9512,31356,-9512,31356,-9512, +31196,-10024,31196,-10024,31196,-10024,31196,-10024, +31028,-10533,31028,-10533,31028,-10533,31028,-10533, +30851,-11039,30851,-11039,30851,-11039,30851,-11039, +30666,-11543,30666,-11543,30666,-11543,30666,-11543, +30473,-12043,30473,-12043,30473,-12043,30473,-12043, +30272,-12540,30272,-12540,30272,-12540,30272,-12540, +30063,-13034,30063,-13034,30063,-13034,30063,-13034, +29846,-13524,29846,-13524,29846,-13524,29846,-13524, +29621,-14010,29621,-14010,29621,-14010,29621,-14010, +29387,-14493,29387,-14493,29387,-14493,29387,-14493, +29146,-14972,29146,-14972,29146,-14972,29146,-14972, +28897,-15447,28897,-15447,28897,-15447,28897,-15447, +28641,-15918,28641,-15918,28641,-15918,28641,-15918, +28377,-16384,28377,-16384,28377,-16384,28377,-16384, +28105,-16846,28105,-16846,28105,-16846,28105,-16846, +27825,-17304,27825,-17304,27825,-17304,27825,-17304, +27538,-17757,27538,-17757,27538,-17757,27538,-17757, +27244,-18205,27244,-18205,27244,-18205,27244,-18205, +26943,-18648,26943,-18648,26943,-18648,26943,-18648, +26634,-19087,26634,-19087,26634,-19087,26634,-19087, +26318,-19520,26318,-19520,26318,-19520,26318,-19520, +25995,-19948,25995,-19948,25995,-19948,25995,-19948, +25665,-20370,25665,-20370,25665,-20370,25665,-20370, +25329,-20788,25329,-20788,25329,-20788,25329,-20788, +24985,-21199,24985,-21199,24985,-21199,24985,-21199, +24635,-21605,24635,-21605,24635,-21605,24635,-21605, +24278,-22005,24278,-22005,24278,-22005,24278,-22005, +23915,-22400,23915,-22400,23915,-22400,23915,-22400, +23545,-22788,23545,-22788,23545,-22788,23545,-22788, +23169,-23170,23169,-23170,23169,-23170,23169,-23170, +22787,-23546,22787,-23546,22787,-23546,22787,-23546, +22399,-23916,22399,-23916,22399,-23916,22399,-23916, +22004,-24279,22004,-24279,22004,-24279,22004,-24279, +21604,-24636,21604,-24636,21604,-24636,21604,-24636, +21198,-24986,21198,-24986,21198,-24986,21198,-24986, +20787,-25330,20787,-25330,20787,-25330,20787,-25330, +20369,-25666,20369,-25666,20369,-25666,20369,-25666, +19947,-25996,19947,-25996,19947,-25996,19947,-25996, +19519,-26319,19519,-26319,19519,-26319,19519,-26319, +19086,-26635,19086,-26635,19086,-26635,19086,-26635, +18647,-26944,18647,-26944,18647,-26944,18647,-26944, +18204,-27245,18204,-27245,18204,-27245,18204,-27245, +17756,-27539,17756,-27539,17756,-27539,17756,-27539, +17303,-27826,17303,-27826,17303,-27826,17303,-27826, +16845,-28106,16845,-28106,16845,-28106,16845,-28106, +16383,-28378,16383,-28378,16383,-28378,16383,-28378, +15917,-28642,15917,-28642,15917,-28642,15917,-28642, +15446,-28898,15446,-28898,15446,-28898,15446,-28898, +14971,-29147,14971,-29147,14971,-29147,14971,-29147, +14492,-29388,14492,-29388,14492,-29388,14492,-29388, +14009,-29622,14009,-29622,14009,-29622,14009,-29622, +13523,-29847,13523,-29847,13523,-29847,13523,-29847, +13033,-30064,13033,-30064,13033,-30064,13033,-30064, +12539,-30273,12539,-30273,12539,-30273,12539,-30273, +12042,-30474,12042,-30474,12042,-30474,12042,-30474, +11542,-30667,11542,-30667,11542,-30667,11542,-30667, +11038,-30852,11038,-30852,11038,-30852,11038,-30852, +10532,-31029,10532,-31029,10532,-31029,10532,-31029, +10023,-31197,10023,-31197,10023,-31197,10023,-31197, +9511,-31357,9511,-31357,9511,-31357,9511,-31357, +8997,-31508,8997,-31508,8997,-31508,8997,-31508, +8480,-31651,8480,-31651,8480,-31651,8480,-31651, +7961,-31786,7961,-31786,7961,-31786,7961,-31786, +7440,-31912,7440,-31912,7440,-31912,7440,-31912, +6917,-32029,6917,-32029,6917,-32029,6917,-32029, +6392,-32138,6392,-32138,6392,-32138,6392,-32138, +5865,-32238,5865,-32238,5865,-32238,5865,-32238, +5337,-32330,5337,-32330,5337,-32330,5337,-32330, +4807,-32413,4807,-32413,4807,-32413,4807,-32413, +4276,-32487,4276,-32487,4276,-32487,4276,-32487, +3744,-32553,3744,-32553,3744,-32553,3744,-32553, +3211,-32610,3211,-32610,3211,-32610,3211,-32610, +2677,-32658,2677,-32658,2677,-32658,2677,-32658, +2143,-32697,2143,-32697,2143,-32697,2143,-32697, +1607,-32728,1607,-32728,1607,-32728,1607,-32728, +1072,-32750,1072,-32750,1072,-32750,1072,-32750, +536,-32763,536,-32763,536,-32763,536,-32763, +0,-32767,0,-32767,0,-32767,0,-32767, +-537,-32763,-537,-32763,-537,-32763,-537,-32763, +-1073,-32750,-1073,-32750,-1073,-32750,-1073,-32750, +-1608,-32728,-1608,-32728,-1608,-32728,-1608,-32728, +-2144,-32697,-2144,-32697,-2144,-32697,-2144,-32697, +-2678,-32658,-2678,-32658,-2678,-32658,-2678,-32658, +-3212,-32610,-3212,-32610,-3212,-32610,-3212,-32610, +-3745,-32553,-3745,-32553,-3745,-32553,-3745,-32553, +-4277,-32487,-4277,-32487,-4277,-32487,-4277,-32487, +-4808,-32413,-4808,-32413,-4808,-32413,-4808,-32413, +-5338,-32330,-5338,-32330,-5338,-32330,-5338,-32330, +-5866,-32238,-5866,-32238,-5866,-32238,-5866,-32238, +-6393,-32138,-6393,-32138,-6393,-32138,-6393,-32138, +-6918,-32029,-6918,-32029,-6918,-32029,-6918,-32029, +-7441,-31912,-7441,-31912,-7441,-31912,-7441,-31912, +-7962,-31786,-7962,-31786,-7962,-31786,-7962,-31786, +-8481,-31651,-8481,-31651,-8481,-31651,-8481,-31651, +-8998,-31508,-8998,-31508,-8998,-31508,-8998,-31508, +-9512,-31357,-9512,-31357,-9512,-31357,-9512,-31357, +-10024,-31197,-10024,-31197,-10024,-31197,-10024,-31197, +-10533,-31029,-10533,-31029,-10533,-31029,-10533,-31029, +-11039,-30852,-11039,-30852,-11039,-30852,-11039,-30852, +-11543,-30667,-11543,-30667,-11543,-30667,-11543,-30667, +-12043,-30474,-12043,-30474,-12043,-30474,-12043,-30474, +-12540,-30273,-12540,-30273,-12540,-30273,-12540,-30273, +-13034,-30064,-13034,-30064,-13034,-30064,-13034,-30064, +-13524,-29847,-13524,-29847,-13524,-29847,-13524,-29847, +-14010,-29622,-14010,-29622,-14010,-29622,-14010,-29622, +-14493,-29388,-14493,-29388,-14493,-29388,-14493,-29388, +-14972,-29147,-14972,-29147,-14972,-29147,-14972,-29147, +-15447,-28898,-15447,-28898,-15447,-28898,-15447,-28898, +-15918,-28642,-15918,-28642,-15918,-28642,-15918,-28642, +-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378, +-16846,-28106,-16846,-28106,-16846,-28106,-16846,-28106, +-17304,-27826,-17304,-27826,-17304,-27826,-17304,-27826, +-17757,-27539,-17757,-27539,-17757,-27539,-17757,-27539, +-18205,-27245,-18205,-27245,-18205,-27245,-18205,-27245, +-18648,-26944,-18648,-26944,-18648,-26944,-18648,-26944, +-19087,-26635,-19087,-26635,-19087,-26635,-19087,-26635, +-19520,-26319,-19520,-26319,-19520,-26319,-19520,-26319, +-19948,-25996,-19948,-25996,-19948,-25996,-19948,-25996, +-20370,-25666,-20370,-25666,-20370,-25666,-20370,-25666, +-20788,-25330,-20788,-25330,-20788,-25330,-20788,-25330, +-21199,-24986,-21199,-24986,-21199,-24986,-21199,-24986, +-21605,-24636,-21605,-24636,-21605,-24636,-21605,-24636, +-22005,-24279,-22005,-24279,-22005,-24279,-22005,-24279, +-22400,-23916,-22400,-23916,-22400,-23916,-22400,-23916, +-22788,-23546,-22788,-23546,-22788,-23546,-22788,-23546, +-23170,-23170,-23170,-23170,-23170,-23170,-23170,-23170, +-23546,-22788,-23546,-22788,-23546,-22788,-23546,-22788, +-23916,-22400,-23916,-22400,-23916,-22400,-23916,-22400, +-24279,-22005,-24279,-22005,-24279,-22005,-24279,-22005, +-24636,-21605,-24636,-21605,-24636,-21605,-24636,-21605, +-24986,-21199,-24986,-21199,-24986,-21199,-24986,-21199, +-25330,-20788,-25330,-20788,-25330,-20788,-25330,-20788, +-25666,-20370,-25666,-20370,-25666,-20370,-25666,-20370, +-25996,-19948,-25996,-19948,-25996,-19948,-25996,-19948, +-26319,-19520,-26319,-19520,-26319,-19520,-26319,-19520, +-26635,-19087,-26635,-19087,-26635,-19087,-26635,-19087, +-26944,-18648,-26944,-18648,-26944,-18648,-26944,-18648, +-27245,-18205,-27245,-18205,-27245,-18205,-27245,-18205, +-27539,-17757,-27539,-17757,-27539,-17757,-27539,-17757, +-27826,-17304,-27826,-17304,-27826,-17304,-27826,-17304, +-28106,-16846,-28106,-16846,-28106,-16846,-28106,-16846, +-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384, +-28642,-15918,-28642,-15918,-28642,-15918,-28642,-15918, +-28898,-15447,-28898,-15447,-28898,-15447,-28898,-15447, +-29147,-14972,-29147,-14972,-29147,-14972,-29147,-14972, +-29388,-14493,-29388,-14493,-29388,-14493,-29388,-14493, +-29622,-14010,-29622,-14010,-29622,-14010,-29622,-14010, +-29847,-13524,-29847,-13524,-29847,-13524,-29847,-13524, +-30064,-13034,-30064,-13034,-30064,-13034,-30064,-13034, +-30273,-12540,-30273,-12540,-30273,-12540,-30273,-12540, +-30474,-12043,-30474,-12043,-30474,-12043,-30474,-12043, +-30667,-11543,-30667,-11543,-30667,-11543,-30667,-11543, +-30852,-11039,-30852,-11039,-30852,-11039,-30852,-11039, +-31029,-10533,-31029,-10533,-31029,-10533,-31029,-10533, +-31197,-10024,-31197,-10024,-31197,-10024,-31197,-10024, +-31357,-9512,-31357,-9512,-31357,-9512,-31357,-9512, +-31508,-8998,-31508,-8998,-31508,-8998,-31508,-8998, +-31651,-8481,-31651,-8481,-31651,-8481,-31651,-8481, +-31786,-7962,-31786,-7962,-31786,-7962,-31786,-7962, +-31912,-7441,-31912,-7441,-31912,-7441,-31912,-7441, +-32029,-6918,-32029,-6918,-32029,-6918,-32029,-6918, +-32138,-6393,-32138,-6393,-32138,-6393,-32138,-6393, +-32238,-5866,-32238,-5866,-32238,-5866,-32238,-5866, +-32330,-5338,-32330,-5338,-32330,-5338,-32330,-5338, +-32413,-4808,-32413,-4808,-32413,-4808,-32413,-4808, +-32487,-4277,-32487,-4277,-32487,-4277,-32487,-4277, +-32553,-3745,-32553,-3745,-32553,-3745,-32553,-3745, +-32610,-3212,-32610,-3212,-32610,-3212,-32610,-3212, +-32658,-2678,-32658,-2678,-32658,-2678,-32658,-2678, +-32697,-2144,-32697,-2144,-32697,-2144,-32697,-2144, +-32728,-1608,-32728,-1608,-32728,-1608,-32728,-1608, +-32750,-1073,-32750,-1073,-32750,-1073,-32750,-1073, +-32763,-537,-32763,-537,-32763,-537,-32763,-537, +-32767,-1,-32767,-1,-32767,-1,-32767,-1, +-32763,536,-32763,536,-32763,536,-32763,536, +-32750,1072,-32750,1072,-32750,1072,-32750,1072, +-32728,1607,-32728,1607,-32728,1607,-32728,1607, +-32697,2143,-32697,2143,-32697,2143,-32697,2143, +-32658,2677,-32658,2677,-32658,2677,-32658,2677, +-32610,3211,-32610,3211,-32610,3211,-32610,3211, +-32553,3744,-32553,3744,-32553,3744,-32553,3744, +-32487,4276,-32487,4276,-32487,4276,-32487,4276, +-32413,4807,-32413,4807,-32413,4807,-32413,4807, +-32330,5337,-32330,5337,-32330,5337,-32330,5337, +-32238,5865,-32238,5865,-32238,5865,-32238,5865, +-32138,6392,-32138,6392,-32138,6392,-32138,6392, +-32029,6917,-32029,6917,-32029,6917,-32029,6917, +-31912,7440,-31912,7440,-31912,7440,-31912,7440, +-31786,7961,-31786,7961,-31786,7961,-31786,7961, +-31651,8480,-31651,8480,-31651,8480,-31651,8480, +-31508,8997,-31508,8997,-31508,8997,-31508,8997, +-31357,9511,-31357,9511,-31357,9511,-31357,9511, +-31197,10023,-31197,10023,-31197,10023,-31197,10023, +-31029,10532,-31029,10532,-31029,10532,-31029,10532, +-30852,11038,-30852,11038,-30852,11038,-30852,11038, +-30667,11542,-30667,11542,-30667,11542,-30667,11542, +-30474,12042,-30474,12042,-30474,12042,-30474,12042, +-30273,12539,-30273,12539,-30273,12539,-30273,12539, +-30064,13033,-30064,13033,-30064,13033,-30064,13033, +-29847,13523,-29847,13523,-29847,13523,-29847,13523, +-29622,14009,-29622,14009,-29622,14009,-29622,14009, +-29388,14492,-29388,14492,-29388,14492,-29388,14492, +-29147,14971,-29147,14971,-29147,14971,-29147,14971, +-28898,15446,-28898,15446,-28898,15446,-28898,15446, +-28642,15917,-28642,15917,-28642,15917,-28642,15917, +-28378,16383,-28378,16383,-28378,16383,-28378,16383, +-28106,16845,-28106,16845,-28106,16845,-28106,16845, +-27826,17303,-27826,17303,-27826,17303,-27826,17303, +-27539,17756,-27539,17756,-27539,17756,-27539,17756, +-27245,18204,-27245,18204,-27245,18204,-27245,18204, +-26944,18647,-26944,18647,-26944,18647,-26944,18647, +-26635,19086,-26635,19086,-26635,19086,-26635,19086, +-26319,19519,-26319,19519,-26319,19519,-26319,19519, +-25996,19947,-25996,19947,-25996,19947,-25996,19947, +-25666,20369,-25666,20369,-25666,20369,-25666,20369, +-25330,20787,-25330,20787,-25330,20787,-25330,20787, +-24986,21198,-24986,21198,-24986,21198,-24986,21198, +-24636,21604,-24636,21604,-24636,21604,-24636,21604, +-24279,22004,-24279,22004,-24279,22004,-24279,22004, +-23916,22399,-23916,22399,-23916,22399,-23916,22399, +-23546,22787,-23546,22787,-23546,22787,-23546,22787, +-23170,23169,-23170,23169,-23170,23169,-23170,23169, +-22788,23545,-22788,23545,-22788,23545,-22788,23545, +-22400,23915,-22400,23915,-22400,23915,-22400,23915, +-22005,24278,-22005,24278,-22005,24278,-22005,24278, +-21605,24635,-21605,24635,-21605,24635,-21605,24635, +-21199,24985,-21199,24985,-21199,24985,-21199,24985, +-20788,25329,-20788,25329,-20788,25329,-20788,25329, +-20370,25665,-20370,25665,-20370,25665,-20370,25665, +-19948,25995,-19948,25995,-19948,25995,-19948,25995, +-19520,26318,-19520,26318,-19520,26318,-19520,26318, +-19087,26634,-19087,26634,-19087,26634,-19087,26634, +-18648,26943,-18648,26943,-18648,26943,-18648,26943, +-18205,27244,-18205,27244,-18205,27244,-18205,27244, +-17757,27538,-17757,27538,-17757,27538,-17757,27538, +-17304,27825,-17304,27825,-17304,27825,-17304,27825, +-16846,28105,-16846,28105,-16846,28105,-16846,28105, +-16384,28377,-16384,28377,-16384,28377,-16384,28377, +-15918,28641,-15918,28641,-15918,28641,-15918,28641, +-15447,28897,-15447,28897,-15447,28897,-15447,28897, +-14972,29146,-14972,29146,-14972,29146,-14972,29146, +-14493,29387,-14493,29387,-14493,29387,-14493,29387, +-14010,29621,-14010,29621,-14010,29621,-14010,29621, +-13524,29846,-13524,29846,-13524,29846,-13524,29846, +-13034,30063,-13034,30063,-13034,30063,-13034,30063, +-12540,30272,-12540,30272,-12540,30272,-12540,30272, +-12043,30473,-12043,30473,-12043,30473,-12043,30473, +-11543,30666,-11543,30666,-11543,30666,-11543,30666, +-11039,30851,-11039,30851,-11039,30851,-11039,30851, +-10533,31028,-10533,31028,-10533,31028,-10533,31028, +-10024,31196,-10024,31196,-10024,31196,-10024,31196, +-9512,31356,-9512,31356,-9512,31356,-9512,31356, +-8998,31507,-8998,31507,-8998,31507,-8998,31507, +-8481,31650,-8481,31650,-8481,31650,-8481,31650, +-7962,31785,-7962,31785,-7962,31785,-7962,31785, +-7441,31911,-7441,31911,-7441,31911,-7441,31911, +-6918,32028,-6918,32028,-6918,32028,-6918,32028, +-6393,32137,-6393,32137,-6393,32137,-6393,32137, +-5866,32237,-5866,32237,-5866,32237,-5866,32237, +-5338,32329,-5338,32329,-5338,32329,-5338,32329, +-4808,32412,-4808,32412,-4808,32412,-4808,32412, +-4277,32486,-4277,32486,-4277,32486,-4277,32486, +-3745,32552,-3745,32552,-3745,32552,-3745,32552, +-3212,32609,-3212,32609,-3212,32609,-3212,32609, +-2678,32657,-2678,32657,-2678,32657,-2678,32657, +-2144,32696,-2144,32696,-2144,32696,-2144,32696, +-1608,32727,-1608,32727,-1608,32727,-1608,32727, +-1073,32749,-1073,32749,-1073,32749,-1073,32749, +-537,32762,-537,32762,-537,32762,-537,32762}; + +void dft1152(int16_t *x,int16_t *y,unsigned char scale_flag){ // 288 x 4 + + int i,j; + __m128i *x128=(__m128i *)x; + __m128i *y128=(__m128i *)y; + __m128i *twa128=(__m128i *)&twa1152[0]; + __m128i *twb128=(__m128i *)&twb1152[0]; + __m128i *twc128=(__m128i *)&twc1152[0]; + __m128i x2128[1152];// = (__m128i *)&x2128array[0]; + __m128i ytmp128[1152];//=&ytmp128array2[0]; + + + + for (i=0,j=0;i<288;i++,j+=4) { + x2128[i] = x128[j]; + x2128[i+288] = x128[j+1]; + x2128[i+576] = x128[j+2]; + x2128[i+864] = x128[j+3]; + } + + dft288((int16_t *)x2128,(int16_t *)ytmp128,1); + dft288((int16_t *)(x2128+288),(int16_t *)(ytmp128+288),1); + dft288((int16_t *)(x2128+576),(int16_t *)(ytmp128+576),1); + dft288((int16_t *)(x2128+864),(int16_t *)(ytmp128+864),1); + + bfly4_tw1(ytmp128,ytmp128+288,ytmp128+576,ytmp128+864,y128,y128+288,y128+576,y128+864); + for (i=1,j=0;i<288;i++,j++) { + bfly4(ytmp128+i, + ytmp128+288+i, + ytmp128+576+i, + ytmp128+864+i, + y128+i, + y128+288+i, + y128+576+i, + y128+864+i, + twa128+j, + twb128+j, + twc128+j); + } + + if (scale_flag==1) { + norm128 = _mm_set1_epi16(16384);//dft_norm_table[13]); + + for (i=0;i<1152;i++) { + y128[i] = _mm_slli_epi16(_mm_mulhi_epi16(y128[i],norm128),1); + } + } + + _mm_empty(); + _m_empty(); +}; + int16_t twa1200[4784] = { 32766,-172,32766,-172,32766,-172,32766,-172, 32765,-344,32765,-344,32765,-344,32765,-344, 32762,-515,32762,-515,32762,-515,32762,-515, diff --git a/openair1/SCHED/phy_procedures_lte_common.c b/openair1/SCHED/phy_procedures_lte_common.c index 36992ea594..da810c6491 100755 --- a/openair1/SCHED/phy_procedures_lte_common.c +++ b/openair1/SCHED/phy_procedures_lte_common.c @@ -116,7 +116,7 @@ void get_Msg3_alloc_ret(LTE_DL_FRAME_PARMS *frame_parms, unsigned int current_frame, unsigned int *frame, unsigned char *subframe) { - if (frame_parms->frame_type == 0) { + if (frame_parms->frame_type == FDD) { // always retransmit in n+8 *subframe = current_subframe+8; if (*subframe>9) { @@ -151,7 +151,7 @@ u8 get_Msg3_harq_pid(LTE_DL_FRAME_PARMS *frame_parms, u8 ul_subframe=0; u32 ul_frame; - if (frame_parms->frame_type ==0) { + if (frame_parms->frame_type ==FDD) { ul_subframe = (current_subframe>4) ? (current_subframe-4) : (current_subframe+6); ul_frame = (current_subframe>3) ? (frame+1) : frame; } @@ -221,7 +221,7 @@ u8 get_Msg3_harq_pid(LTE_DL_FRAME_PARMS *frame_parms, unsigned char ul_ACK_subframe2_dl_subframe(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subframe,unsigned char ACK_index) { - if (frame_parms->frame_type == 0) { + if (frame_parms->frame_type == FDD) { return((subframe<4) ? subframe+6 : subframe-4); } else { @@ -270,7 +270,7 @@ unsigned char ul_ACK_subframe2_dl_subframe(LTE_DL_FRAME_PARMS *frame_parms,unsig unsigned char ul_ACK_subframe2_M(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subframe) { - if (frame_parms->frame_type == 0) { + if (frame_parms->frame_type == FDD) { return(1); } else { @@ -455,7 +455,7 @@ u16 get_Np(u8 N_RB_DL,u8 nCCE,u8 plus1) { lte_subframe_t subframe_select(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subframe) { // if FDD return dummy value - if (frame_parms->frame_type == 0) + if (frame_parms->frame_type == FDD) return(SF_DL); switch (frame_parms->tdd_config) { @@ -514,7 +514,7 @@ u8 phich_subframe_to_harq_pid(LTE_DL_FRAME_PARMS *frame_parms,u32 frame,u8 subfr unsigned int is_phich_subframe(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subframe) { - if (frame_parms->frame_type == 0) { + if (frame_parms->frame_type == FDD) { return(1); } else { diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 3ae6023b24..c8dbab1a80 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1893,10 +1893,11 @@ void phy_procedures_eNB_TX(unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,u8 void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,u8 last_slot,u8 UE_id, u8 harq_pid) { // this prepares the demodulation of the first PUSCH of a new user, containing Msg3 - + int frame = ((last_slot>>1)>=8 ? -1 : 0) + phy_vars_eNB->frame; + LOG_D(PHY,"[eNB %d][RAPROC] frame %d : subframe %d (last_slot %d): process_Msg3 UE_id %d (active %d, subframe %d, frame %d)\n", phy_vars_eNB->Mod_id, - phy_vars_eNB->frame,last_slot>>1,last_slot, + frame,last_slot>>1,last_slot, UE_id,phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_active, phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_subframe, phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_frame); @@ -1905,7 +1906,7 @@ void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,u8 last_slot,u8 UE_id, u8 harq_pid) if ((phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_active == 1) && ((last_slot%2)==1) && (phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_subframe == (last_slot>>1)) && - (phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_frame == (phy_vars_eNB->frame))) { + (phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_frame == frame)) { // harq_pid = 0; @@ -1914,7 +1915,7 @@ void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,u8 last_slot,u8 UE_id, u8 harq_pid) phy_vars_eNB->ulsch_eNB[(u32)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag=1; LOG_D(PHY,"[eNB %d][RAPROC] frame %d, slot %d, subframe %d: Setting subframe_scheduling_flag (Msg3) for UE %d\n", phy_vars_eNB->Mod_id, - phy_vars_eNB->frame,last_slot,last_slot>>1,UE_id); + frame,last_slot,last_slot>>1,UE_id); } } @@ -1939,6 +1940,7 @@ void process_HARQ_feedback(u8 UE_id, u8 subframe_m4,M,m; int mp; int all_ACKed=1,nb_alloc=0,nb_ACK=0; + int frame = ((subframe>=8) ? -1 : 0) + phy_vars_eNB->frame; if (phy_vars_eNB->lte_frame_parms.frame_type == 0){ //FDD subframe_m4 = (subframe<4) ? subframe+6 : subframe-4; @@ -1950,7 +1952,7 @@ void process_HARQ_feedback(u8 UE_id, else dlsch_ACK[0] = pucch_payload[0]; LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d for subframe %d\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->frame,dlsch_ACK[0],subframe_m4); + frame,dlsch_ACK[0],subframe_m4); } else { // TDD Handle M=1,2 cases only @@ -2122,7 +2124,7 @@ void process_HARQ_feedback(u8 UE_id, ue_stats->dlsch_mcs_offset=-1; } #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[process_HARQ_feedback] Frame %d Setting round to %d for pid %d (subframe %d)\n",phy_vars_eNB->frame, + LOG_D(PHY,"[process_HARQ_feedback] Frame %d Setting round to %d for pid %d (subframe %d)\n",frame, dlsch_harq_proc->round,dl_harq_pid[m],subframe); #endif @@ -2161,10 +2163,11 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; u8 nCCE0,nCCE1; int sf; + int frame = ((subframe>=8) ? -1 : 0) + phy_vars_eNB->frame; if (frame_parms->frame_type == FDD ) { sf = (subframe<4) ? (subframe+6) : (subframe-4); - printf("n1_pucch_eNB: subframe %d, nCCE %d\n",sf,phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[sf]); + // printf("n1_pucch_eNB: subframe %d, nCCE %d\n",sf,phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[sf]); if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[sf]>0) { *n1_pucch0 = frame_parms->pucch_config_common.n1PUCCH_AN + phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[sf]; @@ -2234,7 +2237,7 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, else { LOG_D(PHY,"[eNB %d] frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n", phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, + frame, subframe,frame_parms->tdd_config); return; } @@ -2292,7 +2295,7 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, } else { LOG_D(PHY,"[eNB %d] Frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame,subframe,frame_parms->tdd_config); + phy_vars_eNB->Mod_id,frame,subframe,frame_parms->tdd_config); return; } break; @@ -2310,12 +2313,13 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,u8 subframe,u8 abstraction_flag u16 preamble_max,preamble_energy_max; u16 i; s8 UE_id; + int frame = ((subframe)>=8 ? -1 : 0) + phy_vars_eNB->frame; memset(&preamble_energy_list[0],0,64*sizeof(u16)); memset(&preamble_delay_list[0],0,64*sizeof(u16)); if (abstraction_flag == 0) { LOG_I(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->frame,subframe,dB_fixed(signal_energy(&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti],512)) - phy_vars_eNB->rx_total_gain_eNB_dB); + frame,subframe,dB_fixed(signal_energy(&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti],512)) - phy_vars_eNB->rx_total_gain_eNB_dB); // LOG_I(PHY,"[eNB %d][RAPROC] PRACH: rootSequenceIndex %d, prach_ConfigIndex %d, zeroCorrelationZoneConfig %d, highSpeedFlag %d, prach_FreqOffset %d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex, phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset); @@ -2323,7 +2327,7 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,u8 subframe,u8 abstraction_flag subframe, preamble_energy_list, preamble_delay_list, - phy_vars_eNB->frame, + frame, 0); } else { @@ -2374,7 +2378,7 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,u8 subframe,u8 abstraction_flag preamble_delay_list[preamble_max]); #ifdef OPENAIR2 mac_xface->initiate_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, + frame, preamble_max, preamble_delay_list[preamble_max], 0,subframe,0); @@ -2382,7 +2386,7 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,u8 subframe,u8 abstraction_flag } else { LOG_D(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Unable to add user, max user count reached\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame, subframe); + phy_vars_eNB->Mod_id,frame, subframe); } } } @@ -2412,6 +2416,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 u16 rnti=0; u8 access_mode; int num_active_cba_groups; + int frame = ((last_slot>>1)>=8 ? -1 : 0 )+ phy_vars_eNB->frame; vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1); @@ -2422,7 +2427,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 // check if we have to detect PRACH first if ((last_slot&1)==1){ // printf("Checking PRACH for eNB %d, subframe %d\n",phy_vars_eNB->Mod_id,last_slot>>1); - if (is_prach_subframe(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->frame,last_slot>>1)>0) { + if (is_prach_subframe(&phy_vars_eNB->lte_frame_parms,frame,last_slot>>1)>0) { // printf("Running prach procedures\n"); prach_procedures(phy_vars_eNB,last_slot>>1,abstraction_flag); } @@ -2513,7 +2518,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 */ // Check for active processes in current subframe harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms, - ((last_slot>>1)==9 ? -1 : 0 )+ phy_vars_eNB->frame,last_slot>>1); + frame,last_slot>>1); // printf("[eNB][PUSCH] subframe %d => harq_pid %d\n",last_slot>>1,harq_pid); /* @@ -2564,20 +2569,20 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Scheduling PUSCH/ULSCH Reception for rnti %x\n", phy_vars_eNB->Mod_id,harq_pid, - (((last_slot>>1)==9) ? -1 : 0)+phy_vars_eNB->frame,last_slot>>1,phy_vars_eNB->ulsch_eNB[i]->rnti); + frame,last_slot>>1,phy_vars_eNB->ulsch_eNB[i]->rnti); #endif #ifdef DEBUG_PHY_PROC if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1){ LOG_D(PHY,"[eNB %d] frame %d, slot %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n", phy_vars_eNB->Mod_id, - (((last_slot>>1)==9)?-1:0)+phy_vars_eNB->frame, + frame, last_slot,last_slot>>1, phy_vars_eNB->eNB_UE_stats[i].sector); } else { LOG_D(PHY,"[eNB %d] frame %d, slot %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s sect_id %d\n", phy_vars_eNB->Mod_id, - (((last_slot>>1)==9)?-1:0)+phy_vars_eNB->frame, + frame, last_slot,last_slot>>1, i, mode_string[phy_vars_eNB->eNB_UE_stats[i].mode], @@ -2591,7 +2596,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #ifdef DEBUG_PHY_PROC LOG_I(PHY,"[eNB %d][PUSCH %d] Frame %d Subframe %d Demodulating PUSCH: dci_alloc %d, rar_alloc %d, round %d, Ndi %d, first_rb %d, nb_rb %d, mcs %d, TBS %d, rv %d, cyclic_shift %d (n_DMRS2 %d, cyclicShift_common %d, nprs %d), O_ACK %d \n", - phy_vars_eNB->Mod_id,harq_pid,(((last_slot>>1)==9)?-1:0)+phy_vars_eNB->frame,last_slot>>1, + phy_vars_eNB->Mod_id,harq_pid,frame,last_slot>>1, phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc, phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc, phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round, @@ -2647,7 +2652,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #ifdef DEBUG_PHY_PROC LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", phy_vars_eNB->Mod_id,harq_pid, - phy_vars_eNB->frame,last_slot>>1, + frame,last_slot>>1, phy_vars_eNB->ulsch_eNB[i]->rnti, dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), @@ -2681,7 +2686,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 - phy_vars_eNB->rx_total_gain_eNB_dB; #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d] Frame %d subframe %d: ULSCH %d RX power (%d,%d) dB\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame,last_slot>>1,i, + phy_vars_eNB->Mod_id,frame,last_slot>>1,i, dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1])); #endif @@ -2692,7 +2697,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d Clearing subframe_scheduling_flag\n", - phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->frame,last_slot>>1,i,harq_pid); + phy_vars_eNB->Mod_id,harq_pid,frame,last_slot>>1,i,harq_pid); #endif phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0; @@ -2718,7 +2723,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { LOG_D(PHY,"[eNB %d][RAPROC] frame %d, slot %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n", phy_vars_eNB->Mod_id, - phy_vars_eNB->frame,last_slot,last_slot>>1, i, + frame,last_slot,last_slot>>1, i, phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx-1); @@ -2729,7 +2734,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; #ifdef OPENAIR2 mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, + frame, phy_vars_eNB->eNB_UE_stats[i].crnti); #endif remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag); @@ -2743,7 +2748,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 get_Msg3_alloc_ret(&phy_vars_eNB->lte_frame_parms, last_slot>>1, - phy_vars_eNB->frame, + frame, &phy_vars_eNB->ulsch_eNB[i]->Msg3_frame, &phy_vars_eNB->ulsch_eNB[i]->Msg3_subframe); } @@ -2751,7 +2756,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 else { //normal ULSCH LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d Error receiving ULSCH, round %d/%d (ACK %d,%d)\n", phy_vars_eNB->Mod_id,harq_pid, - phy_vars_eNB->frame,last_slot>>1, i, + frame,last_slot>>1, i, phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, phy_vars_eNB->ulsch_eNB[i]->Mdlharq, phy_vars_eNB->ulsch_eNB[i]->o_ACK[0], @@ -2768,7 +2773,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== phy_vars_eNB->ulsch_eNB[i]->Mdlharq) { LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mdlharq %d reached\n", phy_vars_eNB->Mod_id,harq_pid, - phy_vars_eNB->frame,last_slot>>1, i, + frame,last_slot>>1, i, phy_vars_eNB->ulsch_eNB[i]->Mdlharq); phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round=0; @@ -2782,11 +2787,11 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 // If we've dropped the UE, go back to PRACH mode for this UE if (phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] == 20) { LOG_I(PHY,"[eNB %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached, removing UE\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame,last_slot>>1, i); + phy_vars_eNB->Mod_id,frame,last_slot>>1, i); phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; #ifdef OPENAIR2 mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, + frame, phy_vars_eNB->eNB_UE_stats[i].crnti); #endif remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag); @@ -2797,7 +2802,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 else { LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n", phy_vars_eNB->Mod_id,harq_pid, - phy_vars_eNB->frame,last_slot>>1); + frame,last_slot>>1); phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1; @@ -2809,10 +2814,10 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #ifdef DEBUG_PHY_PROC LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n", phy_vars_eNB->Mod_id, - phy_vars_eNB->frame,harq_pid,i); + frame,harq_pid,i); #endif mac_xface->terminate_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, + frame, phy_vars_eNB->ulsch_eNB[i]->rnti, phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); @@ -2822,7 +2827,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0; #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,last_slot>>1,i); + LOG_I(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",phy_vars_eNB->Mod_id,frame,last_slot>>1,i); #endif //DEBUG_PHY_PROC for (j=0;jdlsch_eNB[i][0]->Mdlharq;j++) { @@ -2836,7 +2841,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #ifdef DEBUG_PHY_PROC #ifdef DEBUG_ULSCH - LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",phy_vars_eNB->frame,last_slot>>1, + LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,last_slot>>1, harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); for (j=0;julsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++) LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]); @@ -2848,7 +2853,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #ifdef OPENAIR2 // if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->calibration_flag == 0) { mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, + frame, phy_vars_eNB->ulsch_eNB[i]->rnti, phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); @@ -2871,7 +2876,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d] frame %d, slot %d: user %d in sector %d: timing advance = %d\n", phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, last_slot, + frame, last_slot, i, sect_id, phy_vars_eNB->eNB_UE_stats[i].timing_advance_update); #endif @@ -2883,7 +2888,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d, Processing HARQ feedback for UE %d (after PUSCH)\n",phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[i][0]->rnti, - phy_vars_eNB->frame,last_slot>>1, + frame,last_slot>>1, i); #endif process_HARQ_feedback(i, @@ -2896,7 +2901,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 //#ifdef DEBUG_PHY_PROC LOG_I(PHY,"[eNB %d] Frame %d subframe %d, sect %d: received ULSCH harq_pid %d for UE %d, ret = %d, CQI CRC Status %d, ACK %d,%d, ulsch_errors %d/%d\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame,last_slot>>1, + phy_vars_eNB->Mod_id,frame,last_slot>>1, phy_vars_eNB->eNB_UE_stats[i].sector, harq_pid, i, @@ -2909,7 +2914,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 //#endif - if (phy_vars_eNB->frame % 100 == 0) { + if (frame % 100 == 0) { if ((phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][round] - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_pid][round]) != 0) phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[harq_pid][round] = @@ -2948,7 +2953,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n", phy_vars_eNB->Mod_id,phy_vars_eNB->dlsch_eNB[i][0]->rnti, - phy_vars_eNB->frame,last_slot>>1, + frame,last_slot>>1, n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR); if ((n1_pucch0==-1) && (n1_pucch1==-1) && (do_SR==0)) { // no TX PDSCH that have to be checked and no SR for this UE_id @@ -2978,13 +2983,13 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 &SR_payload, last_slot>>1); LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->ulsch_eNB[i]->rnti,phy_vars_eNB->frame,last_slot>>1,SR_payload,phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex); + phy_vars_eNB->ulsch_eNB[i]->rnti,frame,last_slot>>1,SR_payload,phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex); } #endif if (SR_payload == 1) { LOG_I(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->ulsch_eNB[i]->rnti,phy_vars_eNB->frame,last_slot>>1); + phy_vars_eNB->ulsch_eNB[i]->rnti,frame,last_slot>>1); phy_vars_eNB->eNB_UE_stats[i].sr_received++; if (phy_vars_eNB->first_sr[i] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4 phy_vars_eNB->first_sr[i] = 0; @@ -2992,11 +2997,11 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 phy_vars_eNB->dlsch_eNB[i][0]->harq_processes[0]->status=SCH_IDLE; LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n", phy_vars_eNB->Mod_id, - phy_vars_eNB->ulsch_eNB[i]->rnti,phy_vars_eNB->frame,last_slot>>1); + phy_vars_eNB->ulsch_eNB[i]->rnti,frame,last_slot>>1); } #ifdef OPENAIR2 mac_xface->SR_indication(phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, + frame, phy_vars_eNB->dlsch_eNB[i][0]->rnti,last_slot>>1); #endif } @@ -3029,7 +3034,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n", phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[i][0]->rnti, - phy_vars_eNB->frame,last_slot>>1, + frame,last_slot>>1, pucch_payload0[0],metric0); #endif @@ -3062,7 +3067,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #ifdef DEBUG_PHY_PROC LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[i][0]->rnti, - phy_vars_eNB->frame,last_slot>>1, + frame,last_slot>>1, n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); #endif if (abstraction_flag == 0) @@ -3089,7 +3094,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #ifdef DEBUG_PHY_PROC LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[i][0]->rnti, - phy_vars_eNB->frame,last_slot>>1, + frame,last_slot>>1, n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); #endif metric0=0; @@ -3163,7 +3168,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #ifdef DEBUG_PHY_PROC LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[i][0]->rnti, - phy_vars_eNB->frame,last_slot>>1, + frame,last_slot>>1, metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]); #endif process_HARQ_feedback(i,last_slot>>1,phy_vars_eNB, @@ -3177,7 +3182,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #endif //PUCCH - if ((phy_vars_eNB->frame % 10 == 0) && (last_slot==9)) { + if ((frame % 10 == 0) && (last_slot==9)) { phy_vars_eNB->eNB_UE_stats[i].dlsch_bitrate = (phy_vars_eNB->eNB_UE_stats[i].total_TBS - phy_vars_eNB->eNB_UE_stats[i].total_TBS_last)*10; @@ -3202,7 +3207,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Checking PUSCH/ULSCH CBA Reception for UE %d with cba rnti %x mode %s\n", phy_vars_eNB->Mod_id,harq_pid, - (((last_slot>>1)==9) ? -1 : 0)+phy_vars_eNB->frame,last_slot>>1, + frame,last_slot>>1, i, (u16)phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups],mode_string[phy_vars_eNB->eNB_UE_stats[i].mode]); #endif if (abstraction_flag==0) { @@ -3260,7 +3265,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 (phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->num_active_cba_groups> 0)) { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag for Ue %d cba groups %d members\n", - phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->frame,last_slot>>1,i,harq_pid, + phy_vars_eNB->Mod_id,harq_pid,frame,last_slot>>1,i,harq_pid, i+num_active_cba_groups, i%phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups); #endif phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1; @@ -3277,7 +3282,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 else { LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n", phy_vars_eNB->Mod_id,harq_pid, - phy_vars_eNB->frame,last_slot>>1); + frame,last_slot>>1); phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1; @@ -3286,7 +3291,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #ifdef DEBUG_PHY_PROC #ifdef DEBUG_ULSCH LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:", - phy_vars_eNB->frame,last_slot>>1, + frame,last_slot>>1, harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); for (j=0;julsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++) LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]); @@ -3295,23 +3300,23 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #endif if (access_mode > UNKNOWN_ACCESS){ LOG_I(PHY,"[eNB %d] Frame %d, Subframe %d : received ULSCH SDU from CBA transmission, UE (%d,%x), CBA (group %d, rnti %x)\n", - phy_vars_eNB->Mod_id, phy_vars_eNB->frame,last_slot>>1, + phy_vars_eNB->Mod_id, frame,last_slot>>1, i, phy_vars_eNB->ulsch_eNB[i]->rnti, i % phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups, phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups]); // detect if there is a CBA collision if (phy_vars_eNB->cba_last_reception[i%num_active_cba_groups] == 0 ) { mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, + frame, phy_vars_eNB->ulsch_eNB[i]->rnti, phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); phy_vars_eNB->cba_last_reception[i%num_active_cba_groups]=1;//(last_slot>>1); } else { LOG_N(PHY,"[eNB %d] Frame %d subframe %d : CBA collision detected for UE%d for group %d, set the SR for this UE \n ", - phy_vars_eNB->Mod_id,phy_vars_eNB->frame,last_slot>>1, + phy_vars_eNB->Mod_id,frame,last_slot>>1, i,i%num_active_cba_groups ); mac_xface->SR_indication(phy_vars_eNB->Mod_id, - phy_vars_eNB->frame, + frame, phy_vars_eNB->dlsch_eNB[i][0]->rnti,last_slot>>1); } diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index d2df8316f4..a10cf01090 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -915,9 +915,7 @@ int main(int argc, char **argv) { } // input_fd == NULL - tx_lev_dB = (unsigned int) dB_fixed(tx_lev); - if (n_frames==1) - printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB); + tx_lev_dB = (unsigned int) dB_fixed_times10(tx_lev); if (n_frames==1) { write_output("txsig0UL.m","txs0", &txdata[0][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],2*frame_parms->samples_per_tti,1,1); @@ -931,6 +929,8 @@ int main(int argc, char **argv) { // compute tx_gain to achieve target SNR (per resource element!) tx_gain = sqrt(pow(10.0,.1*(N0+SNR))*(nb_rb*12/(double)PHY_vars_UE->lte_frame_parms.ofdm_symbol_size)/(double)tx_lev); + if (n_frames==1) + printf("tx_lev = %d (%d.%d dB,%f), gain %f\n",tx_lev,tx_lev_dB/10,tx_lev_dB,10*log10((double)tx_lev),10*log10(tx_gain)); // fill measurement symbol (19) with noise