LCOV - code coverage report
Current view: top level - lib_com - cldfb_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 574a190e3c6896c6c4ed10d7f23649709a0c4347 Lines: 940 1317 71.4 %
Date: 2025-06-27 02:59:36 Functions: 16 17 94.1 %

          Line data    Source code
       1             : /******************************************************************************************************
       2             : 
       3             :    (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
       4             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
       5             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
       6             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
       7             :    contributors to this repository. All Rights Reserved.
       8             : 
       9             :    This software is protected by copyright law and by international treaties.
      10             :    The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
      11             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
      12             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
      13             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
      14             :    contributors to this repository retain full ownership rights in their respective contributions in
      15             :    the software. This notice grants no license of any kind, including but not limited to patent
      16             :    license, nor is any license granted by implication, estoppel or otherwise.
      17             : 
      18             :    Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
      19             :    contributions.
      20             : 
      21             :    This software is provided "AS IS", without any express or implied warranties. The software is in the
      22             :    development stage. It is intended exclusively for experts who have experience with such software and
      23             :    solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
      24             :    and fitness for a particular purpose are hereby disclaimed and excluded.
      25             : 
      26             :    Any dispute, controversy or claim arising under or in relation to providing this software shall be
      27             :    submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
      28             :    accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
      29             :    the United Nations Convention on Contracts on the International Sales of Goods.
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : /*====================================================================================
      34             :     EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
      35             :   ====================================================================================*/
      36             : 
      37             : #include <assert.h>
      38             : #include <stdint.h>
      39             : #include "options.h"
      40             : #include <math.h>
      41             : #include "stat_dec.h"
      42             : #include "prot_fx.h"
      43             : #include "rom_com.h"
      44             : #include "rom_com_fx.h"
      45             : #include "wmc_auto.h"
      46             : #if __STDC_VERSION__ >= 199901L
      47             : #if defined __ICL
      48             : #define restrict __restrict
      49             : #endif
      50             : #else
      51             : #define restrict
      52             : #endif
      53             : 
      54             : 
      55             : /*-------------------------------------------------------------------*
      56             :  * Local prototypes
      57             :  *--------------------------------------------------------------------*/
      58             : 
      59             : static void cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs );
      60             : 
      61             : static void cldfb_init_proto_and_twiddles_enc_fx( HANDLE_CLDFB_FILTER_BANK hs );
      62             : 
      63             : static void GetEnergyCldfb_ivas_fx( Word32 *energyLookahead,     /*!< o: Q(*sf_energyLookahead) |   pointer to the result in the core look-ahead slot */
      64             :                                     Word16 *sf_energyLookahead,  /*!< o:         pointer to the scalefactor of the result in the core look-ahead slot  */
      65             :                                     const Word16 numLookahead,   /*!< i: Q0      the number of look-ahead time-slots */
      66             :                                     Word16 **realValues,         /*!< i: Q(sf_Values) |   the real part of the CLDFB subsamples */
      67             :                                     Word16 **imagValues,         /*!< i: Q(sf_Values) |   the imaginary part of the CLDFB subsamples */
      68             :                                     Word16 sf_Values,            /*!< i:         scalefactor of the CLDFB subcamples - apply as a negated Exponent */
      69             :                                     Word16 numberBands,          /*!< i: Q0  |   number of CLDFB bands */
      70             :                                     Word16 numberCols,           /*!< i: Q0  |   number of CLDFB subsamples */
      71             :                                     Word32 *energyHF,            /*!< o: Q31 |   pointer to HF energy */
      72             :                                     Word16 *energyHF_Exp,        /*!< o:         pointer to exponent of HF energy */
      73             :                                     Word32 *energyValuesSum,     /*!< o: Q(2*sf_Values-4) |   pointer to sum array of energy values, not initialized*/
      74             :                                     Word16 *energyValuesSum_Exp, /*!< o:         pointer to exponents of energyValuesSum, not initialized */
      75             :                                     TEC_ENC_HANDLE hTecEnc );
      76             : 
      77             : /*-------------------------------------------------------------------*
      78             :  * cplxMult()
      79             :  *
      80             :  * Conduct complex multiplication
      81             :  *--------------------------------------------------------------------*/
      82             : 
      83             : /*-------------------------------------------------------------------*
      84             :  * cldfbAnalysis_ivas()
      85             :  *
      86             :  * Conduct multiple overlap complex low delay MDCT
      87             :  *--------------------------------------------------------------------*/
      88      732050 : void cldfbAnalysis_ivas_fx(
      89             :     const Word32 *timeIn_fx,         /* i  : time buffer         Qx    */
      90             :     Word32 **realBuffer_fx,          /* o  : real value buffer   Qx - 5*/
      91             :     Word32 **imagBuffer_fx,          /* o  : imag value buffer   QX - 5*/
      92             :     const Word16 samplesToProcess,   /* i  : samples to process        */
      93             :     HANDLE_CLDFB_FILTER_BANK h_cldfb /* i  : filterbank state          */
      94             : )
      95             : {
      96             :     Word16 i, k;
      97             :     Word16 L2, M1, M2, M4;
      98      732050 :     Word16 no_col = h_cldfb->no_col;
      99      732050 :     move16();
     100             : 
     101             :     Word32 r1_fx, r2_fx, rr12_fx, ir12_fx;
     102             :     Word32 i1_fx, i2_fx, ri12_fx, ii12_fx;
     103             :     Word32 rBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
     104             :     Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
     105             :     const Word32 *rot_vctr_re_fx;
     106             :     const Word32 *rot_vctr_im_fx;
     107             : #ifdef OPT_IVAS_FILTER_ROM
     108             :     const Word32 *ptr_pf_fx;
     109             : #else  /* OPT_IVAS_FILTER_ROM */
     110             :     const Word16 *ptr_pf_fx;
     111             :     Word16 ptr_pf_sf;
     112             : #endif /* OPT_IVAS_FILTER_ROM */
     113             :     Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )];
     114             :     Word16 offset, frameSize;
     115             : 
     116      732050 :     offset = sub( h_cldfb->p_filter_length, h_cldfb->no_channels );
     117      732050 :     frameSize = i_mult( h_cldfb->no_channels, h_cldfb->no_col );
     118             : 
     119      732050 :     assert( h_cldfb->prototype == CLDFB_PROTOTYPE_1_25MS );
     120             :     /* prepare input buffer */
     121      732050 :     timeBuffer_fx = buffer_fx;
     122      732050 :     Copy32( h_cldfb->cldfb_state_fx, timeBuffer_fx, offset );
     123             : 
     124      732050 :     IF( GT_16( samplesToProcess, -1 ) )
     125             :     {
     126      482872 :         Copy32( timeIn_fx, timeBuffer_fx + offset, samplesToProcess );
     127      482872 :         set32_fx( timeBuffer_fx + add( offset, samplesToProcess ), 0, sub( frameSize, samplesToProcess ) );
     128             :     }
     129             :     ELSE
     130             :     {
     131      249178 :         Copy32( timeIn_fx, timeBuffer_fx + offset, frameSize );
     132             :     }
     133             : 
     134             :     /* only process needed cols */
     135      732050 :     IF( GT_16( samplesToProcess, -1 ) )
     136             :     {
     137      482872 :         no_col = s_min( no_col, div_l( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), shr( h_cldfb->no_channels, 1 ) ) );
     138             :     }
     139             : 
     140      732050 :     M1 = h_cldfb->no_channels;
     141      732050 :     move16();
     142      732050 :     M2 = shr( M1, 1 );
     143      732050 :     M4 = shr( M1, 2 );
     144      732050 :     L2 = shl( M1, 1 );
     145             : 
     146      732050 :     if ( s_and( M2, 1 ) )
     147             :     {
     148           0 :         M4 = add( M4, 1 );
     149             :     }
     150             : 
     151      732050 :     rot_vctr_re_fx = h_cldfb->rot_vec_ana_re_fx;
     152      732050 :     rot_vctr_im_fx = h_cldfb->rot_vec_ana_im_fx;
     153             : 
     154             : #ifdef OPT_IVAS_FILTER_ROM
     155      732050 :     ptr_pf_fx = h_cldfb->p_filter_32;
     156             : #else  /* OPT_IVAS_FILTER_ROM */
     157             :     ptr_pf_fx = h_cldfb->p_filter;
     158             :     ptr_pf_sf = h_cldfb->p_filter_sf;                                                                                                          // Q14
     159             : #endif /* OPT_IVAS_FILTER_ROM */
     160      732050 :     move16();
     161             : 
     162    11823861 :     FOR( i = 0; i < no_col; i++ )
     163             :     {
     164   121417235 :         FOR( k = 0; k < M4; k++ )
     165             :         {
     166             :             /* prototype filter */
     167             : #ifdef OPT_IVAS_FILTER_ROM
     168   110325424 :             r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // Qx
     169   110325424 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx
     170   110325424 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx
     171   110325424 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx
     172   110325424 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx
     173             : 
     174   110325424 :             r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] );     // Qx
     175   110325424 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // Qx
     176   110325424 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // Qx
     177   110325424 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // Qx
     178   110325424 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // Qx
     179             : 
     180   110325424 :             i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] );     // Qx
     181   110325424 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx
     182   110325424 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx
     183   110325424 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx
     184   110325424 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx
     185             : 
     186   110325424 :             i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // Qx
     187   110325424 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx
     188   110325424 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx
     189   110325424 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx
     190   110325424 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx
     191             : 
     192             : #else  /* OPT_IVAS_FILTER_ROM */
     193             :             r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // Qx
     194             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx
     195             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx
     196             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx
     197             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx
     198             : 
     199             :             r2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] );     // Qx
     200             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // Qx
     201             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // Qx
     202             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // Qx
     203             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // Qx
     204             : 
     205             :             i1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] );     // Qx
     206             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx
     207             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx
     208             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx
     209             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx
     210             : 
     211             :             i2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // Qx
     212             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx
     213             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx
     214             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx
     215             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx
     216             : 
     217             :             r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf );                                                                                           // Qx - 1
     218             :             r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf );                                                                                           // Qx - 1
     219             :             i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf );                                                                                           // Qx - 1
     220             :             i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf );                                                                                           // Qx - 1
     221             : #endif /* OPT_IVAS_FILTER_ROM */
     222             : 
     223             :             /* folding + pre modulation of DST IV */
     224   110325424 :             rr12_fx = L_sub( r1_fx, r2_fx );             // Qx - 1
     225   110325424 :             ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // Qx - 1
     226             :             // cplxMult( &rBuffer_fx[2 * k], &rBuffer_fx[2 * k + 1], rr12_fx, ri12_fx, rot_vctr_re_fx[k], rot_vctr_im_fx[k] );
     227   110325424 :             rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // Qx - 3
     228   110325424 :             move32();
     229   110325424 :             rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // Qx - 3
     230   110325424 :             move32();
     231             : 
     232             :             /* folding + pre modulation of DCT IV */
     233   110325424 :             ir12_fx = L_add( r1_fx, r2_fx ); // Qx - 1
     234   110325424 :             ii12_fx = L_sub( i1_fx, i2_fx ); // Qx - 1
     235             :             // cplxMult( &iBuffer_fx[2 * k], &iBuffer_fx[2 * k + 1], ir12_fx, ii12_fx, rot_vctr_re_fx[k], rot_vctr_im_fx[k] );
     236   110325424 :             iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // Qx - 3
     237   110325424 :             move32();
     238   110325424 :             iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // Qx - 3
     239   110325424 :             move32();
     240             :         }
     241             : 
     242   121417235 :         FOR( k = M4; k < M2; k++ )
     243             :         {
     244             :             /* prototype filter */
     245             : #ifdef OPT_IVAS_FILTER_ROM
     246   110325424 :             r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // Qx
     247   110325424 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx
     248   110325424 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx
     249   110325424 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx
     250   110325424 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx
     251             : 
     252   110325424 :             r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] );     // Qx
     253   110325424 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx
     254   110325424 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx
     255   110325424 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx
     256   110325424 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx
     257             : 
     258   110325424 :             i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // Qx
     259   110325424 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx
     260   110325424 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx
     261   110325424 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx
     262   110325424 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx
     263             : 
     264   110325424 :             i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] );     // Qx
     265   110325424 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx
     266   110325424 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx
     267   110325424 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx
     268   110325424 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx
     269             : #else                                                                                                                                          /* OPT_IVAS_FILTER_ROM */
     270             :             r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // Qx
     271             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx
     272             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx
     273             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx
     274             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx
     275             : 
     276             :             r2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] );     // Qx
     277             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx
     278             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx
     279             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx
     280             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx
     281             : 
     282             :             i1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // Qx
     283             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx
     284             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx
     285             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx
     286             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx
     287             : 
     288             :             i2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] );     // Qx
     289             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx
     290             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx
     291             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx
     292             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx
     293             : 
     294             :             r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // Qx - 1
     295             :             r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // Qx - 1
     296             :             i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // Qx - 1
     297             :             i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // Qx - 1
     298             : #endif                                                                                                                                         /* OPT_IVAS_FILTER_ROM */
     299             : 
     300             :             /* folding + pre modulation of DST IV */
     301   110325424 :             rr12_fx = L_add( r1_fx, r2_fx ); // Qx - 1
     302   110325424 :             ri12_fx = L_sub( i1_fx, i2_fx ); // Qx - 1
     303             :             // cplxMult( &rBuffer_fx[2 * k], &rBuffer[2 * k + 1], rr12, ri12, rot_vctr_re[k], rot_vctr_im[k] );
     304   110325424 :             rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // Qx - 3
     305   110325424 :             move32();
     306   110325424 :             rBuffer_fx[( 2 * k ) + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // Qx - 3
     307   110325424 :             move32();
     308             : 
     309             :             /* folding + pre modulation of DCT IV */
     310   110325424 :             ir12_fx = L_sub( r1_fx, r2_fx ); // Qx - 1
     311   110325424 :             ii12_fx = L_add( i1_fx, i2_fx ); // Qx - 1
     312             :             // cplxMult( &iBuffer[2 * k], &iBuffer[2 * k + 1], ir12, ii12, rot_vctr_re[k], rot_vctr_im[k] );
     313   110325424 :             iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // Qx - 3
     314   110325424 :             move32();
     315   110325424 :             iBuffer_fx[( 2 * k ) + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // Qx - 3
     316   110325424 :             move32();
     317             :         }
     318             : 
     319             :         /* FFT of DST IV */
     320    11091811 :         fft_cldfb_fx( rBuffer_fx, M2 );
     321             : 
     322             : 
     323             :         /* post modulation of DST IV */
     324   231742659 :         FOR( k = 0; k < M2; k++ )
     325             :         {
     326             :             // cplxMult( &realBuffer[i][M1 - 1 - ( 2 * k )], &realBuffer[i][2 * k], rBuffer[2 * k], rBuffer[2 * k + 1], rot_vctr_re[k], rot_vctr_im[k] );
     327   220650848 :             realBuffer_fx[i][( M1 - 1 ) - ( k * 2 )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // Qx - 5
     328   220650848 :             move32();
     329   220650848 :             realBuffer_fx[i][2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // Qx - 5
     330   220650848 :             move32();
     331             :         }
     332             : 
     333             :         /* FFT of DCT IV */
     334    11091811 :         fft_cldfb_fx( iBuffer_fx, M2 );
     335             : 
     336             : 
     337             :         /* post modulation of DCT IV */
     338   231742659 :         FOR( k = 0; k < M2; k++ )
     339             :         {
     340             :             /* do it inplace */
     341             :             // cplxMult( &imagBuffer[i][2 * k], &imagBuffer[i][M1 - 1 - ( 2 * k )], iBuffer[2 * k], iBuffer[2 * k + 1], rot_vctr_re[k], rot_vctr_im[k] );
     342   220650848 :             imagBuffer_fx[i][2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[( 2 * k + 1 )], rot_vctr_im_fx[k] ); // QX - 5
     343   220650848 :             move32();
     344   220650848 :             imagBuffer_fx[i][( ( M1 - 1 ) - ( k * 2 ) )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // Qx - 5
     345   220650848 :             move32();
     346             :         }
     347             : 
     348    11091811 :         timeBuffer_fx += i_mult( L2, 5 );
     349    11091811 :         timeBuffer_fx += sub( h_cldfb->no_channels, h_cldfb->p_filter_length );
     350             :     }
     351             : 
     352             :     /* update memory */
     353      732050 :     Copy32( buffer_fx + frameSize, h_cldfb->cldfb_state_fx, offset );
     354             : 
     355      732050 :     return;
     356             : }
     357             : 
     358             : /*-------------------------------------------------------------------*
     359             :  * cldfbAnalysis_ts_ivas()
     360             :  *
     361             :  *
     362             :  *--------------------------------------------------------------------*/
     363           0 : void cldfbAnalysis_ts_fx(
     364             :     const Word32 *timeIn_fx,
     365             :     /* i  : time buffer         */ // q
     366             :     Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX],
     367             :     /* o  : real value buffer   */ // q - 5
     368             :     Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX],
     369             :     /* o  : imag value buffer   */    // q - 5
     370             :     const Word16 samplesToProcess,    /* i  : samples to process  */
     371             :     HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i  : filterbank state    */
     372             :     Word16 *q_cldfb )
     373             : {
     374             :     Word16 i, k;
     375             :     Word16 L2, M1, M2, M4;
     376           0 :     Word16 no_col = h_cldfb->no_col;
     377           0 :     move16();
     378             : 
     379             :     Word32 r1_fx, r2_fx, rr12_fx, ir12_fx;
     380             :     Word32 i1_fx, i2_fx, ri12_fx, ii12_fx;
     381             :     Word32 rBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
     382             :     Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
     383             :     const Word32 *rot_vctr_re_fx;
     384             :     const Word32 *rot_vctr_im_fx;
     385             :     const Word32 *rot_vctr_delay_re_fx;
     386             :     const Word32 *rot_vctr_delay_im_fx;
     387             : #ifdef OPT_IVAS_FILTER_ROM
     388             :     const Word32 *ptr_pf_fx;
     389             : #else  /* OPT_IVAS_FILTER_ROM */
     390             :     const Word16 *ptr_pf_fx;
     391             :     Word16 ptr_pf_sf;
     392             : #endif /* OPT_IVAS_FILTER_ROM */
     393             :     Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )];
     394             :     Word16 offset, frameSize;
     395             : 
     396           0 :     offset = sub( h_cldfb->p_filter_length, h_cldfb->no_channels );
     397           0 :     frameSize = i_mult( h_cldfb->no_channels, h_cldfb->no_col );
     398             : 
     399             :     /* prepare input buffer */
     400           0 :     timeBuffer_fx = buffer_fx;
     401           0 :     Copy32( h_cldfb->cldfb_state_fx, timeBuffer_fx, offset );
     402             : 
     403           0 :     IF( GT_16( samplesToProcess, -1 ) )
     404             :     {
     405           0 :         Copy32( timeIn_fx, timeBuffer_fx + offset, samplesToProcess );
     406           0 :         set32_fx( timeBuffer_fx + add( offset, samplesToProcess ), 0, sub( frameSize, samplesToProcess ) );
     407             :     }
     408             :     ELSE
     409             :     {
     410           0 :         Copy32( timeIn_fx, timeBuffer_fx + offset, frameSize );
     411             :     }
     412             : 
     413           0 :     h_cldfb->Q_cldfb_state = *q_cldfb;
     414           0 :     move16();
     415             : 
     416             :     /* only process needed cols */
     417           0 :     IF( GT_16( samplesToProcess, -1 ) )
     418             :     {
     419           0 :         no_col = s_min( no_col, idiv1616( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), h_cldfb->no_channels ) );
     420           0 :         assert( no_col == 1 );
     421             :     }
     422             : 
     423           0 :     M1 = h_cldfb->no_channels;
     424           0 :     move16();
     425           0 :     M2 = shr( M1, 1 );
     426           0 :     M4 = shr( M1, 2 );
     427           0 :     L2 = shl( M1, 1 );
     428             : 
     429           0 :     if ( s_and( M2, 1 ) )
     430             :     {
     431           0 :         M4 = add( M4, 1 );
     432             :     }
     433             : 
     434           0 :     rot_vctr_re_fx = h_cldfb->rot_vec_ana_re_fx;             // q = 29
     435           0 :     rot_vctr_im_fx = h_cldfb->rot_vec_ana_im_fx;             // q = 29
     436           0 :     rot_vctr_delay_re_fx = h_cldfb->rot_vec_ana_delay_re_fx; // q = 31
     437           0 :     rot_vctr_delay_im_fx = h_cldfb->rot_vec_ana_delay_im_fx; // q = 31
     438             : 
     439             : #ifdef OPT_IVAS_FILTER_ROM
     440           0 :     ptr_pf_fx = h_cldfb->p_filter_32;
     441             : #else  /* OPT_IVAS_FILTER_ROM */
     442             :     ptr_pf_fx = h_cldfb->p_filter;
     443             :     ptr_pf_sf = h_cldfb->p_filter_sf;                                                                                                          // Q14
     444             : #endif /* OPT_IVAS_FILTER_ROM */
     445           0 :     move16();
     446             : 
     447           0 :     FOR( i = 0; i < no_col; i++ )
     448             :     {
     449           0 :         FOR( k = 0; k < M4; k++ )
     450             :         {
     451             :             /* prototype filter */
     452             : #ifdef OPT_IVAS_FILTER_ROM
     453           0 :             r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2] );         // q
     454           0 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
     455           0 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
     456           0 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
     457           0 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
     458             : 
     459           0 :             r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] );     // q
     460           0 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q
     461           0 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q
     462           0 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q
     463           0 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q
     464             : 
     465           0 :             i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
     466           0 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
     467           0 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
     468           0 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
     469           0 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
     470             : 
     471           0 :             i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
     472           0 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
     473           0 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
     474           0 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
     475           0 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
     476             : #else                                                                                                                                                  /* OPT_IVAS_FILTER_ROM */
     477             :             r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2] );         // q
     478             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
     479             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
     480             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
     481             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
     482             : 
     483             :             r2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] );     // q
     484             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q
     485             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q
     486             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q
     487             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q
     488             : 
     489             :             i1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
     490             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
     491             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
     492             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
     493             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
     494             : 
     495             :             i2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
     496             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
     497             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
     498             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
     499             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
     500             : 
     501             :             r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf );                                                                                           // q - 1
     502             :             r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf );                                                                                           // q - 1
     503             :             i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf );                                                                                           // q - 1
     504             :             i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf );                                                                                           // q - 1
     505             : #endif                                                                                                                                                 /* OPT_IVAS_FILTER_ROM */
     506             : 
     507             :             /* folding + pre modulation of DST IV */
     508           0 :             rr12_fx = L_sub( r1_fx, r2_fx );                                                                           // q -1
     509           0 :             ri12_fx = L_negate( L_add( i1_fx, i2_fx ) );                                                               // q - 1
     510             :                                                                                                                        /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
     511           0 :             rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] );     // q - 3
     512           0 :             rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3
     513           0 :             move32();
     514           0 :             move32();
     515             : 
     516             :             ///* folding + pre modulation of DCT IV */
     517           0 :             ir12_fx = L_add( r1_fx, r2_fx );                                                                           // q - 1
     518           0 :             ii12_fx = L_sub( i1_fx, i2_fx );                                                                           // q - 1
     519             :                                                                                                                        /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
     520           0 :             iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] );     // q - 3
     521           0 :             iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3
     522           0 :             move32();
     523           0 :             move32();
     524             :         }
     525             : 
     526           0 :         FOR( k = M4; k < M2; k++ )
     527             :         {
     528             :             /* prototype filter */
     529             : #ifdef OPT_IVAS_FILTER_ROM
     530           0 :             r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
     531           0 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
     532           0 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
     533           0 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
     534           0 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
     535             : 
     536           0 :             r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
     537           0 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
     538           0 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
     539           0 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
     540           0 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
     541             : 
     542           0 :             i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
     543           0 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
     544           0 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
     545           0 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
     546           0 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
     547             : 
     548           0 :             i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
     549           0 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
     550           0 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
     551           0 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
     552           0 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
     553             : #else                                                                                                                                          /* OPT_IVAS_FILTER_ROM */
     554             :             r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
     555             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
     556             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
     557             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
     558             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
     559             : 
     560             :             r2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
     561             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
     562             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
     563             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
     564             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
     565             : 
     566             :             i1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
     567             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
     568             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
     569             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
     570             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
     571             : 
     572             :             i2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
     573             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
     574             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
     575             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
     576             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
     577             : 
     578             :             r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1
     579             :             r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1
     580             :             i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1
     581             :             i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1
     582             : #endif                                                                                                                                         /* OPT_IVAS_FILTER_ROM */
     583             : 
     584             :             /* folding + pre modulation of DST IV */
     585           0 :             rr12_fx = L_add( r1_fx, r2_fx );                                                                           // q - 1
     586           0 :             ri12_fx = L_sub( i1_fx, i2_fx );                                                                           // q - 1
     587             :                                                                                                                        /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
     588           0 :             rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] );     // q - 3
     589           0 :             rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3
     590           0 :             move32();
     591           0 :             move32();
     592             : 
     593             :             /* folding + pre modulation of DCT IV */
     594           0 :             ir12_fx = L_sub( r1_fx, r2_fx );                                                                           // q - 1
     595           0 :             ii12_fx = L_add( i1_fx, i2_fx );                                                                           // q - 1
     596             :                                                                                                                        /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
     597           0 :             iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] );     // q - 3
     598           0 :             iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3
     599           0 :             move32();
     600           0 :             move32();
     601             :         }
     602             : 
     603           0 :         *q_cldfb = sub( *q_cldfb, 3 );
     604           0 :         move16();
     605             : 
     606             :         /* FFT of DST IV */
     607             :         Word16 q_shift;
     608           0 :         q_shift = sub( s_min( getScaleFactor32( rBuffer_fx, shl( M2, 1 ) ), getScaleFactor32( iBuffer_fx, shl( M2, 1 ) ) ), find_guarded_bits_fx( M2 ) );
     609           0 :         *q_cldfb = add( *q_cldfb, q_shift );
     610           0 :         move16();
     611           0 :         FOR( Word16 ind = 0; ind < M2 * 2; ind++ )
     612             :         {
     613           0 :             rBuffer_fx[ind] = L_shl( rBuffer_fx[ind], q_shift );
     614           0 :             move32();
     615             :         }
     616           0 :         FOR( Word16 ind = 0; ind < M2 * 2; ind++ )
     617             :         {
     618           0 :             iBuffer_fx[ind] = L_shl( iBuffer_fx[ind], q_shift );
     619           0 :             move32();
     620             :         }
     621           0 :         fft_cldfb_fx( rBuffer_fx, M2 );
     622             : 
     623           0 :         *q_cldfb = sub( *q_cldfb, 2 );
     624           0 :         move16();
     625             : 
     626             :         /* FFT of DCT IV */
     627           0 :         fft_cldfb_fx( iBuffer_fx, M2 );
     628             : 
     629           0 :         q_shift = s_min( getScaleFactor32( rBuffer_fx, shl( M2, 1 ) ), getScaleFactor32( iBuffer_fx, shl( M2, 1 ) ) );
     630           0 :         *q_cldfb = add( *q_cldfb, q_shift );
     631           0 :         move16();
     632           0 :         FOR( Word16 ind = 0; ind < M2 * 2; ind++ )
     633             :         {
     634           0 :             rBuffer_fx[ind] = L_shl( rBuffer_fx[ind], q_shift );
     635           0 :             move32();
     636             :         }
     637           0 :         FOR( Word16 ind = 0; ind < M2 * 2; ind++ )
     638             :         {
     639           0 :             iBuffer_fx[ind] = L_shl( iBuffer_fx[ind], q_shift );
     640           0 :             move32();
     641             :         }
     642             : 
     643             :         /* post modulation of DST IV */
     644           0 :         FOR( k = 0; k < M2; k++ )
     645             :         {
     646             :             /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
     647           0 :             realBuffer_fx[( ( M1 - 1 ) - ( k * 2 ) )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5
     648           0 :             realBuffer_fx[2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] );                      // q - 5
     649           0 :             move32();
     650           0 :             move32();
     651             :         }
     652             : 
     653             :         /* post modulation of DCT IV */
     654           0 :         FOR( k = 0; k < M2; k++ )
     655             :         {
     656             :             /* do it inplace */
     657             :             /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
     658           0 :             imagBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] );                  // q - 5
     659           0 :             imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5
     660           0 :             move32();
     661           0 :             move32();
     662             :         }
     663             : 
     664           0 :         IF( EQ_32( h_cldfb->prototype, CLDFB_PROTOTYPE_5_00MS ) )
     665             :         {
     666             :             /* rotation due to delay*/
     667             :             /*if(h_cldfb->da != M1)*/
     668           0 :             IF( rot_vctr_delay_re_fx != NULL )
     669             :             {
     670           0 :                 FOR( k = 0; k < M1; k++ )
     671             :                 {
     672             :                     Word32 cplx_aux_fx;
     673             :                     /* delay */
     674             :                     /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[i][k], imagBuffer[i][k], cos((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)),
     675             :                             sin((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)));*/
     676             :                     /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
     677             :                     /*cplxMult(&realBuffer[k], &imagBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
     678             :                     /*realBuffer[k] = rBuffer[k];
     679             :                     imagBuffer[k] = iBuffer[k];*/
     680           0 :                     cplx_aux_fx = Msub_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_im_fx[k] );      // q - 5
     681           0 :                     imagBuffer_fx[k] = Madd_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ); // q - 5
     682           0 :                     realBuffer_fx[k] = cplx_aux_fx;
     683           0 :                     move32();
     684           0 :                     move32();
     685             :                 }
     686             :             }
     687             :         }
     688             : 
     689           0 :         timeBuffer_fx += i_mult( L2, 5 );
     690           0 :         timeBuffer_fx += sub( h_cldfb->no_channels, h_cldfb->p_filter_length );
     691             :     }
     692             : 
     693             :     /* update memory */
     694           0 :     IF( GT_16( samplesToProcess, -1 ) )
     695             :     {
     696           0 :         Copy32( buffer_fx + samplesToProcess, h_cldfb->cldfb_state_fx, offset );
     697             :     }
     698             :     ELSE
     699             :     {
     700           0 :         Copy32( buffer_fx + frameSize, h_cldfb->cldfb_state_fx, offset );
     701             :     }
     702             : 
     703           0 :     return;
     704             : }
     705             : 
     706      284896 : void cldfbAnalysis_ts_fx_var_q(
     707             :     const Word32 *timeIn_fx,
     708             :     /* i  : time buffer         */ // q
     709             :     Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX],
     710             :     /* o  : real value buffer   */ // q_cldfb - 5
     711             :     Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX],
     712             :     /* o  : imag value buffer   */    // q_cldfb - 5
     713             :     const Word16 samplesToProcess,    /* i  : samples to process  */
     714             :     HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i  : filterbank state    */
     715             :     Word16 *q_cldfb )
     716             : 
     717             : {
     718             :     Word16 i, k;
     719             :     Word16 L2, M1, M2, M4;
     720      284896 :     Word16 no_col = h_cldfb->no_col;
     721      284896 :     move16();
     722             :     Word32 r1_fx, r2_fx, rr12_fx, ir12_fx;
     723             :     Word32 i1_fx, i2_fx, ri12_fx, ii12_fx;
     724             :     Word32 rBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
     725             :     Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
     726             :     const Word32 *rot_vctr_re_fx;
     727             :     const Word32 *rot_vctr_im_fx;
     728             :     const Word32 *rot_vctr_delay_re_fx;
     729             :     const Word32 *rot_vctr_delay_im_fx;
     730             : #ifdef OPT_IVAS_FILTER_ROM
     731             :     const Word32 *ptr_pf_fx;
     732             : #else  /* OPT_IVAS_FILTER_ROM */
     733             :     const Word16 *ptr_pf_fx;
     734             :     Word16 ptr_pf_sf;
     735             : #endif /* OPT_IVAS_FILTER_ROM */
     736             :     Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )];
     737             :     Word16 offset, frameSize;
     738             : 
     739      284896 :     offset = sub( h_cldfb->p_filter_length, h_cldfb->no_channels );
     740      284896 :     frameSize = i_mult( h_cldfb->no_channels, h_cldfb->no_col );
     741             : 
     742             :     /* prepare input buffer */
     743      284896 :     timeBuffer_fx = buffer_fx;
     744      284896 :     Copy32( h_cldfb->cldfb_state_fx, timeBuffer_fx, offset );
     745             : 
     746      284896 :     IF( GT_16( samplesToProcess, -1 ) )
     747             :     {
     748      284896 :         Copy32( timeIn_fx, timeBuffer_fx + offset, samplesToProcess );
     749      284896 :         set32_fx( timeBuffer_fx + add( offset, samplesToProcess ), 0, sub( frameSize, samplesToProcess ) );
     750             :     }
     751             :     ELSE
     752             :     {
     753           0 :         Copy32( timeIn_fx, timeBuffer_fx + offset, frameSize );
     754             :     }
     755             : 
     756      284896 :     IF( NE_16( h_cldfb->Q_cldfb_state, *q_cldfb ) )
     757             :     {
     758        5570 :         Word16 norm_st = L_norm_arr( timeBuffer_fx, offset );
     759        5570 :         IF( GE_16( norm_st, sub( *q_cldfb, h_cldfb->Q_cldfb_state ) ) )
     760             :         {
     761        5570 :             scale_sig32( timeBuffer_fx, offset, sub( *q_cldfb, h_cldfb->Q_cldfb_state ) );
     762             :             /* cldfb_state will get updated at end of processing with values whose q is same as
     763             :              * *q_cldfb.
     764             :              */
     765        5570 :             h_cldfb->Q_cldfb_state = *q_cldfb;
     766        5570 :             move16();
     767             :         }
     768             :         ELSE
     769             :         {
     770           0 :             scale_sig32( &timeBuffer_fx[offset], frameSize, sub( h_cldfb->Q_cldfb_state, *q_cldfb ) );
     771           0 :             *q_cldfb = h_cldfb->Q_cldfb_state;
     772           0 :             move16();
     773             :         }
     774             :     }
     775             : 
     776             :     /* only process needed cols */
     777      284896 :     IF( GT_16( samplesToProcess, -1 ) )
     778             :     {
     779      284896 :         no_col = s_min( no_col, idiv1616( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), h_cldfb->no_channels ) );
     780      284896 :         assert( no_col == 1 );
     781             :     }
     782             : 
     783      284896 :     M1 = h_cldfb->no_channels;
     784      284896 :     M2 = shr( M1, 1 );
     785      284896 :     M4 = shr( M1, 2 );
     786      284896 :     L2 = shl( M1, 1 );
     787      284896 :     move16();
     788             : 
     789      284896 :     if ( s_and( M2, 1 ) )
     790             :     {
     791           0 :         M4 = add( M4, 1 );
     792             :     }
     793             : 
     794      284896 :     rot_vctr_re_fx = h_cldfb->rot_vec_ana_re_fx;             // q = 29
     795      284896 :     rot_vctr_im_fx = h_cldfb->rot_vec_ana_im_fx;             // q = 29
     796      284896 :     rot_vctr_delay_re_fx = h_cldfb->rot_vec_ana_delay_re_fx; // q = 31
     797      284896 :     rot_vctr_delay_im_fx = h_cldfb->rot_vec_ana_delay_im_fx; // q = 31
     798             : 
     799             : #ifdef OPT_IVAS_FILTER_ROM
     800      284896 :     ptr_pf_fx = h_cldfb->p_filter_32;
     801             : #else  /* OPT_IVAS_FILTER_ROM */
     802             :     ptr_pf_fx = h_cldfb->p_filter;
     803             :     ptr_pf_sf = h_cldfb->p_filter_sf;                                                                                                          // Q14
     804             : #endif /* OPT_IVAS_FILTER_ROM */
     805      284896 :     move16();
     806             : 
     807      569792 :     FOR( i = 0; i < no_col; i++ )
     808             :     {
     809     4420576 :         FOR( k = 0; k < M4; k++ )
     810             :         {
     811             :             /* prototype filter */
     812             : #ifdef OPT_IVAS_FILTER_ROM
     813     4135680 :             r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
     814     4135680 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
     815     4135680 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
     816     4135680 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
     817     4135680 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
     818             : 
     819     4135680 :             r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] );     // q
     820     4135680 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q
     821     4135680 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q
     822     4135680 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q
     823     4135680 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q
     824             : 
     825     4135680 :             i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
     826     4135680 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
     827     4135680 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
     828     4135680 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
     829     4135680 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
     830             : 
     831     4135680 :             i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
     832     4135680 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
     833     4135680 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
     834     4135680 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
     835     4135680 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
     836             : #else                                                                                                                                                  /* OPT_IVAS_FILTER_ROM */
     837             :             r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
     838             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
     839             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
     840             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
     841             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
     842             : 
     843             :             r2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] );     // q
     844             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q
     845             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q
     846             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q
     847             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q
     848             : 
     849             :             i1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
     850             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
     851             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
     852             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
     853             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
     854             : 
     855             :             i2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
     856             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
     857             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
     858             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
     859             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
     860             : 
     861             :             r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf );                                                                                           // q - 1
     862             :             r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf );                                                                                           // q - 1
     863             :             i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf );                                                                                           // q - 1
     864             :             i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf );                                                                                           // q - 1
     865             : #endif                                                                                                                                                 /* OPT_IVAS_FILTER_ROM */
     866             : 
     867             :             /* folding + pre modulation of DST IV */
     868     4135680 :             rr12_fx = L_sub( r1_fx, r2_fx );             // q -1
     869     4135680 :             ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // q - 1
     870             :             /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
     871     4135680 :             rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] );     // q - 3
     872     4135680 :             rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3
     873     4135680 :             move32();
     874     4135680 :             move32();
     875             : 
     876             :             ///* folding + pre modulation of DCT IV */
     877     4135680 :             ir12_fx = L_add( r1_fx, r2_fx ); // q - 1
     878     4135680 :             ii12_fx = L_sub( i1_fx, i2_fx ); // q - 1
     879             :             /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
     880     4135680 :             iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] );     // q - 3
     881     4135680 :             iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3
     882     4135680 :             move32();
     883     4135680 :             move32();
     884             :         }
     885             : 
     886     4420576 :         FOR( k = M4; k < M2; k++ )
     887             :         {
     888             :             /* prototype filter */
     889             : #ifdef OPT_IVAS_FILTER_ROM
     890     4135680 :             r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
     891     4135680 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
     892     4135680 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
     893     4135680 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
     894     4135680 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
     895             : 
     896     4135680 :             r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
     897     4135680 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
     898     4135680 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
     899     4135680 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
     900     4135680 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
     901             : 
     902     4135680 :             i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
     903     4135680 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
     904     4135680 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
     905     4135680 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
     906     4135680 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
     907             : 
     908     4135680 :             i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
     909     4135680 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
     910     4135680 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
     911     4135680 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
     912     4135680 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
     913             : 
     914             : #else  /* OPT_IVAS_FILTER_ROM */
     915             :             r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
     916             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
     917             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
     918             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
     919             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
     920             : 
     921             :             r2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
     922             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
     923             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
     924             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
     925             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
     926             : 
     927             :             i1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
     928             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
     929             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
     930             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
     931             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
     932             : 
     933             :             i2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
     934             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
     935             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
     936             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
     937             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
     938             : 
     939             :             r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1
     940             :             r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1
     941             :             i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1
     942             :             i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1
     943             : #endif /* OPT_IVAS_FILTER_ROM */
     944             : 
     945             :             /* folding + pre modulation of DST IV */
     946     4135680 :             rr12_fx = L_add( r1_fx, r2_fx ); // q - 1
     947     4135680 :             ri12_fx = L_sub( i1_fx, i2_fx ); // q - 1
     948             :             /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
     949     4135680 :             rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] );     // q - 3
     950     4135680 :             rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3
     951     4135680 :             move32();
     952     4135680 :             move32();
     953             : 
     954             :             /* folding + pre modulation of DCT IV */
     955     4135680 :             ir12_fx = L_sub( r1_fx, r2_fx ); // q - 1
     956     4135680 :             ii12_fx = L_add( i1_fx, i2_fx ); // q - 1
     957             :             /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
     958     4135680 :             iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] );     // q - 3
     959     4135680 :             iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3
     960     4135680 :             move32();
     961     4135680 :             move32();
     962             :         }
     963             : 
     964      284896 :         *q_cldfb = sub( *q_cldfb, 3 );
     965      284896 :         move16();
     966             : 
     967             :         /* FFT of DST IV */
     968      284896 :         fft_cldfb_fx( rBuffer_fx, M2 );
     969             : 
     970             :         /* post modulation of DST IV */
     971     8556256 :         FOR( k = 0; k < M2; k++ )
     972             :         {
     973             :             /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
     974     8271360 :             realBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5
     975     8271360 :             realBuffer_fx[2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] );                  // q - 5
     976     8271360 :             move32();
     977     8271360 :             move32();
     978             :         }
     979      284896 :         *q_cldfb = sub( *q_cldfb, 2 );
     980      284896 :         move16();
     981             : 
     982             :         /* FFT of DCT IV */
     983      284896 :         fft_cldfb_fx( iBuffer_fx, M2 );
     984             : 
     985             :         /* post modulation of DCT IV */
     986     8556256 :         FOR( k = 0; k < M2; k++ )
     987             :         {
     988             :             /* do it inplace */
     989             :             /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
     990     8271360 :             imagBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] );                  // q - 5
     991     8271360 :             imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5
     992     8271360 :             move32();
     993     8271360 :             move32();
     994             :         }
     995             : 
     996      284896 :         IF( EQ_32( h_cldfb->prototype, CLDFB_PROTOTYPE_5_00MS ) )
     997             :         {
     998             :             /* rotation due to delay*/
     999             :             /*if(h_cldfb->da != M1)*/
    1000      284896 :             IF( rot_vctr_delay_re_fx != NULL )
    1001             :             {
    1002    16827616 :                 FOR( k = 0; k < M1; k++ )
    1003             :                 {
    1004             :                     Word32 cplx_aux_fx;
    1005             :                     /* delay */
    1006             :                     /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[i][k], imagBuffer[i][k], cos((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)),
    1007             :                             sin((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)));*/
    1008             :                     /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
    1009             :                     /*cplxMult(&realBuffer[k], &imagBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
    1010             :                     /*realBuffer[k] = rBuffer[k];
    1011             :                     imagBuffer[k] = iBuffer[k];*/
    1012    16542720 :                     cplx_aux_fx = Msub_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_im_fx[k] );      // q - 5
    1013    16542720 :                     imagBuffer_fx[k] = Madd_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ); // q - 5
    1014    16542720 :                     realBuffer_fx[k] = cplx_aux_fx;
    1015    16542720 :                     move32();
    1016    16542720 :                     move32();
    1017             :                 }
    1018             :             }
    1019             :         }
    1020             : 
    1021      284896 :         timeBuffer_fx += i_mult( L2, 5 );
    1022      284896 :         timeBuffer_fx += sub( h_cldfb->no_channels, h_cldfb->p_filter_length );
    1023             :     }
    1024             : 
    1025             :     /* update memory */
    1026      284896 :     IF( GT_16( samplesToProcess, -1 ) )
    1027             :     {
    1028      284896 :         Copy32( buffer_fx + samplesToProcess, h_cldfb->cldfb_state_fx, offset );
    1029             :     }
    1030             :     ELSE
    1031             :     {
    1032           0 :         Copy32( buffer_fx + frameSize, h_cldfb->cldfb_state_fx, offset );
    1033             :     }
    1034             : 
    1035      284896 :     return;
    1036             : }
    1037             : 
    1038             : 
    1039    12816352 : void cldfbAnalysis_ts_fx_fixed_q(
    1040             :     const Word32 *timeIn_fx,
    1041             :     /* i  : time buffer         */ // q
    1042             :     Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX],
    1043             :     /* o  : real value buffer   */ // q - 5
    1044             :     Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX],
    1045             :     /* o  : imag value buffer   */    // q - 5
    1046             :     const Word16 samplesToProcess,    /* i  : samples to process  */
    1047             :     HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i  : filterbank state    */
    1048             :     Word16 *q_cldfb )
    1049             : {
    1050             :     Word16 i, k;
    1051             :     Word16 L2, M1, M2, M4;
    1052    12816352 :     Word16 no_col = h_cldfb->no_col;
    1053    12816352 :     move16();
    1054             :     Word32 r1_fx, r2_fx, rr12_fx, ir12_fx;
    1055             :     Word32 i1_fx, i2_fx, ri12_fx, ii12_fx;
    1056             :     Word32 rBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
    1057             :     Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
    1058             :     const Word32 *rot_vctr_re_fx;
    1059             :     const Word32 *rot_vctr_im_fx;
    1060             :     const Word32 *rot_vctr_delay_re_fx;
    1061             :     const Word32 *rot_vctr_delay_im_fx;
    1062             : #ifdef OPT_IVAS_FILTER_ROM
    1063             :     const Word32 *ptr_pf_fx;
    1064             : #else  /* OPT_IVAS_FILTER_ROM */
    1065             :     const Word16 *ptr_pf_fx;
    1066             :     Word16 ptr_pf_sf;
    1067             : #endif /* OPT_IVAS_FILTER_ROM */
    1068             :     Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )];
    1069             :     Word16 offset, frameSize, gb, hr, shift;
    1070             : 
    1071    12816352 :     offset = sub( h_cldfb->p_filter_length, h_cldfb->no_channels );
    1072    12816352 :     frameSize = i_mult( h_cldfb->no_channels, h_cldfb->no_col );
    1073             : 
    1074             :     /* prepare input buffer */
    1075    12816352 :     timeBuffer_fx = buffer_fx;
    1076    12816352 :     Copy32( h_cldfb->cldfb_state_fx, timeBuffer_fx, offset );
    1077    12816352 :     h_cldfb->Q_cldfb_state = *q_cldfb;
    1078    12816352 :     move16();
    1079             : 
    1080    12816352 :     IF( GT_16( samplesToProcess, -1 ) )
    1081             :     {
    1082    12816352 :         Copy32( timeIn_fx, timeBuffer_fx + offset, samplesToProcess );
    1083    12816352 :         set32_fx( timeBuffer_fx + add( offset, samplesToProcess ), 0, sub( frameSize, samplesToProcess ) );
    1084             :     }
    1085             :     ELSE
    1086             :     {
    1087           0 :         Copy32( timeIn_fx, timeBuffer_fx + offset, frameSize );
    1088             :     }
    1089             : 
    1090             :     /* only process needed cols */
    1091    12816352 :     IF( GT_16( samplesToProcess, -1 ) )
    1092             :     {
    1093    12816352 :         no_col = s_min( no_col, idiv1616( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), h_cldfb->no_channels ) );
    1094    12816352 :         assert( no_col == 1 );
    1095             :     }
    1096             : 
    1097    12816352 :     M1 = h_cldfb->no_channels;
    1098    12816352 :     M2 = shr( M1, 1 );
    1099    12816352 :     M4 = shr( M1, 2 );
    1100    12816352 :     L2 = shl( M1, 1 );
    1101    12816352 :     move16();
    1102             : 
    1103    12816352 :     if ( s_and( M2, 1 ) )
    1104             :     {
    1105           0 :         M4 = add( M4, 1 );
    1106             :     }
    1107             : 
    1108    12816352 :     rot_vctr_re_fx = h_cldfb->rot_vec_ana_re_fx;             // q = 29
    1109    12816352 :     rot_vctr_im_fx = h_cldfb->rot_vec_ana_im_fx;             // q = 29
    1110    12816352 :     rot_vctr_delay_re_fx = h_cldfb->rot_vec_ana_delay_re_fx; // q = 31
    1111    12816352 :     rot_vctr_delay_im_fx = h_cldfb->rot_vec_ana_delay_im_fx; // q = 31
    1112             : 
    1113             : #ifdef OPT_IVAS_FILTER_ROM
    1114    12816352 :     ptr_pf_fx = h_cldfb->p_filter_32;
    1115             : #else  /* OPT_IVAS_FILTER_ROM */
    1116             :     ptr_pf_fx = h_cldfb->p_filter;
    1117             :     ptr_pf_sf = h_cldfb->p_filter_sf;                                                                                                          // Q14
    1118             : #endif /* OPT_IVAS_FILTER_ROM */
    1119    12816352 :     move16();
    1120             : 
    1121    25632704 :     FOR( i = 0; i < no_col; i++ )
    1122             :     {
    1123   178011840 :         FOR( k = 0; k < M4; k++ )
    1124             :         {
    1125             :             /* prototype filter */
    1126             : #ifdef OPT_IVAS_FILTER_ROM
    1127   165195488 :             r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
    1128   165195488 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
    1129   165195488 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
    1130   165195488 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
    1131   165195488 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
    1132             : 
    1133   165195488 :             r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] );     // q
    1134   165195488 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q
    1135   165195488 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q
    1136   165195488 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q
    1137   165195488 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q
    1138             : 
    1139   165195488 :             i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
    1140   165195488 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
    1141   165195488 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
    1142   165195488 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
    1143   165195488 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
    1144             : 
    1145   165195488 :             i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
    1146   165195488 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
    1147   165195488 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
    1148   165195488 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
    1149   165195488 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
    1150             : #else                                                                                                                                                  /* OPT_IVAS_FILTER_ROM */
    1151             :             r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
    1152             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
    1153             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
    1154             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
    1155             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
    1156             : 
    1157             :             r2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] );     // q
    1158             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q
    1159             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q
    1160             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q
    1161             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q
    1162             : 
    1163             :             i1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
    1164             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
    1165             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
    1166             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
    1167             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
    1168             : 
    1169             :             i2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
    1170             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
    1171             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
    1172             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
    1173             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
    1174             : 
    1175             :             r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf );                                                                                           // q - 1
    1176             :             r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf );                                                                                           // q - 1
    1177             :             i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf );                                                                                           // q - 1
    1178             :             i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf );                                                                                           // q - 1
    1179             : #endif                                                                                                                                                 /* OPT_IVAS_FILTER_ROM */
    1180             : 
    1181             :             /* folding + pre modulation of DST IV */
    1182   165195488 :             rr12_fx = L_sub( r1_fx, r2_fx );             // q -1
    1183   165195488 :             ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // q - 1
    1184             :             /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
    1185   165195488 :             rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] );     // q - 3
    1186   165195488 :             rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3
    1187   165195488 :             move32();
    1188   165195488 :             move32();
    1189             : 
    1190             :             ///* folding + pre modulation of DCT IV */
    1191   165195488 :             ir12_fx = L_add( r1_fx, r2_fx ); // q - 1
    1192   165195488 :             ii12_fx = L_sub( i1_fx, i2_fx ); // q - 1
    1193             :             /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
    1194   165195488 :             iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] );     // q - 3
    1195   165195488 :             iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3
    1196   165195488 :             move32();
    1197   165195488 :             move32();
    1198             :         }
    1199             : 
    1200   178011840 :         FOR( k = M4; k < M2; k++ )
    1201             :         {
    1202             :             /* prototype filter */
    1203             : #ifdef OPT_IVAS_FILTER_ROM
    1204   165195488 :             r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
    1205   165195488 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
    1206   165195488 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
    1207   165195488 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
    1208   165195488 :             r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
    1209             : 
    1210   165195488 :             r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
    1211   165195488 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
    1212   165195488 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
    1213   165195488 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
    1214   165195488 :             r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
    1215             : 
    1216   165195488 :             i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
    1217   165195488 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
    1218   165195488 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
    1219   165195488 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
    1220   165195488 :             i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
    1221             : 
    1222   165195488 :             i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
    1223   165195488 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
    1224   165195488 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
    1225   165195488 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
    1226   165195488 :             i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
    1227             : #else                                                                                                                                          /* OPT_IVAS_FILTER_ROM */
    1228             :             r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
    1229             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
    1230             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
    1231             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
    1232             :             r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
    1233             : 
    1234             :             r2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
    1235             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
    1236             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
    1237             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
    1238             :             r2_fx = Msub_32_16( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
    1239             : 
    1240             :             i1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] );     // q
    1241             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q
    1242             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q
    1243             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q
    1244             :             i1_fx = Msub_32_16( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q
    1245             : 
    1246             :             i2_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] );     // q
    1247             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q
    1248             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q
    1249             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q
    1250             :             i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q
    1251             : 
    1252             :             r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1
    1253             :             r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1
    1254             :             i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1
    1255             :             i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1
    1256             : #endif                                                                                                                                         /* OPT_IVAS_FILTER_ROM */
    1257             : 
    1258             :             /* folding + pre modulation of DST IV */
    1259   165195488 :             rr12_fx = L_add( r1_fx, r2_fx ); // q - 1
    1260   165195488 :             ri12_fx = L_sub( i1_fx, i2_fx ); // q - 1
    1261             :             /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
    1262   165195488 :             rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] );     // q - 3
    1263   165195488 :             rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3
    1264   165195488 :             move32();
    1265   165195488 :             move32();
    1266             : 
    1267             :             /* folding + pre modulation of DCT IV */
    1268   165195488 :             ir12_fx = L_sub( r1_fx, r2_fx ); // q - 1
    1269   165195488 :             ii12_fx = L_add( i1_fx, i2_fx ); // q - 1
    1270             :             /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
    1271   165195488 :             iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] );     // q - 3
    1272   165195488 :             iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3
    1273   165195488 :             move32();
    1274   165195488 :             move32();
    1275             :         }
    1276             : 
    1277    12816352 :         *q_cldfb = sub( *q_cldfb, 3 );
    1278    12816352 :         move16();
    1279             : 
    1280             :         /* FFT of DST IV */
    1281    12816352 :         fft_cldfb_fx( rBuffer_fx, M2 );
    1282             : 
    1283             :         /* post modulation of DST IV */
    1284   343207328 :         FOR( k = 0; k < M2; k++ )
    1285             :         {
    1286             :             /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
    1287   330390976 :             realBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5
    1288   330390976 :             realBuffer_fx[2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] );                  // q - 5
    1289   330390976 :             move32();
    1290   330390976 :             move32();
    1291             :         }
    1292    12816352 :         *q_cldfb = sub( *q_cldfb, 2 );
    1293    12816352 :         move16();
    1294             : 
    1295    12816352 :         gb = find_guarded_bits_fx( M1 );
    1296    12816352 :         hr = L_norm_arr( iBuffer_fx, M1 );
    1297             : 
    1298    12816352 :         IF( LT_16( hr, gb ) )
    1299             :         {
    1300       11591 :             scale_sig32( iBuffer_fx, M1, sub( hr, gb ) );
    1301             :         }
    1302             : 
    1303             :         /* FFT of DCT IV */
    1304    12816352 :         fft_cldfb_fx( iBuffer_fx, M2 );
    1305             : 
    1306             :         /* post modulation of DCT IV */
    1307    12816352 :         IF( LT_16( hr, gb ) )
    1308             :         {
    1309       11591 :             shift = sub( gb, hr );
    1310      259731 :             FOR( k = 0; k < M2; k++ )
    1311             :             {
    1312             :                 /* do it inplace */
    1313             :                 /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
    1314      248140 :                 imagBuffer_fx[2 * k] = L_shl( Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ), shift );                  // q - 5
    1315      248140 :                 imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = L_shl( Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ), shift ); // q - 5
    1316      248140 :                 move32();
    1317      248140 :                 move32();
    1318             :             }
    1319             :         }
    1320             :         ELSE
    1321             :         {
    1322   342947597 :             FOR( k = 0; k < M2; k++ )
    1323             :             {
    1324             :                 /* do it inplace */
    1325             :                 /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
    1326   330142836 :                 imagBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] );                  // q - 5
    1327   330142836 :                 imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5
    1328   330142836 :                 move32();
    1329   330142836 :                 move32();
    1330             :             }
    1331             :         }
    1332             : 
    1333    12816352 :         IF( EQ_32( h_cldfb->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    1334             :         {
    1335             :             /* rotation due to delay*/
    1336             :             /*if(h_cldfb->da != M1)*/
    1337    12816352 :             IF( rot_vctr_delay_re_fx != NULL )
    1338             :             {
    1339   673598304 :                 FOR( k = 0; k < M1; k++ )
    1340             :                 {
    1341             :                     Word32 cplx_aux_fx;
    1342             :                     /* delay */
    1343             :                     /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[i][k], imagBuffer[i][k], cos((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)),
    1344             :                             sin((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)));*/
    1345             :                     /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
    1346             :                     /*cplxMult(&realBuffer[k], &imagBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
    1347             :                     /*realBuffer[k] = rBuffer[k];
    1348             :                     imagBuffer[k] = iBuffer[k];*/
    1349   660781952 :                     cplx_aux_fx = Msub_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_im_fx[k] );      // q - 5
    1350   660781952 :                     imagBuffer_fx[k] = Madd_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ); // q - 5
    1351   660781952 :                     realBuffer_fx[k] = cplx_aux_fx;
    1352   660781952 :                     move32();
    1353   660781952 :                     move32();
    1354             :                 }
    1355             :             }
    1356             :         }
    1357             : 
    1358    12816352 :         timeBuffer_fx += i_mult( L2, 5 );
    1359    12816352 :         timeBuffer_fx += sub( h_cldfb->no_channels, h_cldfb->p_filter_length );
    1360             :     }
    1361             : 
    1362             :     /* update memory */
    1363    12816352 :     IF( GT_16( samplesToProcess, -1 ) )
    1364             :     {
    1365    12816352 :         Copy32( buffer_fx + samplesToProcess, h_cldfb->cldfb_state_fx, offset );
    1366             :     }
    1367             :     ELSE
    1368             :     {
    1369           0 :         Copy32( buffer_fx + frameSize, h_cldfb->cldfb_state_fx, offset );
    1370             :     }
    1371             : 
    1372    12816352 :     return;
    1373             : }
    1374             : 
    1375             : /*-------------------------------------------------------------------*
    1376             :  * cldfbSynthesis_ivas()
    1377             :  *
    1378             :  * Conduct inverse multple overlap cmplex low delay MDCT
    1379             :  *--------------------------------------------------------------------*/
    1380    11634281 : void cldfbSynthesis_ivas_fx(
    1381             :     Word32 **realBuffer_fx,          /* i  : real values                 Qx*/
    1382             :     Word32 **imagBuffer_fx,          /* i  : imag values                 Qx*/
    1383             :     Word32 *timeOut_fx,              /* o  : output time domain samples  Qx - 1*/
    1384             :     const Word16 samplesToProcess,   /* i  : number of processed samples */
    1385             :     const Word16 shift,              /* i  : scale for state buffer */
    1386             :     const Word16 out_shift,          /* i  : scale for output buffer */
    1387             :     HANDLE_CLDFB_FILTER_BANK h_cldfb /* i  : filter bank state           */
    1388             : )
    1389             : {
    1390             :     Word16 i;
    1391             :     Word16 k;
    1392             :     Word16 L2;
    1393             :     Word16 M1;
    1394             :     Word16 M2;
    1395             :     Word16 M41;
    1396             :     Word16 M42;
    1397             :     Word16 Mz;
    1398             : 
    1399             :     Word32 rBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
    1400             :     Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
    1401             :     const Word32 *rot_vctr_re_fx;
    1402             :     const Word32 *rot_vctr_im_fx;
    1403             :     const Word32 *rot_vctr_delay_re_fx;
    1404             :     const Word32 *rot_vctr_delay_im_fx;
    1405             :     Word32 rr12_fx, ir12_fx;
    1406             :     Word32 ri12_fx, ii12_fx;
    1407             : 
    1408             :     Word32 *synthesisBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 10 * CLDFB_NO_CHANNELS_MAX )];
    1409             :     Word32 new_samples_fx[2 * CLDFB_NO_CHANNELS_MAX];
    1410             : 
    1411             :     Word32 *ptr_time_out_fx;
    1412             : #ifdef OPT_IVAS_FILTER_ROM
    1413             :     const Word32 *p_filter_32;
    1414             : #else  /* OPT_IVAS_FILTER_ROM */
    1415             :     const Word16 *p_filter;
    1416             :     Word16 p_filter_sf;
    1417             : #endif /* OPT_IVAS_FILTER_ROM */
    1418             : 
    1419             :     Word32 accu0, accu1, accu2, accu3, accu4;
    1420    11634281 :     Word16 no_col = h_cldfb->no_col;
    1421    11634281 :     move16();
    1422             : 
    1423    11634281 :     M1 = h_cldfb->no_channels;
    1424    11634281 :     move16();
    1425    11634281 :     L2 = shl( M1, 1 );
    1426    11634281 :     M2 = shr( M1, 1 );
    1427    11634281 :     M41 = shr( M2, 1 );
    1428    11634281 :     M42 = sub( M2, M41 );
    1429    11634281 :     Mz = sub( M1, h_cldfb->bandsToZero );
    1430             : 
    1431             :     /* only process needed cols */
    1432    11634281 :     IF( GT_16( samplesToProcess, -1 ) )
    1433             :     {
    1434    11375483 :         no_col = s_min( no_col, idiv1616( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), h_cldfb->no_channels ) );
    1435    11375483 :         move16();
    1436             :     }
    1437             : 
    1438    11634281 :     rot_vctr_re_fx = h_cldfb->rot_vec_syn_re_fx;
    1439    11634281 :     rot_vctr_im_fx = h_cldfb->rot_vec_syn_im_fx;
    1440             : 
    1441    11634281 :     rot_vctr_delay_re_fx = h_cldfb->rot_vec_syn_delay_re_fx;
    1442    11634281 :     rot_vctr_delay_im_fx = h_cldfb->rot_vec_syn_delay_im_fx;
    1443             : 
    1444    11634281 :     synthesisBuffer_fx = buffer_fx;
    1445    11634281 :     Copy32( h_cldfb->cldfb_state_fx, synthesisBuffer_fx + i_mult( M1, no_col ), h_cldfb->p_filter_length );
    1446             : 
    1447             : #ifdef OPT_IVAS_FILTER_ROM
    1448    11634281 :     p_filter_32 = h_cldfb->p_filter_32;
    1449             : #else  /* OPT_IVAS_FILTER_ROM */
    1450             :     p_filter = h_cldfb->p_filter;
    1451             :     p_filter_sf = h_cldfb->p_filter_sf;                                                                                                                 // Q14
    1452             : #endif /* OPT_IVAS_FILTER_ROM */
    1453    11634281 :     ptr_time_out_fx = timeOut_fx;
    1454             : 
    1455             :     /*synthesisBuffer += M1 * h_cldfb->no_col;*/
    1456    11634281 :     synthesisBuffer_fx += i_mult( M1, no_col );
    1457             : 
    1458    30819712 :     FOR( k = 0; k < no_col; k++ )
    1459             :     {
    1460    19185431 :         IF( EQ_16( h_cldfb->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    1461             :         {
    1462             :             /* rotation due to delay*/
    1463             :             /*if(h_cldfb->ds != M1)*/
    1464    14622062 :             IF( rot_vctr_delay_re_fx != NULL )
    1465             :             {
    1466   786422182 :                 FOR( i = 0; i < M1; i++ )
    1467             :                 {
    1468             :                     Word32 cplx_aux;
    1469             :                     /* delay */
    1470             :                     /*cplxMult(&rBuffer[i], &iBuffer[i], realBuffer[k][i], imagBuffer[k][i], cos((EVS_PI/M1)*(i+0.5)*(-(h_cldfb->ds-M1)*0.5)),
    1471             :                             sin((EVS_PI/M1)*(i+0.5)*(-(h_cldfb->ds-M1)*0.5)));*/
    1472             :                     /*cplxMult(&rBuffer[i], &iBuffer[i], realBuffer[k][i], imagBuffer[k][i], rot_vctr_delay_re[i], rot_vctr_delay_im[i]);*/
    1473             :                     /*cplxMult(&realBuffer[k][i], &imagBuffer[k][i], realBuffer[k][i], imagBuffer[k][i], rot_vctr_delay_re[i], rot_vctr_delay_im[i]);*/
    1474   771800120 :                     cplx_aux = Msub_32_32( Mpy_32_32( realBuffer_fx[k][i], rot_vctr_delay_re_fx[i] ), imagBuffer_fx[k][i], rot_vctr_delay_im_fx[i] ); // Qx
    1475   771800120 :                     imagBuffer_fx[k][i] = Madd_32_32( Mpy_32_32( realBuffer_fx[k][i], rot_vctr_delay_im_fx[i] ), imagBuffer_fx[k][i], rot_vctr_delay_re_fx[i] );
    1476   771800120 :                     move32();
    1477   771800120 :                     realBuffer_fx[k][i] = cplx_aux;
    1478   771800120 :                     move32();
    1479             :                     /*realBuffer[k][i] = rBuffer[i];*/
    1480             :                     /*imagBuffer[k][i] = iBuffer[i];*/
    1481             :                 }
    1482             :             }
    1483             :         }
    1484    93483375 :         FOR( i = Mz; i < M1; i++ )
    1485             :         {
    1486    74297944 :             realBuffer_fx[k][i] = 0;
    1487    74297944 :             move32();
    1488    74297944 :             imagBuffer_fx[k][i] = 0;
    1489    74297944 :             move32();
    1490             :         }
    1491             : 
    1492   491153911 :         FOR( i = 0; i < M2; i++ )
    1493             :         {
    1494             :             /* pre modulation of DST IV */
    1495             :             /*cplxMult(&rBuffer[2*i], &rBuffer[2*i+1], realBuffer[k][2*i], realBuffer[k][M1-1-2*i], rot_vctr_re[i], rot_vctr_im[i]);*/
    1496   471968480 :             rBuffer_fx[2 * i] = Msub_32_32( Mpy_32_32( realBuffer_fx[k][2 * i], rot_vctr_re_fx[i] ), realBuffer_fx[k][( M1 - 1 ) - ( i * 2 )], rot_vctr_im_fx[i] ); // Qx
    1497   471968480 :             move32();
    1498   471968480 :             rBuffer_fx[2 * i + 1] = Madd_32_32( Mpy_32_32( realBuffer_fx[k][2 * i], rot_vctr_im_fx[i] ), realBuffer_fx[k][( M1 - 1 ) - ( i * 2 )], rot_vctr_re_fx[i] ); // Qx
    1499   471968480 :             move32();
    1500             : 
    1501             :             /* pre modulation of DCT IV */
    1502             :             /*cplxMult(&iBuffer[2*i], &iBuffer[2*i+1],-imagBuffer[k][2*i], imagBuffer[k][M1-1-2*i], rot_vctr_re[i], rot_vctr_im[i]);*/
    1503   471968480 :             iBuffer_fx[2 * i] = Msub_32_32( Mpy_32_32( ( L_negate( imagBuffer_fx[k][2 * i] ) ), rot_vctr_re_fx[i] ), imagBuffer_fx[k][( M1 - 1 ) - ( i * 2 )], rot_vctr_im_fx[i] ); // Qx
    1504   471968480 :             move32();
    1505   471968480 :             iBuffer_fx[2 * i + 1] = Msub_32_32( Mpy_32_32( imagBuffer_fx[k][( M1 - 1 ) - ( i * 2 )], rot_vctr_re_fx[i] ), imagBuffer_fx[k][2 * i], rot_vctr_im_fx[i] ); // Qx
    1506   471968480 :             move32();
    1507             :         }
    1508             : 
    1509             :         /* FFT of DST IV */
    1510    19185431 :         fft_cldfb_fx( rBuffer_fx, M2 );
    1511             : 
    1512             :         /* FFT of DCT IV */
    1513    19185431 :         fft_cldfb_fx( iBuffer_fx, M2 );
    1514             : 
    1515             :         /* folding */
    1516   255169671 :         FOR( i = 0; i < M41; i++ )
    1517             :         {
    1518             :             /* post modulation of DST IV */
    1519   235984240 :             rr12_fx = Msub_32_32( Mpy_32_32( rBuffer_fx[( M1 - 2 ) - ( i * 2 )], rot_vctr_re_fx[( M2 - 1 ) - i] ), rBuffer_fx[( M1 - 1 ) - ( i * 2 )], rot_vctr_im_fx[( M2 - 1 ) - i] ); // Qx
    1520   235984240 :             ri12_fx = Madd_32_32( Mpy_32_32( rBuffer_fx[( M1 - 2 ) - ( i * 2 )], rot_vctr_im_fx[( M2 - 1 ) - i] ), rBuffer_fx[( M1 - 1 ) - ( i * 2 )], rot_vctr_re_fx[( M2 - 1 ) - i] ); // Qx
    1521             : 
    1522             :             /* post modulation of DCT IV */
    1523   235984240 :             ir12_fx = Msub_32_32( Mpy_32_32( iBuffer_fx[( M1 - 2 ) - ( i * 2 )], rot_vctr_re_fx[( M2 - 1 ) - i] ), iBuffer_fx[( M1 - 1 ) - ( i * 2 )], rot_vctr_im_fx[( M2 - 1 ) - i] ); // Qx
    1524   235984240 :             ii12_fx = Madd_32_32( Mpy_32_32( iBuffer_fx[( M1 - 2 ) - ( i * 2 )], rot_vctr_im_fx[( M2 - 1 ) - i] ), iBuffer_fx[( M1 - 1 ) - ( i * 2 )], rot_vctr_re_fx[( M2 - 1 ) - i] ); // Qx
    1525             : 
    1526   235984240 :             new_samples_fx[M1 + M2 + 1 + 2 * i] = L_negate( L_add( rr12_fx, ii12_fx ) ); // Qx
    1527   235984240 :             move32();
    1528   235984240 :             new_samples_fx[M2 - 2 - 2 * i] = L_negate( L_add( ri12_fx, ir12_fx ) ); // Qx
    1529   235984240 :             move32();
    1530             : 
    1531   235984240 :             new_samples_fx[M1 + M2 - 2 - 2 * i] = L_sub( rr12_fx, ii12_fx ); // Qx
    1532   235984240 :             move32();
    1533   235984240 :             new_samples_fx[M2 + 1 + 2 * i] = L_sub( ir12_fx, ri12_fx ); // Qx
    1534   235984240 :             move32();
    1535             :         }
    1536             : 
    1537   255169671 :         FOR( i = 0; i < M42; i++ )
    1538             :         {
    1539             :             /* post modulation of DST IV */
    1540   235984240 :             rr12_fx = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * i], rot_vctr_re_fx[i] ), rBuffer_fx[2 * i + 1], rot_vctr_im_fx[i] ); // Qx
    1541   235984240 :             ri12_fx = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * i], rot_vctr_im_fx[i] ), rBuffer_fx[2 * i + 1], rot_vctr_re_fx[i] ); // Qx
    1542             : 
    1543             :             /* post modulation of DCT IV */
    1544   235984240 :             ir12_fx = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * i], rot_vctr_re_fx[i] ), iBuffer_fx[2 * i + 1], rot_vctr_im_fx[i] ); // Qx
    1545   235984240 :             ii12_fx = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * i], rot_vctr_im_fx[i] ), iBuffer_fx[2 * i + 1], rot_vctr_re_fx[i] ); // Qx
    1546             : 
    1547   235984240 :             new_samples_fx[M1 + M2 + 2 * i] = L_add( ri12_fx, ir12_fx ); // Qx
    1548   235984240 :             move32();
    1549   235984240 :             new_samples_fx[M2 - 1 - 2 * i] = L_add( rr12_fx, ii12_fx ); // Qx
    1550   235984240 :             move32();
    1551             : 
    1552   235984240 :             new_samples_fx[M1 + M2 - 1 - 2 * i] = L_sub( ir12_fx, ri12_fx ); // Qx
    1553   235984240 :             move32();
    1554   235984240 :             new_samples_fx[M2 + 2 * i] = L_sub( rr12_fx, ii12_fx ); // Qx
    1555   235984240 :             move32();
    1556             :         }
    1557             : 
    1558             :         /* synthesis prototype filter */
    1559    19185431 :         IF( 0 == shift )
    1560             :         {
    1561  1045036783 :             FOR( i = 0; i < L2; i++ )
    1562             :             {
    1563             : #ifdef OPT_IVAS_FILTER_ROM
    1564  1034192960 :                 accu0 = Madd_32_32( synthesisBuffer_fx[i], new_samples_fx[L2 - 1 - i], p_filter_32[i] );                       // Qx - 1
    1565  1034192960 :                 accu1 = Madd_32_32( synthesisBuffer_fx[1 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 1 * L2 + i )] ); // Qx - 1
    1566  1034192960 :                 accu2 = Madd_32_32( synthesisBuffer_fx[2 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 2 * L2 + i )] ); // Qx - 1
    1567  1034192960 :                 accu3 = Madd_32_32( synthesisBuffer_fx[3 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 3 * L2 + i )] ); // Qx - 1
    1568  1034192960 :                 accu4 = Madd_32_32( synthesisBuffer_fx[4 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 4 * L2 + i )] ); // Qx - 1
    1569             : #else                                                                                                                          /* OPT_IVAS_FILTER_ROM */
    1570             :                 accu0 = Madd_32_16( synthesisBuffer_fx[i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[i] ), p_filter_sf );                       // Qx - 1
    1571             :                 accu1 = Madd_32_16( synthesisBuffer_fx[1 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 1 * L2 + i )] ), p_filter_sf ); // Qx - 1
    1572             :                 accu2 = Madd_32_16( synthesisBuffer_fx[2 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 2 * L2 + i )] ), p_filter_sf ); // Qx - 1
    1573             :                 accu3 = Madd_32_16( synthesisBuffer_fx[3 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 3 * L2 + i )] ), p_filter_sf ); // Qx - 1
    1574             :                 accu4 = Madd_32_16( synthesisBuffer_fx[4 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 4 * L2 + i )] ), p_filter_sf ); // Qx - 1
    1575             : #endif                                                                                                                         /* OPT_IVAS_FILTER_ROM */
    1576             : 
    1577  1034192960 :                 synthesisBuffer_fx[i] = accu0;
    1578  1034192960 :                 move32();
    1579  1034192960 :                 synthesisBuffer_fx[1 * L2 + i] = accu1;
    1580  1034192960 :                 move32();
    1581  1034192960 :                 synthesisBuffer_fx[2 * L2 + i] = accu2;
    1582  1034192960 :                 move32();
    1583  1034192960 :                 synthesisBuffer_fx[3 * L2 + i] = accu3;
    1584  1034192960 :                 move32();
    1585  1034192960 :                 synthesisBuffer_fx[4 * L2 + i] = accu4;
    1586  1034192960 :                 move32();
    1587             :             }
    1588             :         }
    1589             :         ELSE
    1590             :         {
    1591             : 
    1592   862022568 :             FOR( i = 0; i < L2; i++ )
    1593             :             {
    1594             : #ifdef OPT_IVAS_FILTER_ROM
    1595   853680960 :                 Word32 prod = L_shl_sat( ( new_samples_fx[L2 - 1 - i] ), shift );
    1596   853680960 :                 accu0 = Madd_32_32( synthesisBuffer_fx[i], prod, p_filter_32[i] );                       // Qx -1 + shift
    1597   853680960 :                 accu1 = Madd_32_32( synthesisBuffer_fx[1 * L2 + i], prod, p_filter_32[( 1 * L2 + i )] ); // Qx -1 + shift
    1598   853680960 :                 accu2 = Madd_32_32( synthesisBuffer_fx[2 * L2 + i], prod, p_filter_32[( 2 * L2 + i )] ); // Qx -1 + shift
    1599   853680960 :                 accu3 = Madd_32_32( synthesisBuffer_fx[3 * L2 + i], prod, p_filter_32[( 3 * L2 + i )] ); // Qx -1 + shift
    1600   853680960 :                 accu4 = Madd_32_32( synthesisBuffer_fx[4 * L2 + i], prod, p_filter_32[( 4 * L2 + i )] ); // Qx -1 + shift
    1601             : #else                                                                                                    /* OPT_IVAS_FILTER_ROM */
    1602             :                 Word32 prod = L_shl_sat( Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter_sf ), shift );
    1603             :                 accu0 = Madd_32_16( synthesisBuffer_fx[i], prod, p_filter[i] );                       // Qx -1 + shift
    1604             :                 accu1 = Madd_32_16( synthesisBuffer_fx[1 * L2 + i], prod, p_filter[( 1 * L2 + i )] ); // Qx -1 + shift
    1605             :                 accu2 = Madd_32_16( synthesisBuffer_fx[2 * L2 + i], prod, p_filter[( 2 * L2 + i )] ); // Qx -1 + shift
    1606             :                 accu3 = Madd_32_16( synthesisBuffer_fx[3 * L2 + i], prod, p_filter[( 3 * L2 + i )] ); // Qx -1 + shift
    1607             :                 accu4 = Madd_32_16( synthesisBuffer_fx[4 * L2 + i], prod, p_filter[( 4 * L2 + i )] ); // Qx -1 + shift
    1608             : #endif                                                                                                   /* OPT_IVAS_FILTER_ROM */
    1609             : 
    1610   853680960 :                 synthesisBuffer_fx[i] = accu0;
    1611   853680960 :                 move32();
    1612   853680960 :                 synthesisBuffer_fx[1 * L2 + i] = accu1;
    1613   853680960 :                 move32();
    1614   853680960 :                 synthesisBuffer_fx[2 * L2 + i] = accu2;
    1615   853680960 :                 move32();
    1616   853680960 :                 synthesisBuffer_fx[3 * L2 + i] = accu3;
    1617   853680960 :                 move32();
    1618   853680960 :                 synthesisBuffer_fx[4 * L2 + i] = accu4;
    1619   853680960 :                 move32();
    1620             :             }
    1621             :         }
    1622             : 
    1623    19185431 :         IF( 0 == out_shift )
    1624             :         {
    1625   947033127 :             FOR( i = 0; i < M1; i++ )
    1626             :             {
    1627   928229760 :                 ptr_time_out_fx[( M1 - 1 ) - i] = synthesisBuffer_fx[4 * L2 + M1 + i];
    1628   928229760 :                 move32();
    1629             :             }
    1630             :         }
    1631             :         ELSE
    1632             :         {
    1633    16089264 :             FOR( i = 0; i < M1; i++ )
    1634             :             {
    1635    15707200 :                 ptr_time_out_fx[( M1 - 1 ) - i] = L_shl_sat( synthesisBuffer_fx[4 * L2 + M1 + i], out_shift );
    1636    15707200 :                 move32();
    1637             :             }
    1638             :         }
    1639             : 
    1640    19185431 :         ptr_time_out_fx += M1;
    1641             : 
    1642    19185431 :         synthesisBuffer_fx -= M1;
    1643             : 
    1644    19185431 :         set32_fx( synthesisBuffer_fx, 0, M1 );
    1645             :     }
    1646             : 
    1647             :     /* update memory */
    1648    11634281 :     Copy32( buffer_fx, h_cldfb->cldfb_state_fx, h_cldfb->p_filter_length );
    1649             : 
    1650    11634281 :     return;
    1651             : }
    1652             : 
    1653        9589 : void configureCldfb_ivas_enc_fx(
    1654             :     HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: filter bank handle        */
    1655             :     const Word32 sampling_rate        /* i  : sampling rate             */
    1656             : )
    1657             : {
    1658             : 
    1659        9589 :     h_cldfb->no_col = CLDFB_NO_COL_MAX;
    1660        9589 :     h_cldfb->bandsToZero = 0;
    1661        9589 :     h_cldfb->nab = 0;
    1662             : 
    1663        9589 :     h_cldfb->no_channels = extract_l( Mpy_32_32_r( sampling_rate, INV_CLDFB_BANDWIDTH_Q31 ) );
    1664        9589 :     h_cldfb->p_filter_length = i_mult( 10, h_cldfb->no_channels );
    1665        9589 :     h_cldfb->zeros = 0;
    1666        9589 :     h_cldfb->anaScalefactor = 0;
    1667        9589 :     h_cldfb->synScalefactor = 0;
    1668        9589 :     h_cldfb->filterScale = 1;
    1669        9589 :     cldfb_init_proto_and_twiddles_enc_fx( h_cldfb );
    1670             : 
    1671        9589 :     return;
    1672             : }
    1673       43531 : void configureCldfb_ivas_fx(
    1674             :     HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: filter bank handle        */
    1675             :     const Word32 sampling_rate        /* i  : sampling rate             */
    1676             : )
    1677             : {
    1678             : 
    1679       43531 :     h_cldfb->no_col = CLDFB_NO_COL_MAX;
    1680       43531 :     move16();
    1681       43531 :     h_cldfb->bandsToZero = 0;
    1682       43531 :     move16();
    1683       43531 :     h_cldfb->nab = 0;
    1684       43531 :     move16();
    1685             : 
    1686             :     // h_cldfb->no_channels = (int16_t) ( sampling_rate * INV_CLDFB_BANDWIDTH + 0.5f );
    1687       43531 :     h_cldfb->no_channels = extract_l( Mpy_32_32_r( sampling_rate, INV_CLDFB_BANDWIDTH_Q31 ) );
    1688       43531 :     move16();
    1689       43531 :     h_cldfb->zeros = 0;
    1690       43531 :     move16();
    1691       43531 :     h_cldfb->anaScalefactor = 0;
    1692       43531 :     move16();
    1693       43531 :     h_cldfb->synScalefactor = 0;
    1694       43531 :     move16();
    1695       43531 :     h_cldfb->p_filter_length = i_mult( 10, h_cldfb->no_channels );
    1696       43531 :     move16();
    1697             : 
    1698       43531 :     cldfb_init_proto_and_twiddles( h_cldfb );
    1699             : 
    1700       43531 :     return;
    1701             : }
    1702             : /*-------------------------------------------------------------------*
    1703             :  * openClfdb()
    1704             :  *
    1705             :  * open and configures a CLDFB handle
    1706             :  *--------------------------------------------------------------------*/
    1707       33950 : ivas_error openCldfb_ivas_fx(
    1708             :     HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle                */
    1709             :     CLDFB_TYPE type,                   /* i  : analysis or synthesis             */
    1710             :     const Word32 sampling_rate,        /* i  : sampling rate                     */
    1711             :     CLDFB_PROTOTYPE prototype,         /* i  : CLDFB version (1.25ms/5ms delay)  */
    1712             :     const Word16 enc_dec )             /* i  : encoder/decoder flag            */
    1713             : {
    1714             :     HANDLE_CLDFB_FILTER_BANK hs;
    1715             :     Word16 buf_len;
    1716             : 
    1717       33950 :     IF( ( hs = (HANDLE_CLDFB_FILTER_BANK) malloc( sizeof( CLDFB_FILTER_BANK ) ) ) == NULL )
    1718             :     {
    1719           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" );
    1720             :     }
    1721             : 
    1722       33950 :     hs->type = type;
    1723       33950 :     move32();
    1724       33950 :     hs->prototype = prototype;
    1725       33950 :     move32();
    1726       33950 :     IF( enc_dec == ENC )
    1727             :     {
    1728        9589 :         configureCldfb_ivas_enc_fx( hs, sampling_rate );
    1729        9589 :         hs->Q_cldfb_state = 0;
    1730             :     }
    1731             :     ELSE
    1732             :     {
    1733       24361 :         configureCldfb_ivas_fx( hs, sampling_rate );
    1734       24361 :         hs->Q_cldfb_state = Q11;
    1735             :     }
    1736       33950 :     move16();
    1737       33950 :     hs->memory32 = NULL;
    1738       33950 :     hs->FilterStates = NULL;
    1739       33950 :     hs->memory_length = 0;
    1740       33950 :     move16();
    1741             : 
    1742       33950 :     IF( EQ_32( type, CLDFB_ANALYSIS ) )
    1743             :     {
    1744       16618 :         buf_len = sub( hs->p_filter_length, hs->no_channels );
    1745             :     }
    1746             :     ELSE
    1747             :     {
    1748       17332 :         buf_len = hs->p_filter_length;
    1749       17332 :         move16();
    1750             :     }
    1751             : 
    1752       33950 :     IF( ( hs->cldfb_state_fx = (Word32 *) malloc( buf_len * sizeof( Word32 ) ) ) == NULL )
    1753             :     {
    1754           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" );
    1755             :     }
    1756             : 
    1757       33950 :     hs->cldfb_state_length = buf_len; // Temporarily added to store the length of buffer
    1758       33950 :     move16();
    1759       33950 :     hs->cldfb_size = buf_len; /*for having original size at intermediatery conversion, will be removed on removing conversion*/
    1760       33950 :     move16();
    1761       33950 :     set32_fx( hs->cldfb_state_fx, 0, buf_len );
    1762             : 
    1763       33950 :     *h_cldfb = hs;
    1764       33950 :     move16();
    1765             : 
    1766       33950 :     return IVAS_ERR_OK;
    1767             : }
    1768             : 
    1769             : /*-------------------------------------------------------------------*
    1770             :  * resampleCldfb_ivas()
    1771             :  *
    1772             :  * Change sample rate of filter bank
    1773             :  *--------------------------------------------------------------------*/
    1774       13558 : void resampleCldfb_ivas_fx(
    1775             :     HANDLE_CLDFB_FILTER_BANK hs, /* i/o: filter bank handle  */
    1776             :     const Word32 newSamplerate )
    1777             : {
    1778             :     Word16 timeOffset;
    1779             : 
    1780             :     /* keep old parameters before switching*/
    1781       13558 :     Word16 timeOffsetold = sub( hs->p_filter_length, hs->no_channels );
    1782             : 
    1783             :     /* new settings */
    1784       13558 :     configureCldfb_ivas_fx( hs, newSamplerate );
    1785             : 
    1786       13558 :     timeOffset = sub( hs->p_filter_length, hs->no_channels );
    1787             : 
    1788             :     /*low complexity-resampling only stored previous samples that are needed for next frame modulation */
    1789       13558 :     L_lerp_fx_q11( hs->cldfb_state_fx, hs->cldfb_state_fx, timeOffset, timeOffsetold );
    1790             : 
    1791       13558 :     return;
    1792             : }
    1793             : 
    1794      394300 : static void GetEnergyCldfb_ivas_fx( Word32 *energyLookahead,     /*!< o: Q(*sf_energyLookahead) |   pointer to the result in the core look-ahead slot */
    1795             :                                     Word16 *sf_energyLookahead,  /*!< o:         pointer to the scalefactor of the result in the core look-ahead slot  */
    1796             :                                     const Word16 numLookahead,   /*!< i: Q0      the number of look-ahead time-slots */
    1797             :                                     Word16 **realValues,         /*!< i: Q(sf_Values) |   the real part of the CLDFB subsamples */
    1798             :                                     Word16 **imagValues,         /*!< i: Q(sf_Values) |   the imaginary part of the CLDFB subsamples */
    1799             :                                     Word16 sf_Values,            /*!< i:         scalefactor of the CLDFB subcamples - apply as a negated Exponent */
    1800             :                                     Word16 numberBands,          /*!< i: Q0  |   number of CLDFB bands */
    1801             :                                     Word16 numberCols,           /*!< i: Q0  |   number of CLDFB subsamples */
    1802             :                                     Word32 *energyHF,            /*!< o: Q31 |   pointer to HF energy */
    1803             :                                     Word16 *energyHF_Exp,        /*!< o:         pointer to exponent of HF energy */
    1804             :                                     Word32 *energyValuesSum,     /*!< o: Q(2*sf_Values-4) |   pointer to sum array of energy values, not initialized*/
    1805             :                                     Word16 *energyValuesSum_Exp, /*!< o:         pointer to exponents of energyValuesSum, not initialized */
    1806             :                                     TEC_ENC_HANDLE hTecEnc )
    1807             : {
    1808             :     Word16 j;
    1809             :     Word16 k;
    1810             :     Word16 s;
    1811             :     Word16 sm;
    1812             :     Word32 nrg;
    1813             :     Word16 numberColsL;
    1814             :     Word16 numberBandsM;
    1815             :     Word16 numberBandsM20;
    1816             :     Word32 energyValues[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
    1817             :     Word16 energyValuesSumE[CLDFB_NO_CHANNELS_MAX];
    1818             :     // Word16 freqTable[2] = {20, 40};
    1819             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
    1820      394300 :     Flag Overflow = 0;
    1821      394300 :     move32();
    1822             : #endif
    1823             : 
    1824     6703100 :     FOR( k = 0; k < numberCols; k++ )
    1825             :     {
    1826   361644800 :         FOR( j = 0; j < numberBands; j++ )
    1827             :         {
    1828   355336000 :             nrg = L_mult0( realValues[k][j], realValues[k][j] );     // Q(2*sf_Values)
    1829   355336000 :             nrg = L_mac0( nrg, imagValues[k][j], imagValues[k][j] ); // Q(2*sf_Values)
    1830             : 
    1831   355336000 :             energyValues[k][j] = nrg;
    1832   355336000 :             move32();
    1833             :         }
    1834             :     }
    1835             : 
    1836      394300 :     IF( GE_16( numberBands, freqTable[1] ) && hTecEnc != NULL )
    1837             :     {
    1838             :         Word32 *tempEnergyValuesArry[CLDFB_NO_COL_MAX];
    1839             :         Word16 ScaleX2;
    1840           0 :         assert( numberCols == CLDFB_NO_COL_MAX );
    1841           0 :         FOR( j = 0; j < numberCols; j++ )
    1842             :         {
    1843           0 :             tempEnergyValuesArry[j] = &energyValues[j][0];
    1844             :         }
    1845             : 
    1846           0 :         ScaleX2 = shl( sf_Values, 1 );
    1847           0 :         calcHiEnvLoBuff_Fix(
    1848             :             numberCols,
    1849             :             freqTable,
    1850             :             1,
    1851             :             tempEnergyValuesArry,
    1852           0 :             hTecEnc->loBuffer,
    1853           0 :             hTecEnc->hiTempEnv,
    1854             :             ScaleX2 );
    1855             :     }
    1856             : 
    1857    22602800 :     FOR( j = 0; j < numberBands; j++ )
    1858             :     {
    1859    22208500 :         energyValuesSum[j] = 0;
    1860    22208500 :         move32();
    1861    22208500 :         energyValuesSumE[j] = 31;
    1862    22208500 :         move16();
    1863   377544500 :         FOR( k = 0; k < CLDFB_NO_COL_MAX; k++ )
    1864             :         {
    1865   355336000 :             nrg = L_shr_r( energyValues[k][j], sub( energyValuesSumE[j], 31 ) ); // Q(2*sf_Values - (energyValuesSumE[j]-31))
    1866   355336000 :             IF( LT_32( L_sub( maxWord32, nrg ), energyValuesSum[j] ) )
    1867             :             {
    1868      976555 :                 energyValuesSumE[j] = add( energyValuesSumE[j], 1 );
    1869      976555 :                 move16();
    1870      976555 :                 energyValuesSum[j] = L_shr_r( energyValuesSum[j], 1 );
    1871      976555 :                 move32();
    1872      976555 :                 nrg = L_shr_r( nrg, 1 );
    1873             :             }
    1874   355336000 :             energyValuesSum[j] = L_add( energyValuesSum[j], nrg );
    1875   355336000 :             move32();
    1876             :         }
    1877    22208500 :         test();
    1878    22208500 :         if ( j == 0 || GT_16( energyValuesSumE[j], *energyValuesSum_Exp ) )
    1879             :         {
    1880      464161 :             *energyValuesSum_Exp = energyValuesSumE[j];
    1881      464161 :             move16();
    1882             :         }
    1883             :     }
    1884    22602800 :     FOR( j = 0; j < numberBands; j++ )
    1885             :     {
    1886    22208500 :         energyValuesSum[j] = L_shr_r( energyValuesSum[j], sub( *energyValuesSum_Exp, energyValuesSumE[j] ) ); // Q(energyValuesSum_Exp - (2*sf_Values))
    1887    22208500 :         move32();
    1888             :     }
    1889      394300 :     *energyValuesSum_Exp = sub( *energyValuesSum_Exp, shl( sf_Values, 1 ) );
    1890      394300 :     move16();
    1891             : 
    1892      394300 :     IF( GT_16( numberBands, 20 ) )
    1893             :     {
    1894      378304 :         numberBandsM = s_min( numberBands, 40 );
    1895      378304 :         numberBandsM20 = sub( numberBandsM, 20 );
    1896             : 
    1897      378304 :         numberColsL = sub( numberCols, numLookahead );
    1898             : 
    1899             :         /* sum up CLDFB energy above 8 kHz */
    1900      378304 :         s = BASOP_util_norm_s_bands2shift( i_mult( numberColsL, numberBandsM20 ) );
    1901      378304 :         s = sub( s, 4 );
    1902      378304 :         nrg = 0;
    1903      378304 :         move32();
    1904     6052864 :         FOR( k = 0; k < numberColsL; k++ )
    1905             :         {
    1906   119165760 :             FOR( j = 20; j < numberBandsM; j++ )
    1907             :             {
    1908   113491200 :                 nrg = L_add_o( nrg, L_shr_o( energyValues[k][j], s, &Overflow ), &Overflow );
    1909             :             }
    1910             :         }
    1911             : 
    1912      378304 :         s = sub( sub( shl( sf_Values, 1 ), 1 ), s );
    1913      378304 :         sm = sub( s_min( s, *sf_energyLookahead ), 1 );
    1914             : 
    1915      378304 :         *energyHF = L_add( L_shr( nrg, limitScale32( sub( s, sm ) ) ),
    1916      378304 :                            L_shr( *energyLookahead, sub( *sf_energyLookahead, sm ) ) ); // Q(31-(-nm))
    1917      378304 :         move32();
    1918             : 
    1919      378304 :         *energyHF_Exp = negate( sm );
    1920      378304 :         move16();
    1921             : 
    1922             :         /* process look-ahead region */
    1923      378304 :         s = BASOP_util_norm_s_bands2shift( i_mult( numLookahead, numberBandsM20 ) );
    1924      378304 :         s = sub( s, 2 );
    1925      378304 :         nrg = 0;
    1926      378304 :         move32();
    1927      756608 :         FOR( k = numberColsL; k < numberCols; k++ )
    1928             :         {
    1929     7944384 :             FOR( j = 20; j < numberBandsM; j++ )
    1930             :             {
    1931     7566080 :                 nrg = L_add_o( nrg, L_shr_o( energyValues[k][j], s, &Overflow ), &Overflow );
    1932             :             }
    1933             :         }
    1934             : 
    1935      378304 :         s = sub( shl( sf_Values, 1 ), s );
    1936      378304 :         sm = sub( s_min( s, 44 ), 1 );
    1937             :         BASOP_SATURATE_WARNING_OFF_EVS
    1938             :         /* nrg + 6.1e-5f => value 0x40000000, scale 44 */
    1939      378304 :         *energyLookahead = L_add_sat( L_shr_sat( nrg, sub( s, sm ) ),
    1940      378304 :                                       L_shr_sat( 0x40000000, s_max( -31, s_min( 31, sub( 44, sm ) ) ) ) );
    1941      378304 :         move32();
    1942             :         BASOP_SATURATE_WARNING_ON_EVS
    1943      378304 :         *sf_energyLookahead = sm;
    1944      378304 :         move16();
    1945             : 
    1946      378304 :         return;
    1947             :     }
    1948             : 
    1949             : 
    1950       15996 :     *energyHF = 0x40000000;
    1951       15996 :     move32();
    1952       15996 :     *energyHF_Exp = 17;
    1953       15996 :     move16();
    1954             : }
    1955             : 
    1956             : 
    1957      394300 : void analysisCldfbEncoder_ivas_fx(
    1958             :     Encoder_State *st, /* i/o: encoder state structure   */
    1959             :     Word32 *timeIn,    /*q11*/
    1960             :     Word16 timeInq,
    1961             :     Word16 samplesToProcess,
    1962             :     Word32 realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],   // Q(scale.lb_scale)
    1963             :     Word32 imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],   // Q(scale.lb_scale)
    1964             :     Word16 realBuffer16[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], // Q15
    1965             :     Word16 imagBuffer16[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], // Q15
    1966             :     Word32 *ppBuf_Ener,                                           // Q(31-enerBuffSum_exp)
    1967             :     Word16 *enerBuffSum_exp,
    1968             :     CLDFB_SCALE_FACTOR *scale )
    1969             : {
    1970             :     Word16 i;
    1971             :     CLDFB_SCALE_FACTOR enerScale;
    1972             :     Word32 *ppBuf_Real[CLDFB_NO_COL_MAX];
    1973             :     Word32 *ppBuf_Imag[CLDFB_NO_COL_MAX];
    1974             :     Word16 *ppBuf_Real16[CLDFB_NO_COL_MAX];
    1975             :     Word16 *ppBuf_Imag16[CLDFB_NO_COL_MAX];
    1976             :     Word32 l_timeIn[L_FRAME48k];
    1977      394300 :     Word16 norm_timeIn = s_min( L_norm_arr( timeIn, samplesToProcess ), L_norm_arr( st->cldfbAnaEnc->cldfb_state_fx, sub( st->cldfbAnaEnc->p_filter_length, st->cldfbAnaEnc->no_channels ) ) );
    1978      394300 :     Word16 guard_bits = find_guarded_bits_fx( shl( samplesToProcess, 1 ) );
    1979      394300 :     Word16 shift = 0;
    1980      394300 :     move16();
    1981             : 
    1982     6703100 :     FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ )
    1983             :     {
    1984     6308800 :         ppBuf_Real[i] = &realBuffer[i][0];
    1985     6308800 :         ppBuf_Imag[i] = &imagBuffer[i][0];
    1986     6308800 :         ppBuf_Real16[i] = &realBuffer16[i][0];
    1987     6308800 :         ppBuf_Imag16[i] = &imagBuffer16[i][0];
    1988             :     }
    1989      394300 :     IF( GT_16( guard_bits, norm_timeIn ) )
    1990             :     {
    1991      305750 :         shift = sub( guard_bits, norm_timeIn );
    1992      305750 :         v_shr_32( timeIn, l_timeIn, samplesToProcess, shift );
    1993      305750 :         scale_sig32( st->cldfbAnaEnc->cldfb_state_fx, sub( st->cldfbAnaEnc->p_filter_length, st->cldfbAnaEnc->no_channels ), negate( shift ) );
    1994             :     }
    1995             :     ELSE
    1996             :     {
    1997       88550 :         Copy32( timeIn, l_timeIn, samplesToProcess );
    1998             :     }
    1999             : 
    2000      394300 :     cldfbAnalysis_ivas_fx( l_timeIn, ppBuf_Real, ppBuf_Imag, samplesToProcess, st->cldfbAnaEnc );
    2001             : 
    2002      394300 :     IF( GT_16( guard_bits, norm_timeIn ) )
    2003             :     {
    2004      305750 :         shift = sub( guard_bits, norm_timeIn );
    2005      305750 :         scale_sig32( st->cldfbAnaEnc->cldfb_state_fx, sub( st->cldfbAnaEnc->p_filter_length, st->cldfbAnaEnc->no_channels ), shift );
    2006             :     }
    2007             : 
    2008      394300 :     scale->lb_scale = sub( Q31, sub( sub( timeInq, shift ), Q5 ) );
    2009      394300 :     enerScale.lb_scale = negate( scale->lb_scale );
    2010      394300 :     enerScale.lb_scale16 = sub( Q15, scale->lb_scale );
    2011      394300 :     move16();
    2012      394300 :     move16();
    2013      394300 :     move16();
    2014             : 
    2015      394300 :     AnalysisPostSpectrumScaling_Fx( st->cldfbAnaEnc, ppBuf_Real, ppBuf_Imag, ppBuf_Real16, ppBuf_Imag16, &enerScale.lb_scale16 );
    2016             : 
    2017      394300 :     GetEnergyCldfb_ivas_fx( &st->energyCoreLookahead_Fx, &st->sf_energyCoreLookahead_Fx, 1, ppBuf_Real16, ppBuf_Imag16, enerScale.lb_scale16, st->cldfbAnaEnc->no_channels, st->cldfbAnaEnc->no_col, &st->currEnergyHF_fx, &st->currEnergyHF_e_fx, ppBuf_Ener, enerBuffSum_exp, st->hTECEnc );
    2018             : 
    2019      394300 :     return;
    2020             : }
    2021             : 
    2022       62326 : void deleteCldfb_ivas_fx(
    2023             :     HANDLE_CLDFB_FILTER_BANK *h_cldfb /* i/o: filter bank handle  */
    2024             : )
    2025             : {
    2026       62326 :     HANDLE_CLDFB_FILTER_BANK hs = *h_cldfb;
    2027             : 
    2028       62326 :     test();
    2029       62326 :     IF( h_cldfb == NULL || *h_cldfb == NULL )
    2030             :     {
    2031       28376 :         return;
    2032             :     }
    2033             : 
    2034       33950 :     IF( hs->cldfb_state_fx )
    2035             :     {
    2036       33950 :         free( hs->cldfb_state_fx );
    2037             :     }
    2038             : 
    2039       33950 :     IF( hs->FilterStates )
    2040             :     {
    2041           0 :         free( hs->FilterStates );
    2042             :     }
    2043             : 
    2044       33950 :     free( hs );
    2045       33950 :     *h_cldfb = NULL;
    2046             : 
    2047       33950 :     return;
    2048             : }
    2049             : 
    2050             : 
    2051             : /*-------------------------------------------------------------------*
    2052             :  * cldfb_init_proto_and_twiddles()
    2053             :  *
    2054             :  * Initializes rom pointer
    2055             :  *--------------------------------------------------------------------*/
    2056             : 
    2057       43531 : static void cldfb_init_proto_and_twiddles(
    2058             :     HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle  */
    2059             : )
    2060             : {
    2061             :     /*find appropriate set of rotVecs*/
    2062       43531 :     SWITCH( hs->no_channels )
    2063             :     {
    2064           0 :         case 10:
    2065           0 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L10_fx;
    2066           0 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L10_fx;
    2067           0 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L10_fx;
    2068           0 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L10_fx;
    2069           0 :             IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    2070             :             {
    2071           0 :                 hs->ds = 10;
    2072           0 :                 hs->da = 10;
    2073           0 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2074           0 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2075           0 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2076           0 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2077             : #ifdef OPT_IVAS_FILTER_ROM
    2078           0 :                 hs->p_filter_32 = CLDFB80_10_fx;
    2079             : #else  /* OPT_IVAS_FILTER_ROM */
    2080             :                 hs->p_filter_sf = (Word16) 17036;                                                     // Q14
    2081             :                 hs->p_filter = CLDFB80_10_fx;
    2082             : #endif /* OPT_IVAS_FILTER_ROM */
    2083           0 :                 hs->scale = CLDFB80_10_SCALE_FX_Q8;
    2084             :             }
    2085           0 :             ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2086             :             {
    2087           0 :                 hs->ds = 40;
    2088           0 :                 hs->da = -20;
    2089           0 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2090           0 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2091           0 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2092           0 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2093             : #ifdef OPT_IVAS_FILTER_ROM
    2094           0 :                 hs->p_filter_32 = LDQMF_10_fx;
    2095             : #else  /* OPT_IVAS_FILTER_ROM */
    2096             :                 hs->p_filter_sf = (Word16) 15388; // Q14
    2097             :                 hs->p_filter = LDQMF_10_fx;
    2098             : #endif /* OPT_IVAS_FILTER_ROM */
    2099           0 :                 hs->scale = LDQMF_10_SCALE_FX_Q8;
    2100             :             }
    2101           0 :             BREAK;
    2102             : 
    2103        8134 :         case 16:
    2104        8134 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L16_fx;
    2105        8134 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L16_fx;
    2106        8134 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L16_fx;
    2107        8134 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L16_fx;
    2108        8134 :             IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    2109             :             {
    2110        8014 :                 hs->ds = 20;
    2111        8014 :                 hs->da = 20;
    2112        8014 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2113        8014 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2114        8014 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2115        8014 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2116             : #ifdef OPT_IVAS_FILTER_ROM
    2117        8014 :                 hs->p_filter_32 = CLDFB80_16_fx;
    2118             : #else  /* OPT_IVAS_FILTER_ROM */
    2119             :                 hs->p_filter_sf = (Word16) 17051; // Q14
    2120             :                 hs->p_filter = CLDFB80_16_fx;
    2121             : #endif /* OPT_IVAS_FILTER_ROM */
    2122        8014 :                 hs->scale = CLDFB80_16_SCALE_FX_Q8;
    2123             :             }
    2124         120 :             ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2125             :             {
    2126         120 :                 hs->ds = 80;
    2127         120 :                 hs->da = -40;
    2128         120 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2129         120 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2130         120 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2131         120 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2132             : #ifdef OPT_IVAS_FILTER_ROM
    2133         120 :                 hs->p_filter_32 = LDQMF_16_fx;
    2134             : #else  /* OPT_IVAS_FILTER_ROM */
    2135             :                 hs->p_filter_sf = (Word16) 15388; // Q14
    2136             :                 hs->p_filter = LDQMF_16_fx;
    2137             : #endif /* OPT_IVAS_FILTER_ROM */
    2138         120 :                 hs->scale = LDQMF_16_SCALE_FX_Q8;
    2139             :             }
    2140        8134 :             BREAK;
    2141             : 
    2142       12344 :         case 20:
    2143       12344 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L20_fx;
    2144       12344 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L20_fx;
    2145       12344 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L20_fx;
    2146       12344 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L20_fx;
    2147       12344 :             IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    2148             :             {
    2149       11103 :                 hs->ds = 20;
    2150       11103 :                 hs->da = 20;
    2151       11103 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2152       11103 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2153       11103 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2154       11103 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2155             : #ifdef OPT_IVAS_FILTER_ROM
    2156       11103 :                 hs->p_filter_32 = CLDFB80_20_fx;
    2157             : #else  /* OPT_IVAS_FILTER_ROM */
    2158             :                 hs->p_filter_sf = (Word16) 17050; // Q14
    2159             :                 hs->p_filter = CLDFB80_20_fx;
    2160             : #endif /* OPT_IVAS_FILTER_ROM */
    2161       11103 :                 hs->scale = CLDFB80_20_SCALE_FX_Q8;
    2162             :             }
    2163        1241 :             ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2164             :             {
    2165        1241 :                 hs->ds = 80;
    2166        1241 :                 hs->da = -40;
    2167        1241 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2168        1241 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2169        1241 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2170        1241 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2171             : #ifdef OPT_IVAS_FILTER_ROM
    2172        1241 :                 hs->p_filter_32 = LDQMF_20_fx;
    2173             : #else  /* OPT_IVAS_FILTER_ROM */
    2174             :                 hs->p_filter_sf = (Word16) 15390; // Q14
    2175             :                 hs->p_filter = LDQMF_20_fx;
    2176             : #endif /* OPT_IVAS_FILTER_ROM */
    2177        1241 :                 hs->scale = LDQMF_20_SCALE_FX_Q8;
    2178             :             }
    2179       12344 :             BREAK;
    2180             : 
    2181           0 :         case 30:
    2182           0 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L30_fx;
    2183           0 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L30_fx;
    2184           0 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L30_fx;
    2185           0 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L30_fx;
    2186           0 :             IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    2187             :             {
    2188           0 :                 hs->ds = 30;
    2189           0 :                 hs->da = 30;
    2190           0 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2191           0 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2192           0 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2193           0 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2194             : #ifdef OPT_IVAS_FILTER_ROM
    2195           0 :                 hs->p_filter_32 = CLDFB80_30_fx;
    2196             : #else  /* OPT_IVAS_FILTER_ROM */
    2197             :                 hs->p_filter_sf = (Word16) 17051; // Q14
    2198             :                 hs->p_filter = CLDFB80_30_fx;
    2199             : #endif /* OPT_IVAS_FILTER_ROM */
    2200           0 :                 hs->scale = CLDFB80_30_SCALE_FX_Q8;
    2201             :             }
    2202           0 :             ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2203             :             {
    2204           0 :                 hs->ds = 120;
    2205           0 :                 hs->da = -60;
    2206           0 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2207           0 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2208           0 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2209           0 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2210             : #ifdef OPT_IVAS_FILTER_ROM
    2211           0 :                 hs->p_filter_32 = LDQMF_30_fx;
    2212             : #else  /* OPT_IVAS_FILTER_ROM */
    2213             :                 hs->p_filter_sf = (Word16) 15388; // Q14
    2214             :                 hs->p_filter = LDQMF_30_fx;
    2215             : #endif /* OPT_IVAS_FILTER_ROM */
    2216           0 :                 hs->scale = LDQMF_30_SCALE_FX_Q8;
    2217             :             }
    2218           0 :             BREAK;
    2219             : 
    2220        1640 :         case 32:
    2221        1640 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L32_fx;
    2222        1640 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L32_fx;
    2223        1640 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L32_fx;
    2224        1640 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L32_fx;
    2225        1640 :             IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    2226             :             {
    2227        1640 :                 hs->ds = 32;
    2228        1640 :                 hs->da = 32;
    2229        1640 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2230        1640 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2231        1640 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2232        1640 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2233             : #ifdef OPT_IVAS_FILTER_ROM
    2234        1640 :                 hs->p_filter_32 = CLDFB80_32_fx;
    2235             : #else  /* OPT_IVAS_FILTER_ROM */
    2236             :                 hs->p_filter_sf = (Word16) 17050; // Q14
    2237             :                 hs->p_filter = CLDFB80_32_fx;
    2238             : #endif /* OPT_IVAS_FILTER_ROM */
    2239        1640 :                 hs->scale = CLDFB80_32_SCALE_FX_Q8;
    2240             :             }
    2241           0 :             ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2242             :             {
    2243           0 :                 hs->ds = 160;
    2244           0 :                 hs->da = -80;
    2245           0 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2246           0 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2247           0 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2248           0 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2249             : #ifdef OPT_IVAS_FILTER_ROM
    2250           0 :                 hs->p_filter_32 = LDQMF_32_fx;
    2251             : #else  /* OPT_IVAS_FILTER_ROM */
    2252             :                 hs->p_filter_sf = (Word16) 15392; // Q14
    2253             :                 hs->p_filter = LDQMF_32_fx;
    2254             : #endif /* OPT_IVAS_FILTER_ROM */
    2255           0 :                 hs->scale = LDQMF_32_SCALE_FX_Q8;
    2256             :             }
    2257        1640 :             BREAK;
    2258             : 
    2259        4925 :         case 40:
    2260        4925 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L40_fx;
    2261        4925 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L40_fx;
    2262        4925 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L40_fx;
    2263        4925 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L40_fx;
    2264        4925 :             IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    2265             :             {
    2266        2785 :                 hs->ds = 40;
    2267        2785 :                 hs->da = 40;
    2268        2785 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2269        2785 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2270        2785 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2271        2785 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2272             : #ifdef OPT_IVAS_FILTER_ROM
    2273        2785 :                 hs->p_filter_32 = CLDFB80_40_fx;
    2274             : #else  /* OPT_IVAS_FILTER_ROM */
    2275             :                 hs->p_filter_sf = (Word16) 17051; // Q14
    2276             :                 hs->p_filter = CLDFB80_40_fx;
    2277             : #endif /* OPT_IVAS_FILTER_ROM */
    2278        2785 :                 hs->scale = CLDFB80_40_SCALE_FX_Q8;
    2279             :             }
    2280        2140 :             ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2281             :             {
    2282        2140 :                 hs->ds = 160;
    2283        2140 :                 hs->da = -80;
    2284        2140 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2285        2140 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2286        2140 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2287        2140 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2288             : #ifdef OPT_IVAS_FILTER_ROM
    2289        2140 :                 hs->p_filter_32 = LDQMF_40_fx;
    2290             : #else  /* OPT_IVAS_FILTER_ROM */
    2291             :                 hs->p_filter_sf = (Word16) 15391; // Q14
    2292             :                 hs->p_filter = LDQMF_40_fx;
    2293             : #endif /* OPT_IVAS_FILTER_ROM */
    2294        2140 :                 hs->scale = LDQMF_40_SCALE_FX_Q8;
    2295             :             }
    2296        4925 :             BREAK;
    2297             : 
    2298       16488 :         case 60:
    2299       16488 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L60_fx;
    2300       16488 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L60_fx;
    2301       16488 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L60_fx;
    2302       16488 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L60_fx;
    2303       16488 :             IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    2304             :             {
    2305        8547 :                 hs->ds = 60;
    2306        8547 :                 hs->da = 60;
    2307        8547 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2308        8547 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2309        8547 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2310        8547 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2311             : #ifdef OPT_IVAS_FILTER_ROM
    2312        8547 :                 hs->p_filter_32 = CLDFB80_60_fx;
    2313             : #else  /* OPT_IVAS_FILTER_ROM */
    2314             :                 hs->p_filter_sf = (Word16) 17051; // Q14
    2315             :                 hs->p_filter = CLDFB80_60_fx;
    2316             : #endif /* OPT_IVAS_FILTER_ROM */
    2317        8547 :                 hs->scale = CLDFB80_60_SCALE_FX_Q8;
    2318             :             }
    2319        7941 :             ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2320             :             {
    2321        7941 :                 hs->ds = 240;
    2322        7941 :                 hs->da = -120;
    2323        7941 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2324        7941 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2325        7941 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2326        7941 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2327             : #ifdef OPT_IVAS_FILTER_ROM
    2328        7941 :                 hs->p_filter_32 = LDQMF_60_fx;
    2329             : #else  /* OPT_IVAS_FILTER_ROM */
    2330             :                 hs->p_filter_sf = (Word16) 15391; // Q14
    2331             :                 hs->p_filter = LDQMF_60_fx;
    2332             : #endif /* OPT_IVAS_FILTER_ROM */
    2333        7941 :                 hs->scale = LDQMF_60_SCALE_FX_Q8;
    2334             :             }
    2335       16488 :             BREAK;
    2336             :     }
    2337       43531 :     move16();
    2338       43531 :     move16();
    2339       43531 :     move16();
    2340       43531 :     move16();
    2341             : 
    2342       43531 :     return;
    2343             : }
    2344             : 
    2345        9589 : static void cldfb_init_proto_and_twiddles_enc_fx(
    2346             :     HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle  */
    2347             : )
    2348             : {
    2349             :     /*find appropriate set of rotVecs*/
    2350        9589 :     SWITCH( hs->no_channels )
    2351             :     {
    2352           0 :         case 10:
    2353           0 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L10_fx;
    2354           0 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L10_fx;
    2355           0 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L10_fx;
    2356           0 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L10_fx;
    2357           0 :             hs->rRotVctr = rRotVectr_10;
    2358           0 :             hs->iRotVctr = iRotVectr_10;
    2359           0 :             IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) )
    2360             :             {
    2361           0 :                 hs->synScalefactor = add( cldfb_synScale[0], hs->filterScale );
    2362           0 :                 move16();
    2363             :             }
    2364             :             ELSE
    2365             :             {
    2366           0 :                 hs->anaScalefactor = add( cldfb_anaScale[0], hs->filterScale );
    2367           0 :                 move16();
    2368             :             }
    2369           0 :             IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
    2370             :             {
    2371           0 :                 hs->ds = 10;
    2372           0 :                 hs->da = 10;
    2373           0 :                 move16();
    2374           0 :                 move16();
    2375           0 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2376           0 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2377           0 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2378           0 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2379           0 :                 hs->scale = cldfb_scale_2_5ms[0];
    2380           0 :                 move16();
    2381           0 :                 move16();
    2382             : #ifdef OPT_IVAS_FILTER_ROM
    2383           0 :                 hs->p_filter_32 = CLDFB80_10_fx;
    2384             : #else  /* OPT_IVAS_FILTER_ROM */
    2385             :                 hs->p_filter_sf = (Word16) 17036; // Q14
    2386             :                 hs->p_filter = CLDFB80_10_fx;
    2387             : #endif /* OPT_IVAS_FILTER_ROM */
    2388             :             }
    2389           0 :             ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2390             :             {
    2391           0 :                 hs->ds = 40;
    2392           0 :                 hs->da = -20;
    2393           0 :                 move16();
    2394           0 :                 move16();
    2395           0 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2396           0 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2397           0 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2398           0 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2399             : #ifdef OPT_IVAS_FILTER_ROM
    2400           0 :                 hs->p_filter_32 = LDQMF_10_fx;
    2401             : #else  /* OPT_IVAS_FILTER_ROM */
    2402             :                 hs->p_filter_sf = (Word16) 15388; // Q14
    2403             :                 hs->p_filter = LDQMF_10_fx;
    2404             : #endif /* OPT_IVAS_FILTER_ROM */
    2405           0 :                 hs->scale = cldfb_scale_5_0ms[0];
    2406           0 :                 move16();
    2407           0 :                 move16();
    2408             :             }
    2409           0 :             BREAK;
    2410             : 
    2411           0 :         case 16:
    2412           0 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L16_fx;
    2413           0 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L16_fx;
    2414           0 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L16_fx;
    2415           0 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L16_fx;
    2416           0 :             hs->rRotVctr = rRotVectr_16;
    2417           0 :             hs->iRotVctr = iRotVectr_16;
    2418             :             {
    2419           0 :                 hs->anaScalefactor = add( cldfb_anaScale[1], hs->filterScale );
    2420           0 :                 move16();
    2421             :             }
    2422           0 :             IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
    2423             :             {
    2424           0 :                 hs->ds = 20;
    2425           0 :                 hs->da = 20;
    2426           0 :                 move16();
    2427           0 :                 move16();
    2428           0 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2429           0 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2430           0 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2431           0 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2432             : #ifdef OPT_IVAS_FILTER_ROM
    2433           0 :                 hs->p_filter_32 = CLDFB80_16_fx;
    2434             : #else  /* OPT_IVAS_FILTER_ROM */
    2435             :                 hs->p_filter_sf = (Word16) 17051; // Q14
    2436             :                 hs->p_filter = CLDFB80_16_fx;
    2437             : #endif /* OPT_IVAS_FILTER_ROM */
    2438           0 :                 hs->scale = cldfb_scale_2_5ms[1];
    2439           0 :                 move16();
    2440           0 :                 move16();
    2441             :             }
    2442           0 :             ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2443             :             {
    2444           0 :                 hs->ds = 80;
    2445           0 :                 hs->da = -40;
    2446           0 :                 move16();
    2447           0 :                 move16();
    2448           0 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2449           0 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2450           0 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2451           0 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2452             : #ifdef OPT_IVAS_FILTER_ROM
    2453           0 :                 hs->p_filter_32 = LDQMF_16_fx;
    2454             : #else  /* OPT_IVAS_FILTER_ROM */
    2455             :                 hs->p_filter_sf = (Word16) 15388; // Q14
    2456             :                 hs->p_filter = LDQMF_16_fx;
    2457             : #endif /* OPT_IVAS_FILTER_ROM */
    2458           0 :                 hs->scale = cldfb_scale_5_0ms[1];
    2459           0 :                 move16();
    2460           0 :                 move16();
    2461             :             }
    2462           0 :             BREAK;
    2463             : 
    2464        3915 :         case 20:
    2465             : 
    2466        3915 :             hs->rRotVctr = rRotVectr_20;
    2467        3915 :             hs->iRotVctr = iRotVectr_20;
    2468        3915 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L20_fx;
    2469        3915 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L20_fx;
    2470        3915 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L20_fx;
    2471        3915 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L20_fx;
    2472        3915 :             IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) )
    2473             :             {
    2474        3850 :                 hs->synScalefactor = add( cldfb_synScale[2], hs->filterScale );
    2475        3850 :                 move16();
    2476             :             }
    2477             :             ELSE
    2478             :             {
    2479          65 :                 hs->anaScalefactor = add( cldfb_anaScale[2], hs->filterScale );
    2480          65 :                 move16();
    2481             :             }
    2482        3915 :             IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
    2483             :             {
    2484        3907 :                 hs->ds = 20;
    2485        3907 :                 hs->da = 20;
    2486        3907 :                 move16();
    2487        3907 :                 move16();
    2488        3907 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2489        3907 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2490        3907 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2491        3907 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2492             : #ifdef OPT_IVAS_FILTER_ROM
    2493        3907 :                 hs->p_filter_32 = CLDFB80_20_fx;
    2494             : #else  /* OPT_IVAS_FILTER_ROM */
    2495             :                 hs->p_filter_sf = (Word16) 17050; // Q14
    2496             :                 hs->p_filter = CLDFB80_20_fx;
    2497             : #endif /* OPT_IVAS_FILTER_ROM */
    2498        3907 :                 hs->scale = cldfb_scale_2_5ms[2];
    2499        3907 :                 move16();
    2500        3907 :                 move16();
    2501             :             }
    2502           8 :             ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2503             :             {
    2504           8 :                 hs->ds = 80;
    2505           8 :                 hs->da = -40;
    2506           8 :                 move16();
    2507           8 :                 move16();
    2508           8 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2509           8 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2510           8 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2511           8 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2512             : #ifdef OPT_IVAS_FILTER_ROM
    2513           8 :                 hs->p_filter_32 = LDQMF_20_fx;
    2514             : #else  /* OPT_IVAS_FILTER_ROM */
    2515             :                 hs->p_filter_sf = (Word16) 15390; // Q14
    2516             :                 hs->p_filter = LDQMF_20_fx;
    2517             : #endif /* OPT_IVAS_FILTER_ROM */
    2518           8 :                 hs->scale = cldfb_scale_5_0ms[2];
    2519           8 :                 move16();
    2520           8 :                 move16();
    2521             :             }
    2522        3915 :             BREAK;
    2523             : 
    2524           0 :         case 30:
    2525           0 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L30_fx;
    2526           0 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L30_fx;
    2527           0 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L30_fx;
    2528           0 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L30_fx;
    2529           0 :             hs->rRotVctr = rRotVectr_30;
    2530           0 :             hs->iRotVctr = iRotVectr_30;
    2531           0 :             IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) )
    2532             :             {
    2533           0 :                 hs->synScalefactor = add( cldfb_synScale[6], hs->filterScale );
    2534           0 :                 move16();
    2535             :             }
    2536             :             ELSE
    2537             :             {
    2538           0 :                 hs->anaScalefactor = add( cldfb_anaScale[6], hs->filterScale );
    2539           0 :                 move16();
    2540             :             }
    2541           0 :             IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
    2542             :             {
    2543           0 :                 hs->ds = 30;
    2544           0 :                 hs->da = 30;
    2545           0 :                 move16();
    2546           0 :                 move16();
    2547           0 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2548           0 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2549           0 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2550           0 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2551           0 :                 hs->scale = cldfb_scale_2_5ms[6];
    2552             : #ifdef OPT_IVAS_FILTER_ROM
    2553           0 :                 hs->p_filter_32 = CLDFB80_30_fx;
    2554             : #else  /* OPT_IVAS_FILTER_ROM */
    2555             :                 hs->p_filter = CLDFB80_30_fx;
    2556             :                 hs->p_filter_sf = (Word16) 17051; // Q14
    2557             : #endif /* OPT_IVAS_FILTER_ROM */
    2558             :             }
    2559           0 :             ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2560             :             {
    2561           0 :                 hs->ds = 120;
    2562           0 :                 hs->da = -60;
    2563           0 :                 move16();
    2564           0 :                 move16();
    2565           0 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2566           0 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2567           0 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2568           0 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2569           0 :                 hs->scale = cldfb_scale_5_0ms[6];
    2570             : #ifdef OPT_IVAS_FILTER_ROM
    2571           0 :                 hs->p_filter_32 = LDQMF_30_fx;
    2572             : #else  /* OPT_IVAS_FILTER_ROM */
    2573             :                 hs->p_filter = LDQMF_30_fx;
    2574             :                 hs->p_filter_sf = (Word16) 15388; // Q14
    2575             : #endif /* OPT_IVAS_FILTER_ROM */
    2576           0 :                 move16();
    2577           0 :                 move16();
    2578             :             }
    2579           0 :             BREAK;
    2580             : 
    2581           0 :         case 32:
    2582           0 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L32_fx;
    2583           0 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L32_fx;
    2584           0 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L32_fx;
    2585           0 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L32_fx;
    2586           0 :             hs->rRotVctr = rRotVectr_32;
    2587           0 :             hs->iRotVctr = iRotVectr_32;
    2588             :             {
    2589           0 :                 hs->anaScalefactor = add( cldfb_anaScale[3], hs->filterScale );
    2590           0 :                 move16();
    2591             :             }
    2592           0 :             IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
    2593             :             {
    2594           0 :                 hs->ds = 32;
    2595           0 :                 hs->da = 32;
    2596           0 :                 move16();
    2597           0 :                 move16();
    2598           0 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2599           0 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2600           0 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2601           0 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2602             : #ifdef OPT_IVAS_FILTER_ROM
    2603           0 :                 hs->p_filter_32 = CLDFB80_32_fx;
    2604             : #else  /* OPT_IVAS_FILTER_ROM */
    2605             :                 hs->p_filter_sf = (Word16) 17050; // Q14
    2606             :                 hs->p_filter = CLDFB80_32_fx;
    2607             : #endif /* OPT_IVAS_FILTER_ROM */
    2608           0 :                 hs->scale = cldfb_scale_2_5ms[3];
    2609           0 :                 move16();
    2610           0 :                 move16();
    2611             :             }
    2612           0 :             ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2613             :             {
    2614           0 :                 hs->ds = 160;
    2615           0 :                 hs->da = -80;
    2616           0 :                 move16();
    2617           0 :                 move16();
    2618           0 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2619           0 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2620           0 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2621           0 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2622           0 :                 hs->scale = cldfb_scale_5_0ms[3];
    2623             : #ifdef OPT_IVAS_FILTER_ROM
    2624           0 :                 hs->p_filter_32 = LDQMF_32_fx;
    2625             : #else  /* OPT_IVAS_FILTER_ROM */
    2626             :                 hs->p_filter = LDQMF_32_fx;
    2627             :                 hs->p_filter_sf = (Word16) 15392; // Q14
    2628             : #endif /* OPT_IVAS_FILTER_ROM */
    2629           0 :                 move16();
    2630           0 :                 move16();
    2631             :             }
    2632           0 :             BREAK;
    2633             : 
    2634         894 :         case 40:
    2635         894 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L40_fx;
    2636         894 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L40_fx;
    2637         894 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L40_fx;
    2638         894 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L40_fx;
    2639         894 :             hs->rRotVctr = rRotVectr_40;
    2640         894 :             hs->iRotVctr = iRotVectr_40;
    2641         894 :             IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) )
    2642             :             {
    2643           0 :                 hs->synScalefactor = add( cldfb_synScale[4], hs->filterScale );
    2644           0 :                 move16();
    2645             :             }
    2646             :             ELSE
    2647             :             {
    2648         894 :                 hs->anaScalefactor = add( cldfb_anaScale[4], hs->filterScale );
    2649         894 :                 move16();
    2650             :             }
    2651         894 :             IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
    2652             :             {
    2653         647 :                 hs->ds = 40;
    2654         647 :                 hs->da = 40;
    2655         647 :                 move16();
    2656         647 :                 move16();
    2657         647 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2658         647 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2659         647 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2660         647 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2661         647 :                 hs->scale = cldfb_scale_2_5ms[4];
    2662             : #ifdef OPT_IVAS_FILTER_ROM
    2663         647 :                 hs->p_filter_32 = CLDFB80_40_fx;
    2664             : #else  /* OPT_IVAS_FILTER_ROM */
    2665             :                 hs->p_filter = CLDFB80_40_fx;
    2666             :                 hs->p_filter_sf = (Word16) 17051; // Q14
    2667             : #endif /* OPT_IVAS_FILTER_ROM */
    2668         647 :                 move16();
    2669         647 :                 move16();
    2670             :             }
    2671         247 :             ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2672             :             {
    2673         247 :                 hs->ds = 160;
    2674         247 :                 hs->da = -80;
    2675         247 :                 move16();
    2676         247 :                 move16();
    2677         247 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2678         247 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2679         247 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2680         247 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2681             : #ifdef OPT_IVAS_FILTER_ROM
    2682         247 :                 hs->p_filter_32 = LDQMF_40_fx;
    2683             : #else  /* OPT_IVAS_FILTER_ROM */
    2684             :                 hs->p_filter_sf = (Word16) 15391; // Q14
    2685             :                 hs->p_filter = LDQMF_40_fx;
    2686             : #endif /* OPT_IVAS_FILTER_ROM */
    2687         247 :                 hs->scale = cldfb_scale_5_0ms[4];
    2688         247 :                 move16();
    2689         247 :                 move16();
    2690             :             }
    2691         894 :             BREAK;
    2692             : 
    2693        4780 :         case 60:
    2694        4780 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L60_fx;
    2695        4780 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L60_fx;
    2696        4780 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L60_fx;
    2697        4780 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L60_fx;
    2698        4780 :             hs->rRotVctr = rRotVectr_60;
    2699        4780 :             hs->iRotVctr = iRotVectr_60;
    2700        4780 :             IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) )
    2701             :             {
    2702           0 :                 hs->synScalefactor = add( cldfb_synScale[5], hs->filterScale );
    2703           0 :                 move16();
    2704             :             }
    2705             :             ELSE
    2706             :             {
    2707        4780 :                 hs->anaScalefactor = add( cldfb_anaScale[5], hs->filterScale );
    2708        4780 :                 move16();
    2709             :             }
    2710        4780 :             IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
    2711             :             {
    2712        3386 :                 hs->ds = 60;
    2713        3386 :                 hs->da = 60;
    2714        3386 :                 move16();
    2715        3386 :                 move16();
    2716        3386 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2717        3386 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2718        3386 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2719        3386 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2720             : #ifdef OPT_IVAS_FILTER_ROM
    2721        3386 :                 hs->p_filter_32 = CLDFB80_60_fx;
    2722             : #else  /* OPT_IVAS_FILTER_ROM */
    2723             :                 hs->p_filter_sf = (Word16) 17051; // Q14
    2724             :                 hs->p_filter = CLDFB80_60_fx;
    2725             : #endif /* OPT_IVAS_FILTER_ROM */
    2726        3386 :                 hs->scale = cldfb_scale_2_5ms[5];
    2727        3386 :                 move16();
    2728        3386 :                 move16();
    2729             :             }
    2730        1394 :             ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2731             :             {
    2732        1394 :                 hs->ds = 240;
    2733        1394 :                 hs->da = -120;
    2734        1394 :                 move16();
    2735        1394 :                 move16();
    2736        1394 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2737        1394 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2738        1394 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2739        1394 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2740             : #ifdef OPT_IVAS_FILTER_ROM
    2741        1394 :                 hs->p_filter_32 = LDQMF_60_fx;
    2742             : #else  /* OPT_IVAS_FILTER_ROM */
    2743             :                 hs->p_filter_sf = (Word16) 15391; // Q14
    2744             :                 hs->p_filter = LDQMF_60_fx;
    2745             : #endif /* OPT_IVAS_FILTER_ROM */
    2746        1394 :                 hs->scale = cldfb_scale_5_0ms[5];
    2747        1394 :                 move16();
    2748        1394 :                 move16();
    2749             :             }
    2750        4780 :             break;
    2751             :     }
    2752             : 
    2753        9589 :     return;
    2754             : }
    2755             : /*-------------------------------------------------------------------*
    2756             :  * cldfb_save_memory_ivas()
    2757             :  *
    2758             :  * Save the memory of filter; to be restored with cldfb_restore_memory_ivas()
    2759             :  *--------------------------------------------------------------------*/
    2760        5766 : ivas_error cldfb_save_memory_ivas_fx(
    2761             :     HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */
    2762             : )
    2763             : {
    2764        5766 :     UWord16 offset = sub( hs->p_filter_length, hs->no_channels );
    2765        5766 :     test();
    2766        5766 :     IF( hs->memory32 != NULL || ( hs->memory_length != 0 ) )
    2767             :     {
    2768             :         /* memory already stored; Free memory first */
    2769           0 :         return IVAS_ERR_OK;
    2770             :     }
    2771             : 
    2772        5766 :     IF( EQ_16( hs->type, CLDFB_ANALYSIS ) )
    2773             :     {
    2774        2883 :         hs->memory_length = offset;
    2775        2883 :         move16();
    2776             :     }
    2777             :     ELSE
    2778             :     {
    2779        2883 :         hs->memory_length = hs->p_filter_length;
    2780        2883 :         move16();
    2781             :     }
    2782        5766 :     IF( ( hs->memory32 = (Word32 *) malloc( hs->memory_length * sizeof( Word32 ) ) ) == NULL )
    2783             :     {
    2784           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CLDFB\n" );
    2785             :     }
    2786             :     /* save the memory */
    2787        5766 :     Copy32( hs->cldfb_state_fx, hs->memory32, hs->memory_length );
    2788             : 
    2789        5766 :     return IVAS_ERR_OK;
    2790             : }
    2791             : 
    2792             : /*-------------------------------------------------------------------*
    2793             :  * cldfb_restore_memory_ivas()
    2794             :  *
    2795             :  * Restores the memory of filter; memory to be save by cldfb_save_memory_ivas()
    2796             :  *--------------------------------------------------------------------*/
    2797        5766 : void cldfb_restore_memory_ivas_fx(
    2798             :     HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */
    2799             : )
    2800             : {
    2801        5766 :     UWord16 offset = sub( hs->p_filter_length, hs->no_channels );
    2802             :     UWord16 size;
    2803        5766 :     test();
    2804        5766 :     IF( hs->memory32 == NULL || EQ_16( hs->memory_length, 0 ) )
    2805             :     {
    2806             :         /* memory not allocated */
    2807           0 :         return;
    2808             :     }
    2809             : 
    2810        5766 :     IF( hs->type == CLDFB_ANALYSIS )
    2811             :     {
    2812        2883 :         size = offset;
    2813        2883 :         move16();
    2814             :     }
    2815             :     ELSE
    2816             :     {
    2817        2883 :         size = hs->p_filter_length;
    2818        2883 :         move16();
    2819             :     }
    2820             : 
    2821             :     /* read the memory */
    2822        5766 :     Copy32( hs->memory32, hs->cldfb_state_fx, hs->memory_length );
    2823             : 
    2824             :     /* adjust sample rate if it was changed in the meanwhile */
    2825        5766 :     IF( NE_16( hs->memory_length, size ) )
    2826             :     {
    2827           0 :         L_lerp_fx_q11( hs->cldfb_state_fx, hs->cldfb_state_fx, size, hs->memory_length );
    2828             :     }
    2829        5766 :     hs->cldfb_state_length = size;
    2830        5766 :     move16();
    2831        5766 :     hs->memory_length = 0;
    2832        5766 :     move16();
    2833        5766 :     free( hs->memory32 );
    2834        5766 :     hs->memory32 = NULL;
    2835             : 
    2836        5766 :     return;
    2837             : }
    2838             : 
    2839             : /*-------------------------------------------------------------------*
    2840             :  * cldfb_reset_memory_ivas()
    2841             :  *
    2842             :  * Resets the memory of filter.
    2843             :  *--------------------------------------------------------------------*/
    2844     1296388 : void cldfb_reset_memory_fx(
    2845             :     HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */
    2846             : )
    2847             : {
    2848             :     Word16 memory_length;
    2849     1296388 :     UWord16 offset = sub( hs->p_filter_length, hs->no_channels );
    2850             : 
    2851     1296388 :     IF( hs->type == CLDFB_ANALYSIS )
    2852             :     {
    2853      466960 :         memory_length = offset;
    2854      466960 :         move16();
    2855             :     }
    2856             :     ELSE
    2857             :     {
    2858      829428 :         memory_length = hs->p_filter_length;
    2859      829428 :         move16();
    2860             :     }
    2861             : 
    2862     1296388 :     hs->cldfb_state_length = memory_length;
    2863     1296388 :     move16();
    2864             :     /* save the memory */
    2865     1296388 :     set32_fx( hs->cldfb_state_fx, 0, memory_length );
    2866     1296388 :     hs->Q_cldfb_state = Q11;
    2867     1296388 :     move16();
    2868             : 
    2869     1296388 :     return;
    2870             : }

Generated by: LCOV version 1.14