LCOV - code coverage report
Current view: top level - lib_com - swb_tbe_com_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 2881 3419 84.3 %
Date: 2025-05-03 01:55:50 Functions: 48 49 98.0 %

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : 
       6             : #include <stdint.h>
       7             : #include "options.h"
       8             : #include "cnst.h"    /* Common constants                       */
       9             : #include "rom_com.h" /* Static table prototypes                */
      10             : #include "prot_fx.h"
      11             : #include "basop_util.h"
      12             : #include "ivas_prot_fx.h"
      13             : #include "options_warnings.h"
      14             : 
      15             : #define POW_EXC16k_WHTND                    1.14e11f   /* power of random excitation, length 320 samples, uniform distribution */
      16             : #define POW_EXC16k_WHTND_FX_INV_SQRT        6360       // Q31
      17             : #define POW_EXC16k_WHTND_FX_INV_SQRT_IN_Q49 1667313793 // Q49
      18             : #define POW_EXC16k_WHTND_FX                 178125000  // Q-6
      19             : #define THR_ENV_ERROR_PLOSIVE               200.0f     /* threshold for envelope error used in plosive detection */
      20             : #define THR_ENV_ERROR_PLOSIVE_FX            200        /* threshold for envelope error used in plosive detection Q0 */
      21             : 
      22             : /*-----------------------------------------------------------------*
      23             :  * Local function prototypes
      24             :  *-----------------------------------------------------------------*/
      25             : 
      26             : static void create_random_vector_fx( Word16 output[], const Word16 length, Word16 seed[] );
      27             : static void flip_spectrum_fx( const Word16 input[], Word16 output[], const Word16 length );
      28             : static void Calc_st_filt_tbe( Word16 *apond2, Word16 *apond1, Word16 *parcor0, Word16 *sig_ltp_ptr, Word16 *mem_zero );
      29             : static void Hilbert_transform_fx( Word32 tmp_R[], Word32 tmp_I[], Word32 *tmpi_R, Word32 *tmpi_I, const Word16 length, const Word16 HB_stage_id );
      30             : static void Hilbert_transform_sp_fx( Word16 tmp_R[], Word16 tmp_I[], Word32 *tmpi_R, Word32 *tmpi_I, const Word16 length, const Word16 HB_stage_id );
      31             : void Estimate_mix_factors_fx( const Word16 *shb_res, const Word16 Q_shb, const Word16 *exc16kWhtnd, const Word16 Q_bwe_exc, const Word16 *White_exc16k_frac, const Word16 Q_frac, const Word32 pow1, const Word16 Q_pow1, const Word32 pow22, const Word16 Q_pow22, Word16 *vf_modified, Word16 *vf_ind );
      32             : 
      33             : /*-------------------------------------------------------------------*
      34             :  * swb_tbe_reset()
      35             :  *
      36             :  * Reset the SWB TBE encoder
      37             :  *-------------------------------------------------------------------*/
      38             : 
      39      467539 : void swb_tbe_reset_fx(
      40             :     Word32 mem_csfilt[],
      41             :     Word16 mem_genSHBexc_filt_down_shb[],
      42             :     Word16 state_lpc_syn[],
      43             :     Word16 syn_overlap[],
      44             :     Word16 state_syn_shbexc[],
      45             :     Word16 *tbe_demph,
      46             :     Word16 *tbe_premph,
      47             :     Word16 mem_stp_swb[],
      48             :     Word16 *gain_prec_swb )
      49             : {
      50      467539 :     set32_fx( mem_csfilt, 0, 2 );
      51      467539 :     set16_fx( mem_genSHBexc_filt_down_shb, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) );
      52      467539 :     set16_fx( state_lpc_syn, 0, LPC_SHB_ORDER );
      53             : 
      54      467539 :     set16_fx( syn_overlap, 0, L_SHB_LAHEAD );
      55      467539 :     set16_fx( state_syn_shbexc, 0, L_SHB_LAHEAD );
      56             : 
      57      467539 :     *tbe_demph = 0;
      58      467539 :     move16();
      59      467539 :     *tbe_premph = 0;
      60      467539 :     move16();
      61             : 
      62      467539 :     set16_fx( mem_stp_swb, 0, LPC_SHB_ORDER );
      63      467539 :     *gain_prec_swb = 16384;
      64      467539 :     move16(); /*Q14 = 1 */
      65             : 
      66      467539 :     return;
      67             : }
      68             : 
      69             : 
      70             : /*-------------------------------------------------------------------*
      71             :  * swb_tbe_reset_synth()
      72             :  *
      73             :  * Reset the extra parameters needed for synthesis of the SWB TBE output
      74             :  *-------------------------------------------------------------------*/
      75             : 
      76      232715 : void swb_tbe_reset_synth_fx(
      77             :     Word32 genSHBsynth_Hilbert_Mem[],
      78             :     Word16 genSHBsynth_state_lsyn_filt_shb_local_fx[],
      79             :     Word32 genSHBsynth_state_lsyn_filt_shb_local_fx_32[] )
      80             : {
      81             : 
      82      232715 :     set32_fx( genSHBsynth_Hilbert_Mem, 0, HILBERT_MEM_SIZE );
      83      232715 :     set16_fx( genSHBsynth_state_lsyn_filt_shb_local_fx, 0, 2 * ALLPASSSECTIONS_STEEP );
      84             : 
      85      232715 :     if ( genSHBsynth_state_lsyn_filt_shb_local_fx_32 != NULL )
      86             :     {
      87      232715 :         set32_fx( genSHBsynth_state_lsyn_filt_shb_local_fx_32, 0, 2 * ALLPASSSECTIONS_STEEP );
      88             :     }
      89             : 
      90      232715 :     return;
      91             : }
      92             : 
      93             : 
      94             : /*-------------------------------------------------------------------*
      95             :  * fb_tbe_reset_synth_fx()
      96             :  *
      97             :  * reset of FB TBE memories
      98             :  *-------------------------------------------------------------------*/
      99             : 
     100      156159 : void fb_tbe_reset_synth_fx(
     101             :     Word32 fbbwe_hpf_mem_fx[][4],
     102             :     Word16 fbbwe_hpf_mem_fx_Q[],
     103             :     Word16 *prev_fbbwe_ratio_fx )
     104             : {
     105      156159 :     set32_fx( fbbwe_hpf_mem_fx[0], 0, 4 );
     106      156159 :     set32_fx( fbbwe_hpf_mem_fx[1], 0, 4 );
     107      156159 :     set32_fx( fbbwe_hpf_mem_fx[2], 0, 4 );
     108      156159 :     set32_fx( fbbwe_hpf_mem_fx[3], 0, 4 );
     109      156159 :     set16_fx( fbbwe_hpf_mem_fx_Q, 0, 4 );
     110      156159 :     *prev_fbbwe_ratio_fx = 1;
     111      156159 :     move16(); /*should be set to 1.0f, scaling unknown */
     112             : 
     113      156159 :     return;
     114             : }
     115             : 
     116             : 
     117             : /*-------------------------------------------------------------------*
     118             :  * tbe_celp_exc_offset()
     119             :  *
     120             :  * Compute tbe bwe celp excitation offset
     121             :  *-------------------------------------------------------------------*/
     122             : 
     123     1065446 : Word16 tbe_celp_exc_offset(
     124             :     const Word16 T0_fx,      /* i  : Integer pitch                       Q0      */
     125             :     const Word16 T0_frac_fx, /* i  : Fractional part of the pitch        Q1      */
     126             :     const Word16 L_frame     /* i  : frame lenght */
     127             : )
     128             : {
     129             :     Word16 offset_fx, tmp_fx, tmp1_fx, tmp2_fx, tmp_fac;
     130     1065446 :     tmp_fac = 320;
     131     1065446 :     move16(); /*2.5 in Q7*/
     132     1065446 :     if ( EQ_16( L_frame, L_FRAME16k ) )
     133             :     {
     134      632973 :         tmp_fac = 256;
     135      632973 :         move16(); /*2.0 in Q7*/
     136             :     }
     137     1065446 :     tmp_fx = extract_l( L_mult( T0_frac_fx, 32 ) ); /*Q8, 0.25 in Q7*/
     138     1065446 :     tmp_fx = add( 512, tmp_fx );                    /*Q8; 2 in Q8*/
     139     1065446 :     tmp_fx = mult_r( tmp_fx, tmp_fac );             /*Q16->Q0; 2.5 in Q7 or  2.0 in Q7 */
     140             : 
     141     1065446 :     tmp1_fx = sub( T0_fx, 2 ); /*Q0*/
     142             : 
     143     1065446 :     tmp2_fx = shl( tmp1_fx, 1 ); /*Q0 */
     144             : 
     145     1065446 :     IF( EQ_16( L_frame, L_FRAME ) )
     146             :     {
     147      432473 :         tmp2_fx = add( shl( tmp1_fx, 1 ), shr( tmp1_fx, 1 ) ); /*Q0; (5/2 = 2 + 1/2)*/
     148             :     }
     149             : 
     150     1065446 :     offset_fx = add( tmp_fx, tmp2_fx ); /*Q0*/
     151             : 
     152     1065446 :     return offset_fx;
     153             : }
     154             : 
     155             : /*-------------------------------------------------------------------*
     156             :  * swb_tbe_celp_exc()
     157             :  *
     158             :  * Compute tbe bwe celp excitation
     159             :  *-------------------------------------------------------------------*/
     160       11874 : void tbe_celp_exc(
     161             :     const Word16 L_frame_fx, /* i  : Frame lenght                       */
     162             :     const Word16 i_subfr_fx, /* i  : sub frame                          */
     163             :     const Word16 T0_fx,      /* i  : Integer pitch                   Q0 */
     164             :     const Word16 T0_frac_fx, /* i  : Fractional part of the pitch    Q1 */
     165             :     Word16 *error_fx,        /* i/o: Error                           Q5 */
     166             :     Word16 *bwe_exc_fx       /* i/o: bandwitdh extension signal         */
     167             : )
     168             : {
     169             :     Word16 offset_fx, tmp_fx, i;
     170       11874 :     IF( EQ_16( L_frame_fx, L_FRAME ) )
     171             :     {
     172             :         /*offset = T0 * HIBND_ACB_L_FAC + (int) ((float) T0_frac * 0.25f * HIBND_ACB_L_FAC + 2 * HIBND_ACB_L_FAC + 0.5f) - 2 * HIBND_ACB_L_FAC;
     173             :         for (i=0; i<L_SUBFR * HIBND_ACB_L_FAC; i++)
     174             :         {
     175             :             bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset + (int) error];
     176             :         }
     177             :         error += (float) offset - (float) T0 * HIBND_ACB_L_FAC  - 0.25f * HIBND_ACB_L_FAC * (float) T0_frac;*/
     178             : 
     179        2684 :         offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx );
     180        2684 :         IF( *error_fx > 0 )
     181             :         {
     182         363 :             tmp_fx = shr( *error_fx, 5 ); /*Q0*/
     183             :         }
     184             :         ELSE
     185             :         {
     186        2321 :             tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/
     187             :         }
     188             : 
     189      432124 :         FOR( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ )
     190             :         {
     191      429440 :             bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC - offset_fx + tmp_fx]; // Qx
     192      429440 :             move16();
     193             :         }
     194        2684 :         tmp_fx = extract_l( L_mult( T0_frac_fx, 1 ) ); /*Q3; 0.25 in Q2*/
     195        2684 :         tmp_fx = add( shl( T0_fx, 3 ), tmp_fx );       /*Q3*/
     196        2684 :         tmp_fx = extract_l( L_mult( tmp_fx, 5 ) );     /*Q5, 2.5 in Q1*/
     197        2684 :         tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx );   /*Q5*/
     198        2684 :         *error_fx = add( *error_fx, tmp_fx );          /*Q5*/
     199        2684 :         move16();
     200             :     }
     201             :     ELSE
     202             :     {
     203             :         /*  offset = T0*2.5 + (int) ((float) T0_frac * 0.25f*2.5 + 2*2.5 + 0.5f) - 2*2.5;  - case above*/
     204             :         /*  offset = T0*2   + (int) ((float) T0_frac * 0.25f*2   + 2*2   + 0.5f) - 2*2;    - case here*/
     205             : 
     206             :         /*(int) ((float) T0_frac * 0.25f*2   + 2*2   + 0.5f)*/
     207        9190 :         offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx );
     208        9190 :         IF( *error_fx > 0 )
     209             :         {
     210        4191 :             tmp_fx = shr( *error_fx, 5 ); /*Q0*/
     211             :         }
     212             :         ELSE
     213             :         {
     214        4999 :             tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/
     215             :         }
     216             : 
     217     1185510 :         FOR( i = 0; i < L_SUBFR * 2; i++ )
     218             :         {
     219     1176320 :             bwe_exc_fx[i + i_subfr_fx * 2] = bwe_exc_fx[i + i_subfr_fx * 2 - offset_fx + tmp_fx]; // Qx
     220     1176320 :             move16();
     221             :         }
     222             : 
     223             :         /* error += (float) offset - (float) T0 * 2 - 0.5f * (float) T0_frac;*/
     224        9190 :         tmp_fx = extract_l( L_mult( T0_frac_fx, 2 ) ); /*Q3; 0.5 in Q2*/
     225        9190 :         tmp_fx = add( shl( T0_fx, 4 ), tmp_fx );       /* now tmp_fx = "T0_fx*2+ 0.5f*T0_frac_fx" in Q3*/
     226        9190 :         tmp_fx = shl( tmp_fx, 2 );                     /*now above tmp_fx in Q5*/
     227        9190 :         tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx );   /*move offset_fx to Q5, tmp_fx in Q5, ans tmp_fx in Q5*/
     228        9190 :         *error_fx = add( *error_fx, tmp_fx );          /*error_fx in Q5*/
     229        9190 :         move16();
     230             :     }
     231       11874 : }
     232             : 
     233             : /*-------------------------------------------------------------------*
     234             :  * swb_tbe_celp_exc_ivas()
     235             :  *
     236             :  * Compute tbe bwe celp excitation
     237             :  *-------------------------------------------------------------------*/
     238     1012669 : void tbe_celp_exc_ivas(
     239             :     const Word16 element_mode, /* i  : element mode            */
     240             :     const Word16 idchan,       /* i  : channel ID              */
     241             :     const Word16 L_frame_fx,   /* i  : Frame lenght */
     242             :     const Word16 L_subfr,      /* i  : subframe length         */
     243             :     const Word16 i_subfr_fx,   /* i  : sub frame */
     244             :     const Word16 T0_fx,        /* i  : Integer pitch                           Q0   */
     245             :     const Word16 T0_frac_fx,   /* i  : Fractional part of the pitch            Q1   */
     246             :     Word16 *error_fx,          /* i/o: Error                                   Q5   */
     247             :     Word16 *bwe_exc_fx,        /* i/o: bandwitdh extension signal              Qx   */
     248             :     const Word16 tdm_LRTD_flag /* i  : LRTD stereo mode flag   */
     249             : )
     250             : {
     251             :     Word16 offset_fx, tmp_fx, i;
     252             : 
     253     1012669 :     test();
     254     1012669 :     test();
     255     1012669 :     IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag )
     256             :     {
     257         914 :         return;
     258             :     }
     259             : 
     260     1011755 :     IF( EQ_16( L_frame_fx, L_FRAME ) )
     261             :     {
     262             :         /*offset = T0 * HIBND_ACB_L_FAC + (int) ((float) T0_frac * 0.25f * HIBND_ACB_L_FAC + 2 * HIBND_ACB_L_FAC + 0.5f) - 2 * HIBND_ACB_L_FAC;
     263             :         for (i=0; i<L_SUBFR * HIBND_ACB_L_FAC; i++)
     264             :         {
     265             :             bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset + (int) error];
     266             :         }
     267             :         error += (float) offset - (float) T0 * HIBND_ACB_L_FAC  - 0.25f * HIBND_ACB_L_FAC * (float) T0_frac;*/
     268             : 
     269      402120 :         offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx );
     270      402120 :         IF( *error_fx > 0 )
     271             :         {
     272       55826 :             tmp_fx = shr( *error_fx, 5 ); /*Q0*/
     273             :         }
     274             :         ELSE
     275             :         {
     276      346294 :             tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/
     277             :         }
     278             : 
     279    64741320 :         FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ )
     280             :         {
     281    64339200 :             bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC - offset_fx + tmp_fx];
     282    64339200 :             move16();
     283             :         }
     284      402120 :         tmp_fx = extract_l( L_mult( T0_frac_fx, 1 ) ); /*Q3; 0.25 in Q2*/
     285      402120 :         tmp_fx = add( shl( T0_fx, 3 ), tmp_fx );       /*Q3*/
     286      402120 :         tmp_fx = extract_l( L_mult( tmp_fx, 5 ) );     /*Q5, 2.5 in Q1*/
     287      402120 :         tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx );   /*Q5*/
     288      402120 :         *error_fx = add( *error_fx, tmp_fx );          /*Q5*/
     289      402120 :         move16();
     290             :     }
     291             :     ELSE
     292             :     {
     293             :         /*  offset = T0*2.5 + (int) ((float) T0_frac * 0.25f*2.5 + 2*2.5 + 0.5f) - 2*2.5;  - case above*/
     294             :         /*  offset = T0*2   + (int) ((float) T0_frac * 0.25f*2   + 2*2   + 0.5f) - 2*2;    - case here*/
     295             : 
     296             :         /*(int) ((float) T0_frac * 0.25f*2   + 2*2   + 0.5f)*/
     297      609635 :         offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx );
     298      609635 :         IF( *error_fx > 0 )
     299             :         {
     300      368307 :             tmp_fx = shr( *error_fx, 5 ); /*Q0*/
     301             :         }
     302             :         ELSE
     303             :         {
     304      241328 :             tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/
     305             :         }
     306             : 
     307    78642915 :         FOR( i = 0; i < L_subfr * 2; i++ )
     308             :         {
     309    78033280 :             bwe_exc_fx[i + i_subfr_fx * 2] = bwe_exc_fx[i + i_subfr_fx * 2 - offset_fx + tmp_fx];
     310    78033280 :             move16();
     311             :         }
     312             : 
     313             :         /* error += (float) offset - (float) T0 * 2 - 0.5f * (float) T0_frac;*/
     314      609635 :         tmp_fx = extract_l( L_mult( T0_frac_fx, 2 ) ); /*Q3; 0.5 in Q2*/
     315      609635 :         tmp_fx = add( shl( T0_fx, 4 ), tmp_fx );       /* now tmp_fx = "T0_fx*2+ 0.5f*T0_frac_fx" in Q3*/
     316      609635 :         tmp_fx = shl( tmp_fx, 2 );                     /*now above tmp_fx in Q5*/
     317      609635 :         tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx );   /*move offset_fx to Q5, tmp_fx in Q5, ans tmp_fx in Q5*/
     318      609635 :         *error_fx = add( *error_fx, tmp_fx );          /*error_fx in Q5*/
     319      609635 :         move16();
     320             :     }
     321             : }
     322             : 
     323             : /*===========================================================================*/
     324             : /* FUNCTION : flip_and_downmix_generic_fx() */
     325             : /*---------------------------------------------------------------------------*/
     326             : /* PURPOSE :flips the spectrum and downmixes the signals, lpf if needed*/
     327             : /*---------------------------------------------------------------------------*/
     328             : /* INPUT ARGUMENTS */
     329             : /* _(Word16[]) input :input spectrum */
     330             : /* _(Word16) length :length of spectra */
     331             : /* _(Word16) ramp_flag :flag to indicate slow ramp need after switching */
     332             : /* _(Word16[]) lpf_num :lpf numerator */
     333             : /* _(Word16[]) lpf_den :lpf denominator */
     334             : /*---------------------------------------------------------------------------*/
     335             : /* OUTPUT ARGUMENTS : */
     336             : /* _(Word16[])output : output spectrum */
     337             : /*---------------------------------------------------------------------------*/
     338             : /* INPUT/OUTPUT ARGUMENTS : */
     339             : /* _(Word32[9])mem1 : memory */
     340             : /* _(Word32[8])mem2 : memory */
     341             : /* _(Word32[8])mem3 : memory */
     342             : /* _(Word16) dm_frequency_inHz :Downmix frequency in Hz */
     343             : /* _(Word16*) phase_state :Phase state in case frequency isn't */
     344             : /* multiple of 50 Hz */
     345             : /*---------------------------------------------------------------------------*/
     346             : /* RETURN ARGUMENTS : */
     347             : /* _ None */
     348             : /*---------------------------------------------------------------------------*/
     349        1594 : void flip_and_downmix_generic_fx(
     350             :     Word16 input[],                      /* i : input spectrum Qx*/
     351             :     Word16 output[],                     /* o : output spectrum Qx*/
     352             :     const Word16 length,                 /* i : length of spectra */
     353             :     Word32 mem1_ext[HILBERT_ORDER1],     /* i/o: memory Qx+16*/
     354             :     Word32 mem2_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx+16*/
     355             :     Word32 mem3_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx+16*/
     356             :     Word16 *phase_state                  /* i/o: Phase state in case frequency isn't multiple of 50 Hz */
     357             : )
     358             : {
     359             :     Word16 i, j;
     360             :     Word16 tmp_16[L_FRAME32k + HILBERT_ORDER1];
     361             :     Word32 tmpi_R[L_FRAME32k];
     362             :     Word32 tmpi_I[L_FRAME32k];
     363             :     Word32 tmpi2_R[L_FRAME32k + HILBERT_ORDER2];
     364             :     Word32 tmpi2_I[L_FRAME32k + HILBERT_ORDER2];
     365             :     Word32 tmp_R[L_FRAME32k + HILBERT_ORDER2];
     366             :     Word32 tmp_I[L_FRAME32k + HILBERT_ORDER2];
     367             : 
     368             :     /*Word16 s_tmp[L_FRAME32k];*/
     369             :     /*Word16 factor;*/
     370             :     Word16 period;
     371        1594 :     Word16 local_negsin_table17[17] = { 0, -11793, -22005, -29268, -32609, -31580,
     372             :                                         -26319, -17530, -6393, 6393, 17530, 26319,
     373             :                                         31580, 32609, 29268, 22005, 11793 }; /* Q15 */
     374        1594 :     Word16 local_cos_table17[17] = { 32767, 30571, 24279, 14732, 3212, -8739,
     375             :                                      -19519, -27683, -32137, -32137, -27683,
     376             :                                      -19519, -8739, 3212, 14732, 24279, 30571 }; /* Q15 */
     377             :     Word16 *local_negsin_table, *local_cos_table;
     378             :     Word32 L_tmp;
     379             : 
     380             :     /* 1850 Hz downmix */
     381        1594 :     period = 17;
     382        1594 :     move16();
     383        1594 :     local_negsin_table = local_negsin_table17;
     384        1594 :     local_cos_table = local_cos_table17;
     385             : 
     386             : 
     387      511674 :     FOR( i = 0; i < length; i = i + 2 )
     388             :     {
     389      510080 :         input[i] = negate( input[i] );
     390      510080 :         move16();
     391             :     }
     392             : 
     393        1594 :     Copy( input, tmp_16 + HILBERT_ORDER1, length );
     394             : 
     395             :     /*Copy32( mem1_ext, tmp_16, 5 ); */
     396        9564 :     FOR( i = 0; i < HILBERT_ORDER1; i++ )
     397             :     {
     398        7970 :         tmp_16[i] = extract_h( mem1_ext[i] ); /* mem1_ext (Qx+16) tmp16 (Qx) */
     399        7970 :         move16();
     400             :     }
     401             : 
     402             :     /* Hilber transform stage - 0 - single precision */
     403        1594 :     Hilbert_transform_sp_fx( tmp_16, /* i: Real component of HB */
     404             :                              tmp_16, /* i: Imag component of HB */
     405             :                              tmpi_R, /* o: Real component of HB */
     406             :                              tmpi_I, /* o: Imag. component of HB */
     407             :                              length, /* i: length of the spectra */
     408             :                              0 );    /* i: HB transform stage */
     409             : 
     410        9564 :     FOR( i = 0; i < HILBERT_ORDER1; i++ )
     411             :     {
     412        7970 :         mem1_ext[i] = L_deposit_h( tmp_16[i + length] ); /* mem1_ext (Qx+16) tmp16 (Qx) */
     413        7970 :         move32();
     414             :     }
     415             : 
     416        1594 :     Copy32( mem2_ext, tmpi2_R, HILBERT_ORDER2 );
     417        1594 :     Copy32( mem3_ext, tmpi2_I, HILBERT_ORDER2 );
     418             : 
     419             :     /* Hilber transform stage - 1 */
     420        1594 :     Hilbert_transform_fx( tmpi_R,  /* i: Real component of HB */
     421             :                           tmpi_I,  /* i: Imag component of HB */
     422             :                           tmpi2_R, /* o: Real component of HB */
     423             :                           tmpi2_I, /* o: Imag. component of HB */
     424             :                           length,  /* i: length of the spectra */
     425             :                           1 );     /* i: HB transform stage */
     426             : 
     427        1594 :     Copy32( mem2_ext + HILBERT_ORDER2, tmp_R, HILBERT_ORDER2 );
     428        1594 :     Copy32( mem3_ext + HILBERT_ORDER2, tmp_I, HILBERT_ORDER2 );
     429             : 
     430             :     /* Hilber transform stage - 2 */
     431        1594 :     Hilbert_transform_fx( tmpi2_R, /* i: Real component of HB */
     432             :                           tmpi2_I, /* i: Imag component of HB */
     433             :                           tmpi_R,  /* o: Real component of HB */
     434             :                           tmpi_I,  /* o: Imag. component of HB */
     435             :                           length,  /* i: length of the spectra */
     436             :                           2 );     /* i: HB transform stage */
     437             : 
     438        1594 :     Copy32( tmpi2_R + length, mem2_ext, HILBERT_ORDER2 );
     439        1594 :     Copy32( tmpi2_I + length, mem3_ext, HILBERT_ORDER2 );
     440             : 
     441             :     /* Hilber transform stage - 3 */
     442        1594 :     Hilbert_transform_fx( tmpi_R, /* i: Real component of HB */
     443             :                           tmpi_I, /* i: Imag component of HB */
     444             :                           tmp_R,  /* o: Real component of HB */
     445             :                           tmp_I,  /* o: Imag. component of HB */
     446             :                           length, /* i: length of the spectra */
     447             :                           3 );    /* i: HB transform stage */
     448             : 
     449        1594 :     Copy32( tmp_R + length, mem2_ext + HILBERT_ORDER2, HILBERT_ORDER2 );
     450        1594 :     Copy32( tmp_I + length, mem3_ext + HILBERT_ORDER2, HILBERT_ORDER2 );
     451             : 
     452        1594 :     if ( GE_16( *phase_state, period ) )
     453             :     {
     454           0 :         *phase_state = 0;
     455           0 :         move16();
     456             :     }
     457             : 
     458        1594 :     i = 0;
     459        1594 :     move16();
     460        1594 :     j = *phase_state;
     461        1594 :     move16();
     462             : 
     463       63100 :     WHILE( i < length )
     464             :     {
     465     1081666 :         WHILE( ( j < period ) && ( i < length ) )
     466             :         {
     467     1020160 :             L_tmp = Mult_32_16( tmp_R[i + 4], local_cos_table[j] );           /*//Qx+16 */
     468     1020160 :             L_tmp = Madd_32_16( L_tmp, tmp_I[i + 4], local_negsin_table[j] ); /*Qx+16 */
     469     1020160 :             output[i] = round_fx( L_tmp );                                    /*Qx */
     470     1020160 :             move16();
     471     1020160 :             i++;
     472     1020160 :             j++;
     473             :         }
     474             : 
     475       61506 :         if ( GE_16( j, period ) )
     476             :         {
     477       60004 :             j = 0;
     478       60004 :             move16();
     479             :         }
     480             :     }
     481             : 
     482        1594 :     *phase_state = j;
     483        1594 :     move16();
     484             : 
     485        1594 :     return;
     486             : }
     487             : 
     488             : 
     489       50523 : void flip_and_downmix_generic_fx32(
     490             :     Word32 input[],                      /* i : input spectrum Qx*/
     491             :     Word32 output[],                     /* o : output spectrum Qx*/
     492             :     const Word16 length,                 /* i : length of spectra */
     493             :     Word32 mem1_ext[HILBERT_ORDER1],     /* i/o: memory Qx*/
     494             :     Word32 mem2_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx*/
     495             :     Word32 mem3_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx*/
     496             :     Word16 *phase_state                  /* i/o: Phase state in case frequency isn't multiple of 50 Hz */
     497             : )
     498             : {
     499             :     Word16 i, j;
     500             :     Word32 tmp[L_FRAME32k + HILBERT_ORDER1];
     501             :     Word32 tmpi_R[L_FRAME32k];
     502             :     Word32 tmpi_I[L_FRAME32k];
     503             :     Word32 tmpi2_R[L_FRAME32k + HILBERT_ORDER2];
     504             :     Word32 tmpi2_I[L_FRAME32k + HILBERT_ORDER2];
     505             :     Word32 tmp_R[L_FRAME32k + HILBERT_ORDER2];
     506             :     Word32 tmp_I[L_FRAME32k + HILBERT_ORDER2];
     507             : 
     508             :     /*Word16 s_tmp[L_FRAME32k];*/
     509             :     /*Word16 factor;*/
     510             :     Word16 period;
     511       50523 :     Word16 local_negsin_table17[17] = { 0, -11793, -22005, -29268, -32609, -31580,
     512             :                                         -26319, -17530, -6393, 6393, 17530, 26319,
     513             :                                         31580, 32609, 29268, 22005, 11793 }; /* Q15 */
     514       50523 :     Word16 local_cos_table17[17] = { 32767, 30571, 24279, 14732, 3212, -8739,
     515             :                                      -19519, -27683, -32137, -32137, -27683,
     516             :                                      -19519, -8739, 3212, 14732, 24279, 30571 }; /* Q15 */
     517             :     Word16 *local_negsin_table, *local_cos_table;
     518             :     Word32 L_tmp;
     519             : 
     520             :     /* 1850 Hz downmix */
     521       50523 :     period = 17;
     522       50523 :     move16();
     523       50523 :     local_negsin_table = local_negsin_table17;
     524       50523 :     local_cos_table = local_cos_table17;
     525             : 
     526             : 
     527    15631983 :     FOR( i = 0; i < length; i = i + 2 )
     528             :     {
     529    15581460 :         input[i] = L_negate( input[i] );
     530    15581460 :         move16();
     531             :     }
     532             : 
     533       50523 :     Copy32( input, tmp + HILBERT_ORDER1, length );
     534       50523 :     Copy32( mem1_ext, tmp, HILBERT_ORDER1 );
     535             : 
     536             :     /* Hilber transform stage - 0 - single precision */
     537       50523 :     Hilbert_transform_fx( tmp,    /* i: Real component of HB */
     538             :                           tmp,    /* i: Imag component of HB */
     539             :                           tmpi_R, /* o: Real component of HB */
     540             :                           tmpi_I, /* o: Imag. component of HB */
     541             :                           length, /* i: length of the spectra */
     542             :                           0 );    /* i: HB transform stage */
     543             : 
     544             : 
     545       50523 :     Copy32( mem2_ext, tmpi2_R, HILBERT_ORDER2 );
     546       50523 :     Copy32( mem3_ext, tmpi2_I, HILBERT_ORDER2 );
     547             : 
     548             :     /* Hilber transform stage - 1 */
     549       50523 :     Hilbert_transform_fx( tmpi_R,  /* i: Real component of HB */
     550             :                           tmpi_I,  /* i: Imag component of HB */
     551             :                           tmpi2_R, /* o: Real component of HB */
     552             :                           tmpi2_I, /* o: Imag. component of HB */
     553             :                           length,  /* i: length of the spectra */
     554             :                           1 );     /* i: HB transform stage */
     555       50523 :     Copy32( tmp + length, mem1_ext, HILBERT_ORDER1 );
     556       50523 :     Copy32( mem2_ext + HILBERT_ORDER2, tmp_R, HILBERT_ORDER2 );
     557       50523 :     Copy32( mem3_ext + HILBERT_ORDER2, tmp_I, HILBERT_ORDER2 );
     558             : 
     559             :     /* Hilber transform stage - 2 */
     560       50523 :     Hilbert_transform_fx( tmpi2_R, /* i: Real component of HB */
     561             :                           tmpi2_I, /* i: Imag component of HB */
     562             :                           tmpi_R,  /* o: Real component of HB */
     563             :                           tmpi_I,  /* o: Imag. component of HB */
     564             :                           length,  /* i: length of the spectra */
     565             :                           2 );     /* i: HB transform stage */
     566             : 
     567       50523 :     Copy32( tmpi2_R + length, mem2_ext, HILBERT_ORDER2 );
     568       50523 :     Copy32( tmpi2_I + length, mem3_ext, HILBERT_ORDER2 );
     569             : 
     570             :     /* Hilber transform stage - 3 */
     571       50523 :     Hilbert_transform_fx( tmpi_R, /* i: Real component of HB */
     572             :                           tmpi_I, /* i: Imag component of HB */
     573             :                           tmp_R,  /* o: Real component of HB */
     574             :                           tmp_I,  /* o: Imag. component of HB */
     575             :                           length, /* i: length of the spectra */
     576             :                           3 );    /* i: HB transform stage */
     577             : 
     578       50523 :     Copy32( tmp_R + length, mem2_ext + HILBERT_ORDER2, HILBERT_ORDER2 );
     579       50523 :     Copy32( tmp_I + length, mem3_ext + HILBERT_ORDER2, HILBERT_ORDER2 );
     580             : 
     581       50523 :     if ( GE_16( *phase_state, period ) )
     582             :     {
     583           0 :         *phase_state = 0;
     584           0 :         move16();
     585             :     }
     586             : 
     587       50523 :     i = 0;
     588       50523 :     move16();
     589       50523 :     j = *phase_state;
     590       50523 :     move16();
     591             : 
     592     1930668 :     WHILE( LT_16( i, length ) )
     593             :     {
     594    33043065 :         WHILE( ( j < period ) && ( i < length ) )
     595             :         {
     596    31162920 :             test();
     597    31162920 :             L_tmp = Mult_32_16( tmp_R[i + 4], local_cos_table[j] );           /*//Qx+16 */
     598    31162920 :             L_tmp = Madd_32_16( L_tmp, tmp_I[i + 4], local_negsin_table[j] ); /*Qx+16 */
     599    31162920 :             output[i] = L_tmp;                                                /*Qx */
     600    31162920 :             move32();
     601    31162920 :             i++;
     602    31162920 :             j++;
     603             :         }
     604             : 
     605     1880145 :         if ( GE_16( j, period ) )
     606             :         {
     607     1832533 :             j = 0;
     608     1832533 :             move16();
     609             :         }
     610             :     }
     611             : 
     612       50523 :     *phase_state = j;
     613       50523 :     move16();
     614       50523 :     return;
     615             : }
     616             : 
     617             : /*----------------------------------------------
     618             :  * Hilbert transform - Double precision
     619             :  *------------------------------------------------*/
     620      206874 : static void Hilbert_transform_fx(
     621             :     Word32 tmp_R[],          /* i: Real component of HB */
     622             :     Word32 tmp_I[],          /* i: Real component of HB */
     623             :     Word32 tmpi_R[],         /* o: Real component of HB */
     624             :     Word32 tmpi_I[],         /* o: Imag. component of HB */
     625             :     const Word16 length,     /* i: input length */
     626             :     const Word16 HB_stage_id /* i: HB transform stage */
     627             : )
     628             : {
     629             :     Word16 i, hb_filter_stage, offset;
     630             :     Word32 L_tmp;
     631             : 
     632      206874 :     hb_filter_stage = shl( HB_stage_id, 1 );
     633      206874 :     offset = 0;
     634      206874 :     move16();
     635      206874 :     if ( HB_stage_id == 0 )
     636             :     {
     637       50523 :         offset = 1;
     638       50523 :         move16();
     639             :     }
     640             : 
     641      206874 :     test();
     642      206874 :     test();
     643      206874 :     IF( HB_stage_id == 0 || EQ_16( HB_stage_id, 2 ) )
     644             :     {
     645    63448640 :         FOR( i = 0; i < length; i++ )
     646             :         {
     647    63346000 :             L_tmp = Mult_32_16( tmp_R[i + 4], Hilbert_coeffs_fx[hb_filter_stage][0 + offset] );        /*Qx+15 */
     648    63346000 :             L_tmp = Madd_32_16( L_tmp, tmp_R[i + 2], Hilbert_coeffs_fx[hb_filter_stage][2 + offset] ); /*Qx+15 */
     649    63346000 :             L_tmp = Madd_32_16( L_tmp, tmp_R[i], Hilbert_coeffs_fx[hb_filter_stage][4 + offset] );     /*Qx+15 */
     650    63346000 :             tmpi_R[i] = L_shl( L_tmp, 1 );
     651    63346000 :             move32(); /*Qx+16 */
     652             : 
     653    63346000 :             L_tmp = Mult_32_16( tmp_I[i + 4 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][0] );        /*Qx+15 */
     654    63346000 :             L_tmp = Madd_32_16( L_tmp, tmp_I[i + 2 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][2] ); /*Qx+15 */
     655    63346000 :             L_tmp = Madd_32_16( L_tmp, tmp_I[i + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][4] );     /*Qx+15 */
     656    63346000 :             tmpi_I[i] = L_shl( L_tmp, 1 );
     657    63346000 :             move32(); /*Qx+16 */
     658             :         }
     659             :     }
     660      104234 :     ELSE IF( EQ_16( HB_stage_id, 1 ) || EQ_16( HB_stage_id, 3 ) )
     661             :     {
     662    64470394 :         FOR( i = 0; i < length; i++ )
     663             :         {
     664             : 
     665    64366160 :             L_tmp = Mult_32_16( tmpi_R[i + 2], Hilbert_coeffs_fx[hb_filter_stage][2] );    /*Qx+15 */
     666    64366160 :             L_tmp = Madd_32_16( L_tmp, tmpi_R[i], Hilbert_coeffs_fx[hb_filter_stage][4] ); /*Qx+15 */
     667    64366160 :             tmpi_R[i + 4] = L_sub( tmp_R[i], L_shl( L_tmp, 1 ) );
     668    64366160 :             move32(); /*Qx+16 */
     669             : 
     670    64366160 :             L_tmp = Mult_32_16( tmpi_I[i + 2], Hilbert_coeffs_fx[hb_filter_stage + 1][2] );    /*Qx+15 */
     671    64366160 :             L_tmp = Madd_32_16( L_tmp, tmpi_I[i], Hilbert_coeffs_fx[hb_filter_stage + 1][4] ); /*Qx+15 */
     672    64366160 :             tmpi_I[i + 4] = L_sub( tmp_I[i], L_shl( L_tmp, 1 ) );
     673    64366160 :             move32(); /*Qx+16 */
     674             :         }
     675             :     }
     676      206874 : }
     677             : 
     678             : 
     679             : /*----------------------------------------------
     680             :  * Hilbert transform - Single precision Stage 0
     681             :  *------------------------------------------------*/
     682        1594 : static void Hilbert_transform_sp_fx(
     683             :     Word16 tmp_R[],          /* i: Real component of HB */
     684             :     Word16 tmp_I[],          /* i: Real component of HB */
     685             :     Word32 tmpi_R[],         /* o: Real component of HB */
     686             :     Word32 tmpi_I[],         /* o: Imag. component of HB */
     687             :     const Word16 length,     /* i: input length */
     688             :     const Word16 HB_stage_id /* i: HB transform stage */
     689             : )
     690             : {
     691             :     Word16 i, hb_filter_stage, offset;
     692             :     Word32 L_tmp;
     693             : 
     694        1594 :     hb_filter_stage = shl( HB_stage_id, 1 );
     695        1594 :     offset = 0;
     696        1594 :     move16();
     697        1594 :     if ( HB_stage_id == 0 )
     698             :     {
     699        1594 :         offset = 1;
     700        1594 :         move16();
     701             :     }
     702             : 
     703             :     /* Hilbert single precision stage 0 */
     704     1021754 :     FOR( i = 0; i < length; i++ )
     705             :     {
     706     1020160 :         L_tmp = L_mult( tmp_R[i + 4], Hilbert_coeffs_fx[hb_filter_stage][0 + offset] );       /*Qx */
     707     1020160 :         L_tmp = L_mac( L_tmp, tmp_R[i + 2], Hilbert_coeffs_fx[hb_filter_stage][2 + offset] ); /*Qx */
     708     1020160 :         L_tmp = L_mac( L_tmp, tmp_R[i], Hilbert_coeffs_fx[hb_filter_stage][4 + offset] );     /*Qx */
     709     1020160 :         tmpi_R[i] = L_shl( L_tmp, 1 );
     710     1020160 :         move32(); /*Qx+16 */
     711             : 
     712     1020160 :         L_tmp = L_mult( tmp_I[i + 4 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][0] );       /*Qx */
     713     1020160 :         L_tmp = L_mac( L_tmp, tmp_I[i + 2 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][2] ); /*Qx */
     714     1020160 :         L_tmp = L_mac( L_tmp, tmp_I[i + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][4] );     /*Qx */
     715     1020160 :         tmpi_I[i] = L_shl( L_tmp, 1 );
     716     1020160 :         move32(); /*Qx+16 */
     717             :     }
     718             : 
     719        1594 :     return;
     720             : }
     721             : 
     722             : 
     723             : /*----------------------------------------------
     724             :  * flip_spectrum_fx
     725             :  *----------------------------------------------*/
     726       90512 : void flip_spectrum_fx(
     727             :     const Word16 input[], /* i : input spectrum */
     728             :     Word16 output[],      /* o : output spectrum */
     729             :     const Word16 length   /* i : vector length */
     730             : )
     731             : {
     732             :     Word16 i;
     733             : 
     734    14572432 :     FOR( i = 0; i < length; i = i + 2 )
     735             :     {
     736    14481920 :         output[i] = negate( input[i] );
     737    14481920 :         move16();
     738    14481920 :         output[i + 1] = input[i + 1];
     739    14481920 :         move16();
     740             :     }
     741             : 
     742       90512 :     return;
     743             : }
     744             : 
     745             : 
     746             : /*----------------------------------------------------------------------------
     747             :  * calc_rc0_h
     748             :  *
     749             :  * computes 1st parcor from composed filter impulse response
     750             :  *---------------------------------------------------------------------------*/
     751     1077464 : void Calc_rc0_h(
     752             :     Word16 *h,  /* i  : impulse response of composed filter */
     753             :     Word16 *rc0 /* o  : 1st parcor */
     754             : )
     755             : {
     756             :     Word32 L_acc;
     757             :     Word16 *ptrs;
     758             :     Word16 acf0, acf1;
     759             :     Word16 temp, sh_acf;
     760             :     Word16 i;
     761             : 
     762             :     /* computation of the autocorrelation function acf */
     763     1077464 :     L_acc = L_mult( h[0], h[0] );
     764    21549280 :     FOR( i = 1; i < LONG_H_ST; i++ )
     765             :     {
     766    20471816 :         L_acc = L_mac( L_acc, h[i], h[i] );
     767             :     }
     768     1077464 :     sh_acf = norm_l( L_acc );
     769     1077464 :     L_acc = L_shl( L_acc, sh_acf );
     770     1077464 :     acf0 = extract_h( L_acc );
     771             : 
     772     1077464 :     ptrs = h;
     773             : 
     774     1077464 :     temp = *ptrs++;
     775     1077464 :     move16();
     776     1077464 :     L_acc = L_mult( temp, *ptrs );
     777    20471816 :     FOR( i = 1; i < LONG_H_ST - 1; i++ )
     778             :     {
     779    19394352 :         temp = *ptrs++;
     780    19394352 :         move16();
     781    19394352 :         L_acc = L_mac( L_acc, temp, *ptrs );
     782             :     }
     783     1077464 :     L_acc = L_shl( L_acc, sh_acf );
     784     1077464 :     acf1 = extract_h( L_acc );
     785             : 
     786             :     /* Compute 1st parcor */
     787     1077464 :     IF( acf0 == 0 )
     788             :     {
     789           0 :         *rc0 = 0;
     790           0 :         move16();
     791           0 :         return;
     792             :     }
     793             : 
     794     1077464 :     IF( LT_16( acf0, abs_s( acf1 ) ) )
     795             :     {
     796           0 :         *rc0 = 0;
     797           0 :         move16();
     798           0 :         return;
     799             :     }
     800     1077464 :     *rc0 = div_s( abs_s( acf1 ), acf0 );
     801     1077464 :     move16();
     802     1077464 :     IF( acf1 > 0 )
     803             :     {
     804      337719 :         *rc0 = negate( *rc0 );
     805      337719 :         move16();
     806             :     }
     807             : }
     808             : 
     809      443304 : void Calc_rc0_h_ivas_enc_fx(
     810             :     Word16 *h,  /* i  : impulse response of composed filter */
     811             :     Word16 *rc0 /* o  : 1st parcor */
     812             : )
     813             : {
     814             :     Word32 L_acc;
     815             :     Word16 *ptrs;
     816             :     Word16 acf0, acf1;
     817             :     Word16 temp, sh_acf, tmp2;
     818             :     Word16 i;
     819             : 
     820             :     /* computation of the autocorrelation function acf */
     821      443304 :     L_acc = L_mult( h[0], h[0] );
     822     8866080 :     FOR( i = 1; i < LONG_H_ST; i++ )
     823             :     {
     824     8422776 :         tmp2 = shr( h[i], 2 );
     825     8422776 :         L_acc = L_mac( L_acc, tmp2, tmp2 );
     826             :     }
     827      443304 :     sh_acf = norm_l( L_acc );
     828      443304 :     L_acc = L_shl( L_acc, sh_acf );
     829      443304 :     acf0 = extract_h( L_acc );
     830             : 
     831      443304 :     ptrs = h;
     832             : 
     833      443304 :     temp = *ptrs++;
     834      443304 :     move16();
     835      443304 :     L_acc = L_mult( temp, *ptrs );
     836     8422776 :     FOR( i = 1; i < LONG_H_ST - 1; i++ )
     837             :     {
     838     7979472 :         temp = shr( *ptrs++, 2 );
     839     7979472 :         move16();
     840     7979472 :         L_acc = L_mac( L_acc, temp, shr( *ptrs, 2 ) );
     841             :     }
     842      443304 :     L_acc = L_shl( L_acc, sh_acf );
     843      443304 :     acf1 = extract_h( L_acc );
     844             : 
     845             :     /* Compute 1st parcor */
     846      443304 :     IF( acf0 == 0 )
     847             :     {
     848           0 :         *rc0 = 0;
     849           0 :         move16();
     850           0 :         return;
     851             :     }
     852             : 
     853      443304 :     IF( LT_16( acf0, abs_s( acf1 ) ) )
     854             :     {
     855           0 :         *rc0 = 0;
     856           0 :         move16();
     857           0 :         return;
     858             :     }
     859      443304 :     *rc0 = div_s( abs_s( acf1 ), acf0 );
     860      443304 :     move16();
     861      443304 :     IF( acf1 > 0 )
     862             :     {
     863       75524 :         *rc0 = negate( *rc0 );
     864       75524 :         move16();
     865             :     }
     866             : }
     867             : 
     868       10832 : static void Calc_st_filt_tbe(
     869             :     Word16 *apond2,      /* i  : coefficients of numerator             */
     870             :     Word16 *apond1,      /* i  : coefficients of denominator           */
     871             :     Word16 *parcor0,     /* o  : 1st parcor calcul. on composed filter */
     872             :     Word16 *sig_ltp_ptr, /* i/o: i  of 1/A(gamma1) : scaled by 1/g0    */
     873             :     Word16 *mem_zero     /* i  : All zero memory                       */
     874             : )
     875             : {
     876             :     Word32 L_g0;
     877             : 
     878             :     Word16 h[LONG_H_ST];
     879             : 
     880             :     Word16 g0, temp;
     881             :     Word16 i;
     882       10832 :     temp = sub( 2, norm_s( apond2[0] ) );
     883             :     /* compute i.r. of composed filter apond2 / apond1 */
     884       10832 :     Syn_filt_s( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 );
     885             :     /* compute 1st parcor */
     886       10832 :     Calc_rc0_h( h, parcor0 );
     887             : 
     888             :     /* compute g0 */
     889       10832 :     L_g0 = L_mult0( 1, abs_s( h[0] ) );
     890      216640 :     FOR( i = 1; i < LONG_H_ST; i++ )
     891             :     {
     892      205808 :         L_g0 = L_mac0( L_g0, 1, abs_s( h[i] ) );
     893             :     }
     894       10832 :     g0 = extract_h( L_shl( L_g0, 14 ) );
     895             : 
     896             :     /* Scale signal i  of 1/A(gamma1) */
     897       10832 :     IF( GT_16( g0, 1024 ) )
     898             :     {
     899       10832 :         temp = div_s( 1024, g0 ); /* temp = 2**15 / gain0 */
     900      877392 :         FOR( i = 0; i < L_SUBFR16k; i++ )
     901             :         {
     902      866560 :             sig_ltp_ptr[i] = mult_r( sig_ltp_ptr[i], temp );
     903      866560 :             move16();
     904             :         }
     905             :     }
     906       10832 : }
     907             : 
     908      443304 : static void Calc_st_filt_tbe_ivas_enc_fx(
     909             :     Word16 *apond2,      /* i  : coefficients of numerator             */
     910             :     Word16 *apond1,      /* i  : coefficients of denominator           */
     911             :     Word16 *parcor0,     /* o  : 1st parcor calcul. on composed filter */
     912             :     Word16 *sig_ltp_ptr, /* i/o: i  of 1/A(gamma1) : scaled by 1/g0    */
     913             :     Word16 *mem_zero     /* i  : All zero memory                       */
     914             : )
     915             : {
     916             :     Word32 L_g0;
     917             : 
     918             :     Word16 h[LONG_H_ST];
     919             : 
     920             :     Word16 g0, temp;
     921             :     Word16 i;
     922      443304 :     temp = sub( 2, norm_s( apond2[0] ) );
     923             :     /* compute i.r. of composed filter apond2 / apond1 */
     924      443304 :     syn_filt_fx( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 );
     925             :     /* compute 1st parcor */
     926      443304 :     Calc_rc0_h_ivas_enc_fx( h, parcor0 );
     927             : 
     928             :     /* compute g0 */
     929      443304 :     L_g0 = L_mult0( 1, abs_s( h[0] ) );
     930     8866080 :     FOR( i = 1; i < LONG_H_ST; i++ )
     931             :     {
     932     8422776 :         L_g0 = L_mac0( L_g0, 1, abs_s( h[i] ) );
     933             :     }
     934      443304 :     g0 = extract_h( L_shl( L_g0, 14 ) );
     935             : 
     936             :     /* Scale signal i  of 1/A(gamma1) */
     937      443304 :     IF( GT_16( g0, 1024 ) )
     938             :     {
     939      443304 :         temp = div_s( 1024, g0 ); /* temp = 2**15 / gain0 */
     940    35907624 :         FOR( i = 0; i < L_SUBFR16k; i++ )
     941             :         {
     942    35464320 :             sig_ltp_ptr[i] = mult_r( sig_ltp_ptr[i], temp );
     943    35464320 :             move16();
     944             :         }
     945             :     }
     946      443304 : }
     947             : 
     948      393792 : static void Calc_st_filt_tbe_ivas_dec_fx(
     949             :     Word16 *apond2,      /* i  : coefficients of numerator             */
     950             :     Word16 *apond1,      /* i  : coefficients of denominator           */
     951             :     Word16 *parcor0,     /* o  : 1st parcor calcul. on composed filter */
     952             :     Word16 *sig_ltp_ptr, /* i/o: i  of 1/A(gamma1) : scaled by 1/g0    */
     953             :     Word16 *mem_zero     /* i  : All zero memory                       */
     954             : )
     955             : {
     956             :     Word32 L_g0;
     957             : 
     958             :     Word16 h[LONG_H_ST];
     959             : 
     960             :     Word16 g0, temp;
     961             :     Word16 i;
     962      393792 :     temp = sub( 2, norm_s( apond2[0] ) );
     963             :     /* compute i.r. of composed filter apond2 / apond1 */
     964      393792 :     Syn_filt_s( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 );
     965             :     /* compute 1st parcor */
     966      393792 :     Calc_rc0_h( h, parcor0 );
     967             : 
     968             :     /* compute g0 */
     969      393792 :     L_g0 = L_mult0( 1, abs_s( h[0] ) );
     970     7875840 :     FOR( i = 1; i < LONG_H_ST; i++ )
     971             :     {
     972     7482048 :         L_g0 = L_mac0( L_g0, 1, abs_s( h[i] ) );
     973             :     }
     974      393792 :     g0 = extract_h( L_shl( L_g0, 14 ) );
     975             : 
     976             :     /* Scale signal i  of 1/A(gamma1) */
     977      393792 :     IF( GT_16( g0, 1024 ) )
     978             :     {
     979      393792 :         temp = div_s( 1024, g0 ); /* temp = 2**15 / gain0 */
     980    31897152 :         FOR( i = 0; i < L_SUBFR16k; i++ )
     981             :         {
     982    31503360 :             sig_ltp_ptr[i] = mult_r( sig_ltp_ptr[i], temp );
     983    31503360 :             move16();
     984             :         }
     985             :     }
     986      393792 : }
     987             : 
     988      847928 : static void filt_mu_fx(
     989             :     const Word16 *sig_in, /* i  : signal (beginning at sample -1) */
     990             :     Word16 *sig_out,      /* o  : output signal                   */
     991             :     const Word16 parcor0, /* i  : parcor0 (mu = parcor0 * gamma3) */
     992             :     Word16 SubFrameLength /* i  : the length of subframe          */
     993             : )
     994             : {
     995             :     Word16 n;
     996             :     Word16 mu, ga, temp;
     997             :     const Word16 *ptrs;
     998             :     Word16 tmp, exp;
     999      847928 :     Flag Overflow = 0;
    1000      847928 :     move32();
    1001             : 
    1002             : 
    1003      847928 :     IF( EQ_16( SubFrameLength, L_SUBFR ) )
    1004             :     {
    1005           0 :         IF( parcor0 > 0 )
    1006             :         {
    1007           0 :             mu = mult_r( parcor0, GAMMA3_PLUS_FX );
    1008             :         }
    1009             :         ELSE
    1010             :         {
    1011           0 :             mu = mult_r( parcor0, GAMMA3_MINUS_FX );
    1012             :         }
    1013             :     }
    1014             :     ELSE
    1015             :     {
    1016      847928 :         IF( parcor0 > 0 )
    1017             :         {
    1018      708332 :             mu = mult_r( parcor0, GAMMA3_PLUS_WB_FX );
    1019             :         }
    1020             :         ELSE
    1021             :         {
    1022      139596 :             mu = mult_r( parcor0, GAMMA3_MINUS_WB_FX );
    1023             :         }
    1024             :     }
    1025             : 
    1026      847928 :     tmp = abs_s( mu );
    1027      847928 :     tmp = sub( 32767, tmp );
    1028      847928 :     exp = norm_s( tmp );
    1029      847928 :     tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /*(14 - exp) */
    1030      847928 :     ga = shl_sat( tmp, exp );                     /*Q14 */
    1031             : 
    1032             : 
    1033             :     /*    ga = (float) 1. / ((float) 1. - (float) fabs (mu)); */
    1034             : 
    1035      847928 :     ptrs = sig_in; /* points on sig_in(-1) */
    1036             : 
    1037    68682168 :     FOR( n = 0; n < SubFrameLength; n++ )
    1038             :     {
    1039    67834240 :         temp = mult_r( mu, ( *ptrs++ ) );
    1040    67834240 :         temp = add_sat( temp, *ptrs ); /*Q12 */
    1041    67834240 :         sig_out[n] = shl_o( mult_r( ga, temp ), 1, &Overflow );
    1042    67834240 :         move16(); /*Q12 */
    1043             :     }
    1044             : 
    1045      847928 :     return;
    1046             : }
    1047             : 
    1048      847928 : static void scale_st_swb(
    1049             :     const Word16 *sig_in_fx, /* i  : postfilter i signal             */
    1050             :     Word16 *sig_out_fx,      /* i/o: postfilter o signal             */
    1051             :     Word16 *gain_prec_fx,    /* i/o: last value of gain for subframe */
    1052             :     Word16 SubFrameLength )
    1053             : {
    1054             :     Word16 i;
    1055             :     Word16 agc_fac1_para_fx;
    1056             :     Word16 agc_fac_para_fx;
    1057             :     Word32 L_acc, L_temp;
    1058             :     Word16 g0_fx, gain_fx;
    1059             :     Word16 scal_in, scal_out;
    1060             :     Word16 s_g_in, s_g_out, sh_g0, temp;
    1061             : 
    1062             : 
    1063      847928 :     IF( EQ_16( SubFrameLength, L_SUBFR ) )
    1064             :     {
    1065           0 :         agc_fac1_para_fx = AGC_FAC1_FX;
    1066           0 :         move16();
    1067           0 :         agc_fac_para_fx = AGC_FAC_FX;
    1068           0 :         move16();
    1069             :     }
    1070             :     ELSE /*IF( SubFrameLength == L_SUBFR16k ) */
    1071             :     {
    1072      847928 :         agc_fac1_para_fx = AGC_FAC1_WB_FX;
    1073      847928 :         move16();
    1074      847928 :         agc_fac_para_fx = AGC_FAC_WB_FX;
    1075      847928 :         move16();
    1076             :     }
    1077             : 
    1078             :     /* compute input gain */
    1079      847928 :     L_acc = L_mult0( 1, abs_s( sig_in_fx[0] ) ); /*0 +Q_bwe_exc-1 */
    1080    67834240 :     FOR( i = 1; i < SubFrameLength; i++ )
    1081             :     {
    1082    66986312 :         L_acc = L_mac0( L_acc, 1, abs_s( sig_in_fx[i] ) ); /*Q_bwe_exc-1 */
    1083             :     }
    1084             : 
    1085      847928 :     g0_fx = 0;
    1086      847928 :     move16();
    1087      847928 :     IF( L_acc != 0L )
    1088             :     {
    1089      847045 :         scal_in = norm_l( L_acc );
    1090      847045 :         L_acc = L_shl( L_acc, scal_in );
    1091      847045 :         s_g_in = extract_h( L_acc ); /* normalized */
    1092             : 
    1093             :         /* Compute o   gain */
    1094      847045 :         L_acc = L_mult0( 1, abs_s( sig_out_fx[0] ) );
    1095    67763600 :         FOR( i = 1; i < SubFrameLength; i++ )
    1096             :         {
    1097    66916555 :             L_acc = L_mac0( L_acc, 1, abs_s( sig_out_fx[i] ) );
    1098             :         }
    1099      847045 :         IF( L_acc == 0L )
    1100             :         {
    1101           0 :             *gain_prec_fx = 0;
    1102           0 :             move16();
    1103             : 
    1104           0 :             return;
    1105             :         }
    1106             : 
    1107      847045 :         scal_out = norm_l( L_acc );
    1108      847045 :         L_acc = L_shl( L_acc, scal_out );
    1109      847045 :         s_g_out = extract_h( L_acc ); /* normalized */
    1110             : 
    1111             : 
    1112      847045 :         sh_g0 = add( scal_in, 1 );
    1113      847045 :         sh_g0 = sub( sh_g0, scal_out ); /* scal_in - scal_out + 1 */
    1114      847045 :         IF( LT_16( s_g_in, s_g_out ) )
    1115             :         {
    1116      157852 :             g0_fx = div_s( s_g_in, s_g_out ); /* s_g_in/s_g_out in Q15 */
    1117             :         }
    1118             :         ELSE
    1119             :         {
    1120      689193 :             temp = sub( s_g_in, s_g_out ); /* sufficient since normalized */
    1121      689193 :             g0_fx = shr( div_s( temp, s_g_out ), 1 );
    1122      689193 :             g0_fx = add( g0_fx, (Word16) 0x4000 ); /* s_g_in/s_g_out in Q14 */
    1123      689193 :             sh_g0 = sub( sh_g0, 1 );
    1124             :         }
    1125             :         /* L_gain_in/L_gain_out in Q14 */
    1126             :         /* overflows if L_gain_in > 2 * L_gain_out */
    1127      847045 :         g0_fx = shr_sat( g0_fx, sh_g0 ); /* sh_g0 may be >0, <0, or =0 */ // Need to verify?
    1128             : 
    1129      847045 :         g0_fx = mult_r( g0_fx, agc_fac1_para_fx ); /* L_gain_in/L_gain_out * AGC_FAC1_FX */
    1130             :     }
    1131             :     /* compute gain(n) = AGC_FAC gain(n-1) + (1-AGC_FAC)gain_in/gain_out */
    1132             :     /* sig_out(n) = gain(n) sig_out(n) */
    1133      847928 :     gain_fx = *gain_prec_fx;
    1134      847928 :     move16(); /*14 */
    1135    68682168 :     FOR( i = 0; i < SubFrameLength; i++ )
    1136             :     {
    1137    67834240 :         temp = mult_r( agc_fac_para_fx, gain_fx ); /*15 +14 -15 =14 */
    1138    67834240 :         gain_fx = add( temp, g0_fx );              /* in Q14 */
    1139    67834240 :         L_temp = L_mult( gain_fx, sig_out_fx[i] ); /*14 + Q_bwe_exc-1 +1 = 14 + Q_bwe_exc */
    1140    67834240 :         L_temp = L_shl_sat( L_temp, 1 );           /*14 + Q_bwe_exc +1 */
    1141    67834240 :         sig_out_fx[i] = round_fx_sat( L_temp );    /*Q_bwe_exc +15 -16 = Q_bwe_exc-1 */
    1142    67834240 :         move16();
    1143             :     }
    1144      847928 :     *gain_prec_fx = gain_fx;
    1145      847928 :     move16();
    1146             : 
    1147      847928 :     return;
    1148             : }
    1149             : 
    1150       10832 : void PostShortTerm_fx(
    1151             :     Word16 *sig_in,             /* i  : input signal (pointer to current subframe */
    1152             :     Word16 *lpccoeff,           /* i  : LPC coefficients for current subframe */
    1153             :     Word16 *sig_out,            /* o  : postfiltered output */
    1154             :     Word16 *mem_stp,            /* i/o: postfilter memory*/
    1155             :     Word16 *ptr_mem_stp,        /* i/o: pointer to postfilter memory*/
    1156             :     Word16 *ptr_gain_prec,      /* i/o: for gain adjustment*/
    1157             :     Word16 *mem_zero,           /* i/o: null memory to compute h_st*/
    1158             :     const Word16 formant_fac_fx /* i  : Strength of post-filter*/
    1159             : )
    1160             : {
    1161             :     Word16 apond1_fx[LPC_SHB_ORDER + 1]; /* denominator coeff.*/
    1162             :     Word16 apond2_fx[LONG_H_ST];         /* numerator coeff.  */
    1163             :     Word16 sig_ltp_fx[L_SUBFR16k + 1];   /* residual signal   */
    1164             :     /*Word16 lpccoeff_fx[LPC_SHB_ORDER+1];//Q12 */
    1165             :     Word16 g1_fx, g2_fx, parcor0_fx; /*Q15 */
    1166             :     Word16 tmp;
    1167             : 
    1168       10832 :     parcor0_fx = 0;
    1169       10832 :     move16();
    1170       10832 :     set16_fx( apond1_fx, 0, LPC_SHB_ORDER + 1 );
    1171       10832 :     set16_fx( apond2_fx, 0, LONG_H_ST );
    1172       10832 :     set16_fx( sig_ltp_fx, 0, L_SUBFR16k + 1 );
    1173             : 
    1174             :     /* Obtain post-filter weights  */
    1175       10832 :     tmp = extract_h( L_mult( GAMMA_SHARP_FX, formant_fac_fx ) ); /*Q15 */
    1176       10832 :     g1_fx = add( GAMMA0_FX, tmp );                               /*Q15  */
    1177       10832 :     g2_fx = sub( GAMMA0_FX, tmp );                               /*Q15 */
    1178             : 
    1179             :     /* Compute weighted LPC coefficients */
    1180       10832 :     weight_a_fx( lpccoeff, apond1_fx, g1_fx, LPC_SHB_ORDER );
    1181       10832 :     weight_a_fx( lpccoeff, apond2_fx, g2_fx, LPC_SHB_ORDER );
    1182             :     /* o: apond1_fx, apond2_fx in Q12 */
    1183             : 
    1184             :     /* Compute A(gamma2) residual */
    1185       10832 :     Residu3_10_fx( apond2_fx, sig_in, sig_ltp_fx + 1, L_SUBFR16k, 0 );
    1186             :     /* o: sig_ltp_fx in Q_bwe_exc */
    1187             : 
    1188             :     /* Save last output of 1/A(gamma1)  */
    1189       10832 :     sig_ltp_fx[0] = *ptr_mem_stp;
    1190       10832 :     move16();
    1191             : 
    1192             :     /* Control short term pst filter gain and compute parcor0   */
    1193       10832 :     Calc_st_filt_tbe( apond2_fx, apond1_fx, &parcor0_fx, sig_ltp_fx + 1, mem_zero );
    1194             :     /* o: parcor0 in Q15 */
    1195             :     /* i/o: sig_ltp_fx in Q_bwe_exc */
    1196             : 
    1197             :     /* 1/A(gamma1) filtering, mem_stp is updated */
    1198       10832 :     Syn_filt_s( 0, apond1_fx, LPC_SHB_ORDER, sig_ltp_fx + 1, sig_ltp_fx + 1, L_SUBFR16k, mem_stp, 1 );
    1199             : 
    1200             :     /* (1 + mu z-1) tilt filtering */
    1201       10832 :     filt_mu_fx( sig_ltp_fx, sig_out, parcor0_fx, L_SUBFR16k );
    1202             :     /* o: sig_out in Q_bwe_exc */
    1203             : 
    1204             :     /* gain control */
    1205       10832 :     scale_st_swb( sig_in, sig_out, ptr_gain_prec, L_SUBFR16k );
    1206             : 
    1207       10832 :     return;
    1208             : }
    1209             : 
    1210      443304 : void PostShortTerm_ivas_enc_fx(
    1211             :     Word16 *sig_in,             /* i  : input signal (pointer to current subframe */
    1212             :     Word16 *lpccoeff,           /* i  : LPC coefficients for current subframe */
    1213             :     Word16 *sig_out,            /* o  : postfiltered output */
    1214             :     Word16 *mem_stp,            /* i/o: postfilter memory*/
    1215             :     Word16 *ptr_mem_stp,        /* i/o: pointer to postfilter memory*/
    1216             :     Word16 *ptr_gain_prec,      /* i/o: for gain adjustment*/
    1217             :     Word16 *mem_zero,           /* i/o: null memory to compute h_st*/
    1218             :     const Word16 formant_fac_fx /* i  : Strength of post-filter*/
    1219             : )
    1220             : {
    1221             :     Word16 apond1_fx[LPC_SHB_ORDER + 1]; /* denominator coeff.*/
    1222             :     Word16 apond2_fx[LONG_H_ST];         /* numerator coeff.  */
    1223             :     Word16 sig_ltp_fx[L_SUBFR16k + 1];   /* residual signal   */
    1224             :     /*Word16 lpccoeff_fx[LPC_SHB_ORDER+1];//Q12 */
    1225             :     Word16 g1_fx, g2_fx, parcor0_fx; /*Q15 */
    1226             :     Word16 tmp;
    1227             : 
    1228      443304 :     parcor0_fx = 0;
    1229      443304 :     move16();
    1230      443304 :     set16_fx( apond1_fx, 0, LPC_SHB_ORDER + 1 );
    1231      443304 :     set16_fx( apond2_fx, 0, LONG_H_ST );
    1232      443304 :     set16_fx( sig_ltp_fx, 0, L_SUBFR16k + 1 );
    1233             : 
    1234             :     /* Obtain post-filter weights  */
    1235      443304 :     tmp = extract_h( L_mult( GAMMA_SHARP_FX, formant_fac_fx ) ); /*Q15 */
    1236      443304 :     g1_fx = add( GAMMA0_FX, tmp );                               /*Q15  */
    1237      443304 :     g2_fx = sub( GAMMA0_FX, tmp );                               /*Q15 */
    1238             : 
    1239             :     /* Compute weighted LPC coefficients */
    1240      443304 :     weight_a_fx( lpccoeff, apond1_fx, g1_fx, LPC_SHB_ORDER );
    1241      443304 :     weight_a_fx( lpccoeff, apond2_fx, g2_fx, LPC_SHB_ORDER );
    1242             :     /* o: apond1_fx, apond2_fx in Q12 */
    1243             : 
    1244             :     /* Compute A(gamma2) residual */
    1245      443304 :     Residu3_10_fx( apond2_fx, sig_in, sig_ltp_fx + 1, L_SUBFR16k, 0 );
    1246             :     /* o: sig_ltp_fx in Q_bwe_exc */
    1247             : 
    1248             :     /* Save last output of 1/A(gamma1)  */
    1249      443304 :     sig_ltp_fx[0] = *ptr_mem_stp;
    1250      443304 :     move16();
    1251             : 
    1252             :     /* Control short term pst filter gain and compute parcor0   */
    1253      443304 :     Calc_st_filt_tbe_ivas_enc_fx( apond2_fx, apond1_fx, &parcor0_fx, sig_ltp_fx + 1, mem_zero );
    1254             :     /* o: parcor0 in Q15 */
    1255             :     /* i/o: sig_ltp_fx in Q_bwe_exc */
    1256             : 
    1257             :     /* 1/A(gamma1) filtering, mem_stp is updated */
    1258      443304 :     syn_filt_fx( 0, apond1_fx, LPC_SHB_ORDER, sig_ltp_fx + 1, sig_ltp_fx + 1, L_SUBFR16k, mem_stp, 1 );
    1259             : 
    1260             :     /* (1 + mu z-1) tilt filtering */
    1261      443304 :     filt_mu_fx( sig_ltp_fx, sig_out, parcor0_fx, L_SUBFR16k );
    1262             :     /* o: sig_out in Q_bwe_exc */
    1263             : 
    1264             :     /* gain control */
    1265      443304 :     scale_st_swb( sig_in, sig_out, ptr_gain_prec, L_SUBFR16k );
    1266             : 
    1267      443304 :     return;
    1268             : }
    1269             : 
    1270      393792 : void PostShortTerm_ivas_dec_fx(
    1271             :     Word16 *sig_in,             /* i  : input signal (pointer to current subframe */
    1272             :     Word16 *lpccoeff,           /* i  : LPC coefficients for current subframe */
    1273             :     Word16 *sig_out,            /* o  : postfiltered output */
    1274             :     Word16 *mem_stp,            /* i/o: postfilter memory*/
    1275             :     Word16 *ptr_mem_stp,        /* i/o: pointer to postfilter memory*/
    1276             :     Word16 *ptr_gain_prec,      /* i/o: for gain adjustment*/
    1277             :     Word16 *mem_zero,           /* i/o: null memory to compute h_st*/
    1278             :     const Word16 formant_fac_fx /* i  : Strength of post-filter*/
    1279             : )
    1280             : {
    1281             :     Word16 apond1_fx[LPC_SHB_ORDER + 1]; /* denominator coeff.*/
    1282             :     Word16 apond2_fx[LONG_H_ST];         /* numerator coeff.  */
    1283             :     Word16 sig_ltp_fx[L_SUBFR16k + 1];   /* residual signal   */
    1284             :     /*Word16 lpccoeff_fx[LPC_SHB_ORDER+1];//Q12 */
    1285             :     Word16 g1_fx, g2_fx, parcor0_fx; /*Q15 */
    1286             :     Word16 tmp;
    1287             : 
    1288      393792 :     parcor0_fx = 0;
    1289      393792 :     move16();
    1290      393792 :     set16_fx( apond1_fx, 0, LPC_SHB_ORDER + 1 );
    1291      393792 :     set16_fx( apond2_fx, 0, LONG_H_ST );
    1292      393792 :     set16_fx( sig_ltp_fx, 0, L_SUBFR16k + 1 );
    1293             : 
    1294             :     /* Obtain post-filter weights  */
    1295      393792 :     tmp = extract_h( L_mult( GAMMA_SHARP_FX, formant_fac_fx ) ); /*Q15 */
    1296      393792 :     g1_fx = add( GAMMA0_FX, tmp );                               /*Q15  */
    1297      393792 :     g2_fx = sub( GAMMA0_FX, tmp );                               /*Q15 */
    1298             : 
    1299             :     /* Compute weighted LPC coefficients */
    1300      393792 :     weight_a_fx( lpccoeff, apond1_fx, g1_fx, LPC_SHB_ORDER );
    1301      393792 :     weight_a_fx( lpccoeff, apond2_fx, g2_fx, LPC_SHB_ORDER );
    1302             :     /* o: apond1_fx, apond2_fx in Q12 */
    1303             : 
    1304             :     /* Compute A(gamma2) residual */
    1305      393792 :     Residu3_10_fx( apond2_fx, sig_in, sig_ltp_fx + 1, L_SUBFR16k, 0 );
    1306             :     /* o: sig_ltp_fx in Q_bwe_exc */
    1307             : 
    1308             :     /* Save last output of 1/A(gamma1)  */
    1309      393792 :     sig_ltp_fx[0] = *ptr_mem_stp;
    1310      393792 :     move16();
    1311             : 
    1312             :     /* Control short term pst filter gain and compute parcor0   */
    1313      393792 :     Calc_st_filt_tbe_ivas_dec_fx( apond2_fx, apond1_fx, &parcor0_fx, sig_ltp_fx + 1, mem_zero );
    1314             :     /* o: parcor0 in Q15 */
    1315             :     /* i/o: sig_ltp_fx in Q_bwe_exc */
    1316             : 
    1317             :     /* 1/A(gamma1) filtering, mem_stp is updated */
    1318      393792 :     Syn_filt_s( 0, apond1_fx, LPC_SHB_ORDER, sig_ltp_fx + 1, sig_ltp_fx + 1, L_SUBFR16k, mem_stp, 1 );
    1319             : 
    1320             :     /* (1 + mu z-1) tilt filtering */
    1321      393792 :     filt_mu_fx( sig_ltp_fx, sig_out, parcor0_fx, L_SUBFR16k );
    1322             :     /* o: sig_out in Q_bwe_exc */
    1323             : 
    1324             :     /* gain control */
    1325      393792 :     scale_st_swb( sig_in, sig_out, ptr_gain_prec, L_SUBFR16k );
    1326             : 
    1327      393792 :     return;
    1328             : }
    1329             : 
    1330       56411 : void flip_spectrum_and_decimby4_fx(
    1331             :     const Word16 input[],  /* i : input spectrum Q_inp     */
    1332             :     Word16 output[],       /* o : output spectrum Q_inp    */
    1333             :     const Word16 length,   /* i : vector length            */
    1334             :     Word16 mem1[],         /* i/o : memory Q_inp           */
    1335             :     Word16 mem2[],         /* i/o : memory Q_inp           */
    1336             :     const Word16 ramp_flag /*i: flag to trigger slow ramp-up of output following change of core (HQ to ACELP or 12k8 to 16k ACELP) */
    1337             : )
    1338             : {
    1339             :     Word16 i;
    1340             :     Word16 factor, tmp[L_FRAME16k / 2];
    1341             :     Word16 tmp1, tmp2;
    1342             :     Word16 input_change[L_FRAME16k];
    1343             : 
    1344       56411 :     IF( ramp_flag )
    1345             :     {
    1346         573 :         factor = div_s( 4, length ); /* Q15 */
    1347       23493 :         FOR( i = 0; i < length / 4; i += 2 )
    1348             :         {
    1349       22920 :             tmp1 = extract_l( L_mult0( i, factor ) );           /* Q15 */
    1350       22920 :             tmp2 = extract_l( L_mult0( add( i, 1 ), factor ) ); /*Q15 */
    1351       22920 :             input_change[i] = negate( mult_r( input[i], tmp1 ) );
    1352       22920 :             move16();
    1353       22920 :             input_change[i + 1] = mult_r( input[i + 1], tmp2 );
    1354       22920 :             move16();
    1355             :         }
    1356             :     }
    1357             :     ELSE
    1358             :     {
    1359       55838 :         i = 0;
    1360       55838 :         move16();
    1361             :     }
    1362             : 
    1363     6238643 :     FOR( ; i < length; i = i + 2 )
    1364             :     {
    1365     6182232 :         input_change[i] = negate( input[i] );
    1366     6182232 :         move16();
    1367     6182232 :         input_change[i + 1] = input[i + 1];
    1368     6182232 :         move16();
    1369             :     }
    1370             : 
    1371       56411 :     Decimate_allpass_steep_fx( input_change, mem1, length, tmp );
    1372       56411 :     Decimate_allpass_steep_fx( tmp, mem2, shr( length, 1 ), output );
    1373             : 
    1374       56411 :     return;
    1375             : }
    1376             : 
    1377             : 
    1378             : /*==========================================================================*/
    1379             : /* FUNCTION : void GenShapedWBExcitation_fx () */
    1380             : /*--------------------------------------------------------------------------*/
    1381             : /* PURPOSE : Synthesize spectrally shaped highband excitation signal for the wideband */
    1382             : /*--------------------------------------------------------------------------*/
    1383             : /* INPUT ARGUMENTS : */
    1384             : /* _Word16 *lpc_shb i : lpc coefficients Q12 */
    1385             : /* _Word16 coder_type i : coding type */
    1386             : /* _Word16 *bwe_exc_extended i : bwidth extended exciatation Q_bwe_exc*/
    1387             : /* _Word16 Q_bwe_exc i : Q format */
    1388             : /* _Word16 voice_factors[] i : voicing factor Q15 */
    1389             : /*--------------------------------------------------------------------------*/
    1390             : /* OUTPUT ARGUMENTS : */
    1391             : /* _Word16 *excSHB o : synthesized shaped shb exctiation Q_bwe_exc*/
    1392             : /* _Word16 *exc4kWhtnd o : whitened synthesized shb excitation Q_bwe_exc*/
    1393             : /*--------------------------------------------------------------------------*/
    1394             : /* INPUT/OUTPUT ARGUMENTS : */
    1395             : /* _Word32 *mem_csfilt i/o : memory Q_bwe_exc+16*/
    1396             : /* _Word16 *mem_genSHBexc_filt_down1 i/o : memory Q_bwe_exc */
    1397             : /* _Word16 *mem_genSHBexc_filt_down2 i/o : memory Q_bwe_exc */
    1398             : /* _Word16 *mem_genSHBexc_filt_down3 i/o : memory Q_bwe_exc */
    1399             : /* _Word16 *state_lpc_syn i/o : memory Q_bwe_exc */
    1400             : /* _Word16 bwe_seed[] i/o : random number generator seed */
    1401             : /*--------------------------------------------------------------------------*/
    1402             : /* RETURN ARGUMENTS : */
    1403             : /* _ None */
    1404             : /*--------------------------------------------------------------------------*/
    1405             : /* CALLED FROM : */
    1406             : /*==========================================================================*/
    1407             : 
    1408       14213 : void GenShapedWBExcitation_ivas_fx(
    1409             :     Word16 *excSHB,                   /* o : synthesized shaped shb exctiation Q_bwe_exc*/
    1410             :     const Word16 *lpc_shb,            /* i : lpc coefficients Q12*/
    1411             :     Word16 *exc4kWhtnd,               /* o : whitened synthesized shb excitation Q_bwe_exc*/
    1412             :     Word32 *mem_csfilt,               /* i/o : memory Q_bwe_exc+16*/
    1413             :     Word16 *mem_genSHBexc_filt_down1, /* i/o : memory Q_bwe_exc*/
    1414             :     Word16 *mem_genSHBexc_filt_down2, /* i/o : memory Q_bwe_exc*/
    1415             :     Word16 *mem_genSHBexc_filt_down3, /* i/o : memory Q_bwe_exc*/
    1416             :     Word16 *state_lpc_syn,            /* i/o : memory Q_bwe_exc*/
    1417             :     const Word16 coder_type,          /* i : coding type */
    1418             :     const Word16 *bwe_exc_extended,   /* i : bwidth extended exciatation Q_bwe_exc*/
    1419             :     const Word16 Q_bwe_exc,
    1420             :     Word16 bwe_seed[],            /* i/o : random number generator seed */
    1421             :     const Word16 voice_factors[], /* i : voicing factor Q15*/
    1422             :     const Word16 uv_flag,         /* i : unvoiced flag */
    1423             :     const Word16 igf_flag )
    1424             : {
    1425             :     Word16 i, j, k;
    1426             :     Word16 wht_fil_mem[LPC_WHTN_ORDER_WB];
    1427             :     Word16 lpc_whtn[LPC_WHTN_ORDER_WB + 1];
    1428             :     Word16 R_h[LPC_WHTN_ORDER_WB + 2], R_l[LPC_WHTN_ORDER_WB + 2];
    1429             :     Word16 Q_R;
    1430             :     Word16 excTmp[L_FRAME16k];
    1431             :     Word16 excTmp2[L_FRAME16k / 4];
    1432             :     Word16 excTmp2_frac[L_FRAME16k / 4];
    1433             :     Word16 exc4k[L_FRAME16k / 4];
    1434             :     Word16 exc4k_frac[L_FRAME16k / 4];
    1435             :     Word32 exc4k_32[L_FRAME16k / 4];
    1436             :     Word32 pow1, pow22;
    1437             :     Word16 scale;
    1438             :     Word32 excNoisyEnv[L_FRAME16k / 4];
    1439       14213 :     Word16 csfilt_num2[1] = { 1638 };              /* Q15*/
    1440       14213 :     Word16 neg_csfilt_den2[2] = { -32768, 31457 }; /* Q15 */
    1441             :     Word32 L_tmp, Ltemp1, Ltemp2;
    1442             :     Word16 temp1, temp2, exp;
    1443             :     Word32 Lmax;
    1444             :     Word16 max_val, n1, n2, sc;
    1445             :     Word32 LepsP[LPC_WHTN_ORDER_WB + 1];
    1446             :     Word16 tmp_vfac;
    1447             :     Word16 avg_voice_fac;
    1448             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
    1449       14213 :     Flag Overflow = 0;
    1450       14213 :     move16();
    1451             : #endif
    1452             : 
    1453             :     /*0.25f*sum_f(voice_factors, NB_SUBFR)*/
    1454       14213 :     L_tmp = L_mult( voice_factors[0], 8192 /* 0.25 in Q15 */ );
    1455       56852 :     FOR( i = 1; i < NB_SUBFR; i++ )
    1456             :     {
    1457       42639 :         L_tmp = L_mac( L_tmp, voice_factors[i], 8192 /* 0.25 in Q15 */ );
    1458             :     }
    1459       14213 :     avg_voice_fac = round_fx( L_tmp );
    1460             : 
    1461       14213 :     test();
    1462       14213 :     test();
    1463       14213 :     test();
    1464       14213 :     test();
    1465       14213 :     IF( igf_flag != 0 && ( EQ_16( coder_type, VOICED ) || GT_16( avg_voice_fac, 11469 /* 0.35 in Q15 */ ) ) ) /*Q15 -> 0.35f*/
    1466             :     {
    1467           0 :         csfilt_num2[0] = 6554;
    1468           0 :         move16(); /*Q15 -> 0.2f*/
    1469           0 :         neg_csfilt_den2[1] = 26214;
    1470           0 :         move16(); /*Q15 -> 0.8f*/
    1471             :     }
    1472       14213 :     ELSE IF( igf_flag != 0 && ( EQ_16( coder_type, UNVOICED ) || LT_16( avg_voice_fac, 6654 /* 0.2 in Q15*/ ) ) ) /*Q15 -> 0.2f*/
    1473             :     {
    1474           0 :         csfilt_num2[0] = 328;
    1475           0 :         move16(); /*Q15 -> 0.01f*/
    1476           0 :         neg_csfilt_den2[1] = 32440;
    1477           0 :         move16(); /*Q15 -> 0.99f*/
    1478             :     }
    1479       14213 :     set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER_WB );
    1480       14213 :     Decimate_allpass_steep_fx( bwe_exc_extended, mem_genSHBexc_filt_down1, L_FRAME32k, excTmp );
    1481       14213 :     flip_spectrum_and_decimby4_fx( excTmp, exc4k, L_FRAME16k, mem_genSHBexc_filt_down2, mem_genSHBexc_filt_down3, 0 );
    1482             : 
    1483       14213 :     IF( uv_flag )
    1484             :     {
    1485         859 :         create_random_vector_fx( exc4kWhtnd, L_FRAME16k / 4, bwe_seed );
    1486         859 :         IF( LT_16( Q_bwe_exc, 5 ) )
    1487             :         {
    1488             : 
    1489       69579 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1490             :             {
    1491       68720 :                 exc4kWhtnd[i] = shl_r( exc4kWhtnd[i], sub( Q_bwe_exc, 5 ) ); /*Q(Q_bwe_exc)/Q5(if Q_bwe_exc > 5) */
    1492       68720 :                 move16();
    1493             :             }
    1494             :         }
    1495             :     }
    1496             :     ELSE
    1497             :     {
    1498       13354 :         autocorr_fx( exc4k, LPC_WHTN_ORDER_WB + 1, R_h, R_l, &Q_R,
    1499             :                      L_FRAME16k / 4, win_flatten_4k_fx, 0, 1 );
    1500             : 
    1501             :         /* Ensure R[0] isn't zero when entering Levinson Durbin */
    1502       13354 :         R_l[0] = s_max( R_l[0], 1 );
    1503       13354 :         move16();
    1504       40062 :         FOR( i = 1; i <= LPC_WHTN_ORDER_WB; i++ )
    1505             :         {
    1506       26708 :             L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
    1507       26708 :             L_Extract( L_tmp, &R_h[i], &R_l[i] );
    1508             :         }
    1509             : 
    1510       13354 :         E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER_WB, NULL );
    1511             : 
    1512       13354 :         Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER_WB + 1, sub( norm_s( lpc_whtn[0] ), 2 ) );
    1513             : 
    1514       13354 :         fir_fx( exc4k, lpc_whtn, exc4kWhtnd, wht_fil_mem, L_FRAME16k / 4,
    1515             :                 LPC_WHTN_ORDER_WB, 0, 3 );
    1516             : 
    1517             :         /* Ensure pow1 is greater than zero when computing normalization */
    1518       13354 :         max_val = 0;
    1519       13354 :         move16();
    1520     1081674 :         FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1521             :         {
    1522     1068320 :             excTmp2[i] = abs_s( exc4kWhtnd[i] );
    1523     1068320 :             move16(); /* Q_bwe_exc */
    1524     1068320 :             max_val = s_max( max_val, excTmp2[i] );
    1525     1068320 :             move16();
    1526             :         }
    1527             : 
    1528       13354 :         IF( max_val == 0 )
    1529             :         {
    1530           0 :             pow1 = 1;
    1531           0 :             move16();
    1532           0 :             n1 = 0;
    1533           0 :             move16();
    1534             :         }
    1535             :         ELSE
    1536             :         {
    1537       13354 :             n1 = norm_s( max_val );
    1538     1081674 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1539             :             {
    1540     1068320 :                 excTmp2_frac[i] = shl_o( excTmp2[i], n1, &Overflow ); // Q_bwe_exc + n1
    1541     1068320 :                 move16();                                             /* Q14 */
    1542             :             }
    1543       13354 :             n1 = sub( sub( 14, n1 ), Q_bwe_exc );
    1544       13354 :             pow1 = 1;
    1545       13354 :             move32();
    1546     1081674 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1547             :             {
    1548     1068320 :                 L_tmp = L_mult_o( excTmp2_frac[i], excTmp2_frac[i], &Overflow ); /* Q29 */
    1549     1068320 :                 pow1 = L_add_o( pow1, L_shr( L_tmp, 10 ), &Overflow );           /* Q22 */
    1550             :             }
    1551             :         }
    1552             : 
    1553     1081674 :         FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1554             :         {
    1555     1068320 :             excNoisyEnv[i] = L_add_o( *mem_csfilt, L_mult_o( csfilt_num2[0], excTmp2[i], &Overflow ), &Overflow );
    1556     1068320 :             move32(); /* Q_bwe_exc+16  */
    1557     1068320 :             *mem_csfilt = Mult_32_16( excNoisyEnv[i], neg_csfilt_den2[1] );
    1558     1068320 :             move32(); /* Q_bwe_exc+16 */
    1559             :         }
    1560             : 
    1561       13354 :         create_random_vector_fx( exc4k, L_FRAME16k / 4, bwe_seed );
    1562             : 
    1563             :         /* Ensure pow22 is greater than zero when computing normalization */
    1564       13354 :         Lmax = 0;
    1565     1081674 :         FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1566             :         {
    1567     1068320 :             exc4k_32[i] = Mult_32_16( excNoisyEnv[i], exc4k[i] );
    1568     1068320 :             move32(); /* Q_bwe_exc+6 */
    1569     1068320 :             Lmax = L_max( Lmax, L_abs( exc4k_32[i] ) );
    1570             :         }
    1571             : 
    1572       13354 :         IF( Lmax == 0 )
    1573             :         {
    1574           0 :             pow22 = 1;
    1575           0 :             move16();
    1576           0 :             n2 = 0;
    1577           0 :             move16();
    1578           0 :             set16_fx( exc4k_frac, 0, L_FRAME16k / 4 );
    1579             :         }
    1580             :         ELSE
    1581             :         {
    1582       13354 :             n2 = norm_l( Lmax );
    1583     1081674 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1584             :             {
    1585     1068320 :                 exc4k_frac[i] = extract_h( L_shl_o( exc4k_32[i], n2, &Overflow ) ); /* Q(14-n2) */
    1586     1068320 :                 move16();
    1587             :             }
    1588       13354 :             n2 = 30 - n2 - ( Q_bwe_exc + 6 );
    1589       13354 :             pow22 = 1;
    1590       13354 :             move32();
    1591     1081674 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1592             :             {
    1593     1068320 :                 L_tmp = L_mult_o( exc4k_frac[i], exc4k_frac[i], &Overflow ); /* Q29 */
    1594     1068320 :                 pow22 = L_add_o( pow22, L_shr( L_tmp, 10 ), &Overflow );     /* Q22     */
    1595             :             }
    1596             :         }
    1597             : 
    1598       13354 :         test();
    1599       13354 :         test();
    1600       13354 :         IF( EQ_16( coder_type, UNVOICED ) || ( igf_flag != 0 && LT_16( avg_voice_fac, 6654 /* 0.2 in Q15 */ ) ) )
    1601             :         {
    1602         388 :             L_tmp = root_a_over_b_fx( pow1, sub( 19, shl( n1, 1 ) ), pow22, sub( 19, shl( n2, 1 ) ), &exp );
    1603         388 :             scale = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /*Q15 */
    1604         388 :             sc = sub( add( n2, Q_bwe_exc ), 14 );
    1605       31428 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1606             :             {
    1607       31040 :                 exc4kWhtnd[i] = round_fx_o( L_shl_o( L_mult_o( exc4k_frac[i], scale, &Overflow ), sc, &Overflow ), &Overflow ); /*  Q_bwe_exc+n2-10+16+ Q_bwe_exc + n2 -14 -16 = //Q_bwe_exc */
    1608       31040 :                 move16();
    1609             :             }
    1610             :         }
    1611             :         ELSE
    1612             :         {
    1613       12966 :             sc = sub( add( n2, Q_bwe_exc ), 14 ); /* Q_bwe_exc+n2-14*/
    1614             : 
    1615       12966 :             k = 0;
    1616       64830 :             FOR( i = 0; i < 4; i++ )
    1617             :             {
    1618       51864 :                 test();
    1619       51864 :                 IF( igf_flag != 0 && EQ_16( coder_type, VOICED ) )
    1620             :                 {
    1621             :                     /*tmp_vfac = 2*voice_factors[i];
    1622             :                       tmp_vfac = min(1, tmp_vfac);*/
    1623           0 :                     tmp_vfac = shl_o( voice_factors[i], 1, &Overflow );
    1624             :                 }
    1625             :                 ELSE
    1626             :                 {
    1627       51864 :                     tmp_vfac = voice_factors[i];
    1628       51864 :                     move16();
    1629             :                 }
    1630             : 
    1631       51864 :                 Ltemp1 = root_a_fx( L_deposit_h( tmp_vfac ), 31, &exp );
    1632       51864 :                 temp1 = round_fx_o( L_shl_o( Ltemp1, exp, &Overflow ), &Overflow ); /* Q15 */
    1633       51864 :                 L_tmp = Mult_32_16( pow1, sub( 32767, tmp_vfac ) );                 /* Q22*/
    1634       51864 :                 Ltemp2 = root_a_over_b_fx( L_tmp, sub( 19, shl( n1, 1 ) ), pow22, sub( 19, shl( n2, 1 ) ), &exp );
    1635       51864 :                 temp2 = round_fx_o( L_shl_o( Ltemp2, exp, &Overflow ), &Overflow ); /* Q15 */
    1636     1089144 :                 FOR( j = 0; j < L_FRAME16k / 16; j++ )
    1637             :                 {
    1638     1037280 :                     L_tmp = L_mult_o( temp1, exc4kWhtnd[k], &Overflow );                                                        /* Q(16+Q_bwe_exc) */
    1639     1037280 :                     L_tmp = L_add_o( L_tmp, L_shl_o( L_mult_o( temp2, exc4k_frac[k], &Overflow ), sc, &Overflow ), &Overflow ); /* Q(16+Q_bwe_exc) */
    1640     1037280 :                     exc4kWhtnd[k] = round_fx_o( L_tmp, &Overflow );                                                             /* Q_bwe_exc */
    1641     1037280 :                     move16();
    1642     1037280 :                     k++;
    1643             :                 }
    1644             :             }
    1645             :         }
    1646             :     }
    1647             : 
    1648       14213 :     Scale_sig( state_lpc_syn, LPC_SHB_ORDER, -Q2 ); /* Q(Q_bwe_exc) -> Q(Q_bwe_exc - 2) */
    1649             : 
    1650       14213 :     Syn_filt_s( Q2, lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 );
    1651             : 
    1652       14213 :     Scale_sig( state_lpc_syn, LPC_SHB_ORDER, Q2 ); /* Q(Q_bwe_exc - 2) -> Q(Q_bwe_exc) */
    1653       14213 :     Scale_sig( excSHB, L_FRAME16k / 4, Q2 );       /* Q(Q_bwe_exc - 2) -> Q(Q_bwe_exc) */
    1654             : 
    1655       14213 :     return;
    1656             : }
    1657             : 
    1658           0 : void GenShapedWBExcitation_fx(
    1659             :     Word16 *excSHB,                   /* o : synthesized shaped shb exctiation   Q(Q_bwe_exc) */
    1660             :     const Word16 *lpc_shb,            /* i : lpc coefficients                             Q12 */
    1661             :     Word16 *exc4kWhtnd,               /* o : whitened synthesized shb excitation Q(Q_bwe_exc) */
    1662             :     Word32 *mem_csfilt,               /* i/o : memory                         Q(Q_bwe_exc+16) */
    1663             :     Word16 *mem_genSHBexc_filt_down1, /* i/o : memory                            Q(Q_bwe_exc) */
    1664             :     Word16 *mem_genSHBexc_filt_down2, /* i/o : memory                            Q(Q_bwe_exc) */
    1665             :     Word16 *mem_genSHBexc_filt_down3, /* i/o : memory                            Q(Q_bwe_exc) */
    1666             :     Word16 *state_lpc_syn,            /* i/o : memory                            Q(Q_bwe_exc) */
    1667             :     const Word16 coder_type,          /* i : coding type                                      */
    1668             :     const Word16 *bwe_exc_extended,   /* i : bwidth extended exciatation         Q(Q_bwe_exc) */
    1669             :     const Word16 Q_bwe_exc,           /* i : Q for memories                                   */
    1670             :     Word16 bwe_seed[],                /* i/o : random number generator seed                   */
    1671             :     const Word16 voice_factors[],     /* i : voicing factor                               Q15 */
    1672             :     const Word16 uv_flag,             /* i : unvoiced flag                                    */
    1673             :     const Word16 igf_flag )
    1674             : {
    1675             :     Word16 i, j, k;
    1676             :     Word16 wht_fil_mem[LPC_WHTN_ORDER_WB];
    1677             :     Word16 lpc_whtn[LPC_WHTN_ORDER_WB + 1];
    1678             :     Word16 R_h[LPC_WHTN_ORDER_WB + 2], R_l[LPC_WHTN_ORDER_WB + 2];
    1679             :     Word16 Q_R;
    1680             :     Word16 excTmp[L_FRAME16k];
    1681             :     Word16 excTmp2[L_FRAME16k / 4];
    1682             :     Word16 excTmp2_frac[L_FRAME16k / 4];
    1683             :     Word16 exc4k[L_FRAME16k / 4];
    1684             :     Word16 exc4k_frac[L_FRAME16k / 4];
    1685             :     Word32 exc4k_32[L_FRAME16k / 4];
    1686             :     Word32 pow1, pow22;
    1687             :     Word16 scale;
    1688             :     Word32 excNoisyEnv[L_FRAME16k / 4];
    1689           0 :     Word16 csfilt_num2[1] = { 1638 };              /* Q15*/
    1690           0 :     Word16 neg_csfilt_den2[2] = { -32768, 31457 }; /* Q15 */
    1691             :     Word32 L_tmp, Ltemp1, Ltemp2;
    1692             :     Word16 temp1, temp2, exp;
    1693             :     Word32 Lmax;
    1694             :     Word16 max_val, n1, n2, sc;
    1695             :     Word32 LepsP[LPC_WHTN_ORDER_WB + 1];
    1696             :     Word16 tmp_vfac;
    1697             :     Word16 avg_voice_fac;
    1698             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
    1699           0 :     Flag Overflow = 0;
    1700           0 :     move32();
    1701             : #endif
    1702           0 :     move16();
    1703           0 :     move16();
    1704           0 :     move16();
    1705             : 
    1706             :     /*0.25f*sum_f(voice_factors, NB_SUBFR)*/
    1707           0 :     L_tmp = L_mult( voice_factors[0], 8192 /*0.25 in Q15 */ );
    1708           0 :     FOR( i = 1; i < NB_SUBFR; i++ )
    1709             :     {
    1710           0 :         L_tmp = L_mac( L_tmp, voice_factors[i], 8192 /*0.25 in Q15 */ );
    1711             :     }
    1712           0 :     avg_voice_fac = round_fx( L_tmp );
    1713             : 
    1714           0 :     test();
    1715           0 :     test();
    1716           0 :     test();
    1717           0 :     test();
    1718           0 :     IF( igf_flag != 0 && ( EQ_16( coder_type, VOICED ) || GT_16( avg_voice_fac, 11469 /* 0.35 in Q15 */ ) ) ) /*Q15 -> 0.35f*/
    1719             :     {
    1720           0 :         csfilt_num2[0] = 6554;
    1721           0 :         move16(); /*Q15 -> 0.2f*/
    1722           0 :         neg_csfilt_den2[1] = 26214;
    1723           0 :         move16(); /*Q15 -> 0.8f*/
    1724             :     }
    1725           0 :     ELSE IF( igf_flag != 0 && ( EQ_16( coder_type, UNVOICED ) || LT_16( avg_voice_fac, 6654 /* 0.2 in Q15 */ ) ) ) /*Q15 -> 0.2f*/
    1726             :     {
    1727           0 :         csfilt_num2[0] = 328;
    1728           0 :         move16(); /*Q15 -> 0.01f*/
    1729           0 :         neg_csfilt_den2[1] = 32440;
    1730           0 :         move16(); /*Q15 -> 0.99f*/
    1731             :     }
    1732           0 :     set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER_WB );
    1733           0 :     Decimate_allpass_steep_fx( bwe_exc_extended, mem_genSHBexc_filt_down1, L_FRAME32k, excTmp );
    1734           0 :     flip_spectrum_and_decimby4_fx( excTmp, exc4k, L_FRAME16k, mem_genSHBexc_filt_down2, mem_genSHBexc_filt_down3, 0 );
    1735             : 
    1736           0 :     IF( uv_flag )
    1737             :     {
    1738           0 :         create_random_vector_fx( exc4kWhtnd, L_FRAME16k / 4, bwe_seed );
    1739           0 :         IF( LT_16( Q_bwe_exc, 5 ) )
    1740             :         {
    1741           0 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1742             :             {
    1743           0 :                 exc4kWhtnd[i] = shl_r( exc4kWhtnd[i], sub( Q_bwe_exc, 5 ) ); /*Q(Q_bwe_exc)/Q5(if Q_bwe_exc > 5) */
    1744           0 :                 move16();
    1745             :             }
    1746             :         }
    1747             :     }
    1748             :     ELSE
    1749             :     {
    1750           0 :         autocorr_fx( exc4k, LPC_WHTN_ORDER_WB + 1, R_h, R_l, &Q_R,
    1751             :                      L_FRAME16k / 4, win_flatten_4k_fx, 0, 1 );
    1752             : 
    1753             :         /* Ensure R[0] isn't zero when entering Levinson Durbin */
    1754           0 :         R_l[0] = s_max( R_l[0], 1 );
    1755           0 :         move16();
    1756           0 :         FOR( i = 1; i <= LPC_WHTN_ORDER_WB; i++ )
    1757             :         {
    1758           0 :             L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
    1759           0 :             L_Extract( L_tmp, &R_h[i], &R_l[i] );
    1760             :         }
    1761             : 
    1762           0 :         E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER_WB, NULL );
    1763             : 
    1764           0 :         Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER_WB + 1, sub( norm_s( lpc_whtn[0] ), 2 ) );
    1765             : 
    1766           0 :         fir_fx( exc4k, lpc_whtn, exc4kWhtnd, wht_fil_mem, L_FRAME16k / 4,
    1767             :                 LPC_WHTN_ORDER_WB, 0, 3 );
    1768             : 
    1769             :         /* Ensure pow1 is greater than zero when computing normalization */
    1770           0 :         max_val = 0;
    1771           0 :         move16();
    1772           0 :         FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1773             :         {
    1774           0 :             excTmp2[i] = abs_s( exc4kWhtnd[i] );
    1775           0 :             move16(); /* Q_bwe_exc */
    1776           0 :             max_val = s_max( max_val, excTmp2[i] );
    1777           0 :             move16();
    1778             :         }
    1779             : 
    1780           0 :         IF( max_val == 0 )
    1781             :         {
    1782           0 :             pow1 = 1;
    1783           0 :             move16();
    1784           0 :             n1 = 0;
    1785           0 :             move16();
    1786             :         }
    1787             :         ELSE
    1788             :         {
    1789           0 :             n1 = norm_s( max_val );
    1790           0 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1791             :             {
    1792           0 :                 excTmp2_frac[i] = shl_o( excTmp2[i], n1, &Overflow );
    1793           0 :                 move16(); /* Q14 */
    1794             :             }
    1795           0 :             n1 = sub( sub( 14, n1 ), Q_bwe_exc );
    1796           0 :             pow1 = 1;
    1797           0 :             move32();
    1798           0 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1799             :             {
    1800           0 :                 L_tmp = L_mult_o( excTmp2_frac[i], excTmp2_frac[i], &Overflow ); /* Q29 */
    1801           0 :                 pow1 = L_add_o( pow1, L_shr( L_tmp, 7 ), &Overflow );            /* Q22 */
    1802             :             }
    1803             :         }
    1804             : 
    1805           0 :         FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1806             :         {
    1807           0 :             excNoisyEnv[i] = L_add_o( *mem_csfilt, L_mult_o( csfilt_num2[0], excTmp2[i], &Overflow ), &Overflow );
    1808           0 :             move32(); /* Q_bwe_exc+16  */
    1809           0 :             *mem_csfilt = Mpy_32_16_1( excNoisyEnv[i], neg_csfilt_den2[1] );
    1810           0 :             move32(); /* Q_bwe_exc+16 */
    1811             :         }
    1812             : 
    1813           0 :         create_random_vector_fx( exc4k, L_FRAME16k / 4, bwe_seed );
    1814             : 
    1815             :         /* Ensure pow22 is greater than zero when computing normalization */
    1816           0 :         Lmax = 0;
    1817           0 :         move32();
    1818           0 :         FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1819             :         {
    1820           0 :             exc4k_32[i] = Mpy_32_16_1( excNoisyEnv[i], exc4k[i] );
    1821           0 :             move32(); /* Q_bwe_exc+6 */
    1822           0 :             Lmax = L_max( Lmax, L_abs( exc4k_32[i] ) );
    1823             :         }
    1824             : 
    1825           0 :         IF( Lmax == 0 )
    1826             :         {
    1827           0 :             pow22 = 1;
    1828           0 :             move16();
    1829           0 :             n2 = 0;
    1830           0 :             move16();
    1831           0 :             set16_fx( exc4k_frac, 0, L_FRAME16k / 4 );
    1832             :         }
    1833             :         ELSE
    1834             :         {
    1835           0 :             n2 = norm_l( Lmax );
    1836           0 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1837             :             {
    1838           0 :                 exc4k_frac[i] = extract_h( L_shl_o( exc4k_32[i], n2, &Overflow ) ); /* Q(14-n2) */
    1839           0 :                 move16();
    1840             :             }
    1841           0 :             n2 = sub( sub( 30, n2 ), add( Q_bwe_exc, 6 ) );
    1842           0 :             pow22 = 1;
    1843           0 :             move32();
    1844           0 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1845             :             {
    1846           0 :                 L_tmp = L_mult_o( exc4k_frac[i], exc4k_frac[i], &Overflow ); /* Q29 */
    1847           0 :                 pow22 = L_add_o( pow22, L_shr( L_tmp, 7 ), &Overflow );      /* Q22     */
    1848             :             }
    1849             :         }
    1850             : 
    1851           0 :         test();
    1852           0 :         test();
    1853           0 :         IF( EQ_16( coder_type, UNVOICED ) || ( igf_flag != 0 && LT_16( avg_voice_fac, 6654 /*0.2 in Q15 */ ) ) )
    1854             :         {
    1855           0 :             L_tmp = root_a_over_b_fx( pow1, sub( 22, shl( n1, 1 ) ), pow22, sub( 22, shl( n2, 1 ) ), &exp );
    1856           0 :             scale = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /*Q15 */
    1857           0 :             sc = sub( add( n2, Q_bwe_exc ), 14 );
    1858           0 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1859             :             {
    1860           0 :                 exc4kWhtnd[i] = round_fx_o( L_shl_o( L_mult_o( exc4k_frac[i], scale, &Overflow ), sc, &Overflow ), &Overflow ); /*  Q_bwe_exc+n2-10+16+ Q_bwe_exc + n2 -14 -16 = //Q_bwe_exc */
    1861           0 :                 move16();
    1862             :             }
    1863             :         }
    1864             :         ELSE
    1865             :         {
    1866           0 :             sc = sub( add( n2, Q_bwe_exc ), 14 ); /* Q_bwe_exc+n2-14*/
    1867             : 
    1868           0 :             k = 0;
    1869           0 :             move16();
    1870           0 :             FOR( i = 0; i < 4; i++ )
    1871             :             {
    1872           0 :                 test();
    1873           0 :                 IF( igf_flag != 0 && EQ_16( coder_type, VOICED ) )
    1874             :                 {
    1875             :                     /*tmp_vfac = 2*voice_factors[i];
    1876             :                       tmp_vfac = min(1, tmp_vfac);*/
    1877           0 :                     tmp_vfac = shl_o( voice_factors[i], 1, &Overflow );
    1878             :                 }
    1879             :                 ELSE
    1880             :                 {
    1881           0 :                     tmp_vfac = voice_factors[i];
    1882           0 :                     move16();
    1883             :                 }
    1884             : 
    1885           0 :                 Ltemp1 = root_a_fx( L_deposit_h( tmp_vfac ), 31, &exp );
    1886           0 :                 temp1 = round_fx_o( L_shl_o( Ltemp1, exp, &Overflow ), &Overflow ); /* Q15 */
    1887           0 :                 L_tmp = Mpy_32_16_1( pow1, sub( 32767, tmp_vfac ) );                /* Q22*/
    1888           0 :                 Ltemp2 = root_a_over_b_fx( L_tmp, sub( 22, shl( n1, 1 ) ), pow22, sub( 22, shl( n2, 1 ) ), &exp );
    1889           0 :                 temp2 = round_fx_o( L_shl_o( Ltemp2, exp, &Overflow ), &Overflow ); /* Q15 */
    1890           0 :                 FOR( j = 0; j < L_FRAME16k / 16; j++ )
    1891             :                 {
    1892           0 :                     L_tmp = L_mult_o( temp1, exc4kWhtnd[k], &Overflow );                                                        /* Q(16+Q_bwe_exc) */
    1893           0 :                     L_tmp = L_add_o( L_tmp, L_shl_o( L_mult_o( temp2, exc4k_frac[k], &Overflow ), sc, &Overflow ), &Overflow ); /* Q(16+Q_bwe_exc) */
    1894           0 :                     exc4kWhtnd[k] = round_fx_o( L_tmp, &Overflow );                                                             /* Q_bwe_exc */
    1895           0 :                     move16();
    1896           0 :                     k = add( k, 1 );
    1897             :                 }
    1898             :             }
    1899             :         }
    1900             :     }
    1901             : 
    1902           0 :     Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 );
    1903             : 
    1904             : 
    1905           0 :     return;
    1906             : }
    1907             : 
    1908             : /*-------------------------------------------------------------------*
    1909             :  * GenWBSynth()
    1910             :  *
    1911             :  * Generate 16 KHz sampled highband component from synthesized highband
    1912             :  *-------------------------------------------------------------------*/
    1913             : 
    1914        6870 : void GenWBSynth_fx(
    1915             :     const Word16 *input_synspeech, /* i : input synthesized speech Qx*/
    1916             :     Word16 *shb_syn_speech_16k,    /* o : output highband compnent Qx*/
    1917             :     Word16 *state_lsyn_filt_shb1,  /* i/o: memory Qx*/
    1918             :     Word16 *state_lsyn_filt_shb2   /* i/o: memory Qx*/
    1919             : )
    1920             : {
    1921             :     Word16 speech_buf_16k1[L_FRAME16k], speech_buf_16k2[L_FRAME16k];
    1922             :     Word16 i, maxm, nor;
    1923             :     Word16 input_synspeech_temp[L_FRAME16k / 4];
    1924             : 
    1925        6870 :     maxm = 0;
    1926        6870 :     move16();
    1927      556470 :     FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1928             :     {
    1929      549600 :         maxm = s_max( maxm, abs_s( input_synspeech[i] ) );
    1930             :     }
    1931       48090 :     FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
    1932             :     {
    1933       41220 :         maxm = s_max( maxm, abs_s( state_lsyn_filt_shb1[i] ) );
    1934             :     }
    1935       48090 :     FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
    1936             :     {
    1937       41220 :         maxm = s_max( maxm, abs_s( state_lsyn_filt_shb2[i] ) );
    1938             :     }
    1939             : 
    1940        6870 :     nor = s_max( sub( norm_s( maxm ), 3 ), 0 ); /* Headroom = 3 */
    1941        6870 :     IF( maxm == 0 )
    1942         158 :     nor = 15;
    1943        6870 :     move16();
    1944             : 
    1945        6870 :     Copy_Scale_sig( input_synspeech, input_synspeech_temp, L_FRAME16k / 4, nor );
    1946        6870 :     Scale_sig( state_lsyn_filt_shb1, 2 * ALLPASSSECTIONS_STEEP, nor );
    1947        6870 :     Scale_sig( state_lsyn_filt_shb2, 2 * ALLPASSSECTIONS_STEEP, nor );
    1948        6870 :     Interpolate_allpass_steep_fx( input_synspeech_temp, state_lsyn_filt_shb1, L_FRAME16k / 4, speech_buf_16k1 );
    1949        6870 :     Interpolate_allpass_steep_fx( speech_buf_16k1, state_lsyn_filt_shb2, L_FRAME16k / 2, speech_buf_16k2 );
    1950        6870 :     flip_spectrum_fx( speech_buf_16k2, shb_syn_speech_16k, L_FRAME16k );
    1951             : 
    1952        6870 :     Scale_sig( shb_syn_speech_16k, L_FRAME16k, negate( nor ) );
    1953        6870 :     Scale_sig( state_lsyn_filt_shb1, 2 * ALLPASSSECTIONS_STEEP, negate( nor ) );
    1954        6870 :     Scale_sig( state_lsyn_filt_shb2, 2 * ALLPASSSECTIONS_STEEP, negate( nor ) );
    1955             : 
    1956        6870 :     return;
    1957             : }
    1958             : 
    1959             : 
    1960       12849 : void find_td_envelope_fx(
    1961             :     const Word16 inp[], /* i  : input signal                            Qx */
    1962             :     const Word16 len,   /* i  : length of the input signal                 */
    1963             :     const Word16 len_h, /* i  : length of the MA filter                    */
    1964             :     Word16 mem_h[],     /* i/o: memory of the MA filter, length len_h/2 Qx */
    1965             :     Word16 out[]        /* o  : td envelope of the input signal         Qx */
    1966             : )
    1967             : {
    1968             :     Word16 k, K;
    1969             :     Word16 buf_in[L_FRAME16k + MAX_LEN_MA_FILTER], *p_in, *p_out, *p_prev, w;
    1970             :     Word16 tmp1, tmp2;
    1971             : 
    1972       12849 :     assert( len > 0 && len <= L_FRAME16k );
    1973             : 
    1974             :     // len_h is 20 at all calling locations
    1975       12849 :     K = 10; /* length of FIR filter memory = half of the total filter length */
    1976       12849 :     move16();
    1977       12849 :     w = 1639; /* 1 / 20 in Q15 */ /* MA filtering coefficient */
    1978       12849 :     move16();
    1979             : 
    1980             :     /* copy filter memory to the input buffer */
    1981       12849 :     IF( mem_h != NULL )
    1982             :     {
    1983        4283 :         Copy( mem_h, buf_in, K );
    1984             :     }
    1985             :     ELSE
    1986             :     {
    1987             :         /* no memory available, use the first len_h/2 samples as memory */
    1988        8566 :         p_in = buf_in;
    1989       94226 :         FOR( k = 0; k < K; k++ )
    1990             :         {
    1991       85660 :             *p_in++ = mult_r( abs_s( inp[k] ), w ); /* Qx */
    1992       85660 :             move16();
    1993             :         }
    1994             :     }
    1995             : 
    1996             :     /* take the absolute value of the input signal and copy it to the input buffer */
    1997             :     /* multiply each value by 1 / filter length */
    1998       12849 :     p_in = &buf_in[K];
    1999     4124529 :     FOR( k = 0; k < len; k++ )
    2000             :     {
    2001     4111680 :         *p_in++ = mult_r( abs_s( inp[k] ), w ); /* Qx */
    2002     4111680 :         move16();
    2003             :     }
    2004             : 
    2005             :     /* update filter memory from the end of the input buffer */
    2006       12849 :     IF( mem_h != NULL )
    2007             :     {
    2008        4283 :         Copy( &buf_in[len], mem_h, K );
    2009             :     }
    2010             : 
    2011             :     /* do MA filtering */
    2012       12849 :     out[0] = sum16_fx( buf_in, len_h );
    2013       12849 :     move16();
    2014       12849 :     p_out = &buf_in[0];    /* pointer to leaving sample */
    2015       12849 :     p_in = &buf_in[len_h]; /* pointer to entering sample*/
    2016     3983190 :     FOR( k = 1; k < len - K; k++ )
    2017             :     {
    2018     3970341 :         tmp1 = *p_out++;
    2019     3970341 :         move16();
    2020     3970341 :         tmp2 = *p_in++;
    2021     3970341 :         move16();
    2022     3970341 :         out[k] = add( sub( out[k - 1], tmp1 ), tmp2 ); /* Qx */
    2023     3970341 :         move16();
    2024             :     }
    2025             : 
    2026             :     /* use IIR filtering to extrapolate the last K samples */
    2027       12849 :     p_in = &buf_in[len - K];
    2028       12849 :     p_out = &out[len - K];
    2029       12849 :     p_prev = p_out - 1;
    2030      141339 :     FOR( k = 0; k < K; k++ )
    2031             :     {
    2032      128490 :         tmp1 = *p_in++;
    2033      128490 :         move16();
    2034      128490 :         tmp2 = *p_prev++;
    2035      128490 :         move16();
    2036      128490 :         *p_out++ = add( mult_r( 1638 /* 0.05f in Q15 */, ( tmp1 ) ), mult_r( 31130 /* 0.95f in Q15 */, ( tmp2 ) ) );
    2037      128490 :         move16();
    2038             :     }
    2039             : 
    2040       12849 :     return;
    2041             : }
    2042             : 
    2043             : 
    2044             : /*======================================================================================*/
    2045             : /* FUNCTION : void GenShapedSHBExcitation_fx () */
    2046             : /*--------------------------------------------------------------------------------------*/
    2047             : /* PURPOSE : Synthesize spectrally shaped highband excitation signal */
    2048             : /*--------------------------------------------------------------------------------------*/
    2049             : /* INPUT ARGUMENTS : */
    2050             : /* _(Word16) coder_type : coding type Q_bwe_exc */
    2051             : /* _(Word16) bwidth : input signal bwidth Q0 */
    2052             : /* _(Word16*) bwe_exc_extended :bwidth extended exciatation Q_bwe_exc */
    2053             : /* _(Word16[]) voice_factors :voicing factors Q15 */
    2054             : /* _(Word16*) lpc_shb :lpc coefficients Q12 */
    2055             : /* _(Word16*) Q_bwe_exc :Q Format of bwe_exc_extended */
    2056             : /* _(Word16) L_frame : Frame length - determines whether 12.8 or 16kHz core */
    2057             : /* _(Word16) last_L_frame : last L_frame */
    2058             : /*--------------------------------------------------------------------------------------*/
    2059             : /* OUTPUT ARGUMENTS : */
    2060             : /* _(Word16*)excSHB :synthesized shaped shb excitation Q_bwe_exc */
    2061             : /* _(Word16*)White_exc16k :white excitation for the Fullband extension Q_bwe_exc */
    2062             : /* _(Word16*)slope :slope +ve (high freq > low freq), -ve or neutral Q12 */
    2063             : /*--------------------------------------------------------------------------------------*/
    2064             : /* INPUT/OUTPUT ARGUMENTS : */
    2065             : /* _(Word16*)mem_csfilt :memory */
    2066             : /* _(Word16*)mem_genSHBexc_filt_down_shb :memory */
    2067             : /* _(Word16*)state_lpc_syn :memory */
    2068             : /* _(Word16[]) bwe_seed :random number generator seed */
    2069             : /* _(Word16[]) lpf_14k_mem :memory */
    2070             : /* _(Word32[])Hilbert_Mem :memory */
    2071             : /*--------------------------------------------------------------------------------------*/
    2072             : /* RETURN ARGUMENTS : */
    2073             : /* _ None */
    2074             : /*--------------------------------------------------------------------------------------*/
    2075             : /* CALLED FROM : RX */
    2076             : /*======================================================================================*/
    2077        2708 : void GenShapedSHBExcitation_fx(
    2078             :     Word16 *excSHB,                      /* o : synthesized shaped shb excitation Q_bwe_exc*/
    2079             :     const Word16 *lpc_shb,               /* i : lpc coefficients Q12*/
    2080             :     Word16 *White_exc16k_FB,             /* o : white excitation for the Fullband extension Q_bwe_exc */
    2081             :     Word32 *mem_csfilt,                  /* i/o: memory */
    2082             :     Word16 *mem_genSHBexc_filt_down_shb, /* i/o: memory */
    2083             :     Word16 *state_lpc_syn,               /* i/o: memory */
    2084             :     const Word16 coder_type,             /* i : coding type */
    2085             :     const Word16 *bwe_exc_extended,      /* i : bwidth extended excitation */
    2086             :     Word16 bwe_seed[],                   /* i/o: random number generator seed */
    2087             :     Word16 voice_factors[],              /* i : voicing factor*/
    2088             :     const Word16 extl,                   /* i : extension layer */
    2089             :     Word16 *tbe_demph,                   /* i/o: de-emphasis memory */
    2090             :     Word16 *tbe_premph,                  /* i/o: pre-emphasis memory */
    2091             :     Word16 *lpc_shb_sf,                  /* i:   LP coefficients  */
    2092             :     const Word32 shb_ener_sf_32,         /* i: input shb ener, Q31 */
    2093             :     Word16 *shb_res_gshape,              /* i: input res gain shape, Q14 */
    2094             :     Word16 *shb_res,
    2095             :     Word16 *vf_ind,
    2096             :     const Word16 formant_fac,  /* i   : Formant sharpening factor [0..1] */
    2097             :     Word16 fb_state_lpc_syn[], /* i/o: memory */
    2098             :     Word16 *fb_tbe_demph,      /* i/o: fb de-emphasis memory */
    2099             :     Word16 *Q_bwe_exc,
    2100             :     Word16 *Q_bwe_exc_fb,
    2101             :     const Word16 Q_shb,
    2102             :     Word16 n_mem2,         /* i :  n_mem2 scale factor to adjust 24.4/32kbps memories */
    2103             :     Word16 prev_Q_bwe_syn, /* i :  st_fx->prev_Q_bwe_syn */
    2104             :     const Word32 bitrate,
    2105             :     const Word16 prev_bfi )
    2106             : {
    2107             :     Word16 i, j, k;
    2108             :     Word16 wht_fil_mem[LPC_WHTN_ORDER];
    2109             :     Word16 lpc_whtn[LPC_WHTN_ORDER + 1];
    2110             :     Word16 R_h[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech MSB */
    2111             :     Word16 R_l[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech LSB */
    2112             :     Word16 Q_R;
    2113             :     Word32 LepsP[LPC_WHTN_ORDER + 1];
    2114             :     Word16 exc32k[L_FRAME32k], exc16k[L_FRAME16k];
    2115             :     Word32 pow1, pow22;
    2116             :     Word16 scale, temp1, temp2;
    2117             : 
    2118             :     Word16 excTmp2[L_FRAME16k];
    2119             :     Word16 *White_exc16k;
    2120             :     Word16 excNoisyEnv[L_FRAME16k];
    2121        2708 :     Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */
    2122        2708 :     move16();
    2123        2708 :     Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */
    2124        2708 :     move16();
    2125        2708 :     move16();
    2126             :     Word16 varEnvShape;
    2127        2708 :     Word16 fb_deemph_fac = 15729; /*0.48f in Q15  */
    2128        2708 :     move16();
    2129             :     Word16 exc16kWhtnd[L_FRAME16k];
    2130             : 
    2131             :     Word32 L_tmp;
    2132             :     Word16 vf_tmp;
    2133             :     Word16 tmp, exp, tmp2;
    2134             :     Word16 voiceFacEst[NB_SUBFR16k];
    2135             :     Word16 zero_mem[LPC_SHB_ORDER];
    2136             :     Word32 syn_shb_ener_sf[4];
    2137             :     Word16 tempSHB[80];
    2138             :     Word16 Q_pow1, Q_pow22;
    2139             : 
    2140             :     Word32 L_tmp2, L_tmp3, L_tmp4;
    2141             :     Word16 temp;
    2142             : 
    2143             :     Word16 White_exc16k_FB_temp[L_FRAME16k];
    2144             :     Word32 White_exc16k_32[L_FRAME16k];
    2145             :     Word16 Q_temp;
    2146             :     Word16 prev_Q_bwe_exc_fb;
    2147             : 
    2148        2708 :     set16_fx( zero_mem, 0, LPC_SHB_ORDER );
    2149        2708 :     set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER );
    2150             : 
    2151      869268 :     FOR( i = 0; i < L_FRAME32k; i = i + 2 )
    2152             :     {
    2153      866560 :         exc32k[i] = negate( bwe_exc_extended[i] );
    2154      866560 :         move16();
    2155      866560 :         exc32k[i + 1] = bwe_exc_extended[i + 1];
    2156      866560 :         move16();
    2157             :     }
    2158             : 
    2159             :     /* Decimate by 2 */
    2160        2708 :     Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k );
    2161             :     /* i: exc32k in Q_bwe_exc */
    2162             :     /* o: exc16k in Q_bwe_exc */
    2163             : 
    2164        2708 :     autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 );
    2165             :     /* Ensure R[0] isn't zero when entering Levinson Durbin */
    2166        2708 :     R_l[0] = s_max( R_l[0], 1 );
    2167        2708 :     move16();
    2168       13540 :     FOR( i = 1; i <= LPC_WHTN_ORDER; i++ )
    2169             :     {
    2170       10832 :         L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
    2171       10832 :         L_Extract( L_tmp, &R_h[i], &R_l[i] );
    2172             :     }
    2173        2708 :     E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL );
    2174        2708 :     Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) );
    2175        2708 :     fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 );
    2176             : 
    2177             :     /* i: exc16k in Q_bwe_exc */
    2178             :     /* o: exc16kWhtnd in Q_bwe_exc */
    2179        2708 :     IF( GE_32( bitrate, ACELP_24k40 ) )
    2180             :     {
    2181        1214 :         temp2 = 0;
    2182        1214 :         move16();
    2183        6070 :         FOR( j = 0; j < 4; j++ )
    2184             :         {
    2185        4856 :             temp1 = shb_res_gshape[j];
    2186        4856 :             move16();
    2187      393336 :             FOR( i = 0; i < 80; i++ )
    2188             :             {
    2189      388480 :                 exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) );
    2190      388480 :                 move16();
    2191             :                 /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */
    2192             :             }
    2193        4856 :             temp2 = add( temp2, 80 );
    2194             :         }
    2195             :     }
    2196             : 
    2197             :     /* Estimate pow1 associated with Low band nonlinear extended excitation */
    2198             :     /* pow1=0.00001f */
    2199        2708 :     tmp = sub( shl( *Q_bwe_exc, 1 ), 31 );
    2200        2708 :     pow1 = L_shl_sat( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */
    2201      869268 :     FOR( k = 0; k < L_FRAME16k; k++ )
    2202             :     {
    2203             :         /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/
    2204      866560 :         excTmp2[k] = abs_s( exc16kWhtnd[k] );
    2205      866560 :         move16();
    2206             : 
    2207             :         /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */
    2208      866560 :         pow1 = L_mac0_sat( pow1, exc16kWhtnd[k], exc16kWhtnd[k] ); /* 2*Q_bwe_exc */
    2209             :     }
    2210        2708 :     Q_pow1 = shl( *Q_bwe_exc, 1 );
    2211             : 
    2212        2708 :     test();
    2213        2708 :     IF( ( LE_32( bitrate, ACELP_13k20 ) ) && ( GE_32( bitrate, ACELP_7k20 ) ) )
    2214             :     {
    2215             :         /* varEnvShape = mean_fx(voice_factors, 4); */
    2216             :         /* unroll the loop */
    2217        1494 :         L_tmp = L_mult( voice_factors[0], 8192 );
    2218        1494 :         L_tmp = L_mac( L_tmp, voice_factors[1], 8192 );
    2219        1494 :         L_tmp = L_mac( L_tmp, voice_factors[2], 8192 );
    2220        1494 :         varEnvShape = mac_r( L_tmp, voice_factors[3], 8192 ); /* varEnvShape in Q15 */
    2221             :     }
    2222             :     ELSE /* 16k core */
    2223             :     {
    2224             :         /* varEnvShape = mean_fx(voice_factors, 5); */
    2225             :         /* unroll the loop */
    2226        1214 :         L_tmp = L_mult( voice_factors[0], 6554 );
    2227        1214 :         L_tmp = L_mac( L_tmp, voice_factors[1], 6554 );
    2228        1214 :         L_tmp = L_mac( L_tmp, voice_factors[2], 6554 );
    2229        1214 :         L_tmp = L_mac( L_tmp, voice_factors[3], 6554 );
    2230        1214 :         varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 ); /* varEnvShape in Q15 */
    2231             :     }
    2232             : 
    2233        2708 :     IF( EQ_16( extl, FB_TBE ) )
    2234             :     {
    2235             :         /*pow(varEnvShape,3) */
    2236           0 :         tmp = mult_r( varEnvShape, varEnvShape );
    2237           0 :         tmp = mult_r( tmp, varEnvShape );
    2238             : 
    2239             :         /* max_val((0.68f - (float)pow(varEnvShape, 3)), 0.48f); */
    2240           0 :         fb_deemph_fac = sub( 22282 /*0.68f Q15*/, tmp );
    2241           0 :         fb_deemph_fac = s_max( fb_deemph_fac, 15729 /*0.48f Q15*/ );
    2242             :     }
    2243             : 
    2244             :     /*varEnvShape = 1.09875f - 0.49875f * varEnvShape; */
    2245        2708 :     varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape );
    2246             : 
    2247             :     /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */
    2248        2708 :     varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ );
    2249        2708 :     varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ );
    2250        2708 :     varEnvShape = shl( varEnvShape, 1 );
    2251        2708 :     csfilt_num2[0] = sub( MAX_16, varEnvShape );
    2252        2708 :     move16();
    2253        2708 :     neg_csfilt_den2[1] = varEnvShape;
    2254        2708 :     move16();
    2255             : 
    2256        2708 :     test();
    2257        2708 :     test();
    2258        2708 :     test();
    2259        2708 :     IF( *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) )
    2260             :     {
    2261             :         /* pre-init smoothing filter to avoid energy drop outs */
    2262          60 :         L_tmp = L_mult( excTmp2[0], 1638 );
    2263        1200 :         FOR( i = 1; i < L_SUBFR16k / 4; i++ )
    2264             :         {
    2265        1140 :             L_tmp = L_mac( L_tmp, excTmp2[i], 1638 ); /*1638 = 1/20 in Q15*/
    2266             :         }
    2267             :         /*L_tmp = sum(excTmp2, L_SUBFR16k/4)*(1/20) where L_SUBFR16k/4 =20 */
    2268             : 
    2269             :         /* don't apply for FB in case the FB start-frame was potentially lost - White_exc16k is very sensitive to enery mismatch between enc - dec */
    2270             :         /* rather stick to the more conservative approach, to avoid potential clippings */
    2271          60 :         test();
    2272          60 :         IF( !( prev_bfi && EQ_16( extl, FB_TBE ) ) )
    2273             :         {
    2274             :             /* use weak smoothing for 1st frame after switching to make filter recover more quickly */
    2275          60 :             varEnvShape = 26214 /*0.8f Q15*/;
    2276          60 :             move16();
    2277          60 :             csfilt_num2[0] = sub( MAX_16, varEnvShape );
    2278          60 :             move16();
    2279          60 :             neg_csfilt_den2[1] = varEnvShape;
    2280          60 :             move16();
    2281             :         }
    2282             : 
    2283          60 :         *mem_csfilt = Mult_32_16( L_tmp, varEnvShape );
    2284          60 :         move32();
    2285             :     }
    2286             :     {
    2287             :         /* Track the low band envelope */
    2288        2708 :         L_tmp = *mem_csfilt;
    2289        2708 :         move32();
    2290      869268 :         FOR( i = 0; i < L_FRAME16k; i++ )
    2291             :         {
    2292      866560 :             excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], excTmp2[i] );
    2293      866560 :             move16();
    2294             :             /* excNoisyEnv : Q_bwe_exc,
    2295             :              *mem_csfilt: Q_bwe_exc+16, excTmp2: Q_bwe_exc, csfilt_num2[0] Q15  */
    2296      866560 :             L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_bwe_exc+16 */
    2297             :         }
    2298        2708 :         *mem_csfilt = L_tmp;
    2299        2708 :         move32();
    2300             :     }
    2301             :     {
    2302             :         /* create a random excitation - Reuse exc16k memory */
    2303        2708 :         White_exc16k = exc16k;
    2304        2708 :         create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed );
    2305        2708 :         create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed );
    2306             : 
    2307        2708 :         L_tmp = L_deposit_l( 0 );
    2308        2708 :         tmp = add( *Q_bwe_exc, 1 );
    2309      869268 :         FOR( k = 0; k < L_FRAME16k; k++ )
    2310             :         {
    2311      866560 :             L_tmp4 = L_shl_sat( L_deposit_l( White_exc16k[k] ), tmp );
    2312      866560 :             if ( excNoisyEnv[k] != 0 )
    2313             :             {
    2314      864891 :                 L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_bwe_exc)  +5 +1*/
    2315             :             }
    2316      866560 :             White_exc16k_32[k] = L_tmp4;
    2317      866560 :             move32();
    2318      866560 :             L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
    2319             :         }
    2320        2708 :         Q_temp = norm_l( L_tmp );
    2321        2708 :         if ( L_tmp == 0 )
    2322             :         {
    2323           0 :             Q_temp = 31;
    2324           0 :             move16();
    2325             :         }
    2326             :         /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/
    2327             :         /* White_exc16k in Q6 */
    2328             : 
    2329             :         /* calculate pow22 */
    2330             :         /* pow22=0.00001f */
    2331        2708 :         tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 );
    2332        2708 :         pow22 = L_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc-NOISE_QADJ) */
    2333        2708 :         tmp = sub( NOISE_QFAC, 5 );
    2334      869268 :         FOR( k = 0; k < L_FRAME16k; k++ )
    2335             :         {
    2336             :             /* White_exc16k[k] *= excNoisyEnv[k]; */
    2337      866560 :             White_exc16k[k] = mult_r( excNoisyEnv[k], shl( White_exc16k[k], tmp ) );
    2338      866560 :             move16();
    2339             :             /* i: excNoisyEnv in (Q_bwe_exc)     */
    2340             :             /* i: White_exc16k  in Q6               */
    2341             :             /* o: White_exc16k in (Q_bwe_exc-NOISE_QADJ)  */
    2342             :             /* pow22 += White_exc16k[k] * White_exc16k[k]; */
    2343      866560 :             pow22 = L_mac0_sat( pow22, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_bwe_exc-NOISE_QADJ)*/
    2344             :         }
    2345             :         /*Q_pow22 = sub( shl(*Q_bwe_exc,1), 18 );*/
    2346        2708 :         Q_pow22 = shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 );
    2347             :     }
    2348             : 
    2349        2708 :     IF( GE_32( bitrate, ACELP_24k40 ) )
    2350             :     {
    2351        1214 :         IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */
    2352             :         {
    2353             :             {
    2354         604 :                 Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k,
    2355         604 :                                          ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind );
    2356         604 :                 tmp = voiceFacEst[0];
    2357         604 :                 move16();
    2358         604 :                 tmp2 = MAX_16;
    2359         604 :                 move16();
    2360         604 :                 if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
    2361             :                 {
    2362         580 :                     tmp2 = 26214 /*0.8f Q15*/;
    2363         580 :                     move16();
    2364             :                 }
    2365             :             }
    2366             :         }
    2367             :         ELSE /* decoder side */
    2368             :             {
    2369             :                 { /* *vf_ind is an integer scale by 0.125f*/
    2370         610 :                   tmp = shl( *vf_ind, ( 15 - 3 ) );
    2371         610 :         tmp2 = MAX_16;
    2372         610 :         move16();
    2373         610 :         if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
    2374             :         {
    2375         607 :             tmp2 = 26214 /*0.8f Q15*/;
    2376         607 :             move16();
    2377             :         }
    2378             :     }
    2379             : }
    2380             : {
    2381        1214 :     voice_factors[0] = mult_r( voice_factors[0], tmp2 );
    2382        1214 :     move16();
    2383        1214 :     voice_factors[1] = mult_r( voice_factors[1], tmp2 );
    2384        1214 :     move16();
    2385        1214 :     voice_factors[2] = mult_r( voice_factors[2], tmp2 );
    2386        1214 :     move16();
    2387        1214 :     voice_factors[3] = mult_r( voice_factors[3], tmp2 );
    2388        1214 :     move16();
    2389        1214 :     voice_factors[4] = mult_r( voice_factors[4], tmp2 );
    2390        1214 :     move16();
    2391             : }
    2392             : }
    2393             : 
    2394        2708 : tmp = sub( Q_temp, 3 );
    2395      869268 : FOR( k = 0; k < L_FRAME16k; k++ )
    2396             : {
    2397      866560 :     White_exc16k_FB[k] = round_fx( L_shl( White_exc16k_32[k], tmp ) ); /* Q_bwe_exc +5 +1 +Q_temp -16 -3 */
    2398             : }
    2399        2708 : prev_Q_bwe_exc_fb = *Q_bwe_exc_fb;
    2400        2708 : move16();
    2401        2708 : *Q_bwe_exc_fb = sub( add( *Q_bwe_exc, Q_temp ), 13 );
    2402        2708 : move16();
    2403        2708 : deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph );
    2404             : /* i/o: White_exc16k (Q_bwe_exc-NOISE_QADJ) */
    2405             : /* i: tbe_demph (Q_bwe_exc-NOISE_QADJ) */
    2406             : {
    2407        2708 :     IF( EQ_16( coder_type, UNVOICED ) )
    2408             :     {
    2409          57 :         L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
    2410          57 :         scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */
    2411       18297 :         FOR( k = 0; k < L_FRAME16k; k++ )
    2412             :         {
    2413             :             /* White_exc16k: (Q_bwe_exc-NOISE_QADJ), scale: Q15 */
    2414       18240 :             L_tmp = L_mult( White_exc16k[k], scale );
    2415             :             /* L_tmp: (Q_bwe_exc-NOISE_QADJ) + 15 + 1 */
    2416       18240 :             exc16kWhtnd[k] = round_fx( L_shl( L_tmp, NOISE_QADJ ) );
    2417       18240 :             move16();
    2418             :             /* exc16kWhtnd:  Q_bwe_exc */
    2419             :         }
    2420          57 :         PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph );
    2421             :         /* i/o: exc16kWhtnd  (Q_bwe_exc) */
    2422             :         /* i/o: tbe_premph (Q_bwe_exc) */
    2423             :     }
    2424             :     ELSE
    2425             :     {
    2426             :         Word16 nbSubFr, lSubFr;
    2427             :         Word16 tempQ15;
    2428             :         Word32 tempQ31;
    2429             :         /*nbSubFr = ( bitrate < ACELP_24k40 )? NB_SUBFR : NB_SUBFR16k;*/
    2430        2651 :         nbSubFr = NB_SUBFR16k;
    2431        2651 :         lSubFr = ( L_FRAME16k / NB_SUBFR16k );
    2432        2651 :         IF( LT_32( bitrate, ACELP_24k40 ) )
    2433             :         {
    2434        1494 :             nbSubFr = NB_SUBFR;
    2435        1494 :             move16();
    2436        1494 :             lSubFr = ( L_FRAME16k / NB_SUBFR );
    2437        1494 :             move16();
    2438             :         }
    2439        2651 :         k = 0;
    2440       14412 :         FOR( i = 0; i < nbSubFr; i++ )
    2441             :         {
    2442       11761 :             test();
    2443       11761 :             IF( EQ_16( coder_type, VOICED ) && ( LT_32( bitrate, ACELP_24k40 ) ) )
    2444             :             {
    2445        1716 :                 exp = 0;
    2446        1716 :                 move16();
    2447        1716 :                 tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */
    2448        1716 :                 temp = shl( tempQ15, exp );                 /* Q15 exc16kWhtnd scale factor */
    2449        1716 :                 exp = 0;
    2450        1716 :                 move16();
    2451        1716 :                 tempQ15 = Sqrt16( temp, &exp ); /* Q15 */
    2452        1716 :                 temp1 = shl( tempQ15, exp );    /* Q15 exc16kWhtnd scale factor */
    2453             : 
    2454             :                 /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */
    2455        1716 :                 temp = sub( MAX_16, temp );
    2456        1716 :                 tempQ31 = Mult_32_16( pow1, temp );
    2457        1716 :                 L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
    2458        1716 :                 temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
    2459             :             }
    2460             :             ELSE
    2461             :             {
    2462             :                 /* Adjust noise mixing for formant sharpening filter */
    2463       10045 :                 tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac );
    2464             :                 /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */
    2465       10045 :                 vf_tmp = sub( MAX_16, tempQ15 );
    2466       10045 :                 vf_tmp = mult_r( voice_factors[i], vf_tmp );
    2467             : 
    2468       10045 :                 exp = 0;
    2469       10045 :                 move16();
    2470       10045 :                 tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */
    2471       10045 :                 temp1 = shl( tempQ15, exp );      /* Q15 exc16kWhtnd scale factor */
    2472             : 
    2473             :                 /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */
    2474       10045 :                 temp = sub( MAX_16, vf_tmp );
    2475       10045 :                 tempQ31 = Mult_32_16( pow1, temp );
    2476       10045 :                 L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
    2477       10045 :                 temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
    2478             :             }
    2479             : 
    2480      860081 :             FOR( j = 0; j < lSubFr; j++ )
    2481             :             {
    2482             :                 /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */
    2483      848320 :                 L_tmp = L_mult( temp2, White_exc16k[k + j] ); /* 16+(Q_bwe_exc-NOISE_QADJ)*/
    2484      848320 :                 L_tmp = L_shl_sat( L_tmp, NOISE_QADJ );       /* 16+(Q_bwe_exc) */
    2485      848320 :                 exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] );
    2486      848320 :                 move16();
    2487             :                 /* Q_bwe_exc */
    2488             :             }
    2489       11761 :             k = add( k, lSubFr );
    2490             : 
    2491             :             /* estimate the pre-emph factor */
    2492       11761 :             tempQ15 = sub( MAX_16, voice_factors[i] );
    2493       11761 :             exp = 0;
    2494       11761 :             move16();
    2495       11761 :             temp = Sqrt16( tempQ15, &exp );
    2496       11761 :             temp = shl( temp, exp - 1 );
    2497             : 
    2498       11761 :             temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */
    2499       11761 :             temp = div_s( temp, temp2 );           /* Q15 */
    2500       11761 :             temp = mult_r( PREEMPH_FAC, temp );
    2501             : 
    2502       11761 :             PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph );
    2503             :             /* exc16kWhtnd: Q_bwe_exc;
    2504             :                tbe_premph: Q_bwe_exc*/
    2505             :         }
    2506             :     }
    2507             : }
    2508             : 
    2509        2708 : IF( LT_32( bitrate, ACELP_24k40 ) )
    2510             : {
    2511        1494 :     Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 );
    2512             :     /* i: exc16kWhtnd in Q_bwe_exc */
    2513             :     /* o: excSHB in Q_bwe_exc */
    2514             : }
    2515             : ELSE
    2516             : {
    2517        1214 :     set16_fx( zero_mem, 0, LPC_SHB_ORDER );
    2518             : 
    2519        1214 :     Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 );
    2520        1214 :     syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    2521        1214 :     move32();
    2522             : 
    2523        1214 :     Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 );
    2524        1214 :     syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    2525        1214 :     move32();
    2526             : 
    2527        1214 :     Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 );
    2528        1214 :     syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    2529        1214 :     move32();
    2530             : 
    2531        1214 :     Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 );
    2532        1214 :     syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    2533        1214 :     move32();
    2534             : 
    2535             :     /* i: exc16kWhtnd       in Q_bwe_exc        */
    2536             :     /* o: tempSHB           in Q_bwe_exc        */
    2537             :     /* o: syn_shb_ener_sf   in (2*Q_bwe_exc+1)  */
    2538        1214 :     IF( LE_32( bitrate, ACELP_32k ) )
    2539             :     {
    2540        1214 :         L_tmp = sum32_fx( syn_shb_ener_sf, 4 );
    2541             : 
    2542             :         /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */
    2543        1214 :         tmp = shl( Q_shb, 1 );
    2544        1214 :         tmp2 = add( shl( *Q_bwe_exc, 1 ), 1 );
    2545        1214 :         L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */
    2546             : 
    2547        1214 :         *Q_bwe_exc = sub( *Q_bwe_exc, exp );
    2548        1214 :         move16(); /* compensate for the exp shift */
    2549        1214 :         tmp2 = add( prev_Q_bwe_syn, n_mem2 );
    2550        1214 :         IF( GT_16( *Q_bwe_exc, tmp2 ) )
    2551             :         {
    2552           1 :             L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) );
    2553           1 :             *Q_bwe_exc = tmp2;
    2554           1 :             move16();
    2555             :         }
    2556      389694 :         FOR( i = 0; i < L_FRAME16k; i++ )
    2557             :         {
    2558      388480 :             L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */
    2559      388480 :             exc16kWhtnd[i] = round_fx( L_tmp3 );           /* *Q_bwe_exc - exp */
    2560      388480 :             move16();
    2561             :         }
    2562             :     }
    2563             :     /* i: L_tmp2 in (Q31-exp)                       */
    2564             :     /* i: exc16kWhtnd in Q_bwe_exc            */
    2565             :     /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp)   */
    2566             : 
    2567             :     /* Rescale the past memories: LP synth and SHB look ahead buffers */
    2568        1214 :     tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn );
    2569       13354 :     FOR( i = 0; i < LPC_SHB_ORDER; i++ )
    2570             :     {
    2571       12140 :         state_lpc_syn[i] = shl( state_lpc_syn[i], tmp );
    2572       12140 :         move16();
    2573             :     }
    2574       25494 :     FOR( i = -L_SHB_LAHEAD; i < 0; i++ )
    2575             :     {
    2576       24280 :         excSHB[i] = shl( excSHB[i], tmp );
    2577       24280 :         move16();
    2578             :     }
    2579             :     /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */
    2580             : 
    2581        1214 :     Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 );
    2582        1214 :     Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 );
    2583        1214 :     Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 );
    2584        1214 :     Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 );
    2585             :     /* i: exc16kWhtnd in (Q_bwe_exc) */
    2586             :     /* o: excSHB in (Q_bwe_exc) */
    2587             : }
    2588             : 
    2589        2708 : IF( EQ_16( extl, FB_TBE ) )
    2590             : {
    2591           0 :     tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb );
    2592           0 :     Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp );
    2593           0 :     Scale_sig( fb_tbe_demph, 1, tmp );
    2594           0 :     Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 );
    2595             :     /* i: White_exc16k_FB       in (14-n2) */
    2596             :     /* o: White_exc16k_FB_temp  in (14-n2) */
    2597             : 
    2598           0 :     FOR( i = 0; i < 10; i++ )
    2599             :     {
    2600           0 :         FOR( j = 0; j < 32; ++j )
    2601             :         {
    2602           0 :             White_exc16k_FB_temp[i * 32 + j] = mult_r( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] );
    2603           0 :             move16();
    2604             :         }
    2605             :     }
    2606             : 
    2607           0 :     *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 );
    2608           0 :     move16(); /**Q_bwe_exc_fb  +35 +1 -16*/
    2609           0 :     flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k );
    2610             : 
    2611           0 :     deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph );
    2612             : }
    2613             : ELSE
    2614             : {
    2615        2708 :     set16_fx( White_exc16k_FB, 0, L_FRAME16k );
    2616             : }
    2617             : 
    2618        2708 : return;
    2619             : }
    2620             : 
    2621      115109 : void GenShapedSHBExcitation_ivas_enc_fx(
    2622             :     Word16 *excSHB,                      /* o : synthesized shaped shb excitation Q_bwe_exc*/
    2623             :     const Word16 *lpc_shb,               /* i : lpc coefficients Q12*/
    2624             :     Word16 *White_exc16k_FB,             /* o : white excitation for the Fullband extension Q_bwe_exc_fb */
    2625             :     Word32 *mem_csfilt,                  /* i/o: memory */
    2626             :     Word16 *mem_genSHBexc_filt_down_shb, /* i/o: memory */
    2627             :     Word16 *state_lpc_syn,               /* i/o: memory */
    2628             :     const Word16 coder_type,             /* i : coding type */
    2629             :     const Word16 *bwe_exc_extended,      /* i : bwidth extended excitation */
    2630             :     Word16 bwe_seed[],                   /* i/o: random number generator seed */
    2631             :     Word16 voice_factors[],              /* i : voicing factor*/
    2632             :     const Word16 extl,                   /* i : extension layer */
    2633             :     Word16 *tbe_demph,                   /* i/o: de-emphasis memory */
    2634             :     Word16 *tbe_premph,                  /* i/o: pre-emphasis memory */
    2635             :     Word16 *lpc_shb_sf,                  /* i:   LP coefficients  */
    2636             :     const Word32 shb_ener_sf_32,         /* i: input shb ener, Q31 */
    2637             :     Word16 *shb_res_gshape,              /* i: input res gain shape, Q14 */
    2638             :     Word16 *shb_res,
    2639             :     Word16 *vf_ind,
    2640             :     const Word16 formant_fac,  /* i   : Formant sharpening factor [0..1] */
    2641             :     Word16 fb_state_lpc_syn[], /* i/o: memory */
    2642             :     Word16 *fb_tbe_demph,      /* i/o: fb de-emphasis memory */
    2643             :     Word16 *Q_bwe_exc,
    2644             :     Word16 *Q_bwe_exc_fb,
    2645             :     const Word16 Q_shb,
    2646             :     Word16 n_mem2,         /* i :  n_mem2 scale factor to adjust 24.4/32kbps memories */
    2647             :     Word16 prev_Q_bwe_syn, /* i :  st_fx->prev_Q_bwe_syn */
    2648             :     const Word32 bitrate,
    2649             :     const Word16 prev_bfi,
    2650             :     const Word16 element_mode,  /* i  : element mode                            */
    2651             :     const Word16 flag_ACELP16k, /* i  : ACELP@16kHz flag                        */
    2652             :     Word16 *nlExc16k,           /* i/o: NL exc for IC-BWE                       */
    2653             :     Word16 *nlExc16k_e,         /* i/o: exp of nlExc16k                         */
    2654             :     Word16 *mixExc16k,          /* i/o: exc spreading for IC-BWE                */
    2655             :     Word16 *mixExc16k_e,        /* i/o: exp of mixExc16k_fx                     */
    2656             :     const Word32 extl_brate,    /* i  : extension layer bitarte                 */
    2657             :     const Word16 MSFlag,        /* i  : Multi Source flag                       */
    2658             :     Word16 EnvSHBres_4k[],      /* i/o: TD envelope of the SHB residual signal  */
    2659             :     Word16 Q_EnvSHBres_4k,
    2660             :     Word32 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */
    2661             :     Word16 *prev_mix_factor,      /* i/o: mixing factor in the previous frame     */
    2662             :     Word16 *Env_error,            /* o  : error in SHB residual envelope modelling*/
    2663             :     Word16 Env_error_part[]       /* o  : per-segment error in SHB residual envelope modelling */
    2664             : )
    2665             : {
    2666             :     Word16 i, j, k;
    2667             :     Word16 wht_fil_mem[LPC_WHTN_ORDER];
    2668             :     Word16 lpc_whtn[LPC_WHTN_ORDER + 1];
    2669             :     Word16 R_h[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech MSB */
    2670             :     Word16 R_l[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech LSB */
    2671             :     Word16 Q_R;
    2672             :     Word32 LepsP[LPC_WHTN_ORDER + 1];
    2673             :     Word16 exc32k[L_FRAME32k], exc16k[L_FRAME16k];
    2674             :     Word32 pow1, pow22;
    2675             :     Word16 scale, temp1, temp2, temp3;
    2676             : 
    2677             :     Word16 excTmp2[L_FRAME16k];
    2678             :     Word16 *White_exc16k;
    2679             :     Word16 Q_White_exc16k;
    2680             :     Word16 excNoisyEnv[L_FRAME16k];
    2681      115109 :     Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */
    2682      115109 :     move16();
    2683      115109 :     Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */
    2684      115109 :     move16();
    2685      115109 :     move16();
    2686             :     Word16 varEnvShape;
    2687      115109 :     Word16 fb_deemph_fac = 15729; /*0.48f in Q15  */
    2688             :     Word16 exc16kWhtnd[L_FRAME16k];
    2689             : 
    2690             :     Word32 L_tmp;
    2691             :     Word16 vf_tmp;
    2692      115109 :     Word16 tmp, exp, tmp2 = 0;
    2693      115109 :     move16();
    2694             :     Word16 voiceFacEst[NB_SUBFR16k];
    2695             :     Word16 zero_mem[LPC_SHB_ORDER];
    2696             :     Word32 syn_shb_ener_sf[4];
    2697             :     Word16 syn_shb_ener_sf_q[4];
    2698             :     Word16 tempSHB[80];
    2699             :     Word16 Q_pow1, Q_pow22;
    2700             : 
    2701             :     Word32 L_tmp2, L_tmp3, L_tmp4;
    2702             :     Word16 temp;
    2703             : 
    2704             :     Word16 White_exc16k_FB_temp[L_FRAME16k];
    2705             :     Word32 White_exc16k_32[L_FRAME16k];
    2706             :     Word16 White_exc16k_tmp[L_FRAME16k];
    2707             :     Word16 prev_Q_bwe_exc_fb;
    2708             : 
    2709             :     Word16 alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k];
    2710             :     Word16 cbsize;
    2711             :     Word16 mix_factor, old_fact, new_fact, fact, old_scale, new_scale, step_scale;
    2712             :     Word32 c0, c1, c2, c3, c4, c5, den;
    2713             :     Word16 g1, g2, g, g1_e, g2_e, g_e, den_e, shift, tmp_e, tmp1_e;
    2714             :     Word16 EnvWhiteExc16k[L_FRAME16k], EnvExc16kWhtnd[L_FRAME16k];
    2715      115109 :     Word16 EnvWhiteExc16k_4k[L_FRAME4k] = { 0 }, EnvExc16kWhtnd_4k[L_FRAME4k] = { 0 };
    2716             :     Word16 flag_plosive;
    2717             :     Word16 delta;
    2718             :     Word32 c0_part[NUM_SHB_SUBGAINS], c1_part[NUM_SHB_SUBGAINS], c2_part[NUM_SHB_SUBGAINS], c3_part[NUM_SHB_SUBGAINS], c4_part[NUM_SHB_SUBGAINS], c5_part[NUM_SHB_SUBGAINS];
    2719             :     Word64 W_tmp;
    2720             : 
    2721      115109 :     mix_factor = 0; /* Q15 */
    2722      115109 :     move16();
    2723             : 
    2724      115109 :     set16_fx( zero_mem, 0, LPC_SHB_ORDER );
    2725      115109 :     set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER );
    2726    36949989 :     FOR( i = 0; i < L_FRAME32k; i = i + 2 )
    2727             :     {
    2728    36834880 :         exc32k[i] = negate( bwe_exc_extended[i] ); // Q_bwe_exc
    2729    36834880 :         move16();
    2730    36834880 :         exc32k[i + 1] = bwe_exc_extended[i + 1]; // Q_bwe_exc
    2731    36834880 :         move16();
    2732             :     }
    2733             : 
    2734             :     /* Decimate by 2 */
    2735      115109 :     Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k ); // Q_bwe_exc
    2736             :     /* i: exc32k in Q_bwe_exc */
    2737             :     /* o: exc16k in Q_bwe_exc */
    2738             : 
    2739      115109 :     autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 ); // Q_R
    2740             :     /* Ensure R[0] isn't zero when entering Levinson Durbin */
    2741      115109 :     R_l[0] = s_max( R_l[0], 1 );
    2742      115109 :     move16();
    2743      575545 :     FOR( i = 1; i <= LPC_WHTN_ORDER; i++ )
    2744             :     {
    2745      460436 :         L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
    2746      460436 :         L_Extract( L_tmp, &R_h[i], &R_l[i] ); // Q_R
    2747             :     }
    2748      115109 :     E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL );
    2749      115109 :     Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); // Q12
    2750      115109 :     fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 );    // Q_bwe_exc
    2751             : 
    2752             :     /* i: exc16k in Q_bwe_exc */
    2753             :     /* o: exc16kWhtnd in Q_bwe_exc */
    2754             : 
    2755      115109 :     IF( GE_32( extl_brate, SWB_TBE_2k8 ) )
    2756             :     {
    2757       25058 :         temp2 = 0;
    2758       25058 :         move16();
    2759      125290 :         FOR( j = 0; j < 4; j++ )
    2760             :         {
    2761      100232 :             temp1 = shb_res_gshape[j];
    2762      100232 :             move16();
    2763     8118792 :             FOR( i = 0; i < 80; i++ )
    2764             :             {
    2765     8018560 :                 exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); // Q_bwe_exc
    2766     8018560 :                 move16();
    2767             :                 /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */
    2768             :             }
    2769      100232 :             temp2 = add( temp2, 80 );
    2770             :         }
    2771             :     }
    2772             : 
    2773             :     /* Estimate pow1 associated with Low band nonlinear extended excitation */
    2774             :     /* pow1=0.00001f */
    2775      115109 :     tmp = sub( shl( *Q_bwe_exc, 1 ), 31 );
    2776      115109 :     W_tmp = W_shl( 21475 /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */
    2777    36949989 :     FOR( k = 0; k < L_FRAME16k; k++ )
    2778             :     {
    2779             :         /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/
    2780    36834880 :         excTmp2[k] = abs_s( exc16kWhtnd[k] );
    2781    36834880 :         move16();
    2782             : 
    2783             :         /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */
    2784    36834880 :         W_tmp = W_mac_16_16( W_tmp, exc16kWhtnd[k], exc16kWhtnd[k] ); // 2*Q_bwe_exc+1
    2785             :     }
    2786      115109 :     exp = W_norm( W_tmp );
    2787      115109 :     pow1 = W_extract_h( W_shl( W_tmp, exp ) ); // 2*Q_bwe_exc+1+exp-32 = // tmp+exp
    2788      115109 :     Q_pow1 = add( tmp, exp );
    2789             : 
    2790      115109 :     IF( flag_ACELP16k == 0 )
    2791             :     {
    2792             :         /* varEnvShape = mean_fx(voice_factors, 4); */
    2793             :         /* unroll the loop */
    2794       55593 :         L_tmp = L_mult( voice_factors[0], 8192 /*0.25 in Q15 */ );
    2795       55593 :         L_tmp = L_mac( L_tmp, voice_factors[1], 8192 /*0.25 in Q15 */ );
    2796       55593 :         L_tmp = L_mac( L_tmp, voice_factors[2], 8192 /*0.25 in Q15 */ );
    2797       55593 :         varEnvShape = mac_r( L_tmp, voice_factors[3], 8192 /*0.25 in Q15 */ ); /* varEnvShape in Q15 */
    2798             :     }
    2799             :     ELSE /* 16k core */
    2800             :     {
    2801             :         /* varEnvShape = mean_fx(voice_factors, 5); */
    2802             :         /* unroll the loop */
    2803       59516 :         L_tmp = L_mult( voice_factors[0], 6554 /*0.2 in Q15 */ );
    2804       59516 :         L_tmp = L_mac( L_tmp, voice_factors[1], 6554 /*0.2 in Q15 */ );
    2805       59516 :         L_tmp = L_mac( L_tmp, voice_factors[2], 6554 /*0.2 in Q15 */ );
    2806       59516 :         L_tmp = L_mac( L_tmp, voice_factors[3], 6554 /*0.2 in Q15 */ );
    2807       59516 :         varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 /*0.2 in Q15 */ ); /* varEnvShape in Q15 */
    2808             :     }
    2809             : 
    2810      115109 :     IF( EQ_16( extl, FB_TBE ) )
    2811             :     {
    2812             :         /*pow(varEnvShape,3) */
    2813       43652 :         tmp = mult_r( varEnvShape, varEnvShape );
    2814       43652 :         tmp = mult_r( tmp, varEnvShape );
    2815             : 
    2816             :         /* max_val((0.68f - (float)pow(varEnvShape, 3)), 0.48f); */
    2817       43652 :         fb_deemph_fac = sub( 22282 /*0.68f Q15*/, tmp );
    2818       43652 :         fb_deemph_fac = s_max( fb_deemph_fac, 15729 /*0.48f Q15*/ );
    2819             :     }
    2820             : 
    2821             :     /*varEnvShape = 1.09875f - 0.49875f * varEnvShape; */
    2822      115109 :     varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape );
    2823             : 
    2824             :     /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */
    2825      115109 :     varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ );
    2826      115109 :     varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ );
    2827      115109 :     varEnvShape = shl( varEnvShape, 1 );
    2828      115109 :     csfilt_num2[0] = sub( MAX_16, varEnvShape ); // Q15
    2829      115109 :     move16();
    2830      115109 :     neg_csfilt_den2[1] = varEnvShape; // Q15
    2831      115109 :     move16();
    2832             : 
    2833      115109 :     test();
    2834      115109 :     test();
    2835      115109 :     test();
    2836      115109 :     test();
    2837      115109 :     IF( EQ_16( element_mode, EVS_MONO ) && *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) )
    2838             :     {
    2839             :         /* pre-init smoothing filter to avoid energy drop outs */
    2840           0 :         L_tmp = L_mult( excTmp2[0], 1638 );
    2841           0 :         FOR( i = 1; i < L_SUBFR16k / 4; i++ )
    2842             :         {
    2843           0 :             L_tmp = L_mac( L_tmp, excTmp2[i], 1638 ); /*1638 = 1/20 in Q15*/
    2844             :         }
    2845             :         /*L_tmp = sum(excTmp2, L_SUBFR16k/4)*(1/20) where L_SUBFR16k/4 =20 */
    2846             : 
    2847             :         /* don't apply for FB in case the FB start-frame was potentially lost - White_exc16k is very sensitive to enery mismatch between enc - dec */
    2848             :         /* rather stick to the more conservative approach, to avoid potential clippings */
    2849           0 :         test();
    2850           0 :         IF( !( prev_bfi && EQ_16( extl, FB_TBE ) ) )
    2851             :         {
    2852             :             /* use weak smoothing for 1st frame after switching to make filter recover more quickly */
    2853           0 :             varEnvShape = 26214 /*0.8f Q15*/;
    2854           0 :             move16();
    2855           0 :             csfilt_num2[0] = sub( MAX_16, varEnvShape );
    2856           0 :             move16();
    2857           0 :             neg_csfilt_den2[1] = varEnvShape;
    2858           0 :             move16();
    2859             :         }
    2860             : 
    2861           0 :         *mem_csfilt = Mult_32_16( L_tmp, varEnvShape );
    2862           0 :         move32();
    2863             :     }
    2864             : 
    2865      115109 :     IF( MSFlag > 0 )
    2866             :     {
    2867             :         // varEnvShape = 0.995f;
    2868        5694 :         varEnvShape = 32604;
    2869        5694 :         move16();
    2870        5694 :         csfilt_num2[0] = 32768 - varEnvShape;
    2871             :         // csfilt_num2[0] = sub( 32767, varEnvShape );
    2872        5694 :         move16();
    2873        5694 :         neg_csfilt_den2[1] = varEnvShape;
    2874        5694 :         move16();
    2875             :     }
    2876             : 
    2877      115109 :     White_exc16k = exc16k;
    2878      115109 :     Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc );
    2879      115109 :     IF( *mem_csfilt )
    2880             :     {
    2881       77572 :         Q_excTmp2 = s_min( Q_excTmp2, sub( add( norm_l( *mem_csfilt ), *Q_bwe_exc ), 1 ) );
    2882             :     }
    2883      115109 :     test();
    2884             :     /* Track the low band envelope */
    2885      115109 :     IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) )
    2886             :     {
    2887       29855 :         test();
    2888       29855 :         IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) )
    2889             :         {
    2890       25572 :             mem_csfilt_left = 0;
    2891       25572 :             mem_csfilt_right = 0;
    2892       25572 :             move16();
    2893       25572 :             move16();
    2894     8208612 :             FOR( k = 0; k < L_FRAME16k; k++ )
    2895             :             {
    2896             :                 // excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k];
    2897     8183040 :                 excNoisyEnvLeft[k] = add( mem_csfilt_left, mult_r( csfilt_num2[0], shl( excTmp2[k], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2
    2898     8183040 :                 move16();
    2899             :                 // mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k];
    2900     8183040 :                 mem_csfilt_left = mult_r( neg_csfilt_den2[1], excNoisyEnvLeft[k] ); // Q_excTmp2
    2901             :                 // excNoisyEnvRight[L_FRAME16k - k - 1] = mem_csfilt_right + csfilt_num2[0] * excTmp2[L_FRAME16k - k - 1];
    2902     8183040 :                 excNoisyEnvRight[L_FRAME16k - k - 1] = add( mem_csfilt_right, mult_r( csfilt_num2[0], shl( excTmp2[L_FRAME16k - k - 1], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2
    2903     8183040 :                 move16();
    2904             :                 // mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1];
    2905     8183040 :                 mem_csfilt_right = mult_r( neg_csfilt_den2[1], excNoisyEnvRight[L_FRAME16k - k - 1] ); // Q_excTmp2
    2906             :             }
    2907             : 
    2908       25572 :             alpha = 0;
    2909       25572 :             move16();
    2910             :             // step = 1.0f / L_FRAME16k;
    2911       25572 :             step = 102; // Q15
    2912       25572 :             move16();
    2913     8208612 :             FOR( k = 0; k < L_FRAME16k; k++ )
    2914             :             {
    2915             :                 // excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + (1 - alpha) * excNoisyEnvRight[k];
    2916     8183040 :                 excNoisyEnv[k] = add( mult_r( alpha, excNoisyEnvLeft[k] ), mult_r( sub( 32767, alpha ), excNoisyEnvRight[k] ) ); // Q_excTmp2
    2917     8183040 :                 move16();
    2918     8183040 :                 alpha = add( alpha, step );
    2919             :             }
    2920             :         }
    2921             :     }
    2922             :     ELSE
    2923             :     {
    2924             :         /* Track the low band envelope */
    2925       85254 :         L_tmp = L_shl( *mem_csfilt, sub( Q_excTmp2, *Q_bwe_exc ) );
    2926       85254 :         move32();
    2927    27366534 :         FOR( i = 0; i < L_FRAME16k; i++ )
    2928             :         {
    2929    27281280 :             excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], shl( excTmp2[i], sub( Q_excTmp2, *Q_bwe_exc ) ) );
    2930    27281280 :             move16();
    2931             :             /* Work-around to avoid 0s for very small value*/
    2932    27281280 :             test();
    2933    27281280 :             test();
    2934    27281280 :             test();
    2935    27281280 :             test();
    2936    27281280 :             if ( excNoisyEnv[i] == 0 && ( L_tmp != 0 || ( csfilt_num2[0] != 0 && excTmp2[i] != 0 ) ) )
    2937             :             {
    2938        5772 :                 excNoisyEnv[i] = 1;
    2939        5772 :                 move16();
    2940             :             }
    2941             :             /* excNoisyEnv : Q_excTmp2,
    2942             :              *mem_csfilt: Q_excTmp2+16, excTmp2: Q_excTmp2, csfilt_num2[0] Q_excTmp2  */
    2943    27281280 :             L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_excTmp2 + 16 */
    2944             :         }
    2945       85254 :         *mem_csfilt = L_shr( L_tmp, sub( Q_excTmp2, *Q_bwe_exc ) );
    2946       85254 :         move32();
    2947             :     }
    2948             : 
    2949      115109 :     test();
    2950      115109 :     IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    2951        4283 :     {
    2952             :         /* generate gaussian (white) excitation */
    2953     1374843 :         FOR( k = 0; k < L_FRAME16k; k++ )
    2954             :         {
    2955     1370560 :             White_exc16k[k] = own_random( &bwe_seed[0] ); // Q0
    2956     1370560 :             move16();
    2957             :         }
    2958             : 
    2959             :         /* normalize the amplitude of the gaussian excitation to that of the LB exc. */
    2960        4283 :         Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT; // Q31
    2961        4283 :         move32();
    2962        4283 :         move32();
    2963        4283 :         pow22 = POW_EXC16k_WHTND_FX;
    2964        4283 :         Q_pow22 = -6;
    2965        4283 :         move16();
    2966             :         // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), White_exc16k, L_FRAME16k);
    2967        4283 :         Word16 pow1_exp = sub( Q31, Q_pow1 );
    2968        4283 :         Word32 temp_pow = Sqrt32( pow1, &pow1_exp );
    2969        4283 :         temp_pow = L_shl( Mpy_32_32( temp_pow, pow22_inv ), pow1_exp );
    2970             :         /*Word16 out_exp;
    2971             :         Word32 temp_pow1 = root_a_over_b_fx(pow1, Q_pow1, pow22, Q_pow22, &out_exp);
    2972             :         temp_pow1 = L_shl(temp_pow1, out_exp);*/
    2973             :         // v_multc_fixed_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k);
    2974        4283 :         L_tmp = 0;
    2975        4283 :         move32();
    2976        4283 :         Q_White_exc16k = add( getScaleFactor16( White_exc16k, L_FRAME16k ), norm_l( temp_pow ) );
    2977     1374843 :         FOR( k = 0; k < L_FRAME16k; k++ )
    2978             :         {
    2979     1370560 :             White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] ); // Q31 + Q0 - Q15 = Q16
    2980     1370560 :             move32();
    2981     1370560 :             White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); //  Q16 + Q_White_exc16k - Q16 = Q_White_exc16k
    2982     1370560 :             move16();
    2983     1370560 :             L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
    2984             :         }
    2985             :     }
    2986             :     ELSE
    2987             :     {
    2988             :         /* create a random excitation - Reuse exc16k memory */
    2989      110826 :         create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed );                        // Q5
    2990      110826 :         create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); // Q5
    2991             : 
    2992      110826 :         L_tmp = L_deposit_l( 0 );
    2993      110826 :         tmp = add( *Q_bwe_exc, 1 );
    2994    35575146 :         FOR( k = 0; k < L_FRAME16k; k++ )
    2995             :         {
    2996    35464320 :             L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_excTmp2)  +5 +1*/
    2997    35464320 :             White_exc16k_32[k] = L_tmp4;                        /* (Q_excTmp2)  +5 +1*/
    2998    35464320 :             move32();
    2999    35464320 :             L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
    3000             :         }
    3001             :         /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/
    3002             :         /* White_exc16k in Q6 */
    3003             : 
    3004             :         /* calculate pow22 */
    3005             :         /* pow22=0.00001f */
    3006      110826 :         tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 );
    3007      110826 :         W_tmp = W_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(*Q_bwe_exc-NOISE_QADJ) */
    3008      110826 :         Q_White_exc16k = getScaleFactor32( White_exc16k_32, L_FRAME16k );
    3009    35575146 :         FOR( k = 0; k < L_FRAME16k; k++ )
    3010             :         {
    3011             :             /* White_exc16k[k] *= excNoisyEnv[k]; */
    3012    35464320 :             White_exc16k[k] = extract_h( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); // Q_excTmp2 + 6 + Q_White_exc16k - 16 ==> Q_excTmp2 + Q_White_exc16k - 10
    3013    35464320 :             move16();
    3014             :             /* i: excNoisyEnv in (Q_excTmp2)     */
    3015             :             /* i: White_exc16k  in Q6               */
    3016             :             /* o: White_exc16k in (Q_bwe_exc-NOISE_QADJ)  */
    3017             : 
    3018             :             /* pow22 += White_exc16k[k] * White_exc16k[k]; */
    3019    35464320 :             W_tmp = W_mac0_16_16( W_tmp, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2 + Q_White_exc16k - 10)*/
    3020             :         }
    3021      110826 :         Q_pow22 = W_norm( W_tmp );
    3022      110826 :         pow22 = W_extract_h( W_shl( W_tmp, Q_pow22 ) ); // 2*(Q_excTmp2 + Q_White_exc16k - 10)+Q_pow22-32
    3023      110826 :         Q_pow22 = sub( add( Q_pow22, shl( sub( add( Q_White_exc16k, Q_excTmp2 ), 10 ), 1 ) ), 32 );
    3024      110826 :         Q_White_exc16k = add( Q_White_exc16k, sub( Q_excTmp2, 10 ) );
    3025             :     }
    3026             : 
    3027      115109 :     flag_plosive = 0;
    3028      115109 :     move16();
    3029      115109 :     test();
    3030      115109 :     test();
    3031      115109 :     test();
    3032      115109 :     IF( GE_32( extl_brate, SWB_TBE_2k8 ) || EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    3033             :     {
    3034       29341 :         IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */
    3035             :         {
    3036       29341 :             test();
    3037       29341 :             IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    3038             :             {
    3039     1374843 :                 FOR( k = 0; k < L_FRAME16k; k++ )
    3040             :                 {
    3041     1370560 :                     White_exc16k_tmp[k] = shl( White_exc16k[k], sub( *Q_bwe_exc, Q_White_exc16k ) );
    3042     1370560 :                     move16();
    3043             :                 }
    3044             : 
    3045             :                 /* calculate TD envelopes of exc16kWhtnd and White_exc16k */
    3046        4283 :                 find_td_envelope_fx( White_exc16k_tmp, L_FRAME16k, 20, NULL, EnvWhiteExc16k ); /* Q_bwe_exc */
    3047        4283 :                 find_td_envelope_fx( exc16kWhtnd, L_FRAME16k, 20, NULL, EnvExc16kWhtnd );      /* Q_bwe_exc */
    3048             : 
    3049      346923 :                 FOR( k = 0; k < L_FRAME4k; k++ )
    3050             :                 {
    3051      342640 :                     EnvWhiteExc16k_4k[k] = EnvWhiteExc16k[4 * k]; /* Q_bwe_exc */
    3052      342640 :                     move16();
    3053      342640 :                     EnvExc16kWhtnd_4k[k] = EnvExc16kWhtnd[4 * k]; /* Q_bwe_exc */
    3054      342640 :                     move16();
    3055             :                 }
    3056             : 
    3057             :                 /* calculate the optimal mix factor */
    3058        4283 :                 c0 = c1 = c2 = c3 = c4 = c5 = 0; /* Q0 */
    3059        4283 :                 move32();
    3060        4283 :                 move32();
    3061        4283 :                 move32();
    3062        4283 :                 move32();
    3063        4283 :                 move32();
    3064        4283 :                 move32();
    3065             : 
    3066        4283 :                 temp1 = add( shl( *Q_bwe_exc, 1 ), 1 );
    3067        4283 :                 temp2 = add( add( Q_EnvSHBres_4k, *Q_bwe_exc ), 1 );
    3068        4283 :                 temp3 = add( shl( Q_EnvSHBres_4k, 1 ), 1 );
    3069       21415 :                 FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ )
    3070             :                 {
    3071             :                     // c0_part[i] = sum2_f( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
    3072       17132 :                     c0_part[i] = L_shr( sum2_fx( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */
    3073       17132 :                     move32();
    3074             :                     // c1_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
    3075       17132 :                     c1_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */
    3076       17132 :                     move32();
    3077             :                     // c2_part[i] = sum2_f( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
    3078       17132 :                     c2_part[i] = L_shr( sum2_fx( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */
    3079       17132 :                     move32();
    3080             :                     // c3_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
    3081       17132 :                     c3_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */
    3082       17132 :                     move32();
    3083             :                     // c4_part[i] = 2.0f * dotp( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
    3084       17132 :                     c4_part[i] = L_shr( Dot_product( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), sub( temp1, 1 ) ); /* Q0 */
    3085       17132 :                     move32();
    3086             :                     // c5_part[i] = sum2_f( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
    3087       17132 :                     c5_part[i] = L_shr( sum2_fx( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp3 ); /* Q0 */
    3088       17132 :                     move32();
    3089             : 
    3090       17132 :                     c0 = L_add( c0, c0_part[i] );
    3091       17132 :                     c1 = L_add( c1, c1_part[i] );
    3092       17132 :                     c2 = L_add( c2, c2_part[i] );
    3093       17132 :                     c3 = L_add( c3, c3_part[i] );
    3094       17132 :                     c4 = L_add( c4, c4_part[i] );
    3095       17132 :                     c5 = L_add( c5, c5_part[i] );
    3096             :                 }
    3097             : 
    3098             :                 // den = 4.0f * c0 * c2 - c4 * c4;
    3099        4283 :                 W_tmp = W_sub( W_shl( W_mult0_32_32( c0, c2 ), 2 ), W_mult0_32_32( c4, c4 ) );
    3100        4283 :                 den_e = 63;
    3101        4283 :                 move16();
    3102        4283 :                 shift = W_norm( W_tmp );
    3103        4283 :                 den = W_extract_h( W_shl( W_tmp, shift ) );
    3104        4283 :                 den_e = sub( den_e, shift );
    3105             : 
    3106        4283 :                 IF( den == 0 )
    3107             :                 {
    3108         277 :                     den = 1;
    3109         277 :                     move32();
    3110         277 :                     den_e = 31;
    3111         277 :                     move16();
    3112             :                 }
    3113             : 
    3114             :                 // g1 = ( c3 * c4 - 2 * c1 * c2 ) / den;
    3115        4283 :                 W_tmp = W_sub( W_mult0_32_32( c3, c4 ), W_shl( W_mult0_32_32( c1, c2 ), 1 ) );
    3116        4283 :                 g1_e = 63;
    3117        4283 :                 move16();
    3118        4283 :                 shift = W_norm( W_tmp );
    3119        4283 :                 L_tmp = W_extract_h( W_shl( W_tmp, shift ) );
    3120        4283 :                 g1_e = sub( g1_e, shift );
    3121             : 
    3122        4283 :                 g1 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e );
    3123        4283 :                 g1_e = sub( add( tmp_e, g1_e ), den_e );
    3124             : 
    3125             :                 // g2 = ( c1 * c4 - 2 * c0 * c3 ) / den;
    3126        4283 :                 W_tmp = W_sub( W_mult0_32_32( c1, c4 ), W_shl( W_mult0_32_32( c0, c3 ), 1 ) );
    3127        4283 :                 g2_e = 63;
    3128        4283 :                 move16();
    3129        4283 :                 shift = W_norm( W_tmp );
    3130        4283 :                 L_tmp = W_extract_h( W_shl( W_tmp, shift ) );
    3131        4283 :                 g2_e = sub( g2_e, shift );
    3132             : 
    3133        4283 :                 g2 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e );
    3134        4283 :                 g2_e = sub( add( tmp_e, g2_e ), den_e );
    3135             : 
    3136             :                 // *Env_error = 0.0f;
    3137        4283 :                 *Env_error = 0;
    3138        4283 :                 move16();
    3139        4283 :                 flag_plosive = 0;
    3140        4283 :                 move16();
    3141       21415 :                 FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ )
    3142             :                 {
    3143             :                     // Env_error_part[i] = c5_part[i] + g1 * g1 * c0_part[i] + g1 * c1_part[i] + g2 * g2 * c2_part[i] + g2 * c3_part[i] + g1 * g2 * c4_part[i];
    3144       17132 :                     L_tmp = BASOP_Util_Add_Mant32Exp( c5_part[i], 31, Mpy_32_32( L_mult( g1, g1 ), c0_part[i] ), add( shl( g1_e, 1 ), 31 ), &tmp_e );
    3145       17132 :                     L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c1_part[i], g1 ), add( 31, g1_e ), &tmp_e );
    3146       17132 :                     L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g2, g2 ), c2_part[i] ), add( shl( g2_e, 1 ), 31 ), &tmp_e );
    3147       17132 :                     L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c3_part[i], g2 ), add( 31, g2_e ), &tmp_e );
    3148       17132 :                     L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g1, g2 ), c4_part[i] ), add( add( g1_e, g2_e ), 31 ), &tmp_e );
    3149             : 
    3150             :                     // Env_error_part[i] = L_shr( L_tmp, 31 - tmp_e ); // Check Exponent
    3151       17132 :                     Env_error_part[i] = extract_h( L_shr_sat( L_tmp, sub( Q15, tmp_e ) ) ); /* Q0 */
    3152       17132 :                     move16();
    3153             : 
    3154             :                     // *Env_error += Env_error_part[i];
    3155       17132 :                     *Env_error = add_sat( *Env_error, Env_error_part[i] ); /* Q0 */
    3156       17132 :                     move16();
    3157             : 
    3158       17132 :                     if ( GT_16( Env_error_part[i], THR_ENV_ERROR_PLOSIVE_FX ) ) // Check which Q
    3159             :                     {
    3160             :                         /* envelope error is too high -> likely a plosive */
    3161          37 :                         flag_plosive = 1;
    3162          37 :                         move16();
    3163             :                     }
    3164             :                 }
    3165             : 
    3166        4283 :                 IF( flag_plosive )
    3167             :                 {
    3168             :                     /* plosive detected -> set the mixing factor to 0 */
    3169          36 :                     *vf_ind = 0;
    3170          36 :                     move16();
    3171          36 :                     mix_factor = 0;
    3172          36 :                     move16();
    3173             :                 }
    3174             :                 ELSE
    3175             :                 {
    3176             :                     /* normalize gain */
    3177             :                     // g = g2 / ( g1 + g2 );
    3178        4247 :                     tmp1_e = BASOP_Util_Add_MantExp( g1, g1_e, g2, g2_e, &tmp );
    3179        4247 :                     IF( tmp == 0 )
    3180             :                     {
    3181         322 :                         tmp = 1;
    3182         322 :                         move16();
    3183         322 :                         tmp1_e = 15;
    3184         322 :                         move16();
    3185             :                     }
    3186        4247 :                     g = BASOP_Util_Divide1616_Scale( g2, tmp, &tmp_e );
    3187        4247 :                     g_e = sub( add( tmp_e, g2_e ), tmp1_e );
    3188             : 
    3189             :                     /* quantization of the mixing factor */
    3190        4247 :                     cbsize = 1 << NUM_BITS_SHB_VF;
    3191        4247 :                     move16();
    3192             :                     // delta = 1.0f / ( cbsize - 1 );
    3193        4247 :                     delta = 2341; /* Q14 */
    3194        4247 :                     move16();
    3195             :                     // if ( g > 1.0f )
    3196        4247 :                     IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), ONE_IN_Q31, 0 ) > 0 )
    3197             :                     {
    3198             :                         // g = 1.0f;
    3199         797 :                         g = MAX16B; /* Q15 */
    3200         797 :                         move16();
    3201         797 :                         g_e = 0;
    3202         797 :                         move16();
    3203             :                     }
    3204             :                     // else if ( g < shl( delta, ( 15 - g_e ) - 14 ) )
    3205        3450 :                     ELSE IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), delta, 17 ) < 0 )
    3206             :                     {
    3207             :                         /* prevent low gains to be quantized to 0 as this is reserved for plosives */
    3208             :                         // g = delta;
    3209         734 :                         g = shl( delta, 1 ); /* Q15 */
    3210         734 :                         g_e = 0;
    3211         734 :                         move16();
    3212             :                     }
    3213             : 
    3214        4247 :                     g = shl_sat( g, g_e ); /* Q15 */
    3215             : 
    3216        4247 :                     *vf_ind = usquant_fx( g, &mix_factor, 0, delta, cbsize );
    3217        4247 :                     move16();
    3218             :                 }
    3219             :             }
    3220             :             ELSE
    3221             :             {
    3222       25058 :                 Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k,
    3223             :                                          Q_White_exc16k, pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind );
    3224       25058 :                 tmp = voiceFacEst[0];
    3225       25058 :                 tmp2 = MAX_16;
    3226       25058 :                 move16();
    3227       25058 :                 move16();
    3228       25058 :                 if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
    3229             :                 {
    3230       24694 :                     tmp2 = 26214 /*0.8f Q15*/;
    3231       24694 :                     move16();
    3232             :                 }
    3233             :             }
    3234             :         }
    3235             :         ELSE /* decoder side */
    3236             :         {
    3237           0 :             test();
    3238           0 :             IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    3239             :             {
    3240           0 :                 IF( *vf_ind == 0 )
    3241             :                 {
    3242             :                     // mix_factor = 0.0f;
    3243           0 :                     mix_factor = 0;
    3244           0 :                     move16();
    3245           0 :                     flag_plosive = 1;
    3246           0 :                     move16();
    3247             :                 }
    3248             :                 ELSE
    3249             :                 {
    3250             :                     // mix_factor = usdequant(*vf_ind, 0.0f, 1.0f / ((1 << NUM_BITS_SHB_VF) - 1));
    3251           0 :                     mix_factor = usdequant_fx( *vf_ind, 0, 2341 );
    3252             :                 }
    3253             :             }
    3254             :             ELSE
    3255             :             {
    3256             :                 /* *vf_ind is an integer scale by 0.125f*/
    3257           0 :                 tmp = shl( *vf_ind, ( 15 - 3 ) );
    3258           0 :                 tmp2 = MAX_16;
    3259           0 :                 move16();
    3260           0 :                 IF( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
    3261             :                 {
    3262           0 :                     tmp2 = 26214 /*0.8f Q15*/;
    3263           0 :                     move16();
    3264             :                 }
    3265             :             }
    3266             :         }
    3267             : 
    3268       29341 :         test();
    3269       29341 :         IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) )
    3270             :         {
    3271       25058 :             voice_factors[0] = mult_r( voice_factors[0], tmp2 );
    3272       25058 :             move16();
    3273       25058 :             voice_factors[1] = mult_r( voice_factors[1], tmp2 );
    3274       25058 :             move16();
    3275       25058 :             voice_factors[2] = mult_r( voice_factors[2], tmp2 );
    3276       25058 :             move16();
    3277       25058 :             voice_factors[3] = mult_r( voice_factors[3], tmp2 );
    3278       25058 :             move16();
    3279       25058 :             voice_factors[4] = mult_r( voice_factors[4], tmp2 );
    3280       25058 :             move16();
    3281             :         }
    3282             :     }
    3283             : 
    3284      115109 :     test();
    3285      115109 :     IF( GE_16( element_mode, IVAS_CPE_DFT ) && nlExc16k != NULL )
    3286             :     {
    3287             :         /* save buffers for IC-BWE */
    3288             :         // mvr2r(exc16kWhtnd, nlExc16k, L_FRAME16k);
    3289       24220 :         Copy( exc16kWhtnd, nlExc16k, L_FRAME16k ); // Q_bwe_exc
    3290       24220 :         *nlExc16k_e = sub( 15, *Q_bwe_exc );
    3291       24220 :         move16();
    3292             : 
    3293             :         // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), mixExc16k, L_FRAME16k);
    3294       24220 :         L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
    3295       24220 :         Word16 temp_fac = round_fx_sat( L_tmp ); // Q15-exp
    3296             : 
    3297     7774620 :         FOR( k = 0; k < L_FRAME16k; k++ )
    3298             :         {
    3299     7750400 :             mixExc16k[k] = mult_r( White_exc16k[k], temp_fac ); // Q_White_exc16k+15-exp-15 = Q_White_exc16k-exp
    3300     7750400 :             move16();
    3301             :         }
    3302       24220 :         *mixExc16k_e = sub( 15, sub( Q_White_exc16k, exp ) );
    3303       24220 :         move16();
    3304             :     }
    3305             : 
    3306      115109 :     Copy( White_exc16k, White_exc16k_FB, L_FRAME16k ); // Q_White_exc16k
    3307      115109 :     prev_Q_bwe_exc_fb = *Q_bwe_exc_fb;
    3308      115109 :     *Q_bwe_exc_fb = Q_White_exc16k;
    3309      115109 :     move16();
    3310      115109 :     move16();
    3311             : 
    3312      115109 :     Word16 tbe_demph_fx = shl_sat( *tbe_demph, sub( Q_White_exc16k, *Q_bwe_exc ) ); // Q_White_exc16k
    3313             : 
    3314      115109 :     deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, &tbe_demph_fx );
    3315             :     /* i/o: White_exc16k (Q_White_exc16k) */
    3316             :     /* i: tbe_demph_fx (Q_White_exc16k) */
    3317      115109 :     *tbe_demph = shr_sat( tbe_demph_fx, sub( Q_White_exc16k, *Q_bwe_exc ) );
    3318      115109 :     move16();
    3319             : 
    3320      115109 :     test();
    3321      115109 :     IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    3322             :     {
    3323        4283 :         IF( !flag_plosive ) /* use only LB excitation in case of plosives */
    3324             :         {
    3325             :             /* re-scale gaussian excitation at the beginning to gradually move from old energy to new energy */
    3326             :             /* old_scale = (float) sqrt( *prev_pow_exc16kWhtnd / pow1 ); */
    3327        4247 :             old_scale = round_fx_sat( root_a_over_b_fx( *prev_pow_exc16kWhtnd, 0, pow1, Q_pow1, &exp ) ); // exp
    3328        4247 :             old_scale = shl( old_scale, s_min( 0, exp ) );                                                // limit Q factor to 15
    3329        4247 :             exp = s_max( 0, exp );
    3330             : 
    3331             :             // new_scale = 1.0f;
    3332        4247 :             new_scale = shr( 32767, exp ); // exp
    3333             : 
    3334             :             // step_scale = (new_scale - old_scale) / (L_FRAME16k / 2);
    3335        4247 :             step_scale = mult_r( sub( new_scale, old_scale ), 205 ); // exp
    3336        4247 :             scale = old_scale;                                       // exp
    3337        4247 :             move16();
    3338             : 
    3339             :             /* interpolate between the old and the new value of the mixing factor */
    3340        4247 :             old_fact = *prev_mix_factor; // Q15
    3341        4247 :             new_fact = mix_factor;       // Q15
    3342        4247 :             move16();
    3343        4247 :             move16();
    3344             : 
    3345             :             // step = (new_fact - old_fact) / (L_FRAME16k / 2);
    3346        4247 :             step = mult_r( sub( new_fact, old_fact ), 205 ); // Q15
    3347        4247 :             fact = old_fact;                                 // Q15
    3348        4247 :             move16();
    3349             : 
    3350        4247 :             shift = add( exp, sub( *Q_bwe_exc, Q_White_exc16k ) );
    3351             : 
    3352             :             /* mixing of LB and gaussian excitation in the first half of the frame */
    3353      683767 :             FOR( k = 0; k < L_FRAME16k / 2; k++ )
    3354             :             {
    3355             :                 /* exc16kWhtnd[k] = (float)fact * (White_exc16k[k] * scale) + (float)(1 - fact) * exc16kWhtnd[k]; */
    3356      679520 :                 L_tmp = L_shl_sat( L_mult( fact, mult_r( White_exc16k[k], scale ) ), shift ); // Q_bwe_exc+16
    3357      679520 :                 exc16kWhtnd[k] = mac_r_sat( L_tmp, sub( 32767, fact ), exc16kWhtnd[k] );      // Q_bwe_exc
    3358      679520 :                 move16();
    3359             : 
    3360      679520 :                 fact = add_sat( fact, step );         // Q15
    3361      679520 :                 scale = add_sat( scale, step_scale ); // exp
    3362             :             }
    3363             : 
    3364        4247 :             shift = sub( *Q_bwe_exc, Q_White_exc16k );
    3365             :             /* mixing of LB and gaussian excitation in the second half of the frame */
    3366      683767 :             FOR( ; k < L_FRAME16k; k++ )
    3367             :             {
    3368             :                 // exc16kWhtnd[k] = (float)new_fact * White_exc16k[k] + (float)(1 - new_fact) * exc16kWhtnd[k];
    3369      679520 :                 L_tmp = L_shl_sat( L_mult( new_fact, White_exc16k[k] ), shift );         // Q_bwe_exc+16
    3370      679520 :                 exc16kWhtnd[k] = mac_r( L_tmp, sub( 32767, new_fact ), exc16kWhtnd[k] ); // Q_bwe_exc
    3371      679520 :                 move16();
    3372             :             }
    3373             :         }
    3374             :         // preemph(exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph);
    3375        4283 :         PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); // Q_bwe_exc
    3376             :     }
    3377             :     ELSE
    3378             :     {
    3379      110826 :         test();
    3380      110826 :         IF( EQ_16( coder_type, UNVOICED ) || EQ_16( MSFlag, 1 ) )
    3381             :         {
    3382        7222 :             scale = 0;
    3383        7222 :             move16();
    3384             : 
    3385        7222 :             test();
    3386        7222 :             IF( pow1 != 0 && pow22 != 0 )
    3387             :             {
    3388        7222 :                 L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
    3389        7222 :                 scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */
    3390             :             }
    3391             : 
    3392     2318262 :             FOR( k = 0; k < L_FRAME16k; k++ )
    3393             :             {
    3394     2311040 :                 exc16kWhtnd[k] = mult_r_sat( White_exc16k[k], scale ); // Q_White_exc16k
    3395     2311040 :                 move16();
    3396             :             }
    3397             : 
    3398        7222 :             Scale_sig( exc16kWhtnd, L_FRAME16k, sub( *Q_bwe_exc, Q_White_exc16k ) ); // Q_bwe_exc
    3399             : 
    3400        7222 :             PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); // Q_bwe_exc
    3401             :             /* i/o: exc16kWhtnd  (Q_bwe_exc) */
    3402             :             /* i/o: tbe_premph (Q_bwe_exc) */
    3403             :         }
    3404             :         ELSE
    3405             :         {
    3406             :             Word16 nbSubFr, lSubFr;
    3407             :             Word16 tempQ15;
    3408             :             Word32 tempQ31;
    3409      103604 :             nbSubFr = NB_SUBFR16k;
    3410      103604 :             lSubFr = ( L_FRAME16k / NB_SUBFR16k );
    3411      103604 :             move16();
    3412      103604 :             move16();
    3413      103604 :             IF( LT_32( extl_brate, SWB_TBE_2k8 ) )
    3414             :             {
    3415       78546 :                 nbSubFr = NB_SUBFR;
    3416       78546 :                 move16();
    3417       78546 :                 lSubFr = ( L_FRAME16k / NB_SUBFR );
    3418       78546 :                 move16();
    3419             :             }
    3420      103604 :             k = 0;
    3421      103604 :             move16();
    3422      543078 :             FOR( i = 0; i < nbSubFr; i++ )
    3423             :             {
    3424      439474 :                 test();
    3425      439474 :                 IF( EQ_16( coder_type, VOICED ) && ( LT_32( extl_brate, SWB_TBE_2k8 ) ) )
    3426             :                 {
    3427       28164 :                     exp = 0;
    3428       28164 :                     move16();
    3429       28164 :                     tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */
    3430       28164 :                     temp = shl( tempQ15, exp );                 /* Q15 exc16kWhtnd scale factor */
    3431       28164 :                     exp = 0;
    3432       28164 :                     move16();
    3433       28164 :                     tempQ15 = Sqrt16( temp, &exp ); /* Q15 */
    3434       28164 :                     temp1 = shl( tempQ15, exp );    /* Q15 exc16kWhtnd scale factor */
    3435             : 
    3436             :                     /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */
    3437       28164 :                     temp = sub( MAX_16, temp );
    3438       28164 :                     tempQ31 = Mult_32_16( pow1, temp );
    3439       28164 :                     L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
    3440       28164 :                     temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
    3441             :                 }
    3442             :                 ELSE
    3443             :                 {
    3444             :                     /* Adjust noise mixing for formant sharpening filter */
    3445      411310 :                     tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac );
    3446             :                     /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */
    3447      411310 :                     vf_tmp = sub( MAX_16, tempQ15 );
    3448      411310 :                     vf_tmp = mult( voice_factors[i], vf_tmp );
    3449             : 
    3450      411310 :                     exp = 0;
    3451      411310 :                     move16();
    3452      411310 :                     tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */
    3453      411310 :                     temp1 = shl( tempQ15, exp );      /* Q15 exc16kWhtnd scale factor */
    3454             : 
    3455             :                     /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */
    3456      411310 :                     temp = sub( MAX_16, vf_tmp );
    3457      411310 :                     tempQ31 = Mult_32_16( pow1, temp );
    3458      411310 :                     L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
    3459      411310 :                     temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
    3460             :                 }
    3461             : 
    3462      439474 :                 shift = sub( *Q_bwe_exc, Q_White_exc16k );
    3463    33592754 :                 FOR( j = 0; j < lSubFr; j++ )
    3464             :                 {
    3465             :                     /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */
    3466    33153280 :                     L_tmp = L_shl_sat( L_mult( temp2, White_exc16k[k + j] ), shift );   // 16+(Q_bwe_exc)
    3467    33153280 :                     exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] ); // Q_bwe_exc
    3468    33153280 :                     move16();
    3469             :                 }
    3470      439474 :                 k = add( k, lSubFr );
    3471             : 
    3472             :                 /* estimate the pre-emph factor */
    3473      439474 :                 tempQ15 = sub( MAX_16, voice_factors[i] );
    3474      439474 :                 exp = 0;
    3475      439474 :                 move16();
    3476      439474 :                 temp = Sqrt16( tempQ15, &exp );
    3477      439474 :                 temp = shl( temp, sub( exp, 1 ) );
    3478             : 
    3479      439474 :                 temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */
    3480      439474 :                 temp = div_s( temp, temp2 );           /* Q15 */
    3481      439474 :                 temp = mult_r( PREEMPH_FAC, temp );
    3482             : 
    3483      439474 :                 PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph ); // Q_bwe_exc
    3484             :                 /* exc16kWhtnd: Q_bwe_exc;
    3485             :                    tbe_premph: Q_bwe_exc*/
    3486             :             }
    3487             :         }
    3488             :     }
    3489             : 
    3490      115109 :     IF( LT_32( extl_brate, SWB_TBE_2k8 ) )
    3491             :     {
    3492       90051 :         syn_filt_fx( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 );
    3493             :         /* i: exc16kWhtnd in Q_bwe_exc */
    3494             :         /* o: excSHB in Q_bwe_exc */
    3495             :     }
    3496             :     ELSE
    3497             :     {
    3498       25058 :         set16_fx( zero_mem, 0, LPC_SHB_ORDER );
    3499             : 
    3500       25058 :         syn_filt_fx( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 );
    3501       25058 :         tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
    3502       25058 :         Scale_sig( tempSHB, 80, tmp );
    3503       25058 :         syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    3504       25058 :         move32();
    3505       25058 :         syn_shb_ener_sf_q[0] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
    3506       25058 :         move16();
    3507             : 
    3508       25058 :         syn_filt_fx( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 );
    3509       25058 :         tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
    3510       25058 :         Scale_sig( tempSHB, 80, tmp );
    3511       25058 :         syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    3512       25058 :         move32();
    3513       25058 :         syn_shb_ener_sf_q[1] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
    3514       25058 :         move16();
    3515             : 
    3516       25058 :         syn_filt_fx( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 );
    3517       25058 :         tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
    3518       25058 :         Scale_sig( tempSHB, 80, tmp );
    3519       25058 :         syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    3520       25058 :         move32();
    3521       25058 :         syn_shb_ener_sf_q[2] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
    3522       25058 :         move16();
    3523             : 
    3524       25058 :         syn_filt_fx( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 );
    3525       25058 :         tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
    3526       25058 :         Scale_sig( tempSHB, 80, tmp );
    3527       25058 :         syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    3528       25058 :         move32();
    3529       25058 :         syn_shb_ener_sf_q[3] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
    3530       25058 :         move16();
    3531             : 
    3532       25058 :         tmp2 = s_min( s_min( syn_shb_ener_sf_q[0], syn_shb_ener_sf_q[1] ), s_min( syn_shb_ener_sf_q[3], syn_shb_ener_sf_q[2] ) );
    3533       25058 :         syn_shb_ener_sf[0] = L_shl( syn_shb_ener_sf[0], sub( tmp2, syn_shb_ener_sf_q[0] ) );
    3534       25058 :         move32();
    3535       25058 :         syn_shb_ener_sf[1] = L_shl( syn_shb_ener_sf[1], sub( tmp2, syn_shb_ener_sf_q[1] ) );
    3536       25058 :         move32();
    3537       25058 :         syn_shb_ener_sf[2] = L_shl( syn_shb_ener_sf[2], sub( tmp2, syn_shb_ener_sf_q[2] ) );
    3538       25058 :         move32();
    3539       25058 :         syn_shb_ener_sf[3] = L_shl( syn_shb_ener_sf[3], sub( tmp2, syn_shb_ener_sf_q[3] ) );
    3540       25058 :         move32();
    3541             : 
    3542             :         /* i: exc16kWhtnd       in Q_bwe_exc        */
    3543             :         /* o: tempSHB           in Q_bwe_exc        */
    3544             :         /* o: syn_shb_ener_sf   in tmp2  */
    3545       25058 :         IF( LE_32( bitrate, MAX_ACELP_BRATE ) )
    3546             :         {
    3547       25058 :             L_tmp = sum32_fx( syn_shb_ener_sf, 4 );
    3548             : 
    3549             :             /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */
    3550       25058 :             tmp = shl( Q_shb, 1 );
    3551       25058 :             L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */
    3552             : 
    3553       25058 :             *Q_bwe_exc = sub( *Q_bwe_exc, exp );
    3554       25058 :             move16(); /* compensate for the exp shift */
    3555       25058 :             tmp2 = add( prev_Q_bwe_syn, n_mem2 );
    3556       25058 :             IF( GT_16( *Q_bwe_exc, tmp2 ) )
    3557             :             {
    3558           0 :                 L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) );
    3559           0 :                 *Q_bwe_exc = tmp2;
    3560           0 :                 move16();
    3561             :             }
    3562     8043618 :             FOR( i = 0; i < L_FRAME16k; i++ )
    3563             :             {
    3564     8018560 :                 L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */
    3565     8018560 :                 exc16kWhtnd[i] = round_fx( L_tmp3 );           /* *Q_bwe_exc - exp */
    3566     8018560 :                 move16();
    3567             :             }
    3568             :         }
    3569             :         /* i: L_tmp2 in (Q31-exp)                       */
    3570             :         /* i: exc16kWhtnd in Q_bwe_exc            */
    3571             :         /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp)   */
    3572             : 
    3573             :         /* Rescale the past memories: LP synth and SHB look ahead buffers */
    3574       25058 :         tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn );
    3575      275638 :         FOR( i = 0; i < LPC_SHB_ORDER; i++ )
    3576             :         {
    3577      250580 :             state_lpc_syn[i] = shl_sat( state_lpc_syn[i], tmp );
    3578      250580 :             move16();
    3579             :         }
    3580      526218 :         FOR( i = -L_SHB_LAHEAD; i < 0; i++ )
    3581             :         {
    3582      501160 :             excSHB[i] = shl_sat( excSHB[i], tmp );
    3583      501160 :             move16();
    3584             :         }
    3585             :         /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */
    3586             : 
    3587       25058 :         syn_filt_fx( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 );
    3588       25058 :         syn_filt_fx( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 );
    3589       25058 :         syn_filt_fx( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 );
    3590       25058 :         syn_filt_fx( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 );
    3591             :         /* i: exc16kWhtnd in (Q_bwe_exc) */
    3592             :         /* o: excSHB in (Q_bwe_exc) */
    3593             :     }
    3594             : 
    3595      115109 :     IF( EQ_16( extl, FB_TBE ) )
    3596             :     {
    3597       43652 :         tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb );
    3598       43652 :         Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp );
    3599       43652 :         Scale_sig( fb_tbe_demph, 1, tmp );
    3600       43652 :         syn_filt_fx( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 );
    3601             :         /* i: White_exc16k_FB       in (Q_bwe_exc_fb) */
    3602             :         /* o: White_exc16k_FB_temp  in (Q_bwe_exc_fb) */
    3603             : 
    3604      480172 :         FOR( i = 0; i < 10; i++ )
    3605             :         {
    3606    14405160 :             FOR( j = 0; j < 32; ++j )
    3607             :             {
    3608    13968640 :                 White_exc16k_FB_temp[i * 32 + j] = mult_r_sat( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] );
    3609    13968640 :                 move16();
    3610             :             }
    3611             :         }
    3612             : 
    3613       43652 :         *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 );
    3614       43652 :         move16(); /**Q_bwe_exc_fb  +35 +1 -16*/
    3615       43652 :         flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k );
    3616             : 
    3617       43652 :         deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph );
    3618             :     }
    3619             :     ELSE
    3620             :     {
    3621       71457 :         set16_fx( White_exc16k_FB, 0, L_FRAME16k );
    3622             :     }
    3623             : 
    3624      115109 :     *prev_pow_exc16kWhtnd = L_shr_sat( pow1, Q_pow1 ); // power goes above MAX_32
    3625      115109 :     *prev_mix_factor = mix_factor;
    3626      115109 :     move32();
    3627      115109 :     move16();
    3628             : 
    3629      115109 :     return;
    3630             : }
    3631             : 
    3632      102554 : void GenShapedSHBExcitation_ivas_dec_fx(
    3633             :     Word16 *excSHB,                      /* o : synthesized shaped shb excitation Q_bwe_exc*/
    3634             :     const Word16 *lpc_shb,               /* i : lpc coefficients Q12*/
    3635             :     Word16 *White_exc16k_FB,             /* o : white excitation for the Fullband extension Q_bwe_exc */
    3636             :     Word32 *mem_csfilt,                  /* i/o: memory */
    3637             :     Word16 *mem_genSHBexc_filt_down_shb, /* i/o: memory */
    3638             :     Word16 *state_lpc_syn,               /* i/o: memory */
    3639             :     const Word16 coder_type,             /* i : coding type */
    3640             :     const Word16 *bwe_exc_extended,      /* i : bwidth extended excitation */
    3641             :     Word16 bwe_seed[],                   /* i/o: random number generator seed */
    3642             :     Word16 voice_factors[],              /* i : voicing factor*/
    3643             :     const Word16 extl,                   /* i : extension layer */
    3644             :     Word16 *tbe_demph,                   /* i/o: de-emphasis memory */
    3645             :     Word16 *tbe_premph,                  /* i/o: pre-emphasis memory */
    3646             :     Word16 *lpc_shb_sf,                  /* i:   LP coefficients  */
    3647             :     const Word32 shb_ener_sf_32,         /* i: input shb ener, Q31 */
    3648             :     Word16 *shb_res_gshape,              /* i: input res gain shape, Q14 */
    3649             :     Word16 *shb_res,
    3650             :     Word16 *vf_ind,
    3651             :     const Word16 formant_fac,  /* i   : Formant sharpening factor [0..1] */
    3652             :     Word16 fb_state_lpc_syn[], /* i/o: memory */
    3653             :     Word16 *fb_tbe_demph,      /* i/o: fb de-emphasis memory */
    3654             :     Word16 *Q_bwe_exc,
    3655             :     Word16 *Q_bwe_exc_fb,
    3656             :     const Word16 Q_shb,
    3657             :     Word16 n_mem2,                /* i :  n_mem2 scale factor to adjust 24.4/32kbps memories         */
    3658             :     Word16 prev_Q_bwe_syn,        /* i :  st_fx->prev_Q_bwe_syn                                      */
    3659             :     const Word32 bitrate,         /* i  : bitrate                                                    */
    3660             :     const Word16 prev_bfi,        /* i  : previous frame was concealed                               */
    3661             :     const Word16 element_mode,    /* i  : element mode                                               */
    3662             :     const Word16 flag_ACELP16k,   /* i  : ACELP@16kHz flag                                           */
    3663             :     Word16 *nlExc16k,             /* i/o: NL exc for IC-BWE                                          */
    3664             :     Word16 *mixExc16k,            /* i/o: exc spreading for IC-BWE                                   */
    3665             :     const Word32 extl_brate,      /* i  : extension layer bitarte                                    */
    3666             :     const Word16 MSFlag,          /* i  : Multi Source flag                                          */
    3667             :     Word16 EnvSHBres_4k[],        /* i/o: TD envelope of the SHB residual signal                     */
    3668             :     Word32 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame    */
    3669             :     Word16 *prev_mix_factor,      /* i/o: mixing factor in the previous frame                        */
    3670             :     Word16 *Env_error,            /* o  : error in SHB residual envelope modelling                Q0 */
    3671             :     Word16 Env_error_part[]       /* o  : per-segment error in SHB residual envelope modelling    Q0 */
    3672             : )
    3673             : {
    3674             :     Word16 i, j, k;
    3675             :     Word16 wht_fil_mem[LPC_WHTN_ORDER];
    3676             :     Word16 lpc_whtn[LPC_WHTN_ORDER + 1];
    3677             :     Word16 R_h[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech MSB */
    3678             :     Word16 R_l[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech LSB */
    3679             :     Word16 Q_R;
    3680             :     Word32 LepsP[LPC_WHTN_ORDER + 1];
    3681             :     Word16 exc32k[L_FRAME32k], exc16k[L_FRAME16k];
    3682             :     Word32 pow1, pow22;
    3683             :     Word16 scale, temp1, temp2, temp3;
    3684             :     Word16 Q_White_exc16k;
    3685             :     Word16 excTmp2[L_FRAME16k];
    3686             :     Word16 *White_exc16k;
    3687             :     Word16 excNoisyEnv[L_FRAME16k];
    3688      102554 :     Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */
    3689      102554 :     move16();
    3690      102554 :     Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */
    3691      102554 :     move16();
    3692      102554 :     move16();
    3693             :     Word16 varEnvShape;
    3694      102554 :     Word16 fb_deemph_fac = 15729; /*0.48f in Q15  */
    3695             :     Word16 exc16kWhtnd[L_FRAME16k];
    3696             : 
    3697             :     Word32 L_tmp;
    3698             :     Word16 vf_tmp;
    3699      102554 :     Word16 tmp, exp, tmp2 = 0;
    3700      102554 :     move16();
    3701             :     Word16 voiceFacEst[NB_SUBFR16k];
    3702             :     Word16 zero_mem[LPC_SHB_ORDER];
    3703             :     Word32 syn_shb_ener_sf[4];
    3704             :     Word16 syn_shb_ener_sf_q[4];
    3705             :     Word16 tempSHB[80];
    3706             :     Word16 Q_pow1, Q_pow22;
    3707             : 
    3708             :     Word32 L_tmp2, L_tmp3, L_tmp4;
    3709             :     Word16 temp;
    3710             : 
    3711             :     Word16 White_exc16k_FB_temp[L_FRAME16k];
    3712             :     Word32 White_exc16k_32[L_FRAME16k];
    3713             :     Word16 White_exc16k_tmp[L_FRAME16k];
    3714             :     Word16 Q_temp;
    3715             :     Word16 prev_Q_bwe_exc_fb, Q_exc16kWhtnd;
    3716             :     Word16 chk1;
    3717             :     Word32 chk2;
    3718      102554 :     chk1 = 0;
    3719      102554 :     chk2 = 0;
    3720      102554 :     move16();
    3721      102554 :     move32();
    3722             : 
    3723             :     Word16 alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k];
    3724             :     Word16 cbsize;
    3725             :     Word16 mix_factor, old_fact, new_fact, fact, old_scale, new_scale, step_scale;
    3726             :     Word32 c0, c1, c2, c3, c4, c5, den;
    3727             :     Word16 g1, g2, g, g1_e, g2_e, g_e, den_e, shift, tmp_e, tmp1_e;
    3728             :     Word16 EnvWhiteExc16k[L_FRAME16k], EnvExc16kWhtnd[L_FRAME16k];
    3729      102554 :     Word16 EnvWhiteExc16k_4k[L_FRAME4k] = { 0 }, EnvExc16kWhtnd_4k[L_FRAME4k] = { 0 };
    3730             :     Word16 flag_plosive;
    3731             :     Word16 delta;
    3732             :     Word32 c0_part[NUM_SHB_SUBGAINS], c1_part[NUM_SHB_SUBGAINS], c2_part[NUM_SHB_SUBGAINS], c3_part[NUM_SHB_SUBGAINS], c4_part[NUM_SHB_SUBGAINS], c5_part[NUM_SHB_SUBGAINS];
    3733             :     Word64 W_tmp;
    3734             : 
    3735      102554 :     mix_factor = 0; /* Q15 */
    3736      102554 :     move16();
    3737             : 
    3738      102554 :     set16_fx( zero_mem, 0, LPC_SHB_ORDER );
    3739      102554 :     set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER );
    3740    32919834 :     FOR( i = 0; i < L_FRAME32k; i = i + 2 )
    3741             :     {
    3742    32817280 :         exc32k[i] = negate( bwe_exc_extended[i] ); // Q_bwe_exc
    3743    32817280 :         move16();
    3744    32817280 :         exc32k[i + 1] = bwe_exc_extended[i + 1]; // Q_bwe_exc
    3745    32817280 :         move16();
    3746             :     }
    3747             : 
    3748             :     /* Decimate by 2 */
    3749      102554 :     Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k ); // Q_bwe_exc
    3750             :     /* i: exc32k in Q_bwe_exc */
    3751             :     /* o: exc16k in Q_bwe_exc */
    3752             : 
    3753      102554 :     autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 ); // Q_R
    3754             :     /* Ensure R[0] isn't zero when entering Levinson Durbin */
    3755      102554 :     R_l[0] = s_max( R_l[0], 1 );
    3756      102554 :     move16();
    3757      512770 :     FOR( i = 1; i <= LPC_WHTN_ORDER; i++ )
    3758             :     {
    3759      410216 :         L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
    3760      410216 :         L_Extract( L_tmp, &R_h[i], &R_l[i] ); // Q_R
    3761             :     }
    3762      102554 :     E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL );
    3763      102554 :     Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); // Q12
    3764      102554 :     fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 );    // Q_bwe_exc
    3765             : 
    3766             :     /* i: exc16k in Q_bwe_exc */
    3767             :     /* o: exc16kWhtnd in Q_bwe_exc */
    3768             : 
    3769      102554 :     IF( GE_32( extl_brate, SWB_TBE_2k8 ) )
    3770             :     {
    3771       21546 :         temp2 = 0;
    3772       21546 :         move16();
    3773      107730 :         FOR( j = 0; j < 4; j++ )
    3774             :         {
    3775       86184 :             temp1 = shb_res_gshape[j];
    3776       86184 :             move16();
    3777     6980904 :             FOR( i = 0; i < 80; i++ )
    3778             :             {
    3779     6894720 :                 exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); // Q_bwe_exc
    3780     6894720 :                 move16();
    3781             :                 /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */
    3782             :             }
    3783       86184 :             temp2 = add( temp2, 80 );
    3784             :         }
    3785             :     }
    3786             : 
    3787             :     /* Estimate pow1 associated with Low band nonlinear extended excitation */
    3788             :     /* pow1=0.00001f */
    3789      102554 :     tmp = sub( shl( *Q_bwe_exc, 1 ), 31 );
    3790      102554 :     pow1 = L_shl_sat( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */
    3791    32919834 :     FOR( k = 0; k < L_FRAME16k; k++ )
    3792             :     {
    3793             :         /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/
    3794    32817280 :         excTmp2[k] = abs_s( exc16kWhtnd[k] );
    3795    32817280 :         move16();
    3796    32817280 :         chk1 = s_or( chk1, exc16kWhtnd[k] );
    3797             : 
    3798             :         /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */
    3799    32817280 :         pow1 = L_mac0_sat( pow1, exc16kWhtnd[k], exc16kWhtnd[k] ); /* 2*Q_bwe_exc */
    3800             :     }
    3801      102554 :     Q_pow1 = shl( *Q_bwe_exc, 1 );
    3802             : 
    3803      102554 :     test();
    3804             : 
    3805      102554 :     IF( flag_ACELP16k == 0 )
    3806             :     {
    3807             :         /* varEnvShape = mean_fx(voice_factors, 4); */
    3808             :         /* unroll the loop */
    3809       48570 :         L_tmp = L_mult( voice_factors[0], 8192 /*0.25 in Q15 */ );
    3810       48570 :         L_tmp = L_mac( L_tmp, voice_factors[1], 8192 /*0.25 in Q15 */ );
    3811       48570 :         L_tmp = L_mac( L_tmp, voice_factors[2], 8192 /*0.25 in Q15 */ );
    3812       48570 :         varEnvShape = mac_r( L_tmp, voice_factors[3], 8192 /*0.25 in Q15 */ ); /* varEnvShape in Q15 */
    3813             :     }
    3814             :     ELSE /* 16k core */
    3815             :     {
    3816             :         /* varEnvShape = mean_fx(voice_factors, 5); */
    3817             :         /* unroll the loop */
    3818       53984 :         L_tmp = L_mult( voice_factors[0], 6554 /*0.2 in Q15 */ );
    3819       53984 :         L_tmp = L_mac( L_tmp, voice_factors[1], 6554 /*0.2 in Q15 */ );
    3820       53984 :         L_tmp = L_mac( L_tmp, voice_factors[2], 6554 /*0.2 in Q15 */ );
    3821       53984 :         L_tmp = L_mac( L_tmp, voice_factors[3], 6554 /*0.2 in Q15 */ );
    3822       53984 :         varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 /*0.2 in Q15 */ ); /* varEnvShape in Q15 */
    3823             :     }
    3824             : 
    3825      102554 :     IF( EQ_16( extl, FB_TBE ) )
    3826             :     {
    3827             :         /*pow(varEnvShape,3) */
    3828       39990 :         tmp = mult_r( varEnvShape, varEnvShape );
    3829       39990 :         tmp = mult_r( tmp, varEnvShape );
    3830             : 
    3831             :         /* max_val((0.68f - (float)pow(varEnvShape, 3)), 0.48f); */
    3832       39990 :         fb_deemph_fac = sub( 22282 /*0.68f Q15*/, tmp );
    3833       39990 :         fb_deemph_fac = s_max( fb_deemph_fac, 15729 /*0.48f Q15*/ );
    3834             :     }
    3835             : 
    3836             :     /*varEnvShape = 1.09875f - 0.49875f * varEnvShape; */
    3837      102554 :     varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape );
    3838             : 
    3839             :     /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */
    3840      102554 :     varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ );
    3841      102554 :     varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ );
    3842      102554 :     varEnvShape = shl( varEnvShape, 1 );
    3843      102554 :     csfilt_num2[0] = sub( MAX_16, varEnvShape ); // Q15
    3844      102554 :     move16();
    3845      102554 :     neg_csfilt_den2[1] = varEnvShape; // Q15
    3846      102554 :     move16();
    3847             : 
    3848      102554 :     test();
    3849      102554 :     test();
    3850      102554 :     test();
    3851             : 
    3852      102554 :     IF( EQ_16( element_mode, EVS_MONO ) && *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) )
    3853             :     {
    3854             :         /* pre-init smoothing filter to avoid energy drop outs */
    3855           0 :         L_tmp = L_mult( excTmp2[0], 1638 );
    3856           0 :         FOR( i = 1; i < L_SUBFR16k / 4; i++ )
    3857             :         {
    3858           0 :             L_tmp = L_mac( L_tmp, excTmp2[i], 1638 ); /*1638 = 1/20 in Q15*/
    3859             :         }
    3860             :         /*L_tmp = sum(excTmp2, L_SUBFR16k/4)*(1/20) where L_SUBFR16k/4 =20 */
    3861             : 
    3862             :         /* don't apply for FB in case the FB start-frame was potentially lost - White_exc16k is very sensitive to enery mismatch between enc - dec */
    3863             :         /* rather stick to the more conservative approach, to avoid potential clippings */
    3864           0 :         test();
    3865           0 :         IF( !( prev_bfi && EQ_16( extl, FB_TBE ) ) )
    3866             :         {
    3867             :             /* use weak smoothing for 1st frame after switching to make filter recover more quickly */
    3868           0 :             varEnvShape = 26214 /*0.8f Q15*/;
    3869           0 :             move16();
    3870           0 :             csfilt_num2[0] = sub( MAX_16, varEnvShape );
    3871           0 :             move16();
    3872           0 :             neg_csfilt_den2[1] = varEnvShape;
    3873           0 :             move16();
    3874             :         }
    3875             : 
    3876           0 :         *mem_csfilt = Mult_32_16( L_tmp, varEnvShape );
    3877           0 :         move32();
    3878             :     }
    3879             : 
    3880      102554 :     IF( MSFlag > 0 )
    3881             :     {
    3882             :         // varEnvShape = 0.995f;
    3883        5025 :         varEnvShape = 32604;
    3884        5025 :         move16();
    3885        5025 :         csfilt_num2[0] = 32768 - varEnvShape;
    3886             :         // csfilt_num2[0] = sub( 32767, varEnvShape );
    3887        5025 :         move16();
    3888        5025 :         neg_csfilt_den2[1] = varEnvShape;
    3889        5025 :         move16();
    3890             :     }
    3891             : 
    3892      102554 :     White_exc16k = exc16k;
    3893      102554 :     move16();
    3894      102554 :     Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc );
    3895      102554 :     IF( *mem_csfilt )
    3896             :     {
    3897       67708 :         Q_excTmp2 = s_min( Q_excTmp2, sub( add( norm_l( *mem_csfilt ), *Q_bwe_exc ), 1 ) );
    3898             :     }
    3899      102554 :     test();
    3900             :     /* Track the low band envelope */
    3901      102554 :     IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) )
    3902             :     {
    3903       27918 :         test();
    3904       27918 :         IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) )
    3905             :         {
    3906       23812 :             mem_csfilt_left = 0;
    3907       23812 :             mem_csfilt_right = 0;
    3908       23812 :             move16();
    3909       23812 :             move16();
    3910     7643652 :             FOR( k = 0; k < L_FRAME16k; k++ )
    3911             :             {
    3912             :                 // excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k];
    3913     7619840 :                 excNoisyEnvLeft[k] = add( mem_csfilt_left, mult_r( csfilt_num2[0], shl( excTmp2[k], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2
    3914     7619840 :                 move16();
    3915             :                 // mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k];
    3916     7619840 :                 mem_csfilt_left = mult_r( neg_csfilt_den2[1], excNoisyEnvLeft[k] ); // Q_excTmp2
    3917             :                 // excNoisyEnvRight[L_FRAME16k - k - 1] = mem_csfilt_right + csfilt_num2[0] * excTmp2[L_FRAME16k - k - 1];
    3918     7619840 :                 excNoisyEnvRight[L_FRAME16k - k - 1] = add( mem_csfilt_right, mult_r( csfilt_num2[0], shl( excTmp2[L_FRAME16k - k - 1], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2
    3919     7619840 :                 move16();
    3920             :                 // mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1];
    3921     7619840 :                 mem_csfilt_right = mult_r( neg_csfilt_den2[1], excNoisyEnvRight[L_FRAME16k - k - 1] ); // Q_excTmp2
    3922             :             }
    3923             : 
    3924       23812 :             alpha = 0;
    3925       23812 :             move16();
    3926             :             // step = 1.0f / L_FRAME16k;
    3927       23812 :             step = 102; // Q15
    3928       23812 :             move16();
    3929     7643652 :             FOR( k = 0; k < L_FRAME16k; k++ )
    3930             :             {
    3931             :                 // excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + (1 - alpha) * excNoisyEnvRight[k];
    3932     7619840 :                 excNoisyEnv[k] = add( mult_r( alpha, excNoisyEnvLeft[k] ), mult_r( sub( 32767, alpha ), excNoisyEnvRight[k] ) ); // Q_excTmp2
    3933     7619840 :                 move16();
    3934     7619840 :                 alpha = add( alpha, step );
    3935             :             }
    3936             :         }
    3937             :     }
    3938             :     ELSE
    3939             : 
    3940             :     {
    3941             :         /* Track the low band envelope */
    3942       74636 :         L_tmp = L_shl( *mem_csfilt, sub( Q_excTmp2, *Q_bwe_exc ) );
    3943       74636 :         move32();
    3944    23958156 :         FOR( i = 0; i < L_FRAME16k; i++ )
    3945             :         {
    3946    23883520 :             excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], shl( excTmp2[i], sub( Q_excTmp2, *Q_bwe_exc ) ) );
    3947    23883520 :             move16();
    3948             :             /* Work-around to avoid 0s for very small value*/
    3949    23883520 :             test();
    3950    23883520 :             test();
    3951    23883520 :             test();
    3952    23883520 :             test();
    3953    23883520 :             if ( excNoisyEnv[i] == 0 && ( L_tmp != 0 || ( csfilt_num2[0] != 0 && excTmp2[i] != 0 ) ) )
    3954             :             {
    3955        5133 :                 excNoisyEnv[i] = 1;
    3956        5133 :                 move16();
    3957             :             }
    3958             :             /* excNoisyEnv : Q_excTmp2,
    3959             :              *mem_csfilt: Q_excTmp2+16, excTmp2: Q_excTmp2, csfilt_num2[0] Q_excTmp2  */
    3960    23883520 :             L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_excTmp2 + 16 */
    3961             :         }
    3962       74636 :         *mem_csfilt = L_shr( L_tmp, sub( Q_excTmp2, *Q_bwe_exc ) );
    3963       74636 :         move32();
    3964             :     }
    3965      102554 :     test();
    3966      102554 :     IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    3967        4106 :     {
    3968             :         /* generate gaussian (white) excitation */
    3969     1318026 :         FOR( k = 0; k < L_FRAME16k; k++ )
    3970             :         {
    3971     1313920 :             White_exc16k[k] = own_random( &bwe_seed[0] );
    3972     1313920 :             move16();
    3973             :         }
    3974             : 
    3975             :         /* normalize the amplitude of the gaussian excitation to that of the LB exc. */
    3976        4106 :         Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT_IN_Q49;
    3977        4106 :         move32();
    3978        4106 :         move32();
    3979        4106 :         pow22 = POW_EXC16k_WHTND_FX;
    3980        4106 :         Q_pow22 = -6;
    3981        4106 :         move16();
    3982             :         // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), White_exc16k, L_FRAME16k);
    3983        4106 :         Word16 pow1_exp = sub( Q31, Q_pow1 );
    3984        4106 :         Word32 temp_pow = Sqrt32( pow1, &pow1_exp );
    3985        4106 :         temp_pow = Mpy_32_32( temp_pow, pow22_inv );
    3986             :         /*Word16 out_exp;
    3987             :         Word32 temp_pow1 = root_a_over_b_fx(pow1, Q_pow1, pow22, Q_pow22, &out_exp);
    3988             :         temp_pow1 = L_shl(temp_pow1, out_exp);*/
    3989             :         // v_multc_fixed_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k);
    3990        4106 :         L_tmp = 0;
    3991        4106 :         move32();
    3992        4106 :         shift = getScaleFactor16( White_exc16k, L_FRAME16k );
    3993     1318026 :         FOR( k = 0; k < L_FRAME16k; k++ )
    3994             :         {
    3995     1313920 :             White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] );
    3996     1313920 :             move32();
    3997     1313920 :             White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], shift ) ); // Q_White_exc16k
    3998     1313920 :             move16();
    3999     1313920 :             L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
    4000             :         }
    4001        4106 :         Q_White_exc16k = add( shift, sub( 49 - 31, pow1_exp ) );
    4002        4106 :         Q_temp = norm_l( L_tmp );
    4003        4106 :         IF( L_tmp == 0 )
    4004             :         {
    4005           0 :             Q_temp = 31;
    4006           0 :             move16();
    4007             :         }
    4008             :     }
    4009             :     ELSE
    4010             :     {
    4011             :         /* create a random excitation - Reuse exc16k memory */
    4012       98448 :         White_exc16k = exc16k;
    4013       98448 :         move16();
    4014       98448 :         create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed );                        // Q5
    4015       98448 :         create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); // Q5
    4016             : 
    4017       98448 :         L_tmp = L_deposit_l( 0 );
    4018       98448 :         tmp = add( *Q_bwe_exc, 1 );
    4019    31601808 :         FOR( k = 0; k < L_FRAME16k; k++ )
    4020             :         {
    4021    31503360 :             L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_excTmp2)  +5 +1*/
    4022    31503360 :             White_exc16k_32[k] = L_tmp4;                        /* (Q_excTmp2)  +5 +1*/
    4023    31503360 :             move32();
    4024    31503360 :             L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
    4025             :         }
    4026       98448 :         Q_temp = norm_l( L_tmp );
    4027       98448 :         IF( L_tmp == 0 )
    4028             :         {
    4029          23 :             Q_temp = 31;
    4030          23 :             move16();
    4031             :         }
    4032             :         /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/
    4033             :         /* White_exc16k in Q6 */
    4034             : 
    4035             :         /* calculate pow22 */
    4036             :         /* pow22=0.00001f */
    4037       98448 :         tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 );
    4038       98448 :         Word64 sum = W_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(*Q_bwe_exc-NOISE_QADJ) */
    4039       98448 :         Q_White_exc16k = getScaleFactor32( White_exc16k_32, L_FRAME16k );
    4040    31601808 :         FOR( k = 0; k < L_FRAME16k; k++ )
    4041             :         {
    4042             : 
    4043    31503360 :             White_exc16k[k] = extract_h( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); // Q_excTmp2 + 6 + Q_White_exc16k - 16 ==> Q_excTmp2 + Q_White_exc16k - 10
    4044    31503360 :             chk2 = L_or( chk2, White_exc16k_32[k] );
    4045             :             /* i: excNoisyEnv in (Q_excTmp2)     */
    4046             :             /* i: White_exc16k  in Q6               */
    4047             :             /* o: White_exc16k in (Q_White_exc16k)  */
    4048             :             /* pow22 += White_exc16k[k] * White_exc16k[k]; */
    4049    31503360 :             sum = W_mac0_16_16( sum, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2 + Q_White_exc16k - 10)*/
    4050    31503360 :             move16();
    4051             :         }
    4052       98448 :         Q_pow22 = W_norm( sum );
    4053       98448 :         pow22 = W_extract_h( W_shl( sum, Q_pow22 ) ); // 2*(Q_excTmp2 + Q_White_exc16k - 10)+Q_pow22-32
    4054       98448 :         Q_pow22 = sub( add( Q_pow22, shl( sub( add( Q_White_exc16k, Q_excTmp2 ), 10 ), 1 ) ), 32 );
    4055       98448 :         Q_White_exc16k = add( Q_White_exc16k, sub( Q_excTmp2, 10 ) );
    4056             :     }
    4057             : 
    4058      102554 :     flag_plosive = 0;
    4059      102554 :     move16();
    4060      102554 :     test();
    4061      102554 :     test();
    4062      102554 :     test();
    4063      102554 :     IF( GE_32( extl_brate, SWB_TBE_2k8 ) || EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    4064             :     {
    4065       25652 :         IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */
    4066             :         {
    4067           0 :             test();
    4068           0 :             IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    4069             :             {
    4070           0 :                 FOR( k = 0; k < L_FRAME16k; k++ )
    4071             :                 {
    4072           0 :                     White_exc16k_tmp[k] = round_fx( L_shl( White_exc16k_32[k], *Q_bwe_exc ) );
    4073           0 :                     move16();
    4074             :                 }
    4075             : 
    4076             :                 /* calculate TD envelopes of exc16kWhtnd and White_exc16k */
    4077           0 :                 find_td_envelope_fx( White_exc16k_tmp, L_FRAME16k, 20, NULL, EnvWhiteExc16k ); /* Q_bwe_exc */
    4078           0 :                 find_td_envelope_fx( exc16kWhtnd, L_FRAME16k, 20, NULL, EnvExc16kWhtnd );      /* Q_bwe_exc */
    4079             : 
    4080           0 :                 FOR( k = 0; k < L_FRAME4k; k++ )
    4081             :                 {
    4082           0 :                     EnvWhiteExc16k_4k[k] = EnvWhiteExc16k[4 * k]; /* Q_bwe_exc */
    4083           0 :                     move16();
    4084           0 :                     EnvExc16kWhtnd_4k[k] = EnvExc16kWhtnd[4 * k]; /* Q_bwe_exc */
    4085           0 :                     move16();
    4086             :                 }
    4087             : 
    4088             :                 /* calculate the optimal mix factor */
    4089           0 :                 c0 = c1 = c2 = c3 = c4 = c5 = 0; /* Q0 */
    4090           0 :                 move32();
    4091           0 :                 move32();
    4092           0 :                 move32();
    4093           0 :                 move32();
    4094           0 :                 move32();
    4095           0 :                 move32();
    4096             : 
    4097           0 :                 temp1 = add( shl( *Q_bwe_exc, 1 ), 1 );
    4098           0 :                 temp2 = add( add( Q_shb, *Q_bwe_exc ), 1 );
    4099           0 :                 temp3 = add( shl( Q_shb, 1 ), 1 );
    4100           0 :                 FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ )
    4101             :                 {
    4102             :                     // c0_part[i] = sum2_f( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
    4103           0 :                     c0_part[i] = L_shr( sum2_fx( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */
    4104           0 :                     move32();
    4105             :                     // c1_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
    4106           0 :                     c1_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */
    4107           0 :                     move32();
    4108             :                     // c2_part[i] = sum2_f( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
    4109           0 :                     c2_part[i] = L_shr( sum2_fx( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */
    4110           0 :                     move32();
    4111             :                     // c3_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
    4112           0 :                     c3_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */
    4113           0 :                     move32();
    4114             :                     // c4_part[i] = 2.0f * dotp( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
    4115           0 :                     c4_part[i] = L_shr( Dot_product( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), sub( temp1, 1 ) ); /* Q0 */
    4116           0 :                     move32();
    4117             :                     // c5_part[i] = sum2_f( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
    4118           0 :                     c5_part[i] = L_shr( sum2_fx( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp3 ); /* Q0 */
    4119           0 :                     move32();
    4120             : 
    4121           0 :                     c0 = L_add( c0, c0_part[i] );
    4122           0 :                     c1 = L_add( c1, c1_part[i] );
    4123           0 :                     c2 = L_add( c2, c2_part[i] );
    4124           0 :                     c3 = L_add( c3, c3_part[i] );
    4125           0 :                     c4 = L_add( c4, c4_part[i] );
    4126           0 :                     c5 = L_add( c5, c5_part[i] );
    4127             :                 }
    4128             : 
    4129             :                 // den = 4.0f * c0 * c2 - c4 * c4;
    4130           0 :                 W_tmp = W_sub( W_shl( W_mult0_32_32( c0, c2 ), 2 ), W_mult0_32_32( c4, c4 ) );
    4131           0 :                 den_e = 63;
    4132           0 :                 move16();
    4133           0 :                 shift = W_norm( W_tmp );
    4134           0 :                 den = W_extract_h( W_shl( W_tmp, shift ) );
    4135           0 :                 den_e = sub( den_e, shift );
    4136             : 
    4137           0 :                 IF( den == 0 )
    4138             :                 {
    4139           0 :                     den = 1;
    4140           0 :                     move32();
    4141           0 :                     den_e = 31;
    4142           0 :                     move16();
    4143             :                 }
    4144             : 
    4145             :                 // g1 = ( c3 * c4 - 2 * c1 * c2 ) / den;
    4146           0 :                 W_tmp = W_sub( W_mult0_32_32( c3, c4 ), W_shl( W_mult0_32_32( c1, c2 ), 1 ) );
    4147           0 :                 g1_e = 63;
    4148           0 :                 move16();
    4149           0 :                 shift = W_norm( W_tmp );
    4150           0 :                 L_tmp = W_extract_h( W_shl( W_tmp, shift ) );
    4151           0 :                 g1_e = sub( g1_e, shift );
    4152             : 
    4153           0 :                 g1 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e );
    4154           0 :                 g1_e = sub( add( tmp_e, g1_e ), den_e );
    4155             : 
    4156             :                 // g2 = ( c1 * c4 - 2 * c0 * c3 ) / den;
    4157           0 :                 W_tmp = W_sub( W_mult0_32_32( c1, c4 ), W_shl( W_mult0_32_32( c0, c3 ), 1 ) );
    4158           0 :                 g2_e = 63;
    4159           0 :                 move16();
    4160           0 :                 shift = W_norm( W_tmp );
    4161           0 :                 L_tmp = W_extract_h( W_shl( W_tmp, shift ) );
    4162           0 :                 g2_e = sub( g2_e, shift );
    4163             : 
    4164           0 :                 g2 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e );
    4165           0 :                 g2_e = sub( add( tmp_e, g2_e ), den_e );
    4166             : 
    4167             :                 // *Env_error = 0.0f;
    4168           0 :                 *Env_error = 0;
    4169           0 :                 move16();
    4170           0 :                 flag_plosive = 0;
    4171           0 :                 move16();
    4172           0 :                 FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ )
    4173             :                 {
    4174             :                     // Env_error_part[i] = c5_part[i] + g1 * g1 * c0_part[i] + g1 * c1_part[i] + g2 * g2 * c2_part[i] + g2 * c3_part[i] + g1 * g2 * c4_part[i];
    4175           0 :                     L_tmp = BASOP_Util_Add_Mant32Exp( c5_part[i], 31, Mpy_32_32( L_mult( g1, g1 ), c0_part[i] ), add( shl( g1_e, 1 ), 31 ), &tmp_e );
    4176           0 :                     L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c1_part[i], g1 ), add( 31, g1_e ), &tmp_e );
    4177           0 :                     L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g2, g2 ), c2_part[i] ), add( shl( g2_e, 1 ), 31 ), &tmp_e );
    4178           0 :                     L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c3_part[i], g2 ), add( 31, g2_e ), &tmp_e );
    4179           0 :                     L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g1, g2 ), c4_part[i] ), add( add( g1_e, g2_e ), 31 ), &tmp_e );
    4180             : 
    4181             :                     // Env_error_part[i] = L_shr( L_tmp, 31 - tmp_e ); // Check Exponent
    4182           0 :                     Env_error_part[i] = extract_h( L_shr_sat( L_tmp, sub( Q15, tmp_e ) ) ); /* Q0 */
    4183           0 :                     move16();
    4184             : 
    4185             :                     // *Env_error += Env_error_part[i];
    4186           0 :                     *Env_error = add_sat( *Env_error, Env_error_part[i] ); /* Q0 */
    4187           0 :                     move16();
    4188             : 
    4189           0 :                     if ( GT_16( Env_error_part[i], THR_ENV_ERROR_PLOSIVE_FX ) ) // Check which Q
    4190             :                     {
    4191             :                         /* envelope error is too high -> likely a plosive */
    4192           0 :                         flag_plosive = 1;
    4193           0 :                         move16();
    4194             :                     }
    4195             :                 }
    4196             : 
    4197           0 :                 IF( flag_plosive )
    4198             :                 {
    4199             :                     /* plosive detected -> set the mixing factor to 0 */
    4200           0 :                     *vf_ind = 0;
    4201           0 :                     move16();
    4202           0 :                     mix_factor = 0;
    4203           0 :                     move16();
    4204             :                 }
    4205             :                 ELSE
    4206             :                 {
    4207             :                     /* normalize gain */
    4208             :                     // g = g2 / ( g1 + g2 );
    4209           0 :                     tmp1_e = BASOP_Util_Add_MantExp( g1, g1_e, g2, g2_e, &tmp );
    4210           0 :                     IF( tmp == 0 )
    4211             :                     {
    4212           0 :                         tmp = 1;
    4213           0 :                         move16();
    4214           0 :                         tmp1_e = 15;
    4215           0 :                         move16();
    4216             :                     }
    4217           0 :                     g = BASOP_Util_Divide1616_Scale( g2, tmp, &tmp_e );
    4218           0 :                     g_e = sub( add( tmp_e, g2_e ), tmp1_e );
    4219             : 
    4220             :                     /* quantization of the mixing factor */
    4221           0 :                     cbsize = 1 << NUM_BITS_SHB_VF;
    4222           0 :                     move16();
    4223             :                     // delta = 1.0f / ( cbsize - 1 );
    4224           0 :                     delta = 2341; /* Q14 */
    4225           0 :                     move16();
    4226             :                     // if ( g > 1.0f )
    4227           0 :                     IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), ONE_IN_Q31, 0 ) > 0 )
    4228             :                     {
    4229             :                         // g = 1.0f;
    4230           0 :                         g = MAX16B; /* Q15 */
    4231             :                     }
    4232             :                     // else if ( g < shl( delta, ( 15 - g_e ) - 14 ) )
    4233           0 :                     ELSE IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), delta, 17 ) < 0 )
    4234             :                     {
    4235             :                         /* prevent low gains to be quantized to 0 as this is reserved for plosives */
    4236             :                         // g = delta;
    4237           0 :                         g = shl( delta, 1 ); /* Q15 */
    4238             :                     }
    4239             : 
    4240           0 :                     *vf_ind = usquant_fx( g, &mix_factor, 0, delta, cbsize );
    4241           0 :                     move16();
    4242             :                 }
    4243             :             }
    4244             :             ELSE
    4245             :             {
    4246           0 :                 Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k,
    4247           0 :                                          ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind );
    4248           0 :                 tmp = voiceFacEst[0];
    4249           0 :                 tmp2 = MAX_16;
    4250           0 :                 move16();
    4251           0 :                 move16();
    4252           0 :                 if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
    4253             :                 {
    4254           0 :                     tmp2 = 26214 /*0.8f Q15*/;
    4255           0 :                     move16();
    4256             :                 }
    4257             :             }
    4258             :         }
    4259             :         ELSE /* decoder side */
    4260             :         {
    4261       25652 :             test();
    4262       25652 :             IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    4263             :             {
    4264        4106 :                 IF( *vf_ind == 0 )
    4265             :                 {
    4266             :                     // mix_factor = 0.0f;
    4267          21 :                     mix_factor = 0;
    4268          21 :                     move16();
    4269          21 :                     flag_plosive = 1;
    4270          21 :                     move16();
    4271             :                 }
    4272             :                 ELSE
    4273             :                 {
    4274             :                     // mix_factor = usdequant(*vf_ind, 0.0f, 1.0f / ((1 << NUM_BITS_SHB_VF) - 1));
    4275        4085 :                     mix_factor = usdequant_fx( *vf_ind, 0, 2341 );
    4276             :                 }
    4277             :             }
    4278             :             ELSE
    4279             :             {
    4280             :                 /* *vf_ind is an integer scale by 0.125f*/
    4281       21546 :                 tmp = shl( *vf_ind, ( 15 - 3 ) );
    4282       21546 :                 tmp2 = MAX_16;
    4283       21546 :                 move16();
    4284       21546 :                 IF( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
    4285             :                 {
    4286       21536 :                     tmp2 = 26214 /*0.8f Q15*/;
    4287       21536 :                     move16();
    4288             :                 }
    4289             :             }
    4290             :         }
    4291       25652 :         test();
    4292       25652 :         IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) )
    4293             :         {
    4294       21546 :             voice_factors[0] = mult_r( voice_factors[0], tmp2 );
    4295       21546 :             move16();
    4296       21546 :             voice_factors[1] = mult_r( voice_factors[1], tmp2 );
    4297       21546 :             move16();
    4298       21546 :             voice_factors[2] = mult_r( voice_factors[2], tmp2 );
    4299       21546 :             move16();
    4300       21546 :             voice_factors[3] = mult_r( voice_factors[3], tmp2 );
    4301       21546 :             move16();
    4302       21546 :             voice_factors[4] = mult_r( voice_factors[4], tmp2 );
    4303       21546 :             move16();
    4304             :         }
    4305             :     }
    4306      102554 :     test();
    4307      102554 :     IF( GE_16( element_mode, IVAS_CPE_DFT ) && nlExc16k != NULL )
    4308             :     {
    4309             :         /* save buffers for IC-BWE */
    4310             :         // mvr2r(exc16kWhtnd, nlExc16k, L_FRAME16k);
    4311       16066 :         Copy( exc16kWhtnd, nlExc16k, L_FRAME16k );
    4312             :         // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), mixExc16k, L_FRAME16k);
    4313             :         /*Word16 temp_fac = divide3232(L_shr(pow1, Q_pow1), pow22);
    4314             :         Word16 temp_fac_exp = 0;
    4315             :         temp_fac = Sqrt16(temp_fac, &temp_fac_exp);*/
    4316       16066 :         L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
    4317       16066 :         Word16 temp_fac = round_fx_sat( L_shl_sat( L_tmp, exp ) ); // Q15
    4318       16066 :         shift = sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k );
    4319             :         // v_multc_fixed_16_16(White_exc16k,shr(temp_fac, temp_fac_exp) , mixExc16k, L_FRAME16k);
    4320     5157186 :         FOR( k = 0; k < L_FRAME16k; k++ )
    4321             :         {
    4322     5141120 :             mixExc16k[k] = mult_r( shl_sat( White_exc16k[k], shift ), temp_fac );
    4323     5141120 :             move16();
    4324             :         }
    4325             :     }
    4326             : 
    4327      102554 :     tmp = sub( Q_temp, 3 );
    4328    32919834 :     FOR( k = 0; k < L_FRAME16k; k++ )
    4329             :     {
    4330    32817280 :         White_exc16k_FB[k] = White_exc16k[k]; /* Q_White_exc16k */
    4331             :     }
    4332      102554 :     prev_Q_bwe_exc_fb = *Q_bwe_exc_fb;
    4333      102554 :     move16();
    4334      102554 :     *Q_bwe_exc_fb = Q_White_exc16k;
    4335      102554 :     move16();
    4336      102554 :     *tbe_demph = shl_sat( *tbe_demph, sub( Q_White_exc16k, sub( *Q_bwe_exc, NOISE_QADJ ) ) );
    4337      102554 :     deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph );
    4338      102554 :     *tbe_demph = shl_sat( *tbe_demph, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) );
    4339             : 
    4340      102554 :     Q_exc16kWhtnd = getScaleFactor16( exc16kWhtnd, L_FRAME16k );
    4341      102554 :     Q_exc16kWhtnd = add( Q_exc16kWhtnd, *Q_bwe_exc );
    4342             : 
    4343      102554 :     shift = getScaleFactor16( White_exc16k, L_FRAME16k );
    4344             : 
    4345      102554 :     shift = s_min( Q_exc16kWhtnd, add( shift, Q_White_exc16k ) );
    4346      102554 :     scale_sig( exc16kWhtnd, L_FRAME16k, sub( shift, *Q_bwe_exc ) );
    4347      102554 :     scale_sig( White_exc16k, L_FRAME16k, sub( shift, Q_White_exc16k ) );
    4348             : 
    4349      102554 :     Q_exc16kWhtnd = Q_White_exc16k = shift;
    4350      102554 :     move16();
    4351      102554 :     move16();
    4352      102554 :     *tbe_premph = shl_sat( *tbe_premph, sub( Q_White_exc16k, sub( *Q_bwe_exc, NOISE_QADJ ) ) );
    4353      102554 :     move16();
    4354      102554 :     test();
    4355      102554 :     IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    4356             :     {
    4357        4106 :         IF( !flag_plosive ) /* use only LB excitation in case of plosives */
    4358             :         {
    4359             :             /* re-scale gaussian excitation at the beginning to gradually move from old energy to new energy */
    4360             :             // old_scale = (float)sqrt(*prev_pow_exc16kWhtnd / pow1);
    4361             :             // old_scale = divide3232(*prev_pow_exc16kWhtnd, pow1); // exp = Q15 - (Q_pow1)
    4362             :             // Word16 old_scale_exp = Q15 - (Q_pow1);
    4363             :             // old_scale = Sqrt16(old_scale, &old_scale_exp);
    4364             :             // old_scale = shl(old_scale, old_scale_exp); //Q15
    4365        4085 :             L_tmp = root_a_over_b_fx( *prev_pow_exc16kWhtnd, 0, pow1, Q_pow1, &exp );
    4366        4085 :             old_scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); // Q15
    4367             :             // new_scale = 1.0f;
    4368        4085 :             new_scale = 32767;
    4369        4085 :             move16();
    4370             :             // step_scale = (new_scale - old_scale) / (L_FRAME16k / 2);
    4371        4085 :             step_scale = mult_r( sub( new_scale, old_scale ), 205 );
    4372        4085 :             scale = old_scale;
    4373        4085 :             move16();
    4374             :             /* interpolate between the old and the new value of the mixing factor */
    4375        4085 :             old_fact = *prev_mix_factor;
    4376        4085 :             move16();
    4377        4085 :             new_fact = mix_factor;
    4378        4085 :             move16();
    4379             :             // step = (new_fact - old_fact) / (L_FRAME16k / 2);
    4380        4085 :             step = mult_r( sub( new_fact, old_fact ), 205 );
    4381        4085 :             fact = old_fact;
    4382        4085 :             move16();
    4383             :             /* mixing of LB and gaussian excitation in the first half of the frame */
    4384      657685 :             FOR( k = 0; k < L_FRAME16k / 2; k++ )
    4385             :             {
    4386      653600 :                 exc16kWhtnd[k] = mac_r( L_mult( fact, mult_r( White_exc16k[k], scale ) ),
    4387      653600 :                                         sub( 32767, fact ), exc16kWhtnd[k] ); // Q_exc16kWhtnd
    4388      653600 :                 move16();
    4389      653600 :                 fact = add_sat( fact, step );
    4390      653600 :                 scale = add_sat( scale, step_scale );
    4391             :             }
    4392             : 
    4393             :             /* mixing of LB and gaussian excitation in the second half of the frame */
    4394      657685 :             FOR( ; k < L_FRAME16k; k++ )
    4395             :             {
    4396      653600 :                 exc16kWhtnd[k] = mac_r( L_mult( new_fact, White_exc16k[k] ),
    4397      653600 :                                         sub( 32767, new_fact ), exc16kWhtnd[k] ); // Q_exc16kWhtnd
    4398      653600 :                 move16();
    4399             :             }
    4400             :         }
    4401             :         // preemph(exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph);
    4402        4106 :         PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph );
    4403             :     }
    4404             :     ELSE
    4405             :     {
    4406       98448 :         test();
    4407       98448 :         IF( EQ_16( coder_type, UNVOICED ) || EQ_16( MSFlag, 1 ) )
    4408             :         {
    4409        6027 :             L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
    4410        6027 :             test();
    4411        6027 :             if ( chk1 == 0 && chk2 == 0 )
    4412             :             {
    4413           0 :                 L_tmp = 0;
    4414           0 :                 move32();
    4415             :             }
    4416        6027 :             scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */
    4417     1934667 :             FOR( k = 0; k < L_FRAME16k; k++ )
    4418             :             {
    4419     1928640 :                 exc16kWhtnd[k] = mult_r_sat( White_exc16k[k], scale );
    4420     1928640 :                 move16();
    4421             :             }
    4422        6027 :             PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph );
    4423             :             /* i/o: exc16kWhtnd  (Q_exc16kWhtnd) */
    4424             :             /* i/o: tbe_premph (Q_exc16kWhtnd) */
    4425             :         }
    4426             :         ELSE
    4427             :         {
    4428             :             Word16 nbSubFr, lSubFr;
    4429             :             Word16 tempQ15;
    4430             :             Word32 tempQ31;
    4431       92421 :             nbSubFr = NB_SUBFR16k;
    4432       92421 :             lSubFr = ( L_FRAME16k / NB_SUBFR16k );
    4433       92421 :             move16();
    4434       92421 :             move16();
    4435       92421 :             IF( LT_32( extl_brate, SWB_TBE_2k8 ) )
    4436             :             {
    4437       70883 :                 nbSubFr = NB_SUBFR;
    4438       70883 :                 move16();
    4439       70883 :                 lSubFr = ( L_FRAME16k / NB_SUBFR );
    4440       70883 :                 move16();
    4441             :             }
    4442       92421 :             k = 0;
    4443       92421 :             move16();
    4444      483643 :             FOR( i = 0; i < nbSubFr; i++ )
    4445             :             {
    4446      391222 :                 test();
    4447      391222 :                 IF( EQ_16( coder_type, VOICED ) && ( LT_32( extl_brate, SWB_TBE_2k8 ) ) )
    4448             :                 {
    4449       23092 :                     exp = 0;
    4450       23092 :                     move16();
    4451       23092 :                     tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */
    4452       23092 :                     temp = shl( tempQ15, exp );                 /* Q15 exc16kWhtnd scale factor */
    4453       23092 :                     exp = 0;
    4454       23092 :                     move16();
    4455       23092 :                     tempQ15 = Sqrt16( temp, &exp ); /* Q15 */
    4456       23092 :                     temp1 = shl( tempQ15, exp );    /* Q15 exc16kWhtnd scale factor */
    4457             : 
    4458             :                     /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */
    4459       23092 :                     temp = sub( MAX_16, temp );
    4460       23092 :                     tempQ31 = Mult_32_16( pow1, temp );
    4461       23092 :                     L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
    4462       23092 :                     temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
    4463             :                 }
    4464             :                 ELSE
    4465             :                 {
    4466             :                     /* Adjust noise mixing for formant sharpening filter */
    4467      368130 :                     tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac );
    4468             :                     /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */
    4469      368130 :                     vf_tmp = sub( MAX_16, tempQ15 );
    4470      368130 :                     vf_tmp = mult( voice_factors[i], vf_tmp );
    4471             : 
    4472      368130 :                     exp = 0;
    4473      368130 :                     move16();
    4474      368130 :                     tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */
    4475      368130 :                     temp1 = shl( tempQ15, exp );      /* Q15 exc16kWhtnd scale factor */
    4476             : 
    4477             :                     /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */
    4478      368130 :                     temp = sub( MAX_16, vf_tmp );
    4479      368130 :                     tempQ31 = Mult_32_16( pow1, temp );
    4480      368130 :                     L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
    4481      368130 :                     temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
    4482             :                 }
    4483             : 
    4484    29965942 :                 FOR( j = 0; j < lSubFr; j++ )
    4485             :                 {
    4486             :                     /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */
    4487    29574720 :                     L_tmp = L_mult( temp2, White_exc16k[k + j] );
    4488    29574720 :                     exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] );
    4489    29574720 :                     move16();
    4490             :                     /* Q_exc16kWhtnd */
    4491             :                 }
    4492      391222 :                 k = add( k, lSubFr );
    4493             : 
    4494             :                 /* estimate the pre-emph factor */
    4495      391222 :                 tempQ15 = sub( MAX_16, voice_factors[i] );
    4496      391222 :                 exp = 0;
    4497      391222 :                 move16();
    4498      391222 :                 temp = Sqrt16( tempQ15, &exp );
    4499      391222 :                 temp = shl( temp, sub( exp, 1 ) );
    4500             : 
    4501      391222 :                 temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */
    4502      391222 :                 temp = div_s( temp, temp2 );           /* Q15 */
    4503      391222 :                 temp = mult_r( PREEMPH_FAC, temp );
    4504      391222 :                 PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph );
    4505             :                 /* exc16kWhtnd: Q_exc16kWhtnd;
    4506             :                    tbe_premph: Q_exc16kWhtnd*/
    4507             :             }
    4508             :         }
    4509             :     }
    4510      102554 :     *tbe_premph = shl_sat( *tbe_premph, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) );
    4511      102554 :     move16();
    4512      102554 :     Scale_sig( White_exc16k, L_FRAME16k, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) );
    4513      102554 :     Scale_sig( exc16kWhtnd, L_FRAME16k, sub( *Q_bwe_exc, Q_White_exc16k ) );
    4514             : 
    4515      102554 :     IF( LT_32( extl_brate, SWB_TBE_2k8 ) )
    4516             :     {
    4517       81008 :         Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 );
    4518             :         /* i: exc16kWhtnd in Q_bwe_exc */
    4519             :         /* o: excSHB in Q_bwe_exc */
    4520             :     }
    4521             :     ELSE
    4522             :     {
    4523       21546 :         set16_fx( zero_mem, 0, LPC_SHB_ORDER );
    4524             : 
    4525       21546 :         Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 );
    4526       21546 :         tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
    4527       21546 :         Scale_sig( tempSHB, 80, tmp );
    4528       21546 :         syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    4529       21546 :         move32();
    4530       21546 :         syn_shb_ener_sf_q[0] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
    4531       21546 :         move16();
    4532             : 
    4533       21546 :         Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 );
    4534       21546 :         tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
    4535       21546 :         Scale_sig( tempSHB, 80, tmp );
    4536       21546 :         syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    4537       21546 :         move32();
    4538       21546 :         syn_shb_ener_sf_q[1] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
    4539       21546 :         move16();
    4540             : 
    4541       21546 :         Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 );
    4542       21546 :         tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
    4543       21546 :         Scale_sig( tempSHB, 80, tmp );
    4544       21546 :         syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    4545       21546 :         move32();
    4546       21546 :         syn_shb_ener_sf_q[2] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
    4547       21546 :         move16();
    4548             : 
    4549       21546 :         Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 );
    4550       21546 :         tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
    4551       21546 :         Scale_sig( tempSHB, 80, tmp );
    4552       21546 :         syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    4553       21546 :         move32();
    4554       21546 :         syn_shb_ener_sf_q[3] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
    4555       21546 :         move16();
    4556             : 
    4557       21546 :         tmp2 = s_min( s_min( syn_shb_ener_sf_q[0], syn_shb_ener_sf_q[1] ), s_min( syn_shb_ener_sf_q[3], syn_shb_ener_sf_q[2] ) );
    4558       21546 :         syn_shb_ener_sf[0] = L_shl( syn_shb_ener_sf[0], sub( tmp2, syn_shb_ener_sf_q[0] ) );
    4559       21546 :         move32();
    4560       21546 :         syn_shb_ener_sf[1] = L_shl( syn_shb_ener_sf[1], sub( tmp2, syn_shb_ener_sf_q[1] ) );
    4561       21546 :         move32();
    4562       21546 :         syn_shb_ener_sf[2] = L_shl( syn_shb_ener_sf[2], sub( tmp2, syn_shb_ener_sf_q[2] ) );
    4563       21546 :         move32();
    4564       21546 :         syn_shb_ener_sf[3] = L_shl( syn_shb_ener_sf[3], sub( tmp2, syn_shb_ener_sf_q[3] ) );
    4565       21546 :         move32();
    4566             : 
    4567             :         /* i: exc16kWhtnd       in Q_bwe_exc        */
    4568             :         /* o: tempSHB           in Q_bwe_exc        */
    4569             :         /* o: syn_shb_ener_sf   in tmp2  */
    4570       21546 :         IF( LE_32( bitrate, MAX_ACELP_BRATE ) )
    4571             :         {
    4572       21546 :             L_tmp = sum32_fx( syn_shb_ener_sf, 4 );
    4573             : 
    4574             :             /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */
    4575       21546 :             tmp = shl( Q_shb, 1 );
    4576       21546 :             L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */
    4577             : 
    4578       21546 :             *Q_bwe_exc = sub( *Q_bwe_exc, exp );
    4579       21546 :             move16(); /* compensate for the exp shift */
    4580       21546 :             tmp2 = add( prev_Q_bwe_syn, n_mem2 );
    4581       21546 :             IF( GT_16( *Q_bwe_exc, tmp2 ) )
    4582             :             {
    4583           2 :                 L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) );
    4584           2 :                 *Q_bwe_exc = tmp2;
    4585           2 :                 move16();
    4586             :             }
    4587     6916266 :             FOR( i = 0; i < L_FRAME16k; i++ )
    4588             :             {
    4589     6894720 :                 L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */
    4590     6894720 :                 exc16kWhtnd[i] = round_fx( L_tmp3 );           /* *Q_bwe_exc - exp */
    4591     6894720 :                 move16();
    4592             :             }
    4593             :         }
    4594             :         /* i: L_tmp2 in (Q31-exp)                       */
    4595             :         /* i: exc16kWhtnd in Q_bwe_exc            */
    4596             :         /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp)   */
    4597             : 
    4598             :         /* Rescale the past memories: LP synth and SHB look ahead buffers */
    4599       21546 :         tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn );
    4600      237006 :         FOR( i = 0; i < LPC_SHB_ORDER; i++ )
    4601             :         {
    4602      215460 :             state_lpc_syn[i] = shl_sat( state_lpc_syn[i], tmp );
    4603      215460 :             move16();
    4604             :         }
    4605      452466 :         FOR( i = -L_SHB_LAHEAD; i < 0; i++ )
    4606             :         {
    4607      430920 :             excSHB[i] = shl_sat( excSHB[i], tmp );
    4608      430920 :             move16();
    4609             :         }
    4610             :         /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */
    4611             : 
    4612       21546 :         Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 );
    4613       21546 :         Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 );
    4614       21546 :         Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 );
    4615       21546 :         Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 );
    4616             :         /* i: exc16kWhtnd in (Q_bwe_exc) */
    4617             :         /* o: excSHB in (Q_bwe_exc) */
    4618             :     }
    4619             : 
    4620      102554 :     IF( EQ_16( extl, FB_TBE ) )
    4621             :     {
    4622       39990 :         tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb );
    4623       39990 :         Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp );
    4624       39990 :         Scale_sig( fb_tbe_demph, 1, tmp );
    4625       39990 :         Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 );
    4626             :         /* i: White_exc16k_FB       in (14-n2) */
    4627             :         /* o: White_exc16k_FB_temp  in (14-n2) */
    4628             : 
    4629      439890 :         FOR( i = 0; i < 10; i++ )
    4630             :         {
    4631    13196700 :             FOR( j = 0; j < 32; ++j )
    4632             :             {
    4633    12796800 :                 White_exc16k_FB_temp[i * 32 + j] = mult_r_sat( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] );
    4634    12796800 :                 move16();
    4635             :             }
    4636             :         }
    4637             : 
    4638       39990 :         *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 );
    4639       39990 :         move16(); /**Q_bwe_exc_fb  +35 +1 -16*/
    4640       39990 :         flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k );
    4641             : 
    4642       39990 :         deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph );
    4643             :     }
    4644             :     ELSE
    4645             :     {
    4646       62564 :         set16_fx( White_exc16k_FB, 0, L_FRAME16k );
    4647             :     }
    4648             : 
    4649      102554 :     *prev_pow_exc16kWhtnd = L_shr_sat( pow1, Q_pow1 ); // power goes above MAX_32
    4650      102554 :     *prev_mix_factor = mix_factor;
    4651      102554 :     return;
    4652             : }
    4653             : 
    4654             : /*====================================================================================*/
    4655             : /* FUNCTION : void GenSHBSynth_fx() */
    4656             : /*------------------------------------------------------------------------------------*/
    4657             : /* PURPOSE :Generate 32 KHz sampled highband component from synthesized highband*/
    4658             : /*------------------------------------------------------------------------------------*/
    4659             : /* INPUT ARGUMENTS */
    4660             : /* _(Word16*)input_synspeech :input synthesized speech */
    4661             : /* _(Word16) L_frame :ACELP frame length */
    4662             : /*------------------------------------------------------------------------------------*/
    4663             : /* OUTPUT ARGUMENTS : */
    4664             : /* _(Word16*)shb_syn_speech_32k : output highband component */
    4665             : /*------------------------------------------------------------------------------------*/
    4666             : /* INPUT/OUTPUT ARGUMENTS : */
    4667             : /* _(Word16[]) allpass_mem : memory */
    4668             : /* _(Word32[]) Hilbert_Mem : memory */
    4669             : /*------------------------------------------------------------------------------------*/
    4670             : /* RETURN ARGUMENTS : */
    4671             : /* _ None */
    4672             : /*------------------------------------------------------------------------------------*/
    4673             : 
    4674        3146 : void GenSHBSynth_fx(
    4675             :     const Word16 *input_synspeech, /* i : input synthesized speech */
    4676             :     Word16 *shb_syn_speech_32k,    /* o : output highband component */
    4677             :     Word32 Hilbert_Mem[],          /* i/o: memory */
    4678             :     Word16 allpass_mem[],          /* i/o: memory */
    4679             :     const Word16 L_frame,          /* i : ACELP frame length */
    4680             :     Word16 *syn_dm_phase )
    4681             : {
    4682             :     Word16 i, speech_buf_32k[L_FRAME32k];
    4683             :     Word16 maxm, nor, nor32, shift;
    4684             :     Word16 input_synspeech_temp[L_FRAME16k];
    4685             :     Word32 maxm32;
    4686             : 
    4687             : 
    4688        3146 :     maxm = 0;
    4689        3146 :     move16();
    4690        3146 :     maxm32 = L_deposit_l( 0 );
    4691     1009866 :     FOR( i = 0; i < L_FRAME16k; i++ )
    4692     1006720 :     maxm = s_max( maxm, abs_s( input_synspeech[i] ) );
    4693       22022 :     FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
    4694       18876 :     maxm = s_max( maxm, abs_s( allpass_mem[i] ) );
    4695       69212 :     FOR( i = 0; i < HILBERT_MEM_SIZE; i++ )
    4696       66066 :     maxm32 = L_max( maxm32, L_abs( Hilbert_Mem[i] ) );
    4697        3146 :     nor = sub( norm_s( maxm ), 3 );
    4698        3146 :     nor32 = sub( norm_l( maxm32 ), 3 );
    4699        3146 :     if ( maxm == 0 )
    4700             :     {
    4701           0 :         nor = 15;
    4702           0 :         move16();
    4703             :     }
    4704        3146 :     if ( maxm32 == 0 )
    4705             :     {
    4706        2417 :         nor32 = 31;
    4707        2417 :         move16();
    4708             :     }
    4709        3146 :     shift = s_min( nor, nor32 );
    4710             : 
    4711        3146 :     Copy_Scale_sig( input_synspeech, input_synspeech_temp, L_FRAME16k, shift );
    4712        3146 :     Scale_sig( allpass_mem, 2 * ALLPASSSECTIONS_STEEP, shift );
    4713        3146 :     Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, shift );
    4714        3146 :     Interpolate_allpass_steep_fx( input_synspeech_temp, allpass_mem, L_FRAME16k, speech_buf_32k );
    4715             :     /*modify_Fs_fx( input_synspeech, L_FRAME16k, 16000, speech_buf_32k, 32000, allpass_mem, 0);*/
    4716        3146 :     IF( EQ_16( L_frame, L_FRAME ) )
    4717             :     {
    4718             :         /* 12.8 k core flipping and downmixing */
    4719        1594 :         flip_and_downmix_generic_fx( speech_buf_32k, shb_syn_speech_32k, L_FRAME32k,
    4720             :                                      Hilbert_Mem,
    4721             :                                      Hilbert_Mem + HILBERT_ORDER1,
    4722             :                                      Hilbert_Mem + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ),
    4723             :                                      syn_dm_phase );
    4724             :     }
    4725             :     ELSE
    4726             :     {
    4727             :         /* 16 k core flipping and no downmixing */
    4728      498192 :         FOR( i = 0; i < L_FRAME32k; i = i + 2 )
    4729             :         {
    4730      496640 :             shb_syn_speech_32k[i] = negate( speech_buf_32k[i] );
    4731      496640 :             move16();
    4732      496640 :             shb_syn_speech_32k[i + 1] = speech_buf_32k[i + 1];
    4733      496640 :             move16();
    4734             :         }
    4735             :     }
    4736             : 
    4737        3146 :     Scale_sig( shb_syn_speech_32k, L_FRAME32k, negate( shift ) );
    4738        3146 :     Scale_sig( allpass_mem, 2 * ALLPASSSECTIONS_STEEP, negate( shift ) );
    4739        3146 :     Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, negate( shift ) );
    4740             : 
    4741        3146 :     return;
    4742             : }
    4743             : 
    4744             : 
    4745             : /* IVAS 32-bit variant */
    4746      111110 : void GenSHBSynth_fx32(
    4747             :     const Word32 *input_synspeech,      /* i  : input synthesized speech    Qx*/
    4748             :     Word32 *shb_syn_speech_32k,         /* o  : output highband component   Qx*/
    4749             :     Word32 Hilbert_Mem[],               /* i/o: memory                      Qx*/
    4750             :     Word32 state_lsyn_filt_shb_local[], /* i/o: memory                      Qx*/
    4751             :     const Word16 L_frame,               /* i  : ACELP frame length          */
    4752             :     Word16 *syn_dm_phase )
    4753             : {
    4754             :     Word32 speech_buf_32k[L_FRAME32k];
    4755             :     Word16 i;
    4756             : 
    4757      111110 :     Word16 shift = 0;
    4758             :     Word32 maxm32, input_synspeech_temp[L_FRAME16k];
    4759      111110 :     move16();
    4760             : 
    4761             :     /* find the maximum value and derive the shift to improve precision of the Hilber filter */
    4762      111110 :     maxm32 = L_deposit_l( 0 );
    4763    35666310 :     FOR( i = 0; i < L_FRAME16k; i++ )
    4764             :     {
    4765    35555200 :         maxm32 = L_max( maxm32, L_abs( input_synspeech[i] ) );
    4766             :     }
    4767             : 
    4768      777770 :     FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
    4769             :     {
    4770      666660 :         maxm32 = L_max( maxm32, L_abs( state_lsyn_filt_shb_local[i] ) );
    4771             :     }
    4772             : 
    4773     2444420 :     FOR( i = 0; i < HILBERT_MEM_SIZE; i++ )
    4774             :     {
    4775     2333310 :         maxm32 = L_max( maxm32, L_abs( Hilbert_Mem[i] ) );
    4776             :     }
    4777             : 
    4778      111110 :     IF( maxm32 != 0 )
    4779             :     {
    4780      110970 :         shift = sub( norm_l( maxm32 ), 3 );
    4781             : 
    4782      110970 :         Copy_Scale_sig32( input_synspeech, input_synspeech_temp, L_FRAME16k, shift );
    4783      110970 :         Scale_sig32( state_lsyn_filt_shb_local, 2 * ALLPASSSECTIONS_STEEP, shift );
    4784      110970 :         Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, shift );
    4785             :     }
    4786             :     ELSE
    4787             :     {
    4788         140 :         Copy32( input_synspeech, input_synspeech_temp, L_FRAME16k );
    4789             :     }
    4790             : 
    4791      111110 :     Interpolate_allpass_steep_fx32( input_synspeech_temp, state_lsyn_filt_shb_local, L_FRAME16k, speech_buf_32k );
    4792             : 
    4793      111110 :     IF( EQ_16( L_frame, L_FRAME ) )
    4794             :     {
    4795       48570 :         flip_and_downmix_generic_fx32( speech_buf_32k, shb_syn_speech_32k, L_FRAME32k, Hilbert_Mem, Hilbert_Mem + HILBERT_ORDER1, Hilbert_Mem + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ), syn_dm_phase );
    4796             :     }
    4797             :     ELSE
    4798             :     {
    4799    40088140 :         FOR( i = 0; i < L_FRAME32k; i++ )
    4800             :         {
    4801             :             // shb_syn_speech_32k[i] = ( ( i % 2 ) == 0 ) ? ( -speech_buf_32k[i] ) : ( speech_buf_32k[i] );
    4802    40025600 :             IF( i % 2 == 0 )
    4803             :             {
    4804    20012800 :                 shb_syn_speech_32k[i] = L_negate( speech_buf_32k[i] ); // Qx
    4805             :             }
    4806             :             ELSE
    4807             :             {
    4808    20012800 :                 shb_syn_speech_32k[i] = speech_buf_32k[i]; // Qx
    4809             :             }
    4810    40025600 :             move32();
    4811             :         }
    4812             :     }
    4813             : 
    4814      111110 :     IF( maxm32 != 0 )
    4815             :     {
    4816      110970 :         Scale_sig32( shb_syn_speech_32k, L_FRAME32k, negate( shift ) );
    4817      110970 :         Scale_sig32( state_lsyn_filt_shb_local, 2 * ALLPASSSECTIONS_STEEP, negate( shift ) );
    4818      110970 :         Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, negate( shift ) );
    4819             :     }
    4820             : 
    4821      111110 :     return;
    4822             : }
    4823             : 
    4824             : 
    4825             : /*==============================================================================*/
    4826             : /* FUNCTION : void ScaleShapedSHB_fx() */
    4827             : /*------------------------------------------------------------------------------*/
    4828             : /* PURPOSE : */
    4829             : /*------------------------------------------------------------------------------*/
    4830             : /* INPUT ARGUMENTS : */
    4831             : /* _(Word16) length : SHB overlap length */
    4832             : /* _(Word16*) subgain : subframe gain Q15 */
    4833             : /* _(Word32) frame_gain : frame gain Q18 */
    4834             : /* _(Word16*) win : window Q15 */
    4835             : /* _(Word16*) subwin : subframes window Q15 */
    4836             : /* _(Word16) Q_bwe_exc : Q format */
    4837             : /*------------------------------------------------------------------------------*/
    4838             : /* OUTPUT ARGUMENTS : */
    4839             : /* _(Word16) Qx : Q factor of output */
    4840             : /*------------------------------------------------------------------------------*/
    4841             : /* INPUT/OUTPUT ARGUMENTS : */
    4842             : /* _(Word16*) synSHB : synthesized shb signal input Q_bwe_exc / output Qx */
    4843             : /* _(Word16*) overlap : buffer for overlap-add Q_bwe_exc /output Qx */
    4844             : /*------------------------------------------------------------------------------*/
    4845             : /* RETURN ARGUMENTS : */
    4846             : /* _ None */
    4847             : /*------------------------------------------------------------------------------*/
    4848             : /* CALLED FROM : RX */
    4849             : /*==============================================================================*/
    4850             : 
    4851      111255 : void ScaleShapedSHB_fx(
    4852             :     const Word16 length,     /* i    : SHB overlap length                        */
    4853             :     Word16 *synSHB,          /* i/o  : synthesized shb signal Q(Q_bwe_exc)/Q(Qx) */
    4854             :     Word16 *overlap,         /* i/o  : buffer for overlap-add Q(Q_bwe_exc)/Q(Qx) */
    4855             :     const Word16 *subgain,   /* i    : subframe gain                         Q15 */
    4856             :     const Word32 frame_gain, /* i    : frame gain                            Q18 */
    4857             :     const Word16 *win,       /* i    : window                                Q15 */
    4858             :     const Word16 *subwin,    /* i    : subframes window                      Q15 */
    4859             :     Word16 *Q_bwe_exc,
    4860             :     Word16 *Qx, /* o    : newly computed Q factor for  synSHB   */
    4861             :     Word16 n_mem3,
    4862             :     Word16 prev_Q_bwe_syn2 )
    4863             : {
    4864             :     const Word16 *skip;
    4865             :     Word16 i, j, k, l_shb_lahead, l_frame, l_frame_tmp;
    4866             :     Word16 join_length, num_join;
    4867             :     Word32 mod_syn[L_FRAME16k + L_SHB_LAHEAD];
    4868             :     Word16 sum_gain;
    4869             :     Word32 L_tmp;
    4870             :     Word16 tmpQ15;
    4871             :     Word16 Q_gFr_norm, gain_frame_Q16;
    4872             :     Word32 L_tmp2;
    4873             :     Word16 temp1, temp2;
    4874             : 
    4875             :     /* Init */
    4876      111255 :     set32_fx( mod_syn, 0, L_FRAME16k + L_SHB_LAHEAD );
    4877             : 
    4878             :     /* apply gain for each subframe, and store noise output signal using overlap-add */
    4879      111255 :     IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
    4880             :     {
    4881             :         /* WB Gain shape and gain frame application with overlap */
    4882        7343 :         skip = skip_bands_WB_TBE;
    4883        7343 :         l_frame = L_FRAME16k / 4;
    4884        7343 :         move16();
    4885        7343 :         l_shb_lahead = L_SHB_LAHEAD / 4;
    4886        7343 :         move16();
    4887             : 
    4888        7343 :         sum_gain = 0;
    4889        7343 :         move16();
    4890       44058 :         FOR( k = 0; k < length / 2; k++ )
    4891             :         {
    4892       36715 :             sum_gain = mult_r( subwin[2 * k + 2], subgain[0] );             /* Q15 */
    4893       36715 :             mod_syn[skip[0] + k] = L_mult( sum_gain, synSHB[skip[0] + k] ); /* Q_bwe_exc + 16 */
    4894       36715 :             move32();
    4895       36715 :             mod_syn[skip[0] + k + length / 2] = L_mult( subgain[0], synSHB[skip[0] + k + length / 2] ); /* Q_bwe_exc + 16 */
    4896       36715 :             move32();
    4897             :         }
    4898       58744 :         FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ )
    4899             :         {
    4900      565411 :             FOR( k = 0; k < length; k++ )
    4901             :             {
    4902             :                 /* one bit headroom here, otherwise messes up the gain shape application */
    4903             :                 /* keep it as L_mult0 */
    4904      514010 :                 L_tmp = L_mult0( subwin[k + 1], subgain[i] );                                   /* Q30 */
    4905      514010 :                 sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i - 1] ) ); /* Q14 */
    4906      514010 :                 mod_syn[skip[i] + k] = L_shl( L_mult( sum_gain, synSHB[skip[i] + k] ), 1 );     /* Q_bwe_exc + 16 */
    4907      514010 :                 move32();
    4908             :             }
    4909             :         }
    4910       44058 :         FOR( k = 0; k < length / 2; k++ )
    4911             :         {
    4912       36715 :             sum_gain = mult_r( subwin[length - 2 * k - 2], subgain[i - 1] ); /* Q15 */
    4913       36715 :             mod_syn[skip[i] + k] = L_mult( sum_gain, synSHB[skip[i] + k] );  /* Q_bwe_exc + 16 */
    4914       36715 :             move32();
    4915             :         }
    4916             :     }
    4917             :     ELSE
    4918             :     {
    4919             :         /* SWB Gain shape and gain frame application with overlap */
    4920      103912 :         l_frame = L_FRAME16k;
    4921      103912 :         move16();
    4922      103912 :         l_shb_lahead = L_SHB_LAHEAD;
    4923      103912 :         move16();
    4924      103912 :         skip = skip_bands_SWB_TBE;
    4925             : 
    4926      103912 :         num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS;
    4927      103912 :         move16();
    4928      103912 :         join_length = i_mult2( num_join, length );
    4929      103912 :         j = 0;
    4930      103912 :         move16();
    4931     2182152 :         FOR( k = 0; k < length; k++ )
    4932             :         {
    4933     2078240 :             sum_gain = mult_r( subwin[k + 1], subgain[0] ); /* Q15 */
    4934     2078240 :             mod_syn[j] = L_mult( synSHB[j], sum_gain );
    4935     2078240 :             move32(); /* Q_bwe_exc + 16 */
    4936     2078240 :             j = add( j, 1 );
    4937             :         }
    4938             : 
    4939      415648 :         FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ )
    4940             :         {
    4941    19015896 :             FOR( k = 0; k < join_length - length; k++ )
    4942             :             {
    4943    18704160 :                 mod_syn[j] = L_mult( synSHB[j], subgain[i * num_join] );
    4944    18704160 :                 move32(); /* Q_bwe_exc + 16 */
    4945    18704160 :                 j = add( j, 1 );
    4946             :             }
    4947             : 
    4948     6546456 :             FOR( k = 0; k < length; k++ )
    4949             :             {
    4950             :                 /* one bit headroom here, otherwise messes up the gain shape application */
    4951             :                 /* keep it as L_mult0 */
    4952     6234720 :                 L_tmp = L_mult0( subwin[k + 1], subgain[( i + 1 ) * num_join] );                       /* Q30 */
    4953     6234720 :                 sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i * num_join] ) ); /*Q14 */
    4954     6234720 :                 mod_syn[j] = L_shl( L_mult( sum_gain, synSHB[j] ), 1 );
    4955     6234720 :                 move32(); /* Q_bwe_exc + 16 */
    4956     6234720 :                 j = add( j, 1 );
    4957             :             }
    4958             :         }
    4959     6338632 :         FOR( k = 0; k < join_length - length; k++ )
    4960             :         {
    4961     6234720 :             mod_syn[j] = L_mult( synSHB[j], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] );
    4962     6234720 :             move32(); /* Q_bwe_exc + 16 */
    4963     6234720 :             j = add( j, 1 );
    4964             :         }
    4965     2182152 :         FOR( k = 0; k < length; k++ )
    4966             :         {
    4967     2078240 :             sum_gain = mult_r( subwin[length - k - 1], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); /* Q15 */
    4968     2078240 :             mod_syn[j] = L_mult( synSHB[j], sum_gain );
    4969     2078240 :             move32(); /* Q_bwe_exc + 16 */
    4970     2078240 :             j = add( j, 1 );
    4971             :         }
    4972             :     }
    4973             : 
    4974             : 
    4975      111255 :     Q_gFr_norm = norm_l( frame_gain );
    4976      111255 :     if ( frame_gain == 0 )
    4977             :     {
    4978           2 :         Q_gFr_norm = 31;
    4979           2 :         move16();
    4980             :     }
    4981      111255 :     Q_gFr_norm = sub( Q_gFr_norm, 1 ); /* give some headroom */
    4982             : 
    4983      111255 :     gain_frame_Q16 = round_fx( L_shl( frame_gain, Q_gFr_norm ) ); /* Q = 18 + Q_gFr_norm - 16
    4984             :                                                                        = (Q_gFr_norm + 2)    */
    4985             : 
    4986      111255 :     *Q_bwe_exc = add( *Q_bwe_exc, Q_gFr_norm ); /* compensate for the exp shift */
    4987      111255 :     move16();
    4988      111255 :     *Q_bwe_exc = sub( *Q_bwe_exc, 13 ); /* Keep Q-fac at => (Q_bwe_exc + Q_gFr_norm - 13) */
    4989      111255 :     move16();
    4990             : 
    4991             :     /* check for headroom of previous buff memories: overlap, Hilbert, and interp all-pass mem */
    4992      111255 :     tmpQ15 = add( prev_Q_bwe_syn2, n_mem3 );
    4993      111255 :     if ( GT_16( *Q_bwe_exc, tmpQ15 ) )
    4994             :     {
    4995        3529 :         *Q_bwe_exc = tmpQ15;
    4996        3529 :         move16();
    4997             :     }
    4998             : 
    4999      111255 :     *Qx = *Q_bwe_exc;
    5000      111255 :     move16();
    5001             :     /* rescale the overlap memory */
    5002     2336355 :     FOR( i = 0; i < L_SHB_LAHEAD; i++ )
    5003             :     {
    5004     2225100 :         temp2 = 1;
    5005     2225100 :         move16();
    5006     2225100 :         if ( overlap[i] < 0 )
    5007             :         {
    5008      807997 :             temp2 = -1;
    5009      807997 :             move16();
    5010             :         }
    5011     2225100 :         temp1 = abs_s( overlap[i] );
    5012     2225100 :         temp1 = shl( temp1, sub( *Q_bwe_exc, prev_Q_bwe_syn2 ) );
    5013     2225100 :         overlap[i] = i_mult( temp1, temp2 );
    5014     2225100 :         move16(); /* Q_bwe_exc + Q_gFr_norm - 13 */
    5015             :     }
    5016             : 
    5017     2226210 :     FOR( i = 0; i < l_shb_lahead; i++ )
    5018             :     {
    5019     2114955 :         L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 ); /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */
    5020     2114955 :         L_tmp2 = Mpy_32_16_1( L_tmp, win[i] );             /* (Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15) + 15 + (1-16) */
    5021     2114955 :         synSHB[i] = mac_r( L_tmp2, overlap[i], MAX_16 );
    5022     2114955 :         move16();                                     /* Q_bwe_exc + Q_gFr_norm - 13 */
    5023     2114955 :         synSHB[i + l_shb_lahead] = round_fx( L_tmp ); /* Q_bwe_exc + Q_gFr_norm - 13 */
    5024     2114955 :         move16();
    5025             :     }
    5026             : 
    5027    31835580 :     FOR( ; i < l_frame; i++ )
    5028             :     {
    5029    31724325 :         L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 ); /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */
    5030    31724325 :         synSHB[i] = round_fx( L_tmp );                     /* Q_bwe_exc + Q_gFr_norm - 13 */
    5031    31724325 :         move16();
    5032             :     }
    5033             : 
    5034      111255 :     l_frame_tmp = add( l_frame, l_shb_lahead );
    5035     2226210 :     FOR( ; i < l_frame_tmp; i++ )
    5036             :     {
    5037     2114955 :         L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 );                 /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */
    5038     2114955 :         L_tmp = Mpy_32_16_1( L_tmp, win[l_frame + l_shb_lahead - 1 - i] ); /* (Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15) + 15 + (1-16) */
    5039     2114955 :         overlap[i - l_frame] = round_fx( L_tmp );                          /* Q_bwe_exc + Q_gFr_norm - 13 */
    5040     2114955 :         move16();
    5041             :     }
    5042             : 
    5043      111255 :     return;
    5044             : }
    5045             : 
    5046             : 
    5047             : /* IVAS 32-bit variant */
    5048        8556 : void ScaleShapedSHB_fx32(
    5049             :     const Word16 length,        /* i  : SHB overlap length      */
    5050             :     Word32 *synSHB_fx,          /* i/o: synthesized shb signal  Q_inp/Q_new */
    5051             :     Word32 *overlap_fx,         /* i/o: buffer for overlap-add  Q_inp/Q_new */
    5052             :     const Word16 *subgain_fx,   /* i  : subframe gain           Q15 */
    5053             :     const Word32 frame_gain_fx, /* i  : frame gain              Q18*/
    5054             :     const Word16 *win_fx,       /* i  : window                  Q15 */
    5055             :     const Word16 *subwin_fx,    /* i  : subframes window        Q15 */
    5056             :     Word16 *Q_inp,
    5057             :     Word16 *Q_new )
    5058             : {
    5059             :     const Word16 *skip;
    5060             :     Word16 i, j, k, l_shb_lahead, l_frame;
    5061             :     Word16 join_length, num_join;
    5062             :     Word32 mod_syn_fx[L_FRAME16k + L_SHB_LAHEAD], L_tmp;
    5063             :     Word16 sum_gain_fx;
    5064             : 
    5065             :     /* initilaization */
    5066        8556 :     l_frame = L_FRAME16k;
    5067        8556 :     l_shb_lahead = L_SHB_LAHEAD;
    5068        8556 :     move16();
    5069        8556 :     move16();
    5070        8556 :     skip = skip_bands_SWB_TBE;
    5071             : 
    5072        8556 :     IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
    5073             :     {
    5074           0 :         skip = skip_bands_WB_TBE;
    5075           0 :         l_frame = L_FRAME16k / 4;
    5076           0 :         l_shb_lahead = L_SHB_LAHEAD / 4;
    5077           0 :         move16();
    5078           0 :         move16();
    5079             :     }
    5080             : 
    5081             :     /* apply gain for each subframe, and store noise output signal using overlap-add */
    5082        8556 :     set32_fx( mod_syn_fx, 0, l_frame + l_shb_lahead );
    5083             : 
    5084        8556 :     IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
    5085             :     {
    5086           0 :         sum_gain_fx = 0;
    5087           0 :         move16();
    5088           0 :         FOR( k = 0; k < shr( length, 1 ); k++ )
    5089             :         {
    5090           0 :             sum_gain_fx = mult_r( subwin_fx[2 * k + 2], subgain_fx[0] );
    5091           0 :             mod_syn_fx[skip[0] + k] = Mpy_32_16_1( synSHB_fx[skip[0] + k], sum_gain_fx );
    5092           0 :             move32();                                                                                                 // Qx
    5093           0 :             mod_syn_fx[skip[0] + k + length / 2] = Mpy_32_16_1( synSHB_fx[skip[0] + k + length / 2], subgain_fx[0] ); // Qx
    5094           0 :             move32();
    5095             :         }
    5096           0 :         FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ )
    5097             :         {
    5098           0 :             FOR( k = 0; k < length; k++ )
    5099             :             {
    5100           0 :                 L_tmp = L_mult0( subwin_fx[k + 1], subgain_fx[i] );
    5101           0 :                 sum_gain_fx = round_fx( L_mac0( L_tmp, subwin_fx[length - k - 1], subgain_fx[i - 1] ) );
    5102           0 :                 mod_syn_fx[skip[i] + k] = L_shl( Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ), 1 ); // Qx
    5103           0 :                 move32();
    5104             :             }
    5105             :         }
    5106           0 :         FOR( k = 0; k < shr( length, 1 ); k++ )
    5107             :         {
    5108           0 :             sum_gain_fx = mult_r( subwin_fx[length - k * 2 - 2], subgain_fx[i - 1] );
    5109           0 :             mod_syn_fx[skip[i] + k] = Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ); // Qx
    5110           0 :             move32();
    5111             :         }
    5112             :     }
    5113             :     ELSE
    5114             :     {
    5115        8556 :         num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS;
    5116        8556 :         join_length = i_mult( num_join, length );
    5117        8556 :         j = 0;
    5118        8556 :         move16();
    5119        8556 :         move16();
    5120      179676 :         FOR( k = 0; k < length; k++ )
    5121             :         {
    5122      171120 :             mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[k + 1], subgain_fx[0] ) ); // Qx
    5123      171120 :             move32();
    5124      171120 :             j = add( j, 1 );
    5125             :         }
    5126       34224 :         FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ )
    5127             :         {
    5128     1565748 :             FOR( k = 0; k < join_length - length; k++ )
    5129             :             {
    5130     1540080 :                 mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[i * num_join] ); // Qx
    5131     1540080 :                 move32();
    5132     1540080 :                 j = add( j, 1 );
    5133             :             }
    5134             : 
    5135      539028 :             FOR( k = 0; k < length; k++ )
    5136             :             {
    5137      513360 :                 L_tmp = L_mult0( subwin_fx[length - k - 1], subgain_fx[i * num_join] );
    5138      513360 :                 mod_syn_fx[j] = L_shl( Mpy_32_16_1( synSHB_fx[j], round_fx( L_mac0( L_tmp, subwin_fx[k + 1], subgain_fx[( i + 1 ) * num_join] ) ) ), 1 ); // Qx
    5139      513360 :                 move32();
    5140      513360 :                 j = add( j, 1 );
    5141             :             }
    5142             :         }
    5143      521916 :         FOR( k = 0; k < join_length - length; k++ )
    5144             :         {
    5145      513360 :             mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); // Qx
    5146      513360 :             move32();
    5147      513360 :             j = add( j, 1 );
    5148             :         }
    5149      179676 :         FOR( k = 0; k < length; k++ )
    5150             :         {
    5151      171120 :             mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[length - k - 1], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ) ); // Qx
    5152      171120 :             move32();
    5153      171120 :             j = add( j, 1 );
    5154             :         }
    5155             :     }
    5156             : 
    5157        8556 :     Word16 norm_shift = norm_l( frame_gain_fx );
    5158        8556 :     if ( frame_gain_fx == 0 )
    5159             :     {
    5160           0 :         norm_shift = 31;
    5161           0 :         move16();
    5162             :     }
    5163             : 
    5164        8556 :     norm_shift = s_min( norm_shift, 14 );
    5165        8556 :     norm_shift = sub( norm_shift, 1 );
    5166             : 
    5167        8556 :     *Q_new = add( *Q_inp, sub( norm_shift, 13 ) ); // Q_new = Q_inp + min(norm_shift,14) - 14;
    5168        8556 :     move16();
    5169      179676 :     FOR( i = 0; i < L_SHB_LAHEAD; i++ )
    5170             :     {
    5171      171120 :         overlap_fx[i] = L_shl( overlap_fx[i], sub( *Q_new, *Q_inp ) );
    5172      171120 :         move32();
    5173             :     }
    5174             : 
    5175      179676 :     FOR( i = 0; i < l_shb_lahead; i++ )
    5176             :     {
    5177      171120 :         synSHB_fx[i] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[i] ) ); // Q_new
    5178      171120 :         synSHB_fx[i] = L_add( synSHB_fx[i], overlap_fx[i] );
    5179      171120 :         synSHB_fx[i + l_shb_lahead] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new
    5180      171120 :         move32();
    5181      171120 :         move32();
    5182      171120 :         move32();
    5183             :     }
    5184             : 
    5185     2575356 :     FOR( ; i < l_frame; i++ )
    5186             :     {
    5187     2566800 :         synSHB_fx[i] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new
    5188     2566800 :         move32();
    5189             :     }
    5190             : 
    5191      179676 :     FOR( ; i < l_frame + l_shb_lahead; i++ )
    5192             :     {
    5193      171120 :         synSHB_fx[i] = L_shl( synSHB_fx[i], sub( *Q_new, *Q_inp ) );
    5194      171120 :         overlap_fx[i - l_frame] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[l_frame + l_shb_lahead - 1 - i] ) ); // Q_new
    5195      171120 :         move32();
    5196      171120 :         move32();
    5197             :     }
    5198             : 
    5199        8556 :     *Q_inp = *Q_new;
    5200        8556 :     move16();
    5201        8556 :     return;
    5202             : }
    5203             : 
    5204             : 
    5205             : /*-------------------------------------------------------------------*
    5206             :  * ScaleShapedWB()
    5207             :  *
    5208             :  *
    5209             :  *-------------------------------------------------------------------*/
    5210             : 
    5211        6870 : void ScaleShapedWB_fx(
    5212             :     const Word16 length,     /* i    : SHB overlap length */
    5213             :     Word16 *synSHB,          /* i/o  : synthesized shb signal Q_bwe_exc/Qx   */
    5214             :     Word16 *overlap,         /* i/o  : buffer for overlap-add Q_bwe_exc/Qx   */
    5215             :     const Word16 *subgain,   /* i    : subframe gain Q15*/
    5216             :     const Word32 frame_gain, /* i    : frame gain Q18                        */
    5217             :     const Word16 *win,       /* i    : window Q15*/
    5218             :     const Word16 *subwin,    /* i    : subframes window Q15*/
    5219             :     const Word16 Q_bwe_exc,
    5220             :     Word16 L_frame,     /* i : Frame length - determines whether 12.8 or 16kHz core in-use */
    5221             :     Word16 dynQ,        /* i : indicate whether output is dynamic Q, or Q0 */
    5222             :     Word16 *Qx,         /* o : newly computed Q factor for  synSHB   */
    5223             :     Word16 prev_Qx,     /* i : prev_Qx for memory scaling            */
    5224             :     Word32 *Hilbert_Mem /* i : Hilbert memory used for computing Qx  */
    5225             : )
    5226             : {
    5227             :     const Word16 *skip;
    5228             :     Word16 i, j, k, l_shb_lahead, l_frame, l_frame_tmp;
    5229             :     Word16 join_length, num_join;
    5230             :     Word32 mod_syn[L_FRAME16k + L_SHB_LAHEAD];
    5231             :     Word16 sum_gain;
    5232             :     Word32 L_tmp;
    5233             :     Word16 max_val, abs_sig, sc1, sc2, shift, max_headroom, min_shift, max_shift, max_shift2;
    5234             :     /* Init */
    5235        6870 :     set32_fx( mod_syn, 0, L_FRAME16k + L_SHB_LAHEAD );
    5236             : 
    5237             :     /* apply gain for each subframe, and store noise output signal using overlap-add */
    5238        6870 :     IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
    5239             :     {
    5240             :         /* WB Gain shape and gain frame application with overlap */
    5241        6870 :         skip = skip_bands_WB_TBE;
    5242        6870 :         move16();
    5243        6870 :         l_frame = L_FRAME16k / 4;
    5244        6870 :         move16();
    5245        6870 :         l_shb_lahead = L_SHB_LAHEAD / 4;
    5246        6870 :         move16();
    5247             : 
    5248        6870 :         sum_gain = 0;
    5249        6870 :         move16();
    5250       41220 :         FOR( k = 0; k < length / 2; k++ )
    5251             :         {
    5252       34350 :             sum_gain = mult_r( subwin[2 * k + 2], subgain[0] ); /* Q15 */
    5253       34350 :             mod_syn[skip[0] + k] = L_mult( sum_gain, synSHB[skip[0] + k] );
    5254       34350 :             move32(); /* Q_bwe_exc + 16 */
    5255       34350 :             mod_syn[skip[0] + k + length / 2] = L_mult( subgain[0], synSHB[skip[0] + k + length / 2] );
    5256       34350 :             move32(); /* Q_bwe_exc + 16 */
    5257             :         }
    5258       54960 :         FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ )
    5259             :         {
    5260      528990 :             FOR( k = 0; k < length; k++ )
    5261             :             {
    5262      480900 :                 L_tmp = L_mult0( subwin[k + 1], subgain[i] );                                   /* Q30 */
    5263      480900 :                 sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i - 1] ) ); /* Q14 */
    5264      480900 :                 mod_syn[skip[i] + k] = L_shl( L_mult( sum_gain, synSHB[skip[i] + k] ), 1 );
    5265      480900 :                 move32(); /* Q_bwe_exc + 16 */
    5266             :             }
    5267             :         }
    5268       41220 :         FOR( k = 0; k < length / 2; k++ )
    5269             :         {
    5270       34350 :             sum_gain = mult_r( subwin[length - 2 * k - 2], subgain[i - 1] ); /* Q15 */
    5271       34350 :             mod_syn[skip[i] + k] = L_mult( sum_gain, synSHB[skip[i] + k] );
    5272       34350 :             move32(); /* Q_bwe_exc + 16 */
    5273             :         }
    5274             :     }
    5275             :     ELSE
    5276             :     {
    5277             :         /* SWB Gain shape and gain frame application with overlap */
    5278           0 :         l_frame = L_FRAME16k;
    5279           0 :         move16();
    5280           0 :         l_shb_lahead = L_SHB_LAHEAD;
    5281           0 :         move16();
    5282           0 :         skip = skip_bands_SWB_TBE;
    5283           0 :         move16();
    5284             : 
    5285           0 :         num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS;
    5286           0 :         move16();
    5287           0 :         join_length = i_mult2( num_join, length );
    5288           0 :         j = 0; /* ptr*/
    5289           0 :         move16();
    5290           0 :         FOR( k = 0; k < length; k++ )
    5291             :         {
    5292           0 :             sum_gain = mult_r( subwin[k + 1], subgain[0] ); /* Q15 */
    5293           0 :             mod_syn[j] = L_mult( synSHB[j], sum_gain );
    5294           0 :             move32(); /* Q_bwe_exc + 16 */
    5295           0 :             j++;
    5296             :         }
    5297             : 
    5298           0 :         FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ )
    5299             :         {
    5300           0 :             FOR( k = 0; k < join_length - length; k++ )
    5301             :             {
    5302           0 :                 mod_syn[j] = L_mult( synSHB[j], subgain[i * num_join] );
    5303           0 :                 move32(); /* Q_bwe_exc + 16 */
    5304           0 :                 j++;
    5305             :             }
    5306             : 
    5307           0 :             FOR( k = 0; k < length; k++ )
    5308             :             {
    5309           0 :                 L_tmp = L_mult0( subwin[k + 1], subgain[i_mult2( ( i + 1 ), num_join )] );             /* Q30 */
    5310           0 :                 sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i * num_join] ) ); /*Q14 */
    5311           0 :                 mod_syn[j] = L_shl( L_mult( sum_gain, synSHB[j] ), 1 );
    5312           0 :                 move32(); /* Q_bwe_exc + 16 */
    5313           0 :                 j++;
    5314             :             }
    5315             :         }
    5316           0 :         FOR( k = 0; k < join_length - length; k++ )
    5317             :         {
    5318           0 :             mod_syn[j] = L_mult( synSHB[j], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] );
    5319           0 :             move32(); /* Q_bwe_exc + 16 */
    5320           0 :             j++;
    5321             :         }
    5322           0 :         FOR( k = 0; k < length; k++ )
    5323             :         {
    5324           0 :             sum_gain = mult_r( subwin[length - k - 1], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); /* Q15 */
    5325           0 :             mod_syn[j] = L_mult( synSHB[j], sum_gain );
    5326           0 :             move32(); /* Q_bwe_exc + 16 */
    5327           0 :             j++;
    5328             :         }
    5329             :     }
    5330             : 
    5331             : 
    5332        6870 :     max_val = 0;
    5333        6870 :     move16();
    5334      590820 :     FOR( i = 0; i < l_frame + l_shb_lahead; i++ )
    5335             :     {
    5336      583950 :         abs_sig = abs_s( round_fx( mod_syn[i] ) );
    5337      583950 :         if ( GT_16( abs_sig, max_val ) )
    5338             :         {
    5339       49877 :             max_val = abs_sig;
    5340       49877 :             move16();
    5341             :         }
    5342             :     }
    5343             : 
    5344      151140 :     FOR( i = 0; i < HILBERT_MEM_SIZE; i++ )
    5345             :     {
    5346      144270 :         abs_sig = abs_s( round_fx( Hilbert_Mem[i] ) );
    5347      144270 :         if ( GT_16( abs_sig, max_val ) )
    5348             :         {
    5349           0 :             max_val = abs_sig;
    5350           0 :             move16();
    5351             :         }
    5352             :     }
    5353             : 
    5354        6870 :     sc1 = norm_s( max_val );                /* max_val headroom in mod_syn[] */
    5355        6870 :     sc2 = norm_s( round_fx( frame_gain ) ); /* headroom in GainFrame */
    5356             : 
    5357        6870 :     IF( dynQ == 0 )
    5358             :     {
    5359        6870 :         shift = sub( 13, Q_bwe_exc ); /* earlier = (10 - Q_bwe_exc) but we changed GainFrame Q21 to Q18 */
    5360        6870 :         *Qx = 0;
    5361        6870 :         move16();
    5362             :     }
    5363           0 :     ELSE IF( EQ_16( L_frame, L_FRAME ) ) /* 12.8k core */
    5364             :     {
    5365           0 :         max_headroom = sub( add( sc1, sc2 ), 4 ); /* Max headroom after multiplying = sc1 + sc2 -3 (keep 3 bit extra headroom) */
    5366             :         /* 12.8k core needs extra headroom than 16k core */
    5367             :         /* otherwise Hilbert transform inside flip_and_downmix have saturation, causes ringing in output */
    5368             : 
    5369             :         /* Qx = (Q_bwe_exc+3) + shift - 16  */
    5370             :         /* make sure 14 > Qx > 2            */
    5371           0 :         min_shift = sub( 2, sub( add( Q_bwe_exc, 3 ), 16 ) );
    5372           0 :         max_shift = sub( 13, sub( add( Q_bwe_exc, 3 ), 16 ) );
    5373           0 :         max_shift2 = s_min( max_shift, max_headroom ); /* avoid shifting more than the available max_val headroom to avoid overflow */
    5374             : 
    5375           0 :         shift = s_min( min_shift, max_shift2 );
    5376           0 :         *Qx = sub( add( add( Q_bwe_exc, 3 ), shift ), 16 );
    5377           0 :         move16();
    5378             :     }
    5379             :     ELSE /* 16k core */
    5380             :     {
    5381           0 :         max_headroom = sub( add( sc1, sc2 ), 1 ); /* Max headroom after multiplying = sc1 + sc2 -1 (keep 1 bit extra headroom) */
    5382             : 
    5383             :         /* Qx = (Q_bwe_exc+3) + shift - 16  */
    5384             :         /* make sure 14 > Qx > 3            */
    5385           0 :         min_shift = sub( 3, sub( add( Q_bwe_exc, 3 ), 16 ) );
    5386           0 :         move16();
    5387           0 :         max_shift = sub( 13, sub( add( Q_bwe_exc, 3 ), 16 ) );
    5388           0 :         move16();
    5389           0 :         max_shift2 = s_min( max_shift, max_headroom ); /* avoid shifting more than the available max_val headroom to avoid overflow */
    5390             : 
    5391           0 :         shift = s_min( min_shift, max_shift2 );
    5392           0 :         *Qx = sub( add( add( Q_bwe_exc, 3 ), shift ), 16 );
    5393           0 :         move16();
    5394             :     }
    5395             : 
    5396             :     /* bring memory st_fx->syn_overlap_fx[] = overlap[i] to new Q = Qx to prepare for addition */
    5397       41220 :     FOR( i = 0; i < l_shb_lahead; i++ )
    5398             :     {
    5399       34350 :         overlap[i] = shl( overlap[i], sub( *Qx, prev_Qx ) );
    5400       34350 :         move16();
    5401             :     }
    5402             : 
    5403       41220 :     FOR( i = 0; i < l_shb_lahead; i++ )
    5404             :     {
    5405             :         /* mod_syn in (16+Q_bwe_exc), frame_gain in Q18 */
    5406       34350 :         L_tmp = Mult_32_32( mod_syn[i], frame_gain );                                /* L_tmp in (Q_bwe_exc+3) */
    5407       34350 :         synSHB[i] = round_fx_sat( L_shl_sat( Mult_32_16( L_tmp, win[i] ), shift ) ); /* Qx */
    5408       34350 :         move16();
    5409       34350 :         synSHB[i] = add_sat( synSHB[i], overlap[i] );
    5410       34350 :         move16();                                                             /* Qx */
    5411       34350 :         synSHB[i + l_shb_lahead] = round_fx_sat( L_shl_sat( L_tmp, shift ) ); /* Qx */
    5412       34350 :         move16();
    5413             :     }
    5414             : 
    5415      522120 :     FOR( ; i < l_frame; i++ )
    5416             :     {
    5417      515250 :         L_tmp = Mult_32_32( mod_syn[i], frame_gain );          /* L_tmp in (Q_bwe_exc+3) */
    5418      515250 :         synSHB[i] = round_fx_sat( L_shl_sat( L_tmp, shift ) ); /* Qx; */
    5419      515250 :         move16();
    5420             :     }
    5421             : 
    5422        6870 :     l_frame_tmp = add( l_frame, l_shb_lahead );
    5423       41220 :     FOR( ; i < l_frame_tmp; i++ )
    5424             :     {
    5425       34350 :         L_tmp = Mult_32_32( mod_syn[i], frame_gain );                                                                        /* (Q_bwe_exc+3) */
    5426       34350 :         overlap[i - l_frame] = round_fx_sat( L_shl_sat( Mult_32_16( L_tmp, win[l_frame + l_shb_lahead - 1 - i] ), shift ) ); /* Qx */
    5427       34350 :         move16();
    5428             :     }
    5429             : 
    5430        6870 :     return;
    5431             : }
    5432             : 
    5433             : /*-------------------------------------------------------------------*
    5434             :  * non_linearity()
    5435             :  *
    5436             :  * Apply a non linearity to the SHB excitation
    5437             :  * -------------------------------------------------------------------*/
    5438             : 
    5439        8128 : static Word32 non_linearity_scaled_copy(
    5440             :     const Word16 input[],
    5441             :     Word16 j,
    5442             :     const Word16 length,
    5443             :     Word32 output[],
    5444             :     Word32 prev_scale,
    5445             :     const Word16 scale_step,
    5446             :     const Word16 en_abs )
    5447             : {
    5448             :     Word16 i;
    5449             :     Word32 L_tmp;
    5450             : 
    5451             : 
    5452        8128 :     IF( en_abs )
    5453             :     {
    5454           0 :         FOR( i = 0; i < j; i++ )
    5455             :         {
    5456           0 :             L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
    5457           0 :             L_tmp = Mult_32_32( L_tmp, prev_scale );  /* 2*Q_inp */
    5458           0 :             output[i] = L_tmp;
    5459           0 :             move32();
    5460             : 
    5461           0 :             L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */
    5462           0 :             prev_scale = L_shl( L_tmp, 1 );               /* Q30 */
    5463             :         }
    5464           0 :         FOR( ; i < length; i++ )
    5465             :         {
    5466           0 :             L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
    5467           0 :             L_tmp = Mult_32_32( L_tmp, prev_scale );  /* 2*Q_inp */
    5468           0 :             output[i] = L_tmp;
    5469           0 :             move32();
    5470             :         }
    5471             :     }
    5472             :     ELSE
    5473             :     {
    5474     1234639 :         FOR( i = 0; i < j; i++ )
    5475             :         {
    5476     1226511 :             L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
    5477     1226511 :             L_tmp = Mult_32_32( L_tmp, prev_scale );  /* 2*Q_inp */
    5478             : 
    5479     1226511 :             if ( input[i] < 0 )
    5480             :             {
    5481      615622 :                 L_tmp = L_negate( L_tmp );
    5482             :             }
    5483     1226511 :             output[i] = L_tmp;
    5484     1226511 :             move32();
    5485             : 
    5486     1226511 :             L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */
    5487     1226511 :             prev_scale = L_shl( L_tmp, 1 );               /* Q30 */
    5488             :         }
    5489             : 
    5490     1382577 :         FOR( ; i < length; i++ )
    5491             :         {
    5492     1374449 :             L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
    5493     1374449 :             L_tmp = Mult_32_32( L_tmp, prev_scale );  /* 2*Q_inp */
    5494             : 
    5495     1374449 :             if ( input[i] < 0 )
    5496             :             {
    5497      669586 :                 L_tmp = L_negate( L_tmp );
    5498             :             }
    5499     1374449 :             output[i] = L_tmp;
    5500     1374449 :             move32();
    5501             :         }
    5502             :     }
    5503        8128 :     return prev_scale;
    5504             : }
    5505             : 
    5506             : 
    5507             : /*-------------------------------------------------------------------*
    5508             :  * non_linearity()
    5509             :  *
    5510             :  * Apply a non linearity to the SHB excitation
    5511             :  * -------------------------------------------------------------------*/
    5512             : 
    5513      649282 : static Word32 non_linearity_scaled_copy_ivas(
    5514             :     const Word16 input[],
    5515             :     Word16 j,
    5516             :     const Word16 length,
    5517             :     Word32 output[],
    5518             :     Word32 prev_scale,
    5519             :     const Word16 scale_step,
    5520             :     const Word16 en_abs )
    5521             : {
    5522             :     Word16 i;
    5523             :     Word32 L_tmp;
    5524             : 
    5525             : 
    5526      649282 :     IF( en_abs )
    5527             :     {
    5528        1672 :         FOR( i = 0; i < j; i++ )
    5529             :         {
    5530        1664 :             L_tmp = L_mult( input[i], input[i] );    /* 2*Q_inp+1 */
    5531        1664 :             L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
    5532             : 
    5533        1664 :             test();
    5534        1664 :             test();
    5535        1664 :             if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 )
    5536             :             {
    5537             :                 /* NOTE: this is done to avoid the product to become zero for small non-zero input */
    5538         139 :                 L_tmp = 1;
    5539         139 :                 move16();
    5540             :             }
    5541             : 
    5542        1664 :             output[i] = L_tmp;
    5543        1664 :             move32();
    5544             : 
    5545        1664 :             L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */
    5546        1664 :             prev_scale = L_shl( L_tmp, 1 );               /* Q30 */
    5547             :         }
    5548         904 :         FOR( ; i < length; i++ )
    5549             :         {
    5550             :             /* L_tmp = (input[i] * input[i]) * prev_scale;*/
    5551         896 :             L_tmp = Mpy_32_16_1( Mpy_32_16_1( prev_scale, input[i] ), input[i] ); /* 2*Q_inp */
    5552             : 
    5553         896 :             test();
    5554         896 :             test();
    5555         896 :             if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 )
    5556             :             {
    5557             :                 /* NOTE: this is done to avoid the product to become zero for small non-zero input */
    5558          71 :                 L_tmp = 1;
    5559          71 :                 move16();
    5560             :             }
    5561         896 :             output[i] = L_tmp;
    5562         896 :             move32();
    5563             :         }
    5564             :     }
    5565             :     ELSE
    5566             :     {
    5567    95587927 :         FOR( i = 0; i < j; i++ )
    5568             :         {
    5569    94938653 :             L_tmp = L_mult( input[i], input[i] );    /* 2*Q_inp+1 */
    5570    94938653 :             L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
    5571             : 
    5572    94938653 :             test();
    5573    94938653 :             test();
    5574    94938653 :             if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 )
    5575             :             {
    5576             :                 /* NOTE: this is done to avoid the product to become zero for small non-zero input */
    5577    12593549 :                 L_tmp = 1;
    5578    12593549 :                 move16();
    5579             :             }
    5580             : 
    5581    94938653 :             if ( input[i] < 0 )
    5582             :             {
    5583    47064704 :                 L_tmp = L_negate( L_tmp );
    5584             :             }
    5585    94938653 :             output[i] = L_tmp;
    5586    94938653 :             move32();
    5587             : 
    5588    94938653 :             L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */
    5589    94938653 :             prev_scale = L_shl( L_tmp, 1 );               /* Q30 */
    5590             :         }
    5591             : 
    5592   113478301 :         FOR( ; i < length; i++ )
    5593             :         {
    5594   112829027 :             L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
    5595   112829027 :             L_tmp = Mult_32_32( L_tmp, prev_scale );  /* 2*Q_inp */
    5596   112829027 :             test();
    5597   112829027 :             test();
    5598   112829027 :             if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 )
    5599             :             {
    5600             :                 /* NOTE: this is done to avoid the product to become zero for small non-zero input */
    5601    13223345 :                 L_tmp = 1;
    5602    13223345 :                 move16();
    5603             :             }
    5604             : 
    5605   112829027 :             if ( input[i] < 0 )
    5606             :             {
    5607    50243983 :                 L_tmp = L_negate( L_tmp );
    5608             :             }
    5609   112829027 :             output[i] = L_tmp;
    5610   112829027 :             move32();
    5611             :         }
    5612             :     }
    5613      649282 :     return prev_scale;
    5614             : }
    5615             : 
    5616             : 
    5617             : /*==========================================================================*/
    5618             : /* FUNCTION : void non_linearity() */
    5619             : /*--------------------------------------------------------------------------*/
    5620             : /* PURPOSE : Apply a non linearity to the SHB excitation */
    5621             : /*--------------------------------------------------------------------------*/
    5622             : /* INPUT ARGUMENTS : */
    5623             : /* Word16 input[] i : input signal Q_inp */
    5624             : /* Word16 length i : input length */
    5625             : /*--------------------------------------------------------------------------*/
    5626             : /* OUTPUT ARGUMENTS : */
    5627             : /* Word32 output[] o : output signal 2*Q_inp */
    5628             : /*--------------------------------------------------------------------------*/
    5629             : /* INPUT/OUTPUT ARGUMENTS : */
    5630             : /* Word32 *prev_scale i/o: memory Q30 */
    5631             : /*--------------------------------------------------------------------------*/
    5632             : /* RETURN ARGUMENTS : */
    5633             : /* _ None */
    5634             : /*--------------------------------------------------------------------------*/
    5635             : /* CALLED FROM : */
    5636             : /*==========================================================================*/
    5637             : 
    5638        4064 : void non_linearity_fx(
    5639             :     const Word16 input[], /* i : input signal Q_inp */
    5640             :     Word32 output[],      /* o : output signal 2*Q_inp */
    5641             :     const Word16 length,  /* i : input length */
    5642             :     Word32 *pPrevScale,   /* i/o: memory Q30 */
    5643             :     Word16 Q_inp,
    5644             :     Word16 coder_type,     /* i  : Coder Type          */
    5645             :     Word16 *voice_factors, /* i  : Voice Factors       */
    5646             :     const Word16 L_frame   /* i  : ACELP frame length  */
    5647             : 
    5648             : )
    5649             : {
    5650             :     Word16 i, j;
    5651        4064 :     Word16 max_val = 0;
    5652        4064 :     move16();
    5653             :     Word32 scale;
    5654             :     Word16 scale_step;
    5655             :     Word16 exp, tmp;
    5656             :     Word16 e_tmp, f_tmp;
    5657             :     Word16 frac;
    5658             :     Word32 L_tmp;
    5659             :     Word32 L_tmp1;
    5660             : 
    5661        4064 :     Word16 en_abs = 0;
    5662        4064 :     Word16 v_fac = 0;
    5663        4064 :     move16();
    5664        4064 :     move16();
    5665             :     Word16 ths;
    5666             :     Word16 nframes;
    5667             :     Word32 prev_scale;
    5668             :     Word16 length_half;
    5669             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
    5670        4064 :     Flag Overflow = 0;
    5671        4064 :     move32();
    5672             : #endif
    5673             : 
    5674             : 
    5675        4064 :     IF( EQ_16( L_frame, L_FRAME16k ) )
    5676             :     {
    5677        2557 :         nframes = 5;
    5678        2557 :         move16();
    5679        2557 :         ths = 17817;
    5680        2557 :         move16(); /* 0.87*5 in Q12 */
    5681             :     }
    5682             :     ELSE
    5683             :     {
    5684        1507 :         nframes = 4;
    5685        1507 :         move16();
    5686        1507 :         ths = 15400;
    5687        1507 :         move16(); /* 0.94*4 in Q12 */
    5688             :     }
    5689             : 
    5690             : 
    5691       22877 :     FOR( i = 0; i < nframes; i++ )
    5692             :     {
    5693       18813 :         v_fac = add( v_fac, shr( voice_factors[i], 3 ) ); /* Q12 */
    5694             :     }
    5695             : 
    5696        4064 :     test();
    5697        4064 :     if ( EQ_16( coder_type, VOICED ) && GT_16( v_fac, ths ) )
    5698             :     {
    5699           0 :         en_abs = 1;
    5700           0 :         move16();
    5701             :     }
    5702             : 
    5703        4064 :     length_half = shr( length, 1 );
    5704        4064 :     prev_scale = *pPrevScale;
    5705        4064 :     move32();
    5706             : 
    5707             : 
    5708             :     /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */
    5709             : 
    5710     1304544 :     FOR( i = j = 0; i < length_half; i++ )
    5711             :     {
    5712     1300480 :         tmp = abs_s( input[i] );
    5713     1300480 :         if ( GT_16( tmp, max_val ) )
    5714             :         {
    5715       28847 :             j = i;
    5716       28847 :             move16();
    5717             :         }
    5718     1300480 :         max_val = s_max( max_val, tmp );
    5719             :     }
    5720             : 
    5721             : 
    5722        4064 :     IF( GT_16( max_val, shl( 1, Q_inp ) ) )
    5723             :     {
    5724        4061 :         exp = norm_s( max_val );
    5725        4061 :         tmp = div_s( shl( 1, sub( 14, exp ) ), max_val );                    /* Q(29-exp-Q_inp) */
    5726        4061 :         scale = L_shl( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ) ); /* Q31 */
    5727             :     }
    5728             :     ELSE
    5729             :     {
    5730           3 :         scale = 1438814044;
    5731           3 :         move32(); /* Q31; 0.67 in Q31 */
    5732             :     }
    5733             : 
    5734        4064 :     test();
    5735        4064 :     IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 32 ), scale ) )
    5736             :     {
    5737         127 :         scale_step = 16384;
    5738         127 :         move16();                       /* Q14 */
    5739         127 :         prev_scale = L_shr( scale, 1 ); /* Q30 */
    5740             :     }
    5741             :     ELSE
    5742             :     {
    5743             : 
    5744             :         /* Computing log2(scale) */
    5745        3937 :         IF( j == 0 )
    5746             :         {
    5747          36 :             scale_step = 32767;
    5748          36 :             move16();
    5749             :         }
    5750             :         ELSE
    5751             :         {
    5752        3901 :             e_tmp = norm_l( scale );
    5753        3901 :             f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) );
    5754        3901 :             e_tmp = sub( -1, e_tmp );
    5755        3901 :             L_tmp = Mpy_32_16( e_tmp, f_tmp, MAX_16 ); /* Q16 */
    5756             : 
    5757             :             /* Computing log2(prev_scale) */
    5758        3901 :             e_tmp = norm_l( prev_scale );
    5759        3901 :             f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) );
    5760        3901 :             e_tmp = negate( e_tmp );
    5761        3901 :             L_tmp1 = Mpy_32_16( e_tmp, f_tmp, MAX_16 ); /* Q16 */
    5762             : 
    5763             :             /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */
    5764        3901 :             L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */
    5765             : 
    5766             :             /* Computing 1/j */
    5767        3901 :             exp = norm_s( j );
    5768        3901 :             tmp = div_s( shl( 1, sub( 14, exp ) ), j ); /* Q(29-exp) */
    5769             : 
    5770             :             /* (log2(scale / prev_scale))/length */
    5771        3901 :             L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /* Q(16+29-exp+1-16+exp-14)->Q16 */
    5772             : 
    5773        3901 :             frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
    5774             : 
    5775        3901 :             tmp = extract_l( Pow2( 14, frac ) );
    5776        3901 :             scale_step = shl_o( tmp, exp, &Overflow ); /* Q14 */
    5777             :         }
    5778             :     }
    5779             : 
    5780        4064 :     prev_scale = non_linearity_scaled_copy( input, j, length_half, output, prev_scale, scale_step, en_abs );
    5781             : 
    5782        4064 :     max_val = 0;
    5783        4064 :     move16();
    5784        4064 :     j = shr( length, 1 );
    5785     1304544 :     FOR( i = length_half; i < length; i++ )
    5786             :     {
    5787     1300480 :         tmp = abs_s( input[i] );
    5788     1300480 :         if ( GT_16( tmp, max_val ) )
    5789             :         {
    5790       29288 :             j = i;
    5791       29288 :             move16();
    5792             :         }
    5793     1300480 :         max_val = s_max( max_val, tmp );
    5794             :     }
    5795             : 
    5796        4064 :     IF( GT_16( max_val, shl( 1, Q_inp ) ) )
    5797             :     {
    5798        4060 :         exp = norm_s( max_val );
    5799        4060 :         tmp = div_s( shl( 1, sub( 14, exp ) ), max_val );                                                   /* Q(29-exp-Q_inp) */
    5800        4060 :         scale = L_shl_o( L_mult( 21955 /* 0.67 in Q15 */, tmp ), add( exp, sub( Q_inp, 14 ) ), &Overflow ); /* Q31 */
    5801             :     }
    5802             :     ELSE
    5803             :     {
    5804           4 :         scale = 1438814044;
    5805           4 :         move32(); /* Q31; 0.67 in Q31 */
    5806             :     }
    5807             : 
    5808        4064 :     test();
    5809        4064 :     IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 32 ), scale ) )
    5810             :     {
    5811           0 :         scale_step = 16384;
    5812           0 :         move16();                       /*Q14 */
    5813           0 :         prev_scale = L_shr( scale, 1 ); /*Q30 */
    5814             :     }
    5815             :     ELSE
    5816             :     {
    5817             :         /*scale_step = (float) exp(1.0f / (float) (j - length/2) * (float) log(scale / prev_scale)); */
    5818             :         /* Computing log2(scale) */
    5819        4064 :         IF( EQ_16( j, length_half ) )
    5820             :         {
    5821          53 :             scale_step = 32767;
    5822          53 :             move16(); /*Q14 */
    5823             :         }
    5824             :         ELSE
    5825             :         {
    5826        4011 :             e_tmp = norm_l( scale );
    5827        4011 :             f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) );
    5828        4011 :             e_tmp = sub( -e_tmp, 1 );
    5829        4011 :             L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
    5830             : 
    5831             :             /* Computing log2(prev_scale) */
    5832        4011 :             e_tmp = norm_l( prev_scale );
    5833        4011 :             f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) );
    5834        4011 :             e_tmp = negate( e_tmp );
    5835        4011 :             L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
    5836             : 
    5837             :             /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */
    5838        4011 :             L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */
    5839             : 
    5840             :             /* Computing 1/(j - length/2) */
    5841             : 
    5842        4011 :             tmp = sub( j, length_half );
    5843        4011 :             exp = norm_s( tmp );
    5844             : 
    5845             : 
    5846        4011 :             tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /* Q(29-exp) */
    5847             : 
    5848             :             /* (log2(scale / prev_scale))/length */
    5849        4011 :             L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /*Q(16+29-exp+1-16+exp-14)->Q16 */
    5850             : 
    5851        4011 :             frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
    5852             : 
    5853        4011 :             tmp = extract_l( Pow2( 14, frac ) );
    5854        4011 :             scale_step = shl_o( tmp, exp, &Overflow ); /*Q14 */
    5855             :         }
    5856             :     }
    5857             : 
    5858        4064 :     prev_scale = non_linearity_scaled_copy( input + length_half, sub( j, length_half ), sub( length, length_half ), output + length_half, prev_scale, scale_step, en_abs );
    5859             : 
    5860        4064 :     *pPrevScale = prev_scale;
    5861        4064 :     move32();
    5862             : 
    5863             :     /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */
    5864             : 
    5865        4064 :     return;
    5866             : }
    5867             : 
    5868             : 
    5869             : /*==========================================================================*/
    5870             : /* FUNCTION : void non_linearity_ivas_fx() */
    5871             : /*--------------------------------------------------------------------------*/
    5872             : /* PURPOSE : Apply a non linearity to the SHB excitation */
    5873             : /*--------------------------------------------------------------------------*/
    5874             : /* INPUT ARGUMENTS : */
    5875             : /* Word16 input[] i : input signal Q_inp */
    5876             : /* Word16 length i : input length */
    5877             : /*--------------------------------------------------------------------------*/
    5878             : /* OUTPUT ARGUMENTS : */
    5879             : /* Word32 output[] o : output signal 2*Q_inp */
    5880             : /*--------------------------------------------------------------------------*/
    5881             : /* INPUT/OUTPUT ARGUMENTS : */
    5882             : /* Word32 *prev_scale i/o: memory Q30 */
    5883             : /*--------------------------------------------------------------------------*/
    5884             : /* RETURN ARGUMENTS : */
    5885             : /* _ None */
    5886             : /*--------------------------------------------------------------------------*/
    5887             : /* CALLED FROM : */
    5888             : /*==========================================================================*/
    5889             : 
    5890      324641 : void non_linearity_ivas_fx(
    5891             :     const Word16 input[], /* i : input signal Q_inp */
    5892             :     Word32 output[],      /* o : output signal 2*Q_inp */
    5893             :     const Word16 length,  /* i : input length */
    5894             :     Word32 *pPrevScale,   /* i/o: memory Q30 */
    5895             :     Word16 Q_inp,
    5896             :     Word16 coder_type,     /* i  : Coder Type          */
    5897             :     Word16 *voice_factors, /* i  : Voice Factors       */
    5898             :     const Word16 L_frame   /* i  : ACELP frame length  */
    5899             : 
    5900             : )
    5901             : {
    5902             :     Word16 i, j;
    5903      324641 :     Word16 max_val = 0;
    5904      324641 :     move16();
    5905             :     Word32 scale;
    5906             :     Word16 scale_step;
    5907             :     Word16 exp, tmp;
    5908             :     Word16 e_tmp, f_tmp;
    5909             :     Word16 frac;
    5910             :     Word32 L_tmp;
    5911             :     Word32 L_tmp1;
    5912             : 
    5913      324641 :     Word16 en_abs = 0;
    5914      324641 :     Word16 v_fac = 0;
    5915      324641 :     move16();
    5916      324641 :     move16();
    5917             :     Word16 ths;
    5918             :     Word16 nframes;
    5919             :     Word32 prev_scale;
    5920             :     Word16 length_half;
    5921             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
    5922      324641 :     Flag Overflow = 0;
    5923      324641 :     move32();
    5924             : #endif
    5925             : 
    5926             : 
    5927      324641 :     IF( EQ_16( L_frame, L_FRAME16k ) )
    5928             :     {
    5929      154217 :         nframes = 5;
    5930      154217 :         move16();
    5931      154217 :         ths = 17817;
    5932      154217 :         move16(); /* 0.87*5 in Q12 */
    5933             :     }
    5934             :     ELSE
    5935             :     {
    5936      170424 :         nframes = 4;
    5937      170424 :         move16();
    5938      170424 :         ths = 15400;
    5939      170424 :         move16(); /* 0.94*4 in Q12 */
    5940             :     }
    5941             : 
    5942             : 
    5943     1777422 :     FOR( i = 0; i < nframes; i++ )
    5944             :     {
    5945     1452781 :         v_fac = add( v_fac, shr( voice_factors[i], 3 ) ); /* Q12 */
    5946             :     }
    5947             : 
    5948      324641 :     test();
    5949      324641 :     if ( EQ_16( coder_type, VOICED ) && GT_16( v_fac, ths ) )
    5950             :     {
    5951           4 :         en_abs = 1;
    5952           4 :         move16();
    5953             :     }
    5954             : 
    5955      324641 :     length_half = shr( length, 1 );
    5956      324641 :     prev_scale = *pPrevScale;
    5957      324641 :     move32();
    5958             : 
    5959             : 
    5960             :     /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */
    5961             : 
    5962   104209761 :     FOR( i = j = 0; i < length_half; i++ )
    5963             :     {
    5964   103885120 :         tmp = abs_s( input[i] );
    5965   103885120 :         if ( GT_16( tmp, max_val ) )
    5966             :         {
    5967     2272867 :             j = i;
    5968     2272867 :             move16();
    5969             :         }
    5970   103885120 :         max_val = s_max( max_val, tmp );
    5971             :     }
    5972             : 
    5973             : 
    5974      324641 :     IF( GT_16( max_val, shl( 1, Q_inp ) ) )
    5975             :     {
    5976      305574 :         exp = norm_s( max_val );
    5977      305574 :         tmp = div_s( shl( 1, sub( 14, exp ) ), max_val );                    /* Q(29-exp-Q_inp) */
    5978      305574 :         scale = L_shl( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ) ); /* Q31 */
    5979             :     }
    5980             :     ELSE
    5981             :     {
    5982       19067 :         scale = 1438814044;
    5983       19067 :         move32(); /* Q31; 0.67 in Q31 */
    5984             :     }
    5985             : 
    5986      324641 :     test();
    5987      324641 :     IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 64 ) /*Q30 -> Q31*/, scale /*Q31*/ ) )
    5988             :     {
    5989       50837 :         scale_step = 16384;
    5990       50837 :         move16();                       /* Q14 */
    5991       50837 :         prev_scale = L_shr( scale, 1 ); /* Q30 */
    5992             :     }
    5993             :     ELSE
    5994             :     {
    5995             : 
    5996             :         /* Computing log2(scale) */
    5997      273804 :         IF( j == 0 )
    5998             :         {
    5999       17862 :             scale_step = 32767;
    6000       17862 :             move16();
    6001             :         }
    6002             :         ELSE
    6003             :         {
    6004      255942 :             e_tmp = norm_l( scale );
    6005      255942 :             f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) );
    6006      255942 :             e_tmp = sub( -1, e_tmp );
    6007      255942 :             L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
    6008             : 
    6009             :             /* Computing log2(prev_scale) */
    6010      255942 :             e_tmp = norm_l( prev_scale );
    6011      255942 :             f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) );
    6012      255942 :             e_tmp = negate( e_tmp );
    6013      255942 :             L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
    6014             : 
    6015             :             /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */
    6016      255942 :             L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */
    6017             : 
    6018             :             /* Computing 1/j */
    6019      255942 :             exp = norm_s( j );
    6020      255942 :             tmp = div_s( shl( 1, sub( 14, exp ) ), j ); /* Q(29-exp) */
    6021             : 
    6022             :             /* (log2(scale / prev_scale))/length */
    6023      255942 :             L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /* Q(16+29-exp+1-16+exp-14)->Q16 */
    6024             : 
    6025      255942 :             frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
    6026             : 
    6027      255942 :             tmp = extract_l( Pow2( 14, frac ) );
    6028      255942 :             scale_step = shl_o( tmp, exp, &Overflow ); /* Q14 */
    6029             :         }
    6030             :     }
    6031             : 
    6032      324641 :     prev_scale = non_linearity_scaled_copy_ivas( input, j, length_half, output, prev_scale, scale_step, en_abs );
    6033             : 
    6034      324641 :     max_val = 0;
    6035      324641 :     move16();
    6036      324641 :     j = shr( length, 1 );
    6037   104209761 :     FOR( i = length_half; i < length; i++ )
    6038             :     {
    6039   103885120 :         tmp = abs_s( input[i] );
    6040   103885120 :         if ( GT_16( tmp, max_val ) )
    6041             :         {
    6042     2289516 :             j = i;
    6043     2289516 :             move16();
    6044             :         }
    6045   103885120 :         max_val = s_max( max_val, tmp );
    6046             :     }
    6047             : 
    6048      324641 :     IF( GT_16( max_val, shl( 1, Q_inp ) ) )
    6049             :     {
    6050      305094 :         exp = norm_s( max_val );
    6051      305094 :         tmp = div_s( shl( 1, sub( 14, exp ) ), max_val );                                 /* Q(29-exp-Q_inp) */
    6052      305094 :         scale = L_shl_o( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ), &Overflow ); /* Q31 */
    6053             :     }
    6054             :     ELSE
    6055             :     {
    6056       19547 :         scale = 1438814044;
    6057       19547 :         move32(); /* Q31; 0.67 in Q31 */
    6058             :     }
    6059             : 
    6060      324641 :     test();
    6061      324641 :     IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 64 ), scale ) )
    6062             :     {
    6063           0 :         scale_step = 16384;
    6064           0 :         move16();                       /*Q14 */
    6065           0 :         prev_scale = L_shr( scale, 1 ); /*Q30 */
    6066             :     }
    6067             :     ELSE
    6068             :     {
    6069             :         /*scale_step = (float) exp(1.0f / (float) (j - length/2) * (float) log(scale / prev_scale)); */
    6070             :         /* Computing log2(scale) */
    6071      324641 :         IF( EQ_16( j, length_half ) )
    6072             :         {
    6073       21284 :             scale_step = 32767;
    6074       21284 :             move16(); /*Q14 */
    6075             :         }
    6076             :         ELSE
    6077             :         {
    6078      303357 :             e_tmp = norm_l( scale );
    6079      303357 :             f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) );
    6080      303357 :             e_tmp = sub( -e_tmp, 1 );
    6081      303357 :             L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
    6082             : 
    6083             :             /* Computing log2(prev_scale) */
    6084      303357 :             e_tmp = norm_l( prev_scale );
    6085      303357 :             f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) );
    6086      303357 :             e_tmp = negate( e_tmp );
    6087      303357 :             L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
    6088             : 
    6089             :             /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */
    6090      303357 :             L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */
    6091             : 
    6092             :             /* Computing 1/(j - length/2) */
    6093             : 
    6094      303357 :             tmp = sub( j, length_half );
    6095      303357 :             exp = norm_s( tmp );
    6096             : 
    6097             : 
    6098      303357 :             tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /* Q(29-exp) */
    6099             : 
    6100             :             /* (log2(scale / prev_scale))/length */
    6101      303357 :             L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /*Q(16+29-exp+1-16+exp-14)->Q16 */
    6102             : 
    6103      303357 :             frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
    6104             : 
    6105      303357 :             tmp = extract_l( Pow2( 14, frac ) );
    6106      303357 :             scale_step = shl_o( tmp, exp, &Overflow ); /*Q14 */
    6107             :         }
    6108             :     }
    6109             : 
    6110      324641 :     prev_scale = non_linearity_scaled_copy_ivas( input + length_half, sub( j, length_half ), sub( length, length_half ), output + length_half, prev_scale, scale_step, en_abs );
    6111             : 
    6112      324641 :     *pPrevScale = prev_scale;
    6113      324641 :     move32();
    6114             : 
    6115             :     /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */
    6116             : 
    6117      324641 :     return;
    6118             : }
    6119             : 
    6120             : 
    6121             : /*-------------------------------------------------------------------*
    6122             :  * create_random_vector()
    6123             :  *
    6124             :  * creates random number vector
    6125             :  * Note: the abs(max_val) value coming out of create_random_vector should
    6126             :  *       fit into the precision of Q6.
    6127             :  * -------------------------------------------------------------------*/
    6128             : 
    6129      438177 : void create_random_vector_fx(
    6130             :     Word16 output[],     /* o : output random vector Q5*/
    6131             :     const Word16 length, /* i : length of random vector */
    6132             :     Word16 seed[]        /* i/o: start seed */
    6133             : )
    6134             : {
    6135             :     Word16 i, j, k;
    6136             :     Word16 scale1, scale2;
    6137             :     Word32 L_tmp;
    6138             : 
    6139      438177 :     L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[0] ) ) ); /*Q23 */
    6140      438177 :     j = extract_l( L_shr( L_tmp, 23 ) );
    6141      438177 :     j = s_and( j, 0xff );
    6142             : 
    6143      438177 :     L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[1] ) ) ); /*Q23 */
    6144      438177 :     k = extract_l( L_shr( L_tmp, 23 ) );
    6145      438177 :     k = s_and( k, 0xff );
    6146             : 
    6147      439686 :     WHILE( EQ_16( k, j ) )
    6148             :     {
    6149        1509 :         L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[1] ) ) ); /*Q23 */
    6150        1509 :         k = extract_l( L_shr( L_tmp, 23 ) );
    6151        1509 :         k = s_and( k, 0xff );
    6152             :     }
    6153             : 
    6154      438177 :     scale1 = 18021;
    6155      438177 :     move16(); /* 200.00f * 0.35f/0.1243f; */
    6156      438177 :     if ( Random( &seed[0] ) < 0 )
    6157             :     {
    6158      218048 :         scale1 = -18021;
    6159      218048 :         move16(); /*Q5 */ /* -200.00f * 0.35f/0.1243f; */
    6160             :     }
    6161             : 
    6162      438177 :     scale2 = 7208;
    6163      438177 :     move16(); /* 80.00f * 0.35f/0.1243f; */
    6164      438177 :     if ( Random( &seed[1] ) < 0 )
    6165             :     {
    6166      226825 :         scale2 = -7208;
    6167      226825 :         move16(); /*Q5 */ /* -80.00f * 0.35f/0.1243f; */
    6168             :     }
    6169             : 
    6170    69409457 :     FOR( i = 0; i < length; i++ )
    6171             :     {
    6172    68971280 :         j = s_and( j, 0xff );
    6173    68971280 :         k = s_and( k, 0xff );
    6174    68971280 :         output[i] = round_fx( L_add( L_mult( scale1, gaus_dico_swb_fx[j] ), L_mult( scale2, gaus_dico_swb_fx[k] ) ) ); /*Q5 */
    6175    68971280 :         move16();
    6176    68971280 :         j++;
    6177    68971280 :         k++;
    6178             :     }
    6179             : 
    6180      438177 :     return;
    6181             : }
    6182             : 
    6183             : 
    6184             : /*======================================================================================*/
    6185             : /* FUNCTION : interp_code_5over2_fx() */
    6186             : /*--------------------------------------------------------------------------------------*/
    6187             : /* PURPOSE : Used to interpolate the excitation from the core sample rate */
    6188             : /* of 12.8 kHz to 32 kHz. */
    6189             : /* Simple linear interpolator - No need FOR precision here. */
    6190             : /*--------------------------------------------------------------------------------------*/
    6191             : /* INPUT ARGUMENTS : */
    6192             : /* _ (Word16[]) inp_code_fx : input vector (Q12) */
    6193             : /* _ (Word16) inp_length : length of input vector */
    6194             : /*--------------------------------------------------------------------------------------*/
    6195             : /* OUTPUT ARGUMENTS : */
    6196             : /* _ (Word16[]) interp_code_fx : output vector (Q12) */
    6197             : /*--------------------------------------------------------------------------------------*/
    6198             : /* INPUT/OUTPUT ARGUMENTS : */
    6199             : /* _ None */
    6200             : /*--------------------------------------------------------------------------------------*/
    6201             : 
    6202             : /* _ None */
    6203             : /*--------------------------------------------------------------------------------------*/
    6204             : /* RETURN ARGUMENTS : */
    6205             : /* _ None */
    6206             : /*======================================================================================*/
    6207             : 
    6208      527649 : void interp_code_5over2_fx(
    6209             :     const Word16 inp_code_fx[], /* i : input vector Qx*/
    6210             :     Word16 interp_code_fx[],    /* o : output vector Qx*/
    6211             :     const Word16 inp_length     /* i : length of input vector */
    6212             : )
    6213             : {
    6214             :     Word16 i, kk, kkp1, i_len2;
    6215             :     Word32 Ltemp;
    6216      527649 :     Word16 factor_i_fx[5] = { 6554, 19661, 32767, 19661, 6554 };
    6217      527649 :     move16();
    6218      527649 :     move16();
    6219      527649 :     move16();
    6220      527649 :     move16();
    6221      527649 :     move16();
    6222      527649 :     move16();
    6223      527649 :     Word16 factor_j_fx[5] = { 26214, 13107, 0, 13107, 26214 };
    6224      527649 :     move16();
    6225      527649 :     move16();
    6226      527649 :     move16();
    6227      527649 :     move16();
    6228      527649 :     move16();
    6229      527649 :     interp_code_fx[0] = inp_code_fx[0];
    6230      527649 :     move16(); /* Qx */
    6231             : 
    6232      527649 :     Ltemp = L_mult( inp_code_fx[0], factor_i_fx[3] );       /* Q(16+x) */
    6233      527649 :     Ltemp = L_mac( Ltemp, inp_code_fx[1], factor_j_fx[3] ); /* Q(16+x) */
    6234      527649 :     interp_code_fx[1] = round_fx( Ltemp );                  /*Qx */
    6235      527649 :     move16();
    6236      527649 :     Ltemp = L_mult( inp_code_fx[0], factor_i_fx[4] );       /*Q(16+x) */
    6237      527649 :     Ltemp = L_mac( Ltemp, inp_code_fx[1], factor_j_fx[4] ); /*Q(16+x) */
    6238      527649 :     interp_code_fx[2] = round_fx( Ltemp );                  /* Qx */
    6239      527649 :     move16();
    6240      527649 :     kk = 1;
    6241      527649 :     move16();
    6242      527649 :     kkp1 = 2;
    6243      527649 :     move16();
    6244      527649 :     i = 3;
    6245      527649 :     move16();
    6246             :     /*i_len2 = ( inp_length - 2 ) * HIBND_ACB_L_FAC;  */ /*HIBND_ACB_L_FAC == 5/2 */
    6247      527649 :     i_len2 = sub( inp_length, 2 );
    6248      527649 :     i_len2 = shr( add( shl( i_len2, 2 ), i_len2 ), 1 ); /* rounding below during shr makes it non BE*/
    6249             : 
    6250    20707872 :     FOR( ; i < i_len2; i += 5 )
    6251             :     {
    6252    20180223 :         Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[0] );         /*Q(16+x) */
    6253    20180223 :         Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_i_fx[0] ); /*Q(16+x) */
    6254    20180223 :         interp_code_fx[i] = round_fx( Ltemp );                     /*Qx */
    6255    20180223 :         move16();
    6256    20180223 :         Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[1] );         /*Q(16+x) */
    6257    20180223 :         Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_i_fx[1] ); /*Q(16+x) */
    6258    20180223 :         interp_code_fx[i + 1] = round_fx( Ltemp );                 /*Qx */
    6259    20180223 :         move16();
    6260    20180223 :         Ltemp = L_mult( inp_code_fx[kkp1], factor_i_fx[2] ); /*Q(16+x) */
    6261    20180223 :         interp_code_fx[i + 2] = round_fx( Ltemp );           /*Qx */
    6262    20180223 :         move16();
    6263    20180223 :         kk++;
    6264    20180223 :         kkp1++;
    6265             : 
    6266    20180223 :         Ltemp = L_mult( inp_code_fx[kk], factor_i_fx[3] );         /*Q(16+x) */
    6267    20180223 :         Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_j_fx[3] ); /*Q(16+x) */
    6268    20180223 :         interp_code_fx[i + 3] = round_fx( Ltemp );                 /*Qx */
    6269    20180223 :         move16();
    6270    20180223 :         Ltemp = L_mult( inp_code_fx[kk], factor_i_fx[4] );         /*Q(16+x) */
    6271    20180223 :         Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_j_fx[4] ); /*Q(16+x) */
    6272    20180223 :         interp_code_fx[i + 4] = round_fx( Ltemp );                 /*Qx */
    6273    20180223 :         move16();
    6274    20180223 :         kk++;
    6275    20180223 :         kkp1++;
    6276             :     }
    6277             : 
    6278      527649 :     Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[0] ); /*Q(16+x) */
    6279      527649 :     interp_code_fx[i] = round_fx( Ltemp );             /*Qx */
    6280      527649 :     move16();
    6281      527649 :     Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[1] ); /*Q(16+x) */
    6282      527649 :     interp_code_fx[i + 1] = round_fx( Ltemp );         /*Qx */
    6283      527649 :     move16();
    6284      527649 :     return;
    6285             : }
    6286             : 
    6287             : 
    6288             : /*======================================================================================*/
    6289             : /* FUNCTION : interp_code_4over2_fx() */
    6290             : /*--------------------------------------------------------------------------------------*/
    6291             : /* PURPOSE : Used to interpolate the excitation from the core sample rate */
    6292             : /* of 16 kHz to 32 kHz. */
    6293             : /* Simple linear interpolator - No need for precision here. */
    6294             : /*--------------------------------------------------------------------------------------*/
    6295             : /* INPUT ARGUMENTS : */
    6296             : /* _ (Word16[]) inp_code_fx : input vector (Qx) */
    6297             : /* _ (Word16) inp_length : length of input vector */
    6298             : /*--------------------------------------------------------------------------------------*/
    6299             : /* OUTPUT ARGUMENTS : */
    6300             : /* _ (Word16[]) interp_code_fx : output vector (Qx) */
    6301             : /*--------------------------------------------------------------------------------------*/
    6302             : /* INPUT/OUTPUT ARGUMENTS : */
    6303             : /* _ None */
    6304             : /*--------------------------------------------------------------------------------------*/
    6305             : 
    6306             : /* _ None */
    6307             : /*--------------------------------------------------------------------------------------*/
    6308             : /* RETURN ARGUMENTS : */
    6309             : /* _ None */
    6310             : /*======================================================================================*/
    6311             : 
    6312      718810 : void interp_code_4over2_fx(
    6313             :     const Word16 inp_code_fx[], /* i : input vector Qx*/
    6314             :     Word16 interp_code_fx[],    /* o : output vector Qx*/
    6315             :     const Word16 inp_length     /* i : length of input vector */
    6316             : )
    6317             : {
    6318             :     Word16 i, j;
    6319      718810 :     j = 0;
    6320      718810 :     move16();
    6321    51718016 :     FOR( i = 0; i < inp_length - 1; i++ )
    6322             :     {
    6323    50999206 :         interp_code_fx[j] = inp_code_fx[i];
    6324    50999206 :         move16(); /*Qx */
    6325    50999206 :         interp_code_fx[j + 1] = add( shr( inp_code_fx[i], 1 ), shr( inp_code_fx[i + 1], 1 ) );
    6326    50999206 :         move16();
    6327    50999206 :         move16(); /*Qx */
    6328    50999206 :         j = add( j, 2 );
    6329             :     }
    6330             : 
    6331      718810 :     interp_code_fx[j] = inp_code_fx[i];
    6332      718810 :     move16();
    6333      718810 :     interp_code_fx[j + 1] = shr( inp_code_fx[i], 1 );
    6334      718810 :     move16(); /*Qx */
    6335             : 
    6336      718810 :     return;
    6337             : }
    6338             : 
    6339             : 
    6340             : /*-------------------------------------------------------------------*
    6341             :  * wb_tbe_extras_reset_synth()
    6342             :  *
    6343             :  * Reset the extra parameters only required for WB TBE synthesis
    6344             :  *-------------------------------------------------------------------*/
    6345             : 
    6346        9902 : void wb_tbe_extras_reset_synth_fx(
    6347             :     Word16 state_lsyn_filt_shb[],
    6348             :     Word16 state_lsyn_filt_dwn_shb[],
    6349             :     Word16 state_32and48k_WB_upsample[],
    6350             :     Word16 state_resamp_HB[] )
    6351             : {
    6352        9902 :     set16_fx( state_lsyn_filt_shb, 0, 2 * ALLPASSSECTIONS_STEEP );
    6353        9902 :     set16_fx( state_lsyn_filt_dwn_shb, 0, 2 * ALLPASSSECTIONS_STEEP );
    6354        9902 :     set16_fx( state_32and48k_WB_upsample, 0, 2 * ALLPASSSECTIONS_STEEP );
    6355        9902 :     set16_fx( state_resamp_HB, 0, INTERP_3_1_MEM_LEN );
    6356             : 
    6357        9902 :     return;
    6358             : }
    6359             : 
    6360             : /*-------------------------------------------------------------------*
    6361             :  * elliptic_bpf_48k_generic()
    6362             :  *
    6363             :  * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz
    6364             :  * Implemented as 3 fourth order sections cascaded.
    6365             :  *-------------------------------------------------------------------*/
    6366             : 
    6367       78171 : void elliptic_bpf_48k_generic_fx(
    6368             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
    6369             :     int16_t element_mode,
    6370             : #endif
    6371             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
    6372             :     Word16 IsUpsampled3,
    6373             :     Word16 input_fx[], /* i  : input signal                             Q_input_fx*/
    6374             : #else
    6375             :     const Word16 input_fx[], /* i  : input signal                             Q_input_fx*/
    6376             : #endif
    6377             :     Word16 *Q_input_fx,
    6378             :     Word16 output_fx[],     /* o  : output signal                              memory_fx_Q */
    6379             :     Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory                    */
    6380             :     Word16 memory_fx_Q[],
    6381             :     const Word16 full_band_bpf_fx[][5] /* i  : filter coefficients b0,b1,b2,a0,a1,a2  Q13  */
    6382             : )
    6383             : {
    6384             :     Word16 i, j;
    6385             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
    6386             :     Word16 memory_fx0, Q_temp, Q_temp2;
    6387             :     Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX;
    6388             :     Word32 L_tmpMax;
    6389             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
    6390             :     Word64 W_tmpX;
    6391             :     Word64 W_tmpY;
    6392             : #endif
    6393             : 
    6394       78171 :     Word32 *L_tmp = &L_tmp_buffer[4];
    6395       78171 :     Word32 *L_tmp2 = &L_tmp2_buffer[4];
    6396       78171 :     Word32 *L_output = &L_output_buffer[4];
    6397             : #else
    6398             :     Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2;
    6399             :     Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax;
    6400             :     Word32 memory2_fx_2[4], memory2_fx_3[4];
    6401             : #endif
    6402             : 
    6403      390855 :     FOR( i = 0; i < 4; i++ )
    6404             :     {
    6405             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
    6406      312684 :         memory_fx0 = extract_l( memory_fx2[0][i] );
    6407      312684 :         input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) );
    6408      312684 :         L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) );
    6409      312684 :         L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) );
    6410             :         // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) );
    6411      312684 :         move32();
    6412      312684 :         move32();
    6413      312684 :         move32();
    6414      312684 :         move32();
    6415      312684 :         move32();
    6416             : #else
    6417             :         memory_fx0[0][i] = extract_l( memory_fx2[0][i] );
    6418             :         memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) );
    6419             :         memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) );
    6420             :         memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) );
    6421             :         move32();
    6422             :         move32();
    6423             :         move32();
    6424             :         move32();
    6425             :         move32();
    6426             : #endif
    6427             :     }
    6428             : 
    6429             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
    6430       78171 :     L_tmpMax = L_add( 0, 0 );
    6431       78171 :     IF( !IsUpsampled3 )
    6432             :     {
    6433             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
    6434       43652 :         IF( element_mode )
    6435             :         {
    6436    41949572 :             FOR( i = 0; i < L_FRAME48k; i++ )
    6437             :             {
    6438             :                 /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/
    6439    41905920 :                 W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] );
    6440    41905920 :                 W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] );
    6441    41905920 :                 W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] );
    6442    41905920 :                 W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] );
    6443    41905920 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] );
    6444    41905920 :                 W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] );
    6445    41905920 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] );
    6446    41905920 :                 W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] );
    6447    41905920 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] );
    6448    41905920 :                 L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/
    6449    41905920 :                 move32();
    6450             :             }
    6451             :         }
    6452             :         ELSE
    6453             : #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/
    6454             :         {
    6455           0 :             FOR( i = 0; i < L_FRAME48k; i++ )
    6456             :             {
    6457           0 :                 L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 );                             /*Q_input_fx + 13 + 1 - 3*/
    6458           0 :                 L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX );        /*Q_input_fx + 13 + 1 - 3*/
    6459           0 :                 L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6460           0 :                 L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX );        /*Q_input_fx + 13 + 1 - 3*/
    6461           0 :                 L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6462           0 :                 L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX );        /*Q_input_fx + 13 + 1 - 3*/
    6463           0 :                 L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6464           0 :                 L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX );            /*Q_input_fx + 13 + 1 - 3*/
    6465           0 :                 L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13  -15 +2*/
    6466           0 :                 move32();
    6467             :             }
    6468             :         }
    6469             :     } /*IsUpsampled3*/
    6470             :     ELSE
    6471             :     {
    6472             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
    6473       34519 :         IF( element_mode )
    6474             :         {
    6475    11080599 :             FOR( i = 0; i < L_FRAME48k; )
    6476             :             {
    6477    11046080 :                 W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] );
    6478    11046080 :                 W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] );
    6479    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] );
    6480    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] );
    6481    11046080 :                 W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] );
    6482    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] );
    6483    11046080 :                 L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/
    6484    11046080 :                 move32();
    6485    11046080 :                 i++;
    6486             : 
    6487    11046080 :                 W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] );
    6488    11046080 :                 W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] );
    6489    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] );
    6490    11046080 :                 W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] );
    6491    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] );
    6492    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] );
    6493    11046080 :                 L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/
    6494    11046080 :                 move32();
    6495    11046080 :                 i++;
    6496             : 
    6497    11046080 :                 W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] );
    6498    11046080 :                 W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] );
    6499    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] );
    6500    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] );
    6501    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] );
    6502    11046080 :                 L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/
    6503    11046080 :                 move32();
    6504    11046080 :                 i++;
    6505             :             }
    6506             :         }
    6507             :         ELSE
    6508             : #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/
    6509             :         {
    6510           0 :             FOR( i = 0; i < L_FRAME48k; )
    6511             :             {
    6512           0 :                 L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 );             /*Q_input_fx + 13 + 1 - 3*/
    6513           0 :                 L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6514           0 :                 L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6515           0 :                 L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6516           0 :                 L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX );            /*Q_input_fx + 13 + 1 - 3*/
    6517           0 :                 L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13  -15 +2*/
    6518           0 :                 move32();
    6519           0 :                 i++;
    6520             : 
    6521           0 :                 L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 );                             /*Q_input_fx + 13 + 1 - 3*/
    6522           0 :                 L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6523           0 :                 L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6524           0 :                 L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX );        /*Q_input_fx + 13 + 1 - 3*/
    6525           0 :                 L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6526           0 :                 L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13  -15 +2*/
    6527           0 :                 move32();
    6528           0 :                 i++;
    6529             : 
    6530           0 :                 L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) );        /*Q_input_fx + 11 + 13  -15 +2*/
    6531           0 :                 L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX );        /*Q_input_fx + 13 + 1 - 3*/
    6532           0 :                 L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6533           0 :                 L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6534           0 :                 L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13  -15 +2*/
    6535           0 :                 move32();
    6536           0 :                 i++;
    6537             :             }
    6538             :         }
    6539             : 
    6540             :     } /*IsUpsampled3*/
    6541             : 
    6542             : #else  /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/
    6543             :     L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 );                                 /*Q_input_fx + 13 + 1 - 3*/
    6544             :     L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX );                /*Q_input_fx + 13 + 1 - 3*/
    6545             :     L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX );                /*Q_input_fx + 13 + 1 - 3*/
    6546             :     L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX );                /*Q_input_fx + 13 + 1 - 3*/
    6547             :     L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX );                    /*Q_input_fx + 13 + 1 - 3*/
    6548             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6549             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6550             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6551             :     L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13  -15 +2*/
    6552             :     move32();
    6553             : 
    6554             :     L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 );                                 /*Q_input_fx + 13 + 1 - 3*/
    6555             :     L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX );                /*Q_input_fx + 13 + 1 - 3*/
    6556             :     L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX );                /*Q_input_fx + 13 + 1 - 3*/
    6557             :     L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX );                    /*Q_input_fx + 13 + 1 - 3*/
    6558             :     L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX );                    /*Q_input_fx + 13 + 1 - 3*/
    6559             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) );           /*Q_input_fx + 11 + 13  -15 +2*/
    6560             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6561             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6562             :     L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13  -15 +2*/
    6563             :     move32();
    6564             : 
    6565             :     L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 );                                 /*Q_input_fx + 13 + 1 - 3*/
    6566             :     L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX );                /*Q_input_fx + 13 + 1 - 3*/
    6567             :     L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX );                    /*Q_input_fx + 13 + 1 - 3*/
    6568             :     L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX );                    /*Q_input_fx + 13 + 1 - 3*/
    6569             :     L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX );                    /*Q_input_fx + 13 + 1 - 3*/
    6570             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) );           /*Q_input_fx + 11 + 13  -15 +2*/
    6571             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) );           /*Q_input_fx + 11 + 13  -15 +2*/
    6572             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6573             :     L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13  -15 +2*/
    6574             :     move32();
    6575             :     L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 );                                 /*Q_input_fx + 13 + 1 - 3*/
    6576             :     L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX );                    /*Q_input_fx + 13 + 1 - 3*/
    6577             :     L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX );                    /*Q_input_fx + 13 + 1 - 3*/
    6578             :     L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX );                    /*Q_input_fx + 13 + 1 - 3*/
    6579             :     L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX );                    /*Q_input_fx + 13 + 1 - 3*/
    6580             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) );           /*Q_input_fx + 11 + 13  -15 +2*/
    6581             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) );           /*Q_input_fx + 11 + 13  -15 +2*/
    6582             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) );           /*Q_input_fx + 11 + 13  -15 +2*/
    6583             :     L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13  -15 +2*/
    6584             :     move32();
    6585             :     FOR( i = 4; i < L_FRAME48k; i++ )
    6586             :     {
    6587             :         L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 );                             /*Q_input_fx + 13 + 1 - 3*/
    6588             :         L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX );        /*Q_input_fx + 13 + 1 - 3*/
    6589             :         L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6590             :         L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX );        /*Q_input_fx + 13 + 1 - 3*/
    6591             :         L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6592             :         L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX );        /*Q_input_fx + 13 + 1 - 3*/
    6593             :         L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) );   /*Q_input_fx + 11 + 13  -15 +2*/
    6594             :         L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX );            /*Q_input_fx + 13 + 1 - 3*/
    6595             :         L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13  -15 +2*/
    6596             :         move32();
    6597             :     }
    6598             : #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/
    6599             : 
    6600       78171 :     memory_fx2[0][0] = input_fx[L_FRAME48k - 4];
    6601       78171 :     memory_fx2[0][1] = input_fx[L_FRAME48k - 3];
    6602       78171 :     memory_fx2[0][2] = input_fx[L_FRAME48k - 2];
    6603       78171 :     memory_fx2[0][3] = input_fx[L_FRAME48k - 1];
    6604       78171 :     move32();
    6605       78171 :     move32();
    6606       78171 :     move32();
    6607       78171 :     move32();
    6608       78171 :     move32();
    6609             : 
    6610             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
    6611       78171 :     L_tmpMax = L_add( 0, 0 );
    6612             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
    6613       78171 :     IF( element_mode )
    6614             :     {
    6615    75122331 :         FOR( i = 0; i < L_FRAME48k; i++ )
    6616             :         {
    6617    75044160 :             W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] );
    6618    75044160 :             W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] );
    6619    75044160 :             W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] );
    6620    75044160 :             W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] );
    6621    75044160 :             W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] );
    6622    75044160 :             W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] );
    6623    75044160 :             W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] );
    6624    75044160 :             W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] );
    6625    75044160 :             W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] );
    6626    75044160 :             L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) );
    6627    75044160 :             move32();
    6628    75044160 :             L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) );
    6629             :         }
    6630             :     }
    6631             :     ELSE
    6632             : #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/
    6633             :     {
    6634           0 :         FOR( i = 0; i < L_FRAME48k; i++ )
    6635             :         {
    6636           0 :             L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 );                              /*Q_input_fx + 11 + 13 - 15 -3*/
    6637           0 :             L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX );         /*Q_input_fx + 11 + 13 - 15 -3*/
    6638           0 :             L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) );    /*Q_input_fx + 6 +13 -15 +2 */
    6639           0 :             L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX );         /*Q_input_fx + 11 + 13 - 15 -3*/
    6640           0 :             L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) );    /*Q_input_fx + 6 +13 -15 +2 */
    6641           0 :             L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX );         /*Q_input_fx + 11 + 13 - 15 -3*/
    6642           0 :             L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) );    /*Q_input_fx + 6 +13 -15 +2 */
    6643           0 :             L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX );             /*Q_input_fx + 11 + 13 - 15 -3*/
    6644           0 :             L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
    6645           0 :             move32();
    6646           0 :             L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) );
    6647             :         }
    6648             :     }
    6649             : #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/
    6650             :     L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 );                             /*Q_input_fx + 11 + 13 - 15 -3*/
    6651             :     L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX );            /*Q_input_fx + 11 + 13 - 15 -3*/
    6652             :     L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX );            /*Q_input_fx + 11 + 13 - 15 -3*/
    6653             :     L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][1] ), 3 ), L_tmpX );            /*Q_input_fx + 11 + 13 - 15 -3*/
    6654             :     L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX );                    /*Q_input_fx + 11 + 13 - 15 -3*/
    6655             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][1] ), 2 ) );    /*Q_input_fx + 6 +13 -15 +2 */
    6656             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][2] ), 2 ) );    /*Q_input_fx + 6 +13 -15 +2*/
    6657             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) );    /*Q_input_fx + 6 +13 -15 +2*/
    6658             :     L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/
    6659             :     move32();
    6660             :     L_tmpMax = L_abs( L_tmp2[0] );
    6661             :     L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 );                             /*Q_input_fx + 11 + 13 - 15 -3*/
    6662             :     L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX );            /*Q_input_fx + 11 + 13 - 15 -3*/
    6663             :     L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][2] ), 3 ), L_tmpX );            /*Q_input_fx + 11 + 13 - 15 -3*/
    6664             :     L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX );                    /*Q_input_fx + 11 + 13 - 15 -3*/
    6665             :     L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX );                    /*Q_input_fx + 11 + 13 - 15 -3*/
    6666             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) );           /*Q_input_fx + 6 +13 -15 +2 */
    6667             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][2] ), 2 ) );    /*Q_input_fx + 6 +13 -15 +2 */
    6668             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) );    /*Q_input_fx + 6 +13 -15 +2 */
    6669             :     L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
    6670             :     move32();
    6671             :     L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) );
    6672             :     L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 );                             /*Q_input_fx + 11 + 13 - 15 -3*/
    6673             :     L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX );            /*Q_input_fx + 11 + 13 - 15 -3*/
    6674             :     L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX );                    /*Q_input_fx + 11 + 13 - 15 -3*/
    6675             :     L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX );                    /*Q_input_fx + 11 + 13 - 15 -3*/
    6676             :     L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX );                    /*Q_input_fx + 11 + 13 - 15 -3*/
    6677             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) );           /*Q_input_fx + 6 +13 -15 +2 */
    6678             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) );           /*Q_input_fx + 6 +13 -15 +2 */
    6679             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) );    /*Q_input_fx + 6 +13 -15 +2 */
    6680             :     L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
    6681             :     move32();
    6682             :     L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) );
    6683             :     L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 );                                                            /*Q_input_fx + 11 + 13 - 15 -3*/
    6684             :     L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX );                                                   /*Q_input_fx + 11 + 13 - 15 -3*/
    6685             :     L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX );                                                   /*Q_input_fx + 11 + 13 - 15 -3*/
    6686             :     L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX );                                                   /*Q_input_fx + 11 + 13 - 15 -3*/
    6687             :     L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX );                                                   /*Q_input_fx + 11 + 13 - 15 -3*/
    6688             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) );                                          /*Q_input_fx + 6 +13 -15 +2 */
    6689             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) );                                          /*Q_input_fx + 6 +13 -15 +2 */
    6690             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) );                                          /*Q_input_fx + 6 +13 -15 +2 */
    6691             :     L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/
    6692             :     move32();
    6693             :     L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) );
    6694             :     FOR( i = 4; i < L_FRAME48k; i++ )
    6695             :     {
    6696             :         L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 );                              /*Q_input_fx + 11 + 13 - 15 -3*/
    6697             :         L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX );         /*Q_input_fx + 11 + 13 - 15 -3*/
    6698             :         L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) );    /*Q_input_fx + 6 +13 -15 +2 */
    6699             :         L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX );         /*Q_input_fx + 11 + 13 - 15 -3*/
    6700             :         L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) );    /*Q_input_fx + 6 +13 -15 +2 */
    6701             :         L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX );         /*Q_input_fx + 11 + 13 - 15 -3*/
    6702             :         L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) );    /*Q_input_fx + 6 +13 -15 +2 */
    6703             :         L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX );             /*Q_input_fx + 11 + 13 - 15 -3*/
    6704             :         L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
    6705             :         move32();
    6706             :         L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) );
    6707             :     }
    6708             : #endif
    6709             : 
    6710             : 
    6711       78171 :     Q_temp = norm_l( L_tmpMax );
    6712       78171 :     Q_temp = sub( Q_temp, 4 );
    6713       78171 :     Scale_sig32( L_tmp2, 960, Q_temp );
    6714             : 
    6715       78171 :     memory_fx2[1][0] = L_tmp[L_FRAME48k - 4];
    6716       78171 :     memory_fx2[1][1] = L_tmp[L_FRAME48k - 3];
    6717       78171 :     memory_fx2[1][2] = L_tmp[L_FRAME48k - 2];
    6718       78171 :     memory_fx2[1][3] = L_tmp[L_FRAME48k - 1];
    6719       78171 :     move32();
    6720       78171 :     move32();
    6721       78171 :     move32();
    6722       78171 :     move32();
    6723       78171 :     move32();
    6724             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
    6725      390855 :     FOR( j = 0; j < 4; j++ )
    6726             :     {
    6727      312684 :         L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) );
    6728      312684 :         L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) );
    6729      312684 :         move32();
    6730      312684 :         move32();
    6731      312684 :         move32();
    6732             :     }
    6733             : #else
    6734             :     FOR( j = 0; j < 4; j++ )
    6735             :     {
    6736             :         memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) );
    6737             :         memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) );
    6738             :         move32();
    6739             :         move32();
    6740             :         move32();
    6741             :     }
    6742             : #endif
    6743             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
    6744       78171 :     L_tmpMax = L_add( 0, 0 );
    6745             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
    6746       78171 :     IF( element_mode )
    6747             :     {
    6748    75122331 :         FOR( i = 0; i < L_FRAME48k; i++ )
    6749             :         {
    6750    75044160 :             W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] );
    6751    75044160 :             W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] );
    6752    75044160 :             W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] );
    6753    75044160 :             W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] );
    6754    75044160 :             W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] );
    6755    75044160 :             W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] );
    6756    75044160 :             W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] );
    6757    75044160 :             W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] );
    6758    75044160 :             W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] );
    6759    75044160 :             L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) );
    6760    75044160 :             move32();
    6761    75044160 :             L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) );
    6762             :         }
    6763             :     }
    6764             :     ELSE
    6765             : #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/
    6766             :     {
    6767           0 :         FOR( i = 0; i < L_FRAME48k; i++ )
    6768             :         {
    6769           0 :             L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 );                            /*Q_input_fx + 6 +Q_temp+13 -15 -3 */
    6770           0 :             L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX );       /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
    6771           0 :             L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
    6772             : 
    6773           0 :             L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX );       /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
    6774           0 :             L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
    6775             : 
    6776           0 :             L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX );       /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
    6777           0 :             L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
    6778             : 
    6779           0 :             L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX );                /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
    6780           0 :             L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
    6781           0 :             move32();
    6782           0 :             L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) );
    6783             :         }
    6784             :     }
    6785             : 
    6786             : #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/
    6787             :     L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 );                               /* *Q_input_fx+6 +Q_temp +13 -15 -3 */
    6788             :     L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX );          /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
    6789             :     L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX );          /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
    6790             :     L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][1] ), 3 ), L_tmpX );          /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
    6791             :     L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX );                /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
    6792             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][1] ), 2 ) );      /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */
    6793             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][2] ), 2 ) );      /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */
    6794             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][3] ), 2 ) );      /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */
    6795             :     L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */
    6796             :     move32();
    6797             :     L_tmpMax = L_abs( L_output[0] );
    6798             : 
    6799             :     L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 );                               /*Q_input_fx + 6 +Q_temp +13 -15 -3 */
    6800             :     L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX );          /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/
    6801             :     L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX );          /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/
    6802             :     L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX );                /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/
    6803             :     L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX );                /*Q_input_fx+Q_temp + 6 +13 -15 -3*/
    6804             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) );          /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/
    6805             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][2] ), 2 ) );      /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/
    6806             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][3] ), 2 ) );      /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/
    6807             :     L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/
    6808             :     move32();
    6809             :     L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) );
    6810             : 
    6811             :     L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 );                               /*Q_input_fx + 6 +Q_temp+13 -15 -3 */
    6812             :     L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX );          /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/
    6813             :     L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX );                /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/
    6814             :     L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX );                /*Q_input_fx +Q_temp + 6 +13 -15 -3*/
    6815             :     L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX );                /*Q_input_fx +Q_temp + 6 +13 -15 -3*/
    6816             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) );          /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
    6817             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) );          /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
    6818             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][3] ), 2 ) );      /*Q_input_fx + 1+Q_temp +13 -15 + 2*/
    6819             :     L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
    6820             :     move32();
    6821             :     L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) );
    6822             : 
    6823             :     L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 );                               /*Q_input_fx + 6 +Q_temp +13 -15 -3 */
    6824             :     L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX );                /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
    6825             :     L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX );                /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
    6826             :     L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX );                /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
    6827             :     L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX );                /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
    6828             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) );          /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
    6829             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) );          /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
    6830             :     L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) );          /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
    6831             :     L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
    6832             :     move32();
    6833             :     L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) );
    6834             : 
    6835             :     FOR( i = 4; i < L_FRAME48k; i++ )
    6836             :     {
    6837             :         L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 );                            /*Q_input_fx + 6 +Q_temp+13 -15 -3 */
    6838             :         L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX );       /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
    6839             :         L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
    6840             : 
    6841             :         L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX );       /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
    6842             :         L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
    6843             : 
    6844             :         L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX );       /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
    6845             :         L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
    6846             : 
    6847             :         L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX );                /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
    6848             :         L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
    6849             :         move32();
    6850             :         L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) );
    6851             :     }
    6852             : #endif
    6853             : 
    6854       78171 :     memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4];
    6855       78171 :     memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3];
    6856       78171 :     memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2];
    6857       78171 :     memory_fx2[2][3] = L_tmp2[L_FRAME48k - 1];
    6858       78171 :     memory_fx2[3][0] = L_output[L_FRAME48k - 4];
    6859       78171 :     memory_fx2[3][1] = L_output[L_FRAME48k - 3];
    6860       78171 :     memory_fx2[3][2] = L_output[L_FRAME48k - 2];
    6861       78171 :     memory_fx2[3][3] = L_output[L_FRAME48k - 1];
    6862       78171 :     move32();
    6863       78171 :     move32();
    6864       78171 :     move32();
    6865       78171 :     move32();
    6866       78171 :     move32();
    6867       78171 :     move32();
    6868       78171 :     move32();
    6869       78171 :     move32();
    6870       78171 :     move32();
    6871       78171 :     memory_fx_Q[0] = *Q_input_fx;
    6872       78171 :     memory_fx_Q[1] = add( *Q_input_fx, 11 );
    6873       78171 :     memory_fx_Q[2] = add( add( *Q_input_fx, 6 ), Q_temp );
    6874       78171 :     memory_fx_Q[3] = add( add( *Q_input_fx, 1 ), Q_temp );
    6875       78171 :     move16();
    6876       78171 :     move16();
    6877       78171 :     move16();
    6878       78171 :     move16();
    6879       78171 :     Q_temp2 = norm_l( L_tmpMax );
    6880       78171 :     Scale_sig32( L_output, 960, Q_temp2 );
    6881    75122331 :     FOR( i = 0; i < 960; i++ )
    6882             :     {
    6883    75044160 :         output_fx[i] = extract_h( L_output[i] );
    6884    75044160 :         move16();
    6885             :     }
    6886       78171 :     *Q_input_fx = sub( add( add( *Q_input_fx, Q_temp ), Q_temp2 ), 15 );
    6887       78171 :     move16(); /* BASOP_NOGLOB */
    6888             : 
    6889       78171 :     return;
    6890             : }
    6891             : /*-------------------------------------------------------------------*
    6892             :  * synthesise_fb_high_band()
    6893             :  *
    6894             :  * Creates the highband output for full band  - 14.0 to 20 kHz
    6895             :  * Using the energy shaped white excitation signal from the SWB BWE.
    6896             :  * The excitation signal input is sampled at 16kHz and so is upsampled
    6897             :  * to 48 kHz first.
    6898             :  * Uses a complementary split filter to code the two regions from
    6899             :  * 14kHz to 16kHz and 16 kHz to 20 kHz.
    6900             :  * One of 16 tilt filters is also applied afterwards to further
    6901             :  * refine the spectral shape of the fullband signal.
    6902             :  * The tilt is specified in dB per kHz. N.B. Only negative values are
    6903             :  * accomodated.
    6904             :  *-------------------------------------------------------------------*/
    6905             : 
    6906       34519 : void synthesise_fb_high_band_fx(
    6907             :     const Word16 excitation_in[], /* i  : full band excitation                                */
    6908             :     Word16 Q_fb_exc,
    6909             :     Word16 output[],            /* o  : high band speech - 14.0 to 20 kHz                   */
    6910             :     const Word32 fb_exc_energy, /* i  : full band excitation energy                         */
    6911             :     const Word16 ratio,         /* i  : energy ratio                                            */
    6912             :     const Word16 L_frame,       /* i  : ACELP frame length                                  */
    6913             :     const Word16 bfi,           /* i  : fec flag                                                        */
    6914             :     Word16 *prev_fbbwe_ratio,   /* o  : previous frame energy for FEC                       */
    6915             :     Word32 bpf_memory[][4],     /* i/o: memory for elliptic bpf 48k                         */
    6916             :     Word16 bpf_memory_Q[],
    6917             :     Word16 Qout
    6918             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
    6919             :     ,
    6920             :     int16_t element_mode
    6921             : #endif
    6922             : )
    6923             : {
    6924             :     Word16 i, j;
    6925             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
    6926             :     Word16 excitation_in_interp3_buffer[L_FRAME48k + 4];
    6927       34519 :     Word16 *excitation_in_interp3 = &excitation_in_interp3_buffer[0] + 4;
    6928             : #else
    6929             :     Word16 excitation_in_interp3[L_FRAME48k];
    6930             : #endif
    6931             :     Word16 tmp[L_FRAME48k];
    6932             :     Word32 temp1;
    6933             :     Word32 ratio2;
    6934             :     Word32 L_tmp;
    6935             :     Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp;
    6936             : 
    6937             :     /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */
    6938       34519 :     j = 0;
    6939             :     /* white excitation from DC to 8 kHz resampled to produce DC to 24 kHz excitation.          */
    6940    11080599 :     FOR( i = 0; i < L_FRAME48k; i += 3 )
    6941             :     {
    6942    11046080 :         excitation_in_interp3[i] = mult( excitation_in[j], 24576 ); /* Q(Q_fb_exc+13-15 = Q_fb_exc-2) */
    6943    11046080 :         move16();
    6944    11046080 :         excitation_in_interp3[i + 1] = 0;
    6945    11046080 :         move16();
    6946    11046080 :         excitation_in_interp3[i + 2] = 0;
    6947    11046080 :         move16();
    6948    11046080 :         j++;
    6949             :     }
    6950       34519 :     exp_tmp = sub( Q_fb_exc, 2 );
    6951             : 
    6952       34519 :     IF( EQ_16( L_frame, L_FRAME16k ) )
    6953             :     {
    6954             :         /* for 16kHz ACELP core */
    6955             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
    6956       26953 :         elliptic_bpf_48k_generic_fx(
    6957             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
    6958             :             element_mode,
    6959             : #endif
    6960             :             1, // IsUpsampled3
    6961             :             excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx
    6962             : 
    6963             :         );
    6964             : #else
    6965             :         elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx );
    6966             : #endif
    6967             :     }
    6968             :     ELSE
    6969             :     {
    6970             :         /* for 12.8kHz ACELP core */
    6971             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
    6972        7566 :         elliptic_bpf_48k_generic_fx(
    6973             : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
    6974             :             element_mode,
    6975             : #endif
    6976             :             1, // IsUpsampled3
    6977             :             excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx );
    6978             : #else
    6979             :         elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx );
    6980             : #endif
    6981             :     }
    6982       34519 :     temp1 = sum2_fx_mod( tmp, L_FRAME48k );
    6983             : 
    6984       34519 :     L_tmp = L_max( 1, fb_exc_energy ); /*Q(2*Q_fb_exc + 1)*/
    6985       34519 :     exp = norm_l( L_tmp );
    6986       34519 :     tmp3 = extract_h( L_shl( L_tmp, exp ) );
    6987       34519 :     tmp1 = sub( add( Q_fb_exc, Q_fb_exc ), 8 ); /* 1-9*/
    6988       34519 :     exp = sub( sub( 31, tmp1 ), exp );
    6989             : 
    6990       34519 :     exp2 = norm_l( temp1 );
    6991       34519 :     tmp2 = extract_h( L_shl( temp1, exp2 ) );
    6992       34519 :     exp2 = sub( sub( 31, sub( shl( exp_tmp, 1 ), 8 ) ), exp2 ); /* in Q15 (temp1 in Q9)*/
    6993             : 
    6994       34519 :     exp = sub( exp2, exp ); /* Denormalize and substract */
    6995       34519 :     IF( GT_16( tmp2, tmp3 ) )
    6996             :     {
    6997       18163 :         tmp2 = shr( tmp2, 1 );
    6998       18163 :         exp = add( exp, 1 );
    6999             :     }
    7000       34519 :     IF( 0 != tmp3 )
    7001             :     {
    7002       34519 :         tmp3 = div_s( tmp2, tmp3 );
    7003       34519 :         L_tmp = L_deposit_h( tmp3 );
    7004       34519 :         L_tmp = Isqrt_lc( L_tmp, &exp );     /*Q(31-exp)*/
    7005       34519 :         ratio2 = Mult_32_16( L_tmp, ratio ); /*Q(31-exp+0-15 = 16-exp)*/
    7006             :     }
    7007             :     ELSE
    7008             :     {
    7009           0 :         ratio2 = 0;
    7010             :     }
    7011             : 
    7012       34519 :     IF( !bfi )
    7013             :     {
    7014       33762 :         *prev_fbbwe_ratio = ratio;
    7015       33762 :         move16();
    7016             :     }
    7017             :     ELSE
    7018             :     {
    7019             :         /**prev_fbbwe_ratio = ratio*0.5f;*/
    7020         757 :         *prev_fbbwe_ratio = shr( ratio, 1 );
    7021         757 :         move16();
    7022             :     }
    7023       34519 :     tmp3 = add( sub( Qout, add( sub( 1, exp ), exp_tmp ) ), 16 ); /*Qout - (1 -exp +exp_tmp) + 16 */
    7024    33172759 :     FOR( i = 0; i < L_FRAME48k; i++ )
    7025             :     {
    7026             : #ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx
    7027    33138240 :         L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */
    7028             :         Word32 L_tmp32;
    7029             :         Word16 tmp16;
    7030             : 
    7031             :         // if (L_tmp < 0)
    7032    33138240 :         if ( L_tmp < 0 )
    7033             :         {
    7034    16397681 :             L_tmp32 = L_negate( L_tmp );
    7035             :         }
    7036    33138240 :         if ( L_tmp < 0 )
    7037             :         {
    7038    16397681 :             L_tmp32 = L_shl_sat( L_tmp32, tmp3 );
    7039             :         }
    7040    33138240 :         if ( L_tmp < 0 )
    7041             :         {
    7042    16397681 :             tmp16 = extract_h( L_tmp32 );
    7043             :         }
    7044    33138240 :         if ( L_tmp < 0 )
    7045             :         {
    7046    16397681 :             tmp16 = negate( tmp16 );
    7047             :         }
    7048             : 
    7049             :         // if (L_tmp == 0)
    7050    33138240 :         if ( L_tmp == 0 )
    7051             :         {
    7052      421640 :             tmp16 = 0;
    7053      421640 :             move16();
    7054             :         }
    7055             : 
    7056             :         // if (L_tmp > 0)
    7057    33138240 :         if ( L_tmp > 0 )
    7058             :         {
    7059    16318919 :             L_tmp32 = L_shl_sat( L_tmp, tmp3 );
    7060             :         }
    7061    33138240 :         if ( L_tmp > 0 )
    7062             :         {
    7063    16318919 :             tmp16 = extract_h( L_tmp32 );
    7064             :         }
    7065             : 
    7066    33138240 :         output[i] = tmp16;
    7067    33138240 :         move16();
    7068             : 
    7069             : #else
    7070             :         L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */
    7071             :         IF( L_tmp < 0 )
    7072             :         {
    7073             :             output[i] = negate( extract_h( L_shl_sat( L_negate( L_tmp ), tmp3 ) ) ); /*Qout*/
    7074             :             move16();
    7075             :         }
    7076             :         ELSE
    7077             :         {
    7078             :             output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/
    7079             :             move16();
    7080             :         }
    7081             : #endif
    7082             :     }
    7083       34519 :     return;
    7084             : }
    7085             : 
    7086             : /*-------------------------------------------------------------------*
    7087             :  * Estimate_mix_factors_fx()                                         *
    7088             :  *                                                                   *
    7089             :  * Estimate mix factors for SHB excitation generation                *
    7090             :  *-------------------------------------------------------------------*/
    7091       25662 : void Estimate_mix_factors_fx(
    7092             :     const Word16 *shb_res, /* i  : SHB LP residual in Q = Q_shb */
    7093             :     const Word16 Q_shb,
    7094             :     const Word16 *exc16kWhtnd, /* i  : SHB transformed low band excitation Q_bwe_exc */
    7095             :     const Word16 Q_bwe_exc,
    7096             :     const Word16 *White_exc16k_frac, /* i  : Modulated envelope shaped white noise Q_frac */
    7097             :     const Word16 Q_frac,
    7098             :     const Word32 pow1, /* i  : SHB exc. power for normalization in Q_pow1 */
    7099             :     const Word16 Q_pow1,
    7100             :     const Word32 pow22, /* i  : White noise excitation for normalization in Q_pow22 */
    7101             :     const Word16 Q_pow22,
    7102             :     Word16 *vf_modified, /* o  : Estimated voice factors */
    7103             :     Word16 *vf_ind       /* o  : voice factors VQ index */
    7104             : )
    7105             : {
    7106             :     Word16 shb_res_local[L_FRAME16k], WN_exc_local[L_FRAME16k];
    7107             :     Word32 pow3, temp_p1_p2, temp_p1_p3;
    7108             :     Word16 temp_numer1[L_FRAME16k], temp_numer2[L_FRAME16k];
    7109             :     Word16 i, length;
    7110             :     Word16 exp1, exp2, expa, expb, fraca, fracb, scale, num_flag, den_flag;
    7111             :     Word16 tmp, tmp1, sc1, sc2;
    7112             :     Word32 L_tmp1, L_tmp2;
    7113             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
    7114       25662 :     Flag Overflow = 0;
    7115       25662 :     move32();
    7116             : #endif
    7117             : 
    7118       25662 :     Copy( shb_res, shb_res_local, L_FRAME16k );
    7119       25662 :     Copy( White_exc16k_frac, WN_exc_local, L_FRAME16k );
    7120             :     /* WN_exc_local    in (Q_frac) */
    7121             : 
    7122       25662 :     pow3 = Dot_product( shb_res_local, shb_res_local, L_FRAME16k ); /* (2*Q_shb+1) */
    7123             : 
    7124       25662 :     pow3 = L_add( pow3, L_shl( 21475l /*0.00001f in Q31*/, 2 * Q_shb + 1 - 31 ) ); /* (2*Q_shb+1) */
    7125       25662 :     if ( pow3 == 0 )
    7126             :     {
    7127           0 :         pow3 = 1;
    7128           0 :         move32();
    7129             :     }
    7130             : 
    7131             :     /* temp_p1_p2 = (float)sqrt(pow1/pow2); */
    7132       25662 :     temp_p1_p2 = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp1 ); /* temp_p1_p3 in (Q31+exp1) */
    7133             : 
    7134             :     /* temp_p1_p3 = (float)sqrt(pow1/pow3); */
    7135       25662 :     temp_p1_p3 = root_a_over_b_fx( pow1, Q_pow1, pow3, ( 2 * Q_shb + 1 ), &exp2 ); /* temp_p1_p3 in (Q31+exp2) */
    7136             : 
    7137             : 
    7138       25662 :     sc1 = sub( Q_bwe_exc, sub( Q_frac, exp1 ) );
    7139       25662 :     sc2 = sub( Q_bwe_exc, sub( Q_shb, exp2 ) );
    7140     8237502 :     FOR( i = 0; i < L_FRAME16k; i++ )
    7141             :     {
    7142     8211840 :         L_tmp1 = Mult_32_16( temp_p1_p2, WN_exc_local[i] ); /* (Q_frac - exp1) +16 */
    7143     8211840 :         WN_exc_local[i] = round_fx( L_tmp1 );
    7144     8211840 :         move16();
    7145     8211840 :         L_tmp2 = Mult_32_16( temp_p1_p3, shb_res_local[i] ); /* (Q_shb - exp2) +16 */
    7146     8211840 :         shb_res_local[i] = round_fx( L_tmp2 );
    7147     8211840 :         move16();
    7148             :         /* temp_numer1[i] = sub(shb_res_local[i], WN_exc_local[i]); */
    7149     8211840 :         temp_numer1[i] = round_fx_sat( L_sub_sat( L_shl_sat( L_tmp2, sc2 ), L_shl_sat( L_tmp1, sc1 ) ) );
    7150     8211840 :         move16();
    7151             :         /* (Q_bwe_exc) */
    7152             : 
    7153             :         /* temp_numer2[i] = sub(exc16kWhtnd[i], WN_exc_local[i]); */
    7154     8211840 :         temp_numer2[i] = sub_sat( exc16kWhtnd[i], round_fx_sat( L_shl_sat( L_tmp1, sc1 ) ) );
    7155     8211840 :         move16();
    7156             :         /* (Q_bwe_exc) */
    7157             :     }
    7158             : 
    7159             : 
    7160       25662 :     length = L_FRAME16k;
    7161       25662 :     move16();
    7162       25662 :     temp_p1_p2 = Dot_product( temp_numer1, temp_numer2, length ); /* 2*(Q_bwe_exc)+1 */
    7163       25662 :     temp_p1_p3 = Dot_product( temp_numer2, temp_numer2, length ); /* 2*(Q_bwe_exc)+1 */
    7164             : 
    7165             :     /* vf_modified[i] = min( max_val( (temp_p1_p2 / temp_p1_p3), 0.1f), 0.99f); */
    7166             :     /* tmp = (temp_p1_p2 / temp_p1_p3); */
    7167       25662 :     IF( temp_p1_p3 > 0 )
    7168             :     {
    7169       25662 :         expa = norm_l( temp_p1_p3 );
    7170       25662 :         fraca = extract_h( L_shl( temp_p1_p3, expa ) );
    7171       25662 :         expa = sub( 30, expa );
    7172             : 
    7173       25662 :         expb = norm_l( temp_p1_p2 );
    7174       25662 :         fracb = round_fx_o( L_shl_o( temp_p1_p2, expb, &Overflow ), &Overflow );
    7175       25662 :         expb = sub( 30, expb );
    7176             : 
    7177       25662 :         num_flag = 0;
    7178       25662 :         move16();
    7179       25662 :         IF( fraca < 0 )
    7180             :         {
    7181           0 :             num_flag = 1;
    7182           0 :             move16();
    7183           0 :             fraca = negate( fraca );
    7184             :         }
    7185             : 
    7186       25662 :         den_flag = 0;
    7187       25662 :         move16();
    7188       25662 :         IF( fracb < 0 )
    7189             :         {
    7190           0 :             den_flag = 1;
    7191           0 :             move16();
    7192           0 :             fracb = negate( fracb );
    7193             :         }
    7194             : 
    7195       25662 :         scale = shr( sub( fraca, fracb ), 15 );
    7196       25662 :         fracb = shl( fracb, scale );
    7197       25662 :         expb = sub( expb, scale );
    7198             : 
    7199       25662 :         tmp = div_s( fracb, fraca );
    7200       25662 :         exp1 = sub( expb, expa );
    7201       25662 :         tmp = shl_sat( tmp, exp1 );
    7202       25662 :         if ( NE_16( num_flag, den_flag ) )
    7203             :         {
    7204           0 :             tmp = negate( tmp );
    7205             :         }
    7206             :     }
    7207             :     ELSE
    7208             :     {
    7209           0 :         tmp = 0;
    7210           0 :         move16();
    7211             :     }
    7212             : 
    7213       25662 :     vf_modified[0] = s_min( s_max( tmp, 3277 /* 0.1f in Q15*/ ), 32440 /* 0.99f in Q15 */ );
    7214       25662 :     move16();
    7215             : 
    7216       25662 :     *vf_ind = usquant_fx( vf_modified[0], &tmp1, 4096 /* 0.125 in Q15 */, 2048 /* 0.125 in Q14 */, shl( 1, NUM_BITS_SHB_VF ) );
    7217       25662 :     move16();
    7218             : 
    7219       25662 :     vf_modified[0] = tmp1;
    7220       25662 :     move16();
    7221       25662 :     vf_modified[1] = tmp1;
    7222       25662 :     move16();
    7223       25662 :     vf_modified[2] = tmp1;
    7224       25662 :     move16();
    7225       25662 :     vf_modified[3] = tmp1;
    7226       25662 :     move16();
    7227       25662 :     vf_modified[4] = tmp1;
    7228       25662 :     move16();
    7229             : 
    7230             :     /* vf_modified in Q15 */
    7231             : 
    7232       25662 :     return;
    7233             : }
    7234             : 
    7235             : /*======================================================================================*/
    7236             : /* FUNCTION : prep_tbe_exc_fx() */
    7237             : /*--------------------------------------------------------------------------------------*/
    7238             : /* PURPOSE : Prepare TBE excitation */
    7239             : /*--------------------------------------------------------------------------------------*/
    7240             : /* INPUT ARGUMENTS : */
    7241             : /* _ (Word16) L_frame_fx : length of the frame */
    7242             : /* _ (Word16) i_subfr_fx : subframe index */
    7243             : /* _ (Word16) gain_pit_fx : Pitch gain (14) */
    7244             : /* _ (Word32) gain_code_fx : algebraic codebook gain (Q(16+Q_exc)) */
    7245             : /* _ (Word16*[]) code_fx : algebraic excitation (Q9) */
    7246             : /* _ (Word16) voice_fac_fx : voicing factor (Q15) */
    7247             : /* _ (Word16) gain_preQ_fx : prequantizer excitation gain */
    7248             : /* _ (Word16[]) code_preQ_fx : prequantizer excitation */
    7249             : /*--------------------------------------------------------------------------------------*/
    7250             : /* OUTPUT ARGUMENTS : */
    7251             : /* _ (Word16*[]) voice_factors_fx : TBE voicing factor (Q15) */
    7252             : /*--------------------------------------------------------------------------------------*/
    7253             : /* INPUT/OUTPUT ARGUMENTS : */
    7254             : /* _ (Word16[]) bwe_exc_fx : excitation for TBE (Q_exc) */
    7255             : /*--------------------------------------------------------------------------------------*/
    7256             : 
    7257             : /* _ None */
    7258             : /*--------------------------------------------------------------------------------------*/
    7259             : /* RETURN ARGUMENTS : */
    7260             : /* _ None */
    7261             : /*======================================================================================*/
    7262             : 
    7263             : #ifndef REMOVE_EVS_DUPLICATES
    7264             : void prep_tbe_exc_fx(
    7265             :     const Word16 L_frame_fx,     /* i : length of the frame */
    7266             :     const Word16 i_subfr_fx,     /* i : subframe index */
    7267             :     const Word16 gain_pit_fx,    /* i : Pitch gain Q14*/
    7268             :     const Word32 gain_code_fx,   /* i : algebraic codebook gain 16+Q_exc*/
    7269             :     const Word16 code_fx[],      /* i : algebraic excitation Q9*/
    7270             :     const Word16 voice_fac_fx,   /* i : voicing factor Q15*/
    7271             :     Word16 *voice_factors_fx,    /* o : TBE voicing factor Q15*/
    7272             :     Word16 bwe_exc_fx[],         /* i/o: excitation for TBE Q_exc*/
    7273             :     const Word16 gain_preQ_fx,   /* i : prequantizer excitation gain */
    7274             :     const Word16 code_preQ_fx[], /* i : prequantizer excitation */
    7275             :     const Word16 Q_exc,          /* i : Excitation, bwe_exc Q-factor */
    7276             :     Word16 T0,                   /* i : integer pitch variables Q0 */
    7277             :     Word16 T0_frac,              /* i : Fractional pitch variables Q0*/
    7278             :     const Word16 coder_type,     /* i : coding type */
    7279             :     Word32 core_brate )
    7280             : {
    7281             :     Word16 i;
    7282             :     Word16 tmp_code_fx[2 * L_SUBFR * HIBND_ACB_L_FAC];
    7283             :     Word16 tmp_code_preInt_fx[L_SUBFR];
    7284             :     Word16 gain_code16 = 0;
    7285             :     move16();
    7286             :     Word16 tmp /*, tmp1, tmp2*/;
    7287             :     /*Word16 random_code[L_SUBFR * HIBND_ACB_L_FAC];*/
    7288             :     Word16 pitch;
    7289             : 
    7290             :     Word32 L_tmp, Ltemp1, Ltemp2;
    7291             :     Word32 tempQ31;
    7292             :     Word16 tempQ15;
    7293             :     Word16 L_subfr = L_SUBFR;
    7294             :     move16();
    7295             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
    7296             :     Flag Overflow = 0;
    7297             :     move32();
    7298             : #endif
    7299             : 
    7300             :     /**voice_factors = VF_0th_PARAM + VF_1st_PARAM * voice_fac + VF_2nd_PARAM * voice_fac * voice_fac;
    7301             :                      = VF_0th_PARAM + voice_fac * (VF_1st_PARAM  + VF_2nd_PARAM * voice_fac )
    7302             :     *voice_factors = min( max_val(0.0f, *voice_factors), 1.0f); */
    7303             :     tempQ31 = L_deposit_h( VF_1st_PARAM_FX );
    7304             :     tempQ15 = mac_r( tempQ31, VF_2nd_PARAM_FX, voice_fac_fx );
    7305             :     tempQ31 = L_deposit_h( VF_0th_PARAM_FX );
    7306             :     *voice_factors_fx = mac_r( tempQ31, voice_fac_fx, tempQ15 );
    7307             :     move16();
    7308             :     tmp = MAX_16;
    7309             :     move16();
    7310             : 
    7311             :     pitch = shl_o( add( shl_o( T0, 2, &Overflow ), T0_frac ), 5, &Overflow ); /* Q7 */
    7312             : 
    7313             :     test();
    7314             :     test();
    7315             :     IF( ( ( EQ_16( coder_type, VOICED ) ) || ( GT_16( pitch, 14784 /* 115.5 in Q7 */ ) ) ) && ( GT_32( core_brate, ACELP_8k00 ) ) )
    7316             :     {
    7317             :         tmp = MAX_16;
    7318             :         move16();
    7319             :         *voice_factors_fx = mult_r( *voice_factors_fx, tmp );
    7320             :         move16();
    7321             :     }
    7322             : 
    7323             :     *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 );
    7324             :     move16();
    7325             :     IF( EQ_16( L_frame_fx, L_FRAME ) )
    7326             :     {
    7327             :         interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr );                           /* code: Q9, tmp_code: Q9 */
    7328             :         gain_code16 = round_fx_o( L_shl_o( gain_code_fx, Q_exc, &Overflow ), &Overflow ); /*Q_exc */
    7329             :         FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ )
    7330             :         {
    7331             :             L_tmp = L_mult( gain_code16, tmp_code_fx[i] );                                         /* Q9 + Q_exc + 1*/
    7332             :             L_tmp = L_shl_sat( L_tmp, 5 );                                                         /* Q9 + Q_exc + Q6*/
    7333             :             L_tmp = L_mac_sat( L_tmp, gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] ); /*Q15+Q_exc */
    7334             :             L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /*16+Q_exc */                                  /* saturation can occur here */
    7335             :             bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx_o( L_tmp, &Overflow );         /*Q_exc */
    7336             :             move16();
    7337             :         }
    7338             :     }
    7339             :     ELSE
    7340             :     {
    7341             :         IF( gain_preQ_fx != 0 )
    7342             :         {
    7343             :             FOR( i = 0; i < L_subfr; i++ )
    7344             :             {
    7345             :                 /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */
    7346             :                 Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] );  /* Q16 + Q9 + 1 - 16 = Q10 */
    7347             :                 Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12  */
    7348             : 
    7349             :                 Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */
    7350             :                 Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, 4 ) /*Q_exc+16-13*/, &Overflow ); /*Q_exc+16 */
    7351             : 
    7352             :                 tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc  */
    7353             :                 move16();
    7354             :             }
    7355             :         }
    7356             :         ELSE
    7357             :         {
    7358             :             FOR( i = 0; i < L_subfr; i++ )
    7359             :             {
    7360             :                 /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */
    7361             :                 Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] );                        /* Q16 + Q9 + 1 - 16 = Q10 */
    7362             :                 Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */
    7363             :                 tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow );                /* Q_exc  */
    7364             :                 move16();
    7365             :             }
    7366             :         }
    7367             : 
    7368             :         interp_code_4over2_fx( tmp_code_preInt_fx, tmp_code_fx, L_subfr ); /* o: tmp_code in Q_exc */
    7369             :         FOR( i = 0; i < L_subfr * 2; i++ )
    7370             :         {
    7371             :             L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * 2] );                              /*Q14+Q_exc+1 */
    7372             :             tmp = round_fx_o( L_shl_o( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/, &Overflow ), &Overflow ); /* tmp in Q_exc */
    7373             :             bwe_exc_fx[i + i_subfr_fx * 2] = add_o( tmp, tmp_code_fx[i], &Overflow );                   /*Q_exc */
    7374             :             move16();
    7375             :         }
    7376             :     }
    7377             : 
    7378             :     return;
    7379             : }
    7380             : 
    7381             : /*======================================================================================*/
    7382             : /* FUNCTION : prep_tbe_exc_ivas_fx() */
    7383             : /*--------------------------------------------------------------------------------------*/
    7384             : /* PURPOSE : Prepare TBE excitation */
    7385             : /*--------------------------------------------------------------------------------------*/
    7386             : /* INPUT ARGUMENTS : */
    7387             : /* _ (Word16) L_frame_fx : length of the frame */
    7388             : /* _ (Word16) i_subfr_fx : subframe index */
    7389             : /* _ (Word16) gain_pit_fx : Pitch gain (14) */
    7390             : /* _ (Word32) gain_code_fx : algebraic codebook gain (Q(16+Q_exc)) */
    7391             : /* _ (Word16*[]) code_fx : algebraic excitation (Q9) */
    7392             : /* _ (Word16) voice_fac_fx : voicing factor (Q15) */
    7393             : /* _ (Word16) gain_preQ_fx : prequantizer excitation gain */
    7394             : /* _ (Word16[]) code_preQ_fx : prequantizer excitation */
    7395             : /*--------------------------------------------------------------------------------------*/
    7396             : /* OUTPUT ARGUMENTS : */
    7397             : /* _ (Word16*[]) voice_factors_fx : TBE voicing factor (Q15) */
    7398             : /*--------------------------------------------------------------------------------------*/
    7399             : /* INPUT/OUTPUT ARGUMENTS : */
    7400             : /* _ (Word16[]) bwe_exc_fx : excitation for TBE (Q_exc) */
    7401             : /*--------------------------------------------------------------------------------------*/
    7402             : 
    7403             : /* _ None */
    7404             : /*--------------------------------------------------------------------------------------*/
    7405             : /* RETURN ARGUMENTS : */
    7406             : /* _ None */
    7407             : /*======================================================================================*/
    7408             : #endif
    7409     1144883 : void prep_tbe_exc_ivas_fx(
    7410             :     const Word16 L_frame_fx, /* i : length of the frame */
    7411             :     const Word16 L_subfr,
    7412             :     const Word16 i_subfr_fx,     /* i : subframe index */
    7413             :     const Word16 gain_pit_fx,    /* i : Pitch gain Q14*/
    7414             :     const Word32 gain_code_fx,   /* i : algebraic codebook gain 16+Q_exc*/
    7415             :     const Word16 code_fx[],      /* i : algebraic excitation Q9*/
    7416             :     const Word16 voice_fac_fx,   /* i : voicing factor Q15*/
    7417             :     Word16 *voice_factors_fx,    /* o : TBE voicing factor Q15*/
    7418             :     Word16 bwe_exc_fx[],         /* i/o: excitation for TBE Q_exc*/
    7419             :     const Word16 gain_preQ_fx,   /* i : prequantizer excitation gain */
    7420             :     const Word16 code_preQ_fx[], /* i : prequantizer excitation */
    7421             :     const Word16 Q_exc,          /* i : Excitation, bwe_exc Q-factor */
    7422             :     Word16 T0,                   /* i : integer pitch variables Q0 */
    7423             :     Word16 T0_frac,              /* i : Fractional pitch variables Q0*/
    7424             :     const Word16 coder_type,     /* i : coding type */
    7425             :     Word32 core_brate,           /* i  : core bitrate                */
    7426             :     const Word16 element_mode,   /* i  : element mode                */
    7427             :     const Word16 idchan,         /* i  : channel ID                  */
    7428             :     const Word16 flag_TD_BWE,    /* i  : flag indicating whether hTD_BWE exists  */
    7429             :     const Word16 tdm_LRTD_flag   /* i  : LRTD stereo mode flag       */
    7430             : )
    7431             : {
    7432             :     Word16 i;
    7433             :     Word16 tmp_code_fx[2 * L_SUBFR * HIBND_ACB_L_FAC];
    7434             :     Word16 tmp_code_preInt_fx[L_SUBFR];
    7435     1144883 :     Word16 gain_code16 = 0;
    7436     1144883 :     move16();
    7437             :     Word16 tmp /*, tmp1, tmp2*/;
    7438             :     /*Word16 random_code[L_SUBFR * HIBND_ACB_L_FAC];*/
    7439             :     Word16 pitch;
    7440             : 
    7441             :     Word32 L_tmp, Ltemp1, Ltemp2;
    7442             :     Word32 tempQ31;
    7443             :     Word16 tempQ15;
    7444             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
    7445     1144883 :     Flag Overflow = 0;
    7446     1144883 :     move32();
    7447             : #endif
    7448             : 
    7449             :     /**voice_factors = VF_0th_PARAM + VF_1st_PARAM * voice_fac + VF_2nd_PARAM * voice_fac * voice_fac;
    7450             :                      = VF_0th_PARAM + voice_fac * (VF_1st_PARAM  + VF_2nd_PARAM * voice_fac )
    7451             :     *voice_factors = min( max_val(0.0f, *voice_factors), 1.0f); */
    7452     1144883 :     tempQ31 = L_deposit_h( VF_1st_PARAM_FX );
    7453     1144883 :     tempQ15 = mac_r( tempQ31, VF_2nd_PARAM_FX, voice_fac_fx );
    7454     1144883 :     tempQ31 = L_deposit_h( VF_0th_PARAM_FX );
    7455     1144883 :     *voice_factors_fx = mac_r( tempQ31, voice_fac_fx, tempQ15 );
    7456     1144883 :     move16();
    7457             : 
    7458     1144883 :     tmp = MAX_16;
    7459     1144883 :     move16();
    7460             : 
    7461     1144883 :     pitch = shl_o( add( shl_o( T0, 2, &Overflow ), T0_frac ), 5, &Overflow ); /* Q7 */
    7462             : 
    7463     1144883 :     test();
    7464     1144883 :     test();
    7465     1144883 :     IF( ( ( EQ_16( coder_type, VOICED ) ) || ( GT_16( pitch, 14784 ) ) ) && ( GT_32( core_brate, ACELP_8k00 ) ) )
    7466             :     {
    7467      351547 :         tmp = MAX_16;
    7468      351547 :         move16();
    7469      351547 :         *voice_factors_fx = mult_r( *voice_factors_fx, tmp );
    7470      351547 :         move16();
    7471             :     }
    7472             : 
    7473     1144883 :     *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 );
    7474     1144883 :     move16();
    7475             : 
    7476     1144883 :     test();
    7477     1144883 :     test();
    7478     1144883 :     IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag )
    7479             :     {
    7480         914 :         test();
    7481         914 :         IF( flag_TD_BWE && i_subfr_fx == 0 )
    7482             :         {
    7483           0 :             set16_fx( bwe_exc_fx, 0, L_FRAME32k );
    7484             :         }
    7485         914 :         return;
    7486             :     }
    7487             : 
    7488     1143969 :     IF( EQ_16( L_frame_fx, L_FRAME ) )
    7489             :     {
    7490      460424 :         interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr );                           /* code: Q9, tmp_code: Q9 */
    7491      460424 :         gain_code16 = round_fx_o( L_shl_o( gain_code_fx, Q_exc, &Overflow ), &Overflow ); /*Q_exc */
    7492    74128264 :         FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ )
    7493             :         {
    7494    73667840 :             L_tmp = L_mult( gain_code16, tmp_code_fx[i] );                                                  /* Q9 + Q_exc + 1*/
    7495    73667840 :             L_tmp = L_shl( L_tmp, 5 );                                                                      /* Q9 + Q_exc + Q6*/
    7496    73667840 :             L_tmp = L_mac_o( L_tmp, gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC], &Overflow ); /*Q15+Q_exc */
    7497    73667840 :             L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /*16+Q_exc */                                           /* saturation can occur here */
    7498    73667840 :             bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx_o( L_tmp, &Overflow );                  /*Q_exc */
    7499    73667840 :             move16();
    7500             :         }
    7501             :     }
    7502             :     ELSE
    7503             :     {
    7504      683545 :         Word16 shift = 4;
    7505      683545 :         move16();
    7506      683545 :         IF( gain_preQ_fx != 0 )
    7507             :         {
    7508     8749325 :             FOR( i = 0; i < L_subfr; i++ )
    7509             :             {
    7510             :                 /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */
    7511     8614720 :                 Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] );  /* Q16 + Q9 + 1 - 16 = Q10 */
    7512     8614720 :                 Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12  */
    7513             : 
    7514     8614720 :                 Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow );                   /*Q_exc+16 */
    7515     8614720 :                 Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, shift ) /*Q_exc+ 2 + 6 (or) 10 - 13*/, &Overflow ); /*Q_exc+16 */
    7516             : 
    7517     8614720 :                 tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc  */
    7518     8614720 :                 move16();
    7519             :             }
    7520             :         }
    7521             :         ELSE
    7522             :         {
    7523    35681100 :             FOR( i = 0; i < L_subfr; i++ )
    7524             :             {
    7525             :                 /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */
    7526    35132160 :                 Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] );                        /* Q16 + Q9 + 1 - 16 = Q10 */
    7527    35132160 :                 Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */
    7528    35132160 :                 tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow );                /* Q_exc  */
    7529    35132160 :                 move16();
    7530             :             }
    7531             :         }
    7532             : 
    7533      683545 :         interp_code_4over2_fx( tmp_code_preInt_fx, tmp_code_fx, L_subfr ); /* o: tmp_code in Q_exc */
    7534    88177305 :         FOR( i = 0; i < shl( L_subfr, 1 ); i++ )
    7535             :         {
    7536    87493760 :             L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + shl( i_subfr_fx, 1 )] );                        /*Q14+Q_exc+1 */
    7537    87493760 :             tmp = round_fx_o( L_shl_o( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/, &Overflow ), &Overflow ); /* tmp in Q_exc */
    7538    87493760 :             bwe_exc_fx[i + shl( i_subfr_fx, 1 )] = add_o( tmp, tmp_code_fx[i], &Overflow );             /*Q_exc */
    7539    87493760 :             move16();
    7540             :         }
    7541             :     }
    7542             : 
    7543     1143969 :     return;
    7544             : }
    7545             : 
    7546             : /*=============================================================================*/
    7547             : /* FUNCTION : void swb_formant_fac_fx ( ) */
    7548             : /*------------------------------------------------------------------------------*/
    7549             : /* PURPOSE : * Find strength of adaptive formant postfilter using tilt */
    7550             : /* of the high band. The 2nd lpc coefficient is used as a tilt approximation. */
    7551             : /*------------------------------------------------------------------------------*/
    7552             : /* INPUT ARGUMENTS : */
    7553             : /* const Word16 lpc_shb2 : 2nd HB LPC coefficient Q12 */
    7554             : /*------------------------------------------------------------------------------*/
    7555             : /*INPUT/OUTPUT ARGUMENTS : */
    7556             : /* Word16 *tilt_mem Q12 */
    7557             : /* OUTPUT ARGUMENTS : */
    7558             : /*------------------------------------------------------------------------------*/
    7559             : /* RETURN ARGUMENTS : */
    7560             : /* formant_fac :Formant filter strength [0,1] Q15 */
    7561             : /*------------------------------------------------------------------------------*/
    7562             : /* CALLED FROM : */
    7563             : /*==============================================================================*/
    7564             : 
    7565      220371 : Word16 swb_formant_fac_fx(                        /* o : Formant filter strength [0,1] */
    7566             :                            const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient */
    7567             :                            Word16 *tilt_mem       /* i/o: Tilt smoothing memory (Q12) */
    7568             : )
    7569             : {
    7570             :     Word16 formant_fac;
    7571             :     Word16 tmp;
    7572             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
    7573      220371 :     Flag Overflow = 0;
    7574             : #endif
    7575             : 
    7576             :     /* Smoothen tilt value */
    7577             :     /* tmp = 0.5f * (float)fabs(lpc_shb2) + 0.5f * *tilt_mem; */
    7578      220371 :     tmp = mult_r( 16384, abs_s( lpc_shb2 ) );
    7579      220371 :     tmp = add( tmp, mult_r( 16384, *tilt_mem ) ); /* Q12 */
    7580      220371 :     *tilt_mem = tmp;
    7581      220371 :     move16(); /*Q12 */
    7582             :     /* Map to PF strength */
    7583             :     /* formant_fac = (tmp - SWB_TILT_LOW)*SWB_TILT_DELTA; */
    7584      220371 :     tmp = sub( tmp, SWB_TILT_LOW_FX );              /* Q12 */
    7585      220371 :     formant_fac = mult_r( tmp, SWB_TILT_DELTA_FX ); /* Q12 */
    7586             : 
    7587             : 
    7588      220371 :     IF( GT_16( formant_fac, 4096 /* 1 in Q12 */ ) )
    7589             :     {
    7590         146 :         formant_fac = 4096; /* 1 in Q12 */
    7591         146 :         move16();
    7592             :     }
    7593      220225 :     ELSE IF( formant_fac < 0 )
    7594             :     {
    7595      194808 :         formant_fac = 0;
    7596      194808 :         move16();
    7597             :     }
    7598             :     /* now formant_fac in Q12 */
    7599             : 
    7600             :     /* formant_fac = 1.0f - 0.5f*formant_fac */
    7601      220371 :     tmp = mult_r( 16384, formant_fac ); /* 0.5 in Q15 */
    7602      220371 :     formant_fac = shl_o( sub( 4096 /* 1 in Q12 */, tmp ), 3, &Overflow );
    7603      220371 :     return formant_fac; /*Q15 */
    7604             : }
    7605             : 
    7606             : 
    7607       20447 : void wb_tbe_extras_reset_fx(
    7608             :     Word16 mem_genSHBexc_filt_down_wb2[],
    7609             :     Word16 mem_genSHBexc_filt_down_wb3[] )
    7610             : {
    7611       20447 :     set16_fx( mem_genSHBexc_filt_down_wb2, 0, 2 * ALLPASSSECTIONS_STEEP + 1 );
    7612       20447 :     set16_fx( mem_genSHBexc_filt_down_wb3, 0, 2 * ALLPASSSECTIONS_STEEP + 1 );
    7613             : 
    7614       20447 :     return;
    7615             : }
    7616             : 
    7617             : /*-------------------------------------------------------------------*
    7618             :  * get_tbe_bits()                                                    *
    7619             :  *                                                                   *
    7620             :  * Determine TBE bit consumption per frame from bitrate              *
    7621             :  *-------------------------------------------------------------------*/
    7622             : 
    7623             : 
    7624        2428 : Word16 get_tbe_bits_fx(
    7625             :     const Word32 total_brate, /* o  : TBE bit consumption per frame           */
    7626             :     const Word16 bwidth,      /* i  : overall bitrate                         */
    7627             :     const Word16 rf_mode      /* i  : bandwidht mode                          */
    7628             : )
    7629             : {
    7630        2428 :     Word16 i, bits = 0;
    7631             : 
    7632        2428 :     IF( EQ_16( rf_mode, 1 ) )
    7633             :     {
    7634             :         /* TBE bits for core, primary frame */
    7635           0 :         test();
    7636           0 :         test();
    7637           0 :         IF( ( EQ_16( bwidth, WB ) ) && ( EQ_32( total_brate, ACELP_13k20 ) ) )
    7638             :         {
    7639             :             /* Gain frame: 4, Gain shapes: 0, and LSFs: 2 */
    7640           0 :             bits = NUM_BITS_SHB_FrameGain_LBR_WB + NUM_BITS_LBR_WB_LSF;
    7641           0 :             move16();
    7642             :         }
    7643           0 :         ELSE IF( ( EQ_16( bwidth, SWB ) ) && ( EQ_32( total_brate, ACELP_13k20 ) ) )
    7644             :         {
    7645             :             /* Gain frame: 5, Gain shapes: 5, and lowrate LSFs: 8 */
    7646           0 :             bits = NUM_BITS_SHB_FRAMEGAIN + NUM_BITS_SHB_SUBGAINS + 8;
    7647           0 :             move16();
    7648             :         }
    7649             :     }
    7650             :     ELSE
    7651             :     {
    7652        2428 :         test();
    7653        2428 :         test();
    7654        2428 :         IF( ( EQ_16( bwidth, WB ) ) && ( EQ_32( total_brate, ACELP_9k60 ) ) )
    7655             :         {
    7656           0 :             bits = NUM_BITS_LBR_WB_LSF + NUM_BITS_SHB_FrameGain_LBR_WB;
    7657           0 :             move16();
    7658             :         }
    7659        2428 :         ELSE IF( ( EQ_16( bwidth, SWB ) ) || ( EQ_16( bwidth, FB ) ) )
    7660             :         {
    7661        2428 :             test();
    7662        2428 :             IF( EQ_32( total_brate, ACELP_9k60 ) )
    7663             :             {
    7664           0 :                 bits = NUM_BITS_SHB_FRAMEGAIN + NUM_BITS_SHB_SUBGAINS + 8;
    7665           0 :                 move16();
    7666             :             }
    7667        2428 :             ELSE IF( ( GE_32( total_brate, ACELP_13k20 ) ) && ( LE_32( total_brate, ACELP_32k ) ) )
    7668             :             {
    7669        2428 :                 bits = NUM_BITS_SHB_SUBGAINS + NUM_BITS_SHB_FRAMEGAIN + NUM_LSF_GRID_BITS + MIRROR_POINT_BITS;
    7670        2428 :                 move16();
    7671             : 
    7672       14568 :                 FOR( i = 0; i < NUM_Q_LSF; i++ )
    7673             :                 {
    7674       12140 :                     bits = add( bits, lsf_q_num_bits[i] );
    7675             :                 }
    7676             :             }
    7677             : 
    7678        2428 :             if ( GE_32( total_brate, ACELP_24k40 ) )
    7679             :             {
    7680        2428 :                 bits = add( bits, NUM_BITS_SHB_ENER_SF + NUM_BITS_SHB_VF + NUM_BITS_SHB_RES_GS * NB_SUBFR16k );
    7681             :             }
    7682             : 
    7683        2428 :             test();
    7684        2428 :             test();
    7685        2428 :             if ( EQ_16( bwidth, SWB ) && ( EQ_32( total_brate, ACELP_16k40 ) || EQ_32( total_brate, ACELP_24k40 ) ) )
    7686             :             {
    7687        2428 :                 bits = add( bits, BITS_TEC + BITS_TFA );
    7688             :             }
    7689             : 
    7690        2428 :             if ( EQ_16( bwidth, FB ) )
    7691             :             {
    7692             :                 /* full band slope */
    7693           0 :                 bits = add( bits, 4 );
    7694             :             }
    7695             :         }
    7696             :     }
    7697             : 
    7698        2428 :     return bits;
    7699             : }

Generated by: LCOV version 1.14