LCOV - code coverage report
Current view: top level - lib_com - fft_cldfb.c (source / functions) Hit Total Coverage
Test: Coverage on main -- long test vectors @ 9b04ec3cb36f5e8dc438cf854fa3e349998fa1e9 Lines: 833 835 99.8 %
Date: 2025-10-31 05:43:07 Functions: 8 8 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 <stdint.h>
      38             : #include "options.h"
      39             : #include <assert.h>
      40             : #include "prot.h"
      41             : #include "ivas_cnst.h"
      42             : #include "wmc_auto.h"
      43             : 
      44             : #if __STDC_VERSION__ >= 199901L
      45             : #if defined __ICL
      46             : #define restrict __restrict
      47             : #endif
      48             : #else
      49             : #define restrict
      50             : #endif
      51             : 
      52             : 
      53             : static void fft8( float *vec );
      54             : static void fft10( float *vec );
      55             : static void fft16( float *vec );
      56             : static void fft20( float *vec );
      57             : static void fft30( float *vec );
      58             : static void fft5s( float *x, const int16_t stride );
      59             : 
      60             : 
      61             : #define COS_PI_DIV8  9.238795325112867e-1f
      62             : #define COS_3PI_DIV8 3.826834323650898e-1f
      63             : #define SQRT2PLUS1   2.414213562373095f
      64             : #define SQRT2MINUS1  4.142135623730952e-1f
      65             : 
      66             : 
      67             : /*******************************************************************************
      68             :  Functionname:  fft8
      69             :  *******************************************************************************
      70             : 
      71             :  Description:   8-point FFT. Complex-valued input takes 52 real additions
      72             :                 and 4 real multiplications.
      73             : 
      74             :  Arguments:     vec - pointer to data (interleaved real / imaginary parts)
      75             : 
      76             :  Return:        none
      77             : 
      78             : *******************************************************************************/
      79   156126298 : static void fft8( float *restrict vec )
      80             : {
      81             :     float temp1[16];
      82             :     float temp2[16];
      83             : 
      84             : 
      85             :     /* Pre-additions */
      86   156126298 :     temp1[0] = vec[0] + vec[8];
      87   156126298 :     temp1[2] = vec[0] - vec[8];
      88   156126298 :     temp1[1] = vec[1] + vec[9];
      89   156126298 :     temp1[3] = vec[1] - vec[9];
      90   156126298 :     temp1[4] = vec[2] + vec[10];
      91   156126298 :     temp1[6] = vec[2] - vec[10];
      92   156126298 :     temp1[5] = vec[3] + vec[11];
      93   156126298 :     temp1[7] = vec[3] - vec[11];
      94   156126298 :     temp1[8] = vec[4] + vec[12];
      95   156126298 :     temp1[10] = vec[4] - vec[12];
      96   156126298 :     temp1[9] = vec[5] + vec[13];
      97   156126298 :     temp1[11] = vec[5] - vec[13];
      98   156126298 :     temp1[12] = vec[6] + vec[14];
      99   156126298 :     temp1[14] = vec[6] - vec[14];
     100   156126298 :     temp1[13] = vec[7] + vec[15];
     101   156126298 :     temp1[15] = vec[7] - vec[15];
     102             : 
     103             :     /* Pre-additions and core multiplications */
     104   156126298 :     temp2[0] = temp1[0] + temp1[8];
     105   156126298 :     temp2[4] = temp1[0] - temp1[8];
     106   156126298 :     temp2[1] = temp1[1] + temp1[9];
     107   156126298 :     temp2[5] = temp1[1] - temp1[9];
     108   156126298 :     temp2[8] = temp1[2] - temp1[11];
     109   156126298 :     temp2[10] = temp1[2] + temp1[11];
     110   156126298 :     temp2[9] = temp1[3] + temp1[10];
     111   156126298 :     temp2[11] = temp1[3] - temp1[10];
     112   156126298 :     temp2[2] = temp1[4] + temp1[12];
     113   156126298 :     temp2[7] = temp1[4] - temp1[12];
     114   156126298 :     temp2[3] = temp1[5] + temp1[13];
     115   156126298 :     temp2[6] = temp1[13] - temp1[5];
     116             : 
     117   156126298 :     temp1[1] = temp1[6] + temp1[14];
     118   156126298 :     temp1[2] = temp1[6] - temp1[14];
     119   156126298 :     temp1[0] = temp1[7] + temp1[15];
     120   156126298 :     temp1[3] = temp1[7] - temp1[15];
     121             : 
     122   156126298 :     temp2[12] = ( temp1[0] + temp1[2] ) * INV_SQRT2;
     123   156126298 :     temp2[14] = ( temp1[0] - temp1[2] ) * INV_SQRT2;
     124   156126298 :     temp2[13] = ( temp1[3] - temp1[1] ) * INV_SQRT2;
     125   156126298 :     temp2[15] = ( temp1[1] + temp1[3] ) * -INV_SQRT2;
     126             : 
     127             :     /* Post-additions */
     128   156126298 :     vec[0] = temp2[0] + temp2[2];
     129   156126298 :     vec[8] = temp2[0] - temp2[2];
     130   156126298 :     vec[1] = temp2[1] + temp2[3];
     131   156126298 :     vec[9] = temp2[1] - temp2[3];
     132   156126298 :     vec[4] = temp2[4] - temp2[6];
     133   156126298 :     vec[12] = temp2[4] + temp2[6];
     134   156126298 :     vec[5] = temp2[5] - temp2[7];
     135   156126298 :     vec[13] = temp2[5] + temp2[7];
     136   156126298 :     vec[6] = temp2[8] + temp2[14];
     137   156126298 :     vec[14] = temp2[8] - temp2[14];
     138   156126298 :     vec[7] = temp2[9] + temp2[15];
     139   156126298 :     vec[15] = temp2[9] - temp2[15];
     140   156126298 :     vec[2] = temp2[10] + temp2[12];
     141   156126298 :     vec[10] = temp2[10] - temp2[12];
     142   156126298 :     vec[3] = temp2[11] + temp2[13];
     143   156126298 :     vec[11] = temp2[11] - temp2[13];
     144             : 
     145   156126298 :     return;
     146             : }
     147             : 
     148             : 
     149             : /*******************************************************************************
     150             :  Functionname:  fft16
     151             :  *******************************************************************************
     152             : 
     153             :  Description:   16-point FFT. Complex-valued input takes 144 real additions and
     154             :                 24 real multiplications.
     155             : 
     156             :  Arguments:     vec - pointer to data (interleaved real / imaginary parts)
     157             : 
     158             :  Return:        none
     159             : 
     160             : *******************************************************************************/
     161             : /* fast implementation, completely unrolled and inlined */
     162      248096 : static void fft16( float *restrict vec )
     163             : {
     164             :     float temp10, temp11, temp12, temp13, temp14, temp15, temp16, temp17,
     165             :         temp18, temp19, temp110, temp111, temp112, temp113, temp114, temp115;
     166             :     float temp20, temp21, temp22, temp23, temp24, temp25, temp26, temp27,
     167             :         temp28, temp29, temp210, temp211, temp212, temp213, temp214, temp215;
     168             :     float vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7,
     169             :         vec8, vec9, vec10, vec11, vec12, vec13, vec14, vec15;
     170             : 
     171             : 
     172             :     /* even */
     173      248096 :     vec0 = vec[0] + vec[16];
     174      248096 :     vec1 = vec[1] + vec[17];
     175      248096 :     vec2 = vec[2] + vec[18];
     176      248096 :     vec3 = vec[3] + vec[19];
     177      248096 :     vec4 = vec[4] + vec[20];
     178      248096 :     vec5 = vec[5] + vec[21];
     179      248096 :     vec6 = vec[6] + vec[22];
     180      248096 :     vec7 = vec[7] + vec[23];
     181      248096 :     vec8 = vec[8] + vec[24];
     182      248096 :     vec9 = vec[9] + vec[25];
     183      248096 :     vec10 = vec[10] + vec[26];
     184      248096 :     vec11 = vec[11] + vec[27];
     185      248096 :     vec12 = vec[12] + vec[28];
     186      248096 :     vec13 = vec[13] + vec[29];
     187      248096 :     vec14 = vec[14] + vec[30];
     188      248096 :     vec15 = vec[15] + vec[31];
     189             : 
     190             :     /* Pre-additions */
     191      248096 :     temp10 = vec0 + vec8;
     192      248096 :     temp12 = vec0 - vec8;
     193      248096 :     temp11 = vec1 + vec9;
     194      248096 :     temp13 = vec1 - vec9;
     195      248096 :     temp14 = vec2 + vec10;
     196      248096 :     temp16 = vec2 - vec10;
     197      248096 :     temp15 = vec3 + vec11;
     198      248096 :     temp17 = vec3 - vec11;
     199      248096 :     temp18 = vec4 + vec12;
     200      248096 :     temp110 = vec4 - vec12;
     201      248096 :     temp19 = vec5 + vec13;
     202      248096 :     temp111 = vec5 - vec13;
     203      248096 :     temp112 = vec6 + vec14;
     204      248096 :     temp114 = vec6 - vec14;
     205      248096 :     temp113 = vec7 + vec15;
     206      248096 :     temp115 = vec7 - vec15;
     207             : 
     208             :     /* Pre-additions and core multiplications */
     209      248096 :     temp20 = temp10 + temp18;
     210      248096 :     temp24 = temp10 - temp18;
     211      248096 :     temp21 = temp11 + temp19;
     212      248096 :     temp25 = temp11 - temp19;
     213      248096 :     temp28 = temp12 - temp111;
     214      248096 :     temp210 = temp12 + temp111;
     215      248096 :     temp29 = temp13 + temp110;
     216      248096 :     temp211 = temp13 - temp110;
     217      248096 :     temp22 = temp14 + temp112;
     218      248096 :     temp27 = temp14 - temp112;
     219      248096 :     temp23 = temp15 + temp113;
     220      248096 :     temp26 = temp113 - temp15;
     221             : 
     222      248096 :     temp11 = temp16 + temp114;
     223      248096 :     temp12 = temp16 - temp114;
     224      248096 :     temp10 = temp17 + temp115;
     225      248096 :     temp13 = temp17 - temp115;
     226             : 
     227      248096 :     temp212 = ( temp10 + temp12 ) * INV_SQRT2;
     228      248096 :     temp214 = ( temp10 - temp12 ) * INV_SQRT2;
     229      248096 :     temp213 = ( temp13 - temp11 ) * INV_SQRT2;
     230      248096 :     temp215 = ( temp11 + temp13 ) * -INV_SQRT2;
     231             : 
     232             : 
     233             :     /* odd */
     234      248096 :     vec0 = vec[0] - vec[16];
     235      248096 :     vec1 = vec[1] - vec[17];
     236      248096 :     vec2 = vec[2] - vec[18];
     237      248096 :     vec3 = vec[3] - vec[19];
     238      248096 :     vec4 = vec[4] - vec[20];
     239      248096 :     vec5 = vec[5] - vec[21];
     240      248096 :     vec6 = vec[6] - vec[22];
     241      248096 :     vec7 = vec[7] - vec[23];
     242      248096 :     vec8 = vec[8] - vec[24];
     243      248096 :     vec9 = vec[9] - vec[25];
     244      248096 :     vec10 = vec[10] - vec[26];
     245      248096 :     vec11 = vec[11] - vec[27];
     246      248096 :     vec12 = vec[12] - vec[28];
     247      248096 :     vec13 = vec[13] - vec[29];
     248      248096 :     vec14 = vec[14] - vec[30];
     249      248096 :     vec15 = vec[15] - vec[31];
     250             : 
     251             :     /* Pre-additions and core multiplications */
     252      248096 :     temp19 = ( vec2 + vec14 ) * -COS_3PI_DIV8;
     253      248096 :     temp110 = ( vec2 - vec14 ) * COS_PI_DIV8;
     254      248096 :     temp18 = ( vec3 + vec15 ) * COS_3PI_DIV8;
     255      248096 :     temp111 = ( vec3 - vec15 ) * COS_PI_DIV8;
     256      248096 :     temp15 = ( vec4 + vec12 ) * -INV_SQRT2;
     257      248096 :     temp16 = ( vec4 - vec12 ) * INV_SQRT2;
     258      248096 :     temp14 = ( vec5 + vec13 ) * INV_SQRT2;
     259      248096 :     temp17 = ( vec5 - vec13 ) * INV_SQRT2;
     260      248096 :     temp113 = ( vec6 + vec10 ) * -COS_PI_DIV8;
     261      248096 :     temp114 = ( vec6 - vec10 ) * COS_3PI_DIV8;
     262      248096 :     temp112 = ( vec7 + vec11 ) * COS_PI_DIV8;
     263      248096 :     temp115 = ( vec7 - vec11 ) * COS_3PI_DIV8;
     264             : 
     265             :     /* Core multiplications */
     266      248096 :     vec2 = temp18 * SQRT2PLUS1 - temp112 * SQRT2MINUS1;
     267      248096 :     vec3 = temp19 * SQRT2PLUS1 - temp113 * SQRT2MINUS1;
     268      248096 :     vec4 = temp110 * SQRT2MINUS1 - temp114 * SQRT2PLUS1;
     269      248096 :     vec5 = temp111 * SQRT2MINUS1 - temp115 * SQRT2PLUS1;
     270             : 
     271             :     /* Post-additions */
     272      248096 :     temp18 += temp112;
     273      248096 :     temp19 += temp113;
     274      248096 :     temp110 += temp114;
     275      248096 :     temp111 += temp115;
     276             : 
     277      248096 :     vec6 = vec0 + temp14;
     278      248096 :     vec10 = vec0 - temp14;
     279      248096 :     vec7 = vec1 + temp15;
     280      248096 :     vec11 = vec1 - temp15;
     281             : 
     282      248096 :     vec12 = temp16 - vec9;
     283      248096 :     vec14 = temp16 + vec9;
     284      248096 :     vec13 = vec8 + temp17;
     285      248096 :     vec15 = vec8 - temp17;
     286             : 
     287      248096 :     temp10 = vec6 - vec14;
     288      248096 :     temp12 = vec6 + vec14;
     289      248096 :     temp11 = vec7 + vec15;
     290      248096 :     temp13 = vec7 - vec15;
     291      248096 :     temp14 = vec10 + vec12;
     292      248096 :     temp16 = vec10 - vec12;
     293      248096 :     temp15 = vec11 + vec13;
     294      248096 :     temp17 = vec11 - vec13;
     295             : 
     296      248096 :     vec10 = temp18 + temp110;
     297      248096 :     temp110 = temp18 - temp110;
     298      248096 :     vec11 = temp19 + temp111;
     299      248096 :     temp111 = temp19 - temp111;
     300             : 
     301      248096 :     temp112 = vec2 + vec4;
     302      248096 :     temp114 = vec2 - vec4;
     303      248096 :     temp113 = vec3 + vec5;
     304      248096 :     temp115 = vec3 - vec5;
     305             : 
     306             : 
     307             :     /* Post-additions */
     308      248096 :     *vec++ = temp20 + temp22;
     309      248096 :     *vec++ = temp21 + temp23;
     310      248096 :     *vec++ = temp12 + vec10;
     311      248096 :     *vec++ = temp13 + vec11;
     312      248096 :     *vec++ = temp210 + temp212;
     313      248096 :     *vec++ = temp211 + temp213;
     314      248096 :     *vec++ = temp10 + temp112;
     315      248096 :     *vec++ = temp11 + temp113;
     316      248096 :     *vec++ = temp24 - temp26;
     317      248096 :     *vec++ = temp25 - temp27;
     318      248096 :     *vec++ = temp16 + temp114;
     319      248096 :     *vec++ = temp17 + temp115;
     320      248096 :     *vec++ = temp28 + temp214;
     321      248096 :     *vec++ = temp29 + temp215;
     322      248096 :     *vec++ = temp14 + temp110;
     323      248096 :     *vec++ = temp15 + temp111;
     324      248096 :     *vec++ = temp20 - temp22;
     325      248096 :     *vec++ = temp21 - temp23;
     326      248096 :     *vec++ = temp12 - vec10;
     327      248096 :     *vec++ = temp13 - vec11;
     328      248096 :     *vec++ = temp210 - temp212;
     329      248096 :     *vec++ = temp211 - temp213;
     330      248096 :     *vec++ = temp10 - temp112;
     331      248096 :     *vec++ = temp11 - temp113;
     332      248096 :     *vec++ = temp24 + temp26;
     333      248096 :     *vec++ = temp25 + temp27;
     334      248096 :     *vec++ = temp16 - temp114;
     335      248096 :     *vec++ = temp17 - temp115;
     336      248096 :     *vec++ = temp28 - temp214;
     337      248096 :     *vec++ = temp29 - temp215;
     338      248096 :     *vec++ = temp14 - temp110;
     339      248096 :     *vec++ = temp15 - temp111;
     340             : 
     341      248096 :     return;
     342             : }
     343             : 
     344             : 
     345             : /*******************************************************************************
     346             :  Functionname:  fft15
     347             :  *******************************************************************************
     348             : 
     349             :  Description:   15-point FFT. Complex-valued input takes 176 real additions
     350             :                 and 34 real multiplications.
     351             : 
     352             :  Arguments:     vec - pointer to data (interleaved real / imaginary parts)
     353             : 
     354             :  Return:        none
     355             : 
     356             : *******************************************************************************/
     357  4321153500 : static void fft15( float *restrict vec )
     358             : {
     359             : 
     360             :     float r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16, r17;
     361             :     float i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17;
     362             :     float tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9,
     363             :         tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17, tmp18, tmp19,
     364             :         tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27, tmp28, tmp29;
     365             : 
     366             : 
     367             :     /* Pre-additions real part */
     368  4321153500 :     r1 = vec[2] + vec[8];
     369  4321153500 :     r2 = vec[2] - vec[8];
     370  4321153500 :     r3 = vec[4] + vec[16];
     371  4321153500 :     r4 = vec[4] - vec[16];
     372  4321153500 :     r5 = vec[6] + vec[24];
     373  4321153500 :     r6 = vec[6] - vec[24];
     374  4321153500 :     r7 = vec[10] + vec[20];
     375  4321153500 :     r8 = vec[10] - vec[20];
     376  4321153500 :     r9 = vec[12] + vec[18];
     377  4321153500 :     r10 = vec[12] - vec[18];
     378  4321153500 :     r11 = vec[14] + vec[26];
     379  4321153500 :     r12 = vec[14] - vec[26];
     380  4321153500 :     r13 = vec[22] + vec[28];
     381  4321153500 :     r14 = vec[22] - vec[28];
     382             : 
     383  4321153500 :     tmp2 = r1 + r3;
     384  4321153500 :     tmp4 = r1 - r3;
     385  4321153500 :     tmp6 = r2 + r14;
     386  4321153500 :     tmp8 = r2 - r14;
     387  4321153500 :     tmp10 = r4 + r12;
     388  4321153500 :     tmp12 = r4 - r12;
     389  4321153500 :     tmp14 = r5 + r9;
     390  4321153500 :     tmp16 = r5 - r9;
     391  4321153500 :     tmp18 = r11 + r13;
     392  4321153500 :     tmp20 = r11 - r13;
     393             : 
     394             :     /* Pre-additions imaginary part */
     395  4321153500 :     i1 = vec[3] + vec[9];
     396  4321153500 :     i2 = vec[3] - vec[9];
     397  4321153500 :     i3 = vec[5] + vec[17];
     398  4321153500 :     i4 = vec[5] - vec[17];
     399  4321153500 :     i5 = vec[7] + vec[25];
     400  4321153500 :     i6 = vec[7] - vec[25];
     401  4321153500 :     i7 = vec[11] + vec[21];
     402  4321153500 :     i8 = vec[11] - vec[21];
     403  4321153500 :     i9 = vec[13] + vec[19];
     404  4321153500 :     i10 = vec[13] - vec[19];
     405  4321153500 :     i11 = vec[15] + vec[27];
     406  4321153500 :     i12 = vec[15] - vec[27];
     407  4321153500 :     i13 = vec[23] + vec[29];
     408  4321153500 :     i14 = vec[23] - vec[29];
     409             : 
     410  4321153500 :     tmp3 = i1 + i3;
     411  4321153500 :     tmp5 = i1 - i3;
     412  4321153500 :     tmp7 = i2 + i14;
     413  4321153500 :     tmp9 = i2 - i14;
     414  4321153500 :     tmp11 = i4 + i12;
     415  4321153500 :     tmp13 = i4 - i12;
     416  4321153500 :     tmp15 = i5 + i9;
     417  4321153500 :     tmp17 = i5 - i9;
     418  4321153500 :     tmp19 = i11 + i13;
     419  4321153500 :     tmp21 = i11 - i13;
     420             : 
     421             : 
     422             :     /* Pre-additions and core multiplications */
     423  4321153500 :     tmp28 = tmp4 + tmp20;
     424  4321153500 :     tmp29 = tmp5 + tmp21;
     425  4321153500 :     r4 = tmp2 + tmp18;
     426  4321153500 :     i4 = tmp3 + tmp19;
     427  4321153500 :     r3 = ( r4 + tmp14 ) * -1.25f;
     428  4321153500 :     i3 = ( i4 + tmp15 ) * -1.25f;
     429  4321153500 :     r2 = ( tmp29 - i8 ) * -8.660254037844387e-1f;
     430  4321153500 :     i2 = ( tmp28 - r8 ) * 8.660254037844387e-1f;
     431  4321153500 :     r1 = r4 + r7;
     432  4321153500 :     i1 = i4 + i7;
     433  4321153500 :     r0 = r1 + vec[0] + tmp14;
     434  4321153500 :     i0 = i1 + vec[1] + tmp15;
     435  4321153500 :     r7 = tmp4 - tmp20;
     436  4321153500 :     i7 = tmp5 - tmp21;
     437  4321153500 :     r8 = ( tmp3 - tmp19 ) * -4.841229182759272e-1f;
     438  4321153500 :     i8 = ( tmp2 - tmp18 ) * 4.841229182759272e-1f;
     439  4321153500 :     tmp0 = tmp6 + r10;
     440  4321153500 :     tmp1 = tmp7 + i10;
     441  4321153500 :     tmp2 = r6 - tmp10;
     442  4321153500 :     tmp3 = i6 - tmp11;
     443  4321153500 :     r10 = tmp7 * -2.308262652881440f;
     444  4321153500 :     i10 = tmp6 * 2.308262652881440f;
     445  4321153500 :     r11 = tmp8 * 1.332676064001459f;
     446  4321153500 :     i11 = tmp9 * 1.332676064001459f;
     447  4321153500 :     r6 = ( r7 - tmp16 ) * 5.590169943749475e-1f;
     448  4321153500 :     i6 = ( i7 - tmp17 ) * 5.590169943749475e-1f;
     449  4321153500 :     r12 = ( tmp1 + tmp3 ) * 5.877852522924733e-1f;
     450  4321153500 :     i12 = ( tmp0 + tmp2 ) * -5.877852522924733e-1f;
     451  4321153500 :     r13 = ( tmp7 - tmp11 ) * -8.816778784387098e-1f;
     452  4321153500 :     i13 = ( tmp6 - tmp10 ) * 8.816778784387098e-1f;
     453  4321153500 :     r14 = ( tmp8 + tmp12 ) * 5.090369604551274e-1f;
     454  4321153500 :     i14 = ( tmp9 + tmp13 ) * 5.090369604551274e-1f;
     455  4321153500 :     r16 = tmp11 * 5.449068960040204e-1f;
     456  4321153500 :     i16 = tmp10 * -5.449068960040204e-1f;
     457  4321153500 :     r17 = tmp12 * 3.146021430912046e-1f;
     458  4321153500 :     i17 = tmp13 * 3.146021430912046e-1f;
     459             : 
     460  4321153500 :     r4 *= 1.875f;
     461  4321153500 :     i4 *= 1.875f;
     462  4321153500 :     r1 *= -1.5f;
     463  4321153500 :     i1 *= -1.5f;
     464  4321153500 :     r7 *= -8.385254915624212e-1f;
     465  4321153500 :     i7 *= -8.385254915624212e-1f;
     466  4321153500 :     r5 = tmp29 * 1.082531754730548f;
     467  4321153500 :     i5 = tmp28 * -1.082531754730548f;
     468  4321153500 :     r9 = tmp1 * 1.538841768587627f;
     469  4321153500 :     i9 = tmp0 * -1.538841768587627f;
     470  4321153500 :     r15 = tmp3 * 3.632712640026803e-1f;
     471  4321153500 :     i15 = tmp2 * -3.632712640026803e-1f;
     472             : 
     473             : 
     474             :     /* Post-additions real part */
     475  4321153500 :     tmp2 = r0 + r1;
     476  4321153500 :     tmp4 = r3 + r6;
     477  4321153500 :     tmp6 = r3 - r6;
     478  4321153500 :     tmp8 = r4 + r5;
     479  4321153500 :     tmp10 = r4 - r5;
     480  4321153500 :     tmp12 = r7 + r8;
     481  4321153500 :     tmp14 = r7 - r8;
     482  4321153500 :     tmp16 = r13 + r16;
     483  4321153500 :     tmp18 = r14 + r17;
     484  4321153500 :     tmp20 = r10 - r13;
     485  4321153500 :     tmp22 = r11 - r14;
     486  4321153500 :     tmp24 = r12 + r15;
     487  4321153500 :     tmp26 = r12 - r9;
     488             : 
     489  4321153500 :     r1 = tmp2 + r2;
     490  4321153500 :     r2 = tmp2 - r2;
     491  4321153500 :     r3 = tmp4 + tmp26;
     492  4321153500 :     r4 = tmp4 - tmp26;
     493  4321153500 :     r5 = tmp6 + tmp24;
     494  4321153500 :     r6 = tmp6 - tmp24;
     495  4321153500 :     r7 = tmp16 + tmp18;
     496  4321153500 :     r8 = tmp16 - tmp18;
     497  4321153500 :     r9 = tmp20 - tmp22;
     498  4321153500 :     r10 = tmp20 + tmp22;
     499  4321153500 :     r11 = r1 + tmp8;
     500  4321153500 :     r12 = r2 + tmp10;
     501  4321153500 :     r13 = r11 - tmp12;
     502  4321153500 :     r14 = r12 - tmp14;
     503  4321153500 :     r15 = r12 + tmp14;
     504  4321153500 :     r16 = r11 + tmp12;
     505             : 
     506             :     /* Post-additions imaginary part */
     507  4321153500 :     tmp3 = i0 + i1;
     508  4321153500 :     tmp5 = i3 + i6;
     509  4321153500 :     tmp7 = i3 - i6;
     510  4321153500 :     tmp9 = i4 + i5;
     511  4321153500 :     tmp11 = i4 - i5;
     512  4321153500 :     tmp13 = i7 + i8;
     513  4321153500 :     tmp15 = i7 - i8;
     514  4321153500 :     tmp17 = i13 + i16;
     515  4321153500 :     tmp19 = i14 + i17;
     516  4321153500 :     tmp21 = i10 - i13;
     517  4321153500 :     tmp23 = i11 - i14;
     518  4321153500 :     tmp25 = i12 + i15;
     519  4321153500 :     tmp27 = i12 - i9;
     520             : 
     521  4321153500 :     i1 = tmp3 + i2;
     522  4321153500 :     i2 = tmp3 - i2;
     523  4321153500 :     i3 = tmp5 + tmp27;
     524  4321153500 :     i4 = tmp5 - tmp27;
     525  4321153500 :     i5 = tmp7 + tmp25;
     526  4321153500 :     i6 = tmp7 - tmp25;
     527  4321153500 :     i7 = tmp17 + tmp19;
     528  4321153500 :     i8 = tmp17 - tmp19;
     529  4321153500 :     i9 = tmp21 - tmp23;
     530  4321153500 :     i10 = tmp21 + tmp23;
     531  4321153500 :     i11 = i1 + tmp9;
     532  4321153500 :     i12 = i2 + tmp11;
     533  4321153500 :     i13 = i11 - tmp13;
     534  4321153500 :     i14 = i12 - tmp15;
     535  4321153500 :     i15 = i12 + tmp15;
     536  4321153500 :     i16 = i11 + tmp13;
     537             : 
     538  4321153500 :     *vec++ = r0;
     539  4321153500 :     *vec++ = i0;
     540  4321153500 :     *vec++ = r13 + r5 + r7;
     541  4321153500 :     *vec++ = i13 + i5 + i7;
     542  4321153500 :     *vec++ = r15 + r3 - r9;
     543  4321153500 :     *vec++ = i15 + i3 - i9;
     544  4321153500 :     *vec++ = r0 + r4;
     545  4321153500 :     *vec++ = i0 + i4;
     546  4321153500 :     *vec++ = r13 + r6 - r7;
     547  4321153500 :     *vec++ = i13 + i6 - i7;
     548  4321153500 :     *vec++ = r2;
     549  4321153500 :     *vec++ = i2;
     550  4321153500 :     *vec++ = r0 + r5;
     551  4321153500 :     *vec++ = i0 + i5;
     552  4321153500 :     *vec++ = r16 + r3 - r10;
     553  4321153500 :     *vec++ = i16 + i3 - i10;
     554  4321153500 :     *vec++ = r15 + r4 + r9;
     555  4321153500 :     *vec++ = i15 + i4 + i9;
     556  4321153500 :     *vec++ = r0 + r6;
     557  4321153500 :     *vec++ = i0 + i6;
     558  4321153500 :     *vec++ = r1;
     559  4321153500 :     *vec++ = i1;
     560  4321153500 :     *vec++ = r14 + r5 + r8;
     561  4321153500 :     *vec++ = i14 + i5 + i8;
     562  4321153500 :     *vec++ = r0 + r3;
     563  4321153500 :     *vec++ = i0 + i3;
     564  4321153500 :     *vec++ = r16 + r4 + r10;
     565  4321153500 :     *vec++ = i16 + i4 + i10;
     566  4321153500 :     *vec++ = r14 + r6 - r8;
     567  4321153500 :     *vec++ = i14 + i6 - i8;
     568             : 
     569  4321153500 :     return;
     570             : }
     571             : 
     572             : /*******************************************************************************
     573             :  Functionname:  fft5s
     574             :  *******************************************************************************
     575             : 
     576             :  Description:   5-point FFT.
     577             : 
     578             :  Arguments:     x      - pointer to input data (interleaved real / imaginary parts)
     579             :                 stride - stride for input data
     580             : 
     581             :  Return:        none
     582             : 
     583             : *******************************************************************************/
     584             : static const float C51 = 0.9510565162951535f;
     585             : static const float C52 = -1.5388417685876270f;
     586             : static const float C53 = -0.3632712640026803f;
     587             : static const float C54 = 0.5590169943749475f;
     588             : static const float C55 = -1.25f;
     589             : 
     590      456124 : static void fft5s( float *x, const int16_t stride )
     591             : {
     592             :     float r1, r2, r3, r4;
     593             :     float s1, s2, s3, s4;
     594             :     float t;
     595             :     /* real part */
     596      456124 :     r1 = x[1 * stride] + x[4 * stride];
     597      456124 :     r4 = x[1 * stride] - x[4 * stride];
     598      456124 :     r3 = x[2 * stride] + x[3 * stride];
     599      456124 :     r2 = x[2 * stride] - x[3 * stride];
     600      456124 :     t = ( r1 - r3 ) * C54;
     601      456124 :     r1 = r1 + r3;
     602      456124 :     x[0] = x[0] + r1;
     603      456124 :     r1 = x[0] + ( r1 * C55 );
     604      456124 :     r3 = r1 - t;
     605      456124 :     r1 = r1 + t;
     606      456124 :     t = ( r4 + r2 ) * C51;
     607      456124 :     r4 = t + ( r4 * C52 );
     608      456124 :     r2 = t + ( r2 * C53 );
     609             : 
     610             :     /* imaginary part */
     611      456124 :     s1 = x[1 * stride + 1] + x[4 * stride + 1];
     612      456124 :     s4 = x[1 * stride + 1] - x[4 * stride + 1];
     613      456124 :     s3 = x[2 * stride + 1] + x[3 * stride + 1];
     614      456124 :     s2 = x[2 * stride + 1] - x[3 * stride + 1];
     615      456124 :     t = ( s1 - s3 ) * C54;
     616      456124 :     s1 = s1 + s3;
     617      456124 :     x[1] = x[1] + s1;
     618      456124 :     s1 = x[1] + ( s1 * C55 );
     619      456124 :     s3 = s1 - t;
     620      456124 :     s1 = s1 + t;
     621      456124 :     t = ( s4 + s2 ) * C51;
     622      456124 :     s4 = t + ( s4 * C52 );
     623      456124 :     s2 = t + ( s2 * C53 );
     624             : 
     625             :     /* combination */
     626      456124 :     x[1 * stride] = r1 + s2;
     627      456124 :     x[4 * stride] = r1 - s2;
     628      456124 :     x[2 * stride] = r3 - s4;
     629      456124 :     x[3 * stride] = r3 + s4;
     630             : 
     631      456124 :     x[1 * stride + 1] = s1 - r2;
     632      456124 :     x[4 * stride + 1] = s1 + r2;
     633      456124 :     x[2 * stride + 1] = s3 + r4;
     634      456124 :     x[3 * stride + 1] = s3 - r4;
     635      456124 : }
     636             : 
     637             : 
     638             : /**
     639             :  * \brief    Function performs a complex 10-point FFT
     640             :  *           The FFT is performed inplace. The result of the FFT
     641             :  *           is scaled by SCALEFACTOR10 bits.
     642             :  *
     643             :  *           WOPS FLC version:                    1093 cycles
     644             :  *           WOPS with 32x16 bit multiplications:  196 cycles
     645             :  *
     646             :  * \param    [i/o] re    real input / output
     647             :  * \param    [i/o] im    imag input / output
     648             :  * \param    [i  ] s     stride real and imag input / output
     649             :  *
     650             :  * \return   void
     651             :  */
     652   990752510 : static void fft10( float *restrict vec )
     653             : {
     654             :     float t;
     655             :     float r1, r2, r3, r4;
     656             :     float s1, s2, s3, s4;
     657             :     float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09;
     658             :     float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19;
     659             : 
     660             :     /* 2 fft5 stages */
     661             : 
     662             :     /* real part */
     663   990752510 :     r1 = vec[12] + vec[8];
     664   990752510 :     r4 = vec[12] - vec[8];
     665   990752510 :     r3 = vec[4] + vec[16];
     666   990752510 :     r2 = vec[4] - vec[16];
     667   990752510 :     t = ( r1 - r3 ) * C54;
     668   990752510 :     r1 = r1 + r3;
     669   990752510 :     y00 = vec[0] + r1;
     670   990752510 :     r1 = y00 + ( r1 * C55 );
     671   990752510 :     r3 = r1 - t;
     672   990752510 :     r1 = r1 + t;
     673   990752510 :     t = ( r4 + r2 ) * C51;
     674   990752510 :     r4 = t + ( r4 * C52 );
     675   990752510 :     r2 = t + ( r2 * C53 );
     676             : 
     677             :     /* imaginary part */
     678   990752510 :     s1 = vec[13] + vec[9];
     679   990752510 :     s4 = vec[13] - vec[9];
     680   990752510 :     s3 = vec[5] + vec[17];
     681   990752510 :     s2 = vec[5] - vec[17];
     682   990752510 :     t = ( s1 - s3 ) * C54;
     683   990752510 :     s1 = s1 + s3;
     684   990752510 :     y01 = vec[1] + s1;
     685   990752510 :     s1 = y01 + ( s1 * C55 );
     686   990752510 :     s3 = s1 - t;
     687   990752510 :     s1 = s1 + t;
     688   990752510 :     t = ( s4 + s2 ) * C51;
     689   990752510 :     s4 = t + ( s4 * C52 );
     690   990752510 :     s2 = t + ( s2 * C53 );
     691             : 
     692             :     /* combination */
     693   990752510 :     y04 = r1 + s2;
     694   990752510 :     y16 = r1 - s2;
     695   990752510 :     y08 = r3 - s4;
     696   990752510 :     y12 = r3 + s4;
     697   990752510 :     y05 = s1 - r2;
     698   990752510 :     y17 = s1 + r2;
     699   990752510 :     y09 = s3 + r4;
     700   990752510 :     y13 = s3 - r4;
     701             : 
     702             :     /* real part */
     703   990752510 :     r1 = vec[2] + vec[18];
     704   990752510 :     r4 = vec[2] - vec[18];
     705   990752510 :     r3 = vec[14] + vec[6];
     706   990752510 :     r2 = vec[14] - vec[6];
     707   990752510 :     t = ( r1 - r3 ) * C54;
     708   990752510 :     r1 = r1 + r3;
     709   990752510 :     y02 = vec[10] + r1;
     710   990752510 :     r1 = y02 + ( r1 * C55 );
     711   990752510 :     r3 = r1 - t;
     712   990752510 :     r1 = r1 + t;
     713   990752510 :     t = ( r4 + r2 ) * C51;
     714   990752510 :     r4 = t + ( r4 * C52 );
     715   990752510 :     r2 = t + ( r2 * C53 );
     716             : 
     717             :     /* imaginary part */
     718   990752510 :     s1 = vec[3] + vec[19];
     719   990752510 :     s4 = vec[3] - vec[19];
     720   990752510 :     s3 = vec[15] + vec[7];
     721   990752510 :     s2 = vec[15] - vec[7];
     722   990752510 :     t = ( s1 - s3 ) * C54;
     723   990752510 :     s1 = s1 + s3;
     724   990752510 :     y03 = vec[11] + s1;
     725   990752510 :     s1 = y03 + ( s1 * C55 );
     726   990752510 :     s3 = s1 - t;
     727   990752510 :     s1 = s1 + t;
     728   990752510 :     t = ( s4 + s2 ) * C51;
     729   990752510 :     s4 = t + ( s4 * C52 );
     730   990752510 :     s2 = t + ( s2 * C53 );
     731             : 
     732             :     /* combination */
     733   990752510 :     y06 = r1 + s2;
     734   990752510 :     y18 = r1 - s2;
     735   990752510 :     y10 = r3 - s4;
     736   990752510 :     y14 = r3 + s4;
     737   990752510 :     y07 = s1 - r2;
     738   990752510 :     y19 = s1 + r2;
     739   990752510 :     y11 = s3 + r4;
     740   990752510 :     y15 = s3 - r4;
     741             : 
     742             :     /* 5 fft2 stages */
     743   990752510 :     vec[0] = y00 + y02;
     744   990752510 :     vec[1] = y01 + y03;
     745   990752510 :     vec[2] = y12 - y14;
     746   990752510 :     vec[3] = y13 - y15;
     747   990752510 :     vec[4] = y04 + y06;
     748   990752510 :     vec[5] = y05 + y07;
     749   990752510 :     vec[6] = y16 - y18;
     750   990752510 :     vec[7] = y17 - y19;
     751   990752510 :     vec[8] = y08 + y10;
     752   990752510 :     vec[9] = y09 + y11;
     753   990752510 :     vec[10] = y00 - y02;
     754   990752510 :     vec[11] = y01 - y03;
     755   990752510 :     vec[12] = y12 + y14;
     756   990752510 :     vec[13] = y13 + y15;
     757   990752510 :     vec[14] = y04 - y06;
     758   990752510 :     vec[15] = y05 - y07;
     759   990752510 :     vec[16] = y16 + y18;
     760   990752510 :     vec[17] = y17 + y19;
     761   990752510 :     vec[18] = y08 - y10;
     762   990752510 :     vec[19] = y09 - y11;
     763             : 
     764   990752510 :     return;
     765             : }
     766             : 
     767             : /**
     768             :  * \brief    Function performs a complex 20-point FFT
     769             :  *           The FFT is performed inplace. The result of the FFT
     770             :  *           is scaled by SCALEFACTOR20 bits.
     771             :  *
     772             :  *           WOPS FLC version:                    1509 cycles
     773             :  *           WOPS with 32x16 bit multiplications:  432 cycles
     774             :  *
     775             :  * \param    [i/o] re    real input / output
     776             :  * \param    [i/o] im    imag input / output
     777             :  * \param    [i  ] s     stride real and imag input / output
     778             :  *
     779             :  * \return   void
     780             :  */
     781  1211791566 : static void fft20( float *signal )
     782             : {
     783  1211791566 :     const int16_t s = 2;
     784  1211791566 :     float *re = signal, *im = signal + 1;
     785             :     float r1, r2, r3, r4;
     786             :     float s1, s2, s3, s4;
     787             :     float x0, x1, x2, x3, x4;
     788             :     float t, t0, t1, t2, t3, t4, t5, t6, t7;
     789             :     float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09;
     790             :     float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19;
     791             :     float y20, y21, y22, y23, y24, y25, y26, y27, y28, y29;
     792             :     float y30, y31, y32, y33, y34, y35, y36, y37, y38, y39;
     793             : 
     794             :     /* 1. FFT5 stage */
     795             : 
     796             :     /* real part */
     797  1211791566 :     x0 = re[s * 0];
     798  1211791566 :     x1 = re[s * 16];
     799  1211791566 :     x2 = re[s * 12];
     800  1211791566 :     x3 = re[s * 8];
     801  1211791566 :     x4 = re[s * 4];
     802  1211791566 :     r1 = x1 + x4;
     803  1211791566 :     r4 = x1 - x4;
     804  1211791566 :     r3 = x2 + x3;
     805  1211791566 :     r2 = x2 - x3;
     806  1211791566 :     t = ( r1 - r3 ) * C54;
     807  1211791566 :     r1 = r1 + r3;
     808  1211791566 :     y00 = x0 + r1;
     809  1211791566 :     r1 = y00 + ( r1 * C55 );
     810  1211791566 :     r3 = r1 - t;
     811  1211791566 :     r1 = r1 + t;
     812  1211791566 :     t = ( r4 + r2 ) * C51;
     813  1211791566 :     r4 = t + ( r4 * C52 );
     814  1211791566 :     r2 = t + ( r2 * C53 );
     815             : 
     816             :     /* imaginary part */
     817  1211791566 :     x0 = im[s * 0];
     818  1211791566 :     x1 = im[s * 16];
     819  1211791566 :     x2 = im[s * 12];
     820  1211791566 :     x3 = im[s * 8];
     821  1211791566 :     x4 = im[s * 4];
     822  1211791566 :     s1 = x1 + x4;
     823  1211791566 :     s4 = x1 - x4;
     824  1211791566 :     s3 = x2 + x3;
     825  1211791566 :     s2 = x2 - x3;
     826  1211791566 :     t = ( s1 - s3 ) * C54;
     827  1211791566 :     s1 = ( s1 + s3 );
     828  1211791566 :     y01 = ( x0 + s1 );
     829  1211791566 :     s1 = y01 + ( s1 * C55 );
     830  1211791566 :     s3 = ( s1 - t );
     831  1211791566 :     s1 = ( s1 + t );
     832  1211791566 :     t = ( s4 + s2 ) * C51;
     833  1211791566 :     s4 = t + ( s4 * C52 );
     834  1211791566 :     s2 = t + ( s2 * C53 );
     835             : 
     836             :     /* combination */
     837  1211791566 :     y08 = ( r1 + s2 );
     838  1211791566 :     y32 = ( r1 - s2 );
     839  1211791566 :     y16 = ( r3 - s4 );
     840  1211791566 :     y24 = ( r3 + s4 );
     841             : 
     842  1211791566 :     y09 = ( s1 - r2 );
     843  1211791566 :     y33 = ( s1 + r2 );
     844  1211791566 :     y17 = ( s3 + r4 );
     845  1211791566 :     y25 = ( s3 - r4 );
     846             : 
     847             :     /* 2. FFT5 stage */
     848             : 
     849             :     /* real part */
     850  1211791566 :     x0 = re[s * 5];
     851  1211791566 :     x1 = re[s * 1];
     852  1211791566 :     x2 = re[s * 17];
     853  1211791566 :     x3 = re[s * 13];
     854  1211791566 :     x4 = re[s * 9];
     855  1211791566 :     r1 = ( x1 + x4 );
     856  1211791566 :     r4 = ( x1 - x4 );
     857  1211791566 :     r3 = ( x2 + x3 );
     858  1211791566 :     r2 = ( x2 - x3 );
     859  1211791566 :     t = ( r1 - r3 ) * C54;
     860  1211791566 :     r1 = ( r1 + r3 );
     861  1211791566 :     y02 = ( x0 + r1 );
     862  1211791566 :     r1 = y02 + ( r1 * C55 );
     863  1211791566 :     r3 = ( r1 - t );
     864  1211791566 :     r1 = ( r1 + t );
     865  1211791566 :     t = ( r4 + r2 ) * C51;
     866  1211791566 :     r4 = t + ( r4 * C52 );
     867  1211791566 :     r2 = t + ( r2 * C53 );
     868             : 
     869             :     /* imaginary part */
     870  1211791566 :     x0 = im[s * 5];
     871  1211791566 :     x1 = im[s * 1];
     872  1211791566 :     x2 = im[s * 17];
     873  1211791566 :     x3 = im[s * 13];
     874  1211791566 :     x4 = im[s * 9];
     875  1211791566 :     s1 = ( x1 + x4 );
     876  1211791566 :     s4 = ( x1 - x4 );
     877  1211791566 :     s3 = ( x2 + x3 );
     878  1211791566 :     s2 = ( x2 - x3 );
     879  1211791566 :     t = ( s1 - s3 ) * C54;
     880  1211791566 :     s1 = ( s1 + s3 );
     881  1211791566 :     y03 = ( x0 + s1 );
     882  1211791566 :     s1 = y03 + ( s1 * C55 );
     883  1211791566 :     s3 = ( s1 - t );
     884  1211791566 :     s1 = ( s1 + t );
     885  1211791566 :     t = ( s4 + s2 ) * C51;
     886  1211791566 :     s4 = t + ( s4 * C52 );
     887  1211791566 :     s2 = t + ( s2 * C53 );
     888             : 
     889             :     /* combination */
     890  1211791566 :     y10 = ( r1 + s2 );
     891  1211791566 :     y34 = ( r1 - s2 );
     892  1211791566 :     y18 = ( r3 - s4 );
     893  1211791566 :     y26 = ( r3 + s4 );
     894             : 
     895  1211791566 :     y11 = ( s1 - r2 );
     896  1211791566 :     y35 = ( s1 + r2 );
     897  1211791566 :     y19 = ( s3 + r4 );
     898  1211791566 :     y27 = ( s3 - r4 );
     899             : 
     900             :     /* 3. FFT5 stage */
     901             : 
     902             :     /* real part */
     903  1211791566 :     x0 = re[s * 10];
     904  1211791566 :     x1 = re[s * 6];
     905  1211791566 :     x2 = re[s * 2];
     906  1211791566 :     x3 = re[s * 18];
     907  1211791566 :     x4 = re[s * 14];
     908  1211791566 :     r1 = ( x1 + x4 );
     909  1211791566 :     r4 = ( x1 - x4 );
     910  1211791566 :     r3 = ( x2 + x3 );
     911  1211791566 :     r2 = ( x2 - x3 );
     912  1211791566 :     t = ( r1 - r3 ) * C54;
     913  1211791566 :     r1 = ( r1 + r3 );
     914  1211791566 :     y04 = ( x0 + r1 );
     915  1211791566 :     r1 = y04 + ( r1 * C55 );
     916  1211791566 :     r3 = ( r1 - t );
     917  1211791566 :     r1 = ( r1 + t );
     918  1211791566 :     t = ( r4 + r2 ) * C51;
     919  1211791566 :     r4 = t + ( r4 * C52 );
     920  1211791566 :     r2 = t + ( r2 * C53 );
     921             : 
     922             :     /* imaginary part */
     923  1211791566 :     x0 = im[s * 10];
     924  1211791566 :     x1 = im[s * 6];
     925  1211791566 :     x2 = im[s * 2];
     926  1211791566 :     x3 = im[s * 18];
     927  1211791566 :     x4 = im[s * 14];
     928  1211791566 :     s1 = ( x1 + x4 );
     929  1211791566 :     s4 = ( x1 - x4 );
     930  1211791566 :     s3 = ( x2 + x3 );
     931  1211791566 :     s2 = ( x2 - x3 );
     932  1211791566 :     t = ( s1 - s3 ) * C54;
     933  1211791566 :     s1 = ( s1 + s3 );
     934  1211791566 :     y05 = ( x0 + s1 );
     935  1211791566 :     s1 = y05 + ( s1 * C55 );
     936  1211791566 :     s3 = ( s1 - t );
     937  1211791566 :     s1 = ( s1 + t );
     938  1211791566 :     t = ( s4 + s2 ) * C51;
     939  1211791566 :     s4 = t + ( s4 * C52 );
     940  1211791566 :     s2 = t + ( s2 * C53 );
     941             : 
     942             :     /* combination */
     943  1211791566 :     y12 = ( r1 + s2 );
     944  1211791566 :     y36 = ( r1 - s2 );
     945  1211791566 :     y20 = ( r3 - s4 );
     946  1211791566 :     y28 = ( r3 + s4 );
     947             : 
     948  1211791566 :     y13 = ( s1 - r2 );
     949  1211791566 :     y37 = ( s1 + r2 );
     950  1211791566 :     y21 = ( s3 + r4 );
     951  1211791566 :     y29 = ( s3 - r4 );
     952             : 
     953             :     /* 4. FFT5 stage */
     954             : 
     955             :     /* real part */
     956  1211791566 :     x0 = re[s * 15];
     957  1211791566 :     x1 = re[s * 11];
     958  1211791566 :     x2 = re[s * 7];
     959  1211791566 :     x3 = re[s * 3];
     960  1211791566 :     x4 = re[s * 19];
     961  1211791566 :     r1 = ( x1 + x4 );
     962  1211791566 :     r4 = ( x1 - x4 );
     963  1211791566 :     r3 = ( x2 + x3 );
     964  1211791566 :     r2 = ( x2 - x3 );
     965  1211791566 :     t = ( r1 - r3 ) * C54;
     966  1211791566 :     r1 = ( r1 + r3 );
     967  1211791566 :     y06 = ( x0 + r1 );
     968  1211791566 :     r1 = y06 + ( r1 * C55 );
     969  1211791566 :     r3 = ( r1 - t );
     970  1211791566 :     r1 = ( r1 + t );
     971  1211791566 :     t = ( r4 + r2 ) * C51;
     972  1211791566 :     r4 = t + ( r4 * C52 );
     973  1211791566 :     r2 = t + ( r2 * C53 );
     974             : 
     975             :     /* imaginary part */
     976  1211791566 :     x0 = im[s * 15];
     977  1211791566 :     x1 = im[s * 11];
     978  1211791566 :     x2 = im[s * 7];
     979  1211791566 :     x3 = im[s * 3];
     980  1211791566 :     x4 = im[s * 19];
     981  1211791566 :     s1 = ( x1 + x4 );
     982  1211791566 :     s4 = ( x1 - x4 );
     983  1211791566 :     s3 = ( x2 + x3 );
     984  1211791566 :     s2 = ( x2 - x3 );
     985  1211791566 :     t = ( s1 - s3 ) * C54;
     986  1211791566 :     s1 = ( s1 + s3 );
     987  1211791566 :     y07 = ( x0 + s1 );
     988  1211791566 :     s1 = y07 + ( s1 * C55 );
     989  1211791566 :     s3 = ( s1 - t );
     990  1211791566 :     s1 = ( s1 + t );
     991  1211791566 :     t = ( s4 + s2 ) * C51;
     992  1211791566 :     s4 = t + ( s4 * C52 );
     993  1211791566 :     s2 = t + ( s2 * C53 );
     994             : 
     995             :     /* combination */
     996  1211791566 :     y14 = ( r1 + s2 );
     997  1211791566 :     y38 = ( r1 - s2 );
     998  1211791566 :     y22 = ( r3 - s4 );
     999  1211791566 :     y30 = ( r3 + s4 );
    1000             : 
    1001  1211791566 :     y15 = ( s1 - r2 );
    1002  1211791566 :     y39 = ( s1 + r2 );
    1003  1211791566 :     y23 = ( s3 + r4 );
    1004  1211791566 :     y31 = ( s3 - r4 );
    1005             : 
    1006             : 
    1007             :     /* 1. FFT4 stage */
    1008             : 
    1009             :     /* Pre-additions */
    1010  1211791566 :     t0 = ( y00 + y04 );
    1011  1211791566 :     t2 = ( y00 - y04 );
    1012  1211791566 :     t1 = ( y01 + y05 );
    1013  1211791566 :     t3 = ( y01 - y05 );
    1014  1211791566 :     t4 = ( y02 + y06 );
    1015  1211791566 :     t7 = ( y02 - y06 );
    1016  1211791566 :     t5 = ( y07 + y03 );
    1017  1211791566 :     t6 = ( y07 - y03 );
    1018             : 
    1019             :     /* Post-additions */
    1020  1211791566 :     re[s * 0] = ( t0 + t4 );
    1021  1211791566 :     im[s * 0] = ( t1 + t5 );
    1022  1211791566 :     re[s * 5] = ( t2 - t6 );
    1023  1211791566 :     im[s * 5] = ( t3 - t7 );
    1024  1211791566 :     re[s * 10] = ( t0 - t4 );
    1025  1211791566 :     im[s * 10] = ( t1 - t5 );
    1026  1211791566 :     re[s * 15] = ( t2 + t6 );
    1027  1211791566 :     im[s * 15] = ( t3 + t7 );
    1028             : 
    1029             :     /* 2. FFT4 stage */
    1030             : 
    1031             :     /* Pre-additions */
    1032  1211791566 :     t0 = ( y08 + y12 );
    1033  1211791566 :     t2 = ( y08 - y12 );
    1034  1211791566 :     t1 = ( y09 + y13 );
    1035  1211791566 :     t3 = ( y09 - y13 );
    1036  1211791566 :     t4 = ( y10 + y14 );
    1037  1211791566 :     t7 = ( y10 - y14 );
    1038  1211791566 :     t5 = ( y15 + y11 );
    1039  1211791566 :     t6 = ( y15 - y11 );
    1040             : 
    1041             :     /* Post-additions */
    1042  1211791566 :     re[s * 4] = ( t0 + t4 );
    1043  1211791566 :     im[s * 4] = ( t1 + t5 );
    1044  1211791566 :     re[s * 9] = ( t2 - t6 );
    1045  1211791566 :     im[s * 9] = ( t3 - t7 );
    1046  1211791566 :     re[s * 14] = ( t0 - t4 );
    1047  1211791566 :     im[s * 14] = ( t1 - t5 );
    1048  1211791566 :     re[s * 19] = ( t2 + t6 );
    1049  1211791566 :     im[s * 19] = ( t3 + t7 );
    1050             : 
    1051             : 
    1052             :     /* 3. FFT4 stage */
    1053             : 
    1054             :     /* Pre-additions */
    1055  1211791566 :     t0 = ( y16 + y20 );
    1056  1211791566 :     t2 = ( y16 - y20 );
    1057  1211791566 :     t1 = ( y17 + y21 );
    1058  1211791566 :     t3 = ( y17 - y21 );
    1059  1211791566 :     t4 = ( y18 + y22 );
    1060  1211791566 :     t7 = ( y18 - y22 );
    1061  1211791566 :     t5 = ( y23 + y19 );
    1062  1211791566 :     t6 = ( y23 - y19 );
    1063             : 
    1064             :     /* Post-additions */
    1065  1211791566 :     re[s * 8] = ( t0 + t4 );
    1066  1211791566 :     im[s * 8] = ( t1 + t5 );
    1067  1211791566 :     re[s * 13] = ( t2 - t6 );
    1068  1211791566 :     im[s * 13] = ( t3 - t7 );
    1069  1211791566 :     re[s * 18] = ( t0 - t4 );
    1070  1211791566 :     im[s * 18] = ( t1 - t5 );
    1071  1211791566 :     re[s * 3] = ( t2 + t6 );
    1072  1211791566 :     im[s * 3] = ( t3 + t7 );
    1073             : 
    1074             :     /* 4. FFT4 stage */
    1075             : 
    1076             :     /* Pre-additions */
    1077  1211791566 :     t0 = ( y24 + y28 );
    1078  1211791566 :     t2 = ( y24 - y28 );
    1079  1211791566 :     t1 = ( y25 + y29 );
    1080  1211791566 :     t3 = ( y25 - y29 );
    1081  1211791566 :     t4 = ( y26 + y30 );
    1082  1211791566 :     t7 = ( y26 - y30 );
    1083  1211791566 :     t5 = ( y31 + y27 );
    1084  1211791566 :     t6 = ( y31 - y27 );
    1085             : 
    1086             :     /* Post-additions */
    1087  1211791566 :     re[s * 12] = ( t0 + t4 );
    1088  1211791566 :     im[s * 12] = ( t1 + t5 );
    1089  1211791566 :     re[s * 17] = ( t2 - t6 );
    1090  1211791566 :     im[s * 17] = ( t3 - t7 );
    1091  1211791566 :     re[s * 2] = ( t0 - t4 );
    1092  1211791566 :     im[s * 2] = ( t1 - t5 );
    1093  1211791566 :     re[s * 7] = ( t2 + t6 );
    1094  1211791566 :     im[s * 7] = ( t3 + t7 );
    1095             : 
    1096             :     /* 5. FFT4 stage */
    1097             : 
    1098             :     /* Pre-additions */
    1099  1211791566 :     t0 = ( y32 + y36 );
    1100  1211791566 :     t2 = ( y32 - y36 );
    1101  1211791566 :     t1 = ( y33 + y37 );
    1102  1211791566 :     t3 = ( y33 - y37 );
    1103  1211791566 :     t4 = ( y34 + y38 );
    1104  1211791566 :     t7 = ( y34 - y38 );
    1105  1211791566 :     t5 = ( y39 + y35 );
    1106  1211791566 :     t6 = ( y39 - y35 );
    1107             : 
    1108             :     /* Post-additions */
    1109  1211791566 :     re[s * 16] = ( t0 + t4 );
    1110  1211791566 :     im[s * 16] = ( t1 + t5 );
    1111  1211791566 :     re[s * 1] = ( t2 - t6 );
    1112  1211791566 :     im[s * 1] = ( t3 - t7 );
    1113  1211791566 :     re[s * 6] = ( t0 - t4 );
    1114  1211791566 :     im[s * 6] = ( t1 - t5 );
    1115  1211791566 :     re[s * 11] = ( t2 + t6 );
    1116  1211791566 :     im[s * 11] = ( t3 + t7 );
    1117             : 
    1118  1211791566 :     return;
    1119             : }
    1120             : 
    1121             : /*******************************************************************************
    1122             :  Functionname:  fft30
    1123             :  *******************************************************************************
    1124             : 
    1125             :  Description:   30-point FFT.
    1126             : 
    1127             :  Arguments:     in - pointer to data (interleaved real / imaginary parts)
    1128             : 
    1129             :  Return:        none
    1130             : 
    1131             : *******************************************************************************/
    1132             : 
    1133  2160576750 : static void fft30( float *restrict in )
    1134             : {
    1135             :     int16_t i;
    1136             :     float temp[60];
    1137  2160576750 :     float *temp_l = temp;
    1138  2160576750 :     float *temp_lu = temp + 2 * 8;
    1139  2160576750 :     float *temp_h = temp + 2 * 15;
    1140  2160576750 :     float *temp_hu = temp + 2 * 15 + 2 * 8;
    1141  2160576750 :     float *in_l = in + 2 * 0;
    1142  2160576750 :     float *in_h = in + 2 * 15;
    1143 17284614000 :     for ( i = 0; i < 7; i++ )
    1144             :     {
    1145 15124037250 :         *temp_l++ = *in_l++;
    1146 15124037250 :         *temp_l++ = *in_l++;
    1147 15124037250 :         *temp_h++ = *in_h++;
    1148 15124037250 :         *temp_h++ = *in_h++;
    1149 15124037250 :         *temp_l++ = *in_h++;
    1150 15124037250 :         *temp_l++ = *in_h++;
    1151 15124037250 :         *temp_h++ = *in_l++;
    1152 15124037250 :         *temp_h++ = *in_l++;
    1153             :     }
    1154  2160576750 :     *temp_l++ = *in_l++;
    1155  2160576750 :     *temp_l++ = *in_l++;
    1156  2160576750 :     *temp_h++ = *in_h++;
    1157  2160576750 :     *temp_h++ = *in_h++;
    1158  2160576750 :     temp_l = temp;
    1159  2160576750 :     temp_h = temp + 30;
    1160  2160576750 :     fft15( temp_l );
    1161  2160576750 :     fft15( temp_h );
    1162             : 
    1163  2160576750 :     in_l = in + 2 * 0;
    1164  2160576750 :     in_h = in + 2 * 15;
    1165 17284614000 :     for ( i = 0; i < 7; i++ )
    1166             :     {
    1167 15124037250 :         *in_l++ = *temp_l + *temp_h;
    1168 15124037250 :         *in_h++ = *temp_l++ - *temp_h++;
    1169 15124037250 :         *in_l++ = *temp_l + *temp_h;
    1170 15124037250 :         *in_h++ = *temp_l++ - *temp_h++;
    1171             : 
    1172 15124037250 :         *in_h++ = *temp_lu + *temp_hu;
    1173 15124037250 :         *in_l++ = *temp_lu++ - *temp_hu++;
    1174 15124037250 :         *in_h++ = *temp_lu + *temp_hu;
    1175 15124037250 :         *in_l++ = *temp_lu++ - *temp_hu++;
    1176             :     }
    1177  2160576750 :     *in_l++ = *temp_l + *temp_h;
    1178  2160576750 :     *in_h++ = *temp_l++ - *temp_h++;
    1179  2160576750 :     *in_l++ = *temp_l + *temp_h;
    1180  2160576750 :     *in_h++ = *temp_l++ - *temp_h++;
    1181             : 
    1182  2160576750 :     return;
    1183             : }
    1184             : 
    1185             : /*-------------------------------------------------------------------*
    1186             :  * fft_cldfb()
    1187             :  *
    1188             :  * Interface functions FFT subroutines
    1189             :  *--------------------------------------------------------------------*/
    1190  4519951344 : void fft_cldfb(
    1191             :     float *data,       /* i/o: input/output vector */
    1192             :     const int16_t size /* size of fft operation */
    1193             : )
    1194             : {
    1195             : 
    1196  4519951344 :     switch ( size )
    1197             :     {
    1198      456124 :         case 5:
    1199      456124 :             fft5s( data, 2 );
    1200      456124 :             break;
    1201   156126298 :         case 8:
    1202   156126298 :             fft8( data );
    1203   156126298 :             break;
    1204   990752510 :         case 10:
    1205   990752510 :             fft10( data );
    1206   990752510 :             break;
    1207      248096 :         case 16:
    1208      248096 :             fft16( data );
    1209      248096 :             break;
    1210  1211791566 :         case 20:
    1211  1211791566 :             fft20( data );
    1212  1211791566 :             break;
    1213  2160576750 :         case 30:
    1214  2160576750 :             fft30( data );
    1215  2160576750 :             break;
    1216             : 
    1217           0 :         default:
    1218           0 :             assert( 0 );
    1219             :             break;
    1220             :     }
    1221             : 
    1222  4519951344 :     return;
    1223             : }

Generated by: LCOV version 1.14