LCOV - code coverage report
Current view: top level - lib_com - cldfb.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ fad4d7ba6e6a5c113994f3d29634634b872c6804 Lines: 1134 1383 82.0 %
Date: 2025-05-16 01:59:29 Functions: 17 17 100.0 %

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

Generated by: LCOV version 1.14