LCOV - code coverage report
Current view: top level - lib_com - cldfb_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main -- dec/rend @ 633e3f2e309758d10805ef21e0436356fe719b7a Lines: 711 1315 54.1 %
Date: 2025-08-23 01:22:27 Functions: 12 17 70.6 %

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

Generated by: LCOV version 1.14