LCOV - code coverage report
Current view: top level - lib_com - fft_cldfb.c (source / functions) Hit Total Coverage
Test: Coverage on main -- short test vectors @ 6c9ddc4024a9c0e1ecb8f643f114a84a0e26ec6b Lines: 794 835 95.1 %
Date: 2025-05-23 08:37:30 Functions: 7 8 87.5 %

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

Generated by: LCOV version 1.14