LCOV - code coverage report
Current view: top level - lib_com - fft.c (source / functions) Hit Total Coverage
Test: Coverage on main -- merged total coverage @ 9b04ec3cb36f5e8dc438cf854fa3e349998fa1e9 Lines: 4304 4373 98.4 %
Date: 2025-10-31 05:45:46 Functions: 73 73 100.0 %

          Line data    Source code
       1             : /******************************************************************************************************
       2             : 
       3             :    (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
       4             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
       5             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
       6             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
       7             :    contributors to this repository. All Rights Reserved.
       8             : 
       9             :    This software is protected by copyright law and by international treaties.
      10             :    The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
      11             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
      12             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
      13             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
      14             :    contributors to this repository retain full ownership rights in their respective contributions in
      15             :    the software. This notice grants no license of any kind, including but not limited to patent
      16             :    license, nor is any license granted by implication, estoppel or otherwise.
      17             : 
      18             :    Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
      19             :    contributions.
      20             : 
      21             :    This software is provided "AS IS", without any express or implied warranties. The software is in the
      22             :    development stage. It is intended exclusively for experts who have experience with such software and
      23             :    solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
      24             :    and fitness for a particular purpose are hereby disclaimed and excluded.
      25             : 
      26             :    Any dispute, controversy or claim arising under or in relation to providing this software shall be
      27             :    submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
      28             :    accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
      29             :    the United Nations Convention on Contracts on the International Sales of Goods.
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : /*====================================================================================
      34             :     EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
      35             :   ====================================================================================*/
      36             : 
      37             : #include <assert.h>
      38             : #include <stdint.h>
      39             : #include "options.h"
      40             : #ifdef DEBUGGING
      41             : #include "debug.h"
      42             : #endif
      43             : #include <math.h>
      44             : #include "cnst.h"
      45             : #include "prot.h"
      46             : #include "rom_com.h"
      47             : #include "wmc_auto.h"
      48             : 
      49             : #ifdef _MSC_VER
      50             : #pragma warning( disable : 4310 )
      51             : #endif
      52             : 
      53             : /*-----------------------------------------------------------------*
      54             :  * Local constants
      55             :  *-----------------------------------------------------------------*/
      56             : 
      57             : #define FFT_15PONIT_WNK1 0.55901699f /* EDCT & EMDCT constants */
      58             : #define FFT_15PONIT_WNK2 0.95105652f /* EDCT & EMDCT constants */
      59             : #define FFT_15PONIT_WNK3 0.58778525f /* EDCT & EMDCT constants */
      60             : #define FFT_15PONIT_WNK4 0.86602540f /* EDCT & EMDCT constants */
      61             : #define FFT_15PONIT_WNK5 0.25000000f /* EDCT & EMDCT constants */
      62             : 
      63             : /* FFT constants */
      64             : #define FFT_C31  -0.8660254037f
      65             : #define FFT_C51  0.9510565195f
      66             : #define FFT_C52  -1.5388417989f
      67             : #define FFT_C53  -0.3632712597f
      68             : #define FFT_C54  0.5590169895f
      69             : #define FFT_C55  -1.2500000000f
      70             : #define FFT_C61  0.8660254036f
      71             : #define FFT_C81  0.7071067811f
      72             : #define FFT_C82  -0.7071067811f
      73             : #define FFT_C161 0.7071067811f
      74             : #define FFT_C162 -0.7071067811f
      75             : #define FFT_C163 0.9238795325f
      76             : #define FFT_C164 -0.9238795325f
      77             : #define FFT_C165 0.3826834323f
      78             : #define FFT_C166 -0.3826834323f
      79             : 
      80             : 
      81             : /*-----------------------------------------------------------------*
      82             :  * Local function prototypes
      83             :  *-----------------------------------------------------------------*/
      84             : 
      85             : static void cdftForw( int16_t n, float *a, const int16_t *ip, const float *w );
      86             : static void bitrv2_SR( int16_t n, const int16_t *ip, float *a );
      87             : static void cftfsub( int16_t n, float *a, const float *w );
      88             : static void cft1st( int16_t n, float *a, const float *w );
      89             : static void cftmdl( int16_t n, int16_t l, float *a, const float *w );
      90             : static void fft16( float *x, float *y, const int16_t *Idx );
      91             : static void fft5_shift1( int16_t n1, float *zRe, float *zIm, const int16_t *Idx );
      92             : static void fft8( float *x, float *y, const int16_t *Idx );
      93             : static void fft15_shift2( int16_t n1, float *zRe, float *zIm, const int16_t *Idx );
      94             : static void fft15_shift8( int16_t n1, float *zRe, float *zIm, const int16_t *Idx );
      95             : static void fft5_shift4( int16_t n1, float *zRe, float *zIm, const int16_t *Idx );
      96             : static void fft5_32( float *zRe, float *zIm, const int16_t *Idx );
      97             : static void fft64( float *x, float *y, const int16_t *Idx );
      98             : static void fft32_15( float *x, float *y, const int16_t *Idx );
      99             : static void fft32_5( float *x, float *y, const int16_t *Idx );
     100             : static void fft8_5( float *x, float *y, const int16_t *Idx );
     101             : static void fft5_8( int16_t n1, float *zRe, float *zIm, const int16_t *Idx );
     102             : static void fft4_5( float *x, float *y, const int16_t *Idx );
     103             : static void fft5_4( int16_t n1, float *zRe, float *zIm, const int16_t *Idx );
     104             : 
     105    65992032 : static float fmac( float a, float b, float c )
     106             : {
     107    65992032 :     return ( ( ( a ) * ( b ) ) + ( c ) );
     108             : }
     109             : 
     110   241970784 : static float fnms( float a, float b, float c )
     111             : {
     112   241970784 :     return ( ( c ) - ( ( a ) * ( b ) ) );
     113             : }
     114             : 
     115             : /*-----------------------------------------------------------------*
     116             :  * fft15_shift2()
     117             :  * 15-point FFT with 2-point circular shift
     118             :  *-----------------------------------------------------------------*/
     119             : 
     120      108592 : static void fft15_shift2(
     121             :     int16_t n1,        /* i  : length of data                           */
     122             :     float *zRe,        /* i/o: real part of input and output data       */
     123             :     float *zIm,        /* i/o: imaginary part of input and output data  */
     124             :     const int16_t *Idx /* i  : pointer of the address table             */
     125             : )
     126             : {
     127             :     int16_t in0, in8, in16, in24, in32, in1, in9, in17, in25, in33, in2, in10, in18, in26, in34;
     128             :     float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8, fi9, fi10, fi11, fi12, fi13, fi14, fi15;
     129             :     float fi16, fi17, fi18, fi19, fi20, fi21, fi22, fi23, fi24, fi25, fi26, fi27, fi28, fi29, fi30;
     130             :     float f2i1, f2i2, f2i3, f2i4, f2i5, f2i6, f2i7, f2i8, f2i9, f2i10, f2i11, f2i12;
     131             :     float f2i13, f2i14, f2i15, f2i16, f2i17, f2i18, f2i19, f2i20, f2i21, f2i22, f2i23, f2i24;
     132             :     float f3i1, f3i2, f3i3, f3i4, f3i5, f3i6, f3i7, f3i8, f3i9, f3i10, f3i11, f3i12, f3i13, f3i14, f3i15;
     133             :     float f4i1, f4i2, f4i3, f4i4, f4i5, f4i6, f4i7, f4i8, f4i9;
     134             :     float f4i10, f4i11, f4i12, f4i13, f4i14, f4i15, f4i16, f4i17, f4i18, f4i19, f4i20, fo1, fo2, fo3, fo4;
     135             :     float fo5, fo6, fo7, fo8, fo9, fo10, fo11, fo12, fo13, fo14, fo15, fo16, fo17, fo18;
     136             :     float f2o1, f2o2, f2o3, f2o4, f2o5, f2o6, f2o7, f2o8, f2o9, f2o10, f2o11, f2o12, f2o13;
     137             :     float f2o14, f2o15, f3o1, f3o2, f3o3, f3o4, f3o5, f3o6, f3o7, f3o8, f3o9, f3o10, f3o11;
     138             :     float f3o12, f3o13, f3o14, f3o15, f4o1, f4o2, f4o3, f4o4, f4o5, f4o6;
     139             :     float f4o7, f4o8, f4o9, f4o10, f4o11, f4o12, f4o13, f4o14, f4o15, f4o16, f4o17, f4o18, f4o19;
     140             : 
     141      108592 :     in0 = Idx[0];
     142      108592 :     in8 = Idx[n1];
     143      108592 :     in16 = Idx[n1 * 2];
     144      108592 :     in24 = Idx[n1 * 3];
     145      108592 :     in32 = Idx[n1 * 4];
     146      108592 :     in1 = Idx[n1 * 5];
     147      108592 :     in9 = Idx[n1 * 6];
     148      108592 :     in17 = Idx[n1 * 7];
     149      108592 :     in25 = Idx[n1 * 8];
     150      108592 :     in33 = Idx[n1 * 9];
     151      108592 :     in2 = Idx[n1 * 10];
     152      108592 :     in10 = Idx[n1 * 11];
     153      108592 :     in18 = Idx[n1 * 12];
     154      108592 :     in26 = Idx[n1 * 13];
     155      108592 :     in34 = Idx[n1 * 14];
     156             : 
     157      108592 :     f2i13 = zRe[in0];
     158      108592 :     f2i14 = zIm[in0];
     159      108592 :     f2i21 = zRe[in1];
     160      108592 :     f2i22 = zRe[in2];
     161      108592 :     f2i23 = zIm[in1];
     162      108592 :     f2i24 = zIm[in2];
     163             : 
     164      108592 :     f2i15 = f2i21 + f2i22;
     165      108592 :     f2i16 = FFT_15PONIT_WNK4 * ( f2i22 - f2i21 );
     166      108592 :     f2i17 = FFT_15PONIT_WNK4 * ( f2i23 - f2i24 );
     167      108592 :     f2i18 = f2i23 + f2i24;
     168      108592 :     fi1 = f2i13 + f2i15;
     169      108592 :     fi2 = f2i14 + f2i18;
     170             : 
     171      108592 :     f2i19 = fnms( 0.5f, f2i15, f2i13 );
     172      108592 :     f2i20 = fnms( 0.5f, f2i18, f2i14 );
     173      108592 :     fi3 = f2i19 - f2i17;
     174      108592 :     fi4 = f2i19 + f2i17;
     175      108592 :     fi5 = f2i16 + f2i20;
     176      108592 :     fi6 = f2i20 - f2i16;
     177             : 
     178      108592 :     f3i1 = zRe[in9];
     179      108592 :     f4i2 = zRe[in10];
     180      108592 :     f4i3 = zRe[in8];
     181      108592 :     f3i2 = f4i2 + f4i3;
     182      108592 :     f3i3 = fnms( 0.5f, f3i2, f3i1 );
     183      108592 :     f3i4 = FFT_15PONIT_WNK4 * ( f4i3 - f4i2 );
     184             : 
     185      108592 :     f3i5 = zIm[in9];
     186      108592 :     f4i4 = zIm[in10];
     187      108592 :     f4i5 = zIm[in8];
     188      108592 :     f3i6 = f4i4 + f4i5;
     189      108592 :     f3i7 = FFT_15PONIT_WNK4 * ( f4i4 - f4i5 );
     190      108592 :     f3i8 = fnms( 0.5f, f3i6, f3i5 );
     191             : 
     192      108592 :     f3i9 = zRe[in33];
     193      108592 :     f4i6 = zRe[in34];
     194      108592 :     f4i7 = zRe[in32];
     195      108592 :     f3i10 = f4i6 + f4i7;
     196      108592 :     f3i11 = fnms( 0.5f, f3i10, f3i9 );
     197      108592 :     f3i12 = FFT_15PONIT_WNK4 * ( f4i7 - f4i6 );
     198             : 
     199      108592 :     f3i13 = zIm[in33];
     200      108592 :     f4i8 = zIm[in34];
     201      108592 :     f4i9 = zIm[in32];
     202      108592 :     f3i14 = f4i8 + f4i9;
     203      108592 :     f3i15 = FFT_15PONIT_WNK4 * ( f4i8 - f4i9 );
     204      108592 :     f4i1 = fnms( 0.5f, f3i14, f3i13 );
     205             : 
     206      108592 :     fi7 = f3i1 + f3i2;
     207      108592 :     fi8 = f3i9 + f3i10;
     208      108592 :     fi9 = fi7 + fi8;
     209      108592 :     fi10 = f3i3 - f3i7;
     210      108592 :     fi11 = f3i11 - f3i15;
     211      108592 :     fi12 = fi10 + fi11;
     212      108592 :     fi13 = f3i5 + f3i6;
     213      108592 :     fi14 = f3i13 + f3i14;
     214      108592 :     fi15 = fi13 + fi14;
     215      108592 :     fi16 = f3i8 - f3i4;
     216      108592 :     fi17 = f4i1 - f3i12;
     217      108592 :     fi18 = fi16 + fi17;
     218      108592 :     fi19 = f3i4 + f3i8;
     219      108592 :     fi20 = f3i12 + f4i1;
     220      108592 :     fi21 = fi19 + fi20;
     221      108592 :     fi22 = f3i3 + f3i7;
     222      108592 :     fi23 = f3i11 + f3i15;
     223      108592 :     fi24 = fi22 + fi23;
     224             : 
     225      108592 :     f4i10 = zRe[in24];
     226      108592 :     fo6 = zRe[in25];
     227      108592 :     fo7 = zRe[in26];
     228      108592 :     f4i11 = fo6 + fo7;
     229      108592 :     f4i12 = fnms( 0.5f, f4i11, f4i10 );
     230      108592 :     f4i13 = FFT_15PONIT_WNK4 * ( fo7 - fo6 );
     231             : 
     232      108592 :     f4i14 = zIm[in24];
     233      108592 :     fo8 = zIm[in25];
     234      108592 :     fo9 = zIm[in26];
     235      108592 :     f4i15 = fo8 + fo9;
     236      108592 :     f4i16 = FFT_15PONIT_WNK4 * ( fo8 - fo9 );
     237      108592 :     f4i17 = fnms( 0.5f, f4i15, f4i14 );
     238             : 
     239      108592 :     f4i18 = zRe[in18];
     240      108592 :     f2o10 = zRe[in16];
     241      108592 :     f2o11 = zRe[in17];
     242      108592 :     f4i19 = f2o10 + f2o11;
     243      108592 :     f4i20 = fnms( 0.5f, f4i19, f4i18 );
     244      108592 :     fo1 = FFT_15PONIT_WNK4 * ( f2o11 - f2o10 );
     245             : 
     246      108592 :     fo2 = zIm[in18];
     247      108592 :     f2o12 = zIm[in16];
     248      108592 :     f2o13 = zIm[in17];
     249      108592 :     fo3 = f2o12 + f2o13;
     250      108592 :     fo4 = FFT_15PONIT_WNK4 * ( f2o12 - f2o13 );
     251      108592 :     fo5 = fnms( 0.5f, fo3, fo2 );
     252             : 
     253      108592 :     fi25 = f4i10 + f4i11;
     254      108592 :     fi26 = f4i18 + f4i19;
     255      108592 :     fi27 = fi25 + fi26;
     256      108592 :     fi28 = f4i12 - f4i16;
     257      108592 :     fi29 = f4i20 - fo4;
     258      108592 :     fi30 = fi28 + fi29;
     259      108592 :     f2i1 = f4i14 + f4i15;
     260      108592 :     f2i2 = fo2 + fo3;
     261      108592 :     f2i3 = f2i1 + f2i2;
     262      108592 :     f2i4 = f4i17 - f4i13;
     263      108592 :     f2i5 = fo5 - fo1;
     264      108592 :     f2i6 = f2i4 + f2i5;
     265      108592 :     f2i7 = f4i13 + f4i17;
     266      108592 :     f2i8 = fo1 + fo5;
     267      108592 :     f2i9 = f2i7 + f2i8;
     268      108592 :     f2i10 = f4i12 + f4i16;
     269      108592 :     f2i11 = f4i20 + fo4;
     270      108592 :     f2i12 = f2i10 + f2i11;
     271             : 
     272      108592 :     fo10 = FFT_15PONIT_WNK1 * ( fi27 - fi9 );
     273      108592 :     fo11 = fi27 + fi9;
     274      108592 :     fo12 = fnms( FFT_15PONIT_WNK5, fo11, fi1 );
     275      108592 :     fo15 = fi13 - fi14;
     276      108592 :     fo16 = f2i1 - f2i2;
     277      108592 :     fo13 = fnms( FFT_15PONIT_WNK3, fo16, FFT_15PONIT_WNK2 * fo15 );
     278      108592 :     fo14 = fmac( FFT_15PONIT_WNK2, fo16, FFT_15PONIT_WNK3 * fo15 );
     279             : 
     280      108592 :     zRe[in0] = fi1 + fo11;
     281      108592 :     fo17 = fo10 + fo12;
     282      108592 :     zRe[in18] = fo17 - fo14;
     283      108592 :     zRe[in24] = fo17 + fo14;
     284      108592 :     fo18 = fo12 - fo10;
     285      108592 :     zRe[in9] = fo18 - fo13;
     286      108592 :     zRe[in33] = fo18 + fo13;
     287             : 
     288      108592 :     f2o1 = FFT_15PONIT_WNK1 * ( f2i3 - fi15 );
     289      108592 :     f2o2 = f2i3 + fi15;
     290      108592 :     f2o3 = fnms( FFT_15PONIT_WNK5, f2o2, fi2 );
     291      108592 :     f2o6 = fi7 - fi8;
     292      108592 :     f2o7 = fi25 - fi26;
     293      108592 :     f2o4 = fnms( FFT_15PONIT_WNK3, f2o7, FFT_15PONIT_WNK2 * f2o6 );
     294      108592 :     f2o5 = fmac( FFT_15PONIT_WNK2, f2o7, FFT_15PONIT_WNK3 * f2o6 );
     295      108592 :     zIm[in0] = fi2 + f2o2;
     296      108592 :     f2o8 = f2o1 + f2o3;
     297      108592 :     zIm[in24] = f2o8 - f2o5;
     298      108592 :     zIm[in18] = f2o5 + f2o8;
     299      108592 :     f2o9 = f2o3 - f2o1;
     300      108592 :     zIm[in33] = f2o9 - f2o4;
     301      108592 :     zIm[in9] = f2o4 + f2o9;
     302             : 
     303      108592 :     f2o14 = FFT_15PONIT_WNK1 * ( fi30 - fi12 );
     304      108592 :     f2o15 = fi30 + fi12;
     305      108592 :     f3o1 = fnms( FFT_15PONIT_WNK5, f2o15, fi3 );
     306      108592 :     f3o4 = fi16 - fi17;
     307      108592 :     f3o5 = f2i4 - f2i5;
     308      108592 :     f3o2 = fnms( FFT_15PONIT_WNK3, f3o5, FFT_15PONIT_WNK2 * f3o4 );
     309      108592 :     f3o3 = fmac( FFT_15PONIT_WNK2, f3o5, FFT_15PONIT_WNK3 * f3o4 );
     310      108592 :     zRe[in2] = fi3 + f2o15;
     311      108592 :     f3o6 = f2o14 + f3o1;
     312      108592 :     zRe[in17] = f3o6 - f3o3;
     313      108592 :     zRe[in26] = f3o6 + f3o3;
     314      108592 :     f3o7 = f3o1 - f2o14;
     315      108592 :     zRe[in8] = f3o7 - f3o2;
     316      108592 :     zRe[in32] = f3o7 + f3o2;
     317             : 
     318      108592 :     f3o8 = FFT_15PONIT_WNK1 * ( f2i6 - fi18 );
     319      108592 :     f3o9 = f2i6 + fi18;
     320      108592 :     f3o10 = fnms( FFT_15PONIT_WNK5, f3o9, fi6 );
     321      108592 :     f3o13 = fi10 - fi11;
     322      108592 :     f3o14 = fi28 - fi29;
     323      108592 :     f3o11 = fnms( FFT_15PONIT_WNK3, f3o14, FFT_15PONIT_WNK2 * f3o13 );
     324      108592 :     f3o12 = fmac( FFT_15PONIT_WNK2, f3o14, FFT_15PONIT_WNK3 * f3o13 );
     325      108592 :     zIm[in2] = fi6 + f3o9;
     326      108592 :     f3o15 = f3o8 + f3o10;
     327      108592 :     zIm[in26] = f3o15 - f3o12;
     328      108592 :     zIm[in17] = f3o12 + f3o15;
     329      108592 :     f4o1 = f3o10 - f3o8;
     330      108592 :     zIm[in8] = f3o11 + f4o1;
     331      108592 :     zIm[in32] = f4o1 - f3o11;
     332             : 
     333      108592 :     f4o2 = FFT_15PONIT_WNK1 * ( f2i9 - fi21 );
     334      108592 :     f4o3 = f2i9 + fi21;
     335      108592 :     f4o4 = fnms( FFT_15PONIT_WNK5, f4o3, fi5 );
     336      108592 :     f4o7 = f2i10 - f2i11;
     337      108592 :     f4o8 = fi22 - fi23;
     338      108592 :     f4o5 = fmac( FFT_15PONIT_WNK2, f4o7, FFT_15PONIT_WNK3 * f4o8 );
     339      108592 :     f4o6 = fnms( FFT_15PONIT_WNK3, f4o7, FFT_15PONIT_WNK2 * f4o8 );
     340      108592 :     zIm[in1] = fi5 + f4o3;
     341      108592 :     f4o9 = f4o4 - f4o2;
     342      108592 :     f4o10 = f4o2 + f4o4;
     343             : 
     344      108592 :     zIm[in10] = f4o6 + f4o9;
     345      108592 :     zIm[in34] = f4o9 - f4o6;
     346      108592 :     zIm[in25] = f4o10 - f4o5;
     347      108592 :     zIm[in16] = f4o5 + f4o10;
     348             : 
     349      108592 :     f4o11 = FFT_15PONIT_WNK1 * ( f2i12 - fi24 );
     350      108592 :     f4o12 = f2i12 + fi24;
     351      108592 :     f4o13 = fnms( FFT_15PONIT_WNK5, f4o12, fi4 );
     352      108592 :     f4o16 = f2i7 - f2i8;
     353      108592 :     f4o17 = fi19 - fi20;
     354      108592 :     f4o14 = fmac( FFT_15PONIT_WNK2, f4o16, FFT_15PONIT_WNK3 * f4o17 );
     355      108592 :     f4o15 = fnms( FFT_15PONIT_WNK3, f4o16, FFT_15PONIT_WNK2 * f4o17 );
     356      108592 :     zRe[in1] = fi4 + f4o12;
     357      108592 :     f4o18 = f4o13 - f4o11;
     358      108592 :     f4o19 = f4o11 + f4o13;
     359             : 
     360      108592 :     zRe[in10] = f4o18 - f4o15;
     361      108592 :     zRe[in34] = f4o18 + f4o15;
     362      108592 :     zRe[in16] = f4o19 - f4o14;
     363      108592 :     zRe[in25] = f4o19 + f4o14;
     364             : 
     365      108592 :     return;
     366             : }
     367             : 
     368             : /*-----------------------------------------------------------------*
     369             :  * fft15_shift8()
     370             :  * 15-point FFT with 8-point circular shift
     371             :  *-----------------------------------------------------------------*/
     372             : 
     373    10890080 : static void fft15_shift8(
     374             :     int16_t n1,        /* i  : length of data                           */
     375             :     float *zRe,        /* i/o: real part of input and output data       */
     376             :     float *zIm,        /* i/o: imaginary part of input and output data  */
     377             :     const int16_t *Idx /* i  : pointer of the address table             */
     378             : )
     379             : {
     380             :     int16_t in0, in8, in16, in24, in32, in1, in9, in17, in25, in33, in2, in10, in18, in26, in34;
     381             :     float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8, fi9, fi10, fi11, fi12, fi13, fi14, fi15;
     382             :     float fi16, fi17, fi18, fi19, fi20, fi21, fi22, fi23, fi24, fi25, fi26, fi27, fi28, fi29, fi30;
     383             :     float f2i1, f2i2, f2i3, f2i4, f2i5, f2i6, f2i7, f2i8, f2i9, f2i10, f2i11, f2i12;
     384             :     float f2i13, f2i14, f2i15, f3i1, f3i2, f3i3, f3i4, f3i5, f3i6, f3i7, f3i8, f3i9;
     385             :     float f3i10, f3i11, f3i12, f3i13, f3i14, f3i15, f4i1, f4i2, f4i3, f4i4, f4i5, f4i6, f4i7, f4i8, f4i9;
     386             :     float f4i10, f4i11, f4i12, f4i13, f4i14, f4i15, fo1, fo2, fo3, fo4, fo5, fo6;
     387             :     float fo7, fo8, fo9, fo10, fo11, fo12, fo13, fo14, fo15, f2o1, f2o2, f2o3, f2o4;
     388             :     float f2o5, f2o6, f2o7, f2o8, f2o9, f2o10, f2o11, f2o12, f2o13, f2o14, f2o15;
     389             :     float f3o1, f3o2, f3o3, f3o4, f3o5, f3o6, f3o7, f3o8, f3o9, f3o10, f3o11, f3o12;
     390             :     float f3o13, f3o14, f3o15, f4o1, f4o2, f4o3, f4o4, f4o5, f4o6, f4o7, f4o8, f4o9;
     391             :     float f4o10, f4o11, f4o12, f4o13, f4o14, f4o15, f5o1, f5o2, f5o3, f5o4, f5o5, f5o6, f5o7;
     392             :     float f5o8, f5o9, f5o10, f5o11, f5o12, f5o13, f5o14, f5o15, f5o16, f5o17, f5o18, f5o19, f5o21, f5o22;
     393             : 
     394    10890080 :     in0 = Idx[0];
     395    10890080 :     in8 = Idx[n1];
     396    10890080 :     in16 = Idx[n1 * 2];
     397    10890080 :     in24 = Idx[n1 * 3];
     398    10890080 :     in32 = Idx[n1 * 4];
     399    10890080 :     in1 = Idx[n1 * 5];
     400    10890080 :     in9 = Idx[n1 * 6];
     401    10890080 :     in17 = Idx[n1 * 7];
     402    10890080 :     in25 = Idx[n1 * 8];
     403    10890080 :     in33 = Idx[n1 * 9];
     404    10890080 :     in2 = Idx[n1 * 10];
     405    10890080 :     in10 = Idx[n1 * 11];
     406    10890080 :     in18 = Idx[n1 * 12];
     407    10890080 :     in26 = Idx[n1 * 13];
     408    10890080 :     in34 = Idx[n1 * 14];
     409             : 
     410    10890080 :     f2i13 = zRe[in0];
     411    10890080 :     f2i14 = zIm[in0];
     412    10890080 :     f3i6 = zRe[in1];
     413    10890080 :     f3i7 = zRe[in2];
     414    10890080 :     f3i8 = zIm[in1];
     415    10890080 :     f3i9 = zIm[in2];
     416             : 
     417    10890080 :     f2i15 = f3i6 + f3i7;
     418    10890080 :     f3i1 = FFT_15PONIT_WNK4 * ( f3i7 - f3i6 );
     419    10890080 :     f3i2 = FFT_15PONIT_WNK4 * ( f3i8 - f3i9 );
     420    10890080 :     f3i3 = f3i8 + f3i9;
     421             : 
     422    10890080 :     fi1 = f2i13 + f2i15;
     423    10890080 :     fi2 = f2i14 + f3i3;
     424    10890080 :     f3i4 = fnms( 0.5f, f2i15, f2i13 );
     425    10890080 :     fi3 = f3i4 - f3i2;
     426    10890080 :     fi4 = f3i4 + f3i2;
     427    10890080 :     f3i5 = fnms( 0.5f, f3i3, f2i14 );
     428    10890080 :     fi5 = f3i1 + f3i5;
     429    10890080 :     fi6 = f3i5 - f3i1;
     430             : 
     431    10890080 :     f3i10 = zRe[in9];
     432    10890080 :     f4i11 = zRe[in10];
     433    10890080 :     f4i12 = zRe[in8];
     434    10890080 :     f3i14 = zIm[in9];
     435    10890080 :     f4i13 = zIm[in10];
     436    10890080 :     f4i14 = zIm[in8];
     437    10890080 :     f4i3 = zRe[in33];
     438    10890080 :     f4i15 = zRe[in34];
     439    10890080 :     fo1 = zRe[in32];
     440    10890080 :     f4i7 = zIm[in33];
     441    10890080 :     fo2 = zIm[in34];
     442    10890080 :     fo3 = zIm[in32];
     443             : 
     444             : 
     445    10890080 :     f3i11 = f4i11 + f4i12;
     446    10890080 :     f3i12 = fnms( 0.5f, f3i11, f3i10 );
     447    10890080 :     f3i13 = FFT_15PONIT_WNK4 * ( f4i12 - f4i11 );
     448    10890080 :     f3i15 = f4i13 + f4i14;
     449    10890080 :     f4i1 = FFT_15PONIT_WNK4 * ( f4i13 - f4i14 );
     450    10890080 :     f4i2 = fnms( 0.5f, f3i15, f3i14 );
     451    10890080 :     f4i4 = f4i15 + fo1;
     452    10890080 :     f4i5 = fnms( 0.5f, f4i4, f4i3 );
     453    10890080 :     f4i6 = FFT_15PONIT_WNK4 * ( fo1 - f4i15 );
     454    10890080 :     f4i8 = fo2 + fo3;
     455    10890080 :     f4i9 = FFT_15PONIT_WNK4 * ( fo2 - fo3 );
     456    10890080 :     f4i10 = fnms( 0.5f, f4i8, f4i7 );
     457             : 
     458    10890080 :     fi7 = f3i10 + f3i11;
     459    10890080 :     fi8 = f4i3 + f4i4;
     460    10890080 :     fi9 = fi7 + fi8;
     461    10890080 :     fi10 = f3i12 - f4i1;
     462    10890080 :     fi11 = f4i5 - f4i9;
     463    10890080 :     fi12 = fi10 + fi11;
     464    10890080 :     fi13 = f3i14 + f3i15;
     465    10890080 :     fi14 = f4i7 + f4i8;
     466    10890080 :     fi15 = fi13 + fi14;
     467    10890080 :     fi16 = f4i2 - f3i13;
     468    10890080 :     fi17 = f4i10 - f4i6;
     469    10890080 :     fi18 = fi16 + fi17;
     470    10890080 :     fi19 = f3i13 + f4i2;
     471    10890080 :     fi20 = f4i6 + f4i10;
     472    10890080 :     fi21 = fi19 + fi20;
     473    10890080 :     fi22 = f3i12 + f4i1;
     474    10890080 :     fi23 = f4i5 + f4i9;
     475    10890080 :     fi24 = fi22 + fi23;
     476             : 
     477    10890080 :     fo4 = zRe[in24];
     478    10890080 :     f2o5 = zRe[in25];
     479    10890080 :     f2o6 = zRe[in26];
     480    10890080 :     fo8 = zIm[in24];
     481    10890080 :     f2o7 = zIm[in25];
     482    10890080 :     f2o8 = zIm[in26];
     483    10890080 :     fo12 = zRe[in18];
     484    10890080 :     f2o9 = zRe[in16];
     485    10890080 :     f2o10 = zRe[in17];
     486    10890080 :     f2o1 = zIm[in18];
     487    10890080 :     f2o11 = zIm[in16];
     488    10890080 :     f2o12 = zIm[in17];
     489             : 
     490             : 
     491    10890080 :     fo5 = f2o5 + f2o6;
     492    10890080 :     fo6 = fnms( 0.5f, fo5, fo4 );
     493    10890080 :     fo7 = FFT_15PONIT_WNK4 * ( f2o6 - f2o5 );
     494    10890080 :     fo9 = f2o7 + f2o8;
     495    10890080 :     fo10 = FFT_15PONIT_WNK4 * ( f2o7 - f2o8 );
     496    10890080 :     fo11 = fnms( 0.5f, fo9, fo8 );
     497    10890080 :     fo13 = f2o9 + f2o10;
     498    10890080 :     fo14 = fnms( 0.5f, fo13, fo12 );
     499    10890080 :     fo15 = FFT_15PONIT_WNK4 * ( f2o10 - f2o9 );
     500    10890080 :     f2o2 = f2o11 + f2o12;
     501    10890080 :     f2o3 = FFT_15PONIT_WNK4 * ( f2o11 - f2o12 );
     502    10890080 :     f2o4 = fnms( 0.5f, f2o2, f2o1 );
     503             : 
     504    10890080 :     fi25 = fo4 + fo5;
     505    10890080 :     fi26 = fo12 + fo13;
     506    10890080 :     fi27 = fi25 + fi26;
     507    10890080 :     fi28 = fo6 - fo10;
     508    10890080 :     fi29 = fo14 - f2o3;
     509    10890080 :     fi30 = fi28 + fi29;
     510    10890080 :     f2i1 = fo8 + fo9;
     511    10890080 :     f2i2 = f2o1 + f2o2;
     512    10890080 :     f2i3 = f2i1 + f2i2;
     513    10890080 :     f2i4 = fo11 - fo7;
     514    10890080 :     f2i5 = f2o4 - fo15;
     515    10890080 :     f2i6 = f2i4 + f2i5;
     516    10890080 :     f2i7 = fo7 + fo11;
     517    10890080 :     f2i8 = fo15 + f2o4;
     518    10890080 :     f2i9 = f2i7 + f2i8;
     519    10890080 :     f2i10 = fo6 + fo10;
     520    10890080 :     f2i11 = fo14 + f2o3;
     521    10890080 :     f2i12 = f2i10 + f2i11;
     522             : 
     523    10890080 :     f2o13 = FFT_15PONIT_WNK1 * ( fi27 - fi9 );
     524    10890080 :     f2o14 = fi27 + fi9;
     525    10890080 :     f2o15 = fnms( FFT_15PONIT_WNK5, f2o14, fi1 );
     526    10890080 :     f3o3 = fi13 - fi14;
     527    10890080 :     f3o4 = f2i1 - f2i2;
     528    10890080 :     f3o1 = fnms( FFT_15PONIT_WNK3, f3o4, FFT_15PONIT_WNK2 * f3o3 );
     529    10890080 :     f3o2 = fmac( FFT_15PONIT_WNK2, f3o4, FFT_15PONIT_WNK3 * f3o3 );
     530    10890080 :     zRe[in0] = fi1 + f2o14;
     531    10890080 :     f3o5 = f2o13 + f2o15;
     532    10890080 :     zRe[in24] = f3o5 - f3o2;
     533    10890080 :     zRe[in18] = f3o5 + f3o2;
     534    10890080 :     f3o6 = f2o15 - f2o13;
     535    10890080 :     zRe[in33] = f3o6 - f3o1;
     536    10890080 :     zRe[in9] = f3o6 + f3o1;
     537             : 
     538    10890080 :     f3o7 = FFT_15PONIT_WNK1 * ( f2i3 - fi15 );
     539    10890080 :     f3o8 = f2i3 + fi15;
     540    10890080 :     f3o9 = fnms( FFT_15PONIT_WNK5, f3o8, fi2 );
     541    10890080 :     f3o12 = fi7 - fi8;
     542    10890080 :     f3o13 = fi25 - fi26;
     543    10890080 :     f3o10 = fnms( FFT_15PONIT_WNK3, f3o13, FFT_15PONIT_WNK2 * f3o12 );
     544    10890080 :     f3o11 = fmac( FFT_15PONIT_WNK2, f3o13, FFT_15PONIT_WNK3 * f3o12 );
     545    10890080 :     zIm[in0] = fi2 + f3o8;
     546    10890080 :     f3o14 = f3o7 + f3o9;
     547    10890080 :     zIm[in18] = f3o14 - f3o11;
     548    10890080 :     zIm[in24] = f3o11 + f3o14;
     549    10890080 :     f3o15 = f3o9 - f3o7;
     550    10890080 :     zIm[in9] = f3o15 - f3o10;
     551    10890080 :     zIm[in33] = f3o10 + f3o15;
     552             : 
     553    10890080 :     f4o1 = FFT_15PONIT_WNK1 * ( fi30 - fi12 );
     554    10890080 :     f4o2 = fi30 + fi12;
     555    10890080 :     f4o3 = fnms( FFT_15PONIT_WNK5, f4o2, fi3 );
     556    10890080 :     f4o6 = fi16 - fi17;
     557    10890080 :     f4o7 = f2i4 - f2i5;
     558    10890080 :     f4o4 = fnms( FFT_15PONIT_WNK3, f4o7, FFT_15PONIT_WNK2 * f4o6 );
     559    10890080 :     f4o5 = fmac( FFT_15PONIT_WNK2, f4o7, FFT_15PONIT_WNK3 * f4o6 );
     560    10890080 :     zRe[in2] = fi3 + f4o2;
     561    10890080 :     f4o8 = f4o1 + f4o3;
     562    10890080 :     zRe[in26] = f4o8 - f4o5;
     563    10890080 :     zRe[in17] = f4o8 + f4o5;
     564    10890080 :     f4o9 = f4o3 - f4o1;
     565    10890080 :     zRe[in32] = f4o9 - f4o4;
     566    10890080 :     zRe[in8] = f4o9 + f4o4;
     567             : 
     568    10890080 :     f4o10 = FFT_15PONIT_WNK1 * ( f2i6 - fi18 );
     569    10890080 :     f4o11 = f2i6 + fi18;
     570    10890080 :     f4o12 = fnms( FFT_15PONIT_WNK5, f4o11, fi6 );
     571    10890080 :     f4o15 = fi10 - fi11;
     572    10890080 :     f5o1 = fi28 - fi29;
     573    10890080 :     f4o13 = fnms( FFT_15PONIT_WNK3, f5o1, FFT_15PONIT_WNK2 * f4o15 );
     574    10890080 :     f4o14 = fmac( FFT_15PONIT_WNK2, f5o1, FFT_15PONIT_WNK3 * f4o15 );
     575    10890080 :     zIm[in2] = fi6 + f4o11;
     576    10890080 :     f5o2 = f4o10 + f4o12;
     577    10890080 :     zIm[in17] = f5o2 - f4o14;
     578    10890080 :     zIm[in26] = f4o14 + f5o2;
     579    10890080 :     f5o3 = f4o12 - f4o10;
     580    10890080 :     zIm[in32] = f4o13 + f5o3;
     581    10890080 :     zIm[in8] = f5o3 - f4o13;
     582             : 
     583    10890080 :     f5o4 = FFT_15PONIT_WNK1 * ( f2i9 - fi21 );
     584    10890080 :     f5o5 = f2i9 + fi21;
     585    10890080 :     f5o6 = fnms( FFT_15PONIT_WNK5, f5o5, fi5 );
     586    10890080 :     f5o9 = f2i10 - f2i11;
     587    10890080 :     f5o10 = fi22 - fi23;
     588    10890080 :     f5o7 = fmac( FFT_15PONIT_WNK2, f5o9, FFT_15PONIT_WNK3 * f5o10 );
     589    10890080 :     f5o8 = fnms( FFT_15PONIT_WNK3, f5o9, FFT_15PONIT_WNK2 * f5o10 );
     590    10890080 :     zIm[in1] = fi5 + f5o5;
     591    10890080 :     f5o11 = f5o6 - f5o4;
     592    10890080 :     f5o12 = f5o4 + f5o6;
     593    10890080 :     zIm[in34] = f5o8 + f5o11;
     594    10890080 :     zIm[in10] = f5o11 - f5o8;
     595             : 
     596    10890080 :     zIm[in16] = f5o12 - f5o7;
     597    10890080 :     zIm[in25] = f5o7 + f5o12;
     598             : 
     599    10890080 :     f5o13 = FFT_15PONIT_WNK1 * ( f2i12 - fi24 );
     600    10890080 :     f5o14 = f2i12 + fi24;
     601    10890080 :     f5o15 = fnms( FFT_15PONIT_WNK5, f5o14, fi4 );
     602    10890080 :     f5o18 = f2i7 - f2i8;
     603    10890080 :     f5o19 = fi19 - fi20;
     604    10890080 :     f5o16 = fmac( FFT_15PONIT_WNK2, f5o18, FFT_15PONIT_WNK3 * f5o19 );
     605    10890080 :     f5o17 = fnms( FFT_15PONIT_WNK3, f5o18, FFT_15PONIT_WNK2 * f5o19 );
     606    10890080 :     zRe[in1] = fi4 + f5o14;
     607    10890080 :     f5o21 = f5o15 - f5o13;
     608    10890080 :     f5o22 = f5o13 + f5o15;
     609             : 
     610    10890080 :     zRe[in34] = f5o21 - f5o17;
     611    10890080 :     zRe[in10] = f5o21 + f5o17;
     612    10890080 :     zRe[in25] = f5o22 - f5o16;
     613    10890080 :     zRe[in16] = f5o22 + f5o16;
     614             : 
     615    10890080 :     return;
     616             : }
     617             : 
     618             : /*-----------------------------------------------------------------*
     619             :  * fft5_shift1()
     620             :  * 5-point FFT with 1-point circular shift
     621             :  *-----------------------------------------------------------------*/
     622             : 
     623     5221408 : static void fft5_shift1(
     624             :     int16_t n1,        /* i  : length of data                           */
     625             :     float *zRe,        /* i/o: real part of input and output data       */
     626             :     float *zIm,        /* i/o: imaginary part of input and output data  */
     627             :     const int16_t *Idx /* i  : pointer of the address table             */
     628             : )
     629             : {
     630             :     float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
     631             :     float fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
     632             :     int16_t in1, in2, in3, in4, in5;
     633             : 
     634     5221408 :     in1 = Idx[0];
     635     5221408 :     in2 = Idx[n1];
     636     5221408 :     in3 = Idx[n1 * 2];
     637     5221408 :     in4 = Idx[n1 * 3];
     638     5221408 :     in5 = Idx[n1 * 4];
     639             : 
     640     5221408 :     fi1 = zRe[in1];
     641     5221408 :     fi2 = zIm[in1];
     642     5221408 :     fo3 = zRe[in2];
     643     5221408 :     fo4 = zRe[in5];
     644     5221408 :     fo6 = zRe[in3];
     645     5221408 :     fo7 = zRe[in4];
     646             : 
     647     5221408 :     fo5 = fo3 + fo4;
     648     5221408 :     fo8 = fo6 + fo7;
     649     5221408 :     fi3 = fo5 + fo8;
     650     5221408 :     fi4 = fo6 - fo7;
     651     5221408 :     fi5 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
     652     5221408 :     fi6 = fo3 - fo4;
     653             : 
     654     5221408 :     fo3 = zIm[in2];
     655     5221408 :     fo4 = zIm[in5];
     656     5221408 :     fo6 = zIm[in3];
     657     5221408 :     fo7 = zIm[in4];
     658             : 
     659     5221408 :     fo5 = fo3 + fo4;
     660     5221408 :     fo8 = fo6 + fo7;
     661     5221408 :     fi7 = fo3 - fo4;
     662     5221408 :     fi8 = fo5 + fo8;
     663     5221408 :     fo1 = fo6 - fo7;
     664     5221408 :     fo2 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
     665             : 
     666     5221408 :     zRe[in1] = fi1 + fi3;
     667     5221408 :     zIm[in1] = fi2 + fi8;
     668             : 
     669     5221408 :     fo3 = FFT_15PONIT_WNK2 * fi7 + FFT_15PONIT_WNK3 * fo1;
     670     5221408 :     fo4 = FFT_15PONIT_WNK2 * fo1 - FFT_15PONIT_WNK3 * fi7;
     671     5221408 :     fo7 = fi1 - fi3 / 4;
     672     5221408 :     fo5 = fi5 + fo7;
     673     5221408 :     fo6 = fo7 - fi5;
     674             : 
     675     5221408 :     zRe[in2] = fo5 + fo3;
     676     5221408 :     zRe[in3] = fo6 - fo4;
     677     5221408 :     zRe[in4] = fo6 + fo4;
     678     5221408 :     zRe[in5] = fo5 - fo3;
     679             : 
     680     5221408 :     fo3 = FFT_15PONIT_WNK2 * fi6 + FFT_15PONIT_WNK3 * fi4;
     681     5221408 :     fo4 = FFT_15PONIT_WNK2 * fi4 - FFT_15PONIT_WNK3 * fi6;
     682     5221408 :     fo7 = fi2 - fi8 / 4;
     683     5221408 :     fo5 = fo2 + fo7;
     684     5221408 :     fo6 = fo7 - fo2;
     685             : 
     686     5221408 :     zIm[in2] = fo5 - fo3;
     687     5221408 :     zIm[in3] = fo4 + fo6;
     688     5221408 :     zIm[in4] = fo6 - fo4;
     689     5221408 :     zIm[in5] = fo3 + fo5;
     690             : 
     691     5221408 :     return;
     692             : }
     693             : 
     694             : /*-----------------------------------------------------------------*
     695             :  * fft5_shift4()
     696             :  * 5-point FFT with 4-point circular shift
     697             :  *-----------------------------------------------------------------*/
     698             : 
     699   429033728 : static void fft5_shift4(
     700             :     int16_t n1,        /* i  : length of data                           */
     701             :     float *zRe,        /* i/o: real part of input and output data       */
     702             :     float *zIm,        /* i/o: imaginary part of input and output data  */
     703             :     const int16_t *Idx /* i  : pointer of the address table             */
     704             : )
     705             : {
     706             :     float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
     707             :     float fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
     708             :     int16_t in1, in2, in3, in4, in5;
     709             : 
     710   429033728 :     in1 = Idx[0];
     711   429033728 :     in2 = Idx[n1];
     712   429033728 :     in3 = Idx[n1 * 2];
     713   429033728 :     in4 = Idx[n1 * 3];
     714   429033728 :     in5 = Idx[n1 * 4];
     715             : 
     716   429033728 :     fi1 = zRe[in1];
     717   429033728 :     fi2 = zIm[in1];
     718   429033728 :     fo3 = zRe[in2];
     719   429033728 :     fo4 = zRe[in5];
     720   429033728 :     fo6 = zRe[in3];
     721   429033728 :     fo7 = zRe[in4];
     722             : 
     723   429033728 :     fo5 = fo3 + fo4;
     724   429033728 :     fo8 = fo6 + fo7;
     725   429033728 :     fi3 = fo5 + fo8;
     726   429033728 :     fi4 = fo6 - fo7;
     727   429033728 :     fi5 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
     728   429033728 :     fi6 = fo3 - fo4;
     729             : 
     730   429033728 :     fo3 = zIm[in2];
     731   429033728 :     fo4 = zIm[in5];
     732   429033728 :     fo6 = zIm[in3];
     733   429033728 :     fo7 = zIm[in4];
     734             : 
     735   429033728 :     fo5 = fo3 + fo4;
     736   429033728 :     fo8 = fo6 + fo7;
     737   429033728 :     fi7 = fo3 - fo4;
     738   429033728 :     fi8 = fo5 + fo8;
     739   429033728 :     fo1 = fo6 - fo7;
     740   429033728 :     fo2 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
     741             : 
     742   429033728 :     zRe[in1] = fi1 + fi3;
     743   429033728 :     zIm[in1] = fi2 + fi8;
     744             : 
     745   429033728 :     fo3 = FFT_15PONIT_WNK2 * fi7 + FFT_15PONIT_WNK3 * fo1;
     746   429033728 :     fo4 = FFT_15PONIT_WNK2 * fo1 - FFT_15PONIT_WNK3 * fi7;
     747   429033728 :     fo7 = fi1 - fi3 / 4;
     748   429033728 :     fo5 = fi5 + fo7;
     749   429033728 :     fo6 = fo7 - fi5;
     750   429033728 :     zRe[in2] = fo5 - fo3;
     751   429033728 :     zRe[in4] = fo6 - fo4;
     752   429033728 :     zRe[in3] = fo6 + fo4;
     753   429033728 :     zRe[in5] = fo5 + fo3;
     754             : 
     755   429033728 :     fo3 = FFT_15PONIT_WNK2 * fi6 + FFT_15PONIT_WNK3 * fi4;
     756   429033728 :     fo4 = FFT_15PONIT_WNK2 * fi4 - FFT_15PONIT_WNK3 * fi6;
     757   429033728 :     fo7 = fi2 - fi8 / 4;
     758   429033728 :     fo5 = fo2 + fo7;
     759   429033728 :     fo6 = fo7 - fo2;
     760             : 
     761   429033728 :     zIm[in3] = fo6 - fo4;
     762   429033728 :     zIm[in2] = fo3 + fo5;
     763   429033728 :     zIm[in4] = fo4 + fo6;
     764   429033728 :     zIm[in5] = fo5 - fo3;
     765             : 
     766   429033728 :     return;
     767             : }
     768             : 
     769             : /*-----------------------------------------------------------------*
     770             :  * fft5_32()
     771             :  * 5-point FFT called for 32 times
     772             :  *-----------------------------------------------------------------*/
     773             : 
     774    14834304 : static void fft5_32(
     775             :     float *zRe,        /* i/o: real part of input and output data       */
     776             :     float *zIm,        /* i/o: imaginary part of input and output data  */
     777             :     const int16_t *Idx /* i  : pointer of the address table             */
     778             : )
     779             : {
     780             :     float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
     781             :     float fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
     782             :     int16_t in1, in2, in3, in4, in5;
     783             : 
     784    14834304 :     in1 = Idx[0];
     785    14834304 :     in2 = Idx[32];
     786    14834304 :     in3 = Idx[64];
     787    14834304 :     in4 = Idx[96];
     788    14834304 :     in5 = Idx[128];
     789             : 
     790    14834304 :     fi1 = zRe[in1];
     791    14834304 :     fi2 = zIm[in1];
     792    14834304 :     fo3 = zRe[in2];
     793    14834304 :     fo4 = zRe[in5];
     794    14834304 :     fo6 = zRe[in3];
     795    14834304 :     fo7 = zRe[in4];
     796             : 
     797    14834304 :     fo5 = fo3 + fo4;
     798    14834304 :     fo8 = fo6 + fo7;
     799    14834304 :     fi3 = fo5 + fo8;
     800    14834304 :     fi4 = fo6 - fo7;
     801    14834304 :     fi5 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
     802    14834304 :     fi6 = fo3 - fo4;
     803             : 
     804    14834304 :     fo3 = zIm[in2];
     805    14834304 :     fo4 = zIm[in5];
     806    14834304 :     fo6 = zIm[in3];
     807    14834304 :     fo7 = zIm[in4];
     808             : 
     809    14834304 :     fo5 = fo3 + fo4;
     810    14834304 :     fo8 = fo6 + fo7;
     811    14834304 :     fi7 = fo3 - fo4;
     812    14834304 :     fi8 = fo5 + fo8;
     813    14834304 :     fo1 = fo6 - fo7;
     814    14834304 :     fo2 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
     815             : 
     816    14834304 :     zRe[in1] = fi1 + fi3;
     817    14834304 :     zIm[in1] = fi2 + fi8;
     818             : 
     819    14834304 :     fo3 = FFT_15PONIT_WNK2 * fi7 + FFT_15PONIT_WNK3 * fo1;
     820    14834304 :     fo4 = FFT_15PONIT_WNK2 * fo1 - FFT_15PONIT_WNK3 * fi7;
     821    14834304 :     fo7 = fi1 - fi3 / 4;
     822    14834304 :     fo5 = fi5 + fo7;
     823    14834304 :     fo6 = fo7 - fi5;
     824             : 
     825    14834304 :     zRe[in2] = fo6 + fo4;
     826    14834304 :     zRe[in3] = fo5 + fo3;
     827    14834304 :     zRe[in4] = fo5 - fo3;
     828    14834304 :     zRe[in5] = fo6 - fo4;
     829             : 
     830    14834304 :     fo3 = FFT_15PONIT_WNK2 * fi6 + FFT_15PONIT_WNK3 * fi4;
     831    14834304 :     fo4 = FFT_15PONIT_WNK2 * fi4 - FFT_15PONIT_WNK3 * fi6;
     832    14834304 :     fo7 = fi2 - fi8 / 4;
     833    14834304 :     fo5 = fo2 + fo7;
     834    14834304 :     fo6 = fo7 - fo2;
     835             : 
     836    14834304 :     zIm[in2] = fo6 - fo4;
     837    14834304 :     zIm[in3] = fo5 - fo3;
     838    14834304 :     zIm[in4] = fo3 + fo5;
     839    14834304 :     zIm[in5] = fo4 + fo6;
     840             : 
     841    14834304 :     return;
     842             : }
     843             : 
     844             : /*-----------------------------------------------------------------*
     845             :  * fft64()
     846             :  * 64-point FFT
     847             :  *-----------------------------------------------------------------*/
     848             : 
     849    33518260 : static void fft64(
     850             :     float *x,          /* i/o: real part of input and output data       */
     851             :     float *y,          /* i/o: imaginary part of input and output data  */
     852             :     const int16_t *Idx /* i  : pointer of the address table             */
     853             : )
     854             : {
     855             :     int16_t i, id, jd;
     856             :     float z[128];
     857  2178686900 :     for ( i = 0; i < 64; i++ )
     858             :     {
     859  2145168640 :         id = Idx[i];
     860  2145168640 :         z[2 * i] = x[id];
     861  2145168640 :         z[2 * i + 1] = y[id];
     862             :     }
     863             : 
     864    33518260 :     cdftForw( 128, z, Ip_fft64, w_fft64 );
     865             : 
     866  2178686900 :     for ( i = 0; i < 64; i++ )
     867             :     {
     868  2145168640 :         jd = Odx_fft64[i];
     869  2145168640 :         id = Idx[jd];
     870  2145168640 :         x[id] = z[2 * i];
     871  2145168640 :         y[id] = z[2 * i + 1];
     872             :     }
     873             : 
     874    33518260 :     return;
     875             : }
     876             : 
     877             : 
     878             : /*-----------------------------------------------------------------*
     879             :  * fft32_15()
     880             :  * 32-point FFT called for 15 times
     881             :  *-----------------------------------------------------------------*/
     882             : 
     883     5104725 : static void fft32_15(
     884             :     float *x,          /* i/o: real part of input and output data       */
     885             :     float *y,          /* i/o: imaginary part of input and output data  */
     886             :     const int16_t *Idx /* i  : pointer of the address table             */
     887             : )
     888             : {
     889             :     int16_t i, id, jd;
     890             :     float z[64];
     891             : 
     892   168455925 :     for ( i = 0; i < 32; i++ )
     893             :     {
     894   163351200 :         id = Idx[i];
     895   163351200 :         z[2 * i] = x[id];
     896   163351200 :         z[2 * i + 1] = y[id];
     897             :     }
     898             : 
     899     5104725 :     cdftForw( 64, z, Ip_fft32, w_fft32 );
     900             : 
     901   168455925 :     for ( i = 0; i < 32; i++ )
     902             :     {
     903   163351200 :         jd = Odx_fft32_15[i];
     904   163351200 :         id = Idx[jd];
     905   163351200 :         x[id] = z[2 * i];
     906   163351200 :         y[id] = z[2 * i + 1];
     907             :     }
     908             : 
     909     5104725 :     return;
     910             : }
     911             : 
     912             : /*-----------------------------------------------------------------*
     913             :  * fft32_5()
     914             :  * 32-point FFT called for 5 times
     915             :  *-----------------------------------------------------------------*/
     916             : 
     917     2317860 : static void fft32_5(
     918             :     float *x,          /* i/o: real part of input and output data       */
     919             :     float *y,          /* i/o: imaginary part of input and output data  */
     920             :     const int16_t *Idx /* i  : pointer of the address table             */
     921             : )
     922             : {
     923             :     int16_t i, id, jd;
     924             :     float z[64];
     925             : 
     926    76489380 :     for ( i = 0; i < 32; i++ )
     927             :     {
     928    74171520 :         id = Idx[i];
     929    74171520 :         z[2 * i] = x[id];
     930    74171520 :         z[2 * i + 1] = y[id];
     931             :     }
     932             : 
     933     2317860 :     cdftForw( 64, z, Ip_fft32, w_fft32 );
     934             : 
     935    76489380 :     for ( i = 0; i < 32; i++ )
     936             :     {
     937    74171520 :         jd = Odx_fft32_5[i];
     938    74171520 :         id = Idx[jd];
     939    74171520 :         x[id] = z[2 * i];
     940    74171520 :         y[id] = z[2 * i + 1];
     941             :     }
     942             : 
     943     2317860 :     return;
     944             : }
     945             : 
     946             : /*-----------------------------------------------------------------*
     947             :  * fft16()
     948             :  * 16-point FFT
     949             :  *-----------------------------------------------------------------*/
     950             : 
     951     1631690 : static void fft16(
     952             :     float *x,          /* i/o: real part of input and output data       */
     953             :     float *y,          /* i/o: imaginary part of input and output data  */
     954             :     const int16_t *Idx /* i  : pointer of the address table             */
     955             : )
     956             : {
     957             :     int16_t i, id, jd;
     958             :     float z[32];
     959             : 
     960    27738730 :     for ( i = 0; i < 16; i++ )
     961             :     {
     962    26107040 :         id = Idx[i];
     963    26107040 :         z[2 * i] = x[id];
     964    26107040 :         z[2 * i + 1] = y[id];
     965             :     }
     966             : 
     967     1631690 :     cdftForw( 32, z, Ip_fft16, w_fft16 );
     968             : 
     969    27738730 :     for ( i = 0; i < 16; i++ )
     970             :     {
     971    26107040 :         jd = Odx_fft16[i];
     972    26107040 :         id = Idx[jd];
     973    26107040 :         x[id] = z[2 * i];
     974    26107040 :         y[id] = z[2 * i + 1];
     975             :     }
     976             : 
     977     1631690 :     return;
     978             : }
     979             : 
     980             : /*-----------------------------------------------------------------*
     981             :  * fft8()
     982             :  * 8-point FFT
     983             :  *-----------------------------------------------------------------*/
     984             : 
     985      203610 : static void fft8(
     986             :     float *x,          /* i/o: real part of input and output data       */
     987             :     float *y,          /* i/o: imaginary part of input and output data  */
     988             :     const int16_t *Idx /* i  : pointer of the address table             */
     989             : )
     990             : {
     991             :     int16_t i, id;
     992             :     float z[16];
     993             : 
     994     1832490 :     for ( i = 0; i < 8; i++ )
     995             :     {
     996     1628880 :         id = Idx[i];
     997     1628880 :         z[2 * i] = x[id];
     998     1628880 :         z[2 * i + 1] = y[id];
     999             :     }
    1000             : 
    1001      203610 :     cdftForw( 16, z, Ip_fft8, w_fft8 );
    1002             : 
    1003     1832490 :     for ( i = 0; i < 8; i++ )
    1004             :     {
    1005     1628880 :         id = Idx[i];
    1006     1628880 :         x[id] = z[2 * i];
    1007     1628880 :         y[id] = z[2 * i + 1];
    1008             :     }
    1009             : 
    1010      203610 :     return;
    1011             : }
    1012             : 
    1013             : /*-----------------------------------------------------------------*
    1014             :  * fft8_5()
    1015             :  * 8-point FFT with shift 5
    1016             :  *-----------------------------------------------------------------*/
    1017             : 
    1018       21120 : static void fft8_5(
    1019             :     float *x,          /* i/o: real part of input and output data       */
    1020             :     float *y,          /* i/o: imaginary part of input and output data  */
    1021             :     const int16_t *Idx /* i  : pointer of the address table             */
    1022             : )
    1023             : {
    1024             :     int16_t i, id, jd;
    1025             :     float z[16];
    1026             : 
    1027      190080 :     for ( i = 0; i < 8; i++ )
    1028             :     {
    1029      168960 :         id = Idx[i];
    1030      168960 :         z[2 * i] = x[id];
    1031      168960 :         z[2 * i + 1] = y[id];
    1032             :     }
    1033             : 
    1034       21120 :     cdftForw( 16, z, Ip_fft8, w_fft8 );
    1035             : 
    1036      190080 :     for ( i = 0; i < 8; i++ )
    1037             :     {
    1038      168960 :         jd = Odx_fft8_5[i];
    1039      168960 :         id = Idx[jd];
    1040      168960 :         x[id] = z[2 * i];
    1041      168960 :         y[id] = z[2 * i + 1];
    1042             :     }
    1043       21120 :     return;
    1044             : }
    1045             : 
    1046             : /*-----------------------------------------------------------------*
    1047             :  * fft5_8()
    1048             :  * 5-point FFT with shift 2
    1049             :  *-----------------------------------------------------------------*/
    1050             : 
    1051       33792 : static void fft5_8(
    1052             :     int16_t n1,        /* i  : length of data                           */
    1053             :     float *zRe,        /* i/o: real part of input and output data       */
    1054             :     float *zIm,        /* i/o: imaginary part of input and output data  */
    1055             :     const int16_t *Idx /* i  : pointer of the address table             */
    1056             : )
    1057             : {
    1058             :     float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
    1059             :     float fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
    1060             :     int16_t in1, in2, in3, in4, in5;
    1061             : 
    1062       33792 :     in1 = Idx[0];
    1063       33792 :     in2 = Idx[n1];
    1064       33792 :     in3 = Idx[n1 * 2];
    1065       33792 :     in4 = Idx[n1 * 3];
    1066       33792 :     in5 = Idx[n1 * 4];
    1067             : 
    1068       33792 :     fi1 = zRe[in1];
    1069       33792 :     fi2 = zIm[in1];
    1070       33792 :     fo3 = zRe[in2];
    1071       33792 :     fo4 = zRe[in5];
    1072       33792 :     fo6 = zRe[in3];
    1073       33792 :     fo7 = zRe[in4];
    1074             : 
    1075       33792 :     fo5 = fo3 + fo4;
    1076       33792 :     fo8 = fo6 + fo7;
    1077       33792 :     fi3 = fo5 + fo8;
    1078       33792 :     fi4 = fo6 - fo7;
    1079       33792 :     fi5 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
    1080       33792 :     fi6 = fo3 - fo4;
    1081             : 
    1082       33792 :     fo3 = zIm[in2];
    1083       33792 :     fo4 = zIm[in5];
    1084       33792 :     fo6 = zIm[in3];
    1085       33792 :     fo7 = zIm[in4];
    1086             : 
    1087       33792 :     fo5 = fo3 + fo4;
    1088       33792 :     fo8 = fo6 + fo7;
    1089       33792 :     fi7 = fo3 - fo4;
    1090       33792 :     fi8 = fo5 + fo8;
    1091       33792 :     fo1 = fo6 - fo7;
    1092       33792 :     fo2 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
    1093             : 
    1094       33792 :     zRe[in1] = fi1 + fi3;
    1095       33792 :     zIm[in1] = fi2 + fi8;
    1096             : 
    1097       33792 :     fo3 = FFT_15PONIT_WNK2 * fi7 + FFT_15PONIT_WNK3 * fo1;
    1098       33792 :     fo4 = FFT_15PONIT_WNK2 * fo1 - FFT_15PONIT_WNK3 * fi7;
    1099       33792 :     fo7 = fi1 - fi3 / 4;
    1100       33792 :     fo5 = fi5 + fo7;
    1101       33792 :     fo6 = fo7 - fi5;
    1102             : 
    1103       33792 :     zRe[in2] = fo6 - fo4;
    1104       33792 :     zRe[in3] = fo5 - fo3;
    1105       33792 :     zRe[in5] = fo6 + fo4;
    1106       33792 :     zRe[in4] = fo5 + fo3;
    1107             : 
    1108       33792 :     fo3 = FFT_15PONIT_WNK2 * fi6 + FFT_15PONIT_WNK3 * fi4;
    1109       33792 :     fo4 = FFT_15PONIT_WNK2 * fi4 - FFT_15PONIT_WNK3 * fi6;
    1110       33792 :     fo7 = fi2 - fi8 / 4;
    1111       33792 :     fo5 = fo2 + fo7;
    1112       33792 :     fo6 = fo7 - fo2;
    1113             : 
    1114       33792 :     zIm[in2] = fo4 + fo6;
    1115       33792 :     zIm[in3] = fo3 + fo5;
    1116       33792 :     zIm[in4] = fo5 - fo3;
    1117       33792 :     zIm[in5] = fo6 - fo4;
    1118             : 
    1119       33792 :     return;
    1120             : }
    1121             : 
    1122             : /*-----------------------------------------------------------------*
    1123             :  * fft4_5()
    1124             :  * 8-point FFT with shift 1
    1125             :  *-----------------------------------------------------------------*/
    1126             : 
    1127        2440 : static void fft4_5(
    1128             :     float *x,          /* i/o: real part of input and output data       */
    1129             :     float *y,          /* i/o: imaginary part of input and output data  */
    1130             :     const int16_t *Idx /* i  : pointer of the address table             */
    1131             : )
    1132             : {
    1133             :     int16_t i, id, jd;
    1134             :     float z[8];
    1135             : 
    1136       12200 :     for ( i = 0; i < 4; i++ )
    1137             :     {
    1138        9760 :         id = Idx[i];
    1139        9760 :         z[2 * i] = x[id];
    1140        9760 :         z[2 * i + 1] = y[id];
    1141             :     }
    1142             : 
    1143        2440 :     cdftForw( 8, z, Ip_fft4, w_fft4 );
    1144             : 
    1145       12200 :     for ( i = 0; i < 4; i++ )
    1146             :     {
    1147        9760 :         jd = Odx_fft4_5[i];
    1148        9760 :         id = Idx[jd];
    1149        9760 :         x[id] = z[2 * i];
    1150        9760 :         y[id] = z[2 * i + 1];
    1151             :     }
    1152        2440 :     return;
    1153             : }
    1154             : 
    1155             : /*-----------------------------------------------------------------*
    1156             :  * fft5_4()
    1157             :  * 5-point FFT with shift 4
    1158             :  *-----------------------------------------------------------------*/
    1159             : 
    1160        1952 : static void fft5_4(
    1161             :     int16_t n1,
    1162             :     float *zRe,
    1163             :     float *zIm,
    1164             :     const int16_t *Idx )
    1165             : {
    1166             :     float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
    1167             :     float fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
    1168             :     int16_t in1, in2, in3, in4, in5;
    1169             : 
    1170        1952 :     in1 = Idx[0];
    1171        1952 :     in2 = Idx[n1];
    1172        1952 :     in3 = Idx[n1 * 2];
    1173        1952 :     in4 = Idx[n1 * 3];
    1174        1952 :     in5 = Idx[n1 * 4];
    1175             : 
    1176        1952 :     fi1 = zRe[in1];
    1177        1952 :     fi2 = zIm[in1];
    1178        1952 :     fo3 = zRe[in2];
    1179        1952 :     fo4 = zRe[in5];
    1180        1952 :     fo6 = zRe[in3];
    1181        1952 :     fo7 = zRe[in4];
    1182             : 
    1183        1952 :     fo5 = fo3 + fo4;
    1184        1952 :     fo8 = fo6 + fo7;
    1185        1952 :     fi3 = fo5 + fo8;
    1186        1952 :     fi4 = fo6 - fo7;
    1187        1952 :     fi5 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
    1188        1952 :     fi6 = fo3 - fo4;
    1189             : 
    1190        1952 :     fo3 = zIm[in2];
    1191        1952 :     fo4 = zIm[in5];
    1192        1952 :     fo6 = zIm[in3];
    1193        1952 :     fo7 = zIm[in4];
    1194             : 
    1195        1952 :     fo5 = fo3 + fo4;
    1196        1952 :     fo8 = fo6 + fo7;
    1197        1952 :     fi7 = fo3 - fo4;
    1198        1952 :     fi8 = fo5 + fo8;
    1199        1952 :     fo1 = fo6 - fo7;
    1200        1952 :     fo2 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
    1201             : 
    1202        1952 :     zRe[in1] = fi1 + fi3;
    1203        1952 :     zIm[in1] = fi2 + fi8;
    1204             : 
    1205        1952 :     fo3 = FFT_15PONIT_WNK2 * fi7 + FFT_15PONIT_WNK3 * fo1;
    1206        1952 :     fo4 = FFT_15PONIT_WNK2 * fo1 - FFT_15PONIT_WNK3 * fi7;
    1207        1952 :     fo7 = fi1 - fi3 / 4;
    1208        1952 :     fo5 = fi5 + fo7;
    1209        1952 :     fo6 = fo7 - fi5;
    1210             : 
    1211        1952 :     zRe[in2] = fo5 - fo3;
    1212        1952 :     zRe[in4] = fo6 - fo4;
    1213        1952 :     zRe[in3] = fo6 + fo4;
    1214        1952 :     zRe[in5] = fo5 + fo3;
    1215             : 
    1216        1952 :     fo3 = FFT_15PONIT_WNK2 * fi6 + FFT_15PONIT_WNK3 * fi4;
    1217        1952 :     fo4 = FFT_15PONIT_WNK2 * fi4 - FFT_15PONIT_WNK3 * fi6;
    1218        1952 :     fo7 = fi2 - fi8 / 4;
    1219        1952 :     fo5 = fo2 + fo7;
    1220        1952 :     fo6 = fo7 - fo2;
    1221             : 
    1222        1952 :     zIm[in2] = fo3 + fo5;
    1223        1952 :     zIm[in3] = fo6 - fo4;
    1224        1952 :     zIm[in4] = fo4 + fo6;
    1225        1952 :     zIm[in5] = fo5 - fo3;
    1226             : 
    1227        1952 :     return;
    1228             : }
    1229             : 
    1230             : 
    1231             : /*-----------------------------------------------------------------*
    1232             :  * DoRTFT80()
    1233             :  * a low complexity 2-dimensional DFT of 80 points
    1234             :  *-----------------------------------------------------------------*/
    1235             : 
    1236      326338 : void DoRTFT80(
    1237             :     float *x, /* i/o: real part of input and output data       */
    1238             :     float *y  /* i/o: imaginary part of input and output data  */
    1239             : )
    1240             : {
    1241             :     int16_t j;
    1242             : 
    1243             :     /* Applying 16-point FFT for 5 times based on the address table Idx_dortft80 */
    1244     1958028 :     for ( j = 0; j < 5; j++ )
    1245             :     {
    1246     1631690 :         fft16( x, y, Idx_dortft80 + 16 * j );
    1247             :     }
    1248             : 
    1249             :     /* Applying 5-point FFT for 16 times based on the address table Idx_dortft80 */
    1250     5547746 :     for ( j = 0; j < 16; j++ )
    1251             :     {
    1252     5221408 :         fft5_shift1( 16, x, y, Idx_dortft80 + j );
    1253             :     }
    1254             : 
    1255      326338 :     return;
    1256             : }
    1257             : 
    1258             : /*-----------------------------------------------------------------*
    1259             :  * DoRTFT120()
    1260             :  * a low complexity 2-dimensional DFT of 120 points
    1261             :  *-----------------------------------------------------------------*/
    1262             : 
    1263       13574 : void DoRTFT120(
    1264             :     float *x, /* i/o: real part of input and output data       */
    1265             :     float *y  /* i/o: imaginary part of input and output data  */
    1266             : )
    1267             : {
    1268             :     int16_t j;
    1269             : 
    1270             :     /* Applying 8-point FFT for 15 times based on the address table Idx_dortft120 */
    1271      217184 :     for ( j = 0; j < 15; j++ )
    1272             :     {
    1273      203610 :         fft8( x, y, Idx_dortft120 + 8 * j );
    1274             :     }
    1275             : 
    1276             :     /* Applying 15-point FFT for 8 times based on the address table Idx_dortft120 */
    1277      122166 :     for ( j = 0; j < 8; j++ )
    1278             :     {
    1279      108592 :         fft15_shift2( 8, x, y, Idx_dortft120 + j );
    1280             :     }
    1281             : 
    1282       13574 :     return;
    1283             : }
    1284             : 
    1285             : /*-----------------------------------------------------------------*
    1286             :  * DoRTFT160()
    1287             :  * a low complexity 2-dimensional DFT of 160 points
    1288             :  *-----------------------------------------------------------------*/
    1289             : 
    1290      463572 : void DoRTFT160(
    1291             :     float x[], /* i/o: real part of input and output data       */
    1292             :     float y[]  /* i/o: imaginary part of input and output data  */
    1293             : )
    1294             : {
    1295             :     int16_t j;
    1296             : 
    1297             :     /* Applying 32-point FFT for 5 times based on the address table Idx_dortft160 */
    1298     2781432 :     for ( j = 0; j < 5; j++ )
    1299             :     {
    1300     2317860 :         fft32_5( x, y, Idx_dortft160 + 32 * j );
    1301             :     }
    1302             : 
    1303             :     /* Applying 5-point FFT for 32 times based on the address table Idx_dortft160 */
    1304    15297876 :     for ( j = 0; j < 32; j++ )
    1305             :     {
    1306    14834304 :         fft5_32( x, y, Idx_dortft160 + j );
    1307             :     }
    1308             : 
    1309      463572 :     return;
    1310             : }
    1311             : 
    1312             : /*-----------------------------------------------------------------*
    1313             :  * DoRTFT320()
    1314             :  * a low complexity 2-dimensional DFT of 320 points
    1315             :  *-----------------------------------------------------------------*/
    1316             : 
    1317     6703652 : void DoRTFT320(
    1318             :     float *x, /* i/o: real part of input and output data       */
    1319             :     float *y  /* i/o: imaginary part of input and output data  */
    1320             : )
    1321             : {
    1322             :     int16_t j;
    1323             : 
    1324             :     /* Applying 64-point FFT for 5 times based on the address table Idx_dortft160 */
    1325    40221912 :     for ( j = 0; j < 5; j++ )
    1326             :     {
    1327    33518260 :         fft64( x, y, Idx_dortft320 + 64 * j );
    1328             :     }
    1329             : 
    1330             :     /* Applying 5-point FFT for 64 times based on the address table Idx_dortft160 */
    1331   435737380 :     for ( j = 0; j < 64; j++ )
    1332             :     {
    1333   429033728 :         fft5_shift4( 64, x, y, Idx_dortft320 + j );
    1334             :     }
    1335             : 
    1336     6703652 :     return;
    1337             : }
    1338             : 
    1339             : /*-----------------------------------------------------------------*
    1340             :  * DoRTFT480()
    1341             :  * a low complexity 2-dimensional DFT of 480 points
    1342             :  *-----------------------------------------------------------------*/
    1343             : 
    1344      340315 : void DoRTFT480(
    1345             :     float *x, /* i/o: real part of input and output data       */
    1346             :     float *y  /* i/o: imaginary part of input and output data  */
    1347             : )
    1348             : {
    1349             :     int16_t j;
    1350             : 
    1351             :     /* Applying 32-point FFT for 15 times based on the address table Idx_dortft160 */
    1352     5445040 :     for ( j = 0; j < 15; j++ )
    1353             :     {
    1354     5104725 :         fft32_15( x, y, Idx_dortft480 + 32 * j );
    1355             :     }
    1356             : 
    1357             :     /* Applying 5-point FFT for 32 times based on the address table Idx_dortft160 */
    1358    11230395 :     for ( j = 0; j < 32; j++ )
    1359             :     {
    1360    10890080 :         fft15_shift8( 32, x, y, Idx_dortft480 + j );
    1361             :     }
    1362             : 
    1363      340315 :     return;
    1364             : }
    1365             : 
    1366             : /*-----------------------------------------------------------------*
    1367             :  * DoRTFT40()
    1368             :  * a low complexity 2-dimensional DFT of 40 points
    1369             :  *-----------------------------------------------------------------*/
    1370             : 
    1371        4224 : void DoRTFT40(
    1372             :     float *x, /* i/o: real part of input and output data       */
    1373             :     float *y  /* i/o: imaginary part of input and output data  */
    1374             : )
    1375             : {
    1376             :     int16_t j;
    1377             :     /* Applying 8-point FFT for 5 times based on the address table Idx_dortft40 */
    1378       25344 :     for ( j = 0; j < 5; j++ )
    1379             :     {
    1380       21120 :         fft8_5( x, y, Idx_dortft40 + 8 * j );
    1381             :     }
    1382             : 
    1383             :     /* Applying 5-point FFT for 8 times based on the address table Idx_dortft40 */
    1384       38016 :     for ( j = 0; j < 8; j++ )
    1385             :     {
    1386       33792 :         fft5_8( 8, x, y, Idx_dortft40 + j );
    1387             :     }
    1388             : 
    1389        4224 :     return;
    1390             : }
    1391             : 
    1392             : /*-----------------------------------------------------------------*
    1393             :  * DoRTFT20()
    1394             :  * a low complexity 2-dimensional DFT of 20 points
    1395             :  *-----------------------------------------------------------------*/
    1396             : 
    1397         488 : void DoRTFT20(
    1398             :     float *x, /* i/o: real part of input and output data       */
    1399             :     float *y  /* i/o: imaginary part of input and output data  */
    1400             : )
    1401             : {
    1402             :     int16_t j;
    1403             : 
    1404             :     /* Applying 4-point FFT for 5 times based on the address table Idx_dortft20 */
    1405        2928 :     for ( j = 0; j < 5; j++ )
    1406             :     {
    1407        2440 :         fft4_5( x, y, Idx_dortft20 + 4 * j );
    1408             :     }
    1409             : 
    1410             :     /* Applying 5-point FFT for 4 times based on the address table Idx_dortft20 */
    1411        2440 :     for ( j = 0; j < 4; j++ )
    1412             :     {
    1413        1952 :         fft5_4( 4, x, y, Idx_dortft20 + j );
    1414             :     }
    1415             : 
    1416         488 :     return;
    1417             : }
    1418             : 
    1419             : /*-----------------------------------------------------------------*
    1420             :  * DoRTFT128()
    1421             :  * FFT with 128 points
    1422             :  *-----------------------------------------------------------------*/
    1423             : 
    1424    18185543 : void DoRTFT128(
    1425             :     float *x, /* i/o: real part of input and output data       */
    1426             :     float *y  /* i/o: imaginary part of input and output data  */
    1427             : )
    1428             : {
    1429             : 
    1430             :     int16_t i;
    1431             :     float z[256];
    1432             : 
    1433  2345935047 :     for ( i = 0; i < 128; i++ )
    1434             :     {
    1435  2327749504 :         z[2 * i] = x[i];
    1436  2327749504 :         z[2 * i + 1] = y[i];
    1437             :     }
    1438             : 
    1439    18185543 :     cdftForw( 256, z, Ip_fft128, w_fft128 );
    1440             : 
    1441    18185543 :     x[0] = z[0];
    1442    18185543 :     y[0] = z[1];
    1443  2327749504 :     for ( i = 1; i < 128; i++ )
    1444             :     {
    1445  2309563961 :         x[128 - i] = z[2 * i];
    1446  2309563961 :         y[128 - i] = z[2 * i + 1];
    1447             :     }
    1448             : 
    1449    18185543 :     return;
    1450             : }
    1451             : 
    1452             : /*-----------------------------------------------------------------*
    1453             :  * cdftForw()
    1454             :  * Main fuction of Complex Discrete Fourier Transform
    1455             :  *-----------------------------------------------------------------*/
    1456             : 
    1457   138663632 : static void cdftForw(
    1458             :     int16_t n,         /* i  : data length of real and imag  */
    1459             :     float *a,          /* i/o: input/output data             */
    1460             :     const int16_t *ip, /* i  : work area for bit reversal    */
    1461             :     const float *w     /* i  : cos/sin table                 */
    1462             : )
    1463             : {
    1464             :     /* bit reversal */
    1465   138663632 :     bitrv2_SR( n, ip + 2, a );
    1466             : 
    1467             :     /* Do FFT */
    1468   138663632 :     cftfsub( n, a, w );
    1469   138663632 : }
    1470             : 
    1471             : /*-----------------------------------------------------------------*
    1472             :  * bitrv2_SR()
    1473             :  * Bit reversal
    1474             :  *-----------------------------------------------------------------*/
    1475             : 
    1476   140768772 : static void bitrv2_SR(
    1477             :     int16_t n,         /* i  : data length of real and imag  */
    1478             :     const int16_t *ip, /* i/o: work area for bit reversal    */
    1479             :     float *a           /* i/o: input/output data             */
    1480             : )
    1481             : {
    1482             :     int16_t j, j1, k, k1, m, m2;
    1483             :     int16_t l;
    1484             :     float xr, xi, yr, yi;
    1485             : 
    1486   140768772 :     if ( n == 64 )
    1487             :     {
    1488     9527725 :         m = 4;
    1489     9527725 :         l = -1;
    1490             :     }
    1491   131241047 :     else if ( n == 256 )
    1492             :     {
    1493    18185551 :         m = 8;
    1494    18185551 :         l = -1;
    1495             :     }
    1496   113055496 :     else if ( n == 16 )
    1497             :     {
    1498      224730 :         m = 2;
    1499      224730 :         l = -1;
    1500             :     }
    1501             :     else
    1502             :     {
    1503   112830766 :         l = n;
    1504   112830766 :         m = 1;
    1505             : 
    1506   469006373 :         while ( ( m << 3 ) < l )
    1507             :         {
    1508   356175607 :             l >>= 1;
    1509   356175607 :             m <<= 1;
    1510             :         }
    1511   112830766 :         l -= m * 8;
    1512             :     }
    1513             : 
    1514   140768772 :     m2 = 2 * m;
    1515             : 
    1516   140768772 :     if ( l == 0 )
    1517             :     {
    1518   380319033 :         for ( k = 0; k < m; k++ )
    1519             :         {
    1520  1171001970 :             for ( j = 0; j < k; j++ )
    1521             :             {
    1522   848955902 :                 j1 = 2 * j + ip[k];
    1523   848955902 :                 k1 = 2 * k + ip[j];
    1524   848955902 :                 xr = a[j1];
    1525   848955902 :                 xi = a[j1 + 1];
    1526   848955902 :                 yr = a[k1];
    1527   848955902 :                 yi = a[k1 + 1];
    1528   848955902 :                 a[j1] = yr;
    1529   848955902 :                 a[j1 + 1] = yi;
    1530   848955902 :                 a[k1] = xr;
    1531   848955902 :                 a[k1 + 1] = xi;
    1532   848955902 :                 j1 += m2;
    1533   848955902 :                 k1 += 2 * m2;
    1534   848955902 :                 xr = a[j1];
    1535   848955902 :                 xi = a[j1 + 1];
    1536   848955902 :                 yr = a[k1];
    1537   848955902 :                 yi = a[k1 + 1];
    1538   848955902 :                 a[j1] = yr;
    1539   848955902 :                 a[j1 + 1] = yi;
    1540   848955902 :                 a[k1] = xr;
    1541   848955902 :                 a[k1 + 1] = xi;
    1542   848955902 :                 j1 += m2;
    1543   848955902 :                 k1 -= m2;
    1544   848955902 :                 xr = a[j1];
    1545   848955902 :                 xi = a[j1 + 1];
    1546   848955902 :                 yr = a[k1];
    1547   848955902 :                 yi = a[k1 + 1];
    1548   848955902 :                 a[j1] = yr;
    1549   848955902 :                 a[j1 + 1] = yi;
    1550   848955902 :                 a[k1] = xr;
    1551   848955902 :                 a[k1 + 1] = xi;
    1552   848955902 :                 j1 += m2;
    1553   848955902 :                 k1 += 2 * m2;
    1554   848955902 :                 xr = a[j1];
    1555   848955902 :                 xi = a[j1 + 1];
    1556   848955902 :                 yr = a[k1];
    1557   848955902 :                 yi = a[k1 + 1];
    1558   848955902 :                 a[j1] = yr;
    1559   848955902 :                 a[j1 + 1] = yi;
    1560   848955902 :                 a[k1] = xr;
    1561   848955902 :                 a[k1 + 1] = xi;
    1562             :             }
    1563             : 
    1564   322046068 :             j1 = 2 * k + m2 + ip[k];
    1565   322046068 :             k1 = j1 + m2;
    1566   322046068 :             xr = a[j1];
    1567   322046068 :             xi = a[j1 + 1];
    1568   322046068 :             yr = a[k1];
    1569   322046068 :             yi = a[k1 + 1];
    1570   322046068 :             a[j1] = yr;
    1571   322046068 :             a[j1 + 1] = yi;
    1572   322046068 :             a[k1] = xr;
    1573   322046068 :             a[k1 + 1] = xi;
    1574             :         }
    1575             :     }
    1576             :     else
    1577             :     {
    1578  1056969584 :         for ( k = 1; k < m; k++ )
    1579             :         {
    1580  8087996405 :             for ( j = 0; j < k; j++ )
    1581             :             {
    1582  7113522628 :                 j1 = 2 * j + ip[k];
    1583  7113522628 :                 k1 = 2 * k + ip[j];
    1584  7113522628 :                 xr = a[j1];
    1585  7113522628 :                 xi = a[j1 + 1];
    1586  7113522628 :                 yr = a[k1];
    1587  7113522628 :                 yi = a[k1 + 1];
    1588  7113522628 :                 a[j1] = yr;
    1589  7113522628 :                 a[j1 + 1] = yi;
    1590  7113522628 :                 a[k1] = xr;
    1591  7113522628 :                 a[k1 + 1] = xi;
    1592  7113522628 :                 j1 += m2;
    1593  7113522628 :                 k1 += m2;
    1594  7113522628 :                 xr = a[j1];
    1595  7113522628 :                 xi = a[j1 + 1];
    1596  7113522628 :                 yr = a[k1];
    1597  7113522628 :                 yi = a[k1 + 1];
    1598  7113522628 :                 a[j1] = yr;
    1599  7113522628 :                 a[j1 + 1] = yi;
    1600  7113522628 :                 a[k1] = xr;
    1601  7113522628 :                 a[k1 + 1] = xi;
    1602             :             }
    1603             :         }
    1604             :     }
    1605             : 
    1606   140768772 :     return;
    1607             : }
    1608             : 
    1609             : /*-----------------------------------------------------------------*
    1610             :  * cftfsub()
    1611             :  * Complex Discrete Fourier Transform
    1612             :  *-----------------------------------------------------------------*/
    1613             : 
    1614   140338737 : static void cftfsub(
    1615             :     int16_t n,     /* i  : data length of real and imag  */
    1616             :     float *a,      /* i/o: input/output data             */
    1617             :     const float *w /* i  : cos/sin table                 */
    1618             : )
    1619             : {
    1620             :     int16_t j, j1, j2, j3, l;
    1621             :     float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
    1622             : 
    1623   140338737 :     l = 2;
    1624   140338737 :     if ( n > 8 )
    1625             :     {
    1626   140336297 :         cft1st( n, a, w );
    1627             : 
    1628   140336297 :         l = 8;
    1629   429152370 :         while ( ( l << 2 ) < n )
    1630             :         {
    1631   288816073 :             cftmdl( n, l, a, w );
    1632   288816073 :             l <<= 2;
    1633             :         }
    1634             :     }
    1635             : 
    1636   140338737 :     if ( ( l << 2 ) == n )
    1637             :     {
    1638  2078230837 :         for ( j = 0; j < l; j += 2 )
    1639             :         {
    1640  2019957872 :             j1 = j + l;
    1641  2019957872 :             j2 = j1 + l;
    1642  2019957872 :             j3 = j2 + l;
    1643  2019957872 :             x0r = a[j] + a[j1];
    1644  2019957872 :             x0i = a[j + 1] + a[j1 + 1];
    1645  2019957872 :             x1r = a[j] - a[j1];
    1646  2019957872 :             x1i = a[j + 1] - a[j1 + 1];
    1647  2019957872 :             x2r = a[j2] + a[j3];
    1648  2019957872 :             x2i = a[j2 + 1] + a[j3 + 1];
    1649  2019957872 :             x3r = a[j2] - a[j3];
    1650  2019957872 :             x3i = a[j2 + 1] - a[j3 + 1];
    1651  2019957872 :             a[j] = x0r + x2r;
    1652  2019957872 :             a[j + 1] = x0i + x2i;
    1653  2019957872 :             a[j2] = x0r - x2r;
    1654  2019957872 :             a[j2 + 1] = x0i - x2i;
    1655  2019957872 :             a[j1] = x1r - x3i;
    1656  2019957872 :             a[j1 + 1] = x1i + x3r;
    1657  2019957872 :             a[j3] = x1r + x3i;
    1658  2019957872 :             a[j3 + 1] = x1i - x3r;
    1659             :         }
    1660             :     }
    1661             :     else
    1662             :     {
    1663 15359200052 :         for ( j = 0; j < l; j += 2 )
    1664             :         {
    1665 15277134280 :             j1 = j + l;
    1666 15277134280 :             x0r = a[j] - a[j1];
    1667 15277134280 :             x0i = a[j + 1] - a[j1 + 1];
    1668 15277134280 :             a[j] += a[j1];
    1669 15277134280 :             a[j + 1] += a[j1 + 1];
    1670 15277134280 :             a[j1] = x0r;
    1671 15277134280 :             a[j1 + 1] = x0i;
    1672             :         }
    1673             :     }
    1674             : 
    1675   140338737 :     return;
    1676             : }
    1677             : 
    1678             : /*-----------------------------------------------------------------*
    1679             :  * cft1st()
    1680             :  * Subfunction of Complex Discrete Fourier Transform
    1681             :  *-----------------------------------------------------------------*/
    1682             : 
    1683   140766332 : static void cft1st(
    1684             :     int16_t n,     /* i  : data length of real and imag  */
    1685             :     float *a,      /* i/o: input/output data             */
    1686             :     const float *w /* i  : cos/sin table                 */
    1687             : )
    1688             : {
    1689             :     int16_t j, k1, k2;
    1690             :     float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
    1691             :     float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
    1692             : 
    1693   140766332 :     x0r = a[0] + a[2];
    1694   140766332 :     x0i = a[1] + a[3];
    1695   140766332 :     x1r = a[0] - a[2];
    1696   140766332 :     x1i = a[1] - a[3];
    1697   140766332 :     x2r = a[4] + a[6];
    1698   140766332 :     x2i = a[5] + a[7];
    1699   140766332 :     x3r = a[4] - a[6];
    1700   140766332 :     x3i = a[5] - a[7];
    1701   140766332 :     a[0] = x0r + x2r;
    1702   140766332 :     a[1] = x0i + x2i;
    1703   140766332 :     a[4] = x0r - x2r;
    1704   140766332 :     a[5] = x0i - x2i;
    1705   140766332 :     a[2] = x1r - x3i;
    1706   140766332 :     a[3] = x1i + x3r;
    1707   140766332 :     a[6] = x1r + x3i;
    1708   140766332 :     a[7] = x1i - x3r;
    1709   140766332 :     wk1r = w[2];
    1710   140766332 :     x0r = a[8] + a[10];
    1711   140766332 :     x0i = a[9] + a[11];
    1712   140766332 :     x1r = a[8] - a[10];
    1713   140766332 :     x1i = a[9] - a[11];
    1714   140766332 :     x2r = a[12] + a[14];
    1715   140766332 :     x2i = a[13] + a[15];
    1716   140766332 :     x3r = a[12] - a[14];
    1717   140766332 :     x3i = a[13] - a[15];
    1718   140766332 :     a[8] = x0r + x2r;
    1719   140766332 :     a[9] = x0i + x2i;
    1720   140766332 :     a[12] = x2i - x0i;
    1721   140766332 :     a[13] = x0r - x2r;
    1722   140766332 :     x0r = x1r - x3i;
    1723   140766332 :     x0i = x1i + x3r;
    1724   140766332 :     a[10] = wk1r * ( x0r - x0i );
    1725   140766332 :     a[11] = wk1r * ( x0r + x0i );
    1726   140766332 :     x0r = x3i + x1r;
    1727   140766332 :     x0i = x3r - x1i;
    1728   140766332 :     a[14] = wk1r * ( x0i - x0r );
    1729   140766332 :     a[15] = wk1r * ( x0i + x0r );
    1730   140766332 :     k1 = 0;
    1731             : 
    1732  4830981426 :     for ( j = 16; j < n; j += 16 )
    1733             :     {
    1734  4690215094 :         k1 += 2;
    1735  4690215094 :         k2 = 2 * k1;
    1736  4690215094 :         wk2r = w[k1];
    1737  4690215094 :         wk2i = w[k1 + 1];
    1738  4690215094 :         wk1r = w[k2];
    1739  4690215094 :         wk1i = w[k2 + 1];
    1740  4690215094 :         wk3r = wk1r - 2 * wk2i * wk1i;
    1741  4690215094 :         wk3i = 2 * wk2i * wk1r - wk1i;
    1742  4690215094 :         x0r = a[j] + a[j + 2];
    1743  4690215094 :         x0i = a[j + 1] + a[j + 3];
    1744  4690215094 :         x1r = a[j] - a[j + 2];
    1745  4690215094 :         x1i = a[j + 1] - a[j + 3];
    1746  4690215094 :         x2r = a[j + 4] + a[j + 6];
    1747  4690215094 :         x2i = a[j + 5] + a[j + 7];
    1748  4690215094 :         x3r = a[j + 4] - a[j + 6];
    1749  4690215094 :         x3i = a[j + 5] - a[j + 7];
    1750  4690215094 :         a[j] = x0r + x2r;
    1751  4690215094 :         a[j + 1] = x0i + x2i;
    1752  4690215094 :         x0r -= x2r;
    1753  4690215094 :         x0i -= x2i;
    1754  4690215094 :         a[j + 4] = wk2r * x0r - wk2i * x0i;
    1755  4690215094 :         a[j + 5] = wk2r * x0i + wk2i * x0r;
    1756  4690215094 :         x0r = x1r - x3i;
    1757  4690215094 :         x0i = x1i + x3r;
    1758  4690215094 :         a[j + 2] = wk1r * x0r - wk1i * x0i;
    1759  4690215094 :         a[j + 3] = wk1r * x0i + wk1i * x0r;
    1760  4690215094 :         x0r = x1r + x3i;
    1761  4690215094 :         x0i = x1i - x3r;
    1762  4690215094 :         a[j + 6] = wk3r * x0r - wk3i * x0i;
    1763  4690215094 :         a[j + 7] = wk3r * x0i + wk3i * x0r;
    1764  4690215094 :         wk1r = w[k2 + 2];
    1765  4690215094 :         wk1i = w[k2 + 3];
    1766  4690215094 :         wk3r = wk1r - 2 * wk2r * wk1i;
    1767  4690215094 :         wk3i = 2 * wk2r * wk1r - wk1i;
    1768  4690215094 :         x0r = a[j + 8] + a[j + 10];
    1769  4690215094 :         x0i = a[j + 9] + a[j + 11];
    1770  4690215094 :         x1r = a[j + 8] - a[j + 10];
    1771  4690215094 :         x1i = a[j + 9] - a[j + 11];
    1772  4690215094 :         x2r = a[j + 12] + a[j + 14];
    1773  4690215094 :         x2i = a[j + 13] + a[j + 15];
    1774  4690215094 :         x3r = a[j + 12] - a[j + 14];
    1775  4690215094 :         x3i = a[j + 13] - a[j + 15];
    1776  4690215094 :         a[j + 8] = x0r + x2r;
    1777  4690215094 :         a[j + 9] = x0i + x2i;
    1778  4690215094 :         x0r -= x2r;
    1779  4690215094 :         x0i -= x2i;
    1780  4690215094 :         a[j + 12] = -wk2i * x0r - wk2r * x0i;
    1781  4690215094 :         a[j + 13] = -wk2i * x0i + wk2r * x0r;
    1782  4690215094 :         x0r = x1r - x3i;
    1783  4690215094 :         x0i = x1i + x3r;
    1784  4690215094 :         a[j + 10] = wk1r * x0r - wk1i * x0i;
    1785  4690215094 :         a[j + 11] = wk1r * x0i + wk1i * x0r;
    1786  4690215094 :         x0r = x1r + x3i;
    1787  4690215094 :         x0i = x1i - x3r;
    1788  4690215094 :         a[j + 14] = wk3r * x0r - wk3i * x0i;
    1789  4690215094 :         a[j + 15] = wk3r * x0i + wk3i * x0r;
    1790             :     }
    1791             : 
    1792   140766332 :     return;
    1793             : }
    1794             : 
    1795             : /*-----------------------------------------------------------------*
    1796             :  * cftmdl()
    1797             :  * Subfunction of Complex Discrete Fourier Transform
    1798             :  *-----------------------------------------------------------------*/
    1799             : 
    1800   289246108 : static void cftmdl(
    1801             :     int16_t n,     /* i  : data length of real and imag  */
    1802             :     int16_t l,     /* i  : initial shift for processing  */
    1803             :     float *a,      /* i/o: input/output data             */
    1804             :     const float *w /* i  : cos/sin table                 */
    1805             : )
    1806             : {
    1807             :     int16_t j, j1, j2, j3, k, k1, k2, m, m2;
    1808             :     float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
    1809             :     float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
    1810             : 
    1811   289246108 :     m = l << 2;
    1812  5869547756 :     for ( j = 0; j < l; j += 2 )
    1813             :     {
    1814  5580301648 :         j1 = j + l;
    1815  5580301648 :         j2 = j1 + l;
    1816  5580301648 :         j3 = j2 + l;
    1817  5580301648 :         x0r = a[j] + a[j1];
    1818  5580301648 :         x0i = a[j + 1] + a[j1 + 1];
    1819  5580301648 :         x1r = a[j] - a[j1];
    1820  5580301648 :         x1i = a[j + 1] - a[j1 + 1];
    1821  5580301648 :         x2r = a[j2] + a[j3];
    1822  5580301648 :         x2i = a[j2 + 1] + a[j3 + 1];
    1823  5580301648 :         x3r = a[j2] - a[j3];
    1824  5580301648 :         x3i = a[j2 + 1] - a[j3 + 1];
    1825  5580301648 :         a[j] = x0r + x2r;
    1826  5580301648 :         a[j + 1] = x0i + x2i;
    1827  5580301648 :         a[j2] = x0r - x2r;
    1828  5580301648 :         a[j2 + 1] = x0i - x2i;
    1829  5580301648 :         a[j1] = x1r - x3i;
    1830  5580301648 :         a[j1 + 1] = x1i + x3r;
    1831  5580301648 :         a[j3] = x1r + x3i;
    1832  5580301648 :         a[j3 + 1] = x1i - x3r;
    1833             :     }
    1834             : 
    1835   289246108 :     wk1r = w[2];
    1836  5869547756 :     for ( j = m; j < l + m; j += 2 )
    1837             :     {
    1838  5580301648 :         j1 = j + l;
    1839  5580301648 :         j2 = j1 + l;
    1840  5580301648 :         j3 = j2 + l;
    1841  5580301648 :         x0r = a[j] + a[j1];
    1842  5580301648 :         x0i = a[j + 1] + a[j1 + 1];
    1843  5580301648 :         x1r = a[j] - a[j1];
    1844  5580301648 :         x1i = a[j + 1] - a[j1 + 1];
    1845  5580301648 :         x2r = a[j2] + a[j3];
    1846  5580301648 :         x2i = a[j2 + 1] + a[j3 + 1];
    1847  5580301648 :         x3r = a[j2] - a[j3];
    1848  5580301648 :         x3i = a[j2 + 1] - a[j3 + 1];
    1849  5580301648 :         a[j] = x0r + x2r;
    1850  5580301648 :         a[j + 1] = x0i + x2i;
    1851  5580301648 :         a[j2] = x2i - x0i;
    1852  5580301648 :         a[j2 + 1] = x0r - x2r;
    1853  5580301648 :         x0r = x1r - x3i;
    1854  5580301648 :         x0i = x1i + x3r;
    1855  5580301648 :         a[j1] = wk1r * ( x0r - x0i );
    1856  5580301648 :         a[j1 + 1] = wk1r * ( x0r + x0i );
    1857  5580301648 :         x0r = x3i + x1r;
    1858  5580301648 :         x0i = x3r - x1i;
    1859  5580301648 :         a[j3] = wk1r * ( x0i - x0r );
    1860  5580301648 :         a[j3 + 1] = wk1r * ( x0i + x0r );
    1861             :     }
    1862             : 
    1863   289246108 :     k1 = 0;
    1864   289246108 :     m2 = 2 * m;
    1865  1543981523 :     for ( k = m2; k < n; k += m2 )
    1866             :     {
    1867  1254735415 :         k1 += 2;
    1868  1254735415 :         k2 = 2 * k1;
    1869  1254735415 :         wk2r = w[k1];
    1870  1254735415 :         wk2i = w[k1 + 1];
    1871  1254735415 :         wk1r = w[k2];
    1872  1254735415 :         wk1i = w[k2 + 1];
    1873  1254735415 :         wk3r = wk1r - 2 * wk2i * wk1i;
    1874  1254735415 :         wk3i = 2 * wk2i * wk1r - wk1i;
    1875  8514686843 :         for ( j = k; j < l + k; j += 2 )
    1876             :         {
    1877  7259951428 :             j1 = j + l;
    1878  7259951428 :             j2 = j1 + l;
    1879  7259951428 :             j3 = j2 + l;
    1880  7259951428 :             x0r = a[j] + a[j1];
    1881  7259951428 :             x0i = a[j + 1] + a[j1 + 1];
    1882  7259951428 :             x1r = a[j] - a[j1];
    1883  7259951428 :             x1i = a[j + 1] - a[j1 + 1];
    1884  7259951428 :             x2r = a[j2] + a[j3];
    1885  7259951428 :             x2i = a[j2 + 1] + a[j3 + 1];
    1886  7259951428 :             x3r = a[j2] - a[j3];
    1887  7259951428 :             x3i = a[j2 + 1] - a[j3 + 1];
    1888  7259951428 :             a[j] = x0r + x2r;
    1889  7259951428 :             a[j + 1] = x0i + x2i;
    1890  7259951428 :             x0r -= x2r;
    1891  7259951428 :             x0i -= x2i;
    1892  7259951428 :             a[j2] = wk2r * x0r - wk2i * x0i;
    1893  7259951428 :             a[j2 + 1] = wk2r * x0i + wk2i * x0r;
    1894  7259951428 :             x0r = x1r - x3i;
    1895  7259951428 :             x0i = x1i + x3r;
    1896  7259951428 :             a[j1] = wk1r * x0r - wk1i * x0i;
    1897  7259951428 :             a[j1 + 1] = wk1r * x0i + wk1i * x0r;
    1898  7259951428 :             x0r = x1r + x3i;
    1899  7259951428 :             x0i = x1i - x3r;
    1900  7259951428 :             a[j3] = wk3r * x0r - wk3i * x0i;
    1901  7259951428 :             a[j3 + 1] = wk3r * x0i + wk3i * x0r;
    1902             :         }
    1903             : 
    1904  1254735415 :         wk1r = w[k2 + 2];
    1905  1254735415 :         wk1i = w[k2 + 3];
    1906  1254735415 :         wk3r = wk1r - 2 * wk2r * wk1i;
    1907  1254735415 :         wk3i = 2 * wk2r * wk1r - wk1i;
    1908  8514686843 :         for ( j = k + m; j < l + ( k + m ); j += 2 )
    1909             :         {
    1910  7259951428 :             j1 = j + l;
    1911  7259951428 :             j2 = j1 + l;
    1912  7259951428 :             j3 = j2 + l;
    1913  7259951428 :             x0r = a[j] + a[j1];
    1914  7259951428 :             x0i = a[j + 1] + a[j1 + 1];
    1915  7259951428 :             x1r = a[j] - a[j1];
    1916  7259951428 :             x1i = a[j + 1] - a[j1 + 1];
    1917  7259951428 :             x2r = a[j2] + a[j3];
    1918  7259951428 :             x2i = a[j2 + 1] + a[j3 + 1];
    1919  7259951428 :             x3r = a[j2] - a[j3];
    1920  7259951428 :             x3i = a[j2 + 1] - a[j3 + 1];
    1921  7259951428 :             a[j] = x0r + x2r;
    1922  7259951428 :             a[j + 1] = x0i + x2i;
    1923  7259951428 :             x0r -= x2r;
    1924  7259951428 :             x0i -= x2i;
    1925  7259951428 :             a[j2] = -wk2i * x0r - wk2r * x0i;
    1926  7259951428 :             a[j2 + 1] = -wk2i * x0i + wk2r * x0r;
    1927  7259951428 :             x0r = x1r - x3i;
    1928  7259951428 :             x0i = x1i + x3r;
    1929  7259951428 :             a[j1] = wk1r * x0r - wk1i * x0i;
    1930  7259951428 :             a[j1 + 1] = wk1r * x0i + wk1i * x0r;
    1931  7259951428 :             x0r = x1r + x3i;
    1932  7259951428 :             x0i = x1i - x3r;
    1933  7259951428 :             a[j3] = wk3r * x0r - wk3i * x0i;
    1934  7259951428 :             a[j3 + 1] = wk3r * x0i + wk3i * x0r;
    1935             :         }
    1936             :     }
    1937             : 
    1938   289246108 :     return;
    1939             : }
    1940             : 
    1941      430035 : static void cftbsub(
    1942             :     int16_t n,
    1943             :     float *a,
    1944             :     const float *w /* i  : cos/sin table                 */
    1945             : )
    1946             : {
    1947             :     int16_t j, j1, j2, j3, l;
    1948             :     float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
    1949             : 
    1950      430035 :     l = 2;
    1951      430035 :     if ( n > 8 )
    1952             :     {
    1953      430035 :         cft1st( n, a, w );
    1954      430035 :         l = 8;
    1955             : 
    1956      860070 :         while ( ( l << 2 ) < n )
    1957             :         {
    1958      430035 :             cftmdl( n, l, a, w );
    1959      430035 :             l <<= 2;
    1960             :         }
    1961             :     }
    1962             : 
    1963      430035 :     if ( ( l << 2 ) == n )
    1964             :     {
    1965           0 :         for ( j = 0; j < l; j += 2 )
    1966             :         {
    1967           0 :             j1 = j + l;
    1968           0 :             j2 = j1 + l;
    1969           0 :             j3 = j2 + l;
    1970           0 :             x0r = a[j] + a[j1];
    1971           0 :             x0i = -a[j + 1] - a[j1 + 1];
    1972           0 :             x1r = a[j] - a[j1];
    1973           0 :             x1i = -a[j + 1] + a[j1 + 1];
    1974           0 :             x2r = a[j2] + a[j3];
    1975           0 :             x2i = a[j2 + 1] + a[j3 + 1];
    1976           0 :             x3r = a[j2] - a[j3];
    1977           0 :             x3i = a[j2 + 1] - a[j3 + 1];
    1978           0 :             a[j] = x0r + x2r;
    1979           0 :             a[j + 1] = x0i - x2i;
    1980           0 :             a[j2] = x0r - x2r;
    1981           0 :             a[j2 + 1] = x0i + x2i;
    1982           0 :             a[j1] = x1r - x3i;
    1983           0 :             a[j1 + 1] = x1i - x3r;
    1984           0 :             a[j3] = x1r + x3i;
    1985           0 :             a[j3 + 1] = x1i + x3r;
    1986             :         }
    1987             :     }
    1988             :     else
    1989             :     {
    1990     7310595 :         for ( j = 0; j < l; j += 2 )
    1991             :         {
    1992     6880560 :             j1 = j + l;
    1993     6880560 :             x0r = a[j] - a[j1];
    1994     6880560 :             x0i = -a[j + 1] + a[j1 + 1];
    1995     6880560 :             a[j] += a[j1];
    1996     6880560 :             a[j + 1] = -a[j + 1] - a[j1 + 1];
    1997     6880560 :             a[j1] = x0r;
    1998     6880560 :             a[j1 + 1] = x0i;
    1999             :         }
    2000             :     }
    2001             : 
    2002      430035 :     return;
    2003             : }
    2004             : 
    2005     1675105 : static void rftfsub(
    2006             :     int16_t n,
    2007             :     float *a,
    2008             :     int16_t nc,
    2009             :     const float *c )
    2010             : {
    2011             :     int16_t j, k, kk, ks, m;
    2012             :     float wkr, wki, xr, xi, yr, yi;
    2013             : 
    2014     1675105 :     m = n >> 1;
    2015     1675105 :     ks = 2 * nc / m;
    2016     1675105 :     kk = 0;
    2017    26801680 :     for ( j = 2; j < m; j += 2 )
    2018             :     {
    2019    25126575 :         k = n - j;
    2020    25126575 :         kk += ks;
    2021    25126575 :         wkr = 0.5f - c[nc - kk];
    2022    25126575 :         wki = c[kk];
    2023    25126575 :         xr = a[j] - a[k];
    2024    25126575 :         xi = a[j + 1] + a[k + 1];
    2025    25126575 :         yr = wkr * xr - wki * xi;
    2026    25126575 :         yi = wkr * xi + wki * xr;
    2027    25126575 :         a[j] -= yr;
    2028    25126575 :         a[j + 1] -= yi;
    2029    25126575 :         a[k] += yr;
    2030    25126575 :         a[k + 1] -= yi;
    2031             :     }
    2032             : 
    2033     1675105 :     return;
    2034             : }
    2035             : 
    2036             : 
    2037      430035 : static void rftbsub(
    2038             :     int16_t n,
    2039             :     float *a,
    2040             :     int16_t nc,
    2041             :     const float *c )
    2042             : {
    2043             :     int16_t j, k, kk, ks, m;
    2044             :     float wkr, wki, xr, xi, yr, yi;
    2045             : 
    2046      430035 :     a[1] = -a[1];
    2047      430035 :     m = n >> 1;
    2048      430035 :     ks = 2 * nc / m;
    2049      430035 :     kk = 0;
    2050     6880560 :     for ( j = 2; j < m; j += 2 )
    2051             :     {
    2052     6450525 :         k = n - j;
    2053     6450525 :         kk += ks;
    2054     6450525 :         wkr = 0.5f - c[nc - kk];
    2055     6450525 :         wki = c[kk];
    2056     6450525 :         xr = a[j] - a[k];
    2057     6450525 :         xi = a[j + 1] + a[k + 1];
    2058     6450525 :         yr = wkr * xr + wki * xi;
    2059     6450525 :         yi = wkr * xi - wki * xr;
    2060     6450525 :         a[j] -= yr;
    2061     6450525 :         a[j + 1] = yi - a[j + 1];
    2062     6450525 :         a[k] += yr;
    2063     6450525 :         a[k + 1] = yi - a[k + 1];
    2064             :     }
    2065      430035 :     a[m + 1] = -a[m + 1];
    2066             : 
    2067      430035 :     return;
    2068             : }
    2069             : 
    2070             : 
    2071     2105140 : static void dctsub(
    2072             :     int16_t n,
    2073             :     float *a,
    2074             :     int16_t nc,
    2075             :     const float *c )
    2076             : {
    2077             :     int16_t j, k, kk, ks, m;
    2078             :     float wkr, wki, xr;
    2079             : 
    2080     2105140 :     m = n >> 1;
    2081     2105140 :     ks = nc / n;
    2082     2105140 :     kk = 0;
    2083    67364480 :     for ( j = 1; j < m; j++ )
    2084             :     {
    2085    65259340 :         k = n - j;
    2086    65259340 :         kk += ks;
    2087    65259340 :         wkr = c[kk] - c[nc - kk];
    2088    65259340 :         wki = c[kk] + c[nc - kk];
    2089    65259340 :         xr = wki * a[j] - wkr * a[k];
    2090    65259340 :         a[j] = wkr * a[j] + wki * a[k];
    2091    65259340 :         a[k] = xr;
    2092             :     }
    2093     2105140 :     a[m] *= c[0];
    2094             : 
    2095     2105140 :     return;
    2096             : }
    2097             : 
    2098             : 
    2099             : /*-----------------------------------------------------------------*
    2100             :  * edct2()
    2101             :  *
    2102             :  * Transformation of the signal to DCT domain
    2103             :  * OR Inverse EDCT-II for short frames
    2104             :  *-----------------------------------------------------------------*/
    2105             : 
    2106     2105140 : void edct2(
    2107             :     const int16_t n,
    2108             :     const int16_t isgn,
    2109             :     float *in,
    2110             :     float *a,
    2111             :     const int16_t *ip,
    2112             :     const float *w )
    2113             : {
    2114             :     int16_t j, nw, nc;
    2115             :     float xr;
    2116             : 
    2117     2105140 :     mvr2r( in, a, n );
    2118             : 
    2119     2105140 :     nw = ip[0];
    2120     2105140 :     if ( n > ( nw << 2 ) )
    2121             :     {
    2122           0 :         nw = n >> 2;
    2123             :     }
    2124             : 
    2125     2105140 :     nc = ip[1];
    2126     2105140 :     if ( n > nc )
    2127             :     {
    2128           0 :         nc = n;
    2129             :     }
    2130             : 
    2131     2105140 :     if ( isgn < 0 )
    2132             :     {
    2133      430035 :         xr = a[n - 1];
    2134    13761120 :         for ( j = n - 2; j >= 2; j -= 2 )
    2135             :         {
    2136    13331085 :             a[j + 1] = a[j] - a[j - 1];
    2137    13331085 :             a[j] += a[j - 1];
    2138             :         }
    2139      430035 :         a[1] = a[0] - xr;
    2140      430035 :         a[0] += xr;
    2141             : 
    2142      430035 :         if ( n > 4 )
    2143             :         {
    2144      430035 :             rftbsub( n, a, nc, w + nw );
    2145      430035 :             bitrv2_SR( n, ip + 2, a );
    2146      430035 :             cftbsub( n, a, w );
    2147             :         }
    2148           0 :         else if ( n == 4 )
    2149             :         {
    2150           0 :             cftfsub( n, a, w );
    2151             :         }
    2152             :     }
    2153             : 
    2154     2105140 :     if ( isgn >= 0 )
    2155             :     {
    2156     1675105 :         a[0] *= 0.5f;
    2157             :     }
    2158             : 
    2159     2105140 :     dctsub( n, a, nc, w + nw );
    2160             : 
    2161     2105140 :     if ( isgn >= 0 )
    2162             :     {
    2163     1675105 :         if ( n > 4 )
    2164             :         {
    2165     1675105 :             bitrv2_SR( n, ip + 2, a );
    2166     1675105 :             cftfsub( n, a, w );
    2167     1675105 :             rftfsub( n, a, nc, w + nw );
    2168             :         }
    2169           0 :         else if ( n == 4 )
    2170             :         {
    2171           0 :             cftfsub( n, a, w );
    2172             :         }
    2173     1675105 :         xr = a[0] - a[1];
    2174     1675105 :         a[0] += a[1];
    2175    53603360 :         for ( j = 2; j < n; j += 2 )
    2176             :         {
    2177    51928255 :             a[j - 1] = a[j] - a[j + 1];
    2178    51928255 :             a[j] += a[j + 1];
    2179             :         }
    2180     1675105 :         a[n - 1] = xr;
    2181             : 
    2182   108881825 :         for ( j = 0; j < n; j++ )
    2183             :         {
    2184   107206720 :             a[j] /= 32.0f;
    2185             :         }
    2186             :     }
    2187     2105140 : }
    2188             : 
    2189             : 
    2190    77678384 : void DoRTFTn(
    2191             :     float *x,       /* i/o: real part of input and output data       */
    2192             :     float *y,       /* i/o: imaginary part of input and output data  */
    2193             :     const int16_t n /* i  : size of the FFT up to 1024 */
    2194             : )
    2195             : {
    2196             : 
    2197             :     int16_t i;
    2198             :     float z[2048];
    2199             : 
    2200 33919819568 :     for ( i = 0; i < n; i++ )
    2201             :     {
    2202 33842141184 :         z[2 * i] = x[i];
    2203 33842141184 :         z[2 * i + 1] = y[i];
    2204             :     }
    2205             : 
    2206    77678384 :     switch ( n )
    2207             :     {
    2208       42368 :         case ( 16 ):
    2209       42368 :             cdftForw( 2 * n, z, Ip_fft16, w_fft16 );
    2210       42368 :             break;
    2211           0 :         case ( 32 ):
    2212           0 :             cdftForw( 2 * n, z, Ip_fft32, w_fft32 );
    2213           0 :             break;
    2214         796 :         case ( 64 ):
    2215         796 :             cdftForw( 2 * n, z, Ip_fft64, w_fft64 );
    2216         796 :             break;
    2217           8 :         case ( 128 ):
    2218           8 :             cdftForw( 2 * n, z, Ip_fft128, w_fft128 );
    2219           8 :             break;
    2220    23077411 :         case ( 256 ):
    2221    23077411 :             cdftForw( 2 * n, z, Ip_fft256, w_fft256 );
    2222    23077411 :             break;
    2223    54557801 :         case ( 512 ):
    2224    54557801 :             cdftForw( 2 * n, z, Ip_fft512, w_fft512 );
    2225    54557801 :             break;
    2226           0 :         default:
    2227           0 :             assert( 0 );
    2228             :     }
    2229             : 
    2230    77678384 :     x[0] = z[0];
    2231    77678384 :     y[0] = z[1];
    2232 33842141184 :     for ( i = 1; i < n; i++ )
    2233             :     {
    2234 33764462800 :         x[n - i] = z[2 * i];
    2235 33764462800 :         y[n - i] = z[2 * i + 1];
    2236             :     }
    2237             : 
    2238    77678384 :     return;
    2239             : }
    2240             : 
    2241             : 
    2242        8562 : void fft3(
    2243             :     const float X[],
    2244             :     float Y[],
    2245             :     const int16_t n )
    2246             : {
    2247             :     float Z[PH_ECU_SPEC_SIZE];
    2248             :     float *Z0, *Z1, *Z2;
    2249             :     float *z0, *z1, *z2;
    2250             :     const float *x;
    2251        8562 :     const float *t_sin = sincos_t_rad3;
    2252             :     int16_t m, step, order;
    2253             :     int16_t i, j;
    2254             :     int16_t c1_ind, s1_ind, c2_ind, s2_ind;
    2255             :     int16_t c1_step, s1_step, c2_step, s2_step;
    2256             :     float *RY, *IY, *RZ0, *IZ0, *RZ1, *IZ1, *RZ2, *IZ2;
    2257             : 
    2258             :     /* Determine the order of the transform, the length of decimated  */
    2259             :     /* transforms m, and the step for the sine and cosine tables.     */
    2260        8562 :     switch ( n )
    2261             :     {
    2262        2854 :         case 1536:
    2263        2854 :             order = 9;
    2264        2854 :             m = 512;
    2265        2854 :             step = 1;
    2266        2854 :             break;
    2267        5708 :         case 384:
    2268        5708 :             order = 7;
    2269        5708 :             m = 128;
    2270        5708 :             step = 4;
    2271        5708 :             break;
    2272           0 :         default:
    2273           0 :             order = 9;
    2274           0 :             m = 512;
    2275           0 :             step = 1;
    2276             :     }
    2277             : 
    2278             :     /* Compose decimated sequences X[3i], X[3i+1],X[3i+2] */
    2279             :     /* compute their FFT of length m.                                 */
    2280        8562 :     Z0 = &Z[0];
    2281        8562 :     z0 = &Z0[0];
    2282        8562 :     Z1 = &Z0[m];
    2283        8562 :     z1 = &Z1[0]; /* Z1 = &Z[ m];     */
    2284        8562 :     Z2 = &Z1[m];
    2285        8562 :     z2 = &Z2[0]; /* Z2 = &Z[2m];     */
    2286        8562 :     x = &X[0];
    2287     2200434 :     for ( i = 0; i < n / 3; i++ )
    2288             :     {
    2289     2191872 :         *z0++ = *x++; /* Z0[i] = X[3i];   */
    2290     2191872 :         *z1++ = *x++; /* Z1[i] = X[3i+1]; */
    2291     2191872 :         *z2++ = *x++; /* Z2[i] = X[3i+2]; */
    2292             :     }
    2293             : 
    2294        8562 :     fft_rel( &Z0[0], m, order );
    2295        8562 :     fft_rel( &Z1[0], m, order );
    2296        8562 :     fft_rel( &Z2[0], m, order );
    2297             : 
    2298             :     /* Butterflies of order 3. */
    2299             :     /* pointer initialization */
    2300        8562 :     RY = &Y[0];
    2301        8562 :     IY = &Y[n];
    2302        8562 :     RZ0 = &Z0[0];
    2303        8562 :     IZ0 = &Z0[m];
    2304        8562 :     RZ1 = &Z1[0];
    2305        8562 :     IZ1 = &Z1[m];
    2306        8562 :     RZ2 = &Z2[0];
    2307        8562 :     IZ2 = &Z2[m];
    2308             : 
    2309        8562 :     c1_step = -step;
    2310        8562 :     s1_step = step;
    2311        8562 :     c2_step = -2 * step;
    2312        8562 :     s2_step = 2 * step;
    2313        8562 :     c1_ind = T_SIN_PI_2 + c1_step;
    2314        8562 :     s1_ind = s1_step;
    2315        8562 :     c2_ind = T_SIN_PI_2 + c2_step;
    2316        8562 :     s2_ind = s2_step;
    2317             : 
    2318             :     /* special case: i = 0 */
    2319        8562 :     RY[0] = RZ0[0] + RZ1[0] + RZ2[0];
    2320             : 
    2321             :     /* first 3/12 */
    2322      821952 :     for ( i = 1; i < 3 * m / 8; i++, c1_ind += c1_step, s1_ind += s1_step, c2_ind += c2_step, s2_ind += s2_step )
    2323             :     {
    2324      813390 :         RY[i] = RZ0[i] + RZ1[i] * t_sin[c1_ind] + IZ1[-i] * t_sin[s1_ind] + RZ2[i] * t_sin[c2_ind] + IZ2[-i] * t_sin[s2_ind];
    2325      813390 :         IY[-i] = IZ0[-i] - RZ1[i] * t_sin[s1_ind] + IZ1[-i] * t_sin[c1_ind] - RZ2[i] * t_sin[s2_ind] + IZ2[-i] * t_sin[c2_ind];
    2326             :     }
    2327             : 
    2328             :     /* next 1/12 */
    2329      282546 :     for ( ; i < 4 * m / 8; i++, c1_ind += c1_step, s1_ind += s1_step, c2_ind -= c2_step, s2_ind -= s2_step )
    2330             :     {
    2331      273984 :         RY[i] = RZ0[i] + RZ1[i] * t_sin[c1_ind] + IZ1[-i] * t_sin[s1_ind] - RZ2[i] * t_sin[c2_ind] + IZ2[-i] * t_sin[s2_ind];
    2332      273984 :         IY[-i] = IZ0[-i] - RZ1[i] * t_sin[s1_ind] + IZ1[-i] * t_sin[c1_ind] - RZ2[i] * t_sin[s2_ind] - IZ2[-i] * t_sin[c2_ind];
    2333             :     }
    2334             : 
    2335             :     /* special case: i = m/2 i.e. 1/3 */
    2336        8562 :     RY[i] = RZ0[i] + RZ1[i] * t_sin[c1_ind] - RZ2[i] * t_sin[c2_ind];
    2337        8562 :     IY[-i] = -RZ1[i] * t_sin[s1_ind] - RZ2[i] * t_sin[s2_ind];
    2338        8562 :     i++;
    2339             : 
    2340        8562 :     c1_ind += c1_step, s1_ind += s1_step, c2_ind -= c2_step, s2_ind -= s2_step;
    2341             : 
    2342             :     /* next  2/12 */
    2343      547968 :     for ( j = i - 2; i < 6 * m / 8; i++, j--, c1_ind += c1_step, s1_ind += s1_step, c2_ind -= c2_step, s2_ind -= s2_step )
    2344             :     {
    2345      539406 :         RY[i] = RZ0[j] + RZ1[j] * t_sin[c1_ind] - IZ1[-j] * t_sin[s1_ind] - RZ2[j] * t_sin[c2_ind] - IZ2[-j] * t_sin[s2_ind];
    2346      539406 :         IY[-i] = -IZ0[-j] - RZ1[j] * t_sin[s1_ind] - IZ1[-j] * t_sin[c1_ind] - RZ2[j] * t_sin[s2_ind] + IZ2[-j] * t_sin[c2_ind];
    2347             :     }
    2348             : 
    2349             :     /*--------------------------half--------------------------*/
    2350             :     /* next 2/12 */
    2351      556530 :     for ( ; i < 8 * m / 8; i++, j--, c1_ind -= c1_step, s1_ind -= s1_step, c2_ind += c2_step, s2_ind += s2_step )
    2352             :     {
    2353      547968 :         RY[i] = RZ0[j] - RZ1[j] * t_sin[c1_ind] - IZ1[-j] * t_sin[s1_ind] - RZ2[j] * t_sin[c2_ind] + IZ2[-j] * t_sin[s2_ind];
    2354      547968 :         IY[-i] = -IZ0[-j] - RZ1[j] * t_sin[s1_ind] + IZ1[-j] * t_sin[c1_ind] + RZ2[j] * t_sin[s2_ind] + IZ2[-j] * t_sin[c2_ind];
    2355             :     }
    2356             : 
    2357             :     /* special case: i = m, i.e 2/3 */
    2358        8562 :     RY[i] = RZ0[j] - RZ1[j] * t_sin[c1_ind] - RZ2[j] * t_sin[c2_ind];
    2359        8562 :     IY[-i++] = -RZ1[j] * t_sin[s1_ind] + RZ2[j] * t_sin[s2_ind];
    2360        8562 :     c1_ind -= c1_step, s1_ind -= s1_step, c2_ind += c2_step, s2_ind += s2_step;
    2361             : 
    2362             :     /* next 1/12 */
    2363      273984 :     for ( j = 1; i < 9 * m / 8; i++, j++, c1_ind -= c1_step, s1_ind -= s1_step, c2_ind += c2_step, s2_ind += s2_step )
    2364             :     {
    2365      265422 :         RY[i] = RZ0[j] - RZ1[j] * t_sin[c1_ind] + IZ1[-j] * t_sin[s1_ind] - RZ2[j] * t_sin[c2_ind] - IZ2[-j] * t_sin[s2_ind];
    2366      265422 :         IY[-i] = IZ0[-j] - RZ1[j] * t_sin[s1_ind] - IZ1[-j] * t_sin[c1_ind] + RZ2[j] * t_sin[s2_ind] - IZ2[-j] * t_sin[c2_ind];
    2367             :     }
    2368             : 
    2369             :     /* last 3/12 */
    2370      830514 :     for ( ; i < 12 * m / 8; i++, j++, c1_ind -= c1_step, s1_ind -= s1_step, c2_ind -= c2_step, s2_ind -= s2_step )
    2371             :     {
    2372      821952 :         RY[i] = RZ0[j] - RZ1[j] * t_sin[c1_ind] + IZ1[-j] * t_sin[s1_ind] + RZ2[j] * t_sin[c2_ind] - IZ2[-j] * t_sin[s2_ind];
    2373      821952 :         IY[-i] = IZ0[-j] - RZ1[j] * t_sin[s1_ind] - IZ1[-j] * t_sin[c1_ind] + RZ2[j] * t_sin[s2_ind] + IZ2[-j] * t_sin[c2_ind];
    2374             :     }
    2375             : 
    2376             :     /* special case: i = 3*m/2 */
    2377        8562 :     RY[i] = RZ0[j] - RZ1[j] * t_sin[c1_ind] + RZ2[j] * t_sin[c2_ind];
    2378             : 
    2379        8562 :     return;
    2380             : }
    2381             : 
    2382        5706 : void ifft3(
    2383             :     const float Z[],
    2384             :     float X[],
    2385             :     const int16_t n )
    2386             : {
    2387             :     float Y[PH_ECU_SPEC_SIZE];
    2388        5706 :     const float *t_sin = sincos_t_rad3;
    2389             :     int16_t m, step, step2, order;
    2390             :     int16_t i;
    2391             :     int16_t c0_ind, s0_ind, c1_ind, s1_ind, c2_ind, s2_ind;
    2392             :     float scale;
    2393             :     const float *RZ0, *IZ0, *RZ1, *IZ1, *RZ2, *IZ2;
    2394             :     float *RY0, *IY0, *RY1, *IY1, *RY2, *IY2, *y0, *y1, *y2;
    2395             : 
    2396             :     /* Determine the order of the transform, the length of decimated  */
    2397             :     /* transforms m, and the step for the sine and cosine tables.     */
    2398        5706 :     switch ( n )
    2399             :     {
    2400        5706 :         case 1536:
    2401        5706 :             order = 9;
    2402        5706 :             m = 512;
    2403        5706 :             step = 1;
    2404        5706 :             break;
    2405           0 :         case 384:
    2406           0 :             order = 7;
    2407           0 :             m = 128;
    2408           0 :             step = 4;
    2409           0 :             break;
    2410           0 :         default:
    2411           0 :             order = 9;
    2412           0 :             m = 512;
    2413           0 :             step = 1;
    2414             :     }
    2415             : 
    2416             :     /* pointer initialization */
    2417        5706 :     RY0 = &Y[0];
    2418        5706 :     IY0 = &RY0[m];
    2419        5706 :     RY1 = &RY0[m];
    2420        5706 :     IY1 = &RY1[m];
    2421        5706 :     RY2 = &RY1[m];
    2422        5706 :     IY2 = &RY2[m];
    2423             : 
    2424        5706 :     RZ0 = &Z[0];
    2425        5706 :     RZ1 = RZ0 + m;
    2426        5706 :     RZ2 = RZ0 + n / 2 - m / 2;
    2427        5706 :     IZ0 = &Z[n];
    2428        5706 :     IZ1 = IZ0 - m;
    2429        5706 :     IZ2 = IZ0 - n / 2 + m / 2;
    2430             : 
    2431             :     /* Inverse butterflies of order 3. */
    2432             : 
    2433             :     /* Construction of Y0 */
    2434        5706 :     RY0[0] = RZ0[0] + RZ1[0] + RZ2[0];
    2435     1460736 :     for ( i = 1; i < m / 2; i++ )
    2436             :     {
    2437     1455030 :         RY0[i] = RZ0[i] + RZ1[i] + RZ2[-i];
    2438     1455030 :         IY0[-i] = IZ0[-i] + IZ1[-i] - IZ2[i];
    2439             :     }
    2440             : 
    2441             :     /* m/2 */
    2442        5706 :     RY0[i] = RZ0[i] + RZ1[i] + RZ2[-i];
    2443             : 
    2444             :     /* Construction of Y1 */
    2445        5706 :     c0_ind = T_SIN_PI_2;
    2446        5706 :     s0_ind = 0;
    2447        5706 :     c1_ind = T_SIN_PI_2 * 1 / 3;
    2448        5706 :     s1_ind = T_SIN_PI_2 * 2 / 3;
    2449        5706 :     c2_ind = T_SIN_PI_2 * 1 / 3;
    2450        5706 :     s2_ind = T_SIN_PI_2 * 2 / 3;
    2451             : 
    2452        5706 :     RY1[0] = RZ0[0] * t_sin[c0_ind] - RZ1[0] * t_sin[c1_ind] - RZ2[0] * t_sin[c2_ind] - IZ1[0] * t_sin[s1_ind] - IZ2[0] * t_sin[s2_ind];
    2453             : 
    2454        5706 :     c0_ind -= step, s0_ind += step, c1_ind += step, s1_ind -= step, c2_ind -= step, s2_ind += step;
    2455      730368 :     for ( i = 1; i < m / 4; i++, c0_ind -= step, s0_ind += step, c1_ind += step, s1_ind -= step, c2_ind -= step, s2_ind += step )
    2456             :     {
    2457      724662 :         RY1[i] = RZ0[i] * t_sin[c0_ind] - RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] - IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind];
    2458      724662 :         IY1[-i] = IZ0[-i] * t_sin[c0_ind] - IZ1[-i] * t_sin[c1_ind] + IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] + RZ1[i] * t_sin[s1_ind] - RZ2[-i] * t_sin[s2_ind];
    2459             :     }
    2460             : 
    2461      736074 :     for ( ; i < m / 2; i++, c0_ind -= step, s0_ind += step, c1_ind += step, s1_ind -= step, c2_ind += step, s2_ind -= step )
    2462             :     {
    2463      730368 :         RY1[i] = RZ0[i] * t_sin[c0_ind] - RZ1[i] * t_sin[c1_ind] + RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] - IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind];
    2464      730368 :         IY1[-i] = IZ0[-i] * t_sin[c0_ind] - IZ1[-i] * t_sin[c1_ind] - IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] + RZ1[i] * t_sin[s1_ind] - RZ2[-i] * t_sin[s2_ind];
    2465             :     }
    2466             : 
    2467             :     /* m/2 */
    2468        5706 :     RY1[i] = RZ0[i] * t_sin[c0_ind] - RZ1[i] * t_sin[c1_ind] + RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] - IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind];
    2469             : 
    2470             :     /* Construction of Y2 */
    2471        5706 :     c0_ind = T_SIN_PI_2;
    2472        5706 :     s0_ind = 0;
    2473        5706 :     c1_ind = T_SIN_PI_2 * 1 / 3;
    2474        5706 :     s1_ind = T_SIN_PI_2 * 2 / 3;
    2475        5706 :     c2_ind = T_SIN_PI_2 * 1 / 3;
    2476        5706 :     s2_ind = T_SIN_PI_2 * 2 / 3;
    2477        5706 :     step2 = 2 * step;
    2478        5706 :     RY2[0] = RZ0[0] * t_sin[c0_ind] - RZ1[0] * t_sin[c1_ind] - RZ2[0] * t_sin[c2_ind] + IZ1[0] * t_sin[s1_ind] + IZ2[0] * t_sin[s2_ind];
    2479             : 
    2480        5706 :     c0_ind -= step2, s0_ind += step2, c1_ind -= step2, s1_ind += step2, c2_ind += step2, s2_ind -= step2;
    2481      365184 :     for ( i = 1; i < m / 8; i++, c0_ind -= step2, s0_ind += step2, c1_ind -= step2, s1_ind += step2, c2_ind += step2, s2_ind -= step2 )
    2482             :     {
    2483      359478 :         RY2[i] = RZ0[i] * t_sin[c0_ind] - RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] + IZ1[-i] * t_sin[s1_ind] + IZ2[i] * t_sin[s2_ind];
    2484      359478 :         IY2[-i] = IZ0[-i] * t_sin[c0_ind] - IZ1[-i] * t_sin[c1_ind] + IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] - RZ1[i] * t_sin[s1_ind] + RZ2[-i] * t_sin[s2_ind];
    2485             :     }
    2486             : 
    2487      370890 :     for ( ; i < m / 4; i++, c0_ind -= step2, s0_ind += step2, c1_ind += step2, s1_ind -= step2, c2_ind += step2, s2_ind -= step2 )
    2488             :     {
    2489      365184 :         RY2[i] = RZ0[i] * t_sin[c0_ind] + RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] + IZ1[-i] * t_sin[s1_ind] + IZ2[i] * t_sin[s2_ind];
    2490      365184 :         IY2[-i] = IZ0[-i] * t_sin[c0_ind] + IZ1[-i] * t_sin[c1_ind] + IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] - RZ1[i] * t_sin[s1_ind] + RZ2[-i] * t_sin[s2_ind];
    2491             :     }
    2492             : 
    2493      370890 :     for ( ; i < 3 * m / 8; i++, c0_ind -= step2, s0_ind += step2, c1_ind += step2, s1_ind -= step2, c2_ind -= step2, s2_ind += step2 )
    2494             :     {
    2495      365184 :         RY2[i] = RZ0[i] * t_sin[c0_ind] + RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] + IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind];
    2496      365184 :         IY2[-i] = IZ0[-i] * t_sin[c0_ind] + IZ1[-i] * t_sin[c1_ind] + IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] - RZ1[i] * t_sin[s1_ind] - RZ2[-i] * t_sin[s2_ind];
    2497             :     }
    2498             : 
    2499      370890 :     for ( ; i < m / 2; i++, c0_ind += step2, s0_ind -= step2, c1_ind += step2, s1_ind -= step2, c2_ind -= step2, s2_ind += step2 )
    2500             :     {
    2501      365184 :         RY2[i] = -RZ0[i] * t_sin[c0_ind] + RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] + IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind];
    2502      365184 :         IY2[-i] = -IZ0[-i] * t_sin[c0_ind] + IZ1[-i] * t_sin[c1_ind] + IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] - RZ1[i] * t_sin[s1_ind] - RZ2[-i] * t_sin[s2_ind];
    2503             :     }
    2504             : 
    2505             :     /* m/2 */
    2506        5706 :     RY2[i] = -RZ0[i] * t_sin[c0_ind] + RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] + IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind];
    2507             : 
    2508             :     /* Compute the inverse FFT for all 3 blocks. */
    2509        5706 :     ifft_rel( RY0, m, order );
    2510        5706 :     ifft_rel( RY1, m, order );
    2511        5706 :     ifft_rel( RY2, m, order );
    2512             : 
    2513        5706 :     y0 = RY0;
    2514        5706 :     y1 = RY1;
    2515        5706 :     y2 = RY2;
    2516             : 
    2517             :     /* Interlacing and scaling, scale = 1/3 */
    2518        5706 :     scale = 1.0f / 3;
    2519     2927178 :     for ( i = 0; i < n; )
    2520             :     {
    2521     2921472 :         X[i++] = ( *y0++ ) * scale;
    2522     2921472 :         X[i++] = ( *y1++ ) * scale;
    2523     2921472 :         X[i++] = ( *y2++ ) * scale;
    2524             :     }
    2525             : 
    2526        5706 :     return;
    2527             : }
    2528             : 
    2529             : 
    2530     3461762 : static void rfft_post(
    2531             :     const float *sine_table,
    2532             :     float *buf,
    2533             :     const int16_t len )
    2534             : {
    2535             :     float tmp1, tmp2, tmp3, tmp4, s, c;
    2536     3461762 :     int16_t i = 0;
    2537             : 
    2538     3461762 :     tmp1 = buf[0] + buf[1];
    2539     3461762 :     buf[1] = buf[0] - buf[1];
    2540     3461762 :     buf[0] = tmp1;
    2541             : 
    2542   557343682 :     for ( i = 1; i <= ( len + 2 ) / 4; i++ )
    2543             :     {
    2544   553881920 :         s = sine_table[i];           /* sin(pi*i/(len/2)) */
    2545   553881920 :         c = sine_table[i + len / 4]; /* cos(pi*i/(len/2)) */
    2546             : 
    2547   553881920 :         tmp1 = buf[2 * i] - buf[len - 2 * i];
    2548   553881920 :         tmp2 = buf[2 * i + 1] + buf[len - 2 * i + 1];
    2549   553881920 :         tmp3 = s * tmp1 - c * tmp2; /* real part of j*W(k,N)*[T(k) - T'(N-k)] */
    2550   553881920 :         tmp4 = c * tmp1 + s * tmp2; /* imag part of j*W(k,N)*[T(k) - T'(N-k)] */
    2551   553881920 :         tmp1 = buf[2 * i] + buf[len - 2 * i];
    2552   553881920 :         tmp2 = buf[2 * i + 1] - buf[len - 2 * i + 1];
    2553             : 
    2554   553881920 :         buf[2 * i] = 0.5f * ( tmp1 - tmp3 );
    2555   553881920 :         buf[2 * i + 1] = 0.5f * ( tmp2 - tmp4 );
    2556   553881920 :         buf[len - 2 * i] = 0.5f * ( tmp1 + tmp3 );
    2557   553881920 :         buf[len - 2 * i + 1] = -0.5f * ( tmp2 + tmp4 );
    2558             :     }
    2559     3461762 : }
    2560             : 
    2561     2450936 : static void rfft_pre(
    2562             :     const float *sine_table,
    2563             :     float *buf,
    2564             :     const int16_t len )
    2565             : {
    2566     2450936 :     const float scale = 1.0f / len;
    2567             :     float tmp1, tmp2, tmp3, tmp4, s, c;
    2568     2450936 :     int16_t i = 0;
    2569             : 
    2570     2450936 :     tmp1 = buf[0] + buf[1];
    2571     2450936 :     buf[1] = scale * ( buf[0] - buf[1] );
    2572     2450936 :     buf[0] = scale * tmp1;
    2573             : 
    2574   394600696 :     for ( i = 1; i <= ( len + 2 ) / 4; i++ )
    2575             :     {
    2576   392149760 :         s = sine_table[i];           /* sin(pi*i/(len/2)) */
    2577   392149760 :         c = sine_table[i + len / 4]; /* cos(pi*i/(len/2)) */
    2578             : 
    2579   392149760 :         tmp1 = buf[2 * i] - buf[len - 2 * i];
    2580   392149760 :         tmp2 = buf[2 * i + 1] + buf[len - 2 * i + 1];
    2581   392149760 :         tmp3 = s * tmp1 + c * tmp2;  /* real part of j*W(k,N)*[T(k) - T'(N-k)] */
    2582   392149760 :         tmp4 = -c * tmp1 + s * tmp2; /* imag part of j*W(k,N)*[T(k) - T'(N-k)] */
    2583   392149760 :         tmp1 = buf[2 * i] + buf[len - 2 * i];
    2584   392149760 :         tmp2 = buf[2 * i + 1] - buf[len - 2 * i + 1];
    2585             : 
    2586   392149760 :         buf[2 * i] = scale * ( tmp1 + tmp3 );
    2587   392149760 :         buf[2 * i + 1] = -scale * ( tmp2 + tmp4 );
    2588   392149760 :         buf[len - 2 * i] = scale * ( tmp1 - tmp3 );
    2589   392149760 :         buf[len - 2 * i + 1] = scale * ( tmp2 - tmp4 );
    2590             :     }
    2591             : 
    2592     2450936 :     return;
    2593             : }
    2594             : 
    2595    10937110 : int16_t RFFTN(
    2596             :     float *data,
    2597             :     const float *sine_table,
    2598             :     const int16_t len,
    2599             :     const int16_t sign )
    2600             : {
    2601    10937110 :     assert( len <= 640 && len > 0 );
    2602             : 
    2603    10937110 :     if ( len == 640 )
    2604             :     {
    2605             :         float x[320], y[320];
    2606             :         int16_t i;
    2607             : 
    2608     5912698 :         if ( sign != -1 )
    2609             :         {
    2610     2450936 :             rfft_pre( sine_table, data, len );
    2611             :         }
    2612             : 
    2613  1897976058 :         for ( i = 0; i < 320; i++ )
    2614             :         {
    2615  1892063360 :             x[i] = data[2 * i];
    2616  1892063360 :             y[i] = data[2 * i + 1];
    2617             :         }
    2618     5912698 :         DoRTFT320( x, y );
    2619  1897976058 :         for ( i = 0; i < 320; i++ )
    2620             :         {
    2621  1892063360 :             data[2 * i] = x[i];
    2622  1892063360 :             data[2 * i + 1] = y[i];
    2623             :         }
    2624             : 
    2625     5912698 :         if ( sign == -1 )
    2626             :         {
    2627     3461762 :             rfft_post( sine_table, data, len );
    2628             :         }
    2629             :     }
    2630             :     else
    2631             :     {
    2632     5024412 :         if ( len == 512 )
    2633             :         {
    2634             :             int16_t i;
    2635     5024412 :             const int16_t log2 = 9;
    2636             :             float reordered_data[512];
    2637             : 
    2638     5024412 :             if ( sign == -1 )
    2639             :             {
    2640     3070070 :                 fft_rel( data, len, log2 );
    2641     3070070 :                 reordered_data[0] = data[0];
    2642     3070070 :                 reordered_data[1] = data[len / 2];
    2643   785937920 :                 for ( i = 1; i < len / 2; i++ )
    2644             :                 {
    2645   782867850 :                     reordered_data[2 * i] = data[i];
    2646   782867850 :                     reordered_data[2 * i + 1] = data[len - i];
    2647             :                 }
    2648             :             }
    2649             :             else
    2650             :             {
    2651     1954342 :                 reordered_data[0] = data[0];
    2652     1954342 :                 reordered_data[len / 2] = data[1];
    2653   500311552 :                 for ( i = 1; i < len / 2; i++ )
    2654             :                 {
    2655   498357210 :                     reordered_data[i] = data[2 * i];
    2656   498357210 :                     reordered_data[len - i] = data[2 * i + 1];
    2657             :                 }
    2658     1954342 :                 ifft_rel( reordered_data, len, log2 );
    2659             :             }
    2660     5024412 :             mvr2r( reordered_data, data, len );
    2661             :         }
    2662             :         else
    2663             :         {
    2664           0 :             assert( !"Not supported FFT length!" );
    2665             :         }
    2666             :     }
    2667             : 
    2668    10937110 :     return 0;
    2669             : }
    2670             : 
    2671   633133170 : static void butterfly(
    2672             :     const float a,
    2673             :     const float b,
    2674             :     float *aPlusb,
    2675             :     float *aMinusb )
    2676             : {
    2677   633133170 :     *aPlusb = a + b;
    2678   633133170 :     *aMinusb = a - b;
    2679             : 
    2680   633133170 :     return;
    2681             : }
    2682             : 
    2683   420242480 : static void fft2(
    2684             :     float *pInOut )
    2685             : {
    2686             :     /*  FFT MATRIX:
    2687             :         1.0000             1.0000
    2688             :         1.0000            -1.0000
    2689             :     */
    2690             :     float re1, im1;
    2691             :     float re2, im2;
    2692             : 
    2693   420242480 :     re1 = pInOut[0];
    2694   420242480 :     im1 = pInOut[1];
    2695   420242480 :     re2 = pInOut[2];
    2696   420242480 :     im2 = pInOut[3];
    2697   420242480 :     pInOut[0] = re1 + re2;
    2698   420242480 :     pInOut[1] = im1 + im2;
    2699             : 
    2700   420242480 :     pInOut[2] = re1 - re2;
    2701   420242480 :     pInOut[3] = im1 - im2;
    2702             : 
    2703   420242480 :     return;
    2704             : }
    2705             : 
    2706             : static const float C31 = 0.5f;               /* cos(PI/3); sin(2*PI/3) */
    2707             : static const float C32 = 0.866025403784439f; /* cos(PI/3); sin(2*PI/3) */
    2708             : 
    2709   280280320 : static void fft3_2(
    2710             :     float *pInOut )
    2711             : {
    2712             :     float re1, im1;
    2713             :     float re2, im2;
    2714             :     float re3, im3;
    2715             : 
    2716             :     float tmp1, tmp2;
    2717             :     float tmp3, tmp4;
    2718             : 
    2719   280280320 :     re1 = pInOut[0];
    2720   280280320 :     im1 = pInOut[1];
    2721   280280320 :     re2 = pInOut[2];
    2722   280280320 :     im2 = pInOut[3];
    2723   280280320 :     re3 = pInOut[4];
    2724   280280320 :     im3 = pInOut[5];
    2725             : 
    2726             :     /*  FFT MATRIX:
    2727             :        1.0000             1.0000             1.0000
    2728             :                             C31      C32
    2729             :        1.0000            -0.5000 - 0.8660i  -0.5000 + 0.8660i
    2730             :        1.0000            -0.5000 + 0.8660i  -0.5000 - 0.8660i
    2731             :     */
    2732   280280320 :     tmp1 = re2 + re3;
    2733   280280320 :     tmp3 = im2 + im3;
    2734   280280320 :     tmp2 = re2 - re3;
    2735   280280320 :     tmp4 = im2 - im3;
    2736   280280320 :     pInOut[0] = re1 + tmp1;
    2737   280280320 :     pInOut[1] = im1 + tmp3;
    2738   280280320 :     pInOut[2] = re1 - C31 * tmp1 + C32 * tmp4;
    2739   280280320 :     pInOut[4] = re1 - C31 * tmp1 - C32 * tmp4;
    2740             : 
    2741   280280320 :     pInOut[3] = im1 - C32 * tmp2 - C31 * tmp3;
    2742   280280320 :     pInOut[5] = im1 + C32 * tmp2 - C31 * tmp3;
    2743   280280320 : }
    2744             : 
    2745             : 
    2746        2275 : static void fft4(
    2747             :     float *pInOut )
    2748             : {
    2749             :     float re1, im1;
    2750             :     float re2, im2;
    2751             :     float re3, im3;
    2752             :     float re4, im4;
    2753             : 
    2754             :     float tmp1, tmp2;
    2755             :     float tmp3, tmp4;
    2756             :     float tmp5, tmp6;
    2757             :     float tmp7, tmp8;
    2758             : 
    2759        2275 :     re1 = pInOut[0];
    2760        2275 :     im1 = pInOut[1];
    2761        2275 :     re2 = pInOut[2];
    2762        2275 :     im2 = pInOut[3];
    2763        2275 :     re3 = pInOut[4];
    2764        2275 :     im3 = pInOut[5];
    2765        2275 :     re4 = pInOut[6];
    2766        2275 :     im4 = pInOut[7];
    2767             : 
    2768             :     /*
    2769             :      1.0000    1.0000      1.0000    1.0000
    2770             :      1.0000   -1.0000i    -1.0000    1.0000i
    2771             :      1.0000   -1.0000      1.0000   -1.0000
    2772             :      1.0000    1.0000i    -1.0000   -1.0000i
    2773             :     */
    2774        2275 :     tmp1 = re1 + re3;
    2775        2275 :     tmp3 = re2 + re4;
    2776        2275 :     tmp5 = im1 + im3;
    2777        2275 :     tmp7 = im2 + im4;
    2778        2275 :     pInOut[0] = tmp1 + tmp3;
    2779        2275 :     pInOut[4] = tmp1 - tmp3;
    2780             : 
    2781        2275 :     pInOut[1] = tmp5 + tmp7;
    2782        2275 :     pInOut[5] = tmp5 - tmp7;
    2783        2275 :     tmp2 = re1 - re3;
    2784        2275 :     tmp4 = re2 - re4;
    2785        2275 :     tmp6 = im1 - im3;
    2786        2275 :     tmp8 = im2 - im4;
    2787        2275 :     pInOut[2] = tmp2 + tmp8;
    2788        2275 :     pInOut[6] = tmp2 - tmp8;
    2789             : 
    2790        2275 :     pInOut[3] = -tmp4 + tmp6;
    2791        2275 :     pInOut[7] = tmp4 + tmp6;
    2792             : 
    2793        2275 :     return;
    2794             : }
    2795             : 
    2796             : static const float C51 = 0.309016994374947f; /* cos(2*PI/5);   */
    2797             : static const float C52 = 0.951056516295154f; /* sin(2*PI/5);   */
    2798             : static const float C53 = 0.809016994374947f; /* cos(  PI/5);   */
    2799             : static const float C54 = 0.587785252292473f; /* sin(  PI/5);   */
    2800             : 
    2801   169679512 : static void fft5(
    2802             :     float *pInOut )
    2803             : {
    2804             :     float re1, im1;
    2805             :     float re2, im2;
    2806             :     float re3, im3;
    2807             :     float re4, im4;
    2808             :     float re5, im5;
    2809             : 
    2810             :     float tmp1, tmp2;
    2811             :     float tmp3, tmp4;
    2812             :     float tmp5, tmp6;
    2813             :     float tmp7, tmp8;
    2814             : 
    2815             : 
    2816   169679512 :     re1 = pInOut[0];
    2817   169679512 :     im1 = pInOut[1];
    2818   169679512 :     re2 = pInOut[2];
    2819   169679512 :     im2 = pInOut[3];
    2820   169679512 :     re3 = pInOut[4];
    2821   169679512 :     im3 = pInOut[5];
    2822   169679512 :     re4 = pInOut[6];
    2823   169679512 :     im4 = pInOut[7];
    2824   169679512 :     re5 = pInOut[8];
    2825   169679512 :     im5 = pInOut[9];
    2826             : 
    2827             :     /*
    2828             :      1.0000             1.0000             1.0000             1.0000             1.0000
    2829             :                           C51      C52      C53       C54
    2830             :      1.0000             0.3090 - 0.9511i  -0.8090 - 0.5878i  -0.8090 + 0.5878i   0.3090 + 0.9511i
    2831             :      1.0000            -0.8090 - 0.5878i   0.3090 + 0.9511i   0.3090 - 0.9511i  -0.8090 + 0.5878i
    2832             :      1.0000            -0.8090 + 0.5878i   0.3090 - 0.9511i   0.3090 + 0.9511i  -0.8090 - 0.5878i
    2833             :      1.0000             0.3090 + 0.9511i  -0.8090 + 0.5878i  -0.8090 - 0.5878i   0.3090 - 0.9511i
    2834             :     */
    2835   169679512 :     tmp1 = re2 + re5;
    2836   169679512 :     tmp2 = re2 - re5;
    2837   169679512 :     tmp3 = im2 + im5;
    2838   169679512 :     tmp4 = im2 - im5;
    2839   169679512 :     tmp5 = re3 + re4;
    2840   169679512 :     tmp6 = re3 - re4;
    2841   169679512 :     tmp7 = im3 + im4;
    2842   169679512 :     tmp8 = im3 - im4;
    2843             : 
    2844             : 
    2845   169679512 :     pInOut[0] = re1 + tmp1 + tmp5;
    2846   169679512 :     pInOut[1] = im1 + tmp3 + tmp7;
    2847             : 
    2848   169679512 :     pInOut[2] = re1 + C51 * tmp1 - C53 * tmp5 + C52 * tmp4 + C54 * tmp8;
    2849   169679512 :     pInOut[8] = re1 + C51 * tmp1 - C53 * tmp5 - C52 * tmp4 - C54 * tmp8;
    2850   169679512 :     pInOut[3] = im1 - C52 * tmp2 - C54 * tmp6 + C51 * tmp3 - C53 * tmp7;
    2851   169679512 :     pInOut[9] = im1 + C52 * tmp2 + C54 * tmp6 + C51 * tmp3 - C53 * tmp7;
    2852   169679512 :     pInOut[4] = re1 - C53 * tmp1 + C51 * tmp5 + C54 * tmp4 - C52 * tmp8;
    2853   169679512 :     pInOut[6] = re1 - C53 * tmp1 + C51 * tmp5 - C54 * tmp4 + C52 * tmp8;
    2854   169679512 :     pInOut[5] = im1 - C54 * tmp2 + C52 * tmp6 - C53 * tmp3 + C51 * tmp7;
    2855   169679512 :     pInOut[7] = im1 + C54 * tmp2 - C52 * tmp6 - C53 * tmp3 + C51 * tmp7;
    2856             : 
    2857   169679512 :     return;
    2858             : }
    2859             : 
    2860             : static const float C81 = 0.707106781186548f; /* cos(PI/4);   */
    2861             : 
    2862   105522195 : static void fft8_2(
    2863             :     float *pInOut )
    2864             : {
    2865             :     float re0, im0, re4, im4;
    2866             : 
    2867             :     float re1_7p, re1_7m;
    2868             :     float im1_7p, im1_7m;
    2869             :     float re2_6p, re2_6m;
    2870             :     float im2_6p, im2_6m;
    2871             :     float re3_5p, re3_5m;
    2872             :     float im3_5p, im3_5m;
    2873             : 
    2874   105522195 :     re0 = pInOut[0];
    2875   105522195 :     im0 = pInOut[1];
    2876   105522195 :     re4 = pInOut[8];
    2877   105522195 :     im4 = pInOut[9];
    2878   105522195 :     butterfly( pInOut[1 * 2], pInOut[7 * 2], &re1_7p, &re1_7m );
    2879   105522195 :     butterfly( pInOut[1 * 2 + 1], pInOut[7 * 2 + 1], &im1_7p, &im1_7m );
    2880   105522195 :     butterfly( pInOut[2 * 2], pInOut[6 * 2], &re2_6p, &re2_6m );
    2881   105522195 :     butterfly( pInOut[2 * 2 + 1], pInOut[6 * 2 + 1], &im2_6p, &im2_6m );
    2882   105522195 :     butterfly( pInOut[3 * 2], pInOut[5 * 2], &re3_5p, &re3_5m );
    2883   105522195 :     butterfly( pInOut[3 * 2 + 1], pInOut[5 * 2 + 1], &im3_5p, &im3_5m );
    2884             : 
    2885             :     /*
    2886             :     0:  1 + 0i     1   + 0i    1 + 0i        1 +   0i    1 + 0i      1 +   0i     1 + 0i      1 +   0i
    2887             :     1:  1 + 0i   C81 - C81i    0 - 1i     -C81 - C81i   -1 - 0i   -C81 + C81i   - 0 + 1i    C81 + C81i
    2888             :     2:  1 + 0i     0 -   1i   -1 - 0i     -  0 +   1i    1 + 0i      0 -   1i   - 1 - 0i   -  0 +   1i
    2889             :     3:  1 + 0i  -C81 - C81i   -0 + 1i      C81 - C81i   -1 - 0i    C81 + C81i     0 - 1i   -C81 + C81i
    2890             :     4:  1 + 0i  -  1 -   0i    1 + 0i     -  1 -   0i    1 + 0i   -  1 -   0i     1 + 0i   -  1 -   0i
    2891             :     5:  1 + 0i  -C81 + C81i    0 - 1i      C81 + C81i   -1 - 0i    C81 - C81i   - 0 + 1i   -C81 - C81i
    2892             :     6:  1 + 0i  -  0 +   1i   -1 - 0i        0 -   1i    1 + 0i   -  0 +   1i   - 1 - 0i    - 0 -   1i
    2893             :     7:  1 + 0i   C81 + C81i   -0 + 1i     -C81 + C81i   -1 - 0i   -C81 - C81i   - 0 - 1i    C81 - C81i
    2894             :     */
    2895   105522195 :     pInOut[0] = re0 + re4 + re1_7p + re2_6p + re3_5p;
    2896   105522195 :     pInOut[1] = im0 + im4 + im1_7p + im2_6p + im3_5p;
    2897             : 
    2898   105522195 :     pInOut[2] = re0 + C81 * ( re1_7p - re3_5p ) - re4 + C81 * ( im1_7m + im3_5m ) + im2_6m;
    2899   105522195 :     pInOut[3] = im0 + C81 * ( im1_7p - im3_5p ) - im4 - C81 * ( re1_7m + re3_5m ) - re2_6m;
    2900             : 
    2901   105522195 :     pInOut[4] = re0 - re2_6p + re4 + im1_7m - im3_5m;
    2902   105522195 :     pInOut[5] = im0 - im2_6p + im4 - re1_7m + re3_5m;
    2903             : 
    2904   105522195 :     pInOut[6] = re0 + C81 * ( -re1_7p + re3_5p ) - re4 + C81 * ( im1_7m + im3_5m ) - im2_6m;
    2905   105522195 :     pInOut[7] = im0 + C81 * ( -im1_7p + im3_5p ) - im4 - C81 * ( re1_7m + re3_5m ) + re2_6m;
    2906             : 
    2907   105522195 :     pInOut[8] = re0 - re1_7p + re2_6p - re3_5p + re4;
    2908   105522195 :     pInOut[9] = im0 - im1_7p + im2_6p - im3_5p + im4;
    2909             : 
    2910   105522195 :     pInOut[10] = re0 + C81 * ( -re1_7p + re3_5p ) - re4 - C81 * ( im1_7m + im3_5m ) + im2_6m;
    2911   105522195 :     pInOut[11] = im0 + C81 * ( -im1_7p + im3_5p ) - im4 + C81 * ( re1_7m + re3_5m ) - re2_6m;
    2912             : 
    2913   105522195 :     pInOut[12] = re0 - re2_6p + re4 - im1_7m + im3_5m;
    2914   105522195 :     pInOut[13] = im0 - im2_6p + im4 + re1_7m - re3_5m;
    2915             : 
    2916   105522195 :     pInOut[14] = re0 + C81 * ( re1_7p - re3_5p ) - re4 - C81 * ( im1_7m + im3_5m ) - im2_6m;
    2917   105522195 :     pInOut[15] = im0 + C81 * ( im1_7p - im3_5p ) - im4 + C81 * ( re1_7m + re3_5m ) + re2_6m;
    2918             : 
    2919   105522195 :     return;
    2920             : }
    2921             : 
    2922   105902800 : static void nextFFT(
    2923             :     float *x,
    2924             :     const int16_t length )
    2925             : {
    2926   105902800 :     switch ( length )
    2927             :     {
    2928           0 :         case 2:
    2929           0 :             fft2( x );
    2930           0 :             break;
    2931           0 :         case 3:
    2932           0 :             fft3_2( x );
    2933           0 :             break;
    2934           0 :         case 4:
    2935           0 :             fft4( x );
    2936           0 :             break;
    2937      842180 :         case 5:
    2938      842180 :             fft5( x );
    2939      842180 :             break;
    2940   105060620 :         case 8:
    2941   105060620 :             fft8_2( x );
    2942   105060620 :             break;
    2943           0 :         default:
    2944           0 :             assert( !"length not supported" );
    2945             :             break;
    2946             :     }
    2947             : 
    2948   105902800 :     return;
    2949             : }
    2950             : 
    2951             : static const int16_t CTFFTfactors[] = { 9, 8, 7, 5, 4, 3, 2, 0 };
    2952             : 
    2953    52698746 : static __inline int16_t findFactor(
    2954             :     const int16_t length )
    2955             : {
    2956    52698746 :     int16_t i = 0;
    2957    52698746 :     int16_t factor = 0;
    2958             : 
    2959   105734364 :     while ( CTFFTfactors[i] != 0 )
    2960             :     {
    2961   105734364 :         if ( 0 == ( length % CTFFTfactors[i] ) )
    2962             :         {
    2963    52698746 :             factor = CTFFTfactors[i];
    2964    52698746 :             break;
    2965             :         }
    2966    53035618 :         i++;
    2967             :     }
    2968    52698746 :     return factor;
    2969             : }
    2970             : 
    2971    52698746 : static __inline void twiddle(
    2972             :     float *x,
    2973             :     const int16_t length,
    2974             :     const int16_t n1,
    2975             :     const int16_t n2 )
    2976             : {
    2977             :     int16_t i, ii;
    2978    52698746 :     double pi = 4. * atan( 1. );
    2979             :     float sinValOrg, cosValOrg;
    2980    52698746 :     float sinVal = 0.f, cosVal = 1.f;
    2981    52698746 :     float twReal = 0.f, twImag = 1.f;
    2982             : 
    2983    52698746 :     cosValOrg = (float) cos( -2 * pi * 1. / (double) length );
    2984    52698746 :     sinValOrg = (float) sin( -2 * pi * 1. / (double) length );
    2985   421084660 :     for ( i = 1; i < n1; i++ )
    2986             :     {
    2987             :         float tmp;
    2988   368385914 :         twReal = 1.f;
    2989   368385914 :         twImag = 0.f;
    2990   368385914 :         tmp = cosVal * cosValOrg - sinVal * sinValOrg;
    2991   368385914 :         sinVal = sinVal * cosValOrg + cosVal * sinValOrg;
    2992   368385914 :         cosVal = tmp;
    2993   738793060 :         for ( ii = 1; ii < n2; ii++ )
    2994             :         {
    2995             :             float xRe, xIm, tmpReal;
    2996             :             /* cos(x+y) = cos(x)*cos(y) - sin(x)*sin(y); */
    2997             :             /* sin(x+y) = sin(x)*cos(y) + sin(y)*cos(x); */
    2998   370407146 :             tmpReal = twReal * cosVal - twImag * sinVal;
    2999   370407146 :             twImag = twImag * cosVal + sinVal * twReal;
    3000   370407146 :             twReal = tmpReal;
    3001   370407146 :             xRe = x[2 * ( i * n2 + ii )];
    3002   370407146 :             xIm = x[2 * ( i * n2 + ii ) + 1];
    3003   370407146 :             x[2 * ( i * n2 + ii )] = twReal * xRe - twImag * xIm;
    3004   370407146 :             x[2 * ( i * n2 + ii ) + 1] = twImag * xRe + twReal * xIm;
    3005             :         }
    3006   368385914 :         tmp = cosVal;
    3007             :     }
    3008             : 
    3009    52698746 :     return;
    3010             : }
    3011             : 
    3012   922522728 : static void cooleyTukeyFFT(
    3013             :     float *x,
    3014             :     const int16_t length,
    3015             :     float *scratch )
    3016             : {
    3017             :     int16_t factor;
    3018             :     int16_t i, ii;
    3019             :     int16_t n1, n2;
    3020   922522728 :     int16_t cnt = 0;
    3021             :     float *src, *dest;
    3022             : 
    3023   922522728 :     switch ( length )
    3024             :     {
    3025           0 :         case 1:
    3026           0 :             break;
    3027   420242480 :         case 2:
    3028   420242480 :             fft2( x );
    3029   420242480 :             break;
    3030   280280320 :         case 3:
    3031   280280320 :             fft3_2( x );
    3032   280280320 :             break;
    3033        2275 :         case 4:
    3034        2275 :             fft4( x );
    3035        2275 :             break;
    3036   168837332 :         case 5:
    3037   168837332 :             fft5( x );
    3038   168837332 :             break;
    3039      461575 :         case 8:
    3040      461575 :             fft8_2( x );
    3041      461575 :             break;
    3042    52698746 :         default:
    3043             :         {
    3044    52698746 :             factor = findFactor( length );
    3045    52698746 :             if ( factor > 0 && ( length / factor > 1 ) )
    3046             :             {
    3047    52698746 :                 n1 = factor;
    3048    52698746 :                 n2 = length / factor;
    3049             : 
    3050             :                 /* DATA Resorting for stage1 */
    3051    52698746 :                 dest = scratch;
    3052   473783406 :                 for ( i = 0; i < 2 * n1; i += 2 )
    3053             :                 {
    3054   421084660 :                     src = x + i;
    3055  1265780520 :                     for ( ii = 0; ii < n2; ii++ )
    3056             :                     {
    3057             :                         /* *dest++ = x[2*(i+ii*n1)]; */
    3058             :                         /* *dest++ = x[2*(i+ii*n1)+1]; */
    3059   844695860 :                         *dest++ = *src;
    3060   844695860 :                         *dest++ = *( src + 1 );
    3061   844695860 :                         src += 2 * n1;
    3062             :                     }
    3063             :                 }
    3064    52698746 :                 src = scratch;
    3065    52698746 :                 dest = x;
    3066   897394606 :                 for ( i = 0; i < length; i++ )
    3067             :                 {
    3068   844695860 :                     *dest++ = *src++;
    3069   844695860 :                     *dest++ = *src++;
    3070             :                 }
    3071             :                 /* perform n1 ffts of length n2 */
    3072   473783406 :                 for ( i = 0; i < n1; i++ )
    3073             :                 {
    3074   421084660 :                     cooleyTukeyFFT( x + 2 * i * n2, n2, scratch + 2 * i * n2 );
    3075             :                 }
    3076             :                 /*data twiddeling */
    3077    52698746 :                 twiddle( x, length, n1, n2 );
    3078             :                 /* DATA Resorting for stage2 */
    3079    52698746 :                 cnt = 0;
    3080   158601546 :                 for ( i = 0; i < n2; i++ )
    3081             :                 {
    3082   950598660 :                     for ( ii = 0; ii < n1; ii++ )
    3083             :                     {
    3084   844695860 :                         scratch[2 * cnt] = x[2 * ( i + ii * n2 )];
    3085   844695860 :                         scratch[2 * cnt + 1] = x[2 * ( i + ii * n2 ) + 1];
    3086   844695860 :                         cnt++;
    3087             :                     }
    3088             :                 }
    3089             :                 /* perform n2 ffts of length n1 */
    3090   158601546 :                 for ( i = 0; i < n2; i++ )
    3091             :                 {
    3092   105902800 :                     nextFFT( scratch + 2 * i * n1, n1 );
    3093             :                 }
    3094    52698746 :                 cnt = 0;
    3095   473783406 :                 for ( i = 0; i < n1; i++ )
    3096             :                 {
    3097  1265780520 :                     for ( ii = 0; ii < n2; ii++ )
    3098             :                     {
    3099   844695860 :                         x[2 * cnt] = scratch[2 * ( i + ii * n1 )];
    3100   844695860 :                         x[2 * cnt + 1] = scratch[2 * ( i + ii * n1 ) + 1];
    3101   844695860 :                         cnt++;
    3102             :                     }
    3103             :                 }
    3104             :             }
    3105             :             else
    3106             :             {
    3107           0 :                 assert( !"length not supported" );
    3108             :             }
    3109             :         }
    3110             :     }
    3111             : 
    3112   922522728 :     return;
    3113             : }
    3114             : 
    3115   340219121 : static void pfaDFT(
    3116             :     float *x,
    3117             :     const int16_t length,
    3118             :     float *scratch1,
    3119             :     const int16_t numFactors,
    3120             :     const int16_t *factor )
    3121             : {
    3122             :     int16_t i, ii;
    3123             :     int16_t cnt;
    3124             : 
    3125   340219121 :     if ( numFactors > 1 )
    3126             :     {
    3127    59551276 :         float *tmp = scratch1;
    3128    59551276 :         int16_t n1_inv = 1, n2_inv = 1;
    3129    59551276 :         int16_t n2 = factor[0 /*idx*/];
    3130    59551276 :         int16_t n1 = length / n2;
    3131             :         int16_t idx, incr;
    3132             : 
    3133   164964757 :         while ( ( ( n1_inv * n1 ) % n2 ) != 1 )
    3134             :         {
    3135   105413481 :             n1_inv++;
    3136             :         }
    3137   115595894 :         while ( ( ( n2_inv * n2 ) % n1 ) != 1 )
    3138             :         {
    3139    56044618 :             n2_inv++;
    3140             :         }
    3141    59551276 :         idx = 0;
    3142    59551276 :         incr = n1 * n1_inv;
    3143    59551276 :         cnt = 0;
    3144   280321499 :         for ( i = 0; i < n1; i++ )
    3145             :         {
    3146  1685027620 :             for ( ii = 0; ii < n2 - 1; ii++ )
    3147             :             {
    3148  1464257397 :                 tmp[cnt++] = x[2 * idx];
    3149  1464257397 :                 tmp[cnt++] = x[2 * idx + 1];
    3150             : 
    3151  1464257397 :                 idx += incr;
    3152  1464257397 :                 if ( idx > length )
    3153             :                 {
    3154   962616092 :                     idx -= length;
    3155             :                 }
    3156             :             }
    3157   220770223 :             tmp[cnt++] = x[2 * idx];
    3158   220770223 :             tmp[cnt++] = x[2 * idx + 1];
    3159   220770223 :             idx++;
    3160             :         }
    3161   280321499 :         for ( cnt = 0; cnt < length; cnt += n2 )
    3162             :         {
    3163   220770223 :             cooleyTukeyFFT( tmp + 2 * cnt, n2, x + 2 * cnt );
    3164             :         }
    3165   280321499 :         for ( cnt = 0; cnt < n1; cnt++ )
    3166             :         {
    3167  1905797843 :             for ( i = 0; i < n2; i++ )
    3168             :             {
    3169  1685027620 :                 x[2 * ( cnt + i * n1 )] = tmp[2 * ( cnt * n2 + i )];
    3170  1685027620 :                 x[2 * ( cnt + i * n1 ) + 1] = tmp[2 * ( cnt * n2 + i ) + 1];
    3171             :             }
    3172             :         }
    3173   396253555 :         for ( cnt = 0; cnt < length; cnt += n1 )
    3174             :         {
    3175   336702279 :             pfaDFT( x + 2 * cnt, n1, tmp, numFactors - 1, &factor[1] );
    3176             :         }
    3177    59551276 :         idx = 0;
    3178    59551276 :         cnt = 0;
    3179   396253555 :         for ( i = 0; i < n2; i++ )
    3180             :         {
    3181   336702279 :             idx = i * n1;
    3182  2021729899 :             for ( ii = 0; ii < n1; ii++ )
    3183             :             {
    3184  1685027620 :                 tmp[2 * idx] = x[cnt++];
    3185  1685027620 :                 tmp[2 * idx + 1] = x[cnt++];
    3186  1685027620 :                 idx += n2;
    3187  1685027620 :                 if ( idx > length )
    3188             :                 {
    3189   277151003 :                     idx -= length;
    3190             :                 }
    3191             :             }
    3192             :         }
    3193  1744578896 :         for ( cnt = 0; cnt < length; cnt++ )
    3194             :         {
    3195  1685027620 :             x[2 * cnt] = tmp[2 * cnt];
    3196  1685027620 :             x[2 * cnt + 1] = tmp[2 * cnt + 1];
    3197             :         }
    3198             :     }
    3199             :     else
    3200             :     {
    3201   280667845 :         cooleyTukeyFFT( x, length, scratch1 );
    3202             :     }
    3203             : 
    3204   340219121 :     return;
    3205             : }
    3206             : 
    3207     3516842 : static void fftf_interleave(
    3208             :     float *re,
    3209             :     float *im,
    3210             :     float *out,
    3211             :     const int16_t len )
    3212             : {
    3213     3516842 :     int16_t i = 0;
    3214             : 
    3215   847703502 :     for ( i = 0; i < len; i++ )
    3216             :     {
    3217   844186660 :         *out++ = *re++;
    3218   844186660 :         *out++ = *im++;
    3219             :     }
    3220             : 
    3221     3516842 :     return;
    3222             : }
    3223             : 
    3224     3516842 : static void fftf_deinterleave(
    3225             :     float *in,
    3226             :     float *re,
    3227             :     float *im,
    3228             :     const int16_t len )
    3229             : {
    3230     3516842 :     int16_t i = 0;
    3231             : 
    3232   847703502 :     for ( i = 0; i < len; i++ )
    3233             :     {
    3234   844186660 :         *re++ = *in++;
    3235   844186660 :         *im++ = *in++;
    3236             :     }
    3237             : 
    3238     3516842 :     return;
    3239             : }
    3240             : 
    3241        1442 : static void DoRTFT600(
    3242             :     float *x, /* i/o: real part of input and output data       */
    3243             :     float *y  /* i/o: imaginary part of input and output data  */
    3244             : )
    3245             : {
    3246             :     float scratch[1200], cmplx[1200];
    3247        1442 :     const int16_t factors[3] = { 25, 8, 3 };
    3248             : 
    3249        1442 :     fftf_interleave( x, y, cmplx, 600 );
    3250        1442 :     pfaDFT( cmplx, 600, scratch, 3, factors );
    3251        1442 :     fftf_deinterleave( cmplx, x, y, 600 );
    3252             : 
    3253        1442 :     return;
    3254             : }
    3255             : 
    3256        1273 : static void DoRTFT400(
    3257             :     float *x, /* i/o: real part of input and output data       */
    3258             :     float *y  /* i/o: imaginary part of input and output data  */
    3259             : )
    3260             : {
    3261             :     float scratch[800], cmplx[800];
    3262        1273 :     const int16_t factors[2] = { 25, 16 };
    3263             : 
    3264        1273 :     fftf_interleave( x, y, cmplx, 400 );
    3265        1273 :     pfaDFT( cmplx, 400, scratch, 2, factors );
    3266        1273 :     fftf_deinterleave( cmplx, x, y, 400 );
    3267             : 
    3268             : 
    3269        1273 :     return;
    3270             : }
    3271             : 
    3272     3499899 : static void DoRTFT240(
    3273             :     float *x, /* i/o: real part of input and output data       */
    3274             :     float *y  /* i/o: imaginary part of input and output data  */
    3275             : )
    3276             : {
    3277             :     float scratch[480], cmplx[480];
    3278     3499899 :     const int16_t factors[3] = { 16, 5, 3 };
    3279             : 
    3280     3499899 :     fftf_interleave( x, y, cmplx, 240 );
    3281     3499899 :     pfaDFT( cmplx, 240, scratch, 3, factors );
    3282     3499899 :     fftf_deinterleave( cmplx, x, y, 240 );
    3283             : 
    3284     3499899 :     return;
    3285             : }
    3286             : 
    3287       14137 : static void DoRTFT200(
    3288             :     float *x, /* i/o: real part of input and output data       */
    3289             :     float *y  /* i/o: imaginary part of input and output data  */
    3290             : )
    3291             : {
    3292             :     float scratch[400], cmplx[400];
    3293       14137 :     const int16_t factors[2] = { 25, 8 };
    3294             : 
    3295       14137 :     fftf_interleave( x, y, cmplx, 200 );
    3296       14137 :     pfaDFT( cmplx, 200, scratch, 2, factors );
    3297       14137 :     fftf_deinterleave( cmplx, x, y, 200 );
    3298             : 
    3299       14137 :     return;
    3300             : }
    3301             : 
    3302          91 : static void DoRTFT100(
    3303             :     float *x, /* i/o: real part of input and output data       */
    3304             :     float *y  /* i/o: imaginary part of input and output data  */
    3305             : )
    3306             : {
    3307             :     float scratch[200], cmplx[200];
    3308          91 :     const int16_t factors[2] = { 25, 4 };
    3309             : 
    3310          91 :     fftf_interleave( x, y, cmplx, 100 );
    3311          91 :     pfaDFT( cmplx, 100, scratch, 2, factors );
    3312          91 :     fftf_deinterleave( cmplx, x, y, 100 );
    3313             : 
    3314          91 :     return;
    3315             : }
    3316             : 
    3317             : 
    3318    23650403 : void DoFFT(
    3319             :     float *re2,
    3320             :     float *im2,
    3321             :     const int16_t length )
    3322             : {
    3323    23650403 :     switch ( length )
    3324             :     {
    3325        1442 :         case 600:
    3326        1442 :             DoRTFT600( re2, im2 );
    3327        1442 :             break;
    3328      340315 :         case 480:
    3329      340315 :             DoRTFT480( re2, im2 );
    3330      340315 :             break;
    3331        1273 :         case 400:
    3332        1273 :             DoRTFT400( re2, im2 );
    3333        1273 :             break;
    3334      790954 :         case 320:
    3335      790954 :             DoRTFT320( re2, im2 );
    3336      790954 :             break;
    3337        7857 :         case 256:
    3338        7857 :             DoRTFTn( re2, im2, 256 );
    3339        7857 :             break;
    3340     3499899 :         case 240:
    3341     3499899 :             DoRTFT240( re2, im2 );
    3342     3499899 :             break;
    3343       14137 :         case 200:
    3344       14137 :             DoRTFT200( re2, im2 );
    3345       14137 :             break;
    3346      463572 :         case 160:
    3347      463572 :             DoRTFT160( re2, im2 );
    3348      463572 :             break;
    3349    18185543 :         case 128:
    3350    18185543 :             DoRTFT128( re2, im2 );
    3351    18185543 :             break;
    3352       13574 :         case 120:
    3353       13574 :             DoRTFT120( re2, im2 );
    3354       13574 :             break;
    3355          91 :         case 100:
    3356          91 :             DoRTFT100( re2, im2 );
    3357          91 :             break;
    3358      326338 :         case 80:
    3359      326338 :             DoRTFT80( re2, im2 );
    3360      326338 :             break;
    3361         696 :         case 64:
    3362         696 :             DoRTFTn( re2, im2, 64 );
    3363         696 :             break;
    3364        4224 :         case 40:
    3365        4224 :             DoRTFT40( re2, im2 );
    3366        4224 :             break;
    3367         488 :         case 20:
    3368         488 :             DoRTFT20( re2, im2 );
    3369         488 :             break;
    3370           0 :         default:
    3371           0 :             assert( !"fft is not supported!" );
    3372             :     }
    3373             : 
    3374    23650403 :     return;
    3375             : }
    3376             : 
    3377             : /*-----------------------------------------------------------------*
    3378             :  * Low-complexity implementation of FFT
    3379             :  *-----------------------------------------------------------------*/
    3380             : 
    3381     7361944 : static void fft_len5(
    3382             :     float *re,
    3383             :     float *im,
    3384             :     const int16_t s )
    3385             : {
    3386             :     float x0, x1, x2, x3, x4;
    3387             :     float r1, r2, r3, r4;
    3388             :     float s1, s2, s3, s4;
    3389             :     float t;
    3390             : 
    3391     7361944 :     x0 = re[s * 0];
    3392     7361944 :     x1 = re[s * 1];
    3393     7361944 :     x2 = re[s * 2];
    3394     7361944 :     x3 = re[s * 3];
    3395     7361944 :     x4 = re[s * 4];
    3396             : 
    3397     7361944 :     r1 = ( x1 + x4 );
    3398     7361944 :     r4 = ( x1 - x4 );
    3399     7361944 :     r3 = ( x2 + x3 );
    3400     7361944 :     r2 = ( x2 - x3 );
    3401     7361944 :     t = ( ( r1 - r3 ) * FFT_C54 );
    3402     7361944 :     r1 = ( r1 + r3 );
    3403     7361944 :     re[0] = ( x0 + r1 );
    3404             : 
    3405     7361944 :     r1 = ( re[0] + ( ( r1 * FFT_C55 ) ) );
    3406     7361944 :     r3 = ( r1 - t );
    3407     7361944 :     r1 = ( r1 + t );
    3408     7361944 :     t = ( ( r4 + r2 ) * FFT_C51 );
    3409             : 
    3410     7361944 :     r4 = ( t + ( r4 * FFT_C52 ) );
    3411     7361944 :     r2 = ( t + ( r2 * FFT_C53 ) );
    3412             : 
    3413     7361944 :     x0 = im[s * 0];
    3414     7361944 :     x1 = im[s * 1];
    3415     7361944 :     x2 = im[s * 2];
    3416     7361944 :     x3 = im[s * 3];
    3417     7361944 :     x4 = im[s * 4];
    3418             : 
    3419     7361944 :     s1 = ( x1 + x4 );
    3420     7361944 :     s4 = ( x1 - x4 );
    3421     7361944 :     s3 = ( x2 + x3 );
    3422     7361944 :     s2 = ( x2 - x3 );
    3423     7361944 :     t = ( ( s1 - s3 ) * FFT_C54 );
    3424     7361944 :     s1 = ( s1 + s3 );
    3425     7361944 :     im[0] = ( x0 + s1 );
    3426             : 
    3427     7361944 :     s1 = ( im[0] + ( s1 * FFT_C55 ) );
    3428     7361944 :     s3 = ( s1 - t );
    3429     7361944 :     s1 = ( s1 + t );
    3430     7361944 :     t = ( ( s4 + s2 ) * FFT_C51 );
    3431             : 
    3432     7361944 :     s4 = ( t + ( s4 * FFT_C52 ) );
    3433     7361944 :     s2 = ( t + ( s2 * FFT_C53 ) );
    3434             : 
    3435     7361944 :     re[s * 1] = ( r1 + s2 );
    3436     7361944 :     re[s * 4] = ( r1 - s2 );
    3437     7361944 :     re[s * 2] = ( r3 - s4 );
    3438     7361944 :     re[s * 3] = ( r3 + s4 );
    3439             : 
    3440     7361944 :     im[s * 1] = ( s1 - r2 );
    3441     7361944 :     im[s * 4] = ( s1 + r2 );
    3442     7361944 :     im[s * 2] = ( s3 + r4 );
    3443     7361944 :     im[s * 3] = ( s3 - r4 );
    3444             : 
    3445     7361944 :     return;
    3446             : }
    3447             : 
    3448     8152144 : static void fft_len8(
    3449             :     float *re,
    3450             :     float *im,
    3451             :     const int16_t s )
    3452             : {
    3453             :     float x00, x01, x02, x03, x04, x05, x06, x07;
    3454             :     float x08, x09, x10, x11, x12, x13, x14, x15;
    3455             :     float t00, t01, t02, t03, t04, t05, t06, t07;
    3456             :     float t08, t09, t10, t11, t12, t13, t14, t15;
    3457             :     float s00, s01, s02, s03, s04, s05, s06, s07;
    3458             :     float s08, s09, s10, s11, s12, s13, s14, s15;
    3459             : 
    3460     8152144 :     x00 = re[s * 0];
    3461     8152144 :     x01 = im[s * 0];
    3462     8152144 :     x02 = re[s * 1];
    3463     8152144 :     x03 = im[s * 1];
    3464     8152144 :     x04 = re[s * 2];
    3465     8152144 :     x05 = im[s * 2];
    3466     8152144 :     x06 = re[s * 3];
    3467     8152144 :     x07 = im[s * 3];
    3468     8152144 :     x08 = re[s * 4];
    3469     8152144 :     x09 = im[s * 4];
    3470     8152144 :     x10 = re[s * 5];
    3471     8152144 :     x11 = im[s * 5];
    3472     8152144 :     x12 = re[s * 6];
    3473     8152144 :     x13 = im[s * 6];
    3474     8152144 :     x14 = re[s * 7];
    3475     8152144 :     x15 = im[s * 7];
    3476             : 
    3477     8152144 :     t00 = ( x00 + x08 );
    3478     8152144 :     t02 = ( x00 - x08 );
    3479     8152144 :     t01 = ( x01 + x09 );
    3480     8152144 :     t03 = ( x01 - x09 );
    3481     8152144 :     t04 = ( x02 + x10 );
    3482     8152144 :     t06 = ( x02 - x10 );
    3483     8152144 :     t05 = ( x03 + x11 );
    3484     8152144 :     t07 = ( x03 - x11 );
    3485     8152144 :     t08 = ( x04 + x12 );
    3486     8152144 :     t10 = ( x04 - x12 );
    3487     8152144 :     t09 = ( x05 + x13 );
    3488     8152144 :     t11 = ( x05 - x13 );
    3489     8152144 :     t12 = ( x06 + x14 );
    3490     8152144 :     t14 = ( x06 - x14 );
    3491     8152144 :     t13 = ( x07 + x15 );
    3492     8152144 :     t15 = ( x07 - x15 );
    3493             : 
    3494     8152144 :     s00 = ( t00 + t08 );
    3495     8152144 :     s04 = ( t00 - t08 );
    3496     8152144 :     s01 = ( t01 + t09 );
    3497     8152144 :     s05 = ( t01 - t09 );
    3498     8152144 :     s08 = ( t02 - t11 );
    3499     8152144 :     s10 = ( t02 + t11 );
    3500     8152144 :     s09 = ( t03 + t10 );
    3501     8152144 :     s11 = ( t03 - t10 );
    3502     8152144 :     s02 = ( t04 + t12 );
    3503     8152144 :     s07 = ( t04 - t12 );
    3504     8152144 :     s03 = ( t05 + t13 );
    3505     8152144 :     s06 = ( t13 - t05 );
    3506             : 
    3507     8152144 :     t01 = ( t06 + t14 );
    3508     8152144 :     t02 = ( t06 - t14 );
    3509     8152144 :     t00 = ( t07 + t15 );
    3510     8152144 :     t03 = ( t07 - t15 );
    3511             : 
    3512     8152144 :     s12 = ( ( t00 + t02 ) * FFT_C81 );
    3513     8152144 :     s14 = ( ( t00 - t02 ) * FFT_C81 );
    3514     8152144 :     s13 = ( ( t03 - t01 ) * FFT_C81 );
    3515     8152144 :     s15 = ( ( t01 + t03 ) * FFT_C82 );
    3516             : 
    3517     8152144 :     re[s * 0] = ( s00 + s02 );
    3518     8152144 :     re[s * 4] = ( s00 - s02 );
    3519     8152144 :     im[s * 0] = ( s01 + s03 );
    3520     8152144 :     im[s * 4] = ( s01 - s03 );
    3521     8152144 :     re[s * 2] = ( s04 - s06 );
    3522     8152144 :     re[s * 6] = ( s04 + s06 );
    3523     8152144 :     im[s * 2] = ( s05 - s07 );
    3524     8152144 :     im[s * 6] = ( s05 + s07 );
    3525     8152144 :     re[s * 3] = ( s08 + s14 );
    3526     8152144 :     re[s * 7] = ( s08 - s14 );
    3527     8152144 :     im[s * 3] = ( s09 + s15 );
    3528     8152144 :     im[s * 7] = ( s09 - s15 );
    3529     8152144 :     re[s * 1] = ( s10 + s12 );
    3530     8152144 :     re[s * 5] = ( s10 - s12 );
    3531     8152144 :     im[s * 1] = ( s11 + s13 );
    3532     8152144 :     im[s * 5] = ( s11 - s13 );
    3533             : 
    3534     8152144 :     return;
    3535             : }
    3536             : 
    3537  1809073184 : static void fft_len10(
    3538             :     float *re,
    3539             :     float *im,
    3540             :     const int16_t s )
    3541             : {
    3542             :     float t;
    3543             :     float x0, x1, x2, x3, x4;
    3544             :     float r1, r2, r3, r4;
    3545             :     float s1, s2, s3, s4;
    3546             :     float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09;
    3547             :     float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19;
    3548             : 
    3549  1809073184 :     x0 = re[s * 0];
    3550  1809073184 :     x1 = re[s * 2];
    3551  1809073184 :     x2 = re[s * 4];
    3552  1809073184 :     x3 = re[s * 6];
    3553  1809073184 :     x4 = re[s * 8];
    3554             : 
    3555  1809073184 :     r1 = ( x3 + x2 );
    3556  1809073184 :     r4 = ( x3 - x2 );
    3557  1809073184 :     r3 = ( x1 + x4 );
    3558  1809073184 :     r2 = ( x1 - x4 );
    3559  1809073184 :     t = ( ( r1 - r3 ) * FFT_C54 );
    3560  1809073184 :     r1 = ( r1 + r3 );
    3561  1809073184 :     y00 = ( x0 + r1 );
    3562  1809073184 :     r1 = ( y00 + ( ( r1 * FFT_C55 ) ) );
    3563  1809073184 :     r3 = ( r1 - t );
    3564  1809073184 :     r1 = ( r1 + t );
    3565  1809073184 :     t = ( ( ( r4 + r2 ) ) * FFT_C51 );
    3566  1809073184 :     r4 = ( t + ( r4 * FFT_C52 ) );
    3567  1809073184 :     r2 = ( t + ( r2 * FFT_C53 ) );
    3568             : 
    3569  1809073184 :     x0 = im[s * 0];
    3570  1809073184 :     x1 = im[s * 2];
    3571  1809073184 :     x2 = im[s * 4];
    3572  1809073184 :     x3 = im[s * 6];
    3573  1809073184 :     x4 = im[s * 8];
    3574             : 
    3575  1809073184 :     s1 = ( x3 + x2 );
    3576  1809073184 :     s4 = ( x3 - x2 );
    3577  1809073184 :     s3 = ( x1 + x4 );
    3578  1809073184 :     s2 = ( x1 - x4 );
    3579  1809073184 :     t = ( ( s1 - s3 ) * FFT_C54 );
    3580  1809073184 :     s1 = ( s1 + s3 );
    3581  1809073184 :     y01 = ( x0 + s1 );
    3582  1809073184 :     s1 = ( y01 + ( s1 * FFT_C55 ) );
    3583  1809073184 :     s3 = ( s1 - t );
    3584  1809073184 :     s1 = ( s1 + t );
    3585  1809073184 :     t = ( ( s4 + s2 ) * FFT_C51 );
    3586  1809073184 :     s4 = ( t + ( s4 * FFT_C52 ) );
    3587  1809073184 :     s2 = ( t + ( s2 * FFT_C53 ) );
    3588             : 
    3589  1809073184 :     y04 = ( r1 + s2 );
    3590  1809073184 :     y16 = ( r1 - s2 );
    3591  1809073184 :     y08 = ( r3 - s4 );
    3592  1809073184 :     y12 = ( r3 + s4 );
    3593             : 
    3594  1809073184 :     y05 = ( s1 - r2 );
    3595  1809073184 :     y17 = ( s1 + r2 );
    3596  1809073184 :     y09 = ( s3 + r4 );
    3597  1809073184 :     y13 = ( s3 - r4 );
    3598             : 
    3599  1809073184 :     x0 = re[s * 5];
    3600  1809073184 :     x1 = re[s * 1];
    3601  1809073184 :     x2 = re[s * 3];
    3602  1809073184 :     x3 = re[s * 7];
    3603  1809073184 :     x4 = re[s * 9];
    3604             : 
    3605  1809073184 :     r1 = ( x1 + x4 );
    3606  1809073184 :     r4 = ( x1 - x4 );
    3607  1809073184 :     r3 = ( x3 + x2 );
    3608  1809073184 :     r2 = ( x3 - x2 );
    3609  1809073184 :     t = ( ( r1 - r3 ) * FFT_C54 );
    3610  1809073184 :     r1 = ( r1 + r3 );
    3611  1809073184 :     y02 = ( x0 + r1 );
    3612  1809073184 :     r1 = ( y02 + ( ( r1 * FFT_C55 ) ) );
    3613  1809073184 :     r3 = ( r1 - t );
    3614  1809073184 :     r1 = ( r1 + t );
    3615  1809073184 :     t = ( ( ( r4 + r2 ) ) * FFT_C51 );
    3616  1809073184 :     r4 = ( t + ( r4 * FFT_C52 ) );
    3617  1809073184 :     r2 = ( t + ( r2 * FFT_C53 ) );
    3618             : 
    3619  1809073184 :     x0 = im[s * 5];
    3620  1809073184 :     x1 = im[s * 1];
    3621  1809073184 :     x2 = im[s * 3];
    3622  1809073184 :     x3 = im[s * 7];
    3623  1809073184 :     x4 = im[s * 9];
    3624             : 
    3625  1809073184 :     s1 = ( x1 + x4 );
    3626  1809073184 :     s4 = ( x1 - x4 );
    3627  1809073184 :     s3 = ( x3 + x2 );
    3628  1809073184 :     s2 = ( x3 - x2 );
    3629  1809073184 :     t = ( ( s1 - s3 ) * FFT_C54 );
    3630  1809073184 :     s1 = ( s1 + s3 );
    3631  1809073184 :     y03 = ( x0 + s1 );
    3632  1809073184 :     s1 = ( y03 + ( s1 * FFT_C55 ) );
    3633  1809073184 :     s3 = ( s1 - t );
    3634  1809073184 :     s1 = ( s1 + t );
    3635  1809073184 :     t = ( ( s4 + s2 ) * FFT_C51 );
    3636  1809073184 :     s4 = ( t + ( s4 * FFT_C52 ) );
    3637  1809073184 :     s2 = ( t + ( s2 * FFT_C53 ) );
    3638             : 
    3639  1809073184 :     y06 = ( r1 + s2 );
    3640  1809073184 :     y18 = ( r1 - s2 );
    3641  1809073184 :     y10 = ( r3 - s4 );
    3642  1809073184 :     y14 = ( r3 + s4 );
    3643             : 
    3644  1809073184 :     y07 = ( s1 - r2 );
    3645  1809073184 :     y19 = ( s1 + r2 );
    3646  1809073184 :     y11 = ( s3 + r4 );
    3647  1809073184 :     y15 = ( s3 - r4 );
    3648             : 
    3649  1809073184 :     re[s * 0] = ( y00 + y02 );
    3650  1809073184 :     im[s * 0] = ( y01 + y03 );
    3651  1809073184 :     re[s * 5] = ( y00 - y02 );
    3652  1809073184 :     im[s * 5] = ( y01 - y03 );
    3653             : 
    3654  1809073184 :     re[s * 2] = ( y04 + y06 );
    3655  1809073184 :     im[s * 2] = ( y05 + y07 );
    3656  1809073184 :     re[s * 7] = ( y04 - y06 );
    3657  1809073184 :     im[s * 7] = ( y05 - y07 );
    3658             : 
    3659  1809073184 :     re[s * 4] = ( y08 + y10 );
    3660  1809073184 :     im[s * 4] = ( y09 + y11 );
    3661  1809073184 :     re[s * 9] = ( y08 - y10 );
    3662  1809073184 :     im[s * 9] = ( y09 - y11 );
    3663             : 
    3664  1809073184 :     re[s * 6] = ( y12 + y14 );
    3665  1809073184 :     im[s * 6] = ( y13 + y15 );
    3666  1809073184 :     re[s * 1] = ( y12 - y14 );
    3667  1809073184 :     im[s * 1] = ( y13 - y15 );
    3668             : 
    3669  1809073184 :     re[s * 8] = ( y16 + y18 );
    3670  1809073184 :     im[s * 8] = ( y17 + y19 );
    3671  1809073184 :     re[s * 3] = ( y16 - y18 );
    3672  1809073184 :     im[s * 3] = ( y17 - y19 );
    3673             : 
    3674  1809073184 :     return;
    3675             : }
    3676             : 
    3677    76448432 : static void fft_len15(
    3678             :     float *re,
    3679             :     float *im,
    3680             :     const int16_t s )
    3681             : {
    3682             :     float t;
    3683             :     float r1, r2, r3, r4;
    3684             :     float s1, s2, s3, s4;
    3685             :     float x00, x01, x02, x03, x04, x05, x06, x07, x08, x09;
    3686             :     float x10, x11, x12, x13, x14, x15, x16, x17, x18, x19;
    3687             :     float x20, x21, x22, x23, x24, x25, x26, x27, x28, x29;
    3688             :     float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09;
    3689             :     float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19;
    3690             :     float y20, y21, y22, y23, y24, y25, y26, y27, y28, y29;
    3691             : 
    3692    76448432 :     x00 = re[s * 0];
    3693    76448432 :     x01 = im[s * 0];
    3694    76448432 :     x02 = re[s * 3];
    3695    76448432 :     x03 = im[s * 3];
    3696    76448432 :     x04 = re[s * 6];
    3697    76448432 :     x05 = im[s * 6];
    3698    76448432 :     x06 = re[s * 9];
    3699    76448432 :     x07 = im[s * 9];
    3700    76448432 :     x08 = re[s * 12];
    3701    76448432 :     x09 = im[s * 12];
    3702             : 
    3703    76448432 :     x10 = re[s * 5];
    3704    76448432 :     x11 = im[s * 5];
    3705    76448432 :     x12 = re[s * 8];
    3706    76448432 :     x13 = im[s * 8];
    3707    76448432 :     x14 = re[s * 11];
    3708    76448432 :     x15 = im[s * 11];
    3709    76448432 :     x16 = re[s * 14];
    3710    76448432 :     x17 = im[s * 14];
    3711    76448432 :     x18 = re[s * 2];
    3712    76448432 :     x19 = im[s * 2];
    3713             : 
    3714    76448432 :     x20 = re[s * 10];
    3715    76448432 :     x21 = im[s * 10];
    3716    76448432 :     x22 = re[s * 13];
    3717    76448432 :     x23 = im[s * 13];
    3718    76448432 :     x24 = re[s * 1];
    3719    76448432 :     x25 = im[s * 1];
    3720    76448432 :     x26 = re[s * 4];
    3721    76448432 :     x27 = im[s * 4];
    3722    76448432 :     x28 = re[s * 7];
    3723    76448432 :     x29 = im[s * 7];
    3724             : 
    3725    76448432 :     r1 = ( x02 + x08 );
    3726    76448432 :     r4 = ( x02 - x08 );
    3727    76448432 :     r3 = ( x04 + x06 );
    3728    76448432 :     r2 = ( x04 - x06 );
    3729    76448432 :     t = ( ( r1 - r3 ) * FFT_C54 );
    3730    76448432 :     r1 = ( r1 + r3 );
    3731    76448432 :     y00 = ( x00 + r1 );
    3732    76448432 :     r1 = ( y00 + ( ( r1 * FFT_C55 ) ) );
    3733    76448432 :     r3 = ( r1 - t );
    3734    76448432 :     r1 = ( r1 + t );
    3735    76448432 :     t = ( ( ( r4 + r2 ) ) * FFT_C51 );
    3736    76448432 :     r4 = ( t + ( r4 * FFT_C52 ) );
    3737    76448432 :     r2 = ( t + ( r2 * FFT_C53 ) );
    3738             : 
    3739    76448432 :     s1 = ( x03 + x09 );
    3740    76448432 :     s4 = ( x03 - x09 );
    3741    76448432 :     s3 = ( x05 + x07 );
    3742    76448432 :     s2 = ( x05 - x07 );
    3743    76448432 :     t = ( ( s1 - s3 ) * FFT_C54 );
    3744    76448432 :     s1 = ( s1 + s3 );
    3745    76448432 :     y01 = ( x01 + s1 );
    3746    76448432 :     s1 = ( y01 + ( s1 * FFT_C55 ) );
    3747    76448432 :     s3 = ( s1 - t );
    3748    76448432 :     s1 = ( s1 + t );
    3749    76448432 :     t = ( ( s4 + s2 ) * FFT_C51 );
    3750    76448432 :     s4 = ( t + ( s4 * FFT_C52 ) );
    3751    76448432 :     s2 = ( t + ( s2 * FFT_C53 ) );
    3752             : 
    3753    76448432 :     y02 = ( r1 + s2 );
    3754    76448432 :     y08 = ( r1 - s2 );
    3755    76448432 :     y04 = ( r3 - s4 );
    3756    76448432 :     y06 = ( r3 + s4 );
    3757             : 
    3758    76448432 :     y03 = ( s1 - r2 );
    3759    76448432 :     y09 = ( s1 + r2 );
    3760    76448432 :     y05 = ( s3 + r4 );
    3761    76448432 :     y07 = ( s3 - r4 );
    3762             : 
    3763    76448432 :     r1 = ( x12 + x18 );
    3764    76448432 :     r4 = ( x12 - x18 );
    3765    76448432 :     r3 = ( x14 + x16 );
    3766    76448432 :     r2 = ( x14 - x16 );
    3767    76448432 :     t = ( ( r1 - r3 ) * FFT_C54 );
    3768    76448432 :     r1 = ( r1 + r3 );
    3769    76448432 :     y10 = ( x10 + r1 );
    3770    76448432 :     r1 = ( y10 + ( ( r1 * FFT_C55 ) ) );
    3771    76448432 :     r3 = ( r1 - t );
    3772    76448432 :     r1 = ( r1 + t );
    3773    76448432 :     t = ( ( ( r4 + r2 ) ) * FFT_C51 );
    3774    76448432 :     r4 = ( t + ( r4 * FFT_C52 ) );
    3775    76448432 :     r2 = ( t + ( r2 * FFT_C53 ) );
    3776             : 
    3777    76448432 :     s1 = ( x13 + x19 );
    3778    76448432 :     s4 = ( x13 - x19 );
    3779    76448432 :     s3 = ( x15 + x17 );
    3780    76448432 :     s2 = ( x15 - x17 );
    3781    76448432 :     t = ( ( s1 - s3 ) * FFT_C54 );
    3782    76448432 :     s1 = ( s1 + s3 );
    3783    76448432 :     y11 = ( x11 + s1 );
    3784    76448432 :     s1 = ( y11 + ( s1 * FFT_C55 ) );
    3785    76448432 :     s3 = ( s1 - t );
    3786    76448432 :     s1 = ( s1 + t );
    3787    76448432 :     t = ( ( s4 + s2 ) * FFT_C51 );
    3788    76448432 :     s4 = ( t + ( s4 * FFT_C52 ) );
    3789    76448432 :     s2 = ( t + ( s2 * FFT_C53 ) );
    3790             : 
    3791    76448432 :     y12 = ( r1 + s2 );
    3792    76448432 :     y18 = ( r1 - s2 );
    3793    76448432 :     y14 = ( r3 - s4 );
    3794    76448432 :     y16 = ( r3 + s4 );
    3795             : 
    3796    76448432 :     y13 = ( s1 - r2 );
    3797    76448432 :     y19 = ( s1 + r2 );
    3798    76448432 :     y15 = ( s3 + r4 );
    3799    76448432 :     y17 = ( s3 - r4 );
    3800             : 
    3801    76448432 :     r1 = ( x22 + x28 );
    3802    76448432 :     r4 = ( x22 - x28 );
    3803    76448432 :     r3 = ( x24 + x26 );
    3804    76448432 :     r2 = ( x24 - x26 );
    3805    76448432 :     t = ( ( r1 - r3 ) * FFT_C54 );
    3806    76448432 :     r1 = ( r1 + r3 );
    3807    76448432 :     y20 = ( x20 + r1 );
    3808    76448432 :     r1 = ( y20 + ( ( r1 * FFT_C55 ) ) );
    3809    76448432 :     r3 = ( r1 - t );
    3810    76448432 :     r1 = ( r1 + t );
    3811    76448432 :     t = ( ( ( r4 + r2 ) ) * FFT_C51 );
    3812    76448432 :     r4 = ( t + ( r4 * FFT_C52 ) );
    3813    76448432 :     r2 = ( t + ( r2 * FFT_C53 ) );
    3814             : 
    3815    76448432 :     s1 = ( x23 + x29 );
    3816    76448432 :     s4 = ( x23 - x29 );
    3817    76448432 :     s3 = ( x25 + x27 );
    3818    76448432 :     s2 = ( x25 - x27 );
    3819    76448432 :     t = ( ( s1 - s3 ) * FFT_C54 );
    3820    76448432 :     s1 = ( s1 + s3 );
    3821    76448432 :     y21 = ( x21 + s1 );
    3822    76448432 :     s1 = ( y21 + ( s1 * FFT_C55 ) );
    3823    76448432 :     s3 = ( s1 - t );
    3824    76448432 :     s1 = ( s1 + t );
    3825    76448432 :     t = ( ( s4 + s2 ) * FFT_C51 );
    3826    76448432 :     s4 = ( t + ( s4 * FFT_C52 ) );
    3827    76448432 :     s2 = ( t + ( s2 * FFT_C53 ) );
    3828             : 
    3829    76448432 :     y22 = ( r1 + s2 );
    3830    76448432 :     y28 = ( r1 - s2 );
    3831    76448432 :     y24 = ( r3 - s4 );
    3832    76448432 :     y26 = ( r3 + s4 );
    3833             : 
    3834    76448432 :     y23 = ( s1 - r2 );
    3835    76448432 :     y29 = ( s1 + r2 );
    3836    76448432 :     y25 = ( s3 + r4 );
    3837    76448432 :     y27 = ( s3 - r4 );
    3838             : 
    3839    76448432 :     r1 = ( y10 + y20 );
    3840    76448432 :     r2 = ( ( y10 - y20 ) * FFT_C31 );
    3841    76448432 :     re[s * 0] = ( y00 + r1 );
    3842    76448432 :     r1 = ( y00 - r1 * 0.5f );
    3843             : 
    3844    76448432 :     s1 = ( y11 + y21 );
    3845    76448432 :     s2 = ( ( y11 - y21 ) * FFT_C31 );
    3846    76448432 :     im[s * 0] = ( y01 + s1 );
    3847    76448432 :     s1 = ( y01 - s1 * 0.5f );
    3848             : 
    3849    76448432 :     re[s * 10] = ( r1 - s2 );
    3850    76448432 :     re[s * 5] = ( r1 + s2 );
    3851    76448432 :     im[s * 10] = ( s1 + r2 );
    3852    76448432 :     im[s * 5] = ( s1 - r2 );
    3853             : 
    3854    76448432 :     r1 = ( y12 + y22 );
    3855    76448432 :     r2 = ( ( y12 - y22 ) * FFT_C31 );
    3856    76448432 :     re[s * 6] = ( y02 + r1 );
    3857    76448432 :     r1 = ( y02 - r1 * 0.5f );
    3858             : 
    3859    76448432 :     s1 = ( y13 + y23 );
    3860    76448432 :     s2 = ( ( y13 - y23 ) * FFT_C31 );
    3861    76448432 :     im[s * 6] = ( y03 + s1 );
    3862    76448432 :     s1 = ( y03 - s1 * 0.5f );
    3863             : 
    3864    76448432 :     re[s * 1] = ( r1 - s2 );
    3865    76448432 :     re[s * 11] = ( r1 + s2 );
    3866    76448432 :     im[s * 1] = ( s1 + r2 );
    3867    76448432 :     im[s * 11] = ( s1 - r2 );
    3868             : 
    3869    76448432 :     r1 = ( y14 + y24 );
    3870    76448432 :     r2 = ( ( y14 - y24 ) * FFT_C31 );
    3871    76448432 :     re[s * 12] = ( y04 + r1 );
    3872    76448432 :     r1 = ( y04 - r1 * 0.5f );
    3873             : 
    3874    76448432 :     s1 = ( y15 + y25 );
    3875    76448432 :     s2 = ( ( y15 - y25 ) * FFT_C31 );
    3876    76448432 :     im[s * 12] = ( y05 + s1 );
    3877    76448432 :     s1 = ( y05 - s1 * 0.5f );
    3878             : 
    3879    76448432 :     re[s * 7] = ( r1 - s2 );
    3880    76448432 :     re[s * 2] = ( r1 + s2 );
    3881    76448432 :     im[s * 7] = ( s1 + r2 );
    3882    76448432 :     im[s * 2] = ( s1 - r2 );
    3883             : 
    3884    76448432 :     r1 = ( y16 + y26 );
    3885    76448432 :     r2 = ( ( y16 - y26 ) * FFT_C31 );
    3886    76448432 :     re[s * 3] = ( y06 + r1 );
    3887    76448432 :     r1 = ( y06 - r1 * 0.5f );
    3888             : 
    3889    76448432 :     s1 = ( y17 + y27 );
    3890    76448432 :     s2 = ( ( y17 - y27 ) * FFT_C31 );
    3891    76448432 :     im[s * 3] = ( y07 + s1 );
    3892    76448432 :     s1 = ( y07 - s1 * 0.5f );
    3893             : 
    3894    76448432 :     re[s * 13] = ( r1 - s2 );
    3895    76448432 :     re[s * 8] = ( r1 + s2 );
    3896    76448432 :     im[s * 13] = ( s1 + r2 );
    3897    76448432 :     im[s * 8] = ( s1 - r2 );
    3898             : 
    3899    76448432 :     r1 = ( y18 + y28 );
    3900    76448432 :     r2 = ( ( y18 - y28 ) * FFT_C31 );
    3901    76448432 :     re[s * 9] = ( y08 + r1 );
    3902    76448432 :     r1 = ( y08 - r1 * 0.5f );
    3903             : 
    3904    76448432 :     s1 = ( y19 + y29 );
    3905    76448432 :     s2 = ( ( y19 - y29 ) * FFT_C31 );
    3906    76448432 :     im[s * 9] = ( y09 + s1 );
    3907    76448432 :     s1 = ( y09 - s1 * 0.5f );
    3908             : 
    3909    76448432 :     re[s * 4] = ( r1 - s2 );
    3910    76448432 :     re[s * 14] = ( r1 + s2 );
    3911    76448432 :     im[s * 4] = ( s1 + r2 );
    3912    76448432 :     im[s * 14] = ( s1 - r2 );
    3913             : 
    3914    76448432 :     return;
    3915             : }
    3916             : 
    3917  2754731874 : static void fft_len16(
    3918             :     float *re,
    3919             :     float *im,
    3920             :     const int16_t s )
    3921             : {
    3922             :     float x0, x1, x2, x3, x4, x5, x6, x7;
    3923             :     float t0, t1, t2, t3, t4, t5, t6, t7;
    3924             :     float y00, y01, y02, y03, y04, y05, y06, y07;
    3925             :     float y08, y09, y10, y11, y12, y13, y14, y15;
    3926             :     float y16, y17, y18, y19, y20, y21, y22, y23;
    3927             :     float y24, y25, y26, y27, y28, y29, y30, y31;
    3928             : 
    3929  2754731874 :     x0 = re[s * 0];
    3930  2754731874 :     x1 = im[s * 0];
    3931  2754731874 :     x2 = re[s * 4];
    3932  2754731874 :     x3 = im[s * 4];
    3933  2754731874 :     x4 = re[s * 8];
    3934  2754731874 :     x5 = im[s * 8];
    3935  2754731874 :     x6 = re[s * 12];
    3936  2754731874 :     x7 = im[s * 12];
    3937             : 
    3938  2754731874 :     t0 = ( x0 + x4 );
    3939  2754731874 :     t2 = ( x0 - x4 );
    3940  2754731874 :     t1 = ( x1 + x5 );
    3941  2754731874 :     t3 = ( x1 - x5 );
    3942  2754731874 :     t4 = ( x2 + x6 );
    3943  2754731874 :     t7 = ( x2 - x6 );
    3944  2754731874 :     t5 = ( x7 + x3 );
    3945  2754731874 :     t6 = ( x7 - x3 );
    3946             : 
    3947  2754731874 :     y00 = ( t0 + t4 );
    3948  2754731874 :     y01 = ( t1 + t5 );
    3949  2754731874 :     y02 = ( t2 - t6 );
    3950  2754731874 :     y03 = ( t3 - t7 );
    3951  2754731874 :     y04 = ( t0 - t4 );
    3952  2754731874 :     y05 = ( t1 - t5 );
    3953  2754731874 :     y06 = ( t2 + t6 );
    3954  2754731874 :     y07 = ( t3 + t7 );
    3955             : 
    3956  2754731874 :     x0 = re[s * 1];
    3957  2754731874 :     x1 = im[s * 1];
    3958  2754731874 :     x2 = re[s * 5];
    3959  2754731874 :     x3 = im[s * 5];
    3960  2754731874 :     x4 = re[s * 9];
    3961  2754731874 :     x5 = im[s * 9];
    3962  2754731874 :     x6 = re[s * 13];
    3963  2754731874 :     x7 = im[s * 13];
    3964             : 
    3965  2754731874 :     t0 = ( x0 + x4 );
    3966  2754731874 :     t2 = ( x0 - x4 );
    3967  2754731874 :     t1 = ( x1 + x5 );
    3968  2754731874 :     t3 = ( x1 - x5 );
    3969  2754731874 :     t4 = ( x2 + x6 );
    3970  2754731874 :     t7 = ( x2 - x6 );
    3971  2754731874 :     t5 = ( x7 + x3 );
    3972  2754731874 :     t6 = ( x7 - x3 );
    3973             : 
    3974  2754731874 :     y08 = ( t0 + t4 );
    3975  2754731874 :     y09 = ( t1 + t5 );
    3976  2754731874 :     y10 = ( t2 - t6 );
    3977  2754731874 :     y11 = ( t3 - t7 );
    3978  2754731874 :     y12 = ( t0 - t4 );
    3979  2754731874 :     y13 = ( t1 - t5 );
    3980  2754731874 :     y14 = ( t2 + t6 );
    3981  2754731874 :     y15 = ( t3 + t7 );
    3982             : 
    3983  2754731874 :     x0 = re[s * 2];
    3984  2754731874 :     x1 = im[s * 2];
    3985  2754731874 :     x2 = re[s * 6];
    3986  2754731874 :     x3 = im[s * 6];
    3987  2754731874 :     x4 = re[s * 10];
    3988  2754731874 :     x5 = im[s * 10];
    3989  2754731874 :     x6 = re[s * 14];
    3990  2754731874 :     x7 = im[s * 14];
    3991             : 
    3992  2754731874 :     t0 = ( x0 + x4 );
    3993  2754731874 :     t2 = ( x0 - x4 );
    3994  2754731874 :     t1 = ( x1 + x5 );
    3995  2754731874 :     t3 = ( x1 - x5 );
    3996  2754731874 :     t4 = ( x2 + x6 );
    3997  2754731874 :     t7 = ( x2 - x6 );
    3998  2754731874 :     t5 = ( x7 + x3 );
    3999  2754731874 :     t6 = ( x7 - x3 );
    4000             : 
    4001  2754731874 :     y16 = ( t0 + t4 );
    4002  2754731874 :     y17 = ( t1 + t5 );
    4003  2754731874 :     y18 = ( t2 - t6 );
    4004  2754731874 :     y19 = ( t3 - t7 );
    4005  2754731874 :     y20 = ( t1 - t5 );
    4006  2754731874 :     y21 = ( t4 - t0 );
    4007  2754731874 :     y22 = ( t2 + t6 );
    4008  2754731874 :     y23 = ( t3 + t7 );
    4009             : 
    4010  2754731874 :     x0 = re[s * 3];
    4011  2754731874 :     x1 = im[s * 3];
    4012  2754731874 :     x2 = re[s * 7];
    4013  2754731874 :     x3 = im[s * 7];
    4014  2754731874 :     x4 = re[s * 11];
    4015  2754731874 :     x5 = im[s * 11];
    4016  2754731874 :     x6 = re[s * 15];
    4017  2754731874 :     x7 = im[s * 15];
    4018             : 
    4019  2754731874 :     t0 = ( x0 + x4 );
    4020  2754731874 :     t2 = ( x0 - x4 );
    4021  2754731874 :     t1 = ( x1 + x5 );
    4022  2754731874 :     t3 = ( x1 - x5 );
    4023  2754731874 :     t4 = ( x2 + x6 );
    4024  2754731874 :     t7 = ( x2 - x6 );
    4025  2754731874 :     t5 = ( x7 + x3 );
    4026  2754731874 :     t6 = ( x7 - x3 );
    4027             : 
    4028  2754731874 :     y24 = ( t0 + t4 );
    4029  2754731874 :     y25 = ( t1 + t5 );
    4030  2754731874 :     y26 = ( t2 - t6 );
    4031  2754731874 :     y27 = ( t3 - t7 );
    4032  2754731874 :     y28 = ( t0 - t4 );
    4033  2754731874 :     y29 = ( t1 - t5 );
    4034  2754731874 :     y30 = ( t2 + t6 );
    4035  2754731874 :     y31 = ( t3 + t7 );
    4036             : 
    4037  2754731874 :     x0 = ( y22 * FFT_C162 );
    4038  2754731874 :     x1 = ( y23 * FFT_C162 );
    4039  2754731874 :     y22 = ( x0 - x1 );
    4040  2754731874 :     y23 = ( x0 + x1 );
    4041             : 
    4042  2754731874 :     x0 = ( y28 * FFT_C162 );
    4043  2754731874 :     x1 = ( y29 * FFT_C162 );
    4044  2754731874 :     y28 = ( x0 - x1 );
    4045  2754731874 :     y29 = ( x0 + x1 );
    4046             : 
    4047  2754731874 :     x0 = ( y12 * FFT_C161 );
    4048  2754731874 :     x1 = ( y13 * FFT_C161 );
    4049  2754731874 :     y12 = ( x0 + x1 );
    4050  2754731874 :     y13 = ( x1 - x0 );
    4051             : 
    4052  2754731874 :     x0 = ( y18 * FFT_C161 );
    4053  2754731874 :     x1 = ( y19 * FFT_C161 );
    4054  2754731874 :     y18 = ( x0 + x1 );
    4055  2754731874 :     y19 = ( x1 - x0 );
    4056             : 
    4057  2754731874 :     x0 = ( y10 * FFT_C163 );
    4058  2754731874 :     x1 = ( y11 * FFT_C166 );
    4059  2754731874 :     x2 = ( y10 * FFT_C166 );
    4060  2754731874 :     x3 = ( y11 * FFT_C163 );
    4061  2754731874 :     y10 = ( x0 - x1 );
    4062  2754731874 :     y11 = ( x2 + x3 );
    4063             : 
    4064  2754731874 :     x0 = ( y14 * FFT_C165 );
    4065  2754731874 :     x1 = ( y15 * FFT_C164 );
    4066  2754731874 :     x2 = ( y14 * FFT_C164 );
    4067  2754731874 :     x3 = ( y15 * FFT_C165 );
    4068  2754731874 :     y14 = ( x0 - x1 );
    4069  2754731874 :     y15 = ( x2 + x3 );
    4070             : 
    4071  2754731874 :     x0 = ( y26 * FFT_C165 );
    4072  2754731874 :     x1 = ( y27 * FFT_C164 );
    4073  2754731874 :     x2 = ( y26 * FFT_C164 );
    4074  2754731874 :     x3 = ( y27 * FFT_C165 );
    4075  2754731874 :     y26 = ( x0 - x1 );
    4076  2754731874 :     y27 = ( x2 + x3 );
    4077             : 
    4078  2754731874 :     x0 = ( y30 * FFT_C164 );
    4079  2754731874 :     x1 = ( y31 * FFT_C165 );
    4080  2754731874 :     x2 = ( y30 * FFT_C165 );
    4081  2754731874 :     x3 = ( y31 * FFT_C164 );
    4082  2754731874 :     y30 = ( x0 - x1 );
    4083  2754731874 :     y31 = ( x2 + x3 );
    4084             : 
    4085  2754731874 :     t0 = ( y00 + y16 );
    4086  2754731874 :     t2 = ( y00 - y16 );
    4087  2754731874 :     t1 = ( y01 + y17 );
    4088  2754731874 :     t3 = ( y01 - y17 );
    4089  2754731874 :     t4 = ( y08 + y24 );
    4090  2754731874 :     t7 = ( y08 - y24 );
    4091  2754731874 :     t5 = ( y25 + y09 );
    4092  2754731874 :     t6 = ( y25 - y09 );
    4093             : 
    4094  2754731874 :     re[s * 0] = ( t0 + t4 );
    4095  2754731874 :     im[s * 0] = ( t1 + t5 );
    4096  2754731874 :     re[s * 4] = ( t2 - t6 );
    4097  2754731874 :     im[s * 4] = ( t3 - t7 );
    4098  2754731874 :     re[s * 8] = ( t0 - t4 );
    4099  2754731874 :     im[s * 8] = ( t1 - t5 );
    4100  2754731874 :     re[s * 12] = ( t2 + t6 );
    4101  2754731874 :     im[s * 12] = ( t3 + t7 );
    4102             : 
    4103  2754731874 :     t0 = ( y02 + y18 );
    4104  2754731874 :     t2 = ( y02 - y18 );
    4105  2754731874 :     t1 = ( y03 + y19 );
    4106  2754731874 :     t3 = ( y03 - y19 );
    4107  2754731874 :     t4 = ( y10 + y26 );
    4108  2754731874 :     t7 = ( y10 - y26 );
    4109  2754731874 :     t5 = ( y27 + y11 );
    4110  2754731874 :     t6 = ( y27 - y11 );
    4111             : 
    4112  2754731874 :     re[s * 1] = ( t0 + t4 );
    4113  2754731874 :     im[s * 1] = ( t1 + t5 );
    4114  2754731874 :     re[s * 5] = ( t2 - t6 );
    4115  2754731874 :     im[s * 5] = ( t3 - t7 );
    4116  2754731874 :     re[s * 9] = ( t0 - t4 );
    4117  2754731874 :     im[s * 9] = ( t1 - t5 );
    4118  2754731874 :     re[s * 13] = ( t2 + t6 );
    4119  2754731874 :     im[s * 13] = ( t3 + t7 );
    4120             : 
    4121  2754731874 :     t0 = ( y04 + y20 );
    4122  2754731874 :     t2 = ( y04 - y20 );
    4123  2754731874 :     t1 = ( y05 + y21 );
    4124  2754731874 :     t3 = ( y05 - y21 );
    4125  2754731874 :     t4 = ( y12 + y28 );
    4126  2754731874 :     t7 = ( y12 - y28 );
    4127  2754731874 :     t5 = ( y29 + y13 );
    4128  2754731874 :     t6 = ( y29 - y13 );
    4129             : 
    4130  2754731874 :     re[s * 2] = ( t0 + t4 );
    4131  2754731874 :     im[s * 2] = ( t1 + t5 );
    4132  2754731874 :     re[s * 6] = ( t2 - t6 );
    4133  2754731874 :     im[s * 6] = ( t3 - t7 );
    4134  2754731874 :     re[s * 10] = ( t0 - t4 );
    4135  2754731874 :     im[s * 10] = ( t1 - t5 );
    4136  2754731874 :     re[s * 14] = ( t2 + t6 );
    4137  2754731874 :     im[s * 14] = ( t3 + t7 );
    4138             : 
    4139  2754731874 :     t0 = ( y06 + y22 );
    4140  2754731874 :     t2 = ( y06 - y22 );
    4141  2754731874 :     t1 = ( y07 + y23 );
    4142  2754731874 :     t3 = ( y07 - y23 );
    4143  2754731874 :     t4 = ( y14 + y30 );
    4144  2754731874 :     t7 = ( y14 - y30 );
    4145  2754731874 :     t5 = ( y31 + y15 );
    4146  2754731874 :     t6 = ( y31 - y15 );
    4147             : 
    4148  2754731874 :     re[s * 3] = ( t0 + t4 );
    4149  2754731874 :     im[s * 3] = ( t1 + t5 );
    4150  2754731874 :     re[s * 7] = ( t2 - t6 );
    4151  2754731874 :     im[s * 7] = ( t3 - t7 );
    4152  2754731874 :     re[s * 11] = ( t0 - t4 );
    4153  2754731874 :     im[s * 11] = ( t1 - t5 );
    4154  2754731874 :     re[s * 15] = ( t2 + t6 );
    4155  2754731874 :     im[s * 15] = ( t3 + t7 );
    4156             : 
    4157  2754731874 :     return;
    4158             : }
    4159             : 
    4160  3093821510 : static void fft_len20(
    4161             :     float *re,
    4162             :     float *im,
    4163             :     const int16_t s )
    4164             : {
    4165             :     float r1, r2, r3, r4;
    4166             :     float s1, s2, s3, s4;
    4167             :     float x0, x1, x2, x3, x4;
    4168             :     float t, t0, t1, t2, t3, t4, t5, t6, t7;
    4169             :     float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09;
    4170             :     float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19;
    4171             :     float y20, y21, y22, y23, y24, y25, y26, y27, y28, y29;
    4172             :     float y30, y31, y32, y33, y34, y35, y36, y37, y38, y39;
    4173             : 
    4174  3093821510 :     x0 = re[s * 0];
    4175  3093821510 :     x1 = re[s * 16];
    4176  3093821510 :     x2 = re[s * 12];
    4177  3093821510 :     x3 = re[s * 8];
    4178  3093821510 :     x4 = re[s * 4];
    4179             : 
    4180  3093821510 :     r1 = ( x1 + x4 );
    4181  3093821510 :     r4 = ( x1 - x4 );
    4182  3093821510 :     r3 = ( x2 + x3 );
    4183  3093821510 :     r2 = ( x2 - x3 );
    4184  3093821510 :     t = ( ( r1 - r3 ) * FFT_C54 );
    4185  3093821510 :     r1 = ( r1 + r3 );
    4186  3093821510 :     y00 = ( x0 + r1 );
    4187  3093821510 :     r1 = ( y00 + ( ( r1 * FFT_C55 ) ) );
    4188  3093821510 :     r3 = ( r1 - t );
    4189  3093821510 :     r1 = ( r1 + t );
    4190  3093821510 :     t = ( ( ( r4 + r2 ) ) * FFT_C51 );
    4191  3093821510 :     r4 = ( t + ( r4 * FFT_C52 ) );
    4192  3093821510 :     r2 = ( t + ( r2 * FFT_C53 ) );
    4193             : 
    4194  3093821510 :     x0 = im[s * 0];
    4195  3093821510 :     x1 = im[s * 16];
    4196  3093821510 :     x2 = im[s * 12];
    4197  3093821510 :     x3 = im[s * 8];
    4198  3093821510 :     x4 = im[s * 4];
    4199             : 
    4200  3093821510 :     s1 = ( x1 + x4 );
    4201  3093821510 :     s4 = ( x1 - x4 );
    4202  3093821510 :     s3 = ( x2 + x3 );
    4203  3093821510 :     s2 = ( x2 - x3 );
    4204  3093821510 :     t = ( ( s1 - s3 ) * FFT_C54 );
    4205  3093821510 :     s1 = ( s1 + s3 );
    4206  3093821510 :     y01 = ( x0 + s1 );
    4207  3093821510 :     s1 = ( y01 + ( s1 * FFT_C55 ) );
    4208  3093821510 :     s3 = ( s1 - t );
    4209  3093821510 :     s1 = ( s1 + t );
    4210  3093821510 :     t = ( ( s4 + s2 ) * FFT_C51 );
    4211  3093821510 :     s4 = ( t + ( s4 * FFT_C52 ) );
    4212  3093821510 :     s2 = ( t + ( s2 * FFT_C53 ) );
    4213             : 
    4214  3093821510 :     y08 = ( r1 + s2 );
    4215  3093821510 :     y32 = ( r1 - s2 );
    4216  3093821510 :     y16 = ( r3 - s4 );
    4217  3093821510 :     y24 = ( r3 + s4 );
    4218             : 
    4219  3093821510 :     y09 = ( s1 - r2 );
    4220  3093821510 :     y33 = ( s1 + r2 );
    4221  3093821510 :     y17 = ( s3 + r4 );
    4222  3093821510 :     y25 = ( s3 - r4 );
    4223             : 
    4224  3093821510 :     x0 = re[s * 5];
    4225  3093821510 :     x1 = re[s * 1];
    4226  3093821510 :     x2 = re[s * 17];
    4227  3093821510 :     x3 = re[s * 13];
    4228  3093821510 :     x4 = re[s * 9];
    4229             : 
    4230  3093821510 :     r1 = ( x1 + x4 );
    4231  3093821510 :     r4 = ( x1 - x4 );
    4232  3093821510 :     r3 = ( x2 + x3 );
    4233  3093821510 :     r2 = ( x2 - x3 );
    4234  3093821510 :     t = ( ( r1 - r3 ) * FFT_C54 );
    4235  3093821510 :     r1 = ( r1 + r3 );
    4236  3093821510 :     y02 = ( x0 + r1 );
    4237  3093821510 :     r1 = ( y02 + ( ( r1 * FFT_C55 ) ) );
    4238  3093821510 :     r3 = ( r1 - t );
    4239  3093821510 :     r1 = ( r1 + t );
    4240  3093821510 :     t = ( ( ( r4 + r2 ) ) * FFT_C51 );
    4241  3093821510 :     r4 = ( t + ( r4 * FFT_C52 ) );
    4242  3093821510 :     r2 = ( t + ( r2 * FFT_C53 ) );
    4243             : 
    4244  3093821510 :     x0 = im[s * 5];
    4245  3093821510 :     x1 = im[s * 1];
    4246  3093821510 :     x2 = im[s * 17];
    4247  3093821510 :     x3 = im[s * 13];
    4248  3093821510 :     x4 = im[s * 9];
    4249             : 
    4250  3093821510 :     s1 = ( x1 + x4 );
    4251  3093821510 :     s4 = ( x1 - x4 );
    4252  3093821510 :     s3 = ( x2 + x3 );
    4253  3093821510 :     s2 = ( x2 - x3 );
    4254  3093821510 :     t = ( ( s1 - s3 ) * FFT_C54 );
    4255  3093821510 :     s1 = ( s1 + s3 );
    4256  3093821510 :     y03 = ( x0 + s1 );
    4257  3093821510 :     s1 = ( y03 + ( s1 * FFT_C55 ) );
    4258  3093821510 :     s3 = ( s1 - t );
    4259  3093821510 :     s1 = ( s1 + t );
    4260  3093821510 :     t = ( ( s4 + s2 ) * FFT_C51 );
    4261  3093821510 :     s4 = ( t + ( s4 * FFT_C52 ) );
    4262  3093821510 :     s2 = ( t + ( s2 * FFT_C53 ) );
    4263             : 
    4264  3093821510 :     y10 = ( r1 + s2 );
    4265  3093821510 :     y34 = ( r1 - s2 );
    4266  3093821510 :     y18 = ( r3 - s4 );
    4267  3093821510 :     y26 = ( r3 + s4 );
    4268             : 
    4269  3093821510 :     y11 = ( s1 - r2 );
    4270  3093821510 :     y35 = ( s1 + r2 );
    4271  3093821510 :     y19 = ( s3 + r4 );
    4272  3093821510 :     y27 = ( s3 - r4 );
    4273             : 
    4274  3093821510 :     x0 = re[s * 10];
    4275  3093821510 :     x1 = re[s * 6];
    4276  3093821510 :     x2 = re[s * 2];
    4277  3093821510 :     x3 = re[s * 18];
    4278  3093821510 :     x4 = re[s * 14];
    4279             : 
    4280  3093821510 :     r1 = ( x1 + x4 );
    4281  3093821510 :     r4 = ( x1 - x4 );
    4282  3093821510 :     r3 = ( x2 + x3 );
    4283  3093821510 :     r2 = ( x2 - x3 );
    4284  3093821510 :     t = ( ( r1 - r3 ) * FFT_C54 );
    4285  3093821510 :     r1 = ( r1 + r3 );
    4286  3093821510 :     y04 = ( x0 + r1 );
    4287  3093821510 :     r1 = ( y04 + ( ( r1 * FFT_C55 ) ) );
    4288  3093821510 :     r3 = ( r1 - t );
    4289  3093821510 :     r1 = ( r1 + t );
    4290  3093821510 :     t = ( ( ( r4 + r2 ) ) * FFT_C51 );
    4291  3093821510 :     r4 = ( t + ( r4 * FFT_C52 ) );
    4292  3093821510 :     r2 = ( t + ( r2 * FFT_C53 ) );
    4293             : 
    4294  3093821510 :     x0 = im[s * 10];
    4295  3093821510 :     x1 = im[s * 6];
    4296  3093821510 :     x2 = im[s * 2];
    4297  3093821510 :     x3 = im[s * 18];
    4298  3093821510 :     x4 = im[s * 14];
    4299             : 
    4300  3093821510 :     s1 = ( x1 + x4 );
    4301  3093821510 :     s4 = ( x1 - x4 );
    4302  3093821510 :     s3 = ( x2 + x3 );
    4303  3093821510 :     s2 = ( x2 - x3 );
    4304  3093821510 :     t = ( ( s1 - s3 ) * FFT_C54 );
    4305  3093821510 :     s1 = ( s1 + s3 );
    4306  3093821510 :     y05 = ( x0 + s1 );
    4307  3093821510 :     s1 = ( y05 + ( s1 * FFT_C55 ) );
    4308  3093821510 :     s3 = ( s1 - t );
    4309  3093821510 :     s1 = ( s1 + t );
    4310  3093821510 :     t = ( ( s4 + s2 ) * FFT_C51 );
    4311  3093821510 :     s4 = ( t + ( s4 * FFT_C52 ) );
    4312  3093821510 :     s2 = ( t + ( s2 * FFT_C53 ) );
    4313             : 
    4314  3093821510 :     y12 = ( r1 + s2 );
    4315  3093821510 :     y36 = ( r1 - s2 );
    4316  3093821510 :     y20 = ( r3 - s4 );
    4317  3093821510 :     y28 = ( r3 + s4 );
    4318             : 
    4319  3093821510 :     y13 = ( s1 - r2 );
    4320  3093821510 :     y37 = ( s1 + r2 );
    4321  3093821510 :     y21 = ( s3 + r4 );
    4322  3093821510 :     y29 = ( s3 - r4 );
    4323             : 
    4324  3093821510 :     x0 = re[s * 15];
    4325  3093821510 :     x1 = re[s * 11];
    4326  3093821510 :     x2 = re[s * 7];
    4327  3093821510 :     x3 = re[s * 3];
    4328  3093821510 :     x4 = re[s * 19];
    4329             : 
    4330  3093821510 :     r1 = ( x1 + x4 );
    4331  3093821510 :     r4 = ( x1 - x4 );
    4332  3093821510 :     r3 = ( x2 + x3 );
    4333  3093821510 :     r2 = ( x2 - x3 );
    4334  3093821510 :     t = ( ( r1 - r3 ) * FFT_C54 );
    4335  3093821510 :     r1 = ( r1 + r3 );
    4336  3093821510 :     y06 = ( x0 + r1 );
    4337  3093821510 :     r1 = ( y06 + ( ( r1 * FFT_C55 ) ) );
    4338  3093821510 :     r3 = ( r1 - t );
    4339  3093821510 :     r1 = ( r1 + t );
    4340  3093821510 :     t = ( ( ( r4 + r2 ) ) * FFT_C51 );
    4341  3093821510 :     r4 = ( t + ( r4 * FFT_C52 ) );
    4342  3093821510 :     r2 = ( t + ( r2 * FFT_C53 ) );
    4343             : 
    4344  3093821510 :     x0 = im[s * 15];
    4345  3093821510 :     x1 = im[s * 11];
    4346  3093821510 :     x2 = im[s * 7];
    4347  3093821510 :     x3 = im[s * 3];
    4348  3093821510 :     x4 = im[s * 19];
    4349             : 
    4350  3093821510 :     s1 = ( x1 + x4 );
    4351  3093821510 :     s4 = ( x1 - x4 );
    4352  3093821510 :     s3 = ( x2 + x3 );
    4353  3093821510 :     s2 = ( x2 - x3 );
    4354  3093821510 :     t = ( ( s1 - s3 ) * FFT_C54 );
    4355  3093821510 :     s1 = ( s1 + s3 );
    4356  3093821510 :     y07 = ( x0 + s1 );
    4357  3093821510 :     s1 = ( y07 + ( s1 * FFT_C55 ) );
    4358  3093821510 :     s3 = ( s1 - t );
    4359  3093821510 :     s1 = ( s1 + t );
    4360  3093821510 :     t = ( ( s4 + s2 ) * FFT_C51 );
    4361  3093821510 :     s4 = ( t + ( s4 * FFT_C52 ) );
    4362  3093821510 :     s2 = ( t + ( s2 * FFT_C53 ) );
    4363             : 
    4364  3093821510 :     y14 = ( r1 + s2 );
    4365  3093821510 :     y38 = ( r1 - s2 );
    4366  3093821510 :     y22 = ( r3 - s4 );
    4367  3093821510 :     y30 = ( r3 + s4 );
    4368             : 
    4369  3093821510 :     y15 = ( s1 - r2 );
    4370  3093821510 :     y39 = ( s1 + r2 );
    4371  3093821510 :     y23 = ( s3 + r4 );
    4372  3093821510 :     y31 = ( s3 - r4 );
    4373             : 
    4374  3093821510 :     t0 = ( y00 + y04 );
    4375  3093821510 :     t2 = ( y00 - y04 );
    4376  3093821510 :     t1 = ( y01 + y05 );
    4377  3093821510 :     t3 = ( y01 - y05 );
    4378  3093821510 :     t4 = ( y02 + y06 );
    4379  3093821510 :     t7 = ( y02 - y06 );
    4380  3093821510 :     t5 = ( y07 + y03 );
    4381  3093821510 :     t6 = ( y07 - y03 );
    4382             : 
    4383  3093821510 :     re[s * 0] = ( t0 + t4 );
    4384  3093821510 :     im[s * 0] = ( t1 + t5 );
    4385  3093821510 :     re[s * 5] = ( t2 - t6 );
    4386  3093821510 :     im[s * 5] = ( t3 - t7 );
    4387  3093821510 :     re[s * 10] = ( t0 - t4 );
    4388  3093821510 :     im[s * 10] = ( t1 - t5 );
    4389  3093821510 :     re[s * 15] = ( t2 + t6 );
    4390  3093821510 :     im[s * 15] = ( t3 + t7 );
    4391             : 
    4392  3093821510 :     t0 = ( y08 + y12 );
    4393  3093821510 :     t2 = ( y08 - y12 );
    4394  3093821510 :     t1 = ( y09 + y13 );
    4395  3093821510 :     t3 = ( y09 - y13 );
    4396  3093821510 :     t4 = ( y10 + y14 );
    4397  3093821510 :     t7 = ( y10 - y14 );
    4398  3093821510 :     t5 = ( y15 + y11 );
    4399  3093821510 :     t6 = ( y15 - y11 );
    4400             : 
    4401  3093821510 :     re[s * 4] = ( t0 + t4 );
    4402  3093821510 :     im[s * 4] = ( t1 + t5 );
    4403  3093821510 :     re[s * 9] = ( t2 - t6 );
    4404  3093821510 :     im[s * 9] = ( t3 - t7 );
    4405  3093821510 :     re[s * 14] = ( t0 - t4 );
    4406  3093821510 :     im[s * 14] = ( t1 - t5 );
    4407  3093821510 :     re[s * 19] = ( t2 + t6 );
    4408  3093821510 :     im[s * 19] = ( t3 + t7 );
    4409             : 
    4410  3093821510 :     t0 = ( y16 + y20 );
    4411  3093821510 :     t2 = ( y16 - y20 );
    4412  3093821510 :     t1 = ( y17 + y21 );
    4413  3093821510 :     t3 = ( y17 - y21 );
    4414  3093821510 :     t4 = ( y18 + y22 );
    4415  3093821510 :     t7 = ( y18 - y22 );
    4416  3093821510 :     t5 = ( y23 + y19 );
    4417  3093821510 :     t6 = ( y23 - y19 );
    4418             : 
    4419  3093821510 :     re[s * 8] = ( t0 + t4 );
    4420  3093821510 :     im[s * 8] = ( t1 + t5 );
    4421  3093821510 :     re[s * 13] = ( t2 - t6 );
    4422  3093821510 :     im[s * 13] = ( t3 - t7 );
    4423  3093821510 :     re[s * 18] = ( t0 - t4 );
    4424  3093821510 :     im[s * 18] = ( t1 - t5 );
    4425  3093821510 :     re[s * 3] = ( t2 + t6 );
    4426  3093821510 :     im[s * 3] = ( t3 + t7 );
    4427             : 
    4428  3093821510 :     t0 = ( y24 + y28 );
    4429  3093821510 :     t2 = ( y24 - y28 );
    4430  3093821510 :     t1 = ( y25 + y29 );
    4431  3093821510 :     t3 = ( y25 - y29 );
    4432  3093821510 :     t4 = ( y26 + y30 );
    4433  3093821510 :     t7 = ( y26 - y30 );
    4434  3093821510 :     t5 = ( y31 + y27 );
    4435  3093821510 :     t6 = ( y31 - y27 );
    4436             : 
    4437  3093821510 :     re[s * 12] = ( t0 + t4 );
    4438  3093821510 :     im[s * 12] = ( t1 + t5 );
    4439  3093821510 :     re[s * 17] = ( t2 - t6 );
    4440  3093821510 :     im[s * 17] = ( t3 - t7 );
    4441  3093821510 :     re[s * 2] = ( t0 - t4 );
    4442  3093821510 :     im[s * 2] = ( t1 - t5 );
    4443  3093821510 :     re[s * 7] = ( t2 + t6 );
    4444  3093821510 :     im[s * 7] = ( t3 + t7 );
    4445             : 
    4446  3093821510 :     t0 = ( y32 + y36 );
    4447  3093821510 :     t2 = ( y32 - y36 );
    4448  3093821510 :     t1 = ( y33 + y37 );
    4449  3093821510 :     t3 = ( y33 - y37 );
    4450  3093821510 :     t4 = ( y34 + y38 );
    4451  3093821510 :     t7 = ( y34 - y38 );
    4452  3093821510 :     t5 = ( y39 + y35 );
    4453  3093821510 :     t6 = ( y39 - y35 );
    4454             : 
    4455  3093821510 :     re[s * 16] = ( t0 + t4 );
    4456  3093821510 :     im[s * 16] = ( t1 + t5 );
    4457  3093821510 :     re[s * 1] = ( t2 - t6 );
    4458  3093821510 :     im[s * 1] = ( t3 - t7 );
    4459  3093821510 :     re[s * 6] = ( t0 - t4 );
    4460  3093821510 :     im[s * 6] = ( t1 - t5 );
    4461  3093821510 :     re[s * 11] = ( t2 + t6 );
    4462  3093821510 :     im[s * 11] = ( t3 + t7 );
    4463             : 
    4464  3093821510 :     return;
    4465             : }
    4466             : 
    4467  4131163756 : static void fft_len30(
    4468             :     float *re,
    4469             :     float *im,
    4470             :     const int16_t s )
    4471             : {
    4472             :     float t;
    4473             :     float r1, r2, r3, r4;
    4474             :     float s1, s2, s3, s4;
    4475             :     float x00, x01, x02, x03, x04, x05, x06, x07, x08, x09;
    4476             :     float x10, x11, x12, x13, x14, x15, x16, x17, x18, x19;
    4477             :     float x20, x21, x22, x23, x24, x25, x26, x27, x28, x29;
    4478             : 
    4479             :     float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09;
    4480             :     float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19;
    4481             :     float y20, y21, y22, y23, y24, y25, y26, y27, y28, y29;
    4482             : 
    4483             :     float z00, z01, z02, z03, z04, z05, z06, z07, z08, z09;
    4484             :     float z10, z11, z12, z13, z14, z15, z16, z17, z18, z19;
    4485             :     float z20, z21, z22, z23, z24, z25, z26, z27, z28, z29;
    4486             :     float z30, z31, z32, z33, z34, z35, z36, z37, z38, z39;
    4487             :     float z40, z41, z42, z43, z44, z45, z46, z47, z48, z49;
    4488             :     float z50, z51, z52, z53, z54, z55, z56, z57, z58, z59;
    4489             : 
    4490             :     float *rel, *reh, *iml, *imh;
    4491             : 
    4492  4131163756 :     rel = &re[s * 0];
    4493  4131163756 :     reh = &re[s * 15];
    4494  4131163756 :     iml = &im[s * 0];
    4495  4131163756 :     imh = &im[s * 15];
    4496             : 
    4497  4131163756 :     x00 = re[s * 0];
    4498  4131163756 :     x01 = im[s * 0];
    4499  4131163756 :     x02 = re[s * 18];
    4500  4131163756 :     x03 = im[s * 18];
    4501  4131163756 :     x04 = re[s * 6];
    4502  4131163756 :     x05 = im[s * 6];
    4503  4131163756 :     x06 = re[s * 24];
    4504  4131163756 :     x07 = im[s * 24];
    4505  4131163756 :     x08 = re[s * 12];
    4506  4131163756 :     x09 = im[s * 12];
    4507             : 
    4508  4131163756 :     x10 = re[s * 20];
    4509  4131163756 :     x11 = im[s * 20];
    4510  4131163756 :     x12 = re[s * 8];
    4511  4131163756 :     x13 = im[s * 8];
    4512  4131163756 :     x14 = re[s * 26];
    4513  4131163756 :     x15 = im[s * 26];
    4514  4131163756 :     x16 = re[s * 14];
    4515  4131163756 :     x17 = im[s * 14];
    4516  4131163756 :     x18 = re[s * 2];
    4517  4131163756 :     x19 = im[s * 2];
    4518             : 
    4519  4131163756 :     x20 = re[s * 10];
    4520  4131163756 :     x21 = im[s * 10];
    4521  4131163756 :     x22 = re[s * 28];
    4522  4131163756 :     x23 = im[s * 28];
    4523  4131163756 :     x24 = re[s * 16];
    4524  4131163756 :     x25 = im[s * 16];
    4525  4131163756 :     x26 = re[s * 4];
    4526  4131163756 :     x27 = im[s * 4];
    4527  4131163756 :     x28 = re[s * 22];
    4528  4131163756 :     x29 = im[s * 22];
    4529             : 
    4530  4131163756 :     r1 = ( x02 + x08 );
    4531  4131163756 :     r4 = ( x02 - x08 );
    4532  4131163756 :     r3 = ( x04 + x06 );
    4533  4131163756 :     r2 = ( x04 - x06 );
    4534  4131163756 :     t = ( ( r1 - r3 ) * FFT_C54 );
    4535  4131163756 :     r1 = ( r1 + r3 );
    4536  4131163756 :     y00 = ( x00 + r1 );
    4537  4131163756 :     r1 = ( y00 + ( ( r1 * FFT_C55 ) ) );
    4538  4131163756 :     r3 = ( r1 - t );
    4539  4131163756 :     r1 = ( r1 + t );
    4540  4131163756 :     t = ( ( ( r4 + r2 ) ) * FFT_C51 );
    4541  4131163756 :     r4 = ( t + ( r4 * FFT_C52 ) );
    4542  4131163756 :     r2 = ( t + ( r2 * FFT_C53 ) );
    4543             : 
    4544  4131163756 :     s1 = ( x03 + x09 );
    4545  4131163756 :     s4 = ( x03 - x09 );
    4546  4131163756 :     s3 = ( x05 + x07 );
    4547  4131163756 :     s2 = ( x05 - x07 );
    4548  4131163756 :     t = ( ( s1 - s3 ) * FFT_C54 );
    4549  4131163756 :     s1 = ( s1 + s3 );
    4550  4131163756 :     y01 = ( x01 + s1 );
    4551  4131163756 :     s1 = ( y01 + ( s1 * FFT_C55 ) );
    4552  4131163756 :     s3 = ( s1 - t );
    4553  4131163756 :     s1 = ( s1 + t );
    4554  4131163756 :     t = ( ( s4 + s2 ) * FFT_C51 );
    4555  4131163756 :     s4 = ( t + ( s4 * FFT_C52 ) );
    4556  4131163756 :     s2 = ( t + ( s2 * FFT_C53 ) );
    4557             : 
    4558  4131163756 :     y02 = ( r1 + s2 );
    4559  4131163756 :     y08 = ( r1 - s2 );
    4560  4131163756 :     y04 = ( r3 - s4 );
    4561  4131163756 :     y06 = ( r3 + s4 );
    4562             : 
    4563  4131163756 :     y03 = ( s1 - r2 );
    4564  4131163756 :     y09 = ( s1 + r2 );
    4565  4131163756 :     y05 = ( s3 + r4 );
    4566  4131163756 :     y07 = ( s3 - r4 );
    4567             : 
    4568  4131163756 :     r1 = ( x12 + x18 );
    4569  4131163756 :     r4 = ( x12 - x18 );
    4570  4131163756 :     r3 = ( x14 + x16 );
    4571  4131163756 :     r2 = ( x14 - x16 );
    4572  4131163756 :     t = ( ( r1 - r3 ) * FFT_C54 );
    4573  4131163756 :     r1 = ( r1 + r3 );
    4574  4131163756 :     y10 = ( x10 + r1 );
    4575  4131163756 :     r1 = ( y10 + ( ( r1 * FFT_C55 ) ) );
    4576  4131163756 :     r3 = ( r1 - t );
    4577  4131163756 :     r1 = ( r1 + t );
    4578  4131163756 :     t = ( ( ( r4 + r2 ) ) * FFT_C51 );
    4579  4131163756 :     r4 = ( t + ( r4 * FFT_C52 ) );
    4580  4131163756 :     r2 = ( t + ( r2 * FFT_C53 ) );
    4581             : 
    4582  4131163756 :     s1 = ( x13 + x19 );
    4583  4131163756 :     s4 = ( x13 - x19 );
    4584  4131163756 :     s3 = ( x15 + x17 );
    4585  4131163756 :     s2 = ( x15 - x17 );
    4586  4131163756 :     t = ( ( s1 - s3 ) * FFT_C54 );
    4587  4131163756 :     s1 = ( s1 + s3 );
    4588  4131163756 :     y11 = ( x11 + s1 );
    4589  4131163756 :     s1 = ( y11 + ( s1 * FFT_C55 ) );
    4590  4131163756 :     s3 = ( s1 - t );
    4591  4131163756 :     s1 = ( s1 + t );
    4592  4131163756 :     t = ( ( s4 + s2 ) * FFT_C51 );
    4593  4131163756 :     s4 = ( t + ( s4 * FFT_C52 ) );
    4594  4131163756 :     s2 = ( t + ( s2 * FFT_C53 ) );
    4595             : 
    4596  4131163756 :     y12 = ( r1 + s2 );
    4597  4131163756 :     y18 = ( r1 - s2 );
    4598  4131163756 :     y14 = ( r3 - s4 );
    4599  4131163756 :     y16 = ( r3 + s4 );
    4600             : 
    4601  4131163756 :     y13 = ( s1 - r2 );
    4602  4131163756 :     y19 = ( s1 + r2 );
    4603  4131163756 :     y15 = ( s3 + r4 );
    4604  4131163756 :     y17 = ( s3 - r4 );
    4605             : 
    4606  4131163756 :     r1 = ( x22 + x28 );
    4607  4131163756 :     r4 = ( x22 - x28 );
    4608  4131163756 :     r3 = ( x24 + x26 );
    4609  4131163756 :     r2 = ( x24 - x26 );
    4610  4131163756 :     t = ( ( r1 - r3 ) * FFT_C54 );
    4611  4131163756 :     r1 = ( r1 + r3 );
    4612  4131163756 :     y20 = ( x20 + r1 );
    4613  4131163756 :     r1 = ( y20 + ( ( r1 * FFT_C55 ) ) );
    4614  4131163756 :     r3 = ( r1 - t );
    4615  4131163756 :     r1 = ( r1 + t );
    4616  4131163756 :     t = ( ( ( r4 + r2 ) ) * FFT_C51 );
    4617  4131163756 :     r4 = ( t + ( r4 * FFT_C52 ) );
    4618  4131163756 :     r2 = ( t + ( r2 * FFT_C53 ) );
    4619             : 
    4620  4131163756 :     s1 = ( x23 + x29 );
    4621  4131163756 :     s4 = ( x23 - x29 );
    4622  4131163756 :     s3 = ( x25 + x27 );
    4623  4131163756 :     s2 = ( x25 - x27 );
    4624  4131163756 :     t = ( ( s1 - s3 ) * FFT_C54 );
    4625  4131163756 :     s1 = ( s1 + s3 );
    4626  4131163756 :     y21 = ( x21 + s1 );
    4627  4131163756 :     s1 = ( y21 + ( s1 * FFT_C55 ) );
    4628  4131163756 :     s3 = ( s1 - t );
    4629  4131163756 :     s1 = ( s1 + t );
    4630  4131163756 :     t = ( ( s4 + s2 ) * FFT_C51 );
    4631  4131163756 :     s4 = ( t + ( s4 * FFT_C52 ) );
    4632  4131163756 :     s2 = ( t + ( s2 * FFT_C53 ) );
    4633             : 
    4634  4131163756 :     y22 = ( r1 + s2 );
    4635  4131163756 :     y28 = ( r1 - s2 );
    4636  4131163756 :     y24 = ( r3 - s4 );
    4637  4131163756 :     y26 = ( r3 + s4 );
    4638             : 
    4639  4131163756 :     y23 = ( s1 - r2 );
    4640  4131163756 :     y29 = ( s1 + r2 );
    4641  4131163756 :     y25 = ( s3 + r4 );
    4642  4131163756 :     y27 = ( s3 - r4 );
    4643             : 
    4644  4131163756 :     r1 = ( y10 + y20 );
    4645  4131163756 :     r2 = ( ( y10 - y20 ) * FFT_C31 );
    4646  4131163756 :     z00 = ( y00 + r1 );
    4647  4131163756 :     r1 = ( y00 - r1 * 0.5f );
    4648             : 
    4649  4131163756 :     s1 = ( y11 + y21 );
    4650  4131163756 :     s2 = ( ( y11 - y21 ) * FFT_C31 );
    4651  4131163756 :     z01 = ( y01 + s1 );
    4652  4131163756 :     s1 = ( y01 - s1 * 0.5f );
    4653             : 
    4654  4131163756 :     z20 = ( r1 - s2 );
    4655  4131163756 :     z10 = ( r1 + s2 );
    4656  4131163756 :     z21 = ( s1 + r2 );
    4657  4131163756 :     z11 = ( s1 - r2 );
    4658             : 
    4659  4131163756 :     r1 = ( y12 + y22 );
    4660  4131163756 :     r2 = ( ( y12 - y22 ) * FFT_C31 );
    4661  4131163756 :     z12 = ( y02 + r1 );
    4662  4131163756 :     r1 = ( y02 - r1 * 0.5f );
    4663             : 
    4664  4131163756 :     s1 = ( y13 + y23 );
    4665  4131163756 :     s2 = ( ( y13 - y23 ) * FFT_C31 );
    4666  4131163756 :     z13 = ( y03 + s1 );
    4667  4131163756 :     s1 = ( y03 - s1 * 0.5f );
    4668             : 
    4669  4131163756 :     z02 = ( r1 - s2 );
    4670  4131163756 :     z22 = ( r1 + s2 );
    4671  4131163756 :     z03 = ( s1 + r2 );
    4672  4131163756 :     z23 = ( s1 - r2 );
    4673             : 
    4674  4131163756 :     r1 = ( y14 + y24 );
    4675  4131163756 :     r2 = ( ( y14 - y24 ) * FFT_C31 );
    4676  4131163756 :     z24 = ( y04 + r1 );
    4677  4131163756 :     r1 = ( y04 - r1 * 0.5f );
    4678             : 
    4679  4131163756 :     s1 = ( y15 + y25 );
    4680  4131163756 :     s2 = ( ( y15 - y25 ) * FFT_C31 );
    4681  4131163756 :     z25 = ( y05 + s1 );
    4682  4131163756 :     s1 = ( y05 - s1 * 0.5f );
    4683             : 
    4684  4131163756 :     z14 = ( r1 - s2 );
    4685  4131163756 :     z04 = ( r1 + s2 );
    4686  4131163756 :     z15 = ( s1 + r2 );
    4687  4131163756 :     z05 = ( s1 - r2 );
    4688             : 
    4689  4131163756 :     r1 = ( y16 + y26 );
    4690  4131163756 :     r2 = ( ( y16 - y26 ) * FFT_C31 );
    4691  4131163756 :     z06 = ( y06 + r1 );
    4692  4131163756 :     r1 = ( y06 - r1 * 0.5f );
    4693             : 
    4694  4131163756 :     s1 = ( y17 + y27 );
    4695  4131163756 :     s2 = ( ( y17 - y27 ) * FFT_C31 );
    4696  4131163756 :     z07 = ( y07 + s1 );
    4697  4131163756 :     s1 = ( y07 - s1 * 0.5f );
    4698             : 
    4699  4131163756 :     z26 = ( r1 - s2 );
    4700  4131163756 :     z16 = ( r1 + s2 );
    4701  4131163756 :     z27 = ( s1 + r2 );
    4702  4131163756 :     z17 = ( s1 - r2 );
    4703             : 
    4704  4131163756 :     r1 = ( y18 + y28 );
    4705  4131163756 :     r2 = ( ( y18 - y28 ) * FFT_C31 );
    4706  4131163756 :     z18 = ( y08 + r1 );
    4707  4131163756 :     r1 = ( y08 - r1 * 0.5f );
    4708             : 
    4709  4131163756 :     s1 = ( y19 + y29 );
    4710  4131163756 :     s2 = ( ( y19 - y29 ) * FFT_C31 );
    4711  4131163756 :     z19 = ( y09 + s1 );
    4712  4131163756 :     s1 = ( y09 - s1 * 0.5f );
    4713             : 
    4714  4131163756 :     z08 = ( r1 - s2 );
    4715  4131163756 :     z28 = ( r1 + s2 );
    4716  4131163756 :     z09 = ( s1 + r2 );
    4717  4131163756 :     z29 = ( s1 - r2 );
    4718             : 
    4719  4131163756 :     x00 = re[s * 15];
    4720  4131163756 :     x01 = im[s * 15];
    4721  4131163756 :     x02 = re[s * 3];
    4722  4131163756 :     x03 = im[s * 3];
    4723  4131163756 :     x04 = re[s * 21];
    4724  4131163756 :     x05 = im[s * 21];
    4725  4131163756 :     x06 = re[s * 9];
    4726  4131163756 :     x07 = im[s * 9];
    4727  4131163756 :     x08 = re[s * 27];
    4728  4131163756 :     x09 = im[s * 27];
    4729             : 
    4730  4131163756 :     x10 = re[s * 5];
    4731  4131163756 :     x11 = im[s * 5];
    4732  4131163756 :     x12 = re[s * 23];
    4733  4131163756 :     x13 = im[s * 23];
    4734  4131163756 :     x14 = re[s * 11];
    4735  4131163756 :     x15 = im[s * 11];
    4736  4131163756 :     x16 = re[s * 29];
    4737  4131163756 :     x17 = im[s * 29];
    4738  4131163756 :     x18 = re[s * 17];
    4739  4131163756 :     x19 = im[s * 17];
    4740             : 
    4741  4131163756 :     x20 = re[s * 25];
    4742  4131163756 :     x21 = im[s * 25];
    4743  4131163756 :     x22 = re[s * 13];
    4744  4131163756 :     x23 = im[s * 13];
    4745  4131163756 :     x24 = re[s * 1];
    4746  4131163756 :     x25 = im[s * 1];
    4747  4131163756 :     x26 = re[s * 19];
    4748  4131163756 :     x27 = im[s * 19];
    4749  4131163756 :     x28 = re[s * 7];
    4750  4131163756 :     x29 = im[s * 7];
    4751             : 
    4752  4131163756 :     r1 = ( x02 + x08 );
    4753  4131163756 :     r4 = ( x02 - x08 );
    4754  4131163756 :     r3 = ( x04 + x06 );
    4755  4131163756 :     r2 = ( x04 - x06 );
    4756  4131163756 :     t = ( ( r1 - r3 ) * FFT_C54 );
    4757  4131163756 :     r1 = ( r1 + r3 );
    4758  4131163756 :     y00 = ( x00 + r1 );
    4759  4131163756 :     r1 = ( y00 + ( ( r1 * FFT_C55 ) ) );
    4760  4131163756 :     r3 = ( r1 - t );
    4761  4131163756 :     r1 = ( r1 + t );
    4762  4131163756 :     t = ( ( ( r4 + r2 ) ) * FFT_C51 );
    4763  4131163756 :     r4 = ( t + ( r4 * FFT_C52 ) );
    4764  4131163756 :     r2 = ( t + ( r2 * FFT_C53 ) );
    4765             : 
    4766  4131163756 :     s1 = ( x03 + x09 );
    4767  4131163756 :     s4 = ( x03 - x09 );
    4768  4131163756 :     s3 = ( x05 + x07 );
    4769  4131163756 :     s2 = ( x05 - x07 );
    4770  4131163756 :     t = ( ( s1 - s3 ) * FFT_C54 );
    4771  4131163756 :     s1 = ( s1 + s3 );
    4772  4131163756 :     y01 = ( x01 + s1 );
    4773  4131163756 :     s1 = ( y01 + ( s1 * FFT_C55 ) );
    4774  4131163756 :     s3 = ( s1 - t );
    4775  4131163756 :     s1 = ( s1 + t );
    4776  4131163756 :     t = ( ( s4 + s2 ) * FFT_C51 );
    4777  4131163756 :     s4 = ( t + ( s4 * FFT_C52 ) );
    4778  4131163756 :     s2 = ( t + ( s2 * FFT_C53 ) );
    4779             : 
    4780  4131163756 :     y02 = ( r1 + s2 );
    4781  4131163756 :     y08 = ( r1 - s2 );
    4782  4131163756 :     y04 = ( r3 - s4 );
    4783  4131163756 :     y06 = ( r3 + s4 );
    4784             : 
    4785  4131163756 :     y03 = ( s1 - r2 );
    4786  4131163756 :     y09 = ( s1 + r2 );
    4787  4131163756 :     y05 = ( s3 + r4 );
    4788  4131163756 :     y07 = ( s3 - r4 );
    4789             : 
    4790  4131163756 :     r1 = ( x12 + x18 );
    4791  4131163756 :     r4 = ( x12 - x18 );
    4792  4131163756 :     r3 = ( x14 + x16 );
    4793  4131163756 :     r2 = ( x14 - x16 );
    4794  4131163756 :     t = ( ( r1 - r3 ) * FFT_C54 );
    4795  4131163756 :     r1 = ( r1 + r3 );
    4796  4131163756 :     y10 = ( x10 + r1 );
    4797  4131163756 :     r1 = ( y10 + ( ( r1 * FFT_C55 ) ) );
    4798  4131163756 :     r3 = ( r1 - t );
    4799  4131163756 :     r1 = ( r1 + t );
    4800  4131163756 :     t = ( ( ( r4 + r2 ) ) * FFT_C51 );
    4801  4131163756 :     r4 = ( t + ( r4 * FFT_C52 ) );
    4802  4131163756 :     r2 = ( t + ( r2 * FFT_C53 ) );
    4803             : 
    4804  4131163756 :     s1 = ( x13 + x19 );
    4805  4131163756 :     s4 = ( x13 - x19 );
    4806  4131163756 :     s3 = ( x15 + x17 );
    4807  4131163756 :     s2 = ( x15 - x17 );
    4808  4131163756 :     t = ( ( s1 - s3 ) * FFT_C54 );
    4809  4131163756 :     s1 = ( s1 + s3 );
    4810  4131163756 :     y11 = ( x11 + s1 );
    4811  4131163756 :     s1 = ( y11 + ( s1 * FFT_C55 ) );
    4812  4131163756 :     s3 = ( s1 - t );
    4813  4131163756 :     s1 = ( s1 + t );
    4814  4131163756 :     t = ( ( s4 + s2 ) * FFT_C51 );
    4815  4131163756 :     s4 = ( t + ( s4 * FFT_C52 ) );
    4816  4131163756 :     s2 = ( t + ( s2 * FFT_C53 ) );
    4817             : 
    4818  4131163756 :     y12 = ( r1 + s2 );
    4819  4131163756 :     y18 = ( r1 - s2 );
    4820  4131163756 :     y14 = ( r3 - s4 );
    4821  4131163756 :     y16 = ( r3 + s4 );
    4822             : 
    4823  4131163756 :     y13 = ( s1 - r2 );
    4824  4131163756 :     y19 = ( s1 + r2 );
    4825  4131163756 :     y15 = ( s3 + r4 );
    4826  4131163756 :     y17 = ( s3 - r4 );
    4827             : 
    4828  4131163756 :     r1 = ( x22 + x28 );
    4829  4131163756 :     r4 = ( x22 - x28 );
    4830  4131163756 :     r3 = ( x24 + x26 );
    4831  4131163756 :     r2 = ( x24 - x26 );
    4832  4131163756 :     t = ( ( r1 - r3 ) * FFT_C54 );
    4833  4131163756 :     r1 = ( r1 + r3 );
    4834  4131163756 :     y20 = ( x20 + r1 );
    4835  4131163756 :     r1 = ( y20 + ( ( r1 * FFT_C55 ) ) );
    4836  4131163756 :     r3 = ( r1 - t );
    4837  4131163756 :     r1 = ( r1 + t );
    4838  4131163756 :     t = ( ( ( r4 + r2 ) ) * FFT_C51 );
    4839  4131163756 :     r4 = ( t + ( r4 * FFT_C52 ) );
    4840  4131163756 :     r2 = ( t + ( r2 * FFT_C53 ) );
    4841             : 
    4842  4131163756 :     s1 = ( x23 + x29 );
    4843  4131163756 :     s4 = ( x23 - x29 );
    4844  4131163756 :     s3 = ( x25 + x27 );
    4845  4131163756 :     s2 = ( x25 - x27 );
    4846  4131163756 :     t = ( ( s1 - s3 ) * FFT_C54 );
    4847  4131163756 :     s1 = ( s1 + s3 );
    4848  4131163756 :     y21 = ( x21 + s1 );
    4849  4131163756 :     s1 = ( y21 + ( s1 * FFT_C55 ) );
    4850  4131163756 :     s3 = ( s1 - t );
    4851  4131163756 :     s1 = ( s1 + t );
    4852  4131163756 :     t = ( ( s4 + s2 ) * FFT_C51 );
    4853  4131163756 :     s4 = ( t + ( s4 * FFT_C52 ) );
    4854  4131163756 :     s2 = ( t + ( s2 * FFT_C53 ) );
    4855             : 
    4856  4131163756 :     y22 = ( r1 + s2 );
    4857  4131163756 :     y28 = ( r1 - s2 );
    4858  4131163756 :     y24 = ( r3 - s4 );
    4859  4131163756 :     y26 = ( r3 + s4 );
    4860             : 
    4861  4131163756 :     y23 = ( s1 - r2 );
    4862  4131163756 :     y29 = ( s1 + r2 );
    4863  4131163756 :     y25 = ( s3 + r4 );
    4864  4131163756 :     y27 = ( s3 - r4 );
    4865             : 
    4866  4131163756 :     r1 = ( y10 + y20 );
    4867  4131163756 :     r2 = ( ( y10 - y20 ) * FFT_C31 );
    4868  4131163756 :     z30 = ( y00 + r1 );
    4869  4131163756 :     r1 = ( y00 - r1 * 0.5f );
    4870             : 
    4871  4131163756 :     s1 = ( y11 + y21 );
    4872  4131163756 :     s2 = ( ( y11 - y21 ) * FFT_C31 );
    4873  4131163756 :     z31 = ( y01 + s1 );
    4874  4131163756 :     s1 = ( y01 - s1 * 0.5f );
    4875             : 
    4876  4131163756 :     z50 = ( r1 - s2 );
    4877  4131163756 :     z40 = ( r1 + s2 );
    4878  4131163756 :     z51 = ( s1 + r2 );
    4879  4131163756 :     z41 = ( s1 - r2 );
    4880             : 
    4881  4131163756 :     r1 = ( y12 + y22 );
    4882  4131163756 :     r2 = ( ( y12 - y22 ) * FFT_C31 );
    4883  4131163756 :     z42 = ( y02 + r1 );
    4884  4131163756 :     r1 = ( y02 - r1 * 0.5f );
    4885             : 
    4886  4131163756 :     s1 = ( y13 + y23 );
    4887  4131163756 :     s2 = ( ( y13 - y23 ) * FFT_C31 );
    4888  4131163756 :     z43 = ( y03 + s1 );
    4889  4131163756 :     s1 = ( y03 - s1 * 0.5f );
    4890             : 
    4891  4131163756 :     z32 = ( r1 - s2 );
    4892  4131163756 :     z52 = ( r1 + s2 );
    4893  4131163756 :     z33 = ( s1 + r2 );
    4894  4131163756 :     z53 = ( s1 - r2 );
    4895             : 
    4896  4131163756 :     r1 = ( y14 + y24 );
    4897  4131163756 :     r2 = ( ( y14 - y24 ) * FFT_C31 );
    4898  4131163756 :     z54 = ( y04 + r1 );
    4899  4131163756 :     r1 = ( y04 - r1 * 0.5f );
    4900             : 
    4901  4131163756 :     s1 = ( y15 + y25 );
    4902  4131163756 :     s2 = ( ( y15 - y25 ) * FFT_C31 );
    4903  4131163756 :     z55 = ( y05 + s1 );
    4904  4131163756 :     s1 = ( y05 - s1 * 0.5f );
    4905             : 
    4906  4131163756 :     z44 = ( r1 - s2 );
    4907  4131163756 :     z34 = ( r1 + s2 );
    4908  4131163756 :     z45 = ( s1 + r2 );
    4909  4131163756 :     z35 = ( s1 - r2 );
    4910             : 
    4911  4131163756 :     r1 = ( y16 + y26 );
    4912  4131163756 :     r2 = ( ( y16 - y26 ) * FFT_C31 );
    4913  4131163756 :     z36 = ( y06 + r1 );
    4914  4131163756 :     r1 = ( y06 - r1 * 0.5f );
    4915             : 
    4916  4131163756 :     s1 = ( y17 + y27 );
    4917  4131163756 :     s2 = ( ( y17 - y27 ) * FFT_C31 );
    4918  4131163756 :     z37 = ( y07 + s1 );
    4919  4131163756 :     s1 = ( y07 - s1 * 0.5f );
    4920             : 
    4921  4131163756 :     z56 = ( r1 - s2 );
    4922  4131163756 :     z46 = ( r1 + s2 );
    4923  4131163756 :     z57 = ( s1 + r2 );
    4924  4131163756 :     z47 = ( s1 - r2 );
    4925             : 
    4926  4131163756 :     r1 = ( y18 + y28 );
    4927  4131163756 :     r2 = ( ( y18 - y28 ) * FFT_C31 );
    4928  4131163756 :     z48 = ( y08 + r1 );
    4929  4131163756 :     r1 = ( y08 - r1 * 0.5f );
    4930             : 
    4931  4131163756 :     s1 = ( y19 + y29 );
    4932  4131163756 :     s2 = ( ( y19 - y29 ) * FFT_C31 );
    4933  4131163756 :     z49 = ( y09 + s1 );
    4934  4131163756 :     s1 = ( y09 - s1 * 0.5f );
    4935             : 
    4936  4131163756 :     z38 = ( r1 - s2 );
    4937  4131163756 :     z58 = ( r1 + s2 );
    4938  4131163756 :     z39 = ( s1 + r2 );
    4939  4131163756 :     z59 = ( s1 - r2 );
    4940             : 
    4941  4131163756 :     r1 = z00;
    4942  4131163756 :     r2 = z30;
    4943  4131163756 :     r3 = z01;
    4944  4131163756 :     r4 = z31;
    4945  4131163756 :     *rel = ( r1 + r2 );
    4946  4131163756 :     *reh = ( r1 - r2 );
    4947  4131163756 :     *iml = ( r3 + r4 );
    4948  4131163756 :     *imh = ( r3 - r4 );
    4949  4131163756 :     rel += s, reh += s, iml += s;
    4950  4131163756 :     imh += s;
    4951             : 
    4952  4131163756 :     r1 = z16;
    4953  4131163756 :     r2 = z46;
    4954  4131163756 :     r3 = z17;
    4955  4131163756 :     r4 = z47;
    4956  4131163756 :     *reh = ( r1 + r2 );
    4957  4131163756 :     *rel = ( r1 - r2 );
    4958  4131163756 :     *imh = ( r3 + r4 );
    4959  4131163756 :     *iml = ( r3 - r4 );
    4960  4131163756 :     rel += s, reh += s, iml += s;
    4961  4131163756 :     imh += s;
    4962             : 
    4963  4131163756 :     r1 = z02;
    4964  4131163756 :     r2 = z32;
    4965  4131163756 :     r3 = z03;
    4966  4131163756 :     r4 = z33;
    4967  4131163756 :     *rel = ( r1 + r2 );
    4968  4131163756 :     *reh = ( r1 - r2 );
    4969  4131163756 :     *iml = ( r3 + r4 );
    4970  4131163756 :     *imh = ( r3 - r4 );
    4971  4131163756 :     rel += s, reh += s, iml += s;
    4972  4131163756 :     imh += s;
    4973             : 
    4974  4131163756 :     r1 = z18;
    4975  4131163756 :     r2 = z48;
    4976  4131163756 :     r3 = z19;
    4977  4131163756 :     r4 = z49;
    4978  4131163756 :     *reh = ( r1 + r2 );
    4979  4131163756 :     *rel = ( r1 - r2 );
    4980  4131163756 :     *imh = ( r3 + r4 );
    4981  4131163756 :     *iml = ( r3 - r4 );
    4982  4131163756 :     rel += s, reh += s, iml += s;
    4983  4131163756 :     imh += s;
    4984             : 
    4985  4131163756 :     r1 = z04;
    4986  4131163756 :     r2 = z34;
    4987  4131163756 :     r3 = z05;
    4988  4131163756 :     r4 = z35;
    4989  4131163756 :     *rel = ( r1 + r2 );
    4990  4131163756 :     *reh = ( r1 - r2 );
    4991  4131163756 :     *iml = ( r3 + r4 );
    4992  4131163756 :     *imh = ( r3 - r4 );
    4993  4131163756 :     rel += s, reh += s, iml += s;
    4994  4131163756 :     imh += s;
    4995             : 
    4996  4131163756 :     r1 = z20;
    4997  4131163756 :     r2 = z50;
    4998  4131163756 :     r3 = z21;
    4999  4131163756 :     r4 = z51;
    5000  4131163756 :     *reh = ( r1 + r2 );
    5001  4131163756 :     *rel = ( r1 - r2 );
    5002  4131163756 :     *imh = ( r3 + r4 );
    5003  4131163756 :     *iml = ( r3 - r4 );
    5004  4131163756 :     rel += s, reh += s, iml += s;
    5005  4131163756 :     imh += s;
    5006             : 
    5007  4131163756 :     r1 = z06;
    5008  4131163756 :     r2 = z36;
    5009  4131163756 :     r3 = z07;
    5010  4131163756 :     r4 = z37;
    5011  4131163756 :     *rel = ( r1 + r2 );
    5012  4131163756 :     *reh = ( r1 - r2 );
    5013  4131163756 :     *iml = ( r3 + r4 );
    5014  4131163756 :     *imh = ( r3 - r4 );
    5015  4131163756 :     rel += s, reh += s, iml += s;
    5016  4131163756 :     imh += s;
    5017             : 
    5018  4131163756 :     r1 = z22;
    5019  4131163756 :     r2 = z52;
    5020  4131163756 :     r3 = z23;
    5021  4131163756 :     r4 = z53;
    5022  4131163756 :     *reh = ( r1 + r2 );
    5023  4131163756 :     *rel = ( r1 - r2 );
    5024  4131163756 :     *imh = ( r3 + r4 );
    5025  4131163756 :     *iml = ( r3 - r4 );
    5026  4131163756 :     rel += s, reh += s, iml += s;
    5027  4131163756 :     imh += s;
    5028             : 
    5029  4131163756 :     r1 = z08;
    5030  4131163756 :     r2 = z38;
    5031  4131163756 :     r3 = z09;
    5032  4131163756 :     r4 = z39;
    5033  4131163756 :     *rel = ( r1 + r2 );
    5034  4131163756 :     *reh = ( r1 - r2 );
    5035  4131163756 :     *iml = ( r3 + r4 );
    5036  4131163756 :     *imh = ( r3 - r4 );
    5037  4131163756 :     rel += s, reh += s, iml += s;
    5038  4131163756 :     imh += s;
    5039             : 
    5040  4131163756 :     r1 = z24;
    5041  4131163756 :     r2 = z54;
    5042  4131163756 :     r3 = z25;
    5043  4131163756 :     r4 = z55;
    5044  4131163756 :     *reh = ( r1 + r2 );
    5045  4131163756 :     *rel = ( r1 - r2 );
    5046  4131163756 :     *imh = ( r3 + r4 );
    5047  4131163756 :     *iml = ( r3 - r4 );
    5048  4131163756 :     rel += s, reh += s, iml += s;
    5049  4131163756 :     imh += s;
    5050             : 
    5051  4131163756 :     r1 = z10;
    5052  4131163756 :     r2 = z40;
    5053  4131163756 :     r3 = z11;
    5054  4131163756 :     r4 = z41;
    5055  4131163756 :     *rel = ( r1 + r2 );
    5056  4131163756 :     *reh = ( r1 - r2 );
    5057  4131163756 :     *iml = ( r3 + r4 );
    5058  4131163756 :     *imh = ( r3 - r4 );
    5059  4131163756 :     rel += s, reh += s, iml += s;
    5060  4131163756 :     imh += s;
    5061             : 
    5062  4131163756 :     r1 = z26;
    5063  4131163756 :     r2 = z56;
    5064  4131163756 :     r3 = z27;
    5065  4131163756 :     r4 = z57;
    5066  4131163756 :     *reh = ( r1 + r2 );
    5067  4131163756 :     *rel = ( r1 - r2 );
    5068  4131163756 :     *imh = ( r3 + r4 );
    5069  4131163756 :     *iml = ( r3 - r4 );
    5070  4131163756 :     rel += s, reh += s, iml += s;
    5071  4131163756 :     imh += s;
    5072             : 
    5073  4131163756 :     r1 = z12;
    5074  4131163756 :     r2 = z42;
    5075  4131163756 :     r3 = z13;
    5076  4131163756 :     r4 = z43;
    5077  4131163756 :     *rel = ( r1 + r2 );
    5078  4131163756 :     *reh = ( r1 - r2 );
    5079  4131163756 :     *iml = ( r3 + r4 );
    5080  4131163756 :     *imh = ( r3 - r4 );
    5081  4131163756 :     rel += s, reh += s, iml += s;
    5082  4131163756 :     imh += s;
    5083             : 
    5084  4131163756 :     r1 = z28;
    5085  4131163756 :     r2 = z58;
    5086  4131163756 :     r3 = z29;
    5087  4131163756 :     r4 = z59;
    5088  4131163756 :     *reh = ( r1 + r2 );
    5089  4131163756 :     *rel = ( r1 - r2 );
    5090  4131163756 :     *imh = ( r3 + r4 );
    5091  4131163756 :     *iml = ( r3 - r4 );
    5092  4131163756 :     rel += s, reh += s, iml += s;
    5093  4131163756 :     imh += s;
    5094             : 
    5095  4131163756 :     r1 = z14;
    5096  4131163756 :     r2 = z44;
    5097  4131163756 :     r3 = z15;
    5098  4131163756 :     r4 = z45;
    5099  4131163756 :     *rel = ( r1 + r2 );
    5100  4131163756 :     *reh = ( r1 - r2 );
    5101  4131163756 :     *iml = ( r3 + r4 );
    5102  4131163756 :     *imh = ( r3 - r4 );
    5103  4131163756 :     rel += s, reh += s, iml += s;
    5104  4131163756 :     imh += s;
    5105             : 
    5106  4131163756 :     return;
    5107             : }
    5108             : 
    5109   545556206 : static void fft_len32(
    5110             :     float *re,
    5111             :     float *im,
    5112             :     const int16_t s )
    5113             : {
    5114             :     float as, bs;
    5115             :     float x00, x01, x02, x03, x04, x05, x06, x07;
    5116             :     float x08, x09, x10, x11, x12, x13, x14, x15;
    5117             :     float t00, t01, t02, t03, t04, t05, t06, t07;
    5118             :     float t08, t09, t10, t11, t12, t13, t14, t15;
    5119             :     float s00, s01, s02, s03, s04, s05, s06, s07;
    5120             :     float s08, s09, s10, s11, s12, s13, s14, s15;
    5121             : 
    5122             :     float y00, y01, y02, y03, y04, y05, y06, y07;
    5123             :     float y08, y09, y10, y11, y12, y13, y14, y15;
    5124             :     float y16, y17, y18, y19, y20, y21, y22, y23;
    5125             :     float y24, y25, y26, y27, y28, y29, y30, y31;
    5126             :     float y32, y33, y34, y35, y36, y37, y38, y39;
    5127             :     float y40, y41, y42, y43, y44, y45, y46, y47;
    5128             :     float y48, y49, y50, y51, y52, y53, y54, y55;
    5129             :     float y56, y57, y58, y59, y60, y61, y62, y63;
    5130             : 
    5131   545556206 :     x00 = re[s * 0];
    5132   545556206 :     x01 = im[s * 0];
    5133   545556206 :     x02 = re[s * 4];
    5134   545556206 :     x03 = im[s * 4];
    5135   545556206 :     x04 = re[s * 8];
    5136   545556206 :     x05 = im[s * 8];
    5137   545556206 :     x06 = re[s * 12];
    5138   545556206 :     x07 = im[s * 12];
    5139   545556206 :     x08 = re[s * 16];
    5140   545556206 :     x09 = im[s * 16];
    5141   545556206 :     x10 = re[s * 20];
    5142   545556206 :     x11 = im[s * 20];
    5143   545556206 :     x12 = re[s * 24];
    5144   545556206 :     x13 = im[s * 24];
    5145   545556206 :     x14 = re[s * 28];
    5146   545556206 :     x15 = im[s * 28];
    5147             : 
    5148   545556206 :     t00 = ( x00 + x08 );
    5149   545556206 :     t02 = ( x00 - x08 );
    5150   545556206 :     t01 = ( x01 + x09 );
    5151   545556206 :     t03 = ( x01 - x09 );
    5152   545556206 :     t04 = ( x02 + x10 );
    5153   545556206 :     t06 = ( x02 - x10 );
    5154   545556206 :     t05 = ( x03 + x11 );
    5155   545556206 :     t07 = ( x03 - x11 );
    5156   545556206 :     t08 = ( x04 + x12 );
    5157   545556206 :     t10 = ( x04 - x12 );
    5158   545556206 :     t09 = ( x05 + x13 );
    5159   545556206 :     t11 = ( x05 - x13 );
    5160   545556206 :     t12 = ( x06 + x14 );
    5161   545556206 :     t14 = ( x06 - x14 );
    5162   545556206 :     t13 = ( x07 + x15 );
    5163   545556206 :     t15 = ( x07 - x15 );
    5164             : 
    5165   545556206 :     s00 = ( t00 + t08 );
    5166   545556206 :     s04 = ( t00 - t08 );
    5167   545556206 :     s01 = ( t01 + t09 );
    5168   545556206 :     s05 = ( t01 - t09 );
    5169   545556206 :     s08 = ( t02 - t11 );
    5170   545556206 :     s10 = ( t02 + t11 );
    5171   545556206 :     s09 = ( t03 + t10 );
    5172   545556206 :     s11 = ( t03 - t10 );
    5173   545556206 :     s02 = ( t04 + t12 );
    5174   545556206 :     s07 = ( t04 - t12 );
    5175   545556206 :     s03 = ( t05 + t13 );
    5176   545556206 :     s06 = ( t13 - t05 );
    5177   545556206 :     t01 = ( t06 + t14 );
    5178   545556206 :     t02 = ( t06 - t14 );
    5179   545556206 :     t00 = ( t07 + t15 );
    5180   545556206 :     t03 = ( t07 - t15 );
    5181             : 
    5182             :     {
    5183   545556206 :         s12 = ( ( t00 + t02 ) * FFT_C81 );
    5184   545556206 :         s14 = ( ( t00 - t02 ) * FFT_C81 );
    5185   545556206 :         s13 = ( ( t03 - t01 ) * FFT_C81 );
    5186   545556206 :         s15 = ( ( t01 + t03 ) * FFT_C82 );
    5187             :     };
    5188             : 
    5189   545556206 :     y00 = ( s00 + s02 );
    5190   545556206 :     y08 = ( s00 - s02 );
    5191   545556206 :     y01 = ( s01 + s03 );
    5192   545556206 :     y09 = ( s01 - s03 );
    5193   545556206 :     y04 = ( s04 - s06 );
    5194   545556206 :     y12 = ( s04 + s06 );
    5195   545556206 :     y05 = ( s05 - s07 );
    5196   545556206 :     y13 = ( s05 + s07 );
    5197   545556206 :     y06 = ( s08 + s14 );
    5198   545556206 :     y14 = ( s08 - s14 );
    5199   545556206 :     y07 = ( s09 + s15 );
    5200   545556206 :     y15 = ( s09 - s15 );
    5201   545556206 :     y02 = ( s10 + s12 );
    5202   545556206 :     y10 = ( s10 - s12 );
    5203   545556206 :     y03 = ( s11 + s13 );
    5204   545556206 :     y11 = ( s11 - s13 );
    5205             : 
    5206   545556206 :     x00 = re[s * 1];
    5207   545556206 :     x01 = im[s * 1];
    5208   545556206 :     x02 = re[s * 5];
    5209   545556206 :     x03 = im[s * 5];
    5210   545556206 :     x04 = re[s * 9];
    5211   545556206 :     x05 = im[s * 9];
    5212   545556206 :     x06 = re[s * 13];
    5213   545556206 :     x07 = im[s * 13];
    5214   545556206 :     x08 = re[s * 17];
    5215   545556206 :     x09 = im[s * 17];
    5216   545556206 :     x10 = re[s * 21];
    5217   545556206 :     x11 = im[s * 21];
    5218   545556206 :     x12 = re[s * 25];
    5219   545556206 :     x13 = im[s * 25];
    5220   545556206 :     x14 = re[s * 29];
    5221   545556206 :     x15 = im[s * 29];
    5222             : 
    5223   545556206 :     t00 = ( x00 + x08 );
    5224   545556206 :     t02 = ( x00 - x08 );
    5225   545556206 :     t01 = ( x01 + x09 );
    5226   545556206 :     t03 = ( x01 - x09 );
    5227   545556206 :     t04 = ( x02 + x10 );
    5228   545556206 :     t06 = ( x02 - x10 );
    5229   545556206 :     t05 = ( x03 + x11 );
    5230   545556206 :     t07 = ( x03 - x11 );
    5231   545556206 :     t08 = ( x04 + x12 );
    5232   545556206 :     t10 = ( x04 - x12 );
    5233   545556206 :     t09 = ( x05 + x13 );
    5234   545556206 :     t11 = ( x05 - x13 );
    5235   545556206 :     t12 = ( x06 + x14 );
    5236   545556206 :     t14 = ( x06 - x14 );
    5237   545556206 :     t13 = ( x07 + x15 );
    5238   545556206 :     t15 = ( x07 - x15 );
    5239             : 
    5240   545556206 :     s00 = ( t00 + t08 );
    5241   545556206 :     s04 = ( t00 - t08 );
    5242   545556206 :     s01 = ( t01 + t09 );
    5243   545556206 :     s05 = ( t01 - t09 );
    5244   545556206 :     s08 = ( t02 - t11 );
    5245   545556206 :     s10 = ( t02 + t11 );
    5246   545556206 :     s09 = ( t03 + t10 );
    5247   545556206 :     s11 = ( t03 - t10 );
    5248   545556206 :     s02 = ( t04 + t12 );
    5249   545556206 :     s07 = ( t04 - t12 );
    5250   545556206 :     s03 = ( t05 + t13 );
    5251   545556206 :     s06 = ( t13 - t05 );
    5252   545556206 :     t01 = ( t06 + t14 );
    5253   545556206 :     t02 = ( t06 - t14 );
    5254   545556206 :     t00 = ( t07 + t15 );
    5255   545556206 :     t03 = ( t07 - t15 );
    5256             : 
    5257             :     {
    5258   545556206 :         s12 = ( ( t00 + t02 ) * FFT_C81 );
    5259   545556206 :         s14 = ( ( t00 - t02 ) * FFT_C81 );
    5260   545556206 :         s13 = ( ( t03 - t01 ) * FFT_C81 );
    5261   545556206 :         s15 = ( ( t01 + t03 ) * FFT_C82 );
    5262             :     };
    5263             : 
    5264   545556206 :     y16 = ( s00 + s02 );
    5265   545556206 :     y24 = ( s00 - s02 );
    5266   545556206 :     y17 = ( s01 + s03 );
    5267   545556206 :     y25 = ( s01 - s03 );
    5268   545556206 :     y20 = ( s04 - s06 );
    5269   545556206 :     y28 = ( s04 + s06 );
    5270   545556206 :     y21 = ( s05 - s07 );
    5271   545556206 :     y29 = ( s05 + s07 );
    5272   545556206 :     y22 = ( s08 + s14 );
    5273   545556206 :     y30 = ( s08 - s14 );
    5274   545556206 :     y23 = ( s09 + s15 );
    5275   545556206 :     y31 = ( s09 - s15 );
    5276   545556206 :     y18 = ( s10 + s12 );
    5277   545556206 :     y26 = ( s10 - s12 );
    5278   545556206 :     y19 = ( s11 + s13 );
    5279   545556206 :     y27 = ( s11 - s13 );
    5280             : 
    5281   545556206 :     x00 = re[s * 2];
    5282   545556206 :     x01 = im[s * 2];
    5283   545556206 :     x02 = re[s * 6];
    5284   545556206 :     x03 = im[s * 6];
    5285   545556206 :     x04 = re[s * 10];
    5286   545556206 :     x05 = im[s * 10];
    5287   545556206 :     x06 = re[s * 14];
    5288   545556206 :     x07 = im[s * 14];
    5289   545556206 :     x08 = re[s * 18];
    5290   545556206 :     x09 = im[s * 18];
    5291   545556206 :     x10 = re[s * 22];
    5292   545556206 :     x11 = im[s * 22];
    5293   545556206 :     x12 = re[s * 26];
    5294   545556206 :     x13 = im[s * 26];
    5295   545556206 :     x14 = re[s * 30];
    5296   545556206 :     x15 = im[s * 30];
    5297             : 
    5298   545556206 :     t00 = ( x00 + x08 );
    5299   545556206 :     t02 = ( x00 - x08 );
    5300   545556206 :     t01 = ( x01 + x09 );
    5301   545556206 :     t03 = ( x01 - x09 );
    5302   545556206 :     t04 = ( x02 + x10 );
    5303   545556206 :     t06 = ( x02 - x10 );
    5304   545556206 :     t05 = ( x03 + x11 );
    5305   545556206 :     t07 = ( x03 - x11 );
    5306   545556206 :     t08 = ( x04 + x12 );
    5307   545556206 :     t10 = ( x04 - x12 );
    5308   545556206 :     t09 = ( x05 + x13 );
    5309   545556206 :     t11 = ( x05 - x13 );
    5310   545556206 :     t12 = ( x06 + x14 );
    5311   545556206 :     t14 = ( x06 - x14 );
    5312   545556206 :     t13 = ( x07 + x15 );
    5313   545556206 :     t15 = ( x07 - x15 );
    5314             : 
    5315   545556206 :     s00 = ( t00 + t08 );
    5316   545556206 :     s04 = ( t00 - t08 );
    5317   545556206 :     s01 = ( t01 + t09 );
    5318   545556206 :     s05 = ( t01 - t09 );
    5319   545556206 :     s08 = ( t02 - t11 );
    5320   545556206 :     s10 = ( t02 + t11 );
    5321   545556206 :     s09 = ( t03 + t10 );
    5322   545556206 :     s11 = ( t03 - t10 );
    5323   545556206 :     s02 = ( t04 + t12 );
    5324   545556206 :     s07 = ( t04 - t12 );
    5325   545556206 :     s03 = ( t05 + t13 );
    5326   545556206 :     s06 = ( t13 - t05 );
    5327   545556206 :     t01 = ( t06 + t14 );
    5328   545556206 :     t02 = ( t06 - t14 );
    5329   545556206 :     t00 = ( t07 + t15 );
    5330   545556206 :     t03 = ( t07 - t15 );
    5331             : 
    5332             :     {
    5333   545556206 :         s12 = ( ( t00 + t02 ) * FFT_C81 );
    5334   545556206 :         s14 = ( ( t00 - t02 ) * FFT_C81 );
    5335   545556206 :         s13 = ( ( t03 - t01 ) * FFT_C81 );
    5336   545556206 :         s15 = ( ( t01 + t03 ) * FFT_C82 );
    5337             :     };
    5338             : 
    5339   545556206 :     y32 = ( s00 + s02 );
    5340   545556206 :     y40 = ( s00 - s02 );
    5341   545556206 :     y33 = ( s01 + s03 );
    5342   545556206 :     y41 = ( s01 - s03 );
    5343   545556206 :     y36 = ( s04 - s06 );
    5344   545556206 :     y44 = ( s04 + s06 );
    5345   545556206 :     y37 = ( s05 - s07 );
    5346   545556206 :     y45 = ( s05 + s07 );
    5347   545556206 :     y38 = ( s08 + s14 );
    5348   545556206 :     y46 = ( s08 - s14 );
    5349   545556206 :     y39 = ( s09 + s15 );
    5350   545556206 :     y47 = ( s09 - s15 );
    5351   545556206 :     y34 = ( s10 + s12 );
    5352   545556206 :     y42 = ( s10 - s12 );
    5353   545556206 :     y35 = ( s11 + s13 );
    5354   545556206 :     y43 = ( s11 - s13 );
    5355             : 
    5356   545556206 :     x00 = re[s * 3];
    5357   545556206 :     x01 = im[s * 3];
    5358   545556206 :     x02 = re[s * 7];
    5359   545556206 :     x03 = im[s * 7];
    5360   545556206 :     x04 = re[s * 11];
    5361   545556206 :     x05 = im[s * 11];
    5362   545556206 :     x06 = re[s * 15];
    5363   545556206 :     x07 = im[s * 15];
    5364   545556206 :     x08 = re[s * 19];
    5365   545556206 :     x09 = im[s * 19];
    5366   545556206 :     x10 = re[s * 23];
    5367   545556206 :     x11 = im[s * 23];
    5368   545556206 :     x12 = re[s * 27];
    5369   545556206 :     x13 = im[s * 27];
    5370   545556206 :     x14 = re[s * 31];
    5371   545556206 :     x15 = im[s * 31];
    5372             : 
    5373   545556206 :     t00 = ( x00 + x08 );
    5374   545556206 :     t02 = ( x00 - x08 );
    5375   545556206 :     t01 = ( x01 + x09 );
    5376   545556206 :     t03 = ( x01 - x09 );
    5377   545556206 :     t04 = ( x02 + x10 );
    5378   545556206 :     t06 = ( x02 - x10 );
    5379   545556206 :     t05 = ( x03 + x11 );
    5380   545556206 :     t07 = ( x03 - x11 );
    5381   545556206 :     t08 = ( x04 + x12 );
    5382   545556206 :     t10 = ( x04 - x12 );
    5383   545556206 :     t09 = ( x05 + x13 );
    5384   545556206 :     t11 = ( x05 - x13 );
    5385   545556206 :     t12 = ( x06 + x14 );
    5386   545556206 :     t14 = ( x06 - x14 );
    5387   545556206 :     t13 = ( x07 + x15 );
    5388   545556206 :     t15 = ( x07 - x15 );
    5389             : 
    5390   545556206 :     s00 = ( t00 + t08 );
    5391   545556206 :     s04 = ( t00 - t08 );
    5392   545556206 :     s01 = ( t01 + t09 );
    5393   545556206 :     s05 = ( t01 - t09 );
    5394   545556206 :     s08 = ( t02 - t11 );
    5395   545556206 :     s10 = ( t02 + t11 );
    5396   545556206 :     s09 = ( t03 + t10 );
    5397   545556206 :     s11 = ( t03 - t10 );
    5398   545556206 :     s02 = ( t04 + t12 );
    5399   545556206 :     s07 = ( t04 - t12 );
    5400   545556206 :     s03 = ( t05 + t13 );
    5401   545556206 :     s06 = ( t13 - t05 );
    5402   545556206 :     t01 = ( t06 + t14 );
    5403   545556206 :     t02 = ( t06 - t14 );
    5404   545556206 :     t00 = ( t07 + t15 );
    5405   545556206 :     t03 = ( t07 - t15 );
    5406             : 
    5407             :     {
    5408   545556206 :         s12 = ( ( t00 + t02 ) * FFT_C81 );
    5409   545556206 :         s14 = ( ( t00 - t02 ) * FFT_C81 );
    5410   545556206 :         s13 = ( ( t03 - t01 ) * FFT_C81 );
    5411   545556206 :         s15 = ( ( t01 + t03 ) * FFT_C82 );
    5412             :     };
    5413             : 
    5414   545556206 :     y48 = ( s00 + s02 );
    5415   545556206 :     y56 = ( s00 - s02 );
    5416   545556206 :     y49 = ( s01 + s03 );
    5417   545556206 :     y57 = ( s01 - s03 );
    5418   545556206 :     y52 = ( s04 - s06 );
    5419   545556206 :     y60 = ( s04 + s06 );
    5420   545556206 :     y53 = ( s05 - s07 );
    5421   545556206 :     y61 = ( s05 + s07 );
    5422   545556206 :     y54 = ( s08 + s14 );
    5423   545556206 :     y62 = ( s08 - s14 );
    5424   545556206 :     y55 = ( s09 + s15 );
    5425   545556206 :     y63 = ( s09 - s15 );
    5426   545556206 :     y50 = ( s10 + s12 );
    5427   545556206 :     y58 = ( s10 - s12 );
    5428   545556206 :     y51 = ( s11 + s13 );
    5429   545556206 :     y59 = ( s11 - s13 );
    5430             : 
    5431             : 
    5432             :     {
    5433   545556206 :         as = y18;
    5434   545556206 :         bs = y19;
    5435   545556206 :         y18 = ( ( as * FFT_RotVector_32[2 * 0 + 0] ) - ( bs * FFT_RotVector_32[2 * 0 + 1] ) );
    5436   545556206 :         y19 = ( ( as * FFT_RotVector_32[2 * 0 + 1] ) + ( bs * FFT_RotVector_32[2 * 0 + 0] ) );
    5437             :     };
    5438             :     {
    5439   545556206 :         as = y20;
    5440   545556206 :         bs = y21;
    5441   545556206 :         y20 = ( ( as * FFT_RotVector_32[2 * 1 + 0] ) - ( bs * FFT_RotVector_32[2 * 1 + 1] ) );
    5442   545556206 :         y21 = ( ( as * FFT_RotVector_32[2 * 1 + 1] ) + ( bs * FFT_RotVector_32[2 * 1 + 0] ) );
    5443             :     };
    5444             :     {
    5445   545556206 :         as = y22;
    5446   545556206 :         bs = y23;
    5447   545556206 :         y22 = ( ( as * FFT_RotVector_32[2 * 2 + 0] ) - ( bs * FFT_RotVector_32[2 * 2 + 1] ) );
    5448   545556206 :         y23 = ( ( as * FFT_RotVector_32[2 * 2 + 1] ) + ( bs * FFT_RotVector_32[2 * 2 + 0] ) );
    5449             :     };
    5450             :     {
    5451   545556206 :         as = y24;
    5452   545556206 :         bs = y25;
    5453   545556206 :         y24 = ( ( as * FFT_RotVector_32[2 * 3 + 0] ) - ( bs * FFT_RotVector_32[2 * 3 + 1] ) );
    5454   545556206 :         y25 = ( ( as * FFT_RotVector_32[2 * 3 + 1] ) + ( bs * FFT_RotVector_32[2 * 3 + 0] ) );
    5455             :     };
    5456             :     {
    5457   545556206 :         as = y26;
    5458   545556206 :         bs = y27;
    5459   545556206 :         y26 = ( ( as * FFT_RotVector_32[2 * 4 + 0] ) - ( bs * FFT_RotVector_32[2 * 4 + 1] ) );
    5460   545556206 :         y27 = ( ( as * FFT_RotVector_32[2 * 4 + 1] ) + ( bs * FFT_RotVector_32[2 * 4 + 0] ) );
    5461             :     };
    5462             :     {
    5463   545556206 :         as = y28;
    5464   545556206 :         bs = y29;
    5465   545556206 :         y28 = ( ( as * FFT_RotVector_32[2 * 5 + 0] ) - ( bs * FFT_RotVector_32[2 * 5 + 1] ) );
    5466   545556206 :         y29 = ( ( as * FFT_RotVector_32[2 * 5 + 1] ) + ( bs * FFT_RotVector_32[2 * 5 + 0] ) );
    5467             :     };
    5468             :     {
    5469   545556206 :         as = y30;
    5470   545556206 :         bs = y31;
    5471   545556206 :         y30 = ( ( as * FFT_RotVector_32[2 * 6 + 0] ) - ( bs * FFT_RotVector_32[2 * 6 + 1] ) );
    5472   545556206 :         y31 = ( ( as * FFT_RotVector_32[2 * 6 + 1] ) + ( bs * FFT_RotVector_32[2 * 6 + 0] ) );
    5473             :     };
    5474             :     {
    5475   545556206 :         as = y34;
    5476   545556206 :         bs = y35;
    5477   545556206 :         y34 = ( ( as * FFT_RotVector_32[2 * 7 + 0] ) - ( bs * FFT_RotVector_32[2 * 7 + 1] ) );
    5478   545556206 :         y35 = ( ( as * FFT_RotVector_32[2 * 7 + 1] ) + ( bs * FFT_RotVector_32[2 * 7 + 0] ) );
    5479             :     };
    5480             :     {
    5481   545556206 :         as = y36;
    5482   545556206 :         bs = y37;
    5483   545556206 :         y36 = ( ( as * FFT_RotVector_32[2 * 8 + 0] ) - ( bs * FFT_RotVector_32[2 * 8 + 1] ) );
    5484   545556206 :         y37 = ( ( as * FFT_RotVector_32[2 * 8 + 1] ) + ( bs * FFT_RotVector_32[2 * 8 + 0] ) );
    5485             :     };
    5486             :     {
    5487   545556206 :         as = y38;
    5488   545556206 :         bs = y39;
    5489   545556206 :         y38 = ( ( as * FFT_RotVector_32[2 * 9 + 0] ) - ( bs * FFT_RotVector_32[2 * 9 + 1] ) );
    5490   545556206 :         y39 = ( ( as * FFT_RotVector_32[2 * 9 + 1] ) + ( bs * FFT_RotVector_32[2 * 9 + 0] ) );
    5491             :     };
    5492             :     {
    5493   545556206 :         as = y42;
    5494   545556206 :         bs = y43;
    5495   545556206 :         y42 = ( ( as * FFT_RotVector_32[2 * 10 + 0] ) - ( bs * FFT_RotVector_32[2 * 10 + 1] ) );
    5496   545556206 :         y43 = ( ( as * FFT_RotVector_32[2 * 10 + 1] ) + ( bs * FFT_RotVector_32[2 * 10 + 0] ) );
    5497             :     };
    5498             :     {
    5499   545556206 :         as = y44;
    5500   545556206 :         bs = y45;
    5501   545556206 :         y44 = ( ( as * FFT_RotVector_32[2 * 11 + 0] ) - ( bs * FFT_RotVector_32[2 * 11 + 1] ) );
    5502   545556206 :         y45 = ( ( as * FFT_RotVector_32[2 * 11 + 1] ) + ( bs * FFT_RotVector_32[2 * 11 + 0] ) );
    5503             :     };
    5504             :     {
    5505   545556206 :         as = y46;
    5506   545556206 :         bs = y47;
    5507   545556206 :         y46 = ( ( as * FFT_RotVector_32[2 * 12 + 0] ) - ( bs * FFT_RotVector_32[2 * 12 + 1] ) );
    5508   545556206 :         y47 = ( ( as * FFT_RotVector_32[2 * 12 + 1] ) + ( bs * FFT_RotVector_32[2 * 12 + 0] ) );
    5509             :     };
    5510             :     {
    5511   545556206 :         as = y50;
    5512   545556206 :         bs = y51;
    5513   545556206 :         y50 = ( ( as * FFT_RotVector_32[2 * 13 + 0] ) - ( bs * FFT_RotVector_32[2 * 13 + 1] ) );
    5514   545556206 :         y51 = ( ( as * FFT_RotVector_32[2 * 13 + 1] ) + ( bs * FFT_RotVector_32[2 * 13 + 0] ) );
    5515             :     };
    5516             :     {
    5517   545556206 :         as = y52;
    5518   545556206 :         bs = y53;
    5519   545556206 :         y52 = ( ( as * FFT_RotVector_32[2 * 14 + 0] ) - ( bs * FFT_RotVector_32[2 * 14 + 1] ) );
    5520   545556206 :         y53 = ( ( as * FFT_RotVector_32[2 * 14 + 1] ) + ( bs * FFT_RotVector_32[2 * 14 + 0] ) );
    5521             :     };
    5522             :     {
    5523   545556206 :         as = y54;
    5524   545556206 :         bs = y55;
    5525   545556206 :         y54 = ( ( as * FFT_RotVector_32[2 * 15 + 0] ) - ( bs * FFT_RotVector_32[2 * 15 + 1] ) );
    5526   545556206 :         y55 = ( ( as * FFT_RotVector_32[2 * 15 + 1] ) + ( bs * FFT_RotVector_32[2 * 15 + 0] ) );
    5527             :     };
    5528             :     {
    5529   545556206 :         as = y56;
    5530   545556206 :         bs = y57;
    5531   545556206 :         y56 = ( ( as * FFT_RotVector_32[2 * 16 + 0] ) - ( bs * FFT_RotVector_32[2 * 16 + 1] ) );
    5532   545556206 :         y57 = ( ( as * FFT_RotVector_32[2 * 16 + 1] ) + ( bs * FFT_RotVector_32[2 * 16 + 0] ) );
    5533             :     };
    5534             :     {
    5535   545556206 :         as = y58;
    5536   545556206 :         bs = y59;
    5537   545556206 :         y58 = ( ( as * FFT_RotVector_32[2 * 17 + 0] ) - ( bs * FFT_RotVector_32[2 * 17 + 1] ) );
    5538   545556206 :         y59 = ( ( as * FFT_RotVector_32[2 * 17 + 1] ) + ( bs * FFT_RotVector_32[2 * 17 + 0] ) );
    5539             :     };
    5540             :     {
    5541   545556206 :         as = y60;
    5542   545556206 :         bs = y61;
    5543   545556206 :         y60 = ( ( as * FFT_RotVector_32[2 * 18 + 0] ) - ( bs * FFT_RotVector_32[2 * 18 + 1] ) );
    5544   545556206 :         y61 = ( ( as * FFT_RotVector_32[2 * 18 + 1] ) + ( bs * FFT_RotVector_32[2 * 18 + 0] ) );
    5545             :     };
    5546             :     {
    5547   545556206 :         as = y62;
    5548   545556206 :         bs = y63;
    5549   545556206 :         y62 = ( ( as * FFT_RotVector_32[2 * 19 + 0] ) - ( bs * FFT_RotVector_32[2 * 19 + 1] ) );
    5550   545556206 :         y63 = ( ( as * FFT_RotVector_32[2 * 19 + 1] ) + ( bs * FFT_RotVector_32[2 * 19 + 0] ) );
    5551             :     };
    5552             : 
    5553   545556206 :     t00 = ( y00 + y32 );
    5554   545556206 :     t02 = ( y00 - y32 );
    5555   545556206 :     t01 = ( y01 + y33 );
    5556   545556206 :     t03 = ( y01 - y33 );
    5557   545556206 :     t04 = ( y16 + y48 );
    5558   545556206 :     t07 = ( y16 - y48 );
    5559   545556206 :     t05 = ( y49 + y17 );
    5560   545556206 :     t06 = ( y49 - y17 );
    5561             : 
    5562   545556206 :     re[s * 0] = ( t00 + t04 );
    5563   545556206 :     im[s * 0] = ( t01 + t05 );
    5564   545556206 :     re[s * 8] = ( t02 - t06 );
    5565   545556206 :     im[s * 8] = ( t03 - t07 );
    5566   545556206 :     re[s * 16] = ( t00 - t04 );
    5567   545556206 :     im[s * 16] = ( t01 - t05 );
    5568   545556206 :     re[s * 24] = ( t02 + t06 );
    5569   545556206 :     im[s * 24] = ( t03 + t07 );
    5570             : 
    5571   545556206 :     t00 = ( y02 + y34 );
    5572   545556206 :     t02 = ( y02 - y34 );
    5573   545556206 :     t01 = ( y03 + y35 );
    5574   545556206 :     t03 = ( y03 - y35 );
    5575   545556206 :     t04 = ( y18 + y50 );
    5576   545556206 :     t07 = ( y18 - y50 );
    5577   545556206 :     t05 = ( y51 + y19 );
    5578   545556206 :     t06 = ( y51 - y19 );
    5579             : 
    5580   545556206 :     re[s * 1] = ( t00 + t04 );
    5581   545556206 :     im[s * 1] = ( t01 + t05 );
    5582   545556206 :     re[s * 9] = ( t02 - t06 );
    5583   545556206 :     im[s * 9] = ( t03 - t07 );
    5584   545556206 :     re[s * 17] = ( t00 - t04 );
    5585   545556206 :     im[s * 17] = ( t01 - t05 );
    5586   545556206 :     re[s * 25] = ( t02 + t06 );
    5587   545556206 :     im[s * 25] = ( t03 + t07 );
    5588             : 
    5589   545556206 :     t00 = ( y04 + y36 );
    5590   545556206 :     t02 = ( y04 - y36 );
    5591   545556206 :     t01 = ( y05 + y37 );
    5592   545556206 :     t03 = ( y05 - y37 );
    5593   545556206 :     t04 = ( y20 + y52 );
    5594   545556206 :     t07 = ( y20 - y52 );
    5595   545556206 :     t05 = ( y53 + y21 );
    5596   545556206 :     t06 = ( y53 - y21 );
    5597             : 
    5598   545556206 :     re[s * 2] = ( t00 + t04 );
    5599   545556206 :     im[s * 2] = ( t01 + t05 );
    5600   545556206 :     re[s * 10] = ( t02 - t06 );
    5601   545556206 :     im[s * 10] = ( t03 - t07 );
    5602   545556206 :     re[s * 18] = ( t00 - t04 );
    5603   545556206 :     im[s * 18] = ( t01 - t05 );
    5604   545556206 :     re[s * 26] = ( t02 + t06 );
    5605   545556206 :     im[s * 26] = ( t03 + t07 );
    5606             : 
    5607   545556206 :     t00 = ( y06 + y38 );
    5608   545556206 :     t02 = ( y06 - y38 );
    5609   545556206 :     t01 = ( y07 + y39 );
    5610   545556206 :     t03 = ( y07 - y39 );
    5611   545556206 :     t04 = ( y22 + y54 );
    5612   545556206 :     t07 = ( y22 - y54 );
    5613   545556206 :     t05 = ( y55 + y23 );
    5614   545556206 :     t06 = ( y55 - y23 );
    5615             : 
    5616   545556206 :     re[s * 3] = ( t00 + t04 );
    5617   545556206 :     im[s * 3] = ( t01 + t05 );
    5618   545556206 :     re[s * 11] = ( t02 - t06 );
    5619   545556206 :     im[s * 11] = ( t03 - t07 );
    5620   545556206 :     re[s * 19] = ( t00 - t04 );
    5621   545556206 :     im[s * 19] = ( t01 - t05 );
    5622   545556206 :     re[s * 27] = ( t02 + t06 );
    5623   545556206 :     im[s * 27] = ( t03 + t07 );
    5624             : 
    5625   545556206 :     t00 = ( y08 + y41 );
    5626   545556206 :     t02 = ( y08 - y41 );
    5627   545556206 :     t01 = ( y09 - y40 );
    5628   545556206 :     t03 = ( y09 + y40 );
    5629   545556206 :     t04 = ( y24 + y56 );
    5630   545556206 :     t07 = ( y24 - y56 );
    5631   545556206 :     t05 = ( y57 + y25 );
    5632   545556206 :     t06 = ( y57 - y25 );
    5633             : 
    5634   545556206 :     re[s * 4] = ( t00 + t04 );
    5635   545556206 :     im[s * 4] = ( t01 + t05 );
    5636   545556206 :     re[s * 12] = ( t02 - t06 );
    5637   545556206 :     im[s * 12] = ( t03 - t07 );
    5638   545556206 :     re[s * 20] = ( t00 - t04 );
    5639   545556206 :     im[s * 20] = ( t01 - t05 );
    5640   545556206 :     re[s * 28] = ( t02 + t06 );
    5641   545556206 :     im[s * 28] = ( t03 + t07 );
    5642             : 
    5643   545556206 :     t00 = ( y10 + y42 );
    5644   545556206 :     t02 = ( y10 - y42 );
    5645   545556206 :     t01 = ( y11 + y43 );
    5646   545556206 :     t03 = ( y11 - y43 );
    5647   545556206 :     t04 = ( y26 + y58 );
    5648   545556206 :     t07 = ( y26 - y58 );
    5649   545556206 :     t05 = ( y59 + y27 );
    5650   545556206 :     t06 = ( y59 - y27 );
    5651             : 
    5652   545556206 :     re[s * 5] = ( t00 + t04 );
    5653   545556206 :     im[s * 5] = ( t01 + t05 );
    5654   545556206 :     re[s * 13] = ( t02 - t06 );
    5655   545556206 :     im[s * 13] = ( t03 - t07 );
    5656   545556206 :     re[s * 21] = ( t00 - t04 );
    5657   545556206 :     im[s * 21] = ( t01 - t05 );
    5658   545556206 :     re[s * 29] = ( t02 + t06 );
    5659   545556206 :     im[s * 29] = ( t03 + t07 );
    5660             : 
    5661   545556206 :     t00 = ( y12 + y44 );
    5662   545556206 :     t02 = ( y12 - y44 );
    5663   545556206 :     t01 = ( y13 + y45 );
    5664   545556206 :     t03 = ( y13 - y45 );
    5665   545556206 :     t04 = ( y28 + y60 );
    5666   545556206 :     t07 = ( y28 - y60 );
    5667   545556206 :     t05 = ( y61 + y29 );
    5668   545556206 :     t06 = ( y61 - y29 );
    5669             : 
    5670   545556206 :     re[s * 6] = ( t00 + t04 );
    5671   545556206 :     im[s * 6] = ( t01 + t05 );
    5672   545556206 :     re[s * 14] = ( t02 - t06 );
    5673   545556206 :     im[s * 14] = ( t03 - t07 );
    5674   545556206 :     re[s * 22] = ( t00 - t04 );
    5675   545556206 :     im[s * 22] = ( t01 - t05 );
    5676   545556206 :     re[s * 30] = ( t02 + t06 );
    5677   545556206 :     im[s * 30] = ( t03 + t07 );
    5678             : 
    5679   545556206 :     t00 = ( y14 + y46 );
    5680   545556206 :     t02 = ( y14 - y46 );
    5681   545556206 :     t01 = ( y15 + y47 );
    5682   545556206 :     t03 = ( y15 - y47 );
    5683   545556206 :     t04 = ( y30 + y62 );
    5684   545556206 :     t07 = ( y30 - y62 );
    5685   545556206 :     t05 = ( y63 + y31 );
    5686   545556206 :     t06 = ( y63 - y31 );
    5687             : 
    5688   545556206 :     re[s * 7] = ( t00 + t04 );
    5689   545556206 :     im[s * 7] = ( t01 + t05 );
    5690   545556206 :     re[s * 15] = ( t02 - t06 );
    5691   545556206 :     im[s * 15] = ( t03 - t07 );
    5692   545556206 :     re[s * 23] = ( t00 - t04 );
    5693   545556206 :     im[s * 23] = ( t01 - t05 );
    5694   545556206 :     re[s * 31] = ( t02 + t06 );
    5695   545556206 :     im[s * 31] = ( t03 + t07 );
    5696             : 
    5697   545556206 :     return;
    5698             : }
    5699             : 
    5700  1019121385 : static void fft_lenN(
    5701             :     float *re,
    5702             :     float *im,
    5703             :     const float *W,
    5704             :     const int16_t len,
    5705             :     const int16_t dim1,
    5706             :     const int16_t dim2,
    5707             :     const int16_t sx,
    5708             :     const int16_t sc,
    5709             :     const int16_t Woff )
    5710             : {
    5711             :     int16_t i, j;
    5712             :     float x[L_FRAME_MAX * 2];
    5713             : 
    5714 10384805245 :     for ( i = 0; i < dim2; i++ )
    5715             :     {
    5716 >22056*10^7 :         for ( j = 0; j < dim1; j++ )
    5717             :         {
    5718 >21119*10^7 :             x[2 * i * dim1 + 2 * j] = re[sx * i + sx * j * dim2];
    5719 >21119*10^7 :             x[2 * i * dim1 + 2 * j + 1] = im[sx * i + sx * j * dim2];
    5720             :         }
    5721             :     }
    5722             : 
    5723  1019121385 :     switch ( dim1 )
    5724             :     {
    5725      920243 :         case 5:
    5726     8282187 :             for ( i = 0; i < dim2; i++ )
    5727             :             {
    5728     7361944 :                 fft_len5( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
    5729             :             }
    5730      920243 :             break;
    5731             : 
    5732     1019018 :         case 8:
    5733     9171162 :             for ( i = 0; i < dim2; i++ )
    5734             :             {
    5735     8152144 :                 fft_len8( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
    5736             :             }
    5737     1019018 :             break;
    5738             : 
    5739   224699048 :         case 10:
    5740  2022291432 :             for ( i = 0; i < dim2; i++ )
    5741             :             {
    5742  1797592384 :                 fft_len10( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
    5743             :             }
    5744   224699048 :             break;
    5745             : 
    5746     9556054 :         case 15:
    5747    86004486 :             for ( i = 0; i < dim2; i++ )
    5748             :             {
    5749    76448432 :                 fft_len15( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
    5750             :             }
    5751     9556054 :             break;
    5752             : 
    5753    16212828 :         case 16:
    5754   145915452 :             for ( i = 0; i < dim2; i++ )
    5755             :             {
    5756   129702624 :                 fft_len16( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
    5757             :             }
    5758    16212828 :             break;
    5759             : 
    5760   317396951 :         case 20:
    5761  3394535071 :             for ( i = 0; i < dim2; i++ )
    5762             :             {
    5763  3077138120 :                 fft_len20( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
    5764             :             }
    5765   317396951 :             break;
    5766             : 
    5767   432051686 :         case 30:
    5768  4563215442 :             for ( i = 0; i < dim2; i++ )
    5769             :             {
    5770  4131163756 :                 fft_len30( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
    5771             :             }
    5772   432051686 :             break;
    5773             : 
    5774    17265557 :         case 32:
    5775   155390013 :             for ( i = 0; i < dim2; i++ )
    5776             :             {
    5777   138124456 :                 fft_len32( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
    5778             :             }
    5779    17265557 :             break;
    5780             :     }
    5781             : 
    5782  1019121385 :     switch ( dim2 )
    5783             :     {
    5784             : 
    5785   899669283 :         case 8:
    5786             :         {
    5787             :             float x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11, x12, x13, x14, x15;
    5788             :             float t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15;
    5789             :             float s00, s01, s02, s03, s04, s05, s06, s07, s08, s09, s10, s11, s12, s13, s14, s15;
    5790             : 
    5791   899669283 :             if ( dim1 == 30 || dim1 == 20 || dim1 == 15 || dim1 == 10 || dim1 == 5 )
    5792             :             {
    5793 19508968795 :                 for ( i = 0; i < dim1; i++ )
    5794             :                 {
    5795             :                     {
    5796 18643796915 :                         x00 = x[2 * i + 2 * 0 * dim1];
    5797 18643796915 :                         x01 = x[2 * i + 2 * 0 * dim1 + 1];
    5798             :                     };
    5799 18643796915 :                     if ( i == 0 )
    5800             :                     {
    5801             :                         {
    5802   865171880 :                             x02 = x[2 * i + 2 * 1 * dim1];
    5803   865171880 :                             x03 = x[2 * i + 2 * 1 * dim1 + 1];
    5804             :                         };
    5805             :                         {
    5806   865171880 :                             x04 = x[2 * i + 2 * 2 * dim1];
    5807   865171880 :                             x05 = x[2 * i + 2 * 2 * dim1 + 1];
    5808             :                         };
    5809             :                         {
    5810   865171880 :                             x06 = x[2 * i + 2 * 3 * dim1];
    5811   865171880 :                             x07 = x[2 * i + 2 * 3 * dim1 + 1];
    5812             :                         };
    5813             :                         {
    5814   865171880 :                             x08 = x[2 * i + 2 * 4 * dim1];
    5815   865171880 :                             x09 = x[2 * i + 2 * 4 * dim1 + 1];
    5816             :                         };
    5817             :                         {
    5818   865171880 :                             x10 = x[2 * i + 2 * 5 * dim1];
    5819   865171880 :                             x11 = x[2 * i + 2 * 5 * dim1 + 1];
    5820             :                         };
    5821             :                         {
    5822   865171880 :                             x12 = x[2 * i + 2 * 6 * dim1];
    5823   865171880 :                             x13 = x[2 * i + 2 * 6 * dim1 + 1];
    5824             :                         };
    5825             :                         {
    5826   865171880 :                             x14 = x[2 * i + 2 * 7 * dim1];
    5827   865171880 :                             x15 = x[2 * i + 2 * 7 * dim1 + 1];
    5828             :                         };
    5829             :                     }
    5830             :                     else
    5831             :                     {
    5832             :                         {
    5833 17778625035 :                             x02 = ( x[2 * i + 2 * 1 * dim1] * W[sc * i + sc * 1 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 1 * dim1 + 1] * W[sc * i + sc * 1 * dim1 * 2 + 1 - Woff] );
    5834 17778625035 :                             x03 = ( x[2 * i + 2 * 1 * dim1] * W[sc * i + sc * 1 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 1 * dim1 + 1] * W[sc * i + sc * 1 * dim1 * 2 - Woff] );
    5835             :                         };
    5836             :                         {
    5837 17778625035 :                             x04 = ( x[2 * i + 2 * 2 * dim1] * W[sc * i + sc * 2 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 2 * dim1 + 1] * W[sc * i + sc * 2 * dim1 * 2 + 1 - Woff] );
    5838 17778625035 :                             x05 = ( x[2 * i + 2 * 2 * dim1] * W[sc * i + sc * 2 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 2 * dim1 + 1] * W[sc * i + sc * 2 * dim1 * 2 - Woff] );
    5839             :                         };
    5840             :                         {
    5841 17778625035 :                             x06 = ( x[2 * i + 2 * 3 * dim1] * W[sc * i + sc * 3 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 3 * dim1 + 1] * W[sc * i + sc * 3 * dim1 * 2 + 1 - Woff] );
    5842 17778625035 :                             x07 = ( x[2 * i + 2 * 3 * dim1] * W[sc * i + sc * 3 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 3 * dim1 + 1] * W[sc * i + sc * 3 * dim1 * 2 - Woff] );
    5843             :                         };
    5844             :                         {
    5845 17778625035 :                             x08 = ( x[2 * i + 2 * 4 * dim1] * W[sc * i + sc * 4 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 4 * dim1 + 1] * W[sc * i + sc * 4 * dim1 * 2 + 1 - Woff] );
    5846 17778625035 :                             x09 = ( x[2 * i + 2 * 4 * dim1] * W[sc * i + sc * 4 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 4 * dim1 + 1] * W[sc * i + sc * 4 * dim1 * 2 - Woff] );
    5847             :                         };
    5848             :                         {
    5849 17778625035 :                             x10 = ( x[2 * i + 2 * 5 * dim1] * W[sc * i + sc * 5 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 5 * dim1 + 1] * W[sc * i + sc * 5 * dim1 * 2 + 1 - Woff] );
    5850 17778625035 :                             x11 = ( x[2 * i + 2 * 5 * dim1] * W[sc * i + sc * 5 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 5 * dim1 + 1] * W[sc * i + sc * 5 * dim1 * 2 - Woff] );
    5851             :                         };
    5852             :                         {
    5853 17778625035 :                             x12 = ( x[2 * i + 2 * 6 * dim1] * W[sc * i + sc * 6 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 6 * dim1 + 1] * W[sc * i + sc * 6 * dim1 * 2 + 1 - Woff] );
    5854 17778625035 :                             x13 = ( x[2 * i + 2 * 6 * dim1] * W[sc * i + sc * 6 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 6 * dim1 + 1] * W[sc * i + sc * 6 * dim1 * 2 - Woff] );
    5855             :                         };
    5856             :                         {
    5857 17778625035 :                             x14 = ( x[2 * i + 2 * 7 * dim1] * W[sc * i + sc * 7 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 7 * dim1 + 1] * W[sc * i + sc * 7 * dim1 * 2 + 1 - Woff] );
    5858 17778625035 :                             x15 = ( x[2 * i + 2 * 7 * dim1] * W[sc * i + sc * 7 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 7 * dim1 + 1] * W[sc * i + sc * 7 * dim1 * 2 - Woff] );
    5859             :                         };
    5860             :                     }
    5861             : 
    5862 18643796915 :                     t00 = ( x00 + x08 );
    5863 18643796915 :                     t02 = ( x00 - x08 );
    5864 18643796915 :                     t01 = ( x01 + x09 );
    5865 18643796915 :                     t03 = ( x01 - x09 );
    5866 18643796915 :                     t04 = ( x02 + x10 );
    5867 18643796915 :                     t06 = ( x02 - x10 );
    5868 18643796915 :                     t05 = ( x03 + x11 );
    5869 18643796915 :                     t07 = ( x03 - x11 );
    5870 18643796915 :                     t08 = ( x04 + x12 );
    5871 18643796915 :                     t10 = ( x04 - x12 );
    5872 18643796915 :                     t09 = ( x05 + x13 );
    5873 18643796915 :                     t11 = ( x05 - x13 );
    5874 18643796915 :                     t12 = ( x06 + x14 );
    5875 18643796915 :                     t14 = ( x06 - x14 );
    5876 18643796915 :                     t13 = ( x07 + x15 );
    5877 18643796915 :                     t15 = ( x07 - x15 );
    5878             : 
    5879 18643796915 :                     s00 = ( t00 + t08 );
    5880 18643796915 :                     s04 = ( t00 - t08 );
    5881 18643796915 :                     s01 = ( t01 + t09 );
    5882 18643796915 :                     s05 = ( t01 - t09 );
    5883 18643796915 :                     s08 = ( t02 - t11 );
    5884 18643796915 :                     s10 = ( t02 + t11 );
    5885 18643796915 :                     s09 = ( t03 + t10 );
    5886 18643796915 :                     s11 = ( t03 - t10 );
    5887 18643796915 :                     s02 = ( t04 + t12 );
    5888 18643796915 :                     s07 = ( t04 - t12 );
    5889 18643796915 :                     s03 = ( t05 + t13 );
    5890 18643796915 :                     s06 = ( t13 - t05 );
    5891             : 
    5892 18643796915 :                     t01 = ( t06 + t14 );
    5893 18643796915 :                     t02 = ( t06 - t14 );
    5894 18643796915 :                     t00 = ( t07 + t15 );
    5895 18643796915 :                     t03 = ( t07 - t15 );
    5896             : 
    5897 18643796915 :                     s12 = ( ( t00 + t02 ) * FFT_C81 );
    5898 18643796915 :                     s14 = ( ( t00 - t02 ) * FFT_C81 );
    5899 18643796915 :                     s13 = ( ( t03 - t01 ) * FFT_C81 );
    5900 18643796915 :                     s15 = ( ( t01 + t03 ) * FFT_C82 );
    5901             : 
    5902 18643796915 :                     re[sx * i + sx * 0 * dim1] = ( s00 + s02 );
    5903 18643796915 :                     im[sx * i + sx * 0 * dim1] = ( s01 + s03 );
    5904 18643796915 :                     re[sx * i + sx * 1 * dim1] = ( s10 + s12 );
    5905 18643796915 :                     im[sx * i + sx * 1 * dim1] = ( s11 + s13 );
    5906 18643796915 :                     re[sx * i + sx * 2 * dim1] = ( s04 - s06 );
    5907 18643796915 :                     im[sx * i + sx * 2 * dim1] = ( s05 - s07 );
    5908 18643796915 :                     re[sx * i + sx * 3 * dim1] = ( s08 + s14 );
    5909 18643796915 :                     im[sx * i + sx * 3 * dim1] = ( s09 + s15 );
    5910 18643796915 :                     re[sx * i + sx * 4 * dim1] = ( s00 - s02 );
    5911 18643796915 :                     im[sx * i + sx * 4 * dim1] = ( s01 - s03 );
    5912 18643796915 :                     re[sx * i + sx * 5 * dim1] = ( s10 - s12 );
    5913 18643796915 :                     im[sx * i + sx * 5 * dim1] = ( s11 - s13 );
    5914 18643796915 :                     re[sx * i + sx * 6 * dim1] = ( s04 + s06 );
    5915 18643796915 :                     im[sx * i + sx * 6 * dim1] = ( s05 + s07 );
    5916 18643796915 :                     re[sx * i + sx * 7 * dim1] = ( s08 - s14 );
    5917 18643796915 :                     im[sx * i + sx * 7 * dim1] = ( s09 - s15 );
    5918             :                 }
    5919             :             }
    5920             :             else
    5921             :             {
    5922   854552619 :                 for ( i = 0; i < dim1; i++ )
    5923             :                 {
    5924             :                     {
    5925   820055216 :                         x00 = x[2 * i + 2 * 0 * dim1];
    5926   820055216 :                         x01 = x[2 * i + 2 * 0 * dim1 + 1];
    5927             :                     };
    5928   820055216 :                     if ( i == 0 )
    5929             :                     {
    5930             :                         {
    5931    34497403 :                             x02 = x[2 * i + 2 * 1 * dim1];
    5932    34497403 :                             x03 = x[2 * i + 2 * 1 * dim1 + 1];
    5933             :                         };
    5934             :                         {
    5935    34497403 :                             x04 = x[2 * i + 2 * 2 * dim1];
    5936    34497403 :                             x05 = x[2 * i + 2 * 2 * dim1 + 1];
    5937             :                         };
    5938             :                         {
    5939    34497403 :                             x06 = x[2 * i + 2 * 3 * dim1];
    5940    34497403 :                             x07 = x[2 * i + 2 * 3 * dim1 + 1];
    5941             :                         };
    5942             :                         {
    5943    34497403 :                             x08 = x[2 * i + 2 * 4 * dim1];
    5944    34497403 :                             x09 = x[2 * i + 2 * 4 * dim1 + 1];
    5945             :                         };
    5946             :                         {
    5947    34497403 :                             x10 = x[2 * i + 2 * 5 * dim1];
    5948    34497403 :                             x11 = x[2 * i + 2 * 5 * dim1 + 1];
    5949             :                         };
    5950             :                         {
    5951    34497403 :                             x12 = x[2 * i + 2 * 6 * dim1];
    5952    34497403 :                             x13 = x[2 * i + 2 * 6 * dim1 + 1];
    5953             :                         };
    5954             :                         {
    5955    34497403 :                             x14 = x[2 * i + 2 * 7 * dim1];
    5956    34497403 :                             x15 = x[2 * i + 2 * 7 * dim1 + 1];
    5957             :                         };
    5958             :                     }
    5959             :                     else
    5960             :                     {
    5961             :                         {
    5962   785557813 :                             x02 = ( x[2 * i + 2 * 1 * dim1] * W[sc * i + sc * 1 * dim1 - Woff] ) - ( x[2 * i + 2 * 1 * dim1 + 1] * W[sc * i + sc * 1 * dim1 + 1 - Woff] );
    5963   785557813 :                             x03 = ( x[2 * i + 2 * 1 * dim1] * W[sc * i + sc * 1 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 1 * dim1 + 1] * W[sc * i + sc * 1 * dim1 - Woff] );
    5964             :                         };
    5965             :                         {
    5966   785557813 :                             x04 = ( x[2 * i + 2 * 2 * dim1] * W[sc * i + sc * 2 * dim1 - Woff] ) - ( x[2 * i + 2 * 2 * dim1 + 1] * W[sc * i + sc * 2 * dim1 + 1 - Woff] );
    5967   785557813 :                             x05 = ( x[2 * i + 2 * 2 * dim1] * W[sc * i + sc * 2 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 2 * dim1 + 1] * W[sc * i + sc * 2 * dim1 - Woff] );
    5968             :                         };
    5969             :                         {
    5970   785557813 :                             x06 = ( x[2 * i + 2 * 3 * dim1] * W[sc * i + sc * 3 * dim1 - Woff] ) - ( x[2 * i + 2 * 3 * dim1 + 1] * W[sc * i + sc * 3 * dim1 + 1 - Woff] );
    5971   785557813 :                             x07 = ( x[2 * i + 2 * 3 * dim1] * W[sc * i + sc * 3 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 3 * dim1 + 1] * W[sc * i + sc * 3 * dim1 - Woff] );
    5972             :                         };
    5973             :                         {
    5974   785557813 :                             x08 = ( x[2 * i + 2 * 4 * dim1] * W[sc * i + sc * 4 * dim1 - Woff] ) - ( x[2 * i + 2 * 4 * dim1 + 1] * W[sc * i + sc * 4 * dim1 + 1 - Woff] );
    5975   785557813 :                             x09 = ( x[2 * i + 2 * 4 * dim1] * W[sc * i + sc * 4 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 4 * dim1 + 1] * W[sc * i + sc * 4 * dim1 - Woff] );
    5976             :                         };
    5977             :                         {
    5978   785557813 :                             x10 = ( x[2 * i + 2 * 5 * dim1] * W[sc * i + sc * 5 * dim1 - Woff] ) - ( x[2 * i + 2 * 5 * dim1 + 1] * W[sc * i + sc * 5 * dim1 + 1 - Woff] );
    5979   785557813 :                             x11 = ( x[2 * i + 2 * 5 * dim1] * W[sc * i + sc * 5 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 5 * dim1 + 1] * W[sc * i + sc * 5 * dim1 - Woff] );
    5980             :                         };
    5981             :                         {
    5982   785557813 :                             x12 = ( x[2 * i + 2 * 6 * dim1] * W[sc * i + sc * 6 * dim1 - Woff] ) - ( x[2 * i + 2 * 6 * dim1 + 1] * W[sc * i + sc * 6 * dim1 + 1 - Woff] );
    5983   785557813 :                             x13 = ( x[2 * i + 2 * 6 * dim1] * W[sc * i + sc * 6 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 6 * dim1 + 1] * W[sc * i + sc * 6 * dim1 - Woff] );
    5984             :                         };
    5985             :                         {
    5986   785557813 :                             x14 = ( x[2 * i + 2 * 7 * dim1] * W[sc * i + sc * 7 * dim1 - Woff] ) - ( x[2 * i + 2 * 7 * dim1 + 1] * W[sc * i + sc * 7 * dim1 + 1 - Woff] );
    5987   785557813 :                             x15 = ( x[2 * i + 2 * 7 * dim1] * W[sc * i + sc * 7 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 7 * dim1 + 1] * W[sc * i + sc * 7 * dim1 - Woff] );
    5988             :                         };
    5989             :                     }
    5990             : 
    5991   820055216 :                     t00 = ( x00 + x08 );
    5992   820055216 :                     t02 = ( x00 - x08 );
    5993   820055216 :                     t01 = ( x01 + x09 );
    5994   820055216 :                     t03 = ( x01 - x09 );
    5995   820055216 :                     t04 = ( x02 + x10 );
    5996   820055216 :                     t06 = ( x02 - x10 );
    5997   820055216 :                     t05 = ( x03 + x11 );
    5998   820055216 :                     t07 = ( x03 - x11 );
    5999   820055216 :                     t08 = ( x04 + x12 );
    6000   820055216 :                     t10 = ( x04 - x12 );
    6001   820055216 :                     t09 = ( x05 + x13 );
    6002   820055216 :                     t11 = ( x05 - x13 );
    6003   820055216 :                     t12 = ( x06 + x14 );
    6004   820055216 :                     t14 = ( x06 - x14 );
    6005   820055216 :                     t13 = ( x07 + x15 );
    6006   820055216 :                     t15 = ( x07 - x15 );
    6007             : 
    6008   820055216 :                     s00 = ( t00 + t08 );
    6009   820055216 :                     s04 = ( t00 - t08 );
    6010   820055216 :                     s01 = ( t01 + t09 );
    6011   820055216 :                     s05 = ( t01 - t09 );
    6012   820055216 :                     s08 = ( t02 - t11 );
    6013   820055216 :                     s10 = ( t02 + t11 );
    6014   820055216 :                     s09 = ( t03 + t10 );
    6015   820055216 :                     s11 = ( t03 - t10 );
    6016   820055216 :                     s02 = ( t04 + t12 );
    6017   820055216 :                     s07 = ( t04 - t12 );
    6018   820055216 :                     s03 = ( t05 + t13 );
    6019   820055216 :                     s06 = ( t13 - t05 );
    6020             : 
    6021   820055216 :                     t01 = ( t06 + t14 );
    6022   820055216 :                     t02 = ( t06 - t14 );
    6023   820055216 :                     t00 = ( t07 + t15 );
    6024   820055216 :                     t03 = ( t07 - t15 );
    6025             : 
    6026   820055216 :                     s12 = ( ( t00 + t02 ) * FFT_C81 );
    6027   820055216 :                     s14 = ( ( t00 - t02 ) * FFT_C81 );
    6028   820055216 :                     s13 = ( ( t03 - t01 ) * FFT_C81 );
    6029   820055216 :                     s15 = ( ( t01 + t03 ) * FFT_C82 );
    6030             : 
    6031   820055216 :                     re[sx * i + sx * 0 * dim1] = ( s00 + s02 );
    6032   820055216 :                     im[sx * i + sx * 0 * dim1] = ( s01 + s03 );
    6033   820055216 :                     re[sx * i + sx * 1 * dim1] = ( s10 + s12 );
    6034   820055216 :                     im[sx * i + sx * 1 * dim1] = ( s11 + s13 );
    6035   820055216 :                     re[sx * i + sx * 2 * dim1] = ( s04 - s06 );
    6036   820055216 :                     im[sx * i + sx * 2 * dim1] = ( s05 - s07 );
    6037   820055216 :                     re[sx * i + sx * 3 * dim1] = ( s08 + s14 );
    6038   820055216 :                     im[sx * i + sx * 3 * dim1] = ( s09 + s15 );
    6039   820055216 :                     re[sx * i + sx * 4 * dim1] = ( s00 - s02 );
    6040   820055216 :                     im[sx * i + sx * 4 * dim1] = ( s01 - s03 );
    6041   820055216 :                     re[sx * i + sx * 5 * dim1] = ( s10 - s12 );
    6042   820055216 :                     im[sx * i + sx * 5 * dim1] = ( s11 - s13 );
    6043   820055216 :                     re[sx * i + sx * 6 * dim1] = ( s04 + s06 );
    6044   820055216 :                     im[sx * i + sx * 6 * dim1] = ( s05 + s07 );
    6045   820055216 :                     re[sx * i + sx * 7 * dim1] = ( s08 - s14 );
    6046   820055216 :                     im[sx * i + sx * 7 * dim1] = ( s09 - s15 );
    6047             :                 }
    6048             :             }
    6049   899669283 :             break;
    6050             :         }
    6051             : 
    6052      574040 :         case 10:
    6053             :         {
    6054             :             float y[2 * 10];
    6055     6314440 :             for ( j = 0; j < dim2; j++ )
    6056             :             {
    6057             :                 {
    6058     5740400 :                     y[2 * j] = x[2 * 0 + 2 * j * dim1];
    6059     5740400 :                     y[2 * j + 1] = x[2 * 0 + 2 * j * dim1 + 1];
    6060             :                 };
    6061             :             }
    6062      574040 :             fft_len10( &y[0], &y[1], 2 );
    6063     6314440 :             for ( j = 0; j < dim2; j++ )
    6064             :             {
    6065     5740400 :                 re[sx * 0 + sx * j * dim1] = y[2 * j];
    6066     5740400 :                 im[sx * 0 + sx * j * dim1] = y[2 * j + 1];
    6067             :             }
    6068             : 
    6069    11480800 :             for ( i = 1; i < dim1; i++ )
    6070             :             {
    6071             :                 {
    6072    10906760 :                     y[2 * ( 0 + 0 )] = x[2 * i + 2 * ( 0 + 0 ) * dim1];
    6073    10906760 :                     y[2 * ( 0 + 0 ) + 1] = x[2 * i + 2 * ( 0 + 0 ) * dim1 + 1];
    6074             :                 }
    6075             : 
    6076   109067600 :                 for ( j = 1; j < dim2; j++ )
    6077             :                 {
    6078             :                     {
    6079    98160840 :                         y[2 * ( j + 0 )] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + sc * j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + sc * j * dim1 + 1 - Woff] );
    6080    98160840 :                         y[2 * ( j + 0 ) + 1] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + sc * j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + sc * j * dim1 - Woff] );
    6081             :                     }
    6082             :                 }
    6083    10906760 :                 fft_len10( &y[0], &y[1], 2 );
    6084   119974360 :                 for ( j = 0; j < dim2; j++ )
    6085             :                 {
    6086   109067600 :                     re[sx * i + sx * j * dim1] = y[2 * j];
    6087   109067600 :                     im[sx * i + sx * j * dim1] = y[2 * j + 1];
    6088             :                 }
    6089             :             }
    6090      574040 :             break;
    6091             :         }
    6092             : 
    6093   102135288 :         case 16:
    6094             :         {
    6095             :             float y[2 * 16];
    6096  1736299896 :             for ( j = 0; j < dim2; j++ )
    6097             :             {
    6098             :                 {
    6099  1634164608 :                     y[2 * j] = x[2 * 0 + 2 * j * dim1];
    6100  1634164608 :                     y[2 * j + 1] = x[2 * 0 + 2 * j * dim1 + 1];
    6101             :                 };
    6102             :             }
    6103   102135288 :             fft_len16( &y[0], &y[1], 2 );
    6104  1736299896 :             for ( j = 0; j < dim2; j++ )
    6105             :             {
    6106  1634164608 :                 re[sx * 0 + sx * j * dim1] = y[2 * j];
    6107  1634164608 :                 im[sx * 0 + sx * j * dim1] = y[2 * j + 1];
    6108             :             }
    6109             : 
    6110  2625029250 :             for ( i = 1; i < dim1; i++ )
    6111             :             {
    6112             :                 {
    6113  2522893962 :                     y[2 * ( 0 + 0 )] = x[2 * i + 2 * ( 0 + 0 ) * dim1];
    6114  2522893962 :                     y[2 * ( 0 + 0 ) + 1] = x[2 * i + 2 * ( 0 + 0 ) * dim1 + 1];
    6115             :                 }
    6116             : 
    6117 40366303392 :                 for ( j = 1; j < dim2; j++ )
    6118             :                 {
    6119             :                     {
    6120 37843409430 :                         y[2 * ( j + 0 )] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + sc * j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + sc * j * dim1 + 1 - Woff] );
    6121 37843409430 :                         y[2 * ( j + 0 ) + 1] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + sc * j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + sc * j * dim1 - Woff] );
    6122             :                     }
    6123             :                 }
    6124  2522893962 :                 fft_len16( &y[0], &y[1], 2 );
    6125 42889197354 :                 for ( j = 0; j < dim2; j++ )
    6126             :                 {
    6127 40366303392 :                     re[sx * i + sx * j * dim1] = y[2 * j];
    6128 40366303392 :                     im[sx * i + sx * j * dim1] = y[2 * j + 1];
    6129             :                 }
    6130             :             }
    6131   102135288 :             break;
    6132             :         }
    6133             : 
    6134      612015 :         case 20:
    6135             :         {
    6136             :             float y[2 * 20];
    6137    12852315 :             for ( j = 0; j < dim2; j++ )
    6138             :             {
    6139             :                 {
    6140    12240300 :                     y[2 * j] = x[2 * 0 + 2 * j * dim1];
    6141    12240300 :                     y[2 * j + 1] = x[2 * 0 + 2 * j * dim1 + 1];
    6142             :                 };
    6143             :             }
    6144      612015 :             fft_len20( &y[0], &y[1], 2 );
    6145    12852315 :             for ( j = 0; j < dim2; j++ )
    6146             :             {
    6147    12240300 :                 re[sx * 0 + sx * j * dim1] = y[2 * j];
    6148    12240300 :                 im[sx * 0 + sx * j * dim1] = y[2 * j + 1];
    6149             :             }
    6150             : 
    6151    16683390 :             for ( i = 1; i < dim1; i++ )
    6152             :             {
    6153             :                 {
    6154    16071375 :                     y[2 * ( 0 + 0 )] = x[2 * i + 2 * ( 0 + 0 ) * dim1];
    6155    16071375 :                     y[2 * ( 0 + 0 ) + 1] = x[2 * i + 2 * ( 0 + 0 ) * dim1 + 1];
    6156             :                 }
    6157             :                 {
    6158    16071375 :                     y[2 * ( 0 + 1 )] = ( x[2 * i + 2 * ( 0 + 1 ) * dim1] * W[len + sc * i + 0 * dim1 - Woff] ) - ( x[2 * i + 2 * ( 0 + 1 ) * dim1 + 1] * W[len + sc * i + 0 * dim1 + 1 - Woff] );
    6159    16071375 :                     y[2 * ( 0 + 1 ) + 1] = ( x[2 * i + 2 * ( 0 + 1 ) * dim1] * W[len + sc * i + 0 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( 0 + 1 ) * dim1 + 1] * W[len + sc * i + 0 * dim1 - Woff] );
    6160             :                 }
    6161             : 
    6162   160713750 :                 for ( j = 2; j < dim2; j = j + 2 )
    6163             :                 {
    6164             :                     {
    6165   144642375 :                         y[2 * ( j + 0 )] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + j * dim1 + 1 - Woff] );
    6166   144642375 :                         y[2 * ( j + 0 ) + 1] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + j * dim1 - Woff] );
    6167             :                     }
    6168             :                     {
    6169   144642375 :                         y[2 * ( j + 1 )] = ( x[2 * i + 2 * ( j + 1 ) * dim1] * W[len + sc * i + j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 1 ) * dim1 + 1] * W[len + sc * i + j * dim1 + 1 - Woff] );
    6170   144642375 :                         y[2 * ( j + 1 ) + 1] = ( x[2 * i + 2 * ( j + 1 ) * dim1] * W[len + sc * i + j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 1 ) * dim1 + 1] * W[len + sc * i + j * dim1 - Woff] );
    6171             :                     }
    6172             :                 }
    6173    16071375 :                 fft_len20( &y[0], &y[1], 2 );
    6174   337498875 :                 for ( j = 0; j < dim2; j++ )
    6175             :                 {
    6176   321427500 :                     re[sx * i + sx * j * dim1] = y[2 * j];
    6177   321427500 :                     im[sx * i + sx * j * dim1] = y[2 * j + 1];
    6178             :                 }
    6179             :             }
    6180      612015 :             break;
    6181             :         }
    6182             : 
    6183    16130759 :         case 32:
    6184             :         {
    6185             :             float y[2 * 32];
    6186   532315047 :             for ( j = 0; j < dim2; j++ )
    6187             :             {
    6188             :                 {
    6189   516184288 :                     y[2 * j] = x[2 * 0 + 2 * j * dim1];
    6190   516184288 :                     y[2 * j + 1] = x[2 * 0 + 2 * j * dim1 + 1];
    6191             :                 };
    6192             :             }
    6193    16130759 :             fft_len32( &y[0], &y[1], 2 );
    6194   532315047 :             for ( j = 0; j < dim2; j++ )
    6195             :             {
    6196   516184288 :                 re[sx * 0 + sx * j * dim1] = y[2 * j];
    6197   516184288 :                 im[sx * 0 + sx * j * dim1] = y[2 * j + 1];
    6198             :             }
    6199             : 
    6200   407431750 :             for ( i = 1; i < dim1; i++ )
    6201             :             {
    6202             :                 {
    6203   391300991 :                     y[2 * ( 0 + 0 )] = x[2 * i + 2 * ( 0 + 0 ) * dim1];
    6204   391300991 :                     y[2 * ( 0 + 0 ) + 1] = x[2 * i + 2 * ( 0 + 0 ) * dim1 + 1];
    6205             :                 }
    6206             :                 {
    6207   391300991 :                     y[2 * ( 0 + 1 )] = ( x[2 * i + 2 * ( 0 + 1 ) * dim1] * W[len + sc * i + 0 * dim1 - Woff] ) - ( x[2 * i + 2 * ( 0 + 1 ) * dim1 + 1] * W[len + sc * i + 0 * dim1 + 1 - Woff] );
    6208   391300991 :                     y[2 * ( 0 + 1 ) + 1] = ( x[2 * i + 2 * ( 0 + 1 ) * dim1] * W[len + sc * i + 0 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( 0 + 1 ) * dim1 + 1] * W[len + sc * i + 0 * dim1 - Woff] );
    6209             :                 }
    6210             : 
    6211  6260815856 :                 for ( j = 2; j < dim2; j = j + 2 )
    6212             :                 {
    6213             :                     {
    6214  5869514865 :                         y[2 * ( j + 0 )] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + j * dim1 + 1 - Woff] );
    6215  5869514865 :                         y[2 * ( j + 0 ) + 1] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + j * dim1 - Woff] );
    6216             :                     }
    6217             :                     {
    6218  5869514865 :                         y[2 * ( j + 1 )] = ( x[2 * i + 2 * ( j + 1 ) * dim1] * W[len + sc * i + j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 1 ) * dim1 + 1] * W[len + sc * i + j * dim1 + 1 - Woff] );
    6219  5869514865 :                         y[2 * ( j + 1 ) + 1] = ( x[2 * i + 2 * ( j + 1 ) * dim1] * W[len + sc * i + j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 1 ) * dim1 + 1] * W[len + sc * i + j * dim1 - Woff] );
    6220             :                     }
    6221             :                 }
    6222   391300991 :                 fft_len32( &y[0], &y[1], 2 );
    6223 12912932703 :                 for ( j = 0; j < dim2; j++ )
    6224             :                 {
    6225 12521631712 :                     re[sx * i + sx * j * dim1] = y[2 * j];
    6226 12521631712 :                     im[sx * i + sx * j * dim1] = y[2 * j + 1];
    6227             :                 }
    6228             :             }
    6229    16130759 :             break;
    6230             :         }
    6231             :     }
    6232             : 
    6233  1019121385 :     return;
    6234             : }
    6235             : 
    6236             : 
    6237             : /*-----------------------------------------------------------------*
    6238             :  * fft()
    6239             :  *
    6240             :  * Complex-value FFT
    6241             :  *-----------------------------------------------------------------*/
    6242             : 
    6243  1019121385 : void fft(
    6244             :     float *re,            /* i/o: real part           */
    6245             :     float *im,            /* i/o: imag part           */
    6246             :     const int16_t length, /* i  : length of fft       */
    6247             :     const int16_t s       /* i  : sign                */
    6248             : )
    6249             : {
    6250  1019121385 :     switch ( length )
    6251             :     {
    6252           0 :         case 20:
    6253           0 :             fft_len20( re, im, s );
    6254           0 :             break;
    6255      920243 :         case 40:
    6256      920243 :             fft_lenN( re, im, FFT_RotVector_640, 640, 5, 8, s, 8, 40 );
    6257      920243 :             break;
    6258     1019018 :         case 64:
    6259     1019018 :             fft_lenN( re, im, FFT_RotVector_256, 256, 8, 8, s, 8, 64 );
    6260     1019018 :             break;
    6261   224699048 :         case 80:
    6262   224699048 :             fft_lenN( re, im, FFT_RotVector_640, 640, 10, 8, s, 4, 40 );
    6263   224699048 :             break;
    6264           0 :         case 100:
    6265           0 :             fft_lenN( re, im, FFT_RotVector_400, 400, 10, 10, s, 4, 40 );
    6266           0 :             break;
    6267     9556054 :         case 120:
    6268     9556054 :             fft_lenN( re, im, FFT_RotVector_960, 960, 15, 8, s, 4, 60 );
    6269     9556054 :             break;
    6270    16212828 :         case 128:
    6271    16212828 :             fft_lenN( re, im, FFT_RotVector_256, 256, 16, 8, s, 4, 64 );
    6272    16212828 :             break;
    6273   265103164 :         case 160:
    6274   265103164 :             fft_lenN( re, im, FFT_RotVector_640, 640, 20, 8, s, 2, 40 );
    6275   265103164 :             break;
    6276      574040 :         case 200:
    6277      574040 :             fft_lenN( re, im, FFT_RotVector_400, 400, 20, 10, s, 2, 40 );
    6278      574040 :             break;
    6279   364893371 :         case 240:
    6280   364893371 :             fft_lenN( re, im, FFT_RotVector_960, 960, 30, 8, s, 2, 60 );
    6281   364893371 :             break;
    6282    17265557 :         case 256:
    6283    17265557 :             fft_lenN( re, im, FFT_RotVector_256, 256, 32, 8, s, 2, 64 );
    6284    17265557 :             break;
    6285    43902939 :         case 320:
    6286    43902939 :             fft_lenN( re, im, FFT_RotVector_640, 640, 20, 16, s, 2, 40 );
    6287    43902939 :             break;
    6288      167706 :         case 400:
    6289      167706 :             fft_lenN( re, im, FFT_RotVector_400, 400, 20, 20, s, 2, 40 );
    6290      167706 :             break;
    6291    58232349 :         case 480:
    6292    58232349 :             fft_lenN( re, im, FFT_RotVector_960, 960, 30, 16, s, 2, 60 );
    6293    58232349 :             break;
    6294      444309 :         case 600:
    6295      444309 :             fft_lenN( re, im, FFT_RotVector_600, 600, 30, 20, s, 2, 60 );
    6296      444309 :             break;
    6297     7649102 :         case 640:
    6298     7649102 :             fft_lenN( re, im, FFT_RotVector_640, 640, 20, 32, s, 2, 40 );
    6299     7649102 :             break;
    6300     8481657 :         case 960:
    6301     8481657 :             fft_lenN( re, im, FFT_RotVector_960, 960, 30, 32, s, 2, 60 );
    6302     8481657 :             break;
    6303           0 :         default:
    6304           0 :             assert( !"fft length is not supported!" );
    6305             :     }
    6306             : 
    6307  1019121385 :     return;
    6308             : }
    6309             : 
    6310             : 
    6311             : /*-----------------------------------------------------------------*
    6312             :  * rfft()
    6313             :  *
    6314             :  * Real-value FFT
    6315             :  *-----------------------------------------------------------------*/
    6316             : 
    6317    26268080 : void rfft(
    6318             :     float *x,             /* i/o: values                    */
    6319             :     const float *w,       /* i  : window                    */
    6320             :     const int16_t length, /* i  : length of fft             */
    6321             :     const int16_t isign   /* i  : sign                      */
    6322             : )
    6323             : {
    6324             :     int16_t i, sizeOfFft2, sizeOfFft4;
    6325             :     float tmp, t1, t2, t3, t4, s1, s2;
    6326             : 
    6327    26268080 :     sizeOfFft2 = length >> 1;
    6328    26268080 :     sizeOfFft4 = length >> 2;
    6329    26268080 :     s1 = 1.f / (float) sizeOfFft2;
    6330    26268080 :     s2 = -1.f / (float) sizeOfFft2;
    6331             : 
    6332    26268080 :     switch ( isign )
    6333             :     {
    6334             : 
    6335    13128340 :         case -1:
    6336             : 
    6337    13128340 :             fft( x, x + 1, sizeOfFft2, 2 );
    6338             : 
    6339    13128340 :             tmp = x[0] + x[1];
    6340    13128340 :             x[1] = x[0] - x[1];
    6341    13128340 :             x[0] = tmp;
    6342             : 
    6343  1872748980 :             for ( i = 1; i <= sizeOfFft4; i++ )
    6344             :             {
    6345  1859620640 :                 t1 = x[2 * i] - x[length - 2 * i];
    6346  1859620640 :                 t2 = x[2 * i + 1] + x[length - 2 * i + 1];
    6347  1859620640 :                 t3 = w[i] * t1 - w[i + sizeOfFft4] * t2;
    6348  1859620640 :                 t4 = w[i + sizeOfFft4] * t1 + w[i] * t2;
    6349  1859620640 :                 t1 = x[2 * i] + x[length - 2 * i];
    6350  1859620640 :                 t2 = x[2 * i + 1] - x[length - 2 * i + 1];
    6351             : 
    6352  1859620640 :                 x[2 * i] = ( t1 - t3 ) * 0.5f;
    6353  1859620640 :                 x[2 * i + 1] = ( t2 - t4 ) * 0.5f;
    6354  1859620640 :                 x[length - 2 * i] = ( t1 + t3 ) * 0.5f;
    6355  1859620640 :                 x[length - 2 * i + 1] = -( t2 + t4 ) * 0.5f;
    6356             :             }
    6357             : 
    6358    13128340 :             break;
    6359             : 
    6360    13139740 :         case +1:
    6361             : 
    6362    13139740 :             tmp = ( x[0] + x[1] ) * 0.5f;
    6363    13139740 :             x[1] = ( x[1] - x[0] ) * 0.5f;
    6364    13139740 :             x[0] = tmp;
    6365             : 
    6366  2535423908 :             for ( i = 1; i <= sizeOfFft4; i++ )
    6367             :             {
    6368  2522284168 :                 t1 = x[2 * i] - x[length - 2 * i];
    6369  2522284168 :                 t2 = x[2 * i + 1] + x[length - 2 * i + 1];
    6370  2522284168 :                 t3 = w[i] * t1 + w[i + sizeOfFft4] * t2;
    6371  2522284168 :                 t4 = -w[i + sizeOfFft4] * t1 + w[i] * t2;
    6372  2522284168 :                 t1 = x[2 * i] + x[length - 2 * i];
    6373  2522284168 :                 t2 = x[2 * i + 1] - x[length - 2 * i + 1];
    6374             : 
    6375  2522284168 :                 x[2 * i] = ( t1 - t3 ) * 0.5f;
    6376  2522284168 :                 x[2 * i + 1] = ( t4 - t2 ) * 0.5f;
    6377  2522284168 :                 x[length - 2 * i] = ( t1 + t3 ) * 0.5f;
    6378  2522284168 :                 x[length - 2 * i + 1] = ( t2 + t4 ) * 0.5f;
    6379             :             }
    6380             : 
    6381    13139740 :             fft( x, x + 1, sizeOfFft2, 2 );
    6382             : 
    6383  5057708076 :             for ( i = 0; i < length; i += 2 )
    6384             :             {
    6385  5044568336 :                 x[i] *= s1;
    6386  5044568336 :                 x[i + 1] *= s2;
    6387             :             }
    6388             : 
    6389    13139740 :             break;
    6390             :     }
    6391             : 
    6392    26268080 :     return;
    6393             : }
    6394             : 
    6395             : 
    6396             : #define WMC_TOOL_SKIP
    6397             : 
    6398             : #define SCALEFACTOR8  ( 4 )
    6399             : #define SCALEFACTOR64 ( 7 )
    6400             : #define SCALEFACTORN2 ( 3 )
    6401             : 
    6402             : #define SHC( x )  ( (Word16) x )
    6403             : #define FFTC( x ) WORD322WORD16( (Word32) x )
    6404             : 
    6405             : #define C81_FX ( FFTC( 0x5a82799a ) ) /* FL2WORD32( 7.071067811865475e-1) */
    6406             : #define C82_FX ( FFTC( 0xa57d8666 ) ) /* FL2WORD32(-7.071067811865475e-1) */
    6407             : 
    6408             : #define cplxMpy4_8_0( re, im, a, b, c, d )                          \
    6409             :     re = L_shr( L_sub( Mpy_32_16( a, c ), Mpy_32_16( b, d ) ), 1 ); \
    6410             :     im = L_shr( L_add( Mpy_32_16( a, d ), Mpy_32_16( b, c ) ), 1 );
    6411             : 
    6412             : #define cplxMpy4_8_1( re, im, a, b ) \
    6413             :     re = L_shr( a, 1 );              \
    6414             :     im = L_shr( b, 1 );
    6415             : 
    6416             : 
    6417             : /**
    6418             :  * \brief    Twiddle factors are unscaled
    6419             :  */
    6420             : static const Word16 RotVector_256[2 * ( 256 - 32 )] = {
    6421             :     SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7ff6 ), SHC( 0xfcdc ), SHC( 0x7fd9 ), SHC( 0xf9b8 ), SHC( 0x7fa7 ), SHC( 0xf695 ),
    6422             :     SHC( 0x7f62 ), SHC( 0xf374 ), SHC( 0x7f0a ), SHC( 0xf055 ), SHC( 0x7e9d ), SHC( 0xed38 ), SHC( 0x7e1e ), SHC( 0xea1e ),
    6423             :     SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7ce4 ), SHC( 0xe3f4 ), SHC( 0x7c2a ), SHC( 0xe0e6 ), SHC( 0x7b5d ), SHC( 0xdddc ),
    6424             :     SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x798a ), SHC( 0xd7d9 ), SHC( 0x7885 ), SHC( 0xd4e1 ), SHC( 0x776c ), SHC( 0xd1ef ),
    6425             :     SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x7505 ), SHC( 0xcc21 ), SHC( 0x73b6 ), SHC( 0xc946 ), SHC( 0x7255 ), SHC( 0xc673 ),
    6426             :     SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x6f5f ), SHC( 0xc0e9 ), SHC( 0x6dca ), SHC( 0xbe32 ), SHC( 0x6c24 ), SHC( 0xbb85 ),
    6427             :     SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x68a7 ), SHC( 0xb64c ), SHC( 0x66d0 ), SHC( 0xb3c0 ), SHC( 0x64e9 ), SHC( 0xb140 ),
    6428             :     SHC( 0x62f2 ), SHC( 0xaecc ), SHC( 0x60ec ), SHC( 0xac65 ), SHC( 0x5ed7 ), SHC( 0xaa0a ), SHC( 0x5cb4 ), SHC( 0xa7bd ),
    6429             :     SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fd9 ), SHC( 0xf9b8 ), SHC( 0x7f62 ), SHC( 0xf374 ), SHC( 0x7e9d ), SHC( 0xed38 ),
    6430             :     SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7c2a ), SHC( 0xe0e6 ), SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x7885 ), SHC( 0xd4e1 ),
    6431             :     SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x73b6 ), SHC( 0xc946 ), SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x6dca ), SHC( 0xbe32 ),
    6432             :     SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x66d0 ), SHC( 0xb3c0 ), SHC( 0x62f2 ), SHC( 0xaecc ), SHC( 0x5ed7 ), SHC( 0xaa0a ),
    6433             :     SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x55f6 ), SHC( 0xa129 ), SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x4c40 ), SHC( 0x9930 ),
    6434             :     SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x41ce ), SHC( 0x9236 ), SHC( 0x3c57 ), SHC( 0x8f1d ), SHC( 0x36ba ), SHC( 0x8c4a ),
    6435             :     SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x2b1f ), SHC( 0x877b ), SHC( 0x2528 ), SHC( 0x8583 ), SHC( 0x1f1a ), SHC( 0x83d6 ),
    6436             :     SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x12c8 ), SHC( 0x8163 ), SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0x0648 ), SHC( 0x8027 ),
    6437             :     SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7fa7 ), SHC( 0xf695 ), SHC( 0x7e9d ), SHC( 0xed38 ), SHC( 0x7ce4 ), SHC( 0xe3f4 ),
    6438             :     SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x776c ), SHC( 0xd1ef ), SHC( 0x73b6 ), SHC( 0xc946 ), SHC( 0x6f5f ), SHC( 0xc0e9 ),
    6439             :     SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x64e9 ), SHC( 0xb140 ), SHC( 0x5ed7 ), SHC( 0xaa0a ), SHC( 0x5843 ), SHC( 0xa34c ),
    6440             :     SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x49b4 ), SHC( 0x9759 ), SHC( 0x41ce ), SHC( 0x9236 ), SHC( 0x398d ), SHC( 0x8dab ),
    6441             :     SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x2827 ), SHC( 0x8676 ), SHC( 0x1f1a ), SHC( 0x83d6 ), SHC( 0x15e2 ), SHC( 0x81e2 ),
    6442             :     SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0x0324 ), SHC( 0x800a ), SHC( 0xf9b8 ), SHC( 0x8027 ), SHC( 0xf055 ), SHC( 0x80f6 ),
    6443             :     SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xdddc ), SHC( 0x84a3 ), SHC( 0xd4e1 ), SHC( 0x877b ), SHC( 0xcc21 ), SHC( 0x8afb ),
    6444             :     SHC( 0xc3a9 ), SHC( 0x8f1d ), SHC( 0xbb85 ), SHC( 0x93dc ), SHC( 0xb3c0 ), SHC( 0x9930 ), SHC( 0xac65 ), SHC( 0x9f14 ),
    6445             :     SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f62 ), SHC( 0xf374 ), SHC( 0x7d8a ), SHC( 0xe707 ), SHC( 0x7a7d ), SHC( 0xdad8 ),
    6446             :     SHC( 0x7642 ), SHC( 0xcf04 ), SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x62f2 ), SHC( 0xaecc ),
    6447             :     SHC( 0x5a82 ), SHC( 0xa57e ), SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x3c57 ), SHC( 0x8f1d ),
    6448             :     SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x2528 ), SHC( 0x8583 ), SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x0c8c ), SHC( 0x809e ),
    6449             :     SHC( 0x0000 ), SHC( 0x8000 ), SHC( 0xf374 ), SHC( 0x809e ), SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xdad8 ), SHC( 0x8583 ),
    6450             :     SHC( 0xcf04 ), SHC( 0x89be ), SHC( 0xc3a9 ), SHC( 0x8f1d ), SHC( 0xb8e3 ), SHC( 0x9592 ), SHC( 0xaecc ), SHC( 0x9d0e ),
    6451             :     SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9d0e ), SHC( 0xaecc ), SHC( 0x9592 ), SHC( 0xb8e3 ), SHC( 0x8f1d ), SHC( 0xc3a9 ),
    6452             :     SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x8583 ), SHC( 0xdad8 ), SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x809e ), SHC( 0xf374 ),
    6453             :     SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7f0a ), SHC( 0xf055 ), SHC( 0x7c2a ), SHC( 0xe0e6 ), SHC( 0x776c ), SHC( 0xd1ef ),
    6454             :     SHC( 0x70e3 ), SHC( 0xc3a9 ), SHC( 0x68a7 ), SHC( 0xb64c ), SHC( 0x5ed7 ), SHC( 0xaa0a ), SHC( 0x539b ), SHC( 0x9f14 ),
    6455             :     SHC( 0x471d ), SHC( 0x9592 ), SHC( 0x398d ), SHC( 0x8dab ), SHC( 0x2b1f ), SHC( 0x877b ), SHC( 0x1c0c ), SHC( 0x831c ),
    6456             :     SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0xfcdc ), SHC( 0x800a ), SHC( 0xed38 ), SHC( 0x8163 ), SHC( 0xdddc ), SHC( 0x84a3 ),
    6457             :     SHC( 0xcf04 ), SHC( 0x89be ), SHC( 0xc0e9 ), SHC( 0x90a1 ), SHC( 0xb3c0 ), SHC( 0x9930 ), SHC( 0xa7bd ), SHC( 0xa34c ),
    6458             :     SHC( 0x9d0e ), SHC( 0xaecc ), SHC( 0x93dc ), SHC( 0xbb85 ), SHC( 0x8c4a ), SHC( 0xc946 ), SHC( 0x8676 ), SHC( 0xd7d9 ),
    6459             :     SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x8059 ), SHC( 0xf695 ), SHC( 0x8027 ), SHC( 0x0648 ), SHC( 0x81e2 ), SHC( 0x15e2 ),
    6460             :     SHC( 0x8583 ), SHC( 0x2528 ), SHC( 0x8afb ), SHC( 0x33df ), SHC( 0x9236 ), SHC( 0x41ce ), SHC( 0x9b17 ), SHC( 0x4ec0 ),
    6461             :     SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e9d ), SHC( 0xed38 ), SHC( 0x7a7d ), SHC( 0xdad8 ), SHC( 0x73b6 ), SHC( 0xc946 ),
    6462             :     SHC( 0x6a6e ), SHC( 0xb8e3 ), SHC( 0x5ed7 ), SHC( 0xaa0a ), SHC( 0x5134 ), SHC( 0x9d0e ), SHC( 0x41ce ), SHC( 0x9236 ),
    6463             :     SHC( 0x30fc ), SHC( 0x89be ), SHC( 0x1f1a ), SHC( 0x83d6 ), SHC( 0x0c8c ), SHC( 0x809e ), SHC( 0xf9b8 ), SHC( 0x8027 ),
    6464             :     SHC( 0xe707 ), SHC( 0x8276 ), SHC( 0xd4e1 ), SHC( 0x877b ), SHC( 0xc3a9 ), SHC( 0x8f1d ), SHC( 0xb3c0 ), SHC( 0x9930 ),
    6465             :     SHC( 0xa57e ), SHC( 0xa57e ), SHC( 0x9930 ), SHC( 0xb3c0 ), SHC( 0x8f1d ), SHC( 0xc3a9 ), SHC( 0x877b ), SHC( 0xd4e1 ),
    6466             :     SHC( 0x8276 ), SHC( 0xe707 ), SHC( 0x8027 ), SHC( 0xf9b8 ), SHC( 0x809e ), SHC( 0x0c8c ), SHC( 0x83d6 ), SHC( 0x1f1a ),
    6467             :     SHC( 0x89be ), SHC( 0x30fc ), SHC( 0x9236 ), SHC( 0x41ce ), SHC( 0x9d0e ), SHC( 0x5134 ), SHC( 0xaa0a ), SHC( 0x5ed7 ),
    6468             :     SHC( 0xb8e3 ), SHC( 0x6a6e ), SHC( 0xc946 ), SHC( 0x73b6 ), SHC( 0xdad8 ), SHC( 0x7a7d ), SHC( 0xed38 ), SHC( 0x7e9d ),
    6469             :     SHC( 0x7fff ), SHC( 0x0000 ), SHC( 0x7e1e ), SHC( 0xea1e ), SHC( 0x7885 ), SHC( 0xd4e1 ), SHC( 0x6f5f ), SHC( 0xc0e9 ),
    6470             :     SHC( 0x62f2 ), SHC( 0xaecc ), SHC( 0x539b ), SHC( 0x9f14 ), SHC( 0x41ce ), SHC( 0x9236 ), SHC( 0x2e11 ), SHC( 0x8894 ),
    6471             :     SHC( 0x18f9 ), SHC( 0x8276 ), SHC( 0x0324 ), SHC( 0x800a ), SHC( 0xed38 ), SHC( 0x8163 ), SHC( 0xd7d9 ), SHC( 0x8676 ),
    6472             :     SHC( 0xc3a9 ), SHC( 0x8f1d ), SHC( 0xb140 ), SHC( 0x9b17 ), SHC( 0xa129 ), SHC( 0xaa0a ), SHC( 0x93dc ), SHC( 0xbb85 ),
    6473             :     SHC( 0x89be ), SHC( 0xcf04 ), SHC( 0x831c ), SHC( 0xe3f4 ), SHC( 0x8027 ), SHC( 0xf9b8 ), SHC( 0x80f6 ), SHC( 0x0fab ),
    6474             :     SHC( 0x8583 ), SHC( 0x2528 ), SHC( 0x8dab ), SHC( 0x398d ), SHC( 0x9930 ), SHC( 0x4c40 ), SHC( 0xa7bd ), SHC( 0x5cb4 ),
    6475             :     SHC( 0xb8e3 ), SHC( 0x6a6e ), SHC( 0xcc21 ), SHC( 0x7505 ), SHC( 0xe0e6 ), SHC( 0x7c2a ), SHC( 0xf695 ), SHC( 0x7fa7 ),
    6476             :     SHC( 0x0c8c ), SHC( 0x7f62 ), SHC( 0x2224 ), SHC( 0x7b5d ), SHC( 0x36ba ), SHC( 0x73b6 ), SHC( 0x49b4 ), SHC( 0x68a7 )
    6477             : };
    6478             : 
    6479             : /*-----------------------------------------------------------------*
    6480             :  * BASOP_fft8()
    6481             :  *
    6482             :  * Function performs a complex 8-point FFT
    6483             :  * The FFT is performed inplace. The result of the FFT
    6484             :  * is scaled by SCALEFACTOR8 bits.
    6485             :  *
    6486             :  * WOPS with 32x16 bit multiplications: 108 cycles
    6487             :  *-----------------------------------------------------------------*/
    6488             : 
    6489    17959376 : static void BASOP_fft8(
    6490             :     Word32 *re,
    6491             :     Word32 *im,
    6492             :     Word16 s )
    6493             : {
    6494             :     Word32 x00, x01, x02, x03, x04, x05, x06, x07;
    6495             :     Word32 x08, x09, x10, x11, x12, x13, x14, x15;
    6496             :     Word32 t00, t01, t02, t03, t04, t05, t06, t07;
    6497             :     Word32 t08, t09, t10, t11, t12, t13, t14, t15;
    6498             :     Word32 s00, s01, s02, s03, s04, s05, s06, s07;
    6499             :     Word32 s08, s09, s10, s11, s12, s13, s14, s15;
    6500             : 
    6501             : 
    6502             :     /* Pre-additions */
    6503             : 
    6504    17959376 :     x00 = L_shr( re[s * 0], SCALEFACTOR8 );
    6505    17959376 :     x01 = L_shr( im[s * 0], SCALEFACTOR8 );
    6506    17959376 :     x02 = L_shr( re[s * 1], SCALEFACTOR8 );
    6507    17959376 :     x03 = L_shr( im[s * 1], SCALEFACTOR8 );
    6508    17959376 :     x04 = L_shr( re[s * 2], SCALEFACTOR8 );
    6509    17959376 :     x05 = L_shr( im[s * 2], SCALEFACTOR8 );
    6510    17959376 :     x06 = L_shr( re[s * 3], SCALEFACTOR8 );
    6511    17959376 :     x07 = L_shr( im[s * 3], SCALEFACTOR8 );
    6512    17959376 :     x08 = L_shr( re[s * 4], SCALEFACTOR8 );
    6513    17959376 :     x09 = L_shr( im[s * 4], SCALEFACTOR8 );
    6514    17959376 :     x10 = L_shr( re[s * 5], SCALEFACTOR8 );
    6515    17959376 :     x11 = L_shr( im[s * 5], SCALEFACTOR8 );
    6516    17959376 :     x12 = L_shr( re[s * 6], SCALEFACTOR8 );
    6517    17959376 :     x13 = L_shr( im[s * 6], SCALEFACTOR8 );
    6518    17959376 :     x14 = L_shr( re[s * 7], SCALEFACTOR8 );
    6519    17959376 :     x15 = L_shr( im[s * 7], SCALEFACTOR8 );
    6520             : 
    6521    17959376 :     t00 = L_add( x00, x08 );
    6522    17959376 :     t02 = L_sub( x00, x08 );
    6523    17959376 :     t01 = L_add( x01, x09 );
    6524    17959376 :     t03 = L_sub( x01, x09 );
    6525    17959376 :     t04 = L_add( x02, x10 );
    6526    17959376 :     t06 = L_sub( x02, x10 );
    6527    17959376 :     t05 = L_add( x03, x11 );
    6528    17959376 :     t07 = L_sub( x03, x11 );
    6529    17959376 :     t08 = L_add( x04, x12 );
    6530    17959376 :     t10 = L_sub( x04, x12 );
    6531    17959376 :     t09 = L_add( x05, x13 );
    6532    17959376 :     t11 = L_sub( x05, x13 );
    6533    17959376 :     t12 = L_add( x06, x14 );
    6534    17959376 :     t14 = L_sub( x06, x14 );
    6535    17959376 :     t13 = L_add( x07, x15 );
    6536    17959376 :     t15 = L_sub( x07, x15 );
    6537             : 
    6538             :     /* Pre-additions and core multiplications */
    6539             : 
    6540    17959376 :     s00 = L_add( t00, t08 );
    6541    17959376 :     s04 = L_sub( t00, t08 );
    6542    17959376 :     s01 = L_add( t01, t09 );
    6543    17959376 :     s05 = L_sub( t01, t09 );
    6544    17959376 :     s08 = L_sub( t02, t11 );
    6545    17959376 :     s10 = L_add( t02, t11 );
    6546    17959376 :     s09 = L_add( t03, t10 );
    6547    17959376 :     s11 = L_sub( t03, t10 );
    6548    17959376 :     s02 = L_add( t04, t12 );
    6549    17959376 :     s07 = L_sub( t04, t12 );
    6550    17959376 :     s03 = L_add( t05, t13 );
    6551    17959376 :     s06 = L_sub( t13, t05 );
    6552             : 
    6553    17959376 :     t01 = L_add( t06, t14 );
    6554    17959376 :     t02 = L_sub( t06, t14 );
    6555    17959376 :     t00 = L_add( t07, t15 );
    6556    17959376 :     t03 = L_sub( t07, t15 );
    6557             : 
    6558    17959376 :     s12 = Mpy_32_16( L_add( t00, t02 ), C81_FX );
    6559    17959376 :     s14 = Mpy_32_16( L_sub( t00, t02 ), C81_FX );
    6560    17959376 :     s13 = Mpy_32_16( L_sub( t03, t01 ), C81_FX );
    6561    17959376 :     s15 = Mpy_32_16( L_add( t01, t03 ), C82_FX );
    6562             : 
    6563             :     /* Post-additions */
    6564             : 
    6565    17959376 :     re[s * 0] = L_add( s00, s02 );
    6566    17959376 :     move32();
    6567    17959376 :     re[s * 4] = L_sub( s00, s02 );
    6568    17959376 :     move32();
    6569    17959376 :     im[s * 0] = L_add( s01, s03 );
    6570    17959376 :     move32();
    6571    17959376 :     im[s * 4] = L_sub( s01, s03 );
    6572    17959376 :     move32();
    6573    17959376 :     re[s * 2] = L_sub( s04, s06 );
    6574    17959376 :     move32();
    6575    17959376 :     re[s * 6] = L_add( s04, s06 );
    6576    17959376 :     move32();
    6577    17959376 :     im[s * 2] = L_sub( s05, s07 );
    6578    17959376 :     move32();
    6579    17959376 :     im[s * 6] = L_add( s05, s07 );
    6580    17959376 :     move32();
    6581    17959376 :     re[s * 3] = L_add( s08, s14 );
    6582    17959376 :     move32();
    6583    17959376 :     re[s * 7] = L_sub( s08, s14 );
    6584    17959376 :     move32();
    6585    17959376 :     im[s * 3] = L_add( s09, s15 );
    6586    17959376 :     move32();
    6587    17959376 :     im[s * 7] = L_sub( s09, s15 );
    6588    17959376 :     move32();
    6589    17959376 :     re[s * 1] = L_add( s10, s12 );
    6590    17959376 :     move32();
    6591    17959376 :     re[s * 5] = L_sub( s10, s12 );
    6592    17959376 :     move32();
    6593    17959376 :     im[s * 1] = L_add( s11, s13 );
    6594    17959376 :     move32();
    6595    17959376 :     im[s * 5] = L_sub( s11, s13 );
    6596    17959376 :     move32();
    6597             : 
    6598    17959376 :     return;
    6599             : }
    6600             : 
    6601             : 
    6602             : /*-----------------------------------------------------------------*
    6603             :  * fftN2()
    6604             :  *
    6605             :  * Combined FFT
    6606             :  *-----------------------------------------------------------------*/
    6607             : 
    6608     2244922 : static void BASOP_fftN2(
    6609             :     Word32 *re,      /* i/o: real part                                       */
    6610             :     Word32 *im,      /* i/o: imag part                                       */
    6611             :     const Word16 *W, /* i  : rotation factor                                 */
    6612             :     Word16 dim1,     /* i  : length of fft1                                  */
    6613             :     Word16 dim2,     /* i  : length of fft2                                  */
    6614             :     Word16 sx,       /* i  : stride real and imag part                       */
    6615             :     Word16 sc,       /* i  : stride phase rotation coefficients              */
    6616             :     Word32 *x,       /* tmp: 32-bit workbuffer                               */
    6617             :     Word16 Woff      /* i  : offset for addressing the rotation vector table */
    6618             : )
    6619             : {
    6620             :     Word16 i, j;
    6621             :     Word32 x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11, x12, x13, x14, x15;
    6622             :     Word32 t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15;
    6623             :     Word32 s00, s01, s02, s03, s04, s05, s06, s07, s08, s09, s10, s11, s12, s13, s14, s15;
    6624             : 
    6625    20204298 :     FOR( i = 0; i < dim2; i++ )
    6626             :     {
    6627   161634384 :         FOR( j = 0; j < dim1; j++ )
    6628             :         {
    6629   143675008 :             x[2 * i * dim1 + 2 * j] = re[sx * i + sx * j * dim2];
    6630   143675008 :             move32();
    6631   143675008 :             x[2 * i * dim1 + 2 * j + 1] = im[sx * i + sx * j * dim2];
    6632   143675008 :             move32();
    6633             :         }
    6634             :     }
    6635             : 
    6636             :     /* dim1 == 8 */
    6637    20204298 :     FOR( i = 0; i < dim2; i++ )
    6638             :     {
    6639    17959376 :         BASOP_fft8( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
    6640             :     }
    6641             : 
    6642             :     /* dim2 == 8 */
    6643    20204298 :     FOR( i = 0; i < dim1; i++ )
    6644             :     {
    6645    17959376 :         cplxMpy4_8_1( x00, x01, x[2 * i + 2 * 0 * dim1], x[2 * i + 2 * 0 * dim1 + 1] );
    6646             : 
    6647    17959376 :         IF( i == 0 )
    6648             :         {
    6649     2244922 :             cplxMpy4_8_1( x02, x03, x[2 * i + 2 * 1 * dim1], x[2 * i + 2 * 1 * dim1 + 1] );
    6650     2244922 :             cplxMpy4_8_1( x04, x05, x[2 * i + 2 * 2 * dim1], x[2 * i + 2 * 2 * dim1 + 1] );
    6651     2244922 :             cplxMpy4_8_1( x06, x07, x[2 * i + 2 * 3 * dim1], x[2 * i + 2 * 3 * dim1 + 1] );
    6652     2244922 :             cplxMpy4_8_1( x08, x09, x[2 * i + 2 * 4 * dim1], x[2 * i + 2 * 4 * dim1 + 1] );
    6653     2244922 :             cplxMpy4_8_1( x10, x11, x[2 * i + 2 * 5 * dim1], x[2 * i + 2 * 5 * dim1 + 1] );
    6654     2244922 :             cplxMpy4_8_1( x12, x13, x[2 * i + 2 * 6 * dim1], x[2 * i + 2 * 6 * dim1 + 1] );
    6655     2244922 :             cplxMpy4_8_1( x14, x15, x[2 * i + 2 * 7 * dim1], x[2 * i + 2 * 7 * dim1 + 1] );
    6656             :         }
    6657             :         ELSE
    6658             :         {
    6659    15714454 :             cplxMpy4_8_0( x02, x03, x[2 * i + 2 * 1 * dim1], x[2 * i + 2 * 1 * dim1 + 1], W[sc * i + sc * 1 * dim1 - Woff], W[sc * i + sc * 1 * dim1 + 1 - Woff] );
    6660    15714454 :             cplxMpy4_8_0( x04, x05, x[2 * i + 2 * 2 * dim1], x[2 * i + 2 * 2 * dim1 + 1], W[sc * i + sc * 2 * dim1 - Woff], W[sc * i + sc * 2 * dim1 + 1 - Woff] );
    6661    15714454 :             cplxMpy4_8_0( x06, x07, x[2 * i + 2 * 3 * dim1], x[2 * i + 2 * 3 * dim1 + 1], W[sc * i + sc * 3 * dim1 - Woff], W[sc * i + sc * 3 * dim1 + 1 - Woff] );
    6662    15714454 :             cplxMpy4_8_0( x08, x09, x[2 * i + 2 * 4 * dim1], x[2 * i + 2 * 4 * dim1 + 1], W[sc * i + sc * 4 * dim1 - Woff], W[sc * i + sc * 4 * dim1 + 1 - Woff] );
    6663    15714454 :             cplxMpy4_8_0( x10, x11, x[2 * i + 2 * 5 * dim1], x[2 * i + 2 * 5 * dim1 + 1], W[sc * i + sc * 5 * dim1 - Woff], W[sc * i + sc * 5 * dim1 + 1 - Woff] );
    6664    15714454 :             cplxMpy4_8_0( x12, x13, x[2 * i + 2 * 6 * dim1], x[2 * i + 2 * 6 * dim1 + 1], W[sc * i + sc * 6 * dim1 - Woff], W[sc * i + sc * 6 * dim1 + 1 - Woff] );
    6665    15714454 :             cplxMpy4_8_0( x14, x15, x[2 * i + 2 * 7 * dim1], x[2 * i + 2 * 7 * dim1 + 1], W[sc * i + sc * 7 * dim1 - Woff], W[sc * i + sc * 7 * dim1 + 1 - Woff] );
    6666             :         }
    6667    17959376 :         t00 = L_shr( L_add( x00, x08 ), SCALEFACTORN2 - 1 );
    6668    17959376 :         t02 = L_shr( L_sub( x00, x08 ), SCALEFACTORN2 - 1 );
    6669    17959376 :         t01 = L_shr( L_add( x01, x09 ), SCALEFACTORN2 - 1 );
    6670    17959376 :         t03 = L_shr( L_sub( x01, x09 ), SCALEFACTORN2 - 1 );
    6671    17959376 :         t04 = L_shr( L_add( x02, x10 ), SCALEFACTORN2 - 1 );
    6672    17959376 :         t06 = L_sub( x02, x10 );
    6673    17959376 :         t05 = L_shr( L_add( x03, x11 ), SCALEFACTORN2 - 1 );
    6674    17959376 :         t07 = L_sub( x03, x11 );
    6675    17959376 :         t08 = L_shr( L_add( x04, x12 ), SCALEFACTORN2 - 1 );
    6676    17959376 :         t10 = L_shr( L_sub( x04, x12 ), SCALEFACTORN2 - 1 );
    6677    17959376 :         t09 = L_shr( L_add( x05, x13 ), SCALEFACTORN2 - 1 );
    6678    17959376 :         t11 = L_shr( L_sub( x05, x13 ), SCALEFACTORN2 - 1 );
    6679    17959376 :         t12 = L_shr( L_add( x06, x14 ), SCALEFACTORN2 - 1 );
    6680    17959376 :         t14 = L_sub( x06, x14 );
    6681    17959376 :         t13 = L_shr( L_add( x07, x15 ), SCALEFACTORN2 - 1 );
    6682    17959376 :         t15 = L_sub( x07, x15 );
    6683             : 
    6684    17959376 :         s00 = L_add( t00, t08 );
    6685    17959376 :         s04 = L_sub( t00, t08 );
    6686    17959376 :         s01 = L_add( t01, t09 );
    6687    17959376 :         s05 = L_sub( t01, t09 );
    6688    17959376 :         s08 = L_sub( t02, t11 );
    6689    17959376 :         s10 = L_add( t02, t11 );
    6690    17959376 :         s09 = L_add( t03, t10 );
    6691    17959376 :         s11 = L_sub( t03, t10 );
    6692    17959376 :         s02 = L_add( t04, t12 );
    6693    17959376 :         s07 = L_sub( t04, t12 );
    6694    17959376 :         s03 = L_add( t05, t13 );
    6695    17959376 :         s06 = L_sub( t13, t05 );
    6696             : 
    6697    17959376 :         t01 = L_shr( L_add( t06, t14 ), SCALEFACTORN2 - 1 );
    6698    17959376 :         t02 = L_shr( L_sub( t06, t14 ), SCALEFACTORN2 - 1 );
    6699    17959376 :         t00 = L_shr( L_add( t07, t15 ), SCALEFACTORN2 - 1 );
    6700    17959376 :         t03 = L_shr( L_sub( t07, t15 ), SCALEFACTORN2 - 1 );
    6701             : 
    6702    17959376 :         s12 = Mpy_32_16( L_add( t00, t02 ), C81_FX );
    6703    17959376 :         s14 = Mpy_32_16( L_sub( t00, t02 ), C81_FX );
    6704    17959376 :         s13 = Mpy_32_16( L_sub( t03, t01 ), C81_FX );
    6705    17959376 :         s15 = Mpy_32_16( L_add( t01, t03 ), C82_FX );
    6706             : 
    6707    17959376 :         re[sx * i + sx * 0 * dim1] = L_add( s00, s02 );
    6708    17959376 :         move32();
    6709    17959376 :         im[sx * i + sx * 0 * dim1] = L_add( s01, s03 );
    6710    17959376 :         move32();
    6711    17959376 :         re[sx * i + sx * 1 * dim1] = L_add( s10, s12 );
    6712    17959376 :         move32();
    6713    17959376 :         im[sx * i + sx * 1 * dim1] = L_add( s11, s13 );
    6714    17959376 :         move32();
    6715    17959376 :         re[sx * i + sx * 2 * dim1] = L_sub( s04, s06 );
    6716    17959376 :         move32();
    6717    17959376 :         im[sx * i + sx * 2 * dim1] = L_sub( s05, s07 );
    6718    17959376 :         move32();
    6719    17959376 :         re[sx * i + sx * 3 * dim1] = L_add( s08, s14 );
    6720    17959376 :         move32();
    6721    17959376 :         im[sx * i + sx * 3 * dim1] = L_add( s09, s15 );
    6722    17959376 :         move32();
    6723    17959376 :         re[sx * i + sx * 4 * dim1] = L_sub( s00, s02 );
    6724    17959376 :         move32();
    6725    17959376 :         im[sx * i + sx * 4 * dim1] = L_sub( s01, s03 );
    6726    17959376 :         move32();
    6727    17959376 :         re[sx * i + sx * 5 * dim1] = L_sub( s10, s12 );
    6728    17959376 :         move32();
    6729    17959376 :         im[sx * i + sx * 5 * dim1] = L_sub( s11, s13 );
    6730    17959376 :         move32();
    6731    17959376 :         re[sx * i + sx * 6 * dim1] = L_add( s04, s06 );
    6732    17959376 :         move32();
    6733    17959376 :         im[sx * i + sx * 6 * dim1] = L_add( s05, s07 );
    6734    17959376 :         move32();
    6735    17959376 :         re[sx * i + sx * 7 * dim1] = L_sub( s08, s14 );
    6736    17959376 :         move32();
    6737    17959376 :         im[sx * i + sx * 7 * dim1] = L_sub( s09, s15 );
    6738    17959376 :         move32();
    6739             :     }
    6740             : 
    6741     2244922 :     return;
    6742             : }
    6743             : 
    6744             : 
    6745             : /*-----------------------------------------------------------------*
    6746             :  * BASOP_cfft()
    6747             :  *
    6748             :  * Complex valued FFT
    6749             :  *-----------------------------------------------------------------*/
    6750             : 
    6751     2244922 : void BASOP_cfft(
    6752             :     Word32 *re,   /* i/o: real part                   */
    6753             :     Word32 *im,   /* i/o: imag part                   */
    6754             :     Word16 s,     /* i  : stride real and imag part   */
    6755             :     Word16 *scale /* i  : scalefactor                 */
    6756             : )
    6757             : {
    6758             :     Word32 x[2 * 64];
    6759             : 
    6760             :     /* FFT for len = FDNS_NPTS */
    6761     2244922 :     BASOP_fftN2( re, im, RotVector_256, 8, 8, s, 8, x, 64 );
    6762     2244922 :     s = add( *scale, SCALEFACTOR64 );
    6763             : 
    6764     2244922 :     *scale = s;
    6765     2244922 :     move16();
    6766             : 
    6767     2244922 :     return;
    6768             : }
    6769             : 
    6770             : #undef WMC_TOOL_SKIP

Generated by: LCOV version 1.14