LCOV - code coverage report
Current view: top level - lib_com - cldfb_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main @ da9cc8ead0679b4682d329fdff98cf1616159273 Lines: 938 1315 71.3 %
Date: 2025-10-13 22:24:20 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.452 Aug 12, 2021. Version 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 "wmc_auto.h"
      45             : #if __STDC_VERSION__ >= 199901L
      46             : #if defined __ICL
      47             : #define restrict __restrict
      48             : #endif
      49             : #else
      50             : #define restrict
      51             : #endif
      52             : 
      53             : /*-------------------------------------------------------------------*
      54             :  * Local prototypes
      55             :  *--------------------------------------------------------------------*/
      56             : 
      57             : static void cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs );
      58             : 
      59             : static void cldfb_init_proto_and_twiddles_enc_fx( HANDLE_CLDFB_FILTER_BANK hs );
      60             : 
      61             : static void GetEnergyCldfb_ivas_fx( Word32 *energyLookahead,     /*!< o: Q(*sf_energyLookahead) |   pointer to the result in the core look-ahead slot */
      62             :                                     Word16 *sf_energyLookahead,  /*!< o:         pointer to the scalefactor of the result in the core look-ahead slot  */
      63             :                                     const Word16 numLookahead,   /*!< i: Q0      the number of look-ahead time-slots */
      64             :                                     Word16 **realValues,         /*!< i: Q(sf_Values) |   the real part of the CLDFB subsamples */
      65             :                                     Word16 **imagValues,         /*!< i: Q(sf_Values) |   the imaginary part of the CLDFB subsamples */
      66             :                                     Word16 sf_Values,            /*!< i:         scalefactor of the CLDFB subcamples - apply as a negated Exponent */
      67             :                                     Word16 numberBands,          /*!< i: Q0  |   number of CLDFB bands */
      68             :                                     Word16 numberCols,           /*!< i: Q0  |   number of CLDFB subsamples */
      69             :                                     Word32 *energyHF,            /*!< o: Q31 |   pointer to HF energy */
      70             :                                     Word16 *energyHF_Exp,        /*!< o:         pointer to exponent of HF energy */
      71             :                                     Word32 *energyValuesSum,     /*!< o: Q(2*sf_Values-4) |   pointer to sum array of energy values, not initialized*/
      72             :                                     Word16 *energyValuesSum_Exp, /*!< o:         pointer to exponents of energyValuesSum, not initialized */
      73             :                                     TEC_ENC_HANDLE hTecEnc );
      74             : 
      75             : /*-------------------------------------------------------------------*
      76             :  * cplxMult()
      77             :  *
      78             :  * Conduct complex multiplication
      79             :  *--------------------------------------------------------------------*/
      80             : 
      81             : /*-------------------------------------------------------------------*
      82             :  * cldfbAnalysis_ivas()
      83             :  *
      84             :  * Conduct multiple overlap complex low delay MDCT
      85             :  *--------------------------------------------------------------------*/
      86      732790 : void cldfbAnalysis_ivas_fx(
      87             :     const Word32 *timeIn_fx,         /* i  : time buffer         Qx    */
      88             :     Word32 **realBuffer_fx,          /* o  : real value buffer   Qx - 5*/
      89             :     Word32 **imagBuffer_fx,          /* o  : imag value buffer   QX - 5*/
      90             :     const Word16 samplesToProcess,   /* i  : samples to process        */
      91             :     HANDLE_CLDFB_FILTER_BANK h_cldfb /* i  : filterbank state          */
      92             : )
      93             : {
      94             :     Word16 i, k;
      95             :     Word16 L2, M1, M2, M4;
      96      732790 :     Word16 no_col = h_cldfb->no_col;
      97      732790 :     move16();
      98             : 
      99             :     Word32 r1_fx, r2_fx, rr12_fx, ir12_fx;
     100             :     Word32 i1_fx, i2_fx, ri12_fx, ii12_fx;
     101             :     Word32 rBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
     102             :     Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
     103             :     const Word32 *rot_vctr_re_fx;
     104             :     const Word32 *rot_vctr_im_fx;
     105             :     const Word32 *ptr_pf_fx;
     106             :     Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )];
     107             :     Word16 offset, frameSize;
     108             : 
     109      732790 :     offset = sub( h_cldfb->p_filter_length, h_cldfb->no_channels );
     110      732790 :     frameSize = i_mult( h_cldfb->no_channels, h_cldfb->no_col );
     111             : 
     112      732790 :     assert( h_cldfb->prototype == CLDFB_PROTOTYPE_1_25MS );
     113             :     /* prepare input buffer */
     114      732790 :     timeBuffer_fx = buffer_fx;
     115      732790 :     Copy32( h_cldfb->cldfb_state_fx, timeBuffer_fx, offset );
     116             : 
     117      732790 :     IF( GT_16( samplesToProcess, -1 ) )
     118             :     {
     119      482459 :         Copy32( timeIn_fx, timeBuffer_fx + offset, samplesToProcess );
     120      482459 :         set32_fx( timeBuffer_fx + add( offset, samplesToProcess ), 0, sub( frameSize, samplesToProcess ) );
     121             :     }
     122             :     ELSE
     123             :     {
     124      250331 :         Copy32( timeIn_fx, timeBuffer_fx + offset, frameSize );
     125             :     }
     126             : 
     127             :     /* only process needed cols */
     128      732790 :     IF( GT_16( samplesToProcess, -1 ) )
     129             :     {
     130      482459 :         no_col = s_min( no_col, div_l( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), shr( h_cldfb->no_channels, 1 ) ) );
     131             :     }
     132             : 
     133      732790 :     M1 = h_cldfb->no_channels;
     134      732790 :     move16();
     135      732790 :     M2 = shr( M1, 1 );
     136      732790 :     M4 = shr( M1, 2 );
     137      732790 :     L2 = shl( M1, 1 );
     138             : 
     139      732790 :     if ( s_and( M2, 1 ) )
     140             :     {
     141           0 :         M4 = add( M4, 1 );
     142             :     }
     143             : 
     144      732790 :     rot_vctr_re_fx = h_cldfb->rot_vec_ana_re_fx;
     145      732790 :     rot_vctr_im_fx = h_cldfb->rot_vec_ana_im_fx;
     146             : 
     147      732790 :     ptr_pf_fx = h_cldfb->p_filter_32;
     148      732790 :     move16();
     149             : 
     150    11866567 :     FOR( i = 0; i < no_col; i++ )
     151             :     {
     152   121741579 :         FOR( k = 0; k < M4; k++ )
     153             :         {
     154             :             /* prototype filter */
     155   110607802 :             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
     156   110607802 :             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
     157   110607802 :             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
     158   110607802 :             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
     159   110607802 :             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
     160             : 
     161   110607802 :             r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] );     // Qx
     162   110607802 :             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
     163   110607802 :             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
     164   110607802 :             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
     165   110607802 :             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
     166             : 
     167   110607802 :             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
     168   110607802 :             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
     169   110607802 :             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
     170   110607802 :             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
     171   110607802 :             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
     172             : 
     173   110607802 :             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
     174   110607802 :             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
     175   110607802 :             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
     176   110607802 :             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
     177   110607802 :             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
     178             : 
     179             : 
     180             :             /* folding + pre modulation of DST IV */
     181   110607802 :             rr12_fx = L_sub( r1_fx, r2_fx );             // Qx - 1
     182   110607802 :             ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // Qx - 1
     183             :             // cplxMult( &rBuffer_fx[2 * k], &rBuffer_fx[2 * k + 1], rr12_fx, ri12_fx, rot_vctr_re_fx[k], rot_vctr_im_fx[k] );
     184   110607802 :             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
     185   110607802 :             move32();
     186   110607802 :             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
     187   110607802 :             move32();
     188             : 
     189             :             /* folding + pre modulation of DCT IV */
     190   110607802 :             ir12_fx = L_add( r1_fx, r2_fx ); // Qx - 1
     191   110607802 :             ii12_fx = L_sub( i1_fx, i2_fx ); // Qx - 1
     192             :             // cplxMult( &iBuffer_fx[2 * k], &iBuffer_fx[2 * k + 1], ir12_fx, ii12_fx, rot_vctr_re_fx[k], rot_vctr_im_fx[k] );
     193   110607802 :             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
     194   110607802 :             move32();
     195   110607802 :             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
     196   110607802 :             move32();
     197             :         }
     198             : 
     199   121741579 :         FOR( k = M4; k < M2; k++ )
     200             :         {
     201             :             /* prototype filter */
     202   110607802 :             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
     203   110607802 :             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
     204   110607802 :             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
     205   110607802 :             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
     206   110607802 :             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
     207             : 
     208   110607802 :             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
     209   110607802 :             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
     210   110607802 :             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
     211   110607802 :             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
     212   110607802 :             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
     213             : 
     214   110607802 :             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
     215   110607802 :             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
     216   110607802 :             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
     217   110607802 :             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
     218   110607802 :             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
     219             : 
     220   110607802 :             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
     221   110607802 :             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
     222   110607802 :             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
     223   110607802 :             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
     224   110607802 :             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
     225             : 
     226             :             /* folding + pre modulation of DST IV */
     227   110607802 :             rr12_fx = L_add( r1_fx, r2_fx ); // Qx - 1
     228   110607802 :             ri12_fx = L_sub( i1_fx, i2_fx ); // Qx - 1
     229             :             // cplxMult( &rBuffer_fx[2 * k], &rBuffer[2 * k + 1], rr12, ri12, rot_vctr_re[k], rot_vctr_im[k] );
     230   110607802 :             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
     231   110607802 :             move32();
     232   110607802 :             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
     233   110607802 :             move32();
     234             : 
     235             :             /* folding + pre modulation of DCT IV */
     236   110607802 :             ir12_fx = L_sub( r1_fx, r2_fx ); // Qx - 1
     237   110607802 :             ii12_fx = L_add( i1_fx, i2_fx ); // Qx - 1
     238             :             // cplxMult( &iBuffer[2 * k], &iBuffer[2 * k + 1], ir12, ii12, rot_vctr_re[k], rot_vctr_im[k] );
     239   110607802 :             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
     240   110607802 :             move32();
     241   110607802 :             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
     242   110607802 :             move32();
     243             :         }
     244             : 
     245             :         /* FFT of DST IV */
     246    11133777 :         fft_cldfb_fx( rBuffer_fx, M2 );
     247             : 
     248             : 
     249             :         /* post modulation of DST IV */
     250   232349381 :         FOR( k = 0; k < M2; k++ )
     251             :         {
     252             :             // 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] );
     253   221215604 :             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
     254   221215604 :             move32();
     255   221215604 :             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
     256   221215604 :             move32();
     257             :         }
     258             : 
     259             :         /* FFT of DCT IV */
     260    11133777 :         fft_cldfb_fx( iBuffer_fx, M2 );
     261             : 
     262             : 
     263             :         /* post modulation of DCT IV */
     264   232349381 :         FOR( k = 0; k < M2; k++ )
     265             :         {
     266             :             /* do it inplace */
     267             :             // 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] );
     268   221215604 :             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
     269   221215604 :             move32();
     270   221215604 :             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
     271   221215604 :             move32();
     272             :         }
     273             : 
     274    11133777 :         timeBuffer_fx += i_mult( L2, 5 );
     275    11133777 :         timeBuffer_fx += sub( h_cldfb->no_channels, h_cldfb->p_filter_length );
     276             :     }
     277             : 
     278             :     /* update memory */
     279      732790 :     Copy32( buffer_fx + frameSize, h_cldfb->cldfb_state_fx, offset );
     280             : 
     281      732790 :     return;
     282             : }
     283             : 
     284             : /*-------------------------------------------------------------------*
     285             :  * cldfbAnalysis_ts_ivas()
     286             :  *
     287             :  *
     288             :  *--------------------------------------------------------------------*/
     289           0 : void cldfbAnalysis_ts_fx(
     290             :     const Word32 *timeIn_fx,
     291             :     /* i  : time buffer         */ // q
     292             :     Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX],
     293             :     /* o  : real value buffer   */ // q - 5
     294             :     Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX],
     295             :     /* o  : imag value buffer   */    // q - 5
     296             :     const Word16 samplesToProcess,    /* i  : samples to process  */
     297             :     HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i  : filterbank state    */
     298             :     Word16 *q_cldfb )
     299             : {
     300             :     Word16 i, k;
     301             :     Word16 L2, M1, M2, M4;
     302           0 :     Word16 no_col = h_cldfb->no_col;
     303           0 :     move16();
     304             : 
     305             :     Word32 r1_fx, r2_fx, rr12_fx, ir12_fx;
     306             :     Word32 i1_fx, i2_fx, ri12_fx, ii12_fx;
     307             :     Word32 rBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
     308             :     Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
     309             :     const Word32 *rot_vctr_re_fx;
     310             :     const Word32 *rot_vctr_im_fx;
     311             :     const Word32 *rot_vctr_delay_re_fx;
     312             :     const Word32 *rot_vctr_delay_im_fx;
     313             :     const Word32 *ptr_pf_fx;
     314             :     Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )];
     315             :     Word16 offset, frameSize;
     316             : 
     317           0 :     offset = sub( h_cldfb->p_filter_length, h_cldfb->no_channels );
     318           0 :     frameSize = i_mult( h_cldfb->no_channels, h_cldfb->no_col );
     319             : 
     320             :     /* prepare input buffer */
     321           0 :     timeBuffer_fx = buffer_fx;
     322           0 :     Copy32( h_cldfb->cldfb_state_fx, timeBuffer_fx, offset );
     323             : 
     324           0 :     IF( GT_16( samplesToProcess, -1 ) )
     325             :     {
     326           0 :         Copy32( timeIn_fx, timeBuffer_fx + offset, samplesToProcess );
     327           0 :         set32_fx( timeBuffer_fx + add( offset, samplesToProcess ), 0, sub( frameSize, samplesToProcess ) );
     328             :     }
     329             :     ELSE
     330             :     {
     331           0 :         Copy32( timeIn_fx, timeBuffer_fx + offset, frameSize );
     332             :     }
     333             : 
     334           0 :     h_cldfb->Q_cldfb_state = *q_cldfb;
     335           0 :     move16();
     336             : 
     337             :     /* only process needed cols */
     338           0 :     IF( GT_16( samplesToProcess, -1 ) )
     339             :     {
     340           0 :         no_col = s_min( no_col, idiv1616( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), h_cldfb->no_channels ) );
     341           0 :         assert( no_col == 1 );
     342             :     }
     343             : 
     344           0 :     M1 = h_cldfb->no_channels;
     345           0 :     move16();
     346           0 :     M2 = shr( M1, 1 );
     347           0 :     M4 = shr( M1, 2 );
     348           0 :     L2 = shl( M1, 1 );
     349             : 
     350           0 :     if ( s_and( M2, 1 ) )
     351             :     {
     352           0 :         M4 = add( M4, 1 );
     353             :     }
     354             : 
     355           0 :     rot_vctr_re_fx = h_cldfb->rot_vec_ana_re_fx;             // q = 29
     356           0 :     rot_vctr_im_fx = h_cldfb->rot_vec_ana_im_fx;             // q = 29
     357           0 :     rot_vctr_delay_re_fx = h_cldfb->rot_vec_ana_delay_re_fx; // q = 31
     358           0 :     rot_vctr_delay_im_fx = h_cldfb->rot_vec_ana_delay_im_fx; // q = 31
     359             : 
     360           0 :     ptr_pf_fx = h_cldfb->p_filter_32;
     361           0 :     move16();
     362             : 
     363           0 :     FOR( i = 0; i < no_col; i++ )
     364             :     {
     365           0 :         FOR( k = 0; k < M4; k++ )
     366             :         {
     367             :             /* prototype filter */
     368           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
     369           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
     370           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
     371           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
     372           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
     373             : 
     374           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
     375           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
     376           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
     377           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
     378           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
     379             : 
     380           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
     381           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
     382           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
     383           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
     384           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
     385             : 
     386           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
     387           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
     388           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
     389           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
     390           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
     391             : 
     392             :             /* folding + pre modulation of DST IV */
     393           0 :             rr12_fx = L_sub( r1_fx, r2_fx );                                                                           // q -1
     394           0 :             ri12_fx = L_negate( L_add( i1_fx, i2_fx ) );                                                               // q - 1
     395             :                                                                                                                        /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
     396           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
     397           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
     398           0 :             move32();
     399           0 :             move32();
     400             : 
     401             :             ///* folding + pre modulation of DCT IV */
     402           0 :             ir12_fx = L_add( r1_fx, r2_fx );                                                                           // q - 1
     403           0 :             ii12_fx = L_sub( i1_fx, i2_fx );                                                                           // q - 1
     404             :                                                                                                                        /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
     405           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
     406           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
     407           0 :             move32();
     408           0 :             move32();
     409             :         }
     410             : 
     411           0 :         FOR( k = M4; k < M2; k++ )
     412             :         {
     413             :             /* prototype filter */
     414           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
     415           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
     416           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
     417           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
     418           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
     419             : 
     420           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
     421           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
     422           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
     423           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
     424           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
     425             : 
     426           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
     427           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
     428           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
     429           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
     430           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
     431             : 
     432           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
     433           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
     434           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
     435           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
     436           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
     437             : 
     438             :             /* folding + pre modulation of DST IV */
     439           0 :             rr12_fx = L_add( r1_fx, r2_fx );                                                                           // q - 1
     440           0 :             ri12_fx = L_sub( i1_fx, i2_fx );                                                                           // q - 1
     441             :                                                                                                                        /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
     442           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
     443           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
     444           0 :             move32();
     445           0 :             move32();
     446             : 
     447             :             /* folding + pre modulation of DCT IV */
     448           0 :             ir12_fx = L_sub( r1_fx, r2_fx );                                                                           // q - 1
     449           0 :             ii12_fx = L_add( i1_fx, i2_fx );                                                                           // q - 1
     450             :                                                                                                                        /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
     451           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
     452           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
     453           0 :             move32();
     454           0 :             move32();
     455             :         }
     456             : 
     457           0 :         *q_cldfb = sub( *q_cldfb, 3 );
     458           0 :         move16();
     459             : 
     460             :         /* FFT of DST IV */
     461             :         Word16 q_shift;
     462           0 :         q_shift = sub( s_min( getScaleFactor32( rBuffer_fx, shl( M2, 1 ) ), getScaleFactor32( iBuffer_fx, shl( M2, 1 ) ) ), find_guarded_bits_fx( M2 ) );
     463           0 :         *q_cldfb = add( *q_cldfb, q_shift );
     464           0 :         move16();
     465           0 :         FOR( Word16 ind = 0; ind < M2 * 2; ind++ )
     466             :         {
     467           0 :             rBuffer_fx[ind] = L_shl( rBuffer_fx[ind], q_shift );
     468           0 :             move32();
     469             :         }
     470           0 :         FOR( Word16 ind = 0; ind < M2 * 2; ind++ )
     471             :         {
     472           0 :             iBuffer_fx[ind] = L_shl( iBuffer_fx[ind], q_shift );
     473           0 :             move32();
     474             :         }
     475           0 :         fft_cldfb_fx( rBuffer_fx, M2 );
     476             : 
     477           0 :         *q_cldfb = sub( *q_cldfb, 2 );
     478           0 :         move16();
     479             : 
     480             :         /* FFT of DCT IV */
     481           0 :         fft_cldfb_fx( iBuffer_fx, M2 );
     482             : 
     483           0 :         q_shift = s_min( getScaleFactor32( rBuffer_fx, shl( M2, 1 ) ), getScaleFactor32( iBuffer_fx, shl( M2, 1 ) ) );
     484           0 :         *q_cldfb = add( *q_cldfb, q_shift );
     485           0 :         move16();
     486           0 :         FOR( Word16 ind = 0; ind < M2 * 2; ind++ )
     487             :         {
     488           0 :             rBuffer_fx[ind] = L_shl( rBuffer_fx[ind], q_shift );
     489           0 :             move32();
     490             :         }
     491           0 :         FOR( Word16 ind = 0; ind < M2 * 2; ind++ )
     492             :         {
     493           0 :             iBuffer_fx[ind] = L_shl( iBuffer_fx[ind], q_shift );
     494           0 :             move32();
     495             :         }
     496             : 
     497             :         /* post modulation of DST IV */
     498           0 :         FOR( k = 0; k < M2; k++ )
     499             :         {
     500             :             /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
     501           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
     502           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
     503           0 :             move32();
     504           0 :             move32();
     505             :         }
     506             : 
     507             :         /* post modulation of DCT IV */
     508           0 :         FOR( k = 0; k < M2; k++ )
     509             :         {
     510             :             /* do it inplace */
     511             :             /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
     512           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
     513           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
     514           0 :             move32();
     515           0 :             move32();
     516             :         }
     517             : 
     518           0 :         IF( EQ_32( h_cldfb->prototype, CLDFB_PROTOTYPE_5_00MS ) )
     519             :         {
     520             :             /* rotation due to delay*/
     521             :             /*if(h_cldfb->da != M1)*/
     522           0 :             IF( rot_vctr_delay_re_fx != NULL )
     523             :             {
     524           0 :                 FOR( k = 0; k < M1; k++ )
     525             :                 {
     526             :                     Word32 cplx_aux_fx;
     527             :                     /* delay */
     528             :                     /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[i][k], imagBuffer[i][k], cos((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)),
     529             :                             sin((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)));*/
     530             :                     /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
     531             :                     /*cplxMult(&realBuffer[k], &imagBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
     532             :                     /*realBuffer[k] = rBuffer[k];
     533             :                     imagBuffer[k] = iBuffer[k];*/
     534           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
     535           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
     536           0 :                     realBuffer_fx[k] = cplx_aux_fx;
     537           0 :                     move32();
     538           0 :                     move32();
     539             :                 }
     540             :             }
     541             :         }
     542             : 
     543           0 :         timeBuffer_fx += i_mult( L2, 5 );
     544           0 :         timeBuffer_fx += sub( h_cldfb->no_channels, h_cldfb->p_filter_length );
     545             :     }
     546             : 
     547             :     /* update memory */
     548           0 :     IF( GT_16( samplesToProcess, -1 ) )
     549             :     {
     550           0 :         Copy32( buffer_fx + samplesToProcess, h_cldfb->cldfb_state_fx, offset );
     551             :     }
     552             :     ELSE
     553             :     {
     554           0 :         Copy32( buffer_fx + frameSize, h_cldfb->cldfb_state_fx, offset );
     555             :     }
     556             : 
     557           0 :     return;
     558             : }
     559             : 
     560      388384 : void cldfbAnalysis_ts_fx_var_q(
     561             :     const Word32 *timeIn_fx,
     562             :     /* i  : time buffer         */ // q
     563             :     Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX],
     564             :     /* o  : real value buffer   */ // q_cldfb - 5
     565             :     Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX],
     566             :     /* o  : imag value buffer   */    // q_cldfb - 5
     567             :     const Word16 samplesToProcess,    /* i  : samples to process  */
     568             :     HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i  : filterbank state    */
     569             :     Word16 *q_cldfb )
     570             : 
     571             : {
     572             :     Word16 i, k;
     573             :     Word16 L2, M1, M2, M4;
     574      388384 :     Word16 no_col = h_cldfb->no_col;
     575      388384 :     move16();
     576             :     Word32 r1_fx, r2_fx, rr12_fx, ir12_fx;
     577             :     Word32 i1_fx, i2_fx, ri12_fx, ii12_fx;
     578             :     Word32 rBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
     579             :     Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
     580             :     const Word32 *rot_vctr_re_fx;
     581             :     const Word32 *rot_vctr_im_fx;
     582             :     const Word32 *rot_vctr_delay_re_fx;
     583             :     const Word32 *rot_vctr_delay_im_fx;
     584             :     const Word32 *ptr_pf_fx;
     585             :     Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )];
     586             :     Word16 offset, frameSize;
     587             : 
     588      388384 :     offset = sub( h_cldfb->p_filter_length, h_cldfb->no_channels );
     589      388384 :     frameSize = i_mult( h_cldfb->no_channels, h_cldfb->no_col );
     590             : 
     591             :     /* prepare input buffer */
     592      388384 :     timeBuffer_fx = buffer_fx;
     593      388384 :     Copy32( h_cldfb->cldfb_state_fx, timeBuffer_fx, offset );
     594             : 
     595      388384 :     IF( GT_16( samplesToProcess, -1 ) )
     596             :     {
     597      388384 :         Copy32( timeIn_fx, timeBuffer_fx + offset, samplesToProcess );
     598      388384 :         set32_fx( timeBuffer_fx + add( offset, samplesToProcess ), 0, sub( frameSize, samplesToProcess ) );
     599             :     }
     600             :     ELSE
     601             :     {
     602           0 :         Copy32( timeIn_fx, timeBuffer_fx + offset, frameSize );
     603             :     }
     604             : 
     605      388384 :     IF( NE_16( h_cldfb->Q_cldfb_state, *q_cldfb ) )
     606             :     {
     607        8740 :         Word16 norm_st = L_norm_arr( timeBuffer_fx, offset );
     608        8740 :         IF( GE_16( norm_st, sub( *q_cldfb, h_cldfb->Q_cldfb_state ) ) )
     609             :         {
     610        8740 :             scale_sig32( timeBuffer_fx, offset, sub( *q_cldfb, h_cldfb->Q_cldfb_state ) );
     611             :             /* cldfb_state will get updated at end of processing with values whose q is same as
     612             :              * *q_cldfb.
     613             :              */
     614        8740 :             h_cldfb->Q_cldfb_state = *q_cldfb;
     615        8740 :             move16();
     616             :         }
     617             :         ELSE
     618             :         {
     619           0 :             scale_sig32( &timeBuffer_fx[offset], frameSize, sub( h_cldfb->Q_cldfb_state, *q_cldfb ) );
     620           0 :             *q_cldfb = h_cldfb->Q_cldfb_state;
     621           0 :             move16();
     622             :         }
     623             :     }
     624             : 
     625             :     /* only process needed cols */
     626      388384 :     IF( GT_16( samplesToProcess, -1 ) )
     627             :     {
     628      388384 :         no_col = s_min( no_col, idiv1616( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), h_cldfb->no_channels ) );
     629      388384 :         assert( no_col == 1 );
     630             :     }
     631             : 
     632      388384 :     M1 = h_cldfb->no_channels;
     633      388384 :     M2 = shr( M1, 1 );
     634      388384 :     M4 = shr( M1, 2 );
     635      388384 :     L2 = shl( M1, 1 );
     636      388384 :     move16();
     637             : 
     638      388384 :     if ( s_and( M2, 1 ) )
     639             :     {
     640           0 :         M4 = add( M4, 1 );
     641             :     }
     642             : 
     643      388384 :     rot_vctr_re_fx = h_cldfb->rot_vec_ana_re_fx;             // q = 29
     644      388384 :     rot_vctr_im_fx = h_cldfb->rot_vec_ana_im_fx;             // q = 29
     645      388384 :     rot_vctr_delay_re_fx = h_cldfb->rot_vec_ana_delay_re_fx; // q = 31
     646      388384 :     rot_vctr_delay_im_fx = h_cldfb->rot_vec_ana_delay_im_fx; // q = 31
     647             : 
     648      388384 :     ptr_pf_fx = h_cldfb->p_filter_32;
     649      388384 :     move16();
     650             : 
     651      776768 :     FOR( i = 0; i < no_col; i++ )
     652             :     {
     653     5968864 :         FOR( k = 0; k < M4; k++ )
     654             :         {
     655             :             /* prototype filter */
     656     5580480 :             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
     657     5580480 :             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
     658     5580480 :             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
     659     5580480 :             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
     660     5580480 :             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
     661             : 
     662     5580480 :             r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] );     // q
     663     5580480 :             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
     664     5580480 :             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
     665     5580480 :             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
     666     5580480 :             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
     667             : 
     668     5580480 :             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
     669     5580480 :             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
     670     5580480 :             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
     671     5580480 :             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
     672     5580480 :             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
     673             : 
     674     5580480 :             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
     675     5580480 :             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
     676     5580480 :             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
     677     5580480 :             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
     678     5580480 :             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
     679             : 
     680             :             /* folding + pre modulation of DST IV */
     681     5580480 :             rr12_fx = L_sub( r1_fx, r2_fx );             // q -1
     682     5580480 :             ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // q - 1
     683             :             /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
     684     5580480 :             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
     685     5580480 :             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
     686     5580480 :             move32();
     687     5580480 :             move32();
     688             : 
     689             :             ///* folding + pre modulation of DCT IV */
     690     5580480 :             ir12_fx = L_add( r1_fx, r2_fx ); // q - 1
     691     5580480 :             ii12_fx = L_sub( i1_fx, i2_fx ); // q - 1
     692             :             /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
     693     5580480 :             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
     694     5580480 :             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
     695     5580480 :             move32();
     696     5580480 :             move32();
     697             :         }
     698             : 
     699     5968864 :         FOR( k = M4; k < M2; k++ )
     700             :         {
     701             :             /* prototype filter */
     702     5580480 :             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
     703     5580480 :             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
     704     5580480 :             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
     705     5580480 :             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
     706     5580480 :             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
     707             : 
     708     5580480 :             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
     709     5580480 :             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
     710     5580480 :             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
     711     5580480 :             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
     712     5580480 :             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
     713             : 
     714     5580480 :             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
     715     5580480 :             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
     716     5580480 :             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
     717     5580480 :             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
     718     5580480 :             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
     719             : 
     720     5580480 :             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
     721     5580480 :             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
     722     5580480 :             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
     723     5580480 :             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
     724     5580480 :             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
     725             : 
     726             : 
     727             :             /* folding + pre modulation of DST IV */
     728     5580480 :             rr12_fx = L_add( r1_fx, r2_fx ); // q - 1
     729     5580480 :             ri12_fx = L_sub( i1_fx, i2_fx ); // q - 1
     730             :             /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
     731     5580480 :             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
     732     5580480 :             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
     733     5580480 :             move32();
     734     5580480 :             move32();
     735             : 
     736             :             /* folding + pre modulation of DCT IV */
     737     5580480 :             ir12_fx = L_sub( r1_fx, r2_fx ); // q - 1
     738     5580480 :             ii12_fx = L_add( i1_fx, i2_fx ); // q - 1
     739             :             /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
     740     5580480 :             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
     741     5580480 :             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
     742     5580480 :             move32();
     743     5580480 :             move32();
     744             :         }
     745             : 
     746      388384 :         *q_cldfb = sub( *q_cldfb, 3 );
     747      388384 :         move16();
     748             : 
     749             :         /* FFT of DST IV */
     750      388384 :         fft_cldfb_fx( rBuffer_fx, M2 );
     751             : 
     752             :         /* post modulation of DST IV */
     753    11549344 :         FOR( k = 0; k < M2; k++ )
     754             :         {
     755             :             /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
     756    11160960 :             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
     757    11160960 :             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
     758    11160960 :             move32();
     759    11160960 :             move32();
     760             :         }
     761      388384 :         *q_cldfb = sub( *q_cldfb, 2 );
     762      388384 :         move16();
     763             : 
     764             :         /* FFT of DCT IV */
     765      388384 :         fft_cldfb_fx( iBuffer_fx, M2 );
     766             : 
     767             :         /* post modulation of DCT IV */
     768    11549344 :         FOR( k = 0; k < M2; k++ )
     769             :         {
     770             :             /* do it inplace */
     771             :             /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
     772    11160960 :             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
     773    11160960 :             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
     774    11160960 :             move32();
     775    11160960 :             move32();
     776             :         }
     777             : 
     778      388384 :         IF( EQ_32( h_cldfb->prototype, CLDFB_PROTOTYPE_5_00MS ) )
     779             :         {
     780             :             /* rotation due to delay*/
     781             :             /*if(h_cldfb->da != M1)*/
     782      388384 :             IF( rot_vctr_delay_re_fx != NULL )
     783             :             {
     784    22710304 :                 FOR( k = 0; k < M1; k++ )
     785             :                 {
     786             :                     Word32 cplx_aux_fx;
     787             :                     /* delay */
     788             :                     /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[i][k], imagBuffer[i][k], cos((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)),
     789             :                             sin((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)));*/
     790             :                     /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
     791             :                     /*cplxMult(&realBuffer[k], &imagBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
     792             :                     /*realBuffer[k] = rBuffer[k];
     793             :                     imagBuffer[k] = iBuffer[k];*/
     794    22321920 :                     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
     795    22321920 :                     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
     796    22321920 :                     realBuffer_fx[k] = cplx_aux_fx;
     797    22321920 :                     move32();
     798    22321920 :                     move32();
     799             :                 }
     800             :             }
     801             :         }
     802             : 
     803      388384 :         timeBuffer_fx += i_mult( L2, 5 );
     804      388384 :         timeBuffer_fx += sub( h_cldfb->no_channels, h_cldfb->p_filter_length );
     805             :     }
     806             : 
     807             :     /* update memory */
     808      388384 :     IF( GT_16( samplesToProcess, -1 ) )
     809             :     {
     810      388384 :         Copy32( buffer_fx + samplesToProcess, h_cldfb->cldfb_state_fx, offset );
     811             :     }
     812             :     ELSE
     813             :     {
     814           0 :         Copy32( buffer_fx + frameSize, h_cldfb->cldfb_state_fx, offset );
     815             :     }
     816             : 
     817      388384 :     return;
     818             : }
     819             : 
     820             : 
     821    13260760 : void cldfbAnalysis_ts_fx_fixed_q(
     822             :     const Word32 *timeIn_fx,
     823             :     /* i  : time buffer         */ // q
     824             :     Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX],
     825             :     /* o  : real value buffer   */ // q - 5
     826             :     Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX],
     827             :     /* o  : imag value buffer   */    // q - 5
     828             :     const Word16 samplesToProcess,    /* i  : samples to process  */
     829             :     HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i  : filterbank state    */
     830             :     Word16 *q_cldfb )
     831             : {
     832             :     Word16 i, k;
     833             :     Word16 L2, M1, M2, M4;
     834    13260760 :     Word16 no_col = h_cldfb->no_col;
     835    13260760 :     move16();
     836             :     Word32 r1_fx, r2_fx, rr12_fx, ir12_fx;
     837             :     Word32 i1_fx, i2_fx, ri12_fx, ii12_fx;
     838             :     Word32 rBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
     839             :     Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
     840             :     const Word32 *rot_vctr_re_fx;
     841             :     const Word32 *rot_vctr_im_fx;
     842             :     const Word32 *rot_vctr_delay_re_fx;
     843             :     const Word32 *rot_vctr_delay_im_fx;
     844             :     const Word32 *ptr_pf_fx;
     845             :     Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )];
     846             :     Word16 offset, frameSize, gb, hr, shift;
     847             : 
     848    13260760 :     offset = sub( h_cldfb->p_filter_length, h_cldfb->no_channels );
     849    13260760 :     frameSize = i_mult( h_cldfb->no_channels, h_cldfb->no_col );
     850             : 
     851             :     /* prepare input buffer */
     852    13260760 :     timeBuffer_fx = buffer_fx;
     853    13260760 :     Copy32( h_cldfb->cldfb_state_fx, timeBuffer_fx, offset );
     854    13260760 :     h_cldfb->Q_cldfb_state = *q_cldfb;
     855    13260760 :     move16();
     856             : 
     857    13260760 :     IF( GT_16( samplesToProcess, -1 ) )
     858             :     {
     859    13260760 :         Copy32( timeIn_fx, timeBuffer_fx + offset, samplesToProcess );
     860    13260760 :         set32_fx( timeBuffer_fx + add( offset, samplesToProcess ), 0, sub( frameSize, samplesToProcess ) );
     861             :     }
     862             :     ELSE
     863             :     {
     864           0 :         Copy32( timeIn_fx, timeBuffer_fx + offset, frameSize );
     865             :     }
     866             : 
     867             :     /* only process needed cols */
     868    13260760 :     IF( GT_16( samplesToProcess, -1 ) )
     869             :     {
     870    13260760 :         no_col = s_min( no_col, idiv1616( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), h_cldfb->no_channels ) );
     871    13260760 :         assert( no_col == 1 );
     872             :     }
     873             : 
     874    13260760 :     M1 = h_cldfb->no_channels;
     875    13260760 :     M2 = shr( M1, 1 );
     876    13260760 :     M4 = shr( M1, 2 );
     877    13260760 :     L2 = shl( M1, 1 );
     878    13260760 :     move16();
     879             : 
     880    13260760 :     if ( s_and( M2, 1 ) )
     881             :     {
     882           0 :         M4 = add( M4, 1 );
     883             :     }
     884             : 
     885    13260760 :     rot_vctr_re_fx = h_cldfb->rot_vec_ana_re_fx;             // q = 29
     886    13260760 :     rot_vctr_im_fx = h_cldfb->rot_vec_ana_im_fx;             // q = 29
     887    13260760 :     rot_vctr_delay_re_fx = h_cldfb->rot_vec_ana_delay_re_fx; // q = 31
     888    13260760 :     rot_vctr_delay_im_fx = h_cldfb->rot_vec_ana_delay_im_fx; // q = 31
     889             : 
     890    13260760 :     ptr_pf_fx = h_cldfb->p_filter_32;
     891    13260760 :     move16();
     892             : 
     893    26521520 :     FOR( i = 0; i < no_col; i++ )
     894             :     {
     895   184594548 :         FOR( k = 0; k < M4; k++ )
     896             :         {
     897             :             /* prototype filter */
     898   171333788 :             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
     899   171333788 :             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
     900   171333788 :             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
     901   171333788 :             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
     902   171333788 :             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
     903             : 
     904   171333788 :             r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] );     // q
     905   171333788 :             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
     906   171333788 :             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
     907   171333788 :             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
     908   171333788 :             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
     909             : 
     910   171333788 :             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
     911   171333788 :             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
     912   171333788 :             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
     913   171333788 :             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
     914   171333788 :             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
     915             : 
     916   171333788 :             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
     917   171333788 :             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
     918   171333788 :             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
     919   171333788 :             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
     920   171333788 :             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
     921             : 
     922             :             /* folding + pre modulation of DST IV */
     923   171333788 :             rr12_fx = L_sub( r1_fx, r2_fx );             // q -1
     924   171333788 :             ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // q - 1
     925             :             /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
     926   171333788 :             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
     927   171333788 :             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
     928   171333788 :             move32();
     929   171333788 :             move32();
     930             : 
     931             :             ///* folding + pre modulation of DCT IV */
     932   171333788 :             ir12_fx = L_add( r1_fx, r2_fx ); // q - 1
     933   171333788 :             ii12_fx = L_sub( i1_fx, i2_fx ); // q - 1
     934             :             /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
     935   171333788 :             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
     936   171333788 :             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
     937   171333788 :             move32();
     938   171333788 :             move32();
     939             :         }
     940             : 
     941   184594548 :         FOR( k = M4; k < M2; k++ )
     942             :         {
     943             :             /* prototype filter */
     944   171333788 :             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
     945   171333788 :             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
     946   171333788 :             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
     947   171333788 :             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
     948   171333788 :             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
     949             : 
     950   171333788 :             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
     951   171333788 :             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
     952   171333788 :             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
     953   171333788 :             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
     954   171333788 :             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
     955             : 
     956   171333788 :             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
     957   171333788 :             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
     958   171333788 :             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
     959   171333788 :             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
     960   171333788 :             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
     961             : 
     962   171333788 :             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
     963   171333788 :             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
     964   171333788 :             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
     965   171333788 :             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
     966   171333788 :             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
     967             : 
     968             :             /* folding + pre modulation of DST IV */
     969   171333788 :             rr12_fx = L_add( r1_fx, r2_fx ); // q - 1
     970   171333788 :             ri12_fx = L_sub( i1_fx, i2_fx ); // q - 1
     971             :             /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
     972   171333788 :             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
     973   171333788 :             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
     974   171333788 :             move32();
     975   171333788 :             move32();
     976             : 
     977             :             /* folding + pre modulation of DCT IV */
     978   171333788 :             ir12_fx = L_sub( r1_fx, r2_fx ); // q - 1
     979   171333788 :             ii12_fx = L_add( i1_fx, i2_fx ); // q - 1
     980             :             /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
     981   171333788 :             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
     982   171333788 :             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
     983   171333788 :             move32();
     984   171333788 :             move32();
     985             :         }
     986             : 
     987    13260760 :         *q_cldfb = sub( *q_cldfb, 3 );
     988    13260760 :         move16();
     989             : 
     990             :         /* FFT of DST IV */
     991    13260760 :         fft_cldfb_fx( rBuffer_fx, M2 );
     992             : 
     993             :         /* post modulation of DST IV */
     994   355928336 :         FOR( k = 0; k < M2; k++ )
     995             :         {
     996             :             /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
     997   342667576 :             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
     998   342667576 :             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
     999   342667576 :             move32();
    1000   342667576 :             move32();
    1001             :         }
    1002    13260760 :         *q_cldfb = sub( *q_cldfb, 2 );
    1003    13260760 :         move16();
    1004             : 
    1005    13260760 :         gb = find_guarded_bits_fx( M1 );
    1006    13260760 :         hr = L_norm_arr( iBuffer_fx, M1 );
    1007             : 
    1008    13260760 :         IF( LT_16( hr, gb ) )
    1009             :         {
    1010       11571 :             scale_sig32( iBuffer_fx, M1, sub( hr, gb ) );
    1011             :         }
    1012             : 
    1013             :         /* FFT of DCT IV */
    1014    13260760 :         fft_cldfb_fx( iBuffer_fx, M2 );
    1015             : 
    1016             :         /* post modulation of DCT IV */
    1017    13260760 :         IF( LT_16( hr, gb ) )
    1018             :         {
    1019       11571 :             shift = sub( gb, hr );
    1020      261691 :             FOR( k = 0; k < M2; k++ )
    1021             :             {
    1022             :                 /* do it inplace */
    1023             :                 /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
    1024      250120 :                 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
    1025      250120 :                 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
    1026      250120 :                 move32();
    1027      250120 :                 move32();
    1028             :             }
    1029             :         }
    1030             :         ELSE
    1031             :         {
    1032   355666645 :             FOR( k = 0; k < M2; k++ )
    1033             :             {
    1034             :                 /* do it inplace */
    1035             :                 /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
    1036   342417456 :                 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
    1037   342417456 :                 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
    1038   342417456 :                 move32();
    1039   342417456 :                 move32();
    1040             :             }
    1041             :         }
    1042             : 
    1043    13260760 :         IF( EQ_32( h_cldfb->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    1044             :         {
    1045             :             /* rotation due to delay*/
    1046             :             /*if(h_cldfb->da != M1)*/
    1047    13260760 :             IF( rot_vctr_delay_re_fx != NULL )
    1048             :             {
    1049   698595912 :                 FOR( k = 0; k < M1; k++ )
    1050             :                 {
    1051             :                     Word32 cplx_aux_fx;
    1052             :                     /* delay */
    1053             :                     /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[i][k], imagBuffer[i][k], cos((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)),
    1054             :                             sin((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)));*/
    1055             :                     /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
    1056             :                     /*cplxMult(&realBuffer[k], &imagBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
    1057             :                     /*realBuffer[k] = rBuffer[k];
    1058             :                     imagBuffer[k] = iBuffer[k];*/
    1059   685335152 :                     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
    1060   685335152 :                     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
    1061   685335152 :                     realBuffer_fx[k] = cplx_aux_fx;
    1062   685335152 :                     move32();
    1063   685335152 :                     move32();
    1064             :                 }
    1065             :             }
    1066             :         }
    1067             : 
    1068    13260760 :         timeBuffer_fx += i_mult( L2, 5 );
    1069    13260760 :         timeBuffer_fx += sub( h_cldfb->no_channels, h_cldfb->p_filter_length );
    1070             :     }
    1071             : 
    1072             :     /* update memory */
    1073    13260760 :     IF( GT_16( samplesToProcess, -1 ) )
    1074             :     {
    1075    13260760 :         Copy32( buffer_fx + samplesToProcess, h_cldfb->cldfb_state_fx, offset );
    1076             :     }
    1077             :     ELSE
    1078             :     {
    1079           0 :         Copy32( buffer_fx + frameSize, h_cldfb->cldfb_state_fx, offset );
    1080             :     }
    1081             : 
    1082    13260760 :     return;
    1083             : }
    1084             : 
    1085             : /*-------------------------------------------------------------------*
    1086             :  * cldfbSynthesis_ivas()
    1087             :  *
    1088             :  * Conduct inverse multple overlap cmplex low delay MDCT
    1089             :  *--------------------------------------------------------------------*/
    1090    12409311 : void cldfbSynthesis_ivas_fx(
    1091             :     Word32 **realBuffer_fx,          /* i  : real values                 Qx*/
    1092             :     Word32 **imagBuffer_fx,          /* i  : imag values                 Qx*/
    1093             :     Word32 *timeOut_fx,              /* o  : output time domain samples  Qx - 1*/
    1094             :     const Word16 samplesToProcess,   /* i  : number of processed samples */
    1095             :     const Word16 shift,              /* i  : scale for state buffer */
    1096             :     const Word16 out_shift,          /* i  : scale for output buffer */
    1097             :     HANDLE_CLDFB_FILTER_BANK h_cldfb /* i  : filter bank state           */
    1098             : )
    1099             : {
    1100             :     Word16 i;
    1101             :     Word16 k;
    1102             :     Word16 L2;
    1103             :     Word16 M1;
    1104             :     Word16 M2;
    1105             :     Word16 M41;
    1106             :     Word16 M42;
    1107             :     Word16 Mz;
    1108             : 
    1109             :     Word32 rBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
    1110             :     Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX];
    1111             :     const Word32 *rot_vctr_re_fx;
    1112             :     const Word32 *rot_vctr_im_fx;
    1113             :     const Word32 *rot_vctr_delay_re_fx;
    1114             :     const Word32 *rot_vctr_delay_im_fx;
    1115             :     Word32 rr12_fx, ir12_fx;
    1116             :     Word32 ri12_fx, ii12_fx;
    1117             : 
    1118             :     Word32 *synthesisBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 10 * CLDFB_NO_CHANNELS_MAX )];
    1119             :     Word32 new_samples_fx[2 * CLDFB_NO_CHANNELS_MAX];
    1120             : 
    1121             :     Word32 *ptr_time_out_fx;
    1122             :     const Word32 *p_filter_32;
    1123             : 
    1124             :     Word32 accu0, accu1, accu2, accu3, accu4;
    1125    12409311 :     Word16 no_col = h_cldfb->no_col;
    1126    12409311 :     move16();
    1127             : 
    1128    12409311 :     M1 = h_cldfb->no_channels;
    1129    12409311 :     move16();
    1130    12409311 :     L2 = shl( M1, 1 );
    1131    12409311 :     M2 = shr( M1, 1 );
    1132    12409311 :     M41 = shr( M2, 1 );
    1133    12409311 :     M42 = sub( M2, M41 );
    1134    12409311 :     Mz = sub( M1, h_cldfb->bandsToZero );
    1135             : 
    1136             :     /* only process needed cols */
    1137    12409311 :     IF( GT_16( samplesToProcess, -1 ) )
    1138             :     {
    1139    12150787 :         no_col = s_min( no_col, idiv1616( sub( add( samplesToProcess, h_cldfb->no_channels ), 1 ), h_cldfb->no_channels ) );
    1140    12150787 :         move16();
    1141             :     }
    1142             : 
    1143    12409311 :     rot_vctr_re_fx = h_cldfb->rot_vec_syn_re_fx;
    1144    12409311 :     rot_vctr_im_fx = h_cldfb->rot_vec_syn_im_fx;
    1145             : 
    1146    12409311 :     rot_vctr_delay_re_fx = h_cldfb->rot_vec_syn_delay_re_fx;
    1147    12409311 :     rot_vctr_delay_im_fx = h_cldfb->rot_vec_syn_delay_im_fx;
    1148             : 
    1149    12409311 :     synthesisBuffer_fx = buffer_fx;
    1150    12409311 :     Copy32( h_cldfb->cldfb_state_fx, synthesisBuffer_fx + i_mult( M1, no_col ), h_cldfb->p_filter_length );
    1151             : 
    1152    12409311 :     p_filter_32 = h_cldfb->p_filter_32;
    1153    12409311 :     ptr_time_out_fx = timeOut_fx;
    1154             : 
    1155             :     /*synthesisBuffer += M1 * h_cldfb->no_col;*/
    1156    12409311 :     synthesisBuffer_fx += i_mult( M1, no_col );
    1157             : 
    1158    32528395 :     FOR( k = 0; k < no_col; k++ )
    1159             :     {
    1160    20119084 :         IF( EQ_16( h_cldfb->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    1161             :         {
    1162             :             /* rotation due to delay*/
    1163             :             /*if(h_cldfb->ds != M1)*/
    1164    15552712 :             IF( rot_vctr_delay_re_fx != NULL )
    1165             :             {
    1166   836716392 :                 FOR( i = 0; i < M1; i++ )
    1167             :                 {
    1168             :                     Word32 cplx_aux;
    1169             :                     /* delay */
    1170             :                     /*cplxMult(&rBuffer[i], &iBuffer[i], realBuffer[k][i], imagBuffer[k][i], cos((EVS_PI/M1)*(i+0.5)*(-(h_cldfb->ds-M1)*0.5)),
    1171             :                             sin((EVS_PI/M1)*(i+0.5)*(-(h_cldfb->ds-M1)*0.5)));*/
    1172             :                     /*cplxMult(&rBuffer[i], &iBuffer[i], realBuffer[k][i], imagBuffer[k][i], rot_vctr_delay_re[i], rot_vctr_delay_im[i]);*/
    1173             :                     /*cplxMult(&realBuffer[k][i], &imagBuffer[k][i], realBuffer[k][i], imagBuffer[k][i], rot_vctr_delay_re[i], rot_vctr_delay_im[i]);*/
    1174   821163680 :                     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
    1175   821163680 :                     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] );
    1176   821163680 :                     move32();
    1177   821163680 :                     realBuffer_fx[k][i] = cplx_aux;
    1178   821163680 :                     move32();
    1179             :                     /*realBuffer[k][i] = rBuffer[i];*/
    1180             :                     /*imagBuffer[k][i] = iBuffer[i];*/
    1181             :                 }
    1182             :             }
    1183             :         }
    1184    95279236 :         FOR( i = Mz; i < M1; i++ )
    1185             :         {
    1186    75160152 :             realBuffer_fx[k][i] = 0;
    1187    75160152 :             move32();
    1188    75160152 :             imagBuffer_fx[k][i] = 0;
    1189    75160152 :             move32();
    1190             :         }
    1191             : 
    1192   516812854 :         FOR( i = 0; i < M2; i++ )
    1193             :         {
    1194             :             /* pre modulation of DST IV */
    1195             :             /*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]);*/
    1196   496693770 :             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
    1197   496693770 :             move32();
    1198   496693770 :             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
    1199   496693770 :             move32();
    1200             : 
    1201             :             /* pre modulation of DCT IV */
    1202             :             /*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]);*/
    1203   496693770 :             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
    1204   496693770 :             move32();
    1205   496693770 :             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
    1206   496693770 :             move32();
    1207             :         }
    1208             : 
    1209             :         /* FFT of DST IV */
    1210    20119084 :         fft_cldfb_fx( rBuffer_fx, M2 );
    1211             : 
    1212             :         /* FFT of DCT IV */
    1213    20119084 :         fft_cldfb_fx( iBuffer_fx, M2 );
    1214             : 
    1215             :         /* folding */
    1216   268465969 :         FOR( i = 0; i < M41; i++ )
    1217             :         {
    1218             :             /* post modulation of DST IV */
    1219   248346885 :             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
    1220   248346885 :             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
    1221             : 
    1222             :             /* post modulation of DCT IV */
    1223   248346885 :             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
    1224   248346885 :             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
    1225             : 
    1226   248346885 :             new_samples_fx[M1 + M2 + 1 + 2 * i] = L_negate( L_add( rr12_fx, ii12_fx ) ); // Qx
    1227   248346885 :             move32();
    1228   248346885 :             new_samples_fx[M2 - 2 - 2 * i] = L_negate( L_add( ri12_fx, ir12_fx ) ); // Qx
    1229   248346885 :             move32();
    1230             : 
    1231   248346885 :             new_samples_fx[M1 + M2 - 2 - 2 * i] = L_sub( rr12_fx, ii12_fx ); // Qx
    1232   248346885 :             move32();
    1233   248346885 :             new_samples_fx[M2 + 1 + 2 * i] = L_sub( ir12_fx, ri12_fx ); // Qx
    1234   248346885 :             move32();
    1235             :         }
    1236             : 
    1237   268465969 :         FOR( i = 0; i < M42; i++ )
    1238             :         {
    1239             :             /* post modulation of DST IV */
    1240   248346885 :             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
    1241   248346885 :             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
    1242             : 
    1243             :             /* post modulation of DCT IV */
    1244   248346885 :             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
    1245   248346885 :             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
    1246             : 
    1247   248346885 :             new_samples_fx[M1 + M2 + 2 * i] = L_add( ri12_fx, ir12_fx ); // Qx
    1248   248346885 :             move32();
    1249   248346885 :             new_samples_fx[M2 - 1 - 2 * i] = L_add( rr12_fx, ii12_fx ); // Qx
    1250   248346885 :             move32();
    1251             : 
    1252   248346885 :             new_samples_fx[M1 + M2 - 1 - 2 * i] = L_sub( ir12_fx, ri12_fx ); // Qx
    1253   248346885 :             move32();
    1254   248346885 :             new_samples_fx[M2 + 2 * i] = L_sub( rr12_fx, ii12_fx ); // Qx
    1255   248346885 :             move32();
    1256             :         }
    1257             : 
    1258             :         /* synthesis prototype filter */
    1259    20119084 :         IF( 0 == shift )
    1260             :         {
    1261  1074674116 :             FOR( i = 0; i < L2; i++ )
    1262             :             {
    1263  1063550440 :                 accu0 = Madd_32_32( synthesisBuffer_fx[i], new_samples_fx[L2 - 1 - i], p_filter_32[i] );                       // Qx - 1
    1264  1063550440 :                 accu1 = Madd_32_32( synthesisBuffer_fx[1 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 1 * L2 + i )] ); // Qx - 1
    1265  1063550440 :                 accu2 = Madd_32_32( synthesisBuffer_fx[2 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 2 * L2 + i )] ); // Qx - 1
    1266  1063550440 :                 accu3 = Madd_32_32( synthesisBuffer_fx[3 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 3 * L2 + i )] ); // Qx - 1
    1267  1063550440 :                 accu4 = Madd_32_32( synthesisBuffer_fx[4 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 4 * L2 + i )] ); // Qx - 1
    1268             : 
    1269  1063550440 :                 synthesisBuffer_fx[i] = accu0;
    1270  1063550440 :                 move32();
    1271  1063550440 :                 synthesisBuffer_fx[1 * L2 + i] = accu1;
    1272  1063550440 :                 move32();
    1273  1063550440 :                 synthesisBuffer_fx[2 * L2 + i] = accu2;
    1274  1063550440 :                 move32();
    1275  1063550440 :                 synthesisBuffer_fx[3 * L2 + i] = accu3;
    1276  1063550440 :                 move32();
    1277  1063550440 :                 synthesisBuffer_fx[4 * L2 + i] = accu4;
    1278  1063550440 :                 move32();
    1279             :             }
    1280             :         }
    1281             :         ELSE
    1282             :         {
    1283             : 
    1284   932220048 :             FOR( i = 0; i < L2; i++ )
    1285             :             {
    1286   923224640 :                 Word32 prod = L_shl_sat( ( new_samples_fx[L2 - 1 - i] ), shift );
    1287   923224640 :                 accu0 = Madd_32_32( synthesisBuffer_fx[i], prod, p_filter_32[i] );                       // Qx -1 + shift
    1288   923224640 :                 accu1 = Madd_32_32( synthesisBuffer_fx[1 * L2 + i], prod, p_filter_32[( 1 * L2 + i )] ); // Qx -1 + shift
    1289   923224640 :                 accu2 = Madd_32_32( synthesisBuffer_fx[2 * L2 + i], prod, p_filter_32[( 2 * L2 + i )] ); // Qx -1 + shift
    1290   923224640 :                 accu3 = Madd_32_32( synthesisBuffer_fx[3 * L2 + i], prod, p_filter_32[( 3 * L2 + i )] ); // Qx -1 + shift
    1291   923224640 :                 accu4 = Madd_32_32( synthesisBuffer_fx[4 * L2 + i], prod, p_filter_32[( 4 * L2 + i )] ); // Qx -1 + shift
    1292             : 
    1293   923224640 :                 synthesisBuffer_fx[i] = accu0;
    1294   923224640 :                 move32();
    1295   923224640 :                 synthesisBuffer_fx[1 * L2 + i] = accu1;
    1296   923224640 :                 move32();
    1297   923224640 :                 synthesisBuffer_fx[2 * L2 + i] = accu2;
    1298   923224640 :                 move32();
    1299   923224640 :                 synthesisBuffer_fx[3 * L2 + i] = accu3;
    1300   923224640 :                 move32();
    1301   923224640 :                 synthesisBuffer_fx[4 * L2 + i] = accu4;
    1302   923224640 :                 move32();
    1303             :             }
    1304             :         }
    1305             : 
    1306    20119084 :         IF( 0 == out_shift )
    1307             :         {
    1308   996986288 :             FOR( i = 0; i < M1; i++ )
    1309             :             {
    1310   977257300 :                 ptr_time_out_fx[( M1 - 1 ) - i] = synthesisBuffer_fx[4 * L2 + M1 + i];
    1311   977257300 :                 move32();
    1312             :             }
    1313             :         }
    1314             :         ELSE
    1315             :         {
    1316    16520336 :             FOR( i = 0; i < M1; i++ )
    1317             :             {
    1318    16130240 :                 ptr_time_out_fx[( M1 - 1 ) - i] = L_shl_sat( synthesisBuffer_fx[4 * L2 + M1 + i], out_shift );
    1319    16130240 :                 move32();
    1320             :             }
    1321             :         }
    1322             : 
    1323    20119084 :         ptr_time_out_fx += M1;
    1324             : 
    1325    20119084 :         synthesisBuffer_fx -= M1;
    1326             : 
    1327    20119084 :         set32_fx( synthesisBuffer_fx, 0, M1 );
    1328             :     }
    1329             : 
    1330             :     /* update memory */
    1331    12409311 :     Copy32( buffer_fx, h_cldfb->cldfb_state_fx, h_cldfb->p_filter_length );
    1332             : 
    1333    12409311 :     return;
    1334             : }
    1335             : 
    1336        9679 : void configureCldfb_ivas_enc_fx(
    1337             :     HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: filter bank handle        */
    1338             :     const Word32 sampling_rate        /* i  : sampling rate             */
    1339             : )
    1340             : {
    1341             : 
    1342        9679 :     h_cldfb->no_col = CLDFB_NO_COL_MAX;
    1343        9679 :     h_cldfb->bandsToZero = 0;
    1344        9679 :     h_cldfb->nab = 0;
    1345             : 
    1346        9679 :     h_cldfb->no_channels = extract_l( Mpy_32_32_r( sampling_rate, INV_CLDFB_BANDWIDTH_Q31 ) );
    1347        9679 :     h_cldfb->p_filter_length = i_mult( 10, h_cldfb->no_channels );
    1348        9679 :     h_cldfb->zeros = 0;
    1349        9679 :     h_cldfb->anaScalefactor = 0;
    1350        9679 :     h_cldfb->synScalefactor = 0;
    1351        9679 :     h_cldfb->filterScale = 1;
    1352        9679 :     cldfb_init_proto_and_twiddles_enc_fx( h_cldfb );
    1353             : 
    1354        9679 :     return;
    1355             : }
    1356       46870 : void configureCldfb_ivas_fx(
    1357             :     HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: filter bank handle        */
    1358             :     const Word32 sampling_rate        /* i  : sampling rate             */
    1359             : )
    1360             : {
    1361             : 
    1362       46870 :     h_cldfb->no_col = CLDFB_NO_COL_MAX;
    1363       46870 :     move16();
    1364       46870 :     h_cldfb->bandsToZero = 0;
    1365       46870 :     move16();
    1366       46870 :     h_cldfb->nab = 0;
    1367       46870 :     move16();
    1368             : 
    1369             :     // h_cldfb->no_channels = (int16_t) ( sampling_rate * INV_CLDFB_BANDWIDTH + 0.5f );
    1370       46870 :     h_cldfb->no_channels = extract_l( Mpy_32_32_r( sampling_rate, INV_CLDFB_BANDWIDTH_Q31 ) );
    1371       46870 :     move16();
    1372       46870 :     h_cldfb->zeros = 0;
    1373       46870 :     move16();
    1374       46870 :     h_cldfb->anaScalefactor = 0;
    1375       46870 :     move16();
    1376       46870 :     h_cldfb->synScalefactor = 0;
    1377       46870 :     move16();
    1378       46870 :     h_cldfb->p_filter_length = i_mult( 10, h_cldfb->no_channels );
    1379       46870 :     move16();
    1380             : 
    1381       46870 :     cldfb_init_proto_and_twiddles( h_cldfb );
    1382             : 
    1383       46870 :     return;
    1384             : }
    1385             : /*-------------------------------------------------------------------*
    1386             :  * openClfdb()
    1387             :  *
    1388             :  * open and configures a CLDFB handle
    1389             :  *--------------------------------------------------------------------*/
    1390       36448 : ivas_error openCldfb_ivas_fx(
    1391             :     HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle                */
    1392             :     CLDFB_TYPE type,                   /* i  : analysis or synthesis             */
    1393             :     const Word32 sampling_rate,        /* i  : sampling rate                     */
    1394             :     CLDFB_PROTOTYPE prototype,         /* i  : CLDFB version (1.25ms/5ms delay)  */
    1395             :     const Word16 enc_dec )             /* i  : encoder/decoder flag            */
    1396             : {
    1397             :     HANDLE_CLDFB_FILTER_BANK hs;
    1398             :     Word16 buf_len;
    1399             : 
    1400       36448 :     IF( ( hs = (HANDLE_CLDFB_FILTER_BANK) malloc( sizeof( CLDFB_FILTER_BANK ) ) ) == NULL )
    1401             :     {
    1402           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" );
    1403             :     }
    1404             : 
    1405       36448 :     hs->type = type;
    1406       36448 :     move32();
    1407       36448 :     hs->prototype = prototype;
    1408       36448 :     move32();
    1409       36448 :     IF( enc_dec == ENC )
    1410             :     {
    1411        9679 :         configureCldfb_ivas_enc_fx( hs, sampling_rate );
    1412        9679 :         hs->Q_cldfb_state = 0;
    1413             :     }
    1414             :     ELSE
    1415             :     {
    1416       26769 :         configureCldfb_ivas_fx( hs, sampling_rate );
    1417       26769 :         hs->Q_cldfb_state = Q11;
    1418             :     }
    1419       36448 :     move16();
    1420       36448 :     hs->memory32 = NULL;
    1421       36448 :     hs->FilterStates = NULL;
    1422       36448 :     hs->memory_length = 0;
    1423       36448 :     move16();
    1424             : 
    1425       36448 :     IF( EQ_32( type, CLDFB_ANALYSIS ) )
    1426             :     {
    1427       17320 :         buf_len = sub( hs->p_filter_length, hs->no_channels );
    1428             :     }
    1429             :     ELSE
    1430             :     {
    1431       19128 :         buf_len = hs->p_filter_length;
    1432       19128 :         move16();
    1433             :     }
    1434             : 
    1435       36448 :     IF( ( hs->cldfb_state_fx = (Word32 *) malloc( buf_len * sizeof( Word32 ) ) ) == NULL )
    1436             :     {
    1437           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" );
    1438             :     }
    1439             : 
    1440       36448 :     hs->cldfb_state_length = buf_len; // Temporarily added to store the length of buffer
    1441       36448 :     move16();
    1442       36448 :     hs->cldfb_size = buf_len; /*for having original size at intermediatery conversion, will be removed on removing conversion*/
    1443       36448 :     move16();
    1444       36448 :     set32_fx( hs->cldfb_state_fx, 0, buf_len );
    1445             : 
    1446       36448 :     *h_cldfb = hs;
    1447       36448 :     move16();
    1448             : 
    1449       36448 :     return IVAS_ERR_OK;
    1450             : }
    1451             : 
    1452             : /*-------------------------------------------------------------------*
    1453             :  * resampleCldfb_ivas()
    1454             :  *
    1455             :  * Change sample rate of filter bank
    1456             :  *--------------------------------------------------------------------*/
    1457       14413 : void resampleCldfb_ivas_fx(
    1458             :     HANDLE_CLDFB_FILTER_BANK hs, /* i/o: filter bank handle  */
    1459             :     const Word32 newSamplerate )
    1460             : {
    1461             :     Word16 timeOffset;
    1462             : 
    1463             :     /* keep old parameters before switching*/
    1464       14413 :     Word16 timeOffsetold = sub( hs->p_filter_length, hs->no_channels );
    1465             : 
    1466             :     /* new settings */
    1467       14413 :     configureCldfb_ivas_fx( hs, newSamplerate );
    1468             : 
    1469       14413 :     timeOffset = sub( hs->p_filter_length, hs->no_channels );
    1470             : 
    1471             :     /*low complexity-resampling only stored previous samples that are needed for next frame modulation */
    1472       14413 :     L_lerp_fx_q11( hs->cldfb_state_fx, hs->cldfb_state_fx, timeOffset, timeOffsetold );
    1473             : 
    1474       14413 :     return;
    1475             : }
    1476             : 
    1477      394870 : static void GetEnergyCldfb_ivas_fx( Word32 *energyLookahead,     /*!< o: Q(*sf_energyLookahead) |   pointer to the result in the core look-ahead slot */
    1478             :                                     Word16 *sf_energyLookahead,  /*!< o:         pointer to the scalefactor of the result in the core look-ahead slot  */
    1479             :                                     const Word16 numLookahead,   /*!< i: Q0      the number of look-ahead time-slots */
    1480             :                                     Word16 **realValues,         /*!< i: Q(sf_Values) |   the real part of the CLDFB subsamples */
    1481             :                                     Word16 **imagValues,         /*!< i: Q(sf_Values) |   the imaginary part of the CLDFB subsamples */
    1482             :                                     Word16 sf_Values,            /*!< i:         scalefactor of the CLDFB subcamples - apply as a negated Exponent */
    1483             :                                     Word16 numberBands,          /*!< i: Q0  |   number of CLDFB bands */
    1484             :                                     Word16 numberCols,           /*!< i: Q0  |   number of CLDFB subsamples */
    1485             :                                     Word32 *energyHF,            /*!< o: Q31 |   pointer to HF energy */
    1486             :                                     Word16 *energyHF_Exp,        /*!< o:         pointer to exponent of HF energy */
    1487             :                                     Word32 *energyValuesSum,     /*!< o: Q(2*sf_Values-4) |   pointer to sum array of energy values, not initialized*/
    1488             :                                     Word16 *energyValuesSum_Exp, /*!< o:         pointer to exponents of energyValuesSum, not initialized */
    1489             :                                     TEC_ENC_HANDLE hTecEnc )
    1490             : {
    1491             :     Word16 j;
    1492             :     Word16 k;
    1493             :     Word16 s;
    1494             :     Word16 sm;
    1495             :     Word32 nrg;
    1496             :     Word16 numberColsL;
    1497             :     Word16 numberBandsM;
    1498             :     Word16 numberBandsM20;
    1499             :     Word32 energyValues[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
    1500             :     Word16 energyValuesSumE[CLDFB_NO_CHANNELS_MAX];
    1501             :     // Word16 freqTable[2] = {20, 40};
    1502             : #ifndef ISSUE_1836_replace_overflow_libcom
    1503             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
    1504             :     Flag Overflow = 0;
    1505             :     move32();
    1506             : #endif
    1507             : #endif
    1508             : 
    1509     6712790 :     FOR( k = 0; k < numberCols; k++ )
    1510             :     {
    1511   362201120 :         FOR( j = 0; j < numberBands; j++ )
    1512             :         {
    1513   355883200 :             nrg = L_mult0( realValues[k][j], realValues[k][j] );     // Q(2*sf_Values)
    1514   355883200 :             nrg = L_mac0( nrg, imagValues[k][j], imagValues[k][j] ); // Q(2*sf_Values)
    1515             : 
    1516   355883200 :             energyValues[k][j] = nrg;
    1517   355883200 :             move32();
    1518             :         }
    1519             :     }
    1520             : 
    1521      394870 :     IF( GE_16( numberBands, freqTable[1] ) && hTecEnc != NULL )
    1522             :     {
    1523             :         Word32 *tempEnergyValuesArry[CLDFB_NO_COL_MAX];
    1524             :         Word16 ScaleX2;
    1525           0 :         assert( numberCols == CLDFB_NO_COL_MAX );
    1526           0 :         FOR( j = 0; j < numberCols; j++ )
    1527             :         {
    1528           0 :             tempEnergyValuesArry[j] = &energyValues[j][0];
    1529             :         }
    1530             : 
    1531           0 :         ScaleX2 = shl( sf_Values, 1 );
    1532           0 :         calcHiEnvLoBuff_Fix(
    1533             :             numberCols,
    1534             :             freqTable,
    1535             :             1,
    1536             :             tempEnergyValuesArry,
    1537           0 :             hTecEnc->loBuffer,
    1538           0 :             hTecEnc->hiTempEnv,
    1539             :             ScaleX2 );
    1540             :     }
    1541             : 
    1542    22637570 :     FOR( j = 0; j < numberBands; j++ )
    1543             :     {
    1544    22242700 :         energyValuesSum[j] = 0;
    1545    22242700 :         move32();
    1546    22242700 :         energyValuesSumE[j] = 31;
    1547    22242700 :         move16();
    1548   378125900 :         FOR( k = 0; k < CLDFB_NO_COL_MAX; k++ )
    1549             :         {
    1550   355883200 :             nrg = L_shr_r( energyValues[k][j], sub( energyValuesSumE[j], 31 ) ); // Q(2*sf_Values - (energyValuesSumE[j]-31))
    1551   355883200 :             IF( LT_32( L_sub( maxWord32, nrg ), energyValuesSum[j] ) )
    1552             :             {
    1553      977504 :                 energyValuesSumE[j] = add( energyValuesSumE[j], 1 );
    1554      977504 :                 move16();
    1555      977504 :                 energyValuesSum[j] = L_shr_r( energyValuesSum[j], 1 );
    1556      977504 :                 move32();
    1557      977504 :                 nrg = L_shr_r( nrg, 1 );
    1558             :             }
    1559   355883200 :             energyValuesSum[j] = L_add( energyValuesSum[j], nrg );
    1560   355883200 :             move32();
    1561             :         }
    1562    22242700 :         test();
    1563    22242700 :         if ( j == 0 || GT_16( energyValuesSumE[j], *energyValuesSum_Exp ) )
    1564             :         {
    1565      464814 :             *energyValuesSum_Exp = energyValuesSumE[j];
    1566      464814 :             move16();
    1567             :         }
    1568             :     }
    1569    22637570 :     FOR( j = 0; j < numberBands; j++ )
    1570             :     {
    1571    22242700 :         energyValuesSum[j] = L_shr_r( energyValuesSum[j], sub( *energyValuesSum_Exp, energyValuesSumE[j] ) ); // Q(energyValuesSum_Exp - (2*sf_Values))
    1572    22242700 :         move32();
    1573             :     }
    1574      394870 :     *energyValuesSum_Exp = sub( *energyValuesSum_Exp, shl( sf_Values, 1 ) );
    1575      394870 :     move16();
    1576             : 
    1577      394870 :     IF( GT_16( numberBands, 20 ) )
    1578             :     {
    1579      378874 :         numberBandsM = s_min( numberBands, 40 );
    1580      378874 :         numberBandsM20 = sub( numberBandsM, 20 );
    1581             : 
    1582      378874 :         numberColsL = sub( numberCols, numLookahead );
    1583             : 
    1584             :         /* sum up CLDFB energy above 8 kHz */
    1585      378874 :         s = BASOP_util_norm_s_bands2shift( i_mult( numberColsL, numberBandsM20 ) );
    1586      378874 :         s = sub( s, 4 );
    1587      378874 :         nrg = 0;
    1588      378874 :         move32();
    1589     6061984 :         FOR( k = 0; k < numberColsL; k++ )
    1590             :         {
    1591   119345310 :             FOR( j = 20; j < numberBandsM; j++ )
    1592             :             {
    1593             : #ifdef ISSUE_1836_replace_overflow_libcom
    1594   113662200 :                 nrg = L_add_sat( nrg, L_shr_sat( energyValues[k][j], s ) );
    1595             : #else
    1596             :                 nrg = L_add_o( nrg, L_shr_o( energyValues[k][j], s, &Overflow ), &Overflow );
    1597             : #endif
    1598             :             }
    1599             :         }
    1600             : 
    1601      378874 :         s = sub( sub( shl( sf_Values, 1 ), 1 ), s );
    1602      378874 :         sm = sub( s_min( s, *sf_energyLookahead ), 1 );
    1603             : 
    1604      378874 :         *energyHF = L_add( L_shr( nrg, limitScale32( sub( s, sm ) ) ),
    1605      378874 :                            L_shr( *energyLookahead, sub( *sf_energyLookahead, sm ) ) ); // Q(31-(-nm))
    1606      378874 :         move32();
    1607             : 
    1608      378874 :         *energyHF_Exp = negate( sm );
    1609      378874 :         move16();
    1610             : 
    1611             :         /* process look-ahead region */
    1612      378874 :         s = BASOP_util_norm_s_bands2shift( i_mult( numLookahead, numberBandsM20 ) );
    1613      378874 :         s = sub( s, 2 );
    1614      378874 :         nrg = 0;
    1615      378874 :         move32();
    1616      757748 :         FOR( k = numberColsL; k < numberCols; k++ )
    1617             :         {
    1618     7956354 :             FOR( j = 20; j < numberBandsM; j++ )
    1619             :             {
    1620             : #ifdef ISSUE_1836_replace_overflow_libcom
    1621     7577480 :                 nrg = L_add_sat( nrg, L_shr_sat( energyValues[k][j], s ) );
    1622             : #else
    1623             :                 nrg = L_add_o( nrg, L_shr_o( energyValues[k][j], s, &Overflow ), &Overflow );
    1624             : #endif
    1625             :             }
    1626             :         }
    1627             : 
    1628      378874 :         s = sub( shl( sf_Values, 1 ), s );
    1629      378874 :         sm = sub( s_min( s, 44 ), 1 );
    1630             :         BASOP_SATURATE_WARNING_OFF_EVS
    1631             :         /* nrg + 6.1e-5f => value 0x40000000, scale 44 */
    1632      378874 :         *energyLookahead = L_add_sat( L_shr_sat( nrg, sub( s, sm ) ),
    1633      378874 :                                       L_shr_sat( 0x40000000, s_max( -31, s_min( 31, sub( 44, sm ) ) ) ) );
    1634      378874 :         move32();
    1635             :         BASOP_SATURATE_WARNING_ON_EVS
    1636      378874 :         *sf_energyLookahead = sm;
    1637      378874 :         move16();
    1638             : 
    1639      378874 :         return;
    1640             :     }
    1641             : 
    1642             : 
    1643       15996 :     *energyHF = 0x40000000;
    1644       15996 :     move32();
    1645       15996 :     *energyHF_Exp = 17;
    1646       15996 :     move16();
    1647             : }
    1648             : 
    1649             : 
    1650      394870 : void analysisCldfbEncoder_ivas_fx(
    1651             :     Encoder_State *st, /* i/o: encoder state structure   */
    1652             :     Word32 *timeIn,    /*q11*/
    1653             :     Word16 timeInq,
    1654             :     Word16 samplesToProcess,
    1655             :     Word32 realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],   // Q(scale.lb_scale)
    1656             :     Word32 imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],   // Q(scale.lb_scale)
    1657             :     Word16 realBuffer16[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], // Q15
    1658             :     Word16 imagBuffer16[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], // Q15
    1659             :     Word32 *ppBuf_Ener,                                           // Q(31-enerBuffSum_exp)
    1660             :     Word16 *enerBuffSum_exp,
    1661             :     CLDFB_SCALE_FACTOR *scale )
    1662             : {
    1663             :     Word16 i;
    1664             :     CLDFB_SCALE_FACTOR enerScale;
    1665             :     Word32 *ppBuf_Real[CLDFB_NO_COL_MAX];
    1666             :     Word32 *ppBuf_Imag[CLDFB_NO_COL_MAX];
    1667             :     Word16 *ppBuf_Real16[CLDFB_NO_COL_MAX];
    1668             :     Word16 *ppBuf_Imag16[CLDFB_NO_COL_MAX];
    1669             :     Word32 l_timeIn[L_FRAME48k];
    1670      394870 :     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 ) ) );
    1671      394870 :     Word16 guard_bits = find_guarded_bits_fx( shl( samplesToProcess, 1 ) );
    1672      394870 :     Word16 shift = 0;
    1673      394870 :     move16();
    1674             : 
    1675     6712790 :     FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ )
    1676             :     {
    1677     6317920 :         ppBuf_Real[i] = &realBuffer[i][0];
    1678     6317920 :         ppBuf_Imag[i] = &imagBuffer[i][0];
    1679     6317920 :         ppBuf_Real16[i] = &realBuffer16[i][0];
    1680     6317920 :         ppBuf_Imag16[i] = &imagBuffer16[i][0];
    1681             :     }
    1682      394870 :     IF( GT_16( guard_bits, norm_timeIn ) )
    1683             :     {
    1684      306290 :         shift = sub( guard_bits, norm_timeIn );
    1685      306290 :         v_shr_32( timeIn, l_timeIn, samplesToProcess, shift );
    1686      306290 :         scale_sig32( st->cldfbAnaEnc->cldfb_state_fx, sub( st->cldfbAnaEnc->p_filter_length, st->cldfbAnaEnc->no_channels ), negate( shift ) );
    1687             :     }
    1688             :     ELSE
    1689             :     {
    1690       88580 :         Copy32( timeIn, l_timeIn, samplesToProcess );
    1691             :     }
    1692             : 
    1693      394870 :     cldfbAnalysis_ivas_fx( l_timeIn, ppBuf_Real, ppBuf_Imag, samplesToProcess, st->cldfbAnaEnc );
    1694             : 
    1695      394870 :     IF( GT_16( guard_bits, norm_timeIn ) )
    1696             :     {
    1697      306290 :         shift = sub( guard_bits, norm_timeIn );
    1698      306290 :         scale_sig32( st->cldfbAnaEnc->cldfb_state_fx, sub( st->cldfbAnaEnc->p_filter_length, st->cldfbAnaEnc->no_channels ), shift );
    1699             :     }
    1700             : 
    1701      394870 :     scale->lb_scale = sub( Q31, sub( sub( timeInq, shift ), Q5 ) );
    1702      394870 :     enerScale.lb_scale = negate( scale->lb_scale );
    1703      394870 :     enerScale.lb_scale16 = sub( Q15, scale->lb_scale );
    1704      394870 :     move16();
    1705      394870 :     move16();
    1706      394870 :     move16();
    1707             : 
    1708      394870 :     AnalysisPostSpectrumScaling_Fx( st->cldfbAnaEnc, ppBuf_Real, ppBuf_Imag, ppBuf_Real16, ppBuf_Imag16, &enerScale.lb_scale16 );
    1709             : 
    1710      394870 :     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 );
    1711             : 
    1712      394870 :     return;
    1713             : }
    1714             : 
    1715       68402 : void deleteCldfb_ivas_fx(
    1716             :     HANDLE_CLDFB_FILTER_BANK *h_cldfb /* i/o: filter bank handle  */
    1717             : )
    1718             : {
    1719       68402 :     HANDLE_CLDFB_FILTER_BANK hs = *h_cldfb;
    1720             : 
    1721       68402 :     test();
    1722       68402 :     IF( h_cldfb == NULL || *h_cldfb == NULL )
    1723             :     {
    1724       31954 :         return;
    1725             :     }
    1726             : 
    1727       36448 :     IF( hs->cldfb_state_fx )
    1728             :     {
    1729       36448 :         free( hs->cldfb_state_fx );
    1730             :     }
    1731             : 
    1732       36448 :     IF( hs->FilterStates )
    1733             :     {
    1734           0 :         free( hs->FilterStates );
    1735             :     }
    1736             : 
    1737       36448 :     free( hs );
    1738       36448 :     *h_cldfb = NULL;
    1739             : 
    1740       36448 :     return;
    1741             : }
    1742             : 
    1743             : 
    1744             : /*-------------------------------------------------------------------*
    1745             :  * cldfb_init_proto_and_twiddles()
    1746             :  *
    1747             :  * Initializes rom pointer
    1748             :  *--------------------------------------------------------------------*/
    1749             : 
    1750       46870 : static void cldfb_init_proto_and_twiddles(
    1751             :     HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle  */
    1752             : )
    1753             : {
    1754             :     /*find appropriate set of rotVecs*/
    1755       46870 :     SWITCH( hs->no_channels )
    1756             :     {
    1757           0 :         case 10:
    1758           0 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L10_fx;
    1759           0 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L10_fx;
    1760           0 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L10_fx;
    1761           0 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L10_fx;
    1762           0 :             IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    1763             :             {
    1764           0 :                 hs->ds = 10;
    1765           0 :                 hs->da = 10;
    1766           0 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    1767           0 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    1768           0 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    1769           0 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    1770           0 :                 hs->p_filter_32 = CLDFB80_10_fx;
    1771           0 :                 hs->scale = CLDFB80_10_SCALE_FX_Q8;
    1772             :             }
    1773           0 :             ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    1774             :             {
    1775           0 :                 hs->ds = 40;
    1776           0 :                 hs->da = -20;
    1777           0 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    1778           0 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    1779           0 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    1780           0 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    1781           0 :                 hs->p_filter_32 = LDQMF_10_fx;
    1782           0 :                 hs->scale = LDQMF_10_SCALE_FX_Q8;
    1783             :             }
    1784           0 :             BREAK;
    1785             : 
    1786        8607 :         case 16:
    1787        8607 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L16_fx;
    1788        8607 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L16_fx;
    1789        8607 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L16_fx;
    1790        8607 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L16_fx;
    1791        8607 :             IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    1792             :             {
    1793        8414 :                 hs->ds = 20;
    1794        8414 :                 hs->da = 20;
    1795        8414 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    1796        8414 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    1797        8414 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    1798        8414 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    1799        8414 :                 hs->p_filter_32 = CLDFB80_16_fx;
    1800        8414 :                 hs->scale = CLDFB80_16_SCALE_FX_Q8;
    1801             :             }
    1802         193 :             ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    1803             :             {
    1804         193 :                 hs->ds = 80;
    1805         193 :                 hs->da = -40;
    1806         193 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    1807         193 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    1808         193 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    1809         193 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    1810         193 :                 hs->p_filter_32 = LDQMF_16_fx;
    1811         193 :                 hs->scale = LDQMF_16_SCALE_FX_Q8;
    1812             :             }
    1813        8607 :             BREAK;
    1814             : 
    1815       13494 :         case 20:
    1816       13494 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L20_fx;
    1817       13494 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L20_fx;
    1818       13494 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L20_fx;
    1819       13494 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L20_fx;
    1820       13494 :             IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    1821             :             {
    1822       11739 :                 hs->ds = 20;
    1823       11739 :                 hs->da = 20;
    1824       11739 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    1825       11739 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    1826       11739 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    1827       11739 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    1828       11739 :                 hs->p_filter_32 = CLDFB80_20_fx;
    1829       11739 :                 hs->scale = CLDFB80_20_SCALE_FX_Q8;
    1830             :             }
    1831        1755 :             ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    1832             :             {
    1833        1755 :                 hs->ds = 80;
    1834        1755 :                 hs->da = -40;
    1835        1755 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    1836        1755 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    1837        1755 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    1838        1755 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    1839        1755 :                 hs->p_filter_32 = LDQMF_20_fx;
    1840        1755 :                 hs->scale = LDQMF_20_SCALE_FX_Q8;
    1841             :             }
    1842       13494 :             BREAK;
    1843             : 
    1844           0 :         case 30:
    1845           0 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L30_fx;
    1846           0 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L30_fx;
    1847           0 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L30_fx;
    1848           0 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L30_fx;
    1849           0 :             IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    1850             :             {
    1851           0 :                 hs->ds = 30;
    1852           0 :                 hs->da = 30;
    1853           0 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    1854           0 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    1855           0 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    1856           0 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    1857           0 :                 hs->p_filter_32 = CLDFB80_30_fx;
    1858           0 :                 hs->scale = CLDFB80_30_SCALE_FX_Q8;
    1859             :             }
    1860           0 :             ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    1861             :             {
    1862           0 :                 hs->ds = 120;
    1863           0 :                 hs->da = -60;
    1864           0 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    1865           0 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    1866           0 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    1867           0 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    1868           0 :                 hs->p_filter_32 = LDQMF_30_fx;
    1869           0 :                 hs->scale = LDQMF_30_SCALE_FX_Q8;
    1870             :             }
    1871           0 :             BREAK;
    1872             : 
    1873        1693 :         case 32:
    1874        1693 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L32_fx;
    1875        1693 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L32_fx;
    1876        1693 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L32_fx;
    1877        1693 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L32_fx;
    1878        1693 :             IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    1879             :             {
    1880        1693 :                 hs->ds = 32;
    1881        1693 :                 hs->da = 32;
    1882        1693 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    1883        1693 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    1884        1693 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    1885        1693 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    1886        1693 :                 hs->p_filter_32 = CLDFB80_32_fx;
    1887        1693 :                 hs->scale = CLDFB80_32_SCALE_FX_Q8;
    1888             :             }
    1889           0 :             ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    1890             :             {
    1891           0 :                 hs->ds = 160;
    1892           0 :                 hs->da = -80;
    1893           0 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    1894           0 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    1895           0 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    1896           0 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    1897           0 :                 hs->p_filter_32 = LDQMF_32_fx;
    1898           0 :                 hs->scale = LDQMF_32_SCALE_FX_Q8;
    1899             :             }
    1900        1693 :             BREAK;
    1901             : 
    1902        5210 :         case 40:
    1903        5210 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L40_fx;
    1904        5210 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L40_fx;
    1905        5210 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L40_fx;
    1906        5210 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L40_fx;
    1907        5210 :             IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    1908             :             {
    1909        2967 :                 hs->ds = 40;
    1910        2967 :                 hs->da = 40;
    1911        2967 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    1912        2967 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    1913        2967 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    1914        2967 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    1915        2967 :                 hs->p_filter_32 = CLDFB80_40_fx;
    1916        2967 :                 hs->scale = CLDFB80_40_SCALE_FX_Q8;
    1917             :             }
    1918        2243 :             ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    1919             :             {
    1920        2243 :                 hs->ds = 160;
    1921        2243 :                 hs->da = -80;
    1922        2243 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    1923        2243 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    1924        2243 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    1925        2243 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    1926        2243 :                 hs->p_filter_32 = LDQMF_40_fx;
    1927        2243 :                 hs->scale = LDQMF_40_SCALE_FX_Q8;
    1928             :             }
    1929        5210 :             BREAK;
    1930             : 
    1931       17866 :         case 60:
    1932       17866 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L60_fx;
    1933       17866 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L60_fx;
    1934       17866 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L60_fx;
    1935       17866 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L60_fx;
    1936       17866 :             IF( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    1937             :             {
    1938        9266 :                 hs->ds = 60;
    1939        9266 :                 hs->da = 60;
    1940        9266 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    1941        9266 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    1942        9266 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    1943        9266 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    1944        9266 :                 hs->p_filter_32 = CLDFB80_60_fx;
    1945        9266 :                 hs->scale = CLDFB80_60_SCALE_FX_Q8;
    1946             :             }
    1947        8600 :             ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    1948             :             {
    1949        8600 :                 hs->ds = 240;
    1950        8600 :                 hs->da = -120;
    1951        8600 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    1952        8600 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    1953        8600 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    1954        8600 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    1955        8600 :                 hs->p_filter_32 = LDQMF_60_fx;
    1956        8600 :                 hs->scale = LDQMF_60_SCALE_FX_Q8;
    1957             :             }
    1958       17866 :             BREAK;
    1959             :     }
    1960       46870 :     move16();
    1961       46870 :     move16();
    1962       46870 :     move16();
    1963       46870 :     move16();
    1964             : 
    1965       46870 :     return;
    1966             : }
    1967             : 
    1968        9679 : static void cldfb_init_proto_and_twiddles_enc_fx(
    1969             :     HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle  */
    1970             : )
    1971             : {
    1972             :     /*find appropriate set of rotVecs*/
    1973        9679 :     SWITCH( hs->no_channels )
    1974             :     {
    1975           0 :         case 10:
    1976           0 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L10_fx;
    1977           0 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L10_fx;
    1978           0 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L10_fx;
    1979           0 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L10_fx;
    1980           0 :             hs->rRotVctr = rRotVectr_10;
    1981           0 :             hs->iRotVctr = iRotVectr_10;
    1982           0 :             IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) )
    1983             :             {
    1984           0 :                 hs->synScalefactor = add( cldfb_synScale[0], hs->filterScale );
    1985           0 :                 move16();
    1986             :             }
    1987             :             ELSE
    1988             :             {
    1989           0 :                 hs->anaScalefactor = add( cldfb_anaScale[0], hs->filterScale );
    1990           0 :                 move16();
    1991             :             }
    1992           0 :             IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
    1993             :             {
    1994           0 :                 hs->ds = 10;
    1995           0 :                 hs->da = 10;
    1996           0 :                 move16();
    1997           0 :                 move16();
    1998           0 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    1999           0 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2000           0 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2001           0 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2002           0 :                 hs->scale = cldfb_scale_2_5ms[0];
    2003           0 :                 move16();
    2004           0 :                 move16();
    2005           0 :                 hs->p_filter_32 = CLDFB80_10_fx;
    2006             :             }
    2007           0 :             ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2008             :             {
    2009           0 :                 hs->ds = 40;
    2010           0 :                 hs->da = -20;
    2011           0 :                 move16();
    2012           0 :                 move16();
    2013           0 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2014           0 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2015           0 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2016           0 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2017           0 :                 hs->p_filter_32 = LDQMF_10_fx;
    2018           0 :                 hs->scale = cldfb_scale_5_0ms[0];
    2019           0 :                 move16();
    2020           0 :                 move16();
    2021             :             }
    2022           0 :             BREAK;
    2023             : 
    2024           0 :         case 16:
    2025           0 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L16_fx;
    2026           0 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L16_fx;
    2027           0 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L16_fx;
    2028           0 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L16_fx;
    2029           0 :             hs->rRotVctr = rRotVectr_16;
    2030           0 :             hs->iRotVctr = iRotVectr_16;
    2031             :             {
    2032           0 :                 hs->anaScalefactor = add( cldfb_anaScale[1], hs->filterScale );
    2033           0 :                 move16();
    2034             :             }
    2035           0 :             IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
    2036             :             {
    2037           0 :                 hs->ds = 20;
    2038           0 :                 hs->da = 20;
    2039           0 :                 move16();
    2040           0 :                 move16();
    2041           0 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2042           0 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2043           0 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2044           0 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2045           0 :                 hs->p_filter_32 = CLDFB80_16_fx;
    2046           0 :                 hs->scale = cldfb_scale_2_5ms[1];
    2047           0 :                 move16();
    2048           0 :                 move16();
    2049             :             }
    2050           0 :             ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2051             :             {
    2052           0 :                 hs->ds = 80;
    2053           0 :                 hs->da = -40;
    2054           0 :                 move16();
    2055           0 :                 move16();
    2056           0 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2057           0 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2058           0 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2059           0 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2060           0 :                 hs->p_filter_32 = LDQMF_16_fx;
    2061           0 :                 hs->scale = cldfb_scale_5_0ms[1];
    2062           0 :                 move16();
    2063           0 :                 move16();
    2064             :             }
    2065           0 :             BREAK;
    2066             : 
    2067        3960 :         case 20:
    2068             : 
    2069        3960 :             hs->rRotVctr = rRotVectr_20;
    2070        3960 :             hs->iRotVctr = iRotVectr_20;
    2071        3960 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L20_fx;
    2072        3960 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L20_fx;
    2073        3960 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L20_fx;
    2074        3960 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L20_fx;
    2075        3960 :             IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) )
    2076             :             {
    2077        3895 :                 hs->synScalefactor = add( cldfb_synScale[2], hs->filterScale );
    2078        3895 :                 move16();
    2079             :             }
    2080             :             ELSE
    2081             :             {
    2082          65 :                 hs->anaScalefactor = add( cldfb_anaScale[2], hs->filterScale );
    2083          65 :                 move16();
    2084             :             }
    2085        3960 :             IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
    2086             :             {
    2087        3952 :                 hs->ds = 20;
    2088        3952 :                 hs->da = 20;
    2089        3952 :                 move16();
    2090        3952 :                 move16();
    2091        3952 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2092        3952 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2093        3952 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2094        3952 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2095        3952 :                 hs->p_filter_32 = CLDFB80_20_fx;
    2096        3952 :                 hs->scale = cldfb_scale_2_5ms[2];
    2097        3952 :                 move16();
    2098        3952 :                 move16();
    2099             :             }
    2100           8 :             ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2101             :             {
    2102           8 :                 hs->ds = 80;
    2103           8 :                 hs->da = -40;
    2104           8 :                 move16();
    2105           8 :                 move16();
    2106           8 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2107           8 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2108           8 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2109           8 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2110           8 :                 hs->p_filter_32 = LDQMF_20_fx;
    2111           8 :                 hs->scale = cldfb_scale_5_0ms[2];
    2112           8 :                 move16();
    2113           8 :                 move16();
    2114             :             }
    2115        3960 :             BREAK;
    2116             : 
    2117           0 :         case 30:
    2118           0 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L30_fx;
    2119           0 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L30_fx;
    2120           0 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L30_fx;
    2121           0 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L30_fx;
    2122           0 :             hs->rRotVctr = rRotVectr_30;
    2123           0 :             hs->iRotVctr = iRotVectr_30;
    2124           0 :             IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) )
    2125             :             {
    2126           0 :                 hs->synScalefactor = add( cldfb_synScale[6], hs->filterScale );
    2127           0 :                 move16();
    2128             :             }
    2129             :             ELSE
    2130             :             {
    2131           0 :                 hs->anaScalefactor = add( cldfb_anaScale[6], hs->filterScale );
    2132           0 :                 move16();
    2133             :             }
    2134           0 :             IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
    2135             :             {
    2136           0 :                 hs->ds = 30;
    2137           0 :                 hs->da = 30;
    2138           0 :                 move16();
    2139           0 :                 move16();
    2140           0 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2141           0 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2142           0 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2143           0 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2144           0 :                 hs->scale = cldfb_scale_2_5ms[6];
    2145           0 :                 hs->p_filter_32 = CLDFB80_30_fx;
    2146             :             }
    2147           0 :             ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2148             :             {
    2149           0 :                 hs->ds = 120;
    2150           0 :                 hs->da = -60;
    2151           0 :                 move16();
    2152           0 :                 move16();
    2153           0 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2154           0 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2155           0 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2156           0 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2157           0 :                 hs->scale = cldfb_scale_5_0ms[6];
    2158           0 :                 hs->p_filter_32 = LDQMF_30_fx;
    2159           0 :                 move16();
    2160           0 :                 move16();
    2161             :             }
    2162           0 :             BREAK;
    2163             : 
    2164           0 :         case 32:
    2165           0 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L32_fx;
    2166           0 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L32_fx;
    2167           0 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L32_fx;
    2168           0 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L32_fx;
    2169           0 :             hs->rRotVctr = rRotVectr_32;
    2170           0 :             hs->iRotVctr = iRotVectr_32;
    2171             :             {
    2172           0 :                 hs->anaScalefactor = add( cldfb_anaScale[3], hs->filterScale );
    2173           0 :                 move16();
    2174             :             }
    2175           0 :             IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
    2176             :             {
    2177           0 :                 hs->ds = 32;
    2178           0 :                 hs->da = 32;
    2179           0 :                 move16();
    2180           0 :                 move16();
    2181           0 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2182           0 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2183           0 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2184           0 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2185           0 :                 hs->p_filter_32 = CLDFB80_32_fx;
    2186           0 :                 hs->scale = cldfb_scale_2_5ms[3];
    2187           0 :                 move16();
    2188           0 :                 move16();
    2189             :             }
    2190           0 :             ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2191             :             {
    2192           0 :                 hs->ds = 160;
    2193           0 :                 hs->da = -80;
    2194           0 :                 move16();
    2195           0 :                 move16();
    2196           0 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2197           0 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2198           0 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2199           0 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2200           0 :                 hs->scale = cldfb_scale_5_0ms[3];
    2201           0 :                 hs->p_filter_32 = LDQMF_32_fx;
    2202           0 :                 move16();
    2203           0 :                 move16();
    2204             :             }
    2205           0 :             BREAK;
    2206             : 
    2207         894 :         case 40:
    2208         894 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L40_fx;
    2209         894 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L40_fx;
    2210         894 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L40_fx;
    2211         894 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L40_fx;
    2212         894 :             hs->rRotVctr = rRotVectr_40;
    2213         894 :             hs->iRotVctr = iRotVectr_40;
    2214         894 :             IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) )
    2215             :             {
    2216           0 :                 hs->synScalefactor = add( cldfb_synScale[4], hs->filterScale );
    2217           0 :                 move16();
    2218             :             }
    2219             :             ELSE
    2220             :             {
    2221         894 :                 hs->anaScalefactor = add( cldfb_anaScale[4], hs->filterScale );
    2222         894 :                 move16();
    2223             :             }
    2224         894 :             IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
    2225             :             {
    2226         647 :                 hs->ds = 40;
    2227         647 :                 hs->da = 40;
    2228         647 :                 move16();
    2229         647 :                 move16();
    2230         647 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2231         647 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2232         647 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2233         647 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2234         647 :                 hs->scale = cldfb_scale_2_5ms[4];
    2235         647 :                 hs->p_filter_32 = CLDFB80_40_fx;
    2236         647 :                 move16();
    2237         647 :                 move16();
    2238             :             }
    2239         247 :             ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2240             :             {
    2241         247 :                 hs->ds = 160;
    2242         247 :                 hs->da = -80;
    2243         247 :                 move16();
    2244         247 :                 move16();
    2245         247 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2246         247 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2247         247 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2248         247 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2249         247 :                 hs->p_filter_32 = LDQMF_40_fx;
    2250         247 :                 hs->scale = cldfb_scale_5_0ms[4];
    2251         247 :                 move16();
    2252         247 :                 move16();
    2253             :             }
    2254         894 :             BREAK;
    2255             : 
    2256        4825 :         case 60:
    2257        4825 :             hs->rot_vec_ana_re_fx = rot_vec_ana_re_L60_fx;
    2258        4825 :             hs->rot_vec_ana_im_fx = rot_vec_ana_im_L60_fx;
    2259        4825 :             hs->rot_vec_syn_re_fx = rot_vec_syn_re_L60_fx;
    2260        4825 :             hs->rot_vec_syn_im_fx = rot_vec_syn_im_L60_fx;
    2261        4825 :             hs->rRotVctr = rRotVectr_60;
    2262        4825 :             hs->iRotVctr = iRotVectr_60;
    2263        4825 :             IF( EQ_16( hs->type, CLDFB_SYNTHESIS ) )
    2264             :             {
    2265           0 :                 hs->synScalefactor = add( cldfb_synScale[5], hs->filterScale );
    2266           0 :                 move16();
    2267             :             }
    2268             :             ELSE
    2269             :             {
    2270        4825 :                 hs->anaScalefactor = add( cldfb_anaScale[5], hs->filterScale );
    2271        4825 :                 move16();
    2272             :             }
    2273        4825 :             IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_1_25MS ) )
    2274             :             {
    2275        3431 :                 hs->ds = 60;
    2276        3431 :                 hs->da = 60;
    2277        3431 :                 move16();
    2278        3431 :                 move16();
    2279        3431 :                 hs->rot_vec_ana_delay_re_fx = NULL;
    2280        3431 :                 hs->rot_vec_ana_delay_im_fx = NULL;
    2281        3431 :                 hs->rot_vec_syn_delay_re_fx = NULL;
    2282        3431 :                 hs->rot_vec_syn_delay_im_fx = NULL;
    2283        3431 :                 hs->p_filter_32 = CLDFB80_60_fx;
    2284        3431 :                 hs->scale = cldfb_scale_2_5ms[5];
    2285        3431 :                 move16();
    2286        3431 :                 move16();
    2287             :             }
    2288        1394 :             ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) )
    2289             :             {
    2290        1394 :                 hs->ds = 240;
    2291        1394 :                 hs->da = -120;
    2292        1394 :                 move16();
    2293        1394 :                 move16();
    2294        1394 :                 hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2295        1394 :                 hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2296        1394 :                 hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx;
    2297        1394 :                 hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx;
    2298        1394 :                 hs->p_filter_32 = LDQMF_60_fx;
    2299        1394 :                 hs->scale = cldfb_scale_5_0ms[5];
    2300        1394 :                 move16();
    2301        1394 :                 move16();
    2302             :             }
    2303        4825 :             break;
    2304             :     }
    2305             : 
    2306        9679 :     return;
    2307             : }
    2308             : /*-------------------------------------------------------------------*
    2309             :  * cldfb_save_memory_ivas()
    2310             :  *
    2311             :  * Save the memory of filter; to be restored with cldfb_restore_memory_ivas()
    2312             :  *--------------------------------------------------------------------*/
    2313        5784 : ivas_error cldfb_save_memory_ivas_fx(
    2314             :     HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */
    2315             : )
    2316             : {
    2317        5784 :     UWord16 offset = sub( hs->p_filter_length, hs->no_channels );
    2318        5784 :     test();
    2319        5784 :     IF( hs->memory32 != NULL || ( hs->memory_length != 0 ) )
    2320             :     {
    2321             :         /* memory already stored; Free memory first */
    2322           0 :         return IVAS_ERR_OK;
    2323             :     }
    2324             : 
    2325        5784 :     IF( EQ_16( hs->type, CLDFB_ANALYSIS ) )
    2326             :     {
    2327        2892 :         hs->memory_length = offset;
    2328        2892 :         move16();
    2329             :     }
    2330             :     ELSE
    2331             :     {
    2332        2892 :         hs->memory_length = hs->p_filter_length;
    2333        2892 :         move16();
    2334             :     }
    2335        5784 :     IF( ( hs->memory32 = (Word32 *) malloc( hs->memory_length * sizeof( Word32 ) ) ) == NULL )
    2336             :     {
    2337           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CLDFB\n" );
    2338             :     }
    2339             :     /* save the memory */
    2340        5784 :     Copy32( hs->cldfb_state_fx, hs->memory32, hs->memory_length );
    2341             : 
    2342        5784 :     return IVAS_ERR_OK;
    2343             : }
    2344             : 
    2345             : /*-------------------------------------------------------------------*
    2346             :  * cldfb_restore_memory_ivas()
    2347             :  *
    2348             :  * Restores the memory of filter; memory to be save by cldfb_save_memory_ivas()
    2349             :  *--------------------------------------------------------------------*/
    2350        5784 : void cldfb_restore_memory_ivas_fx(
    2351             :     HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */
    2352             : )
    2353             : {
    2354        5784 :     UWord16 offset = sub( hs->p_filter_length, hs->no_channels );
    2355             :     UWord16 size;
    2356        5784 :     test();
    2357        5784 :     IF( hs->memory32 == NULL || EQ_16( hs->memory_length, 0 ) )
    2358             :     {
    2359             :         /* memory not allocated */
    2360           0 :         return;
    2361             :     }
    2362             : 
    2363        5784 :     IF( hs->type == CLDFB_ANALYSIS )
    2364             :     {
    2365        2892 :         size = offset;
    2366        2892 :         move16();
    2367             :     }
    2368             :     ELSE
    2369             :     {
    2370        2892 :         size = hs->p_filter_length;
    2371        2892 :         move16();
    2372             :     }
    2373             : 
    2374             :     /* read the memory */
    2375        5784 :     Copy32( hs->memory32, hs->cldfb_state_fx, hs->memory_length );
    2376             : 
    2377             :     /* adjust sample rate if it was changed in the meanwhile */
    2378        5784 :     IF( NE_16( hs->memory_length, size ) )
    2379             :     {
    2380           0 :         L_lerp_fx_q11( hs->cldfb_state_fx, hs->cldfb_state_fx, size, hs->memory_length );
    2381             :     }
    2382        5784 :     hs->cldfb_state_length = size;
    2383        5784 :     move16();
    2384        5784 :     hs->memory_length = 0;
    2385        5784 :     move16();
    2386        5784 :     free( hs->memory32 );
    2387        5784 :     hs->memory32 = NULL;
    2388             : 
    2389        5784 :     return;
    2390             : }
    2391             : 
    2392             : /*-------------------------------------------------------------------*
    2393             :  * cldfb_reset_memory_ivas()
    2394             :  *
    2395             :  * Resets the memory of filter.
    2396             :  *--------------------------------------------------------------------*/
    2397     1373126 : void cldfb_reset_memory_fx(
    2398             :     HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */
    2399             : )
    2400             : {
    2401             :     Word16 memory_length;
    2402     1373126 :     UWord16 offset = sub( hs->p_filter_length, hs->no_channels );
    2403             : 
    2404     1373126 :     IF( hs->type == CLDFB_ANALYSIS )
    2405             :     {
    2406      484586 :         memory_length = offset;
    2407      484586 :         move16();
    2408             :     }
    2409             :     ELSE
    2410             :     {
    2411      888540 :         memory_length = hs->p_filter_length;
    2412      888540 :         move16();
    2413             :     }
    2414             : 
    2415     1373126 :     hs->cldfb_state_length = memory_length;
    2416     1373126 :     move16();
    2417             :     /* save the memory */
    2418     1373126 :     set32_fx( hs->cldfb_state_fx, 0, memory_length );
    2419     1373126 :     hs->Q_cldfb_state = Q11;
    2420     1373126 :     move16();
    2421             : 
    2422     1373126 :     return;
    2423             : }

Generated by: LCOV version 1.14