LCOV - code coverage report
Current view: top level - lib_com - cldfb.c (source / functions) Hit Total Coverage
Test: Coverage on main -- short test vectors @ 6c9ddc4024a9c0e1ecb8f643f114a84a0e26ec6b Lines: 474 541 87.6 %
Date: 2025-05-23 08:37:30 Functions: 14 14 100.0 %

          Line data    Source code
       1             : /******************************************************************************************************
       2             : 
       3             :    (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
       4             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
       5             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
       6             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
       7             :    contributors to this repository. All Rights Reserved.
       8             : 
       9             :    This software is protected by copyright law and by international treaties.
      10             :    The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
      11             :    Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
      12             :    Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
      13             :    Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
      14             :    contributors to this repository retain full ownership rights in their respective contributions in
      15             :    the software. This notice grants no license of any kind, including but not limited to patent
      16             :    license, nor is any license granted by implication, estoppel or otherwise.
      17             : 
      18             :    Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
      19             :    contributions.
      20             : 
      21             :    This software is provided "AS IS", without any express or implied warranties. The software is in the
      22             :    development stage. It is intended exclusively for experts who have experience with such software and
      23             :    solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
      24             :    and fitness for a particular purpose are hereby disclaimed and excluded.
      25             : 
      26             :    Any dispute, controversy or claim arising under or in relation to providing this software shall be
      27             :    submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
      28             :    accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
      29             :    the United Nations Convention on Contracts on the International Sales of Goods.
      30             : 
      31             : *******************************************************************************************************/
      32             : 
      33             : /*====================================================================================
      34             :     EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
      35             :   ====================================================================================*/
      36             : 
      37             : #include <assert.h>
      38             : #include <stdint.h>
      39             : #include "options.h"
      40             : #ifdef DEBUGGING
      41             : #include "debug.h"
      42             : #endif
      43             : #include <math.h>
      44             : #include "stat_dec.h"
      45             : #include "prot.h"
      46             : #include "rom_com.h"
      47             : #include "wmc_auto.h"
      48             : 
      49             : #if __STDC_VERSION__ >= 199901L
      50             : #if defined __ICL
      51             : #define restrict __restrict
      52             : #endif
      53             : #else
      54             : #define restrict
      55             : #endif
      56             : 
      57             : 
      58             : /*-------------------------------------------------------------------*
      59             :  * Local prototypes
      60             :  *--------------------------------------------------------------------*/
      61             : 
      62             : static void cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs );
      63             : 
      64             : static float GetEnergyCldfb( float *energyValuesSum, float *energyLookahead, float **realValues, float **imagValues, const int16_t numberBands, int16_t numberCols, TEC_ENC_HANDLE hTecEnc );
      65             : 
      66             : /*-------------------------------------------------------------------*
      67             :  * cplxMult()
      68             :  *
      69             :  * Conduct complex multiplication
      70             :  *--------------------------------------------------------------------*/
      71             : 
      72  1290209688 : static void cplxMult(
      73             :     float *yr,      /* o  : real output */
      74             :     float *yi,      /* o  : imag output */
      75             :     const float xr, /* i  : real input 1*/
      76             :     const float xi, /* i  : imag input 1*/
      77             :     const float cr, /* i  : real input 1*/
      78             :     const float ci  /* i  : imag input 1*/
      79             : )
      80             : {
      81  1290209688 :     *yr = xr * cr - xi * ci;
      82  1290209688 :     *yi = xr * ci + xi * cr;
      83             : 
      84  1290209688 :     return;
      85             : }
      86             : 
      87             : 
      88             : /*-------------------------------------------------------------------*
      89             :  * cldfbAnalysis()
      90             :  *
      91             :  * Conduct multiple overlap complex low delay MDCT
      92             :  *--------------------------------------------------------------------*/
      93             : 
      94     1521224 : void cldfbAnalysis(
      95             :     const float *timeIn,             /* i  : time buffer         */
      96             :     float **realBuffer,              /* o  : real value buffer   */
      97             :     float **imagBuffer,              /* o  : imag value buffer   */
      98             :     const int16_t samplesToProcess,  /* i  : samples to process  */
      99             :     HANDLE_CLDFB_FILTER_BANK h_cldfb /* i  : filterbank state    */
     100             : )
     101             : {
     102             :     int16_t i, k;
     103             :     int16_t L2, M1, M2, M4;
     104     1521224 :     int16_t no_col = h_cldfb->no_col;
     105             : 
     106             :     float r1, r2, rr12, ir12;
     107             :     float i1, i2, ri12, ii12;
     108             :     float rBuffer[2 * CLDFB_NO_CHANNELS_MAX];
     109             :     float iBuffer[2 * CLDFB_NO_CHANNELS_MAX];
     110             :     const float *rot_vctr_re;
     111             :     const float *rot_vctr_im;
     112             :     const float *ptr_pf;
     113             :     float *timeBuffer, buffer[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )];
     114             :     int16_t offset, frameSize;
     115             : 
     116     1521224 :     offset = h_cldfb->p_filter_length - h_cldfb->no_channels;
     117     1521224 :     frameSize = h_cldfb->no_channels * h_cldfb->no_col;
     118             : 
     119     1521224 :     assert( h_cldfb->prototype == CLDFB_PROTOTYPE_1_25MS );
     120             :     /* prepare input buffer */
     121     1521224 :     timeBuffer = buffer;
     122     1521224 :     mvr2r( h_cldfb->cldfb_state, timeBuffer, offset );
     123             : 
     124     1521224 :     if ( samplesToProcess > -1 )
     125             :     {
     126      675989 :         mvr2r( timeIn, timeBuffer + offset, samplesToProcess );
     127      675989 :         set_f( timeBuffer + offset + samplesToProcess, 0.0f, ( frameSize - samplesToProcess ) );
     128             :     }
     129             :     else
     130             :     {
     131      845235 :         mvr2r( timeIn, timeBuffer + offset, frameSize );
     132             :     }
     133             : 
     134             :     /* only process needed cols */
     135     1521224 :     if ( samplesToProcess > -1 )
     136             :     {
     137      675989 :         no_col = min( no_col, ( samplesToProcess + h_cldfb->no_channels - 1 ) / h_cldfb->no_channels );
     138             :     }
     139             : 
     140     1521224 :     M1 = h_cldfb->no_channels;
     141     1521224 :     M2 = M1 >> 1;
     142     1521224 :     M4 = M1 >> 2;
     143     1521224 :     L2 = M1 << 1;
     144             : 
     145     1521224 :     if ( M2 & 1 )
     146             :     {
     147           0 :         M4 += 1;
     148             :     }
     149             : 
     150     1521224 :     rot_vctr_re = h_cldfb->rot_vec_ana_re;
     151     1521224 :     rot_vctr_im = h_cldfb->rot_vec_ana_im;
     152             : 
     153     1521224 :     ptr_pf = h_cldfb->p_filter;
     154             : 
     155    23865343 :     for ( i = 0; i < no_col; i++ )
     156             :     {
     157   183620330 :         for ( k = 0; k < M4; k++ )
     158             :         {
     159             :             /* prototype filter */
     160   161276211 :             r1 = 0 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 0 * L2];
     161   161276211 :             r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 1 * L2];
     162   161276211 :             r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 2 * L2];
     163   161276211 :             r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 3 * L2];
     164   161276211 :             r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 4 * L2];
     165             : 
     166   161276211 :             r2 = 0 - ptr_pf[( L2 - M2 + ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 0 * L2];
     167   161276211 :             r2 = r2 - ptr_pf[( L2 - M2 + ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 1 * L2];
     168   161276211 :             r2 = r2 - ptr_pf[( L2 - M2 + ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 2 * L2];
     169   161276211 :             r2 = r2 - ptr_pf[( L2 - M2 + ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 3 * L2];
     170   161276211 :             r2 = r2 - ptr_pf[( L2 - M2 + ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 4 * L2];
     171             : 
     172   161276211 :             i1 = 0 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 0 * L2];
     173   161276211 :             i1 = i1 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 1 * L2];
     174   161276211 :             i1 = i1 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 2 * L2];
     175   161276211 :             i1 = i1 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 3 * L2];
     176   161276211 :             i1 = i1 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 4 * L2];
     177             : 
     178   161276211 :             i2 = 0 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2];
     179   161276211 :             i2 = i2 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2];
     180   161276211 :             i2 = i2 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2];
     181   161276211 :             i2 = i2 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2];
     182   161276211 :             i2 = i2 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2];
     183             : 
     184             :             /* folding + pre modulation of DST IV */
     185   161276211 :             rr12 = r1 - r2;
     186   161276211 :             ri12 = -i1 - i2;
     187   161276211 :             cplxMult( &rBuffer[2 * k], &rBuffer[2 * k + 1], rr12, ri12, rot_vctr_re[k], rot_vctr_im[k] );
     188             : 
     189             :             /* folding + pre modulation of DCT IV */
     190   161276211 :             ir12 = r1 + r2;
     191   161276211 :             ii12 = i1 - i2;
     192   161276211 :             cplxMult( &iBuffer[2 * k], &iBuffer[2 * k + 1], ir12, ii12, rot_vctr_re[k], rot_vctr_im[k] );
     193             :         }
     194             : 
     195   183620330 :         for ( k = M4; k < M2; k++ )
     196             :         {
     197             :             /* prototype filter */
     198   161276211 :             r1 = 0 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 0 * L2];
     199   161276211 :             r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 1 * L2];
     200   161276211 :             r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 2 * L2];
     201   161276211 :             r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 3 * L2];
     202   161276211 :             r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 4 * L2];
     203             : 
     204   161276211 :             r2 = 0 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 0 * L2];
     205   161276211 :             r2 = r2 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 1 * L2];
     206   161276211 :             r2 = r2 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 2 * L2];
     207   161276211 :             r2 = r2 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 3 * L2];
     208   161276211 :             r2 = r2 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 4 * L2];
     209             : 
     210   161276211 :             i1 = 0 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 0 * L2];
     211   161276211 :             i1 = i1 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 1 * L2];
     212   161276211 :             i1 = i1 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 2 * L2];
     213   161276211 :             i1 = i1 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 3 * L2];
     214   161276211 :             i1 = i1 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 4 * L2];
     215             : 
     216   161276211 :             i2 = 0 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 0 * L2];
     217   161276211 :             i2 = i2 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 1 * L2];
     218   161276211 :             i2 = i2 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 2 * L2];
     219   161276211 :             i2 = i2 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 3 * L2];
     220   161276211 :             i2 = i2 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 4 * L2];
     221             : 
     222             :             /* folding + pre modulation of DST IV */
     223   161276211 :             rr12 = r1 + r2;
     224   161276211 :             ri12 = i1 - i2;
     225   161276211 :             cplxMult( &rBuffer[2 * k], &rBuffer[2 * k + 1], rr12, ri12, rot_vctr_re[k], rot_vctr_im[k] );
     226             : 
     227             :             /* folding + pre modulation of DCT IV */
     228   161276211 :             ir12 = r1 - r2;
     229   161276211 :             ii12 = i1 + i2;
     230   161276211 :             cplxMult( &iBuffer[2 * k], &iBuffer[2 * k + 1], ir12, ii12, rot_vctr_re[k], rot_vctr_im[k] );
     231             :         }
     232             : 
     233             :         /* FFT of DST IV */
     234    22344119 :         fft_cldfb( rBuffer, M2 );
     235             : 
     236             :         /* post modulation of DST IV */
     237   344896541 :         for ( k = 0; k < M2; k++ )
     238             :         {
     239   322552422 :             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] );
     240             :         }
     241             : 
     242             :         /* FFT of DCT IV */
     243    22344119 :         fft_cldfb( iBuffer, M2 );
     244             : 
     245             :         /* post modulation of DCT IV */
     246   344896541 :         for ( k = 0; k < M2; k++ )
     247             :         {
     248             :             /* do it inplace */
     249   322552422 :             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] );
     250             :         }
     251             : 
     252    22344119 :         timeBuffer += L2 * 5;
     253    22344119 :         timeBuffer += h_cldfb->no_channels - h_cldfb->p_filter_length;
     254             :     }
     255             : 
     256             :     /* update memory */
     257     1521224 :     mvr2r( buffer + frameSize, h_cldfb->cldfb_state, offset );
     258             : 
     259     1521224 :     return;
     260             : }
     261             : 
     262             : /*-------------------------------------------------------------------*
     263             :  * cldfbAnalysis_ts()
     264             :  *
     265             :  *
     266             :  *--------------------------------------------------------------------*/
     267             : 
     268    39054814 : void cldfbAnalysis_ts(
     269             :     const float *timeIn,                     /* i  : time buffer         */
     270             :     float realBuffer[CLDFB_NO_CHANNELS_MAX], /* o  : real value buffer   */
     271             :     float imagBuffer[CLDFB_NO_CHANNELS_MAX], /* o  : imag value buffer   */
     272             :     const int16_t samplesToProcess,          /* i  : samples to process  */
     273             :     HANDLE_CLDFB_FILTER_BANK h_cldfb         /* i  : filterbank state    */
     274             : )
     275             : {
     276             :     int16_t i, k;
     277             :     int16_t L2, M1, M2, M4;
     278    39054814 :     int16_t no_col = h_cldfb->no_col;
     279             : 
     280             :     float r1, r2, rr12, ir12;
     281             :     float i1, i2, ri12, ii12;
     282             :     float rBuffer[2 * CLDFB_NO_CHANNELS_MAX];
     283             :     float iBuffer[2 * CLDFB_NO_CHANNELS_MAX];
     284             :     const float *rot_vctr_re;
     285             :     const float *rot_vctr_im;
     286             :     const float *rot_vctr_delay_re;
     287             :     const float *rot_vctr_delay_im;
     288             :     const float *ptr_pf;
     289             :     float *timeBuffer, buffer[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )];
     290             :     int16_t offset, frameSize;
     291             : 
     292    39054814 :     offset = h_cldfb->p_filter_length - h_cldfb->no_channels;
     293    39054814 :     frameSize = h_cldfb->no_channels * h_cldfb->no_col;
     294             : 
     295             :     /* prepare input buffer */
     296    39054814 :     timeBuffer = buffer;
     297    39054814 :     mvr2r( h_cldfb->cldfb_state, timeBuffer, offset );
     298             : 
     299    39054814 :     if ( samplesToProcess > -1 )
     300             :     {
     301    39054814 :         mvr2r( timeIn, timeBuffer + offset, samplesToProcess );
     302    39054814 :         set_f( timeBuffer + offset + samplesToProcess, 0.0f, ( frameSize - samplesToProcess ) );
     303             :     }
     304             :     else
     305             :     {
     306           0 :         mvr2r( timeIn, timeBuffer + offset, frameSize );
     307             :     }
     308             : 
     309             :     /* only process needed cols */
     310    39054814 :     if ( samplesToProcess > -1 )
     311             :     {
     312    39054814 :         no_col = min( no_col, ( samplesToProcess + h_cldfb->no_channels - 1 ) / h_cldfb->no_channels );
     313    39054814 :         assert( no_col == 1 );
     314             :     }
     315             : 
     316    39054814 :     M1 = h_cldfb->no_channels;
     317    39054814 :     M2 = M1 >> 1;
     318    39054814 :     M4 = M1 >> 2;
     319    39054814 :     L2 = M1 << 1;
     320             : 
     321    39054814 :     if ( M2 & 1 )
     322             :     {
     323           0 :         M4 += 1;
     324             :     }
     325             : 
     326    39054814 :     rot_vctr_re = h_cldfb->rot_vec_ana_re;
     327    39054814 :     rot_vctr_im = h_cldfb->rot_vec_ana_im;
     328    39054814 :     rot_vctr_delay_re = h_cldfb->rot_vec_ana_delay_re;
     329    39054814 :     rot_vctr_delay_im = h_cldfb->rot_vec_ana_delay_im;
     330             : 
     331    39054814 :     ptr_pf = h_cldfb->p_filter;
     332             : 
     333    78109628 :     for ( i = 0; i < no_col; i++ )
     334             :     {
     335   542840248 :         for ( k = 0; k < M4; k++ )
     336             :         {
     337             :             /* prototype filter */
     338   503785434 :             r1 = 0 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 0 * L2];
     339   503785434 :             r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 1 * L2];
     340   503785434 :             r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 2 * L2];
     341   503785434 :             r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 3 * L2];
     342   503785434 :             r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 4 * L2];
     343             : 
     344   503785434 :             r2 = 0 - ptr_pf[( L2 - M2 + ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 0 * L2];
     345   503785434 :             r2 = r2 - ptr_pf[( L2 - M2 + ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 1 * L2];
     346   503785434 :             r2 = r2 - ptr_pf[( L2 - M2 + ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 2 * L2];
     347   503785434 :             r2 = r2 - ptr_pf[( L2 - M2 + ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 3 * L2];
     348   503785434 :             r2 = r2 - ptr_pf[( L2 - M2 + ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - M2 + ( 2 * k ) + 4 * L2];
     349             : 
     350   503785434 :             i1 = 0 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 0 * L2];
     351   503785434 :             i1 = i1 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 1 * L2];
     352   503785434 :             i1 = i1 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 2 * L2];
     353   503785434 :             i1 = i1 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 3 * L2];
     354   503785434 :             i1 = i1 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 4 * L2];
     355             : 
     356   503785434 :             i2 = 0 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2];
     357   503785434 :             i2 = i2 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2];
     358   503785434 :             i2 = i2 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2];
     359   503785434 :             i2 = i2 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2];
     360   503785434 :             i2 = i2 - ptr_pf[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2];
     361             : 
     362             :             /* folding + pre modulation of DST IV */
     363   503785434 :             rr12 = r1 - r2;
     364   503785434 :             ri12 = -i1 - i2;
     365             :             /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
     366   503785434 :             rBuffer[2 * k] = rr12 * rot_vctr_re[k] - ri12 * rot_vctr_im[k];
     367   503785434 :             rBuffer[2 * k + 1] = rr12 * rot_vctr_im[k] + ri12 * rot_vctr_re[k];
     368             : 
     369             :             /* folding + pre modulation of DCT IV */
     370   503785434 :             ir12 = r1 + r2;
     371   503785434 :             ii12 = i1 - i2;
     372             :             /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
     373   503785434 :             iBuffer[2 * k] = ir12 * rot_vctr_re[k] - ii12 * rot_vctr_im[k];
     374   503785434 :             iBuffer[2 * k + 1] = ir12 * rot_vctr_im[k] + ii12 * rot_vctr_re[k];
     375             :         }
     376             : 
     377   542840248 :         for ( k = M4; k < M2; k++ )
     378             :         {
     379             :             /* prototype filter */
     380   503785434 :             r1 = 0 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 0 * L2];
     381   503785434 :             r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 1 * L2];
     382   503785434 :             r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 2 * L2];
     383   503785434 :             r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 3 * L2];
     384   503785434 :             r1 = r1 - ptr_pf[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - M2 - 1 - ( 2 * k ) + 4 * L2];
     385             : 
     386   503785434 :             r2 = 0 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 0 * L2];
     387   503785434 :             r2 = r2 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 1 * L2];
     388   503785434 :             r2 = r2 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 2 * L2];
     389   503785434 :             r2 = r2 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 3 * L2];
     390   503785434 :             r2 = r2 - ptr_pf[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - 5 * M2 + ( 2 * k ) + 4 * L2];
     391             : 
     392   503785434 :             i1 = 0 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 0 * L2];
     393   503785434 :             i1 = i1 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 1 * L2];
     394   503785434 :             i1 = i1 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 2 * L2];
     395   503785434 :             i1 = i1 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 3 * L2];
     396   503785434 :             i1 = i1 - ptr_pf[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 + M2 - 1 - ( 2 * k ) + 4 * L2];
     397             : 
     398   503785434 :             i2 = 0 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 0 * L2];
     399   503785434 :             i2 = i2 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 1 * L2];
     400   503785434 :             i2 = i2 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 2 * L2];
     401   503785434 :             i2 = i2 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 3 * L2];
     402   503785434 :             i2 = i2 - ptr_pf[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] * timeBuffer[L2 - 3 * M2 + ( 2 * k ) + 4 * L2];
     403             : 
     404             :             /* folding + pre modulation of DST IV */
     405   503785434 :             rr12 = r1 + r2;
     406   503785434 :             ri12 = i1 - i2;
     407             :             /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/
     408   503785434 :             rBuffer[2 * k] = rr12 * rot_vctr_re[k] - ri12 * rot_vctr_im[k];
     409   503785434 :             rBuffer[2 * k + 1] = rr12 * rot_vctr_im[k] + ri12 * rot_vctr_re[k];
     410             : 
     411             :             /* folding + pre modulation of DCT IV */
     412   503785434 :             ir12 = r1 - r2;
     413   503785434 :             ii12 = i1 + i2;
     414             :             /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/
     415   503785434 :             iBuffer[2 * k] = ir12 * rot_vctr_re[k] - ii12 * rot_vctr_im[k];
     416   503785434 :             iBuffer[2 * k + 1] = ir12 * rot_vctr_im[k] + ii12 * rot_vctr_re[k];
     417             :         }
     418             : 
     419             :         /* FFT of DST IV */
     420    39054814 :         fft_cldfb( rBuffer, M2 );
     421             : 
     422             :         /* post modulation of DST IV */
     423  1046625682 :         for ( k = 0; k < M2; k++ )
     424             :         {
     425             :             /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
     426  1007570868 :             realBuffer[M1 - 1 - ( 2 * k )] = rBuffer[2 * k] * rot_vctr_re[k] - rBuffer[2 * k + 1] * rot_vctr_im[k];
     427  1007570868 :             realBuffer[2 * k] = rBuffer[2 * k] * rot_vctr_im[k] + rBuffer[2 * k + 1] * rot_vctr_re[k];
     428             :         }
     429             : 
     430             :         /* FFT of DCT IV */
     431    39054814 :         fft_cldfb( iBuffer, M2 );
     432             : 
     433             :         /* post modulation of DCT IV */
     434  1046625682 :         for ( k = 0; k < M2; k++ )
     435             :         {
     436             :             /* do it inplace */
     437             :             /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/
     438  1007570868 :             imagBuffer[2 * k] = iBuffer[2 * k] * rot_vctr_re[k] - iBuffer[2 * k + 1] * rot_vctr_im[k];
     439  1007570868 :             imagBuffer[M1 - 1 - ( 2 * k )] = iBuffer[2 * k] * rot_vctr_im[k] + iBuffer[2 * k + 1] * rot_vctr_re[k];
     440             :         }
     441             : 
     442    39054814 :         if ( h_cldfb->prototype == CLDFB_PROTOTYPE_5_00MS )
     443             :         {
     444             :             /* rotation due to delay*/
     445             :             /*if(h_cldfb->da != M1)*/
     446    39054814 :             if ( rot_vctr_delay_re != NULL )
     447             :             {
     448  2054196550 :                 for ( k = 0; k < M1; k++ )
     449             :                 {
     450             :                     float cplx_aux;
     451             :                     /* delay */
     452             :                     /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[i][k], imagBuffer[i][k], cos((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)),
     453             :                             sin((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)));*/
     454             :                     /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
     455             :                     /*cplxMult(&realBuffer[k], &imagBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/
     456             :                     /*realBuffer[k] = rBuffer[k];
     457             :                     imagBuffer[k] = iBuffer[k];*/
     458  2015141736 :                     cplx_aux = realBuffer[k] * rot_vctr_delay_re[k] - imagBuffer[k] * rot_vctr_delay_im[k];
     459  2015141736 :                     imagBuffer[k] = realBuffer[k] * rot_vctr_delay_im[k] + imagBuffer[k] * rot_vctr_delay_re[k];
     460  2015141736 :                     realBuffer[k] = cplx_aux;
     461             :                 }
     462             :             }
     463             :         }
     464             : 
     465    39054814 :         timeBuffer += L2 * 5;
     466    39054814 :         timeBuffer += h_cldfb->no_channels - h_cldfb->p_filter_length;
     467             :     }
     468             : 
     469             :     /* update memory */
     470    39054814 :     if ( samplesToProcess > -1 )
     471             :     {
     472    39054814 :         mvr2r( buffer + samplesToProcess, h_cldfb->cldfb_state, offset );
     473             :     }
     474             :     else
     475             :     {
     476           0 :         mvr2r( buffer + frameSize, h_cldfb->cldfb_state, offset );
     477             :     }
     478             : 
     479    39054814 :     return;
     480             : }
     481             : 
     482             : /*-------------------------------------------------------------------*
     483             :  * cldfbSynthesis()
     484             :  *
     485             :  * Conduct inverse multple overlap cmplex low delay MDCT
     486             :  *--------------------------------------------------------------------*/
     487             : 
     488    36919794 : void cldfbSynthesis(
     489             :     float **realBuffer,              /* i  : real values                 */
     490             :     float **imagBuffer,              /* i  : imag values                 */
     491             :     float *timeOut,                  /* o  : output time domain samples  */
     492             :     const int16_t samplesToProcess,  /* i  : number of processed samples */
     493             :     HANDLE_CLDFB_FILTER_BANK h_cldfb /* i  : filter bank state           */
     494             : )
     495             : {
     496             :     int16_t i;
     497             :     int16_t k;
     498             :     int16_t L2;
     499             :     int16_t M1;
     500             :     int16_t M2;
     501             :     int16_t M41;
     502             :     int16_t M42;
     503             :     int16_t Mz;
     504             : 
     505             :     float rBuffer[2 * CLDFB_NO_CHANNELS_MAX];
     506             :     float iBuffer[2 * CLDFB_NO_CHANNELS_MAX];
     507             :     const float *rot_vctr_re;
     508             :     const float *rot_vctr_im;
     509             :     const float *rot_vctr_delay_re;
     510             :     const float *rot_vctr_delay_im;
     511             :     float rr12, ir12;
     512             :     float ri12, ii12;
     513             : 
     514             :     float *synthesisBuffer, buffer[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 10 * CLDFB_NO_CHANNELS_MAX )];
     515             :     float new_samples[2 * CLDFB_NO_CHANNELS_MAX];
     516             : 
     517             :     float *ptr_time_out;
     518             :     const float *p_filter;
     519             : 
     520             :     float accu0, accu1, accu2, accu3, accu4;
     521    36919794 :     int16_t no_col = h_cldfb->no_col;
     522             : 
     523    36919794 :     M1 = h_cldfb->no_channels;
     524    36919794 :     L2 = M1 << 1;
     525    36919794 :     M2 = M1 >> 1;
     526    36919794 :     M41 = M2 >> 1;
     527    36919794 :     M42 = M2 - M41;
     528    36919794 :     Mz = M1 - h_cldfb->bandsToZero;
     529             : 
     530             :     /* only process needed cols */
     531    36919794 :     if ( samplesToProcess > -1 )
     532             :     {
     533    36332904 :         no_col = min( no_col, ( samplesToProcess + h_cldfb->no_channels - 1 ) / h_cldfb->no_channels );
     534             :     }
     535             : 
     536    36919794 :     rot_vctr_re = h_cldfb->rot_vec_syn_re;
     537    36919794 :     rot_vctr_im = h_cldfb->rot_vec_syn_im;
     538             : 
     539    36919794 :     rot_vctr_delay_re = h_cldfb->rot_vec_syn_delay_re;
     540    36919794 :     rot_vctr_delay_im = h_cldfb->rot_vec_syn_delay_im;
     541             : 
     542    36919794 :     synthesisBuffer = buffer;
     543    36919794 :     mvr2r( h_cldfb->cldfb_state, synthesisBuffer + ( M1 * no_col ), h_cldfb->p_filter_length );
     544             : 
     545    36919794 :     p_filter = h_cldfb->p_filter;
     546    36919794 :     ptr_time_out = timeOut;
     547             : 
     548             :     /*synthesisBuffer += M1 * h_cldfb->no_col;*/
     549    36919794 :     synthesisBuffer += M1 * no_col;
     550             : 
     551    94341255 :     for ( k = 0; k < no_col; k++ )
     552             :     {
     553    57421461 :         if ( h_cldfb->prototype == CLDFB_PROTOTYPE_5_00MS )
     554             :         {
     555             :             /* rotation due to delay*/
     556             :             /*if(h_cldfb->ds != M1)*/
     557    46716954 :             if ( rot_vctr_delay_re != NULL )
     558             :             {
     559  2513757354 :                 for ( i = 0; i < M1; i++ )
     560             :                 {
     561             :                     float cplx_aux;
     562             :                     /* delay */
     563             :                     /*cplxMult(&rBuffer[i], &iBuffer[i], realBuffer[k][i], imagBuffer[k][i], cos((EVS_PI/M1)*(i+0.5)*(-(h_cldfb->ds-M1)*0.5)),
     564             :                             sin((EVS_PI/M1)*(i+0.5)*(-(h_cldfb->ds-M1)*0.5)));*/
     565             :                     /*cplxMult(&rBuffer[i], &iBuffer[i], realBuffer[k][i], imagBuffer[k][i], rot_vctr_delay_re[i], rot_vctr_delay_im[i]);*/
     566             :                     /*cplxMult(&realBuffer[k][i], &imagBuffer[k][i], realBuffer[k][i], imagBuffer[k][i], rot_vctr_delay_re[i], rot_vctr_delay_im[i]);*/
     567  2467040400 :                     cplx_aux = realBuffer[k][i] * rot_vctr_delay_re[i] - imagBuffer[k][i] * rot_vctr_delay_im[i];
     568  2467040400 :                     imagBuffer[k][i] = realBuffer[k][i] * rot_vctr_delay_im[i] + imagBuffer[k][i] * rot_vctr_delay_re[i];
     569  2467040400 :                     realBuffer[k][i] = cplx_aux;
     570             :                     /*realBuffer[k][i] = rBuffer[i];
     571             :                     imagBuffer[k][i] = iBuffer[i];*/
     572             :                 }
     573             :             }
     574             :         }
     575   317538969 :         for ( i = Mz; i < M1; i++ )
     576             :         {
     577   260117508 :             realBuffer[k][i] = 0.0f;
     578   260117508 :             imagBuffer[k][i] = 0.0f;
     579             :         }
     580             : 
     581  1535430471 :         for ( i = 0; i < M2; i++ )
     582             :         {
     583             :             /* pre modulation of DST IV */
     584             :             /*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]);*/
     585  1478009010 :             rBuffer[2 * i] = realBuffer[k][2 * i] * rot_vctr_re[i] - realBuffer[k][M1 - 1 - 2 * i] * rot_vctr_im[i];
     586  1478009010 :             rBuffer[2 * i + 1] = realBuffer[k][2 * i] * rot_vctr_im[i] + realBuffer[k][M1 - 1 - 2 * i] * rot_vctr_re[i];
     587             : 
     588             :             /* pre modulation of DCT IV */
     589             :             /*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]);*/
     590  1478009010 :             iBuffer[2 * i] = ( -( imagBuffer[k][2 * i] ) ) * rot_vctr_re[i] - imagBuffer[k][M1 - 1 - 2 * i] * rot_vctr_im[i];
     591  1478009010 :             iBuffer[2 * i + 1] = ( -( imagBuffer[k][2 * i] ) ) * rot_vctr_im[i] + imagBuffer[k][M1 - 1 - 2 * i] * rot_vctr_re[i];
     592             :         }
     593             : 
     594             :         /* FFT of DST IV */
     595    57421461 :         fft_cldfb( rBuffer, M2 );
     596             : 
     597             :         /* FFT of DCT IV */
     598    57421461 :         fft_cldfb( iBuffer, M2 );
     599             : 
     600             :         /* folding */
     601   796425966 :         for ( i = 0; i < M41; i++ )
     602             :         {
     603             :             /* post modulation of DST IV */
     604   739004505 :             rr12 = rBuffer[M1 - 2 - 2 * i] * rot_vctr_re[M2 - 1 - i] - rBuffer[M1 - 1 - 2 * i] * rot_vctr_im[M2 - 1 - i];
     605   739004505 :             ri12 = rBuffer[M1 - 2 - 2 * i] * rot_vctr_im[M2 - 1 - i] + rBuffer[M1 - 1 - 2 * i] * rot_vctr_re[M2 - 1 - i];
     606             : 
     607             :             /* post modulation of DCT IV */
     608   739004505 :             ir12 = iBuffer[M1 - 2 - 2 * i] * rot_vctr_re[M2 - 1 - i] - iBuffer[M1 - 1 - 2 * i] * rot_vctr_im[M2 - 1 - i];
     609   739004505 :             ii12 = iBuffer[M1 - 2 - 2 * i] * rot_vctr_im[M2 - 1 - i] + iBuffer[M1 - 1 - 2 * i] * rot_vctr_re[M2 - 1 - i];
     610             : 
     611   739004505 :             new_samples[M1 + M2 + 1 + 2 * i] = -rr12 - ii12;
     612   739004505 :             new_samples[M2 - 2 - 2 * i] = -ri12 - ir12;
     613             : 
     614   739004505 :             new_samples[M1 + M2 - 2 - 2 * i] = rr12 - ii12;
     615   739004505 :             new_samples[M2 + 1 + 2 * i] = ir12 - ri12;
     616             :         }
     617             : 
     618   796425966 :         for ( i = 0; i < M42; i++ )
     619             :         {
     620             :             /* post modulation of DST IV */
     621   739004505 :             rr12 = rBuffer[2 * i] * rot_vctr_re[i] - rBuffer[2 * i + 1] * rot_vctr_im[i];
     622   739004505 :             ri12 = rBuffer[2 * i] * rot_vctr_im[i] + rBuffer[2 * i + 1] * rot_vctr_re[i];
     623             : 
     624             :             /* post modulation of DCT IV */
     625   739004505 :             ir12 = iBuffer[2 * i] * rot_vctr_re[i] - iBuffer[2 * i + 1] * rot_vctr_im[i];
     626   739004505 :             ii12 = iBuffer[2 * i] * rot_vctr_im[i] + iBuffer[2 * i + 1] * rot_vctr_re[i];
     627             : 
     628   739004505 :             new_samples[M1 + M2 + 2 * i] = ri12 + ir12;
     629   739004505 :             new_samples[M2 - 1 - 2 * i] = rr12 + ii12;
     630             : 
     631   739004505 :             new_samples[M1 + M2 - 1 - 2 * i] = ir12 - ri12;
     632   739004505 :             new_samples[M2 + 2 * i] = rr12 - ii12;
     633             :         }
     634             : 
     635             :         /* synthesis prototype filter */
     636  5969457501 :         for ( i = 0; i < L2; i++ )
     637             :         {
     638  5912036040 :             accu0 = synthesisBuffer[0 * L2 + i] + p_filter[( 0 * L2 + i )] * new_samples[L2 - 1 - i];
     639  5912036040 :             accu1 = synthesisBuffer[1 * L2 + i] + p_filter[( 1 * L2 + i )] * new_samples[L2 - 1 - i];
     640  5912036040 :             accu2 = synthesisBuffer[2 * L2 + i] + p_filter[( 2 * L2 + i )] * new_samples[L2 - 1 - i];
     641  5912036040 :             accu3 = synthesisBuffer[3 * L2 + i] + p_filter[( 3 * L2 + i )] * new_samples[L2 - 1 - i];
     642  5912036040 :             accu4 = synthesisBuffer[4 * L2 + i] + p_filter[( 4 * L2 + i )] * new_samples[L2 - 1 - i];
     643             : 
     644  5912036040 :             synthesisBuffer[0 * L2 + i] = accu0;
     645  5912036040 :             synthesisBuffer[1 * L2 + i] = accu1;
     646  5912036040 :             synthesisBuffer[2 * L2 + i] = accu2;
     647  5912036040 :             synthesisBuffer[3 * L2 + i] = accu3;
     648  5912036040 :             synthesisBuffer[4 * L2 + i] = accu4;
     649             :         }
     650             : 
     651  3013439481 :         for ( i = 0; i < M1; i++ )
     652             :         {
     653  2956018020 :             ptr_time_out[M1 - 1 - i] = synthesisBuffer[4 * L2 + M1 + i];
     654             :         }
     655             : 
     656    57421461 :         ptr_time_out += M1;
     657             : 
     658    57421461 :         synthesisBuffer -= M1;
     659             : 
     660    57421461 :         set_f( synthesisBuffer, 0, M1 );
     661             :     }
     662             : 
     663             :     /* update memory */
     664    36919794 :     mvr2r( buffer, h_cldfb->cldfb_state, h_cldfb->p_filter_length );
     665             : 
     666    36919794 :     return;
     667             : }
     668             : 
     669             : /*-------------------------------------------------------------------*
     670             :  * configureClfdb()
     671             :  *
     672             :  * configures a CLDFB handle
     673             :  *--------------------------------------------------------------------*/
     674             : 
     675      162103 : void configureCldfb(
     676             :     HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i/o: filter bank handle        */
     677             :     const int32_t sampling_rate       /* i  : sampling rate             */
     678             : )
     679             : {
     680             : 
     681      162103 :     h_cldfb->no_col = CLDFB_NO_COL_MAX;
     682      162103 :     h_cldfb->bandsToZero = 0;
     683      162103 :     h_cldfb->nab = 0;
     684             : 
     685      162103 :     h_cldfb->no_channels = (int16_t) ( sampling_rate * INV_CLDFB_BANDWIDTH + 0.5f );
     686      162103 :     h_cldfb->p_filter_length = 10 * h_cldfb->no_channels;
     687             : 
     688      162103 :     cldfb_init_proto_and_twiddles( h_cldfb );
     689             : 
     690      162103 :     return;
     691             : }
     692             : 
     693             : /*-------------------------------------------------------------------*
     694             :  * openClfdb()
     695             :  *
     696             :  * open and configures a CLDFB handle
     697             :  *--------------------------------------------------------------------*/
     698             : 
     699       97690 : ivas_error openCldfb(
     700             :     HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle                */
     701             :     CLDFB_TYPE type,                   /* i  : analysis or synthesis             */
     702             :     const int32_t sampling_rate,       /* i  : sampling rate                     */
     703             :     CLDFB_PROTOTYPE prototype          /* i  : CLDFB version (1.25ms/5ms delay)  */
     704             : )
     705             : {
     706             :     HANDLE_CLDFB_FILTER_BANK hs;
     707             :     int16_t buf_len;
     708             : 
     709       97690 :     if ( ( hs = (HANDLE_CLDFB_FILTER_BANK) malloc( sizeof( CLDFB_FILTER_BANK ) ) ) == NULL )
     710             :     {
     711           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" );
     712             :     }
     713             : 
     714       97690 :     hs->type = type;
     715       97690 :     hs->prototype = prototype;
     716             : 
     717       97690 :     configureCldfb( hs, sampling_rate );
     718       97690 :     hs->memory = NULL;
     719       97690 :     hs->memory_length = 0;
     720             : 
     721       97690 :     if ( type == CLDFB_ANALYSIS )
     722             :     {
     723       44251 :         buf_len = hs->p_filter_length - hs->no_channels;
     724             :     }
     725             :     else
     726             :     {
     727       53439 :         buf_len = hs->p_filter_length;
     728             :     }
     729             : 
     730       97690 :     if ( ( hs->cldfb_state = (float *) malloc( buf_len * sizeof( float ) ) ) == NULL )
     731             :     {
     732           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" );
     733             :     }
     734             : 
     735       97690 :     set_f( hs->cldfb_state, 0.0f, buf_len );
     736             : 
     737       97690 :     *h_cldfb = hs;
     738             : 
     739       97690 :     return IVAS_ERR_OK;
     740             : }
     741             : 
     742             : 
     743             : /*-------------------------------------------------------------------*
     744             :  * resampleCldfb()
     745             :  *
     746             :  * Change sample rate of filter bank
     747             :  *--------------------------------------------------------------------*/
     748             : 
     749       47055 : void resampleCldfb(
     750             :     HANDLE_CLDFB_FILTER_BANK hs, /* i/o: filter bank handle  */
     751             :     const int32_t newSamplerate )
     752             : {
     753             :     int16_t timeOffset;
     754             : 
     755             :     /* keep old parameters before switching*/
     756       47055 :     int16_t timeOffsetold = hs->p_filter_length - hs->no_channels;
     757             : 
     758             :     /* new settings */
     759       47055 :     configureCldfb( hs, newSamplerate );
     760       47055 :     timeOffset = hs->p_filter_length - hs->no_channels;
     761             : 
     762             :     /*low complexity-resampling only stored previous samples that are needed for next frame modulation */
     763       47055 :     lerp( hs->cldfb_state, hs->cldfb_state, timeOffset, timeOffsetold );
     764             : 
     765       47055 :     return;
     766             : }
     767             : 
     768             : /*-------------------------------------------------------------------*
     769             :  * analysisCLDFBEncoder()
     770             :  *
     771             :  * Encoder CLDFB analysis + energy stage
     772             :  *--------------------------------------------------------------------*/
     773             : 
     774      397925 : void analysisCldfbEncoder(
     775             :     Encoder_State *st, /* i/o: encoder state structure   */
     776             :     const float *timeIn,
     777             :     const int16_t samplesToProcess,
     778             :     float realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],
     779             :     float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX],
     780             :     float *ppBuf_Ener )
     781             : {
     782             :     int16_t i;
     783             :     float *ppBuf_Real[CLDFB_NO_COL_MAX];
     784             :     float *ppBuf_Imag[CLDFB_NO_COL_MAX];
     785             : 
     786     6764725 :     for ( i = 0; i < CLDFB_NO_COL_MAX; i++ )
     787             :     {
     788     6366800 :         ppBuf_Real[i] = &realBuffer[i][0];
     789     6366800 :         ppBuf_Imag[i] = &imagBuffer[i][0];
     790             :     }
     791             : 
     792      397925 :     cldfbAnalysis( timeIn, ppBuf_Real, ppBuf_Imag, samplesToProcess, st->cldfbAnaEnc );
     793             : 
     794      397925 :     st->currEnergyHF = GetEnergyCldfb( ppBuf_Ener, &st->currEnergyLookAhead, ppBuf_Real, ppBuf_Imag, st->cldfbAnaEnc->no_channels, st->cldfbAnaEnc->no_col, st->hTECEnc );
     795             : 
     796      397925 :     return;
     797             : }
     798             : 
     799             : /*-------------------------------------------------------------------*
     800             :  * GetEnergyCldfb()
     801             :  *
     802             :  * Conduct energy from complex data
     803             :  *--------------------------------------------------------------------*/
     804             : 
     805      397925 : static float GetEnergyCldfb(
     806             :     float *energyValuesSum,    /* o  : the result of the operation             */
     807             :     float *energyLookahead,    /* o  : the result in the core look-ahead slot  */
     808             :     float **realValues,        /* i  : the real part of the subsamples         */
     809             :     float **imagValues,        /* i  : the imaginary part of the subsamples    */
     810             :     const int16_t numberBands, /* i  : number of bands                         */
     811             :     int16_t numberCols,        /* i  : number of subsamples                    */
     812             :     TEC_ENC_HANDLE hTecEnc     /* i/o: TEC handle                              */
     813             : )
     814             : {
     815             :     int16_t j, k;
     816             :     float energyValues[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX];
     817      397925 :     int16_t numLookahead = 1;
     818             : 
     819     6764725 :     for ( k = 0; k < numberCols; k++ )
     820             :     {
     821   364871120 :         for ( j = 0; j < numberBands; j++ )
     822             :         {
     823   358504320 :             energyValues[k][j] = realValues[k][j] * realValues[k][j] +
     824   358504320 :                                  imagValues[k][j] * imagValues[k][j];
     825             :         }
     826             :     }
     827             : 
     828      397925 :     if ( numberBands >= freqTable[1] && hTecEnc != NULL )
     829             :     {
     830             :         float *tempEnergyValuesArry[CLDFB_NO_COL_MAX];
     831             : 
     832        3100 :         assert( numberCols == CLDFB_NO_COL_MAX );
     833       52700 :         for ( j = 0; j < numberCols; j++ )
     834             :         {
     835       49600 :             tempEnergyValuesArry[j] = &energyValues[j][0];
     836             :         }
     837             : 
     838        3100 :         calcHiEnvLoBuff( numberCols, freqTable, 1, tempEnergyValuesArry, hTecEnc->loBuffer, hTecEnc->hiTempEnv );
     839             :     }
     840             : 
     841    22804445 :     for ( j = 0; j < numberBands; j++ )
     842             :     {
     843    22406520 :         energyValuesSum[j] = 0;
     844   380910840 :         for ( k = 0; k < CLDFB_NO_COL_MAX; k++ )
     845             :         {
     846   358504320 :             energyValuesSum[j] += energyValues[k][j];
     847             :         }
     848             :     }
     849             : 
     850      397925 :     if ( numberBands > 20 )
     851             :     {
     852      381953 :         float energyHF = *energyLookahead; /* energy above 8 kHz */
     853      381953 :         numberCols -= numLookahead;
     854      381953 :         *energyLookahead = 6.1e-5f; /* process look-ahead region */
     855             : 
     856     8021013 :         for ( j = 20; j < min( 40, numberBands ); j++ )
     857             :         {
     858     7639060 :             energyHF += energyValuesSum[j];
     859             : 
     860    15278120 :             for ( k = numberCols; k < CLDFB_NO_COL_MAX; k++ )
     861             :             {
     862     7639060 :                 energyHF -= energyValues[k][j];
     863     7639060 :                 *energyLookahead += energyValues[k][j];
     864             :             }
     865             :         }
     866             : 
     867      381953 :         return energyHF * OUTMAX_SQ_INV;
     868             :     }
     869             : 
     870       15972 :     return 65535.0f;
     871             : }
     872             : 
     873             : 
     874             : /*-------------------------------------------------------------------*
     875             :  * GetEnergyCldfb()
     876             :  *
     877             :  * Remove handle
     878             :  *--------------------------------------------------------------------*/
     879             : 
     880      172425 : void deleteCldfb(
     881             :     HANDLE_CLDFB_FILTER_BANK *h_cldfb /* i/o: filter bank handle  */
     882             : )
     883             : {
     884      172425 :     HANDLE_CLDFB_FILTER_BANK hs = *h_cldfb;
     885             : 
     886      172425 :     if ( h_cldfb == NULL || *h_cldfb == NULL )
     887             :     {
     888       74735 :         return;
     889             :     }
     890             : 
     891       97690 :     if ( hs->cldfb_state )
     892             :     {
     893       97690 :         free( hs->cldfb_state );
     894             :     }
     895             : 
     896       97690 :     free( hs );
     897       97690 :     *h_cldfb = NULL;
     898             : 
     899       97690 :     return;
     900             : }
     901             : 
     902             : 
     903             : /*-------------------------------------------------------------------*
     904             :  * cldfb_init_proto_and_twiddles()
     905             :  *
     906             :  * Initializes rom pointer
     907             :  *--------------------------------------------------------------------*/
     908             : 
     909      162103 : static void cldfb_init_proto_and_twiddles(
     910             :     HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle  */
     911             : )
     912             : {
     913             :     /*find appropriate set of rotVecs*/
     914      162103 :     switch ( hs->no_channels )
     915             :     {
     916           0 :         case 10:
     917           0 :             hs->rot_vec_ana_re = rot_vec_ana_re_L10;
     918           0 :             hs->rot_vec_ana_im = rot_vec_ana_im_L10;
     919           0 :             hs->rot_vec_syn_re = rot_vec_syn_re_L10;
     920           0 :             hs->rot_vec_syn_im = rot_vec_syn_im_L10;
     921             : 
     922           0 :             if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
     923             :             {
     924           0 :                 hs->p_filter = CLDFB80_10;
     925           0 :                 hs->scale = CLDFB80_10_SCALE;
     926           0 :                 hs->ds = 10;
     927           0 :                 hs->da = 10;
     928           0 :                 hs->rot_vec_ana_delay_re = NULL;
     929           0 :                 hs->rot_vec_ana_delay_im = NULL;
     930           0 :                 hs->rot_vec_syn_delay_re = NULL;
     931           0 :                 hs->rot_vec_syn_delay_im = NULL;
     932             :             }
     933           0 :             else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS )
     934             :             {
     935           0 :                 hs->p_filter = LDQMF_10;
     936           0 :                 hs->scale = LDQMF_10_SCALE;
     937           0 :                 hs->ds = 40;
     938           0 :                 hs->da = -20;
     939           0 :                 hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF;
     940           0 :                 hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF;
     941           0 :                 hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF;
     942           0 :                 hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF;
     943             :             }
     944           0 :             break;
     945             : 
     946       28563 :         case 16:
     947       28563 :             hs->rot_vec_ana_re = rot_vec_ana_re_L16;
     948       28563 :             hs->rot_vec_ana_im = rot_vec_ana_im_L16;
     949       28563 :             hs->rot_vec_syn_re = rot_vec_syn_re_L16;
     950       28563 :             hs->rot_vec_syn_im = rot_vec_syn_im_L16;
     951       28563 :             if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
     952             :             {
     953       27918 :                 hs->p_filter = CLDFB80_16;
     954       27918 :                 hs->scale = CLDFB80_16_SCALE;
     955       27918 :                 hs->ds = 20;
     956       27918 :                 hs->da = 20;
     957       27918 :                 hs->rot_vec_ana_delay_re = NULL;
     958       27918 :                 hs->rot_vec_ana_delay_im = NULL;
     959       27918 :                 hs->rot_vec_syn_delay_re = NULL;
     960       27918 :                 hs->rot_vec_syn_delay_im = NULL;
     961             :             }
     962         645 :             else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS )
     963             :             {
     964         645 :                 hs->p_filter = LDQMF_16;
     965         645 :                 hs->scale = LDQMF_16_SCALE;
     966         645 :                 hs->ds = 80;
     967         645 :                 hs->da = -40;
     968         645 :                 hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF;
     969         645 :                 hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF;
     970         645 :                 hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF;
     971         645 :                 hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF;
     972             :             }
     973       28563 :             break;
     974             : 
     975       46700 :         case 20:
     976       46700 :             hs->rot_vec_ana_re = rot_vec_ana_re_L20;
     977       46700 :             hs->rot_vec_ana_im = rot_vec_ana_im_L20;
     978       46700 :             hs->rot_vec_syn_re = rot_vec_syn_re_L20;
     979       46700 :             hs->rot_vec_syn_im = rot_vec_syn_im_L20;
     980       46700 :             if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
     981             :             {
     982       41382 :                 hs->p_filter = CLDFB80_20;
     983       41382 :                 hs->scale = CLDFB80_20_SCALE;
     984       41382 :                 hs->ds = 20;
     985       41382 :                 hs->da = 20;
     986       41382 :                 hs->rot_vec_ana_delay_re = NULL;
     987       41382 :                 hs->rot_vec_ana_delay_im = NULL;
     988       41382 :                 hs->rot_vec_syn_delay_re = NULL;
     989       41382 :                 hs->rot_vec_syn_delay_im = NULL;
     990             :             }
     991        5318 :             else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS )
     992             :             {
     993        5318 :                 hs->p_filter = LDQMF_20;
     994        5318 :                 hs->scale = LDQMF_20_SCALE;
     995        5318 :                 hs->ds = 80;
     996        5318 :                 hs->da = -40;
     997        5318 :                 hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF;
     998        5318 :                 hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF;
     999        5318 :                 hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF;
    1000        5318 :                 hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF;
    1001             :             }
    1002       46700 :             break;
    1003             : 
    1004           0 :         case 30:
    1005           0 :             hs->rot_vec_ana_re = rot_vec_ana_re_L30;
    1006           0 :             hs->rot_vec_ana_im = rot_vec_ana_im_L30;
    1007           0 :             hs->rot_vec_syn_re = rot_vec_syn_re_L30;
    1008           0 :             hs->rot_vec_syn_im = rot_vec_syn_im_L30;
    1009           0 :             if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    1010             :             {
    1011           0 :                 hs->p_filter = CLDFB80_30;
    1012           0 :                 hs->scale = CLDFB80_30_SCALE;
    1013           0 :                 hs->ds = 30;
    1014           0 :                 hs->da = 30;
    1015           0 :                 hs->rot_vec_ana_delay_re = NULL;
    1016           0 :                 hs->rot_vec_ana_delay_im = NULL;
    1017           0 :                 hs->rot_vec_syn_delay_re = NULL;
    1018           0 :                 hs->rot_vec_syn_delay_im = NULL;
    1019             :             }
    1020           0 :             else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS )
    1021             :             {
    1022           0 :                 hs->p_filter = LDQMF_30;
    1023           0 :                 hs->scale = LDQMF_30_SCALE;
    1024           0 :                 hs->ds = 120;
    1025           0 :                 hs->da = -60;
    1026           0 :                 hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF;
    1027           0 :                 hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF;
    1028           0 :                 hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF;
    1029           0 :                 hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF;
    1030             :             }
    1031           0 :             break;
    1032             : 
    1033        5289 :         case 32:
    1034        5289 :             hs->rot_vec_ana_re = rot_vec_ana_re_L32;
    1035        5289 :             hs->rot_vec_ana_im = rot_vec_ana_im_L32;
    1036        5289 :             hs->rot_vec_syn_re = rot_vec_syn_re_L32;
    1037        5289 :             hs->rot_vec_syn_im = rot_vec_syn_im_L32;
    1038        5289 :             if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    1039             :             {
    1040        5289 :                 hs->p_filter = CLDFB80_32;
    1041        5289 :                 hs->scale = CLDFB80_32_SCALE;
    1042        5289 :                 hs->ds = 32;
    1043        5289 :                 hs->da = 32;
    1044        5289 :                 hs->rot_vec_ana_delay_re = NULL;
    1045        5289 :                 hs->rot_vec_ana_delay_im = NULL;
    1046        5289 :                 hs->rot_vec_syn_delay_re = NULL;
    1047        5289 :                 hs->rot_vec_syn_delay_im = NULL;
    1048             :             }
    1049           0 :             else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS )
    1050             :             {
    1051           0 :                 hs->p_filter = LDQMF_32;
    1052           0 :                 hs->scale = LDQMF_32_SCALE;
    1053           0 :                 hs->ds = 160;
    1054           0 :                 hs->da = -80;
    1055           0 :                 hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF;
    1056           0 :                 hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF;
    1057           0 :                 hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF;
    1058           0 :                 hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF;
    1059             :             }
    1060        5289 :             break;
    1061             : 
    1062       16597 :         case 40:
    1063       16597 :             hs->rot_vec_ana_re = rot_vec_ana_re_L40;
    1064       16597 :             hs->rot_vec_ana_im = rot_vec_ana_im_L40;
    1065       16597 :             hs->rot_vec_syn_re = rot_vec_syn_re_L40;
    1066       16597 :             hs->rot_vec_syn_im = rot_vec_syn_im_L40;
    1067       16597 :             if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    1068             :             {
    1069        9627 :                 hs->p_filter = CLDFB80_40;
    1070        9627 :                 hs->scale = CLDFB80_40_SCALE;
    1071        9627 :                 hs->ds = 40;
    1072        9627 :                 hs->da = 40;
    1073        9627 :                 hs->rot_vec_ana_delay_re = NULL;
    1074        9627 :                 hs->rot_vec_ana_delay_im = NULL;
    1075        9627 :                 hs->rot_vec_syn_delay_re = NULL;
    1076        9627 :                 hs->rot_vec_syn_delay_im = NULL;
    1077             :             }
    1078        6970 :             else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS )
    1079             :             {
    1080        6970 :                 hs->p_filter = LDQMF_40;
    1081        6970 :                 hs->scale = LDQMF_40_SCALE;
    1082        6970 :                 hs->ds = 160;
    1083        6970 :                 hs->da = -80;
    1084        6970 :                 hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF;
    1085        6970 :                 hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF;
    1086        6970 :                 hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF;
    1087        6970 :                 hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF;
    1088             :             }
    1089       16597 :             break;
    1090             : 
    1091       64954 :         case 60:
    1092       64954 :             hs->rot_vec_ana_re = rot_vec_ana_re_L60;
    1093       64954 :             hs->rot_vec_ana_im = rot_vec_ana_im_L60;
    1094       64954 :             hs->rot_vec_syn_re = rot_vec_syn_re_L60;
    1095       64954 :             hs->rot_vec_syn_im = rot_vec_syn_im_L60;
    1096       64954 :             if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS )
    1097             :             {
    1098       34533 :                 hs->p_filter = CLDFB80_60;
    1099       34533 :                 hs->scale = CLDFB80_60_SCALE;
    1100       34533 :                 hs->ds = 60;
    1101       34533 :                 hs->da = 60;
    1102       34533 :                 hs->rot_vec_ana_delay_re = NULL;
    1103       34533 :                 hs->rot_vec_ana_delay_im = NULL;
    1104       34533 :                 hs->rot_vec_syn_delay_re = NULL;
    1105       34533 :                 hs->rot_vec_syn_delay_im = NULL;
    1106             :             }
    1107       30421 :             else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS )
    1108             :             {
    1109       30421 :                 hs->p_filter = LDQMF_60;
    1110       30421 :                 hs->scale = LDQMF_60_SCALE;
    1111       30421 :                 hs->ds = 240;
    1112       30421 :                 hs->da = -120;
    1113       30421 :                 hs->rot_vec_ana_delay_re = rot_vec_delay_re_LDQMF;
    1114       30421 :                 hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF;
    1115       30421 :                 hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF;
    1116       30421 :                 hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF;
    1117             :             }
    1118       64954 :             break;
    1119             :     }
    1120             : 
    1121      162103 :     return;
    1122             : }
    1123             : 
    1124             : 
    1125             : /*-------------------------------------------------------------------*
    1126             :  * cldfb_save_memory()
    1127             :  *
    1128             :  * Save the memory of filter; to be restored with cldfb_restore_memory()
    1129             :  *--------------------------------------------------------------------*/
    1130             : 
    1131       23637 : ivas_error cldfb_save_memory(
    1132             :     HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */
    1133             : )
    1134             : {
    1135       23637 :     uint16_t offset = hs->p_filter_length - hs->no_channels;
    1136             : 
    1137       23637 :     if ( hs->memory != NULL || hs->memory_length != 0 )
    1138             :     {
    1139             :         /* memory already stored; Free memory first */
    1140           0 :         return IVAS_ERR_OK;
    1141             :     }
    1142             : 
    1143       23637 :     if ( hs->type == CLDFB_ANALYSIS )
    1144             :     {
    1145       11856 :         hs->memory_length = offset;
    1146             :     }
    1147             :     else
    1148             :     {
    1149       11781 :         hs->memory_length = hs->p_filter_length;
    1150             :     }
    1151             : 
    1152       23637 :     if ( ( hs->memory = (float *) malloc( hs->memory_length * sizeof( float ) ) ) == NULL )
    1153             :     {
    1154           0 :         return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CLDFB\n" );
    1155             :     }
    1156             : 
    1157             :     /* save the memory */
    1158       23637 :     mvr2r( hs->cldfb_state, hs->memory, hs->memory_length );
    1159             : 
    1160       23637 :     return IVAS_ERR_OK;
    1161             : }
    1162             : 
    1163             : 
    1164             : /*-------------------------------------------------------------------*
    1165             :  * cldfb_restore_memory()
    1166             :  *
    1167             :  * Restores the memory of filter; memory to be save by cldfb_save_memory()
    1168             :  *--------------------------------------------------------------------*/
    1169             : 
    1170       23637 : void cldfb_restore_memory(
    1171             :     HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */
    1172             : )
    1173             : {
    1174       23637 :     uint16_t offset = hs->p_filter_length - hs->no_channels;
    1175             :     uint16_t size;
    1176             : 
    1177       23637 :     if ( hs->memory == NULL || hs->memory_length == 0 )
    1178             :     {
    1179             :         /* memory not allocated */
    1180           0 :         return;
    1181             :     }
    1182             : 
    1183       23637 :     if ( hs->type == CLDFB_ANALYSIS )
    1184             :     {
    1185       11856 :         size = offset;
    1186             :     }
    1187             :     else
    1188             :     {
    1189       11781 :         size = hs->p_filter_length;
    1190             :     }
    1191             : 
    1192             :     /* read the memory */
    1193       23637 :     mvr2r( hs->memory, hs->cldfb_state, hs->memory_length );
    1194             : 
    1195             :     /* adjust sample rate if it was changed in the meanwhile */
    1196       23637 :     if ( hs->memory_length != size )
    1197             :     {
    1198           0 :         lerp( hs->cldfb_state, hs->cldfb_state, size, hs->memory_length );
    1199             :     }
    1200             : 
    1201       23637 :     hs->memory_length = 0;
    1202       23637 :     free( hs->memory );
    1203       23637 :     hs->memory = NULL;
    1204             : 
    1205       23637 :     return;
    1206             : }
    1207             : 
    1208             : 
    1209             : /*-------------------------------------------------------------------*
    1210             :  * cldfb_reset_memory()
    1211             :  *
    1212             :  * Resets the memory of filter.
    1213             :  *--------------------------------------------------------------------*/
    1214             : 
    1215     4283496 : void cldfb_reset_memory(
    1216             :     HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */
    1217             : )
    1218             : {
    1219     4283496 :     uint16_t offset = hs->p_filter_length - hs->no_channels;
    1220             :     int16_t memory_length;
    1221             : 
    1222     4283496 :     if ( hs->type == CLDFB_ANALYSIS )
    1223             :     {
    1224     1533678 :         memory_length = offset;
    1225             :     }
    1226             :     else
    1227             :     {
    1228     2749818 :         memory_length = hs->p_filter_length;
    1229             :     }
    1230             : 
    1231             :     /* save the memory */
    1232     4283496 :     set_f( hs->cldfb_state, 0, memory_length );
    1233             : 
    1234     4283496 :     return;
    1235             : }

Generated by: LCOV version 1.14