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 @ 574a190e3c6896c6c4ed10d7f23649709a0c4347 Lines: 2877 3421 84.1 %
Date: 2025-06-27 02:59:36 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      467269 : 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      467269 :     set32_fx( mem_csfilt, 0, 2 );
      51      467269 :     set16_fx( mem_genSHBexc_filt_down_shb, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) );
      52      467269 :     set16_fx( state_lpc_syn, 0, LPC_SHB_ORDER );
      53             : 
      54      467269 :     set16_fx( syn_overlap, 0, L_SHB_LAHEAD );
      55      467269 :     set16_fx( state_syn_shbexc, 0, L_SHB_LAHEAD );
      56             : 
      57      467269 :     *tbe_demph = 0;
      58      467269 :     move16();
      59      467269 :     *tbe_premph = 0;
      60      467269 :     move16();
      61             : 
      62      467269 :     set16_fx( mem_stp_swb, 0, LPC_SHB_ORDER );
      63      467269 :     *gain_prec_swb = 16384;
      64      467269 :     move16(); /*Q14 = 1 */
      65             : 
      66      467269 :     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     1067050 : 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     1067050 :     tmp_fac = 320;
     131     1067050 :     move16(); /*2.5 in Q7*/
     132     1067050 :     if ( EQ_16( L_frame, L_FRAME16k ) )
     133             :     {
     134      633038 :         tmp_fac = 256;
     135      633038 :         move16(); /*2.0 in Q7*/
     136             :     }
     137     1067050 :     tmp_fx = extract_l( L_mult( T0_frac_fx, 32 ) ); /*Q8, 0.25 in Q7*/
     138     1067050 :     tmp_fx = add( 512, tmp_fx );                    /*Q8; 2 in Q8*/
     139     1067050 :     tmp_fx = mult_r( tmp_fx, tmp_fac );             /*Q16->Q0; 2.5 in Q7 or  2.0 in Q7 */
     140             : 
     141     1067050 :     tmp1_fx = sub( T0_fx, 2 ); /*Q0*/
     142             : 
     143     1067050 :     tmp2_fx = shl( tmp1_fx, 1 ); /*Q0 */
     144             : 
     145     1067050 :     IF( EQ_16( L_frame, L_FRAME ) )
     146             :     {
     147      434012 :         tmp2_fx = add( shl( tmp1_fx, 1 ), shr( tmp1_fx, 1 ) ); /*Q0; (5/2 = 2 + 1/2)*/
     148             :     }
     149             : 
     150     1067050 :     offset_fx = add( tmp_fx, tmp2_fx ); /*Q0*/
     151             : 
     152     1067050 :     return offset_fx;
     153             : }
     154             : 
     155             : /*-------------------------------------------------------------------*
     156             :  * swb_tbe_celp_exc()
     157             :  *
     158             :  * Compute tbe bwe celp excitation
     159             :  *-------------------------------------------------------------------*/
     160       11938 : 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       11938 :     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        2708 :         offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx );
     180        2708 :         IF( *error_fx > 0 )
     181             :         {
     182         381 :             tmp_fx = shr( *error_fx, 5 ); /*Q0*/
     183             :         }
     184             :         ELSE
     185             :         {
     186        2327 :             tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/
     187             :         }
     188             : 
     189      435988 :         FOR( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ )
     190             :         {
     191      433280 :             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      433280 :             move16();
     193             :         }
     194        2708 :         tmp_fx = extract_l( L_mult( T0_frac_fx, 1 ) ); /*Q3; 0.25 in Q2*/
     195        2708 :         tmp_fx = add( shl( T0_fx, 3 ), tmp_fx );       /*Q3*/
     196        2708 :         tmp_fx = extract_l( L_mult( tmp_fx, 5 ) );     /*Q5, 2.5 in Q1*/
     197        2708 :         tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx );   /*Q5*/
     198        2708 :         *error_fx = add( *error_fx, tmp_fx );          /*Q5*/
     199        2708 :         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        9230 :         offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx );
     208        9230 :         IF( *error_fx > 0 )
     209             :         {
     210        4230 :             tmp_fx = shr( *error_fx, 5 ); /*Q0*/
     211             :         }
     212             :         ELSE
     213             :         {
     214        5000 :             tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/
     215             :         }
     216             : 
     217     1190670 :         FOR( i = 0; i < L_SUBFR * 2; i++ )
     218             :         {
     219     1181440 :             bwe_exc_fx[i + i_subfr_fx * 2] = bwe_exc_fx[i + i_subfr_fx * 2 - offset_fx + tmp_fx]; // Qx
     220     1181440 :             move16();
     221             :         }
     222             : 
     223             :         /* error += (float) offset - (float) T0 * 2 - 0.5f * (float) T0_frac;*/
     224        9230 :         tmp_fx = extract_l( L_mult( T0_frac_fx, 2 ) ); /*Q3; 0.5 in Q2*/
     225        9230 :         tmp_fx = add( shl( T0_fx, 4 ), tmp_fx );       /* now tmp_fx = "T0_fx*2+ 0.5f*T0_frac_fx" in Q3*/
     226        9230 :         tmp_fx = shl( tmp_fx, 2 );                     /*now above tmp_fx in Q5*/
     227        9230 :         tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx );   /*move offset_fx to Q5, tmp_fx in Q5, ans tmp_fx in Q5*/
     228        9230 :         *error_fx = add( *error_fx, tmp_fx );          /*error_fx in Q5*/
     229        9230 :         move16();
     230             :     }
     231       11938 : }
     232             : 
     233             : /*-------------------------------------------------------------------*
     234             :  * swb_tbe_celp_exc_ivas()
     235             :  *
     236             :  * Compute tbe bwe celp excitation
     237             :  *-------------------------------------------------------------------*/
     238     1014090 : 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     1014090 :     test();
     254     1014090 :     test();
     255     1014090 :     IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag )
     256             :     {
     257         854 :         return;
     258             :     }
     259             : 
     260     1013236 :     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      403576 :         offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx );
     270      403576 :         IF( *error_fx > 0 )
     271             :         {
     272       55928 :             tmp_fx = shr( *error_fx, 5 ); /*Q0*/
     273             :         }
     274             :         ELSE
     275             :         {
     276      347648 :             tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/
     277             :         }
     278             : 
     279    64975736 :         FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ )
     280             :         {
     281    64572160 :             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    64572160 :             move16();
     283             :         }
     284      403576 :         tmp_fx = extract_l( L_mult( T0_frac_fx, 1 ) ); /*Q3; 0.25 in Q2*/
     285      403576 :         tmp_fx = add( shl( T0_fx, 3 ), tmp_fx );       /*Q3*/
     286      403576 :         tmp_fx = extract_l( L_mult( tmp_fx, 5 ) );     /*Q5, 2.5 in Q1*/
     287      403576 :         tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx );   /*Q5*/
     288      403576 :         *error_fx = add( *error_fx, tmp_fx );          /*Q5*/
     289      403576 :         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      609660 :         offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx );
     298      609660 :         IF( *error_fx > 0 )
     299             :         {
     300      368508 :             tmp_fx = shr( *error_fx, 5 ); /*Q0*/
     301             :         }
     302             :         ELSE
     303             :         {
     304      241152 :             tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/
     305             :         }
     306             : 
     307    78646140 :         FOR( i = 0; i < L_subfr * 2; i++ )
     308             :         {
     309    78036480 :             bwe_exc_fx[i + i_subfr_fx * 2] = bwe_exc_fx[i + i_subfr_fx * 2 - offset_fx + tmp_fx];
     310    78036480 :             move16();
     311             :         }
     312             : 
     313             :         /* error += (float) offset - (float) T0 * 2 - 0.5f * (float) T0_frac;*/
     314      609660 :         tmp_fx = extract_l( L_mult( T0_frac_fx, 2 ) ); /*Q3; 0.5 in Q2*/
     315      609660 :         tmp_fx = add( shl( T0_fx, 4 ), tmp_fx );       /* now tmp_fx = "T0_fx*2+ 0.5f*T0_frac_fx" in Q3*/
     316      609660 :         tmp_fx = shl( tmp_fx, 2 );                     /*now above tmp_fx in Q5*/
     317      609660 :         tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx );   /*move offset_fx to Q5, tmp_fx in Q5, ans tmp_fx in Q5*/
     318      609660 :         *error_fx = add( *error_fx, tmp_fx );          /*error_fx in Q5*/
     319      609660 :         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       90642 : 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    14593362 :     FOR( i = 0; i < length; i = i + 2 )
     735             :     {
     736    14502720 :         output[i] = negate( input[i] );
     737    14502720 :         move16();
     738    14502720 :         output[i + 1] = input[i + 1];
     739    14502720 :         move16();
     740             :     }
     741             : 
     742       90642 :     return;
     743             : }
     744             : 
     745             : 
     746             : /*----------------------------------------------------------------------------
     747             :  * calc_rc0_h
     748             :  *
     749             :  * computes 1st parcor from composed filter impulse response
     750             :  *---------------------------------------------------------------------------*/
     751     1077504 : 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     1077504 :     L_acc = L_mult( h[0], h[0] );
     764    21550080 :     FOR( i = 1; i < LONG_H_ST; i++ )
     765             :     {
     766    20472576 :         L_acc = L_mac( L_acc, h[i], h[i] );
     767             :     }
     768     1077504 :     sh_acf = norm_l( L_acc );
     769     1077504 :     L_acc = L_shl( L_acc, sh_acf );
     770     1077504 :     acf0 = extract_h( L_acc );
     771             : 
     772     1077504 :     ptrs = h;
     773             : 
     774     1077504 :     temp = *ptrs++;
     775     1077504 :     move16();
     776     1077504 :     L_acc = L_mult( temp, *ptrs );
     777    20472576 :     FOR( i = 1; i < LONG_H_ST - 1; i++ )
     778             :     {
     779    19395072 :         temp = *ptrs++;
     780    19395072 :         move16();
     781    19395072 :         L_acc = L_mac( L_acc, temp, *ptrs );
     782             :     }
     783     1077504 :     L_acc = L_shl( L_acc, sh_acf );
     784     1077504 :     acf1 = extract_h( L_acc );
     785             : 
     786             :     /* Compute 1st parcor */
     787     1077504 :     IF( acf0 == 0 )
     788             :     {
     789           0 :         *rc0 = 0;
     790           0 :         move16();
     791           0 :         return;
     792             :     }
     793             : 
     794     1077504 :     IF( LT_16( acf0, abs_s( acf1 ) ) )
     795             :     {
     796           0 :         *rc0 = 0;
     797           0 :         move16();
     798           0 :         return;
     799             :     }
     800     1077504 :     *rc0 = div_s( abs_s( acf1 ), acf0 );
     801     1077504 :     move16();
     802     1077504 :     IF( acf1 > 0 )
     803             :     {
     804      337679 :         *rc0 = negate( *rc0 );
     805      337679 :         move16();
     806             :     }
     807             : }
     808             : 
     809      444544 : 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      444544 :     L_acc = L_mult( h[0], h[0] );
     822     8890880 :     FOR( i = 1; i < LONG_H_ST; i++ )
     823             :     {
     824     8446336 :         tmp2 = shr( h[i], 2 );
     825     8446336 :         L_acc = L_mac( L_acc, tmp2, tmp2 );
     826             :     }
     827      444544 :     sh_acf = norm_l( L_acc );
     828      444544 :     L_acc = L_shl( L_acc, sh_acf );
     829      444544 :     acf0 = extract_h( L_acc );
     830             : 
     831      444544 :     ptrs = h;
     832             : 
     833      444544 :     temp = *ptrs++;
     834      444544 :     move16();
     835      444544 :     L_acc = L_mult( temp, *ptrs );
     836     8446336 :     FOR( i = 1; i < LONG_H_ST - 1; i++ )
     837             :     {
     838     8001792 :         temp = shr( *ptrs++, 2 );
     839     8001792 :         move16();
     840     8001792 :         L_acc = L_mac( L_acc, temp, shr( *ptrs, 2 ) );
     841             :     }
     842      444544 :     L_acc = L_shl( L_acc, sh_acf );
     843      444544 :     acf1 = extract_h( L_acc );
     844             : 
     845             :     /* Compute 1st parcor */
     846      444544 :     IF( acf0 == 0 )
     847             :     {
     848           0 :         *rc0 = 0;
     849           0 :         move16();
     850           0 :         return;
     851             :     }
     852             : 
     853      444544 :     IF( LT_16( acf0, abs_s( acf1 ) ) )
     854             :     {
     855           0 :         *rc0 = 0;
     856           0 :         move16();
     857           0 :         return;
     858             :     }
     859      444544 :     *rc0 = div_s( abs_s( acf1 ), acf0 );
     860      444544 :     move16();
     861      444544 :     IF( acf1 > 0 )
     862             :     {
     863       75948 :         *rc0 = negate( *rc0 );
     864       75948 :         move16();
     865             :     }
     866             : }
     867             : 
     868       10872 : 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       10872 :     temp = sub( 2, norm_s( apond2[0] ) );
     883             :     /* compute i.r. of composed filter apond2 / apond1 */
     884       10872 :     Syn_filt_s( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 );
     885             :     /* compute 1st parcor */
     886       10872 :     Calc_rc0_h( h, parcor0 );
     887             : 
     888             :     /* compute g0 */
     889       10872 :     L_g0 = L_mult0( 1, abs_s( h[0] ) );
     890      217440 :     FOR( i = 1; i < LONG_H_ST; i++ )
     891             :     {
     892      206568 :         L_g0 = L_mac0( L_g0, 1, abs_s( h[i] ) );
     893             :     }
     894       10872 :     g0 = extract_h( L_shl( L_g0, 14 ) );
     895             : 
     896             :     /* Scale signal i  of 1/A(gamma1) */
     897       10872 :     IF( GT_16( g0, 1024 ) )
     898             :     {
     899       10872 :         temp = div_s( 1024, g0 ); /* temp = 2**15 / gain0 */
     900      880632 :         FOR( i = 0; i < L_SUBFR16k; i++ )
     901             :         {
     902      869760 :             sig_ltp_ptr[i] = mult_r( sig_ltp_ptr[i], temp );
     903      869760 :             move16();
     904             :         }
     905             :     }
     906       10872 : }
     907             : 
     908      444544 : 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      444544 :     temp = sub( 2, norm_s( apond2[0] ) );
     923             :     /* compute i.r. of composed filter apond2 / apond1 */
     924      444544 :     syn_filt_fx( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 );
     925             :     /* compute 1st parcor */
     926      444544 :     Calc_rc0_h_ivas_enc_fx( h, parcor0 );
     927             : 
     928             :     /* compute g0 */
     929      444544 :     L_g0 = L_mult0( 1, abs_s( h[0] ) );
     930     8890880 :     FOR( i = 1; i < LONG_H_ST; i++ )
     931             :     {
     932     8446336 :         L_g0 = L_mac0( L_g0, 1, abs_s( h[i] ) );
     933             :     }
     934      444544 :     g0 = extract_h( L_shl( L_g0, 14 ) );
     935             : 
     936             :     /* Scale signal i  of 1/A(gamma1) */
     937      444544 :     IF( GT_16( g0, 1024 ) )
     938             :     {
     939      444544 :         temp = div_s( 1024, g0 ); /* temp = 2**15 / gain0 */
     940    36008064 :         FOR( i = 0; i < L_SUBFR16k; i++ )
     941             :         {
     942    35563520 :             sig_ltp_ptr[i] = mult_r( sig_ltp_ptr[i], temp );
     943    35563520 :             move16();
     944             :         }
     945             :     }
     946      444544 : }
     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      849208 : 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      849208 :     Flag Overflow = 0;
    1000      849208 :     move32();
    1001             : 
    1002             : 
    1003      849208 :     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      849208 :         IF( parcor0 > 0 )
    1017             :         {
    1018      709228 :             mu = mult_r( parcor0, GAMMA3_PLUS_WB_FX );
    1019             :         }
    1020             :         ELSE
    1021             :         {
    1022      139980 :             mu = mult_r( parcor0, GAMMA3_MINUS_WB_FX );
    1023             :         }
    1024             :     }
    1025             : 
    1026      849208 :     tmp = abs_s( mu );
    1027      849208 :     tmp = sub( 32767, tmp );
    1028      849208 :     exp = norm_s( tmp );
    1029      849208 :     tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /*(14 - exp) */
    1030      849208 :     ga = shl_sat( tmp, exp );                     /*Q14 */
    1031             : 
    1032             : 
    1033             :     /*    ga = (float) 1. / ((float) 1. - (float) fabs (mu)); */
    1034             : 
    1035      849208 :     ptrs = sig_in; /* points on sig_in(-1) */
    1036             : 
    1037    68785848 :     FOR( n = 0; n < SubFrameLength; n++ )
    1038             :     {
    1039    67936640 :         temp = mult_r( mu, ( *ptrs++ ) );
    1040    67936640 :         temp = add_sat( temp, *ptrs ); /*Q12 */
    1041    67936640 :         sig_out[n] = shl_o( mult_r( ga, temp ), 1, &Overflow );
    1042    67936640 :         move16(); /*Q12 */
    1043             :     }
    1044             : 
    1045      849208 :     return;
    1046             : }
    1047             : 
    1048      849208 : 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      849208 :     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      849208 :         agc_fac1_para_fx = AGC_FAC1_WB_FX;
    1073      849208 :         move16();
    1074      849208 :         agc_fac_para_fx = AGC_FAC_WB_FX;
    1075      849208 :         move16();
    1076             :     }
    1077             : 
    1078             :     /* compute input gain */
    1079      849208 :     L_acc = L_mult0( 1, abs_s( sig_in_fx[0] ) ); /*0 +Q_bwe_exc-1 */
    1080    67936640 :     FOR( i = 1; i < SubFrameLength; i++ )
    1081             :     {
    1082    67087432 :         L_acc = L_mac0( L_acc, 1, abs_s( sig_in_fx[i] ) ); /*Q_bwe_exc-1 */
    1083             :     }
    1084             : 
    1085      849208 :     g0_fx = 0;
    1086      849208 :     move16();
    1087      849208 :     IF( L_acc != 0L )
    1088             :     {
    1089      848265 :         scal_in = norm_l( L_acc );
    1090      848265 :         L_acc = L_shl( L_acc, scal_in );
    1091      848265 :         s_g_in = extract_h( L_acc ); /* normalized */
    1092             : 
    1093             :         /* Compute o   gain */
    1094      848265 :         L_acc = L_mult0( 1, abs_s( sig_out_fx[0] ) );
    1095    67861200 :         FOR( i = 1; i < SubFrameLength; i++ )
    1096             :         {
    1097    67012935 :             L_acc = L_mac0( L_acc, 1, abs_s( sig_out_fx[i] ) );
    1098             :         }
    1099      848265 :         IF( L_acc == 0L )
    1100             :         {
    1101           0 :             *gain_prec_fx = 0;
    1102           0 :             move16();
    1103             : 
    1104           0 :             return;
    1105             :         }
    1106             : 
    1107      848265 :         scal_out = norm_l( L_acc );
    1108      848265 :         L_acc = L_shl( L_acc, scal_out );
    1109      848265 :         s_g_out = extract_h( L_acc ); /* normalized */
    1110             : 
    1111             : 
    1112      848265 :         sh_g0 = add( scal_in, 1 );
    1113      848265 :         sh_g0 = sub( sh_g0, scal_out ); /* scal_in - scal_out + 1 */
    1114      848265 :         IF( LT_16( s_g_in, s_g_out ) )
    1115             :         {
    1116      158349 :             g0_fx = div_s( s_g_in, s_g_out ); /* s_g_in/s_g_out in Q15 */
    1117             :         }
    1118             :         ELSE
    1119             :         {
    1120      689916 :             temp = sub( s_g_in, s_g_out ); /* sufficient since normalized */
    1121      689916 :             g0_fx = shr( div_s( temp, s_g_out ), 1 );
    1122      689916 :             g0_fx = add( g0_fx, (Word16) 0x4000 ); /* s_g_in/s_g_out in Q14 */
    1123      689916 :             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      848265 :         g0_fx = shr_sat( g0_fx, sh_g0 ); /* sh_g0 may be >0, <0, or =0 */ // Need to verify?
    1128             : 
    1129      848265 :         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      849208 :     gain_fx = *gain_prec_fx;
    1134      849208 :     move16(); /*14 */
    1135    68785848 :     FOR( i = 0; i < SubFrameLength; i++ )
    1136             :     {
    1137    67936640 :         temp = mult_r( agc_fac_para_fx, gain_fx ); /*15 +14 -15 =14 */
    1138    67936640 :         gain_fx = add( temp, g0_fx );              /* in Q14 */
    1139    67936640 :         L_temp = L_mult( gain_fx, sig_out_fx[i] ); /*14 + Q_bwe_exc-1 +1 = 14 + Q_bwe_exc */
    1140    67936640 :         L_temp = L_shl_sat( L_temp, 1 );           /*14 + Q_bwe_exc +1 */
    1141    67936640 :         sig_out_fx[i] = round_fx_sat( L_temp );    /*Q_bwe_exc +15 -16 = Q_bwe_exc-1 */
    1142    67936640 :         move16();
    1143             :     }
    1144      849208 :     *gain_prec_fx = gain_fx;
    1145      849208 :     move16();
    1146             : 
    1147      849208 :     return;
    1148             : }
    1149             : 
    1150       10872 : 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       10872 :     parcor0_fx = 0;
    1169       10872 :     move16();
    1170       10872 :     set16_fx( apond1_fx, 0, LPC_SHB_ORDER + 1 );
    1171       10872 :     set16_fx( apond2_fx, 0, LONG_H_ST );
    1172       10872 :     set16_fx( sig_ltp_fx, 0, L_SUBFR16k + 1 );
    1173             : 
    1174             :     /* Obtain post-filter weights  */
    1175       10872 :     tmp = extract_h( L_mult( GAMMA_SHARP_FX, formant_fac_fx ) ); /*Q15 */
    1176       10872 :     g1_fx = add( GAMMA0_FX, tmp );                               /*Q15  */
    1177       10872 :     g2_fx = sub( GAMMA0_FX, tmp );                               /*Q15 */
    1178             : 
    1179             :     /* Compute weighted LPC coefficients */
    1180       10872 :     weight_a_fx( lpccoeff, apond1_fx, g1_fx, LPC_SHB_ORDER );
    1181       10872 :     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       10872 :     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       10872 :     sig_ltp_fx[0] = *ptr_mem_stp;
    1190       10872 :     move16();
    1191             : 
    1192             :     /* Control short term pst filter gain and compute parcor0   */
    1193       10872 :     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       10872 :     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       10872 :     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       10872 :     scale_st_swb( sig_in, sig_out, ptr_gain_prec, L_SUBFR16k );
    1206             : 
    1207       10872 :     return;
    1208             : }
    1209             : 
    1210      444544 : 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      444544 :     parcor0_fx = 0;
    1229      444544 :     move16();
    1230      444544 :     set16_fx( apond1_fx, 0, LPC_SHB_ORDER + 1 );
    1231      444544 :     set16_fx( apond2_fx, 0, LONG_H_ST );
    1232      444544 :     set16_fx( sig_ltp_fx, 0, L_SUBFR16k + 1 );
    1233             : 
    1234             :     /* Obtain post-filter weights  */
    1235      444544 :     tmp = extract_h( L_mult( GAMMA_SHARP_FX, formant_fac_fx ) ); /*Q15 */
    1236      444544 :     g1_fx = add( GAMMA0_FX, tmp );                               /*Q15  */
    1237      444544 :     g2_fx = sub( GAMMA0_FX, tmp );                               /*Q15 */
    1238             : 
    1239             :     /* Compute weighted LPC coefficients */
    1240      444544 :     weight_a_fx( lpccoeff, apond1_fx, g1_fx, LPC_SHB_ORDER );
    1241      444544 :     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      444544 :     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      444544 :     sig_ltp_fx[0] = *ptr_mem_stp;
    1250      444544 :     move16();
    1251             : 
    1252             :     /* Control short term pst filter gain and compute parcor0   */
    1253      444544 :     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      444544 :     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      444544 :     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      444544 :     scale_st_swb( sig_in, sig_out, ptr_gain_prec, L_SUBFR16k );
    1266             : 
    1267      444544 :     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       57238 : 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       57238 :     IF( ramp_flag )
    1345             :     {
    1346         593 :         factor = div_s( 4, length ); /* Q15 */
    1347       24313 :         FOR( i = 0; i < length / 4; i += 2 )
    1348             :         {
    1349       23720 :             tmp1 = extract_l( L_mult0( i, factor ) );           /* Q15 */
    1350       23720 :             tmp2 = extract_l( L_mult0( add( i, 1 ), factor ) ); /*Q15 */
    1351       23720 :             input_change[i] = negate( mult_r( input[i], tmp1 ) );
    1352       23720 :             move16();
    1353       23720 :             input_change[i + 1] = mult_r( input[i + 1], tmp2 );
    1354       23720 :             move16();
    1355             :         }
    1356             :     }
    1357             :     ELSE
    1358             :     {
    1359       56645 :         i = 0;
    1360       56645 :         move16();
    1361             :     }
    1362             : 
    1363     6329864 :     FOR( ; i < length; i = i + 2 )
    1364             :     {
    1365     6272626 :         input_change[i] = negate( input[i] );
    1366     6272626 :         move16();
    1367     6272626 :         input_change[i + 1] = input[i + 1];
    1368     6272626 :         move16();
    1369             :     }
    1370             : 
    1371       57238 :     Decimate_allpass_steep_fx( input_change, mem1, length, tmp );
    1372       57238 :     Decimate_allpass_steep_fx( tmp, mem2, shr( length, 1 ), output );
    1373             : 
    1374       57238 :     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       14510 : 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       14510 :     Word16 csfilt_num2[1] = { 1638 };              /* Q15*/
    1440       14510 :     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       14510 :     Flag Overflow = 0;
    1450       14510 :     move16();
    1451             : #endif
    1452             : 
    1453             :     /*0.25f*sum_f(voice_factors, NB_SUBFR)*/
    1454       14510 :     L_tmp = L_mult( voice_factors[0], 8192 /* 0.25 in Q15 */ );
    1455       58040 :     FOR( i = 1; i < NB_SUBFR; i++ )
    1456             :     {
    1457       43530 :         L_tmp = L_mac( L_tmp, voice_factors[i], 8192 /* 0.25 in Q15 */ );
    1458             :     }
    1459       14510 :     avg_voice_fac = round_fx( L_tmp );
    1460             : 
    1461       14510 :     test();
    1462       14510 :     test();
    1463       14510 :     test();
    1464       14510 :     test();
    1465       14510 :     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       14510 :     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       14510 :     set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER_WB );
    1480       14510 :     Decimate_allpass_steep_fx( bwe_exc_extended, mem_genSHBexc_filt_down1, L_FRAME32k, excTmp );
    1481       14510 :     flip_spectrum_and_decimby4_fx( excTmp, exc4k, L_FRAME16k, mem_genSHBexc_filt_down2, mem_genSHBexc_filt_down3, 0 );
    1482             : 
    1483       14510 :     IF( uv_flag )
    1484             :     {
    1485         863 :         create_random_vector_fx( exc4kWhtnd, L_FRAME16k / 4, bwe_seed );
    1486         863 :         IF( LT_16( Q_bwe_exc, 5 ) )
    1487             :         {
    1488             : 
    1489       69903 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1490             :             {
    1491       69040 :                 exc4kWhtnd[i] = shl_r( exc4kWhtnd[i], sub( Q_bwe_exc, 5 ) ); /*Q(Q_bwe_exc)/Q5(if Q_bwe_exc > 5) */
    1492       69040 :                 move16();
    1493             :             }
    1494             :         }
    1495             :     }
    1496             :     ELSE
    1497             :     {
    1498       13647 :         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       13647 :         R_l[0] = s_max( R_l[0], 1 );
    1503       13647 :         move16();
    1504       40941 :         FOR( i = 1; i <= LPC_WHTN_ORDER_WB; i++ )
    1505             :         {
    1506       27294 :             L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
    1507       27294 :             L_Extract( L_tmp, &R_h[i], &R_l[i] );
    1508             :         }
    1509             : 
    1510       13647 :         E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER_WB, NULL );
    1511             : 
    1512       13647 :         Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER_WB + 1, sub( norm_s( lpc_whtn[0] ), 2 ) );
    1513             : 
    1514       13647 :         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       13647 :         max_val = 0;
    1519       13647 :         move16();
    1520     1105407 :         FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1521             :         {
    1522     1091760 :             excTmp2[i] = abs_s( exc4kWhtnd[i] );
    1523     1091760 :             move16(); /* Q_bwe_exc */
    1524     1091760 :             max_val = s_max( max_val, excTmp2[i] );
    1525     1091760 :             move16();
    1526             :         }
    1527             : 
    1528       13647 :         IF( max_val == 0 )
    1529             :         {
    1530           0 :             pow1 = 1;
    1531           0 :             move16();
    1532           0 :             n1 = 0;
    1533           0 :             move16();
    1534             :         }
    1535             :         ELSE
    1536             :         {
    1537       13647 :             n1 = norm_s( max_val );
    1538     1105407 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1539             :             {
    1540     1091760 :                 excTmp2_frac[i] = shl_o( excTmp2[i], n1, &Overflow ); // Q_bwe_exc + n1
    1541     1091760 :                 move16();                                             /* Q14 */
    1542             :             }
    1543       13647 :             n1 = sub( sub( 14, n1 ), Q_bwe_exc );
    1544       13647 :             pow1 = 1;
    1545       13647 :             move32();
    1546     1105407 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1547             :             {
    1548     1091760 :                 L_tmp = L_mult_o( excTmp2_frac[i], excTmp2_frac[i], &Overflow ); /* Q29 */
    1549     1091760 :                 pow1 = L_add_o( pow1, L_shr( L_tmp, 10 ), &Overflow );           /* Q22 */
    1550             :             }
    1551             :         }
    1552             : 
    1553     1105407 :         FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1554             :         {
    1555     1091760 :             excNoisyEnv[i] = L_add_o( *mem_csfilt, L_mult_o( csfilt_num2[0], excTmp2[i], &Overflow ), &Overflow );
    1556     1091760 :             move32(); /* Q_bwe_exc+16  */
    1557     1091760 :             *mem_csfilt = Mult_32_16( excNoisyEnv[i], neg_csfilt_den2[1] );
    1558     1091760 :             move32(); /* Q_bwe_exc+16 */
    1559             :         }
    1560             : 
    1561       13647 :         create_random_vector_fx( exc4k, L_FRAME16k / 4, bwe_seed );
    1562             : 
    1563             :         /* Ensure pow22 is greater than zero when computing normalization */
    1564       13647 :         Lmax = 0;
    1565     1105407 :         FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1566             :         {
    1567     1091760 :             exc4k_32[i] = Mult_32_16( excNoisyEnv[i], exc4k[i] );
    1568     1091760 :             move32(); /* Q_bwe_exc+6 */
    1569     1091760 :             Lmax = L_max( Lmax, L_abs( exc4k_32[i] ) );
    1570             :         }
    1571             : 
    1572       13647 :         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       13647 :             n2 = norm_l( Lmax );
    1583     1105407 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1584             :             {
    1585     1091760 :                 exc4k_frac[i] = extract_h( L_shl_o( exc4k_32[i], n2, &Overflow ) ); /* Q(14-n2) */
    1586     1091760 :                 move16();
    1587             :             }
    1588       13647 :             n2 = 30 - n2 - ( Q_bwe_exc + 6 );
    1589       13647 :             pow22 = 1;
    1590       13647 :             move32();
    1591     1105407 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1592             :             {
    1593     1091760 :                 L_tmp = L_mult_o( exc4k_frac[i], exc4k_frac[i], &Overflow ); /* Q29 */
    1594     1091760 :                 pow22 = L_add_o( pow22, L_shr( L_tmp, 10 ), &Overflow );     /* Q22     */
    1595             :             }
    1596             :         }
    1597             : 
    1598       13647 :         test();
    1599       13647 :         test();
    1600       13647 :         IF( EQ_16( coder_type, UNVOICED ) || ( igf_flag != 0 && LT_16( avg_voice_fac, 6654 /* 0.2 in Q15 */ ) ) )
    1601             :         {
    1602         387 :             L_tmp = root_a_over_b_fx( pow1, sub( 19, shl( n1, 1 ) ), pow22, sub( 19, shl( n2, 1 ) ), &exp );
    1603         387 :             scale = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /*Q15 */
    1604         387 :             sc = sub( add( n2, Q_bwe_exc ), 14 );
    1605       31347 :             FOR( i = 0; i < L_FRAME16k / 4; i++ )
    1606             :             {
    1607       30960 :                 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       30960 :                 move16();
    1609             :             }
    1610             :         }
    1611             :         ELSE
    1612             :         {
    1613       13260 :             sc = sub( add( n2, Q_bwe_exc ), 14 ); /* Q_bwe_exc+n2-14*/
    1614             : 
    1615       13260 :             k = 0;
    1616       66300 :             FOR( i = 0; i < 4; i++ )
    1617             :             {
    1618       53040 :                 test();
    1619       53040 :                 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       53040 :                     tmp_vfac = voice_factors[i];
    1628       53040 :                     move16();
    1629             :                 }
    1630             : 
    1631       53040 :                 Ltemp1 = root_a_fx( L_deposit_h( tmp_vfac ), 31, &exp );
    1632       53040 :                 temp1 = round_fx_o( L_shl_o( Ltemp1, exp, &Overflow ), &Overflow ); /* Q15 */
    1633       53040 :                 L_tmp = Mult_32_16( pow1, sub( 32767, tmp_vfac ) );                 /* Q22*/
    1634       53040 :                 Ltemp2 = root_a_over_b_fx( L_tmp, sub( 19, shl( n1, 1 ) ), pow22, sub( 19, shl( n2, 1 ) ), &exp );
    1635       53040 :                 temp2 = round_fx_o( L_shl_o( Ltemp2, exp, &Overflow ), &Overflow ); /* Q15 */
    1636     1113840 :                 FOR( j = 0; j < L_FRAME16k / 16; j++ )
    1637             :                 {
    1638     1060800 :                     L_tmp = L_mult_o( temp1, exc4kWhtnd[k], &Overflow );                                                        /* Q(16+Q_bwe_exc) */
    1639     1060800 :                     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     1060800 :                     exc4kWhtnd[k] = round_fx_o( L_tmp, &Overflow );                                                             /* Q_bwe_exc */
    1641     1060800 :                     move16();
    1642     1060800 :                     k++;
    1643             :                 }
    1644             :             }
    1645             :         }
    1646             :     }
    1647             : 
    1648       14510 :     Scale_sig( state_lpc_syn, LPC_SHB_ORDER, -Q2 ); /* Q(Q_bwe_exc) -> Q(Q_bwe_exc - 2) */
    1649             : 
    1650       14510 :     Syn_filt_s( Q2, lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 );
    1651             : 
    1652       14510 :     Scale_sig( state_lpc_syn, LPC_SHB_ORDER, Q2 ); /* Q(Q_bwe_exc - 2) -> Q(Q_bwe_exc) */
    1653       14510 :     Scale_sig( excSHB, L_FRAME16k / 4, Q2 );       /* Q(Q_bwe_exc - 2) -> Q(Q_bwe_exc) */
    1654             : 
    1655       14510 :     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       12843 : 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       12843 :     assert( len > 0 && len <= L_FRAME16k );
    1973             : 
    1974             :     // len_h is 20 at all calling locations
    1975       12843 :     K = 10; /* length of FIR filter memory = half of the total filter length */
    1976       12843 :     move16();
    1977       12843 :     w = 1639; /* 1 / 20 in Q15 */ /* MA filtering coefficient */
    1978       12843 :     move16();
    1979             : 
    1980             :     /* copy filter memory to the input buffer */
    1981       12843 :     IF( mem_h != NULL )
    1982             :     {
    1983        4281 :         Copy( mem_h, buf_in, K );
    1984             :     }
    1985             :     ELSE
    1986             :     {
    1987             :         /* no memory available, use the first len_h/2 samples as memory */
    1988        8562 :         p_in = buf_in;
    1989       94182 :         FOR( k = 0; k < K; k++ )
    1990             :         {
    1991       85620 :             *p_in++ = mult_r( abs_s( inp[k] ), w ); /* Qx */
    1992       85620 :             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       12843 :     p_in = &buf_in[K];
    1999     4122603 :     FOR( k = 0; k < len; k++ )
    2000             :     {
    2001     4109760 :         *p_in++ = mult_r( abs_s( inp[k] ), w ); /* Qx */
    2002     4109760 :         move16();
    2003             :     }
    2004             : 
    2005             :     /* update filter memory from the end of the input buffer */
    2006       12843 :     IF( mem_h != NULL )
    2007             :     {
    2008        4281 :         Copy( &buf_in[len], mem_h, K );
    2009             :     }
    2010             : 
    2011             :     /* do MA filtering */
    2012       12843 :     out[0] = sum16_fx( buf_in, len_h );
    2013       12843 :     move16();
    2014       12843 :     p_out = &buf_in[0];    /* pointer to leaving sample */
    2015       12843 :     p_in = &buf_in[len_h]; /* pointer to entering sample*/
    2016     3981330 :     FOR( k = 1; k < len - K; k++ )
    2017             :     {
    2018     3968487 :         tmp1 = *p_out++;
    2019     3968487 :         move16();
    2020     3968487 :         tmp2 = *p_in++;
    2021     3968487 :         move16();
    2022     3968487 :         out[k] = add( sub( out[k - 1], tmp1 ), tmp2 ); /* Qx */
    2023     3968487 :         move16();
    2024             :     }
    2025             : 
    2026             :     /* use IIR filtering to extrapolate the last K samples */
    2027       12843 :     p_in = &buf_in[len - K];
    2028       12843 :     p_out = &out[len - K];
    2029       12843 :     p_prev = p_out - 1;
    2030      141273 :     FOR( k = 0; k < K; k++ )
    2031             :     {
    2032      128430 :         tmp1 = *p_in++;
    2033      128430 :         move16();
    2034      128430 :         tmp2 = *p_prev++;
    2035      128430 :         move16();
    2036      128430 :         *p_out++ = add( mult_r( 1638 /* 0.05f in Q15 */, ( tmp1 ) ), mult_r( 31130 /* 0.95f in Q15 */, ( tmp2 ) ) );
    2037      128430 :         move16();
    2038             :     }
    2039             : 
    2040       12843 :     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        2718 : 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        2718 :     Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */
    2122        2718 :     move16();
    2123        2718 :     Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */
    2124        2718 :     move16();
    2125        2718 :     move16();
    2126             :     Word16 varEnvShape;
    2127        2718 :     Word16 fb_deemph_fac = 15729; /*0.48f in Q15  */
    2128        2718 :     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        2718 :     set16_fx( zero_mem, 0, LPC_SHB_ORDER );
    2149        2718 :     set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER );
    2150             : 
    2151      872478 :     FOR( i = 0; i < L_FRAME32k; i = i + 2 )
    2152             :     {
    2153      869760 :         exc32k[i] = negate( bwe_exc_extended[i] );
    2154      869760 :         move16();
    2155      869760 :         exc32k[i + 1] = bwe_exc_extended[i + 1];
    2156      869760 :         move16();
    2157             :     }
    2158             : 
    2159             :     /* Decimate by 2 */
    2160        2718 :     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        2718 :     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        2718 :     R_l[0] = s_max( R_l[0], 1 );
    2167        2718 :     move16();
    2168       13590 :     FOR( i = 1; i <= LPC_WHTN_ORDER; i++ )
    2169             :     {
    2170       10872 :         L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
    2171       10872 :         L_Extract( L_tmp, &R_h[i], &R_l[i] );
    2172             :     }
    2173        2718 :     E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL );
    2174        2718 :     Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) );
    2175        2718 :     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        2718 :     IF( GE_32( bitrate, ACELP_24k40 ) )
    2180             :     {
    2181        1222 :         temp2 = 0;
    2182        1222 :         move16();
    2183        6110 :         FOR( j = 0; j < 4; j++ )
    2184             :         {
    2185        4888 :             temp1 = shb_res_gshape[j];
    2186        4888 :             move16();
    2187      395928 :             FOR( i = 0; i < 80; i++ )
    2188             :             {
    2189      391040 :                 exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) );
    2190      391040 :                 move16();
    2191             :                 /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */
    2192             :             }
    2193        4888 :             temp2 = add( temp2, 80 );
    2194             :         }
    2195             :     }
    2196             : 
    2197             :     /* Estimate pow1 associated with Low band nonlinear extended excitation */
    2198             :     /* pow1=0.00001f */
    2199        2718 :     tmp = sub( shl( *Q_bwe_exc, 1 ), 31 );
    2200        2718 :     pow1 = L_shl_sat( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */
    2201      872478 :     FOR( k = 0; k < L_FRAME16k; k++ )
    2202             :     {
    2203             :         /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/
    2204      869760 :         excTmp2[k] = abs_s( exc16kWhtnd[k] );
    2205      869760 :         move16();
    2206             : 
    2207             :         /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */
    2208      869760 :         pow1 = L_mac0_sat( pow1, exc16kWhtnd[k], exc16kWhtnd[k] ); /* 2*Q_bwe_exc */
    2209             :     }
    2210        2718 :     Q_pow1 = shl( *Q_bwe_exc, 1 );
    2211             : 
    2212        2718 :     test();
    2213        2718 :     IF( ( LE_32( bitrate, ACELP_13k20 ) ) && ( GE_32( bitrate, ACELP_7k20 ) ) )
    2214             :     {
    2215             :         /* varEnvShape = mean_fx(voice_factors, 4); */
    2216             :         /* unroll the loop */
    2217        1496 :         L_tmp = L_mult( voice_factors[0], 8192 );
    2218        1496 :         L_tmp = L_mac( L_tmp, voice_factors[1], 8192 );
    2219        1496 :         L_tmp = L_mac( L_tmp, voice_factors[2], 8192 );
    2220        1496 :         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        1222 :         L_tmp = L_mult( voice_factors[0], 6554 );
    2227        1222 :         L_tmp = L_mac( L_tmp, voice_factors[1], 6554 );
    2228        1222 :         L_tmp = L_mac( L_tmp, voice_factors[2], 6554 );
    2229        1222 :         L_tmp = L_mac( L_tmp, voice_factors[3], 6554 );
    2230        1222 :         varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 ); /* varEnvShape in Q15 */
    2231             :     }
    2232             : 
    2233        2718 :     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        2718 :     varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape );
    2246             : 
    2247             :     /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */
    2248        2718 :     varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ );
    2249        2718 :     varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ );
    2250        2718 :     varEnvShape = shl( varEnvShape, 1 );
    2251        2718 :     csfilt_num2[0] = sub( MAX_16, varEnvShape );
    2252        2718 :     move16();
    2253        2718 :     neg_csfilt_den2[1] = varEnvShape;
    2254        2718 :     move16();
    2255             : 
    2256        2718 :     test();
    2257        2718 :     test();
    2258        2718 :     test();
    2259        2718 :     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        2718 :         L_tmp = *mem_csfilt;
    2289        2718 :         move32();
    2290      872478 :         FOR( i = 0; i < L_FRAME16k; i++ )
    2291             :         {
    2292      869760 :             excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], excTmp2[i] );
    2293      869760 :             move16();
    2294             :             /* excNoisyEnv : Q_bwe_exc,
    2295             :              *mem_csfilt: Q_bwe_exc+16, excTmp2: Q_bwe_exc, csfilt_num2[0] Q15  */
    2296      869760 :             L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_bwe_exc+16 */
    2297             :         }
    2298        2718 :         *mem_csfilt = L_tmp;
    2299        2718 :         move32();
    2300             :     }
    2301             :     {
    2302             :         /* create a random excitation - Reuse exc16k memory */
    2303        2718 :         White_exc16k = exc16k;
    2304        2718 :         create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed );
    2305        2718 :         create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed );
    2306             : 
    2307        2718 :         L_tmp = L_deposit_l( 0 );
    2308        2718 :         tmp = add( *Q_bwe_exc, 1 );
    2309      872478 :         FOR( k = 0; k < L_FRAME16k; k++ )
    2310             :         {
    2311      869760 :             L_tmp4 = L_shl_sat( L_deposit_l( White_exc16k[k] ), tmp );
    2312      869760 :             if ( excNoisyEnv[k] != 0 )
    2313             :             {
    2314      867840 :                 L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_bwe_exc)  +5 +1*/
    2315             :             }
    2316      869760 :             White_exc16k_32[k] = L_tmp4;
    2317      869760 :             move32();
    2318      869760 :             L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
    2319             :         }
    2320        2718 :         Q_temp = norm_l( L_tmp );
    2321        2718 :         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        2718 :         tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 );
    2332        2718 :         pow22 = L_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc-NOISE_QADJ) */
    2333        2718 :         tmp = sub( NOISE_QFAC, 5 );
    2334      872478 :         FOR( k = 0; k < L_FRAME16k; k++ )
    2335             :         {
    2336             :             /* White_exc16k[k] *= excNoisyEnv[k]; */
    2337      869760 :             White_exc16k[k] = mult_r( excNoisyEnv[k], shl( White_exc16k[k], tmp ) );
    2338      869760 :             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      869760 :             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        2718 :         Q_pow22 = shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 );
    2347             :     }
    2348             : 
    2349        2718 :     IF( GE_32( bitrate, ACELP_24k40 ) )
    2350             :     {
    2351        1222 :         IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */
    2352             :         {
    2353             :             {
    2354         612 :                 Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k,
    2355         612 :                                          ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind );
    2356         612 :                 tmp = voiceFacEst[0];
    2357         612 :                 move16();
    2358         612 :                 tmp2 = MAX_16;
    2359         612 :                 move16();
    2360         612 :                 if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
    2361             :                 {
    2362         594 :                     tmp2 = 26214 /*0.8f Q15*/;
    2363         594 :                     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        1222 :     voice_factors[0] = mult_r( voice_factors[0], tmp2 );
    2382        1222 :     move16();
    2383        1222 :     voice_factors[1] = mult_r( voice_factors[1], tmp2 );
    2384        1222 :     move16();
    2385        1222 :     voice_factors[2] = mult_r( voice_factors[2], tmp2 );
    2386        1222 :     move16();
    2387        1222 :     voice_factors[3] = mult_r( voice_factors[3], tmp2 );
    2388        1222 :     move16();
    2389        1222 :     voice_factors[4] = mult_r( voice_factors[4], tmp2 );
    2390        1222 :     move16();
    2391             : }
    2392             : }
    2393             : 
    2394        2718 : tmp = sub( Q_temp, 3 );
    2395      872478 : FOR( k = 0; k < L_FRAME16k; k++ )
    2396             : {
    2397      869760 :     White_exc16k_FB[k] = round_fx( L_shl( White_exc16k_32[k], tmp ) ); /* Q_bwe_exc +5 +1 +Q_temp -16 -3 */
    2398             : }
    2399        2718 : prev_Q_bwe_exc_fb = *Q_bwe_exc_fb;
    2400        2718 : move16();
    2401        2718 : *Q_bwe_exc_fb = sub( add( *Q_bwe_exc, Q_temp ), 13 );
    2402        2718 : move16();
    2403        2718 : 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        2718 :     IF( EQ_16( coder_type, UNVOICED ) )
    2408             :     {
    2409          53 :         L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
    2410          53 :         scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */
    2411       17013 :         FOR( k = 0; k < L_FRAME16k; k++ )
    2412             :         {
    2413             :             /* White_exc16k: (Q_bwe_exc-NOISE_QADJ), scale: Q15 */
    2414       16960 :             L_tmp = L_mult( White_exc16k[k], scale );
    2415             :             /* L_tmp: (Q_bwe_exc-NOISE_QADJ) + 15 + 1 */
    2416       16960 :             exc16kWhtnd[k] = round_fx( L_shl( L_tmp, NOISE_QADJ ) );
    2417       16960 :             move16();
    2418             :             /* exc16kWhtnd:  Q_bwe_exc */
    2419             :         }
    2420          53 :         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        2665 :         nbSubFr = NB_SUBFR16k;
    2431        2665 :         lSubFr = ( L_FRAME16k / NB_SUBFR16k );
    2432        2665 :         IF( LT_32( bitrate, ACELP_24k40 ) )
    2433             :         {
    2434        1496 :             nbSubFr = NB_SUBFR;
    2435        1496 :             move16();
    2436        1496 :             lSubFr = ( L_FRAME16k / NB_SUBFR );
    2437        1496 :             move16();
    2438             :         }
    2439        2665 :         k = 0;
    2440       14494 :         FOR( i = 0; i < nbSubFr; i++ )
    2441             :         {
    2442       11829 :             test();
    2443       11829 :             IF( EQ_16( coder_type, VOICED ) && ( LT_32( bitrate, ACELP_24k40 ) ) )
    2444             :             {
    2445        1728 :                 exp = 0;
    2446        1728 :                 move16();
    2447        1728 :                 tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */
    2448        1728 :                 temp = shl( tempQ15, exp );                 /* Q15 exc16kWhtnd scale factor */
    2449        1728 :                 exp = 0;
    2450        1728 :                 move16();
    2451        1728 :                 tempQ15 = Sqrt16( temp, &exp ); /* Q15 */
    2452        1728 :                 temp1 = shl( tempQ15, exp );    /* Q15 exc16kWhtnd scale factor */
    2453             : 
    2454             :                 /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */
    2455        1728 :                 temp = sub( MAX_16, temp );
    2456        1728 :                 tempQ31 = Mult_32_16( pow1, temp );
    2457        1728 :                 L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
    2458        1728 :                 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       10101 :                 tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac );
    2464             :                 /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */
    2465       10101 :                 vf_tmp = sub( MAX_16, tempQ15 );
    2466       10101 :                 vf_tmp = mult_r( voice_factors[i], vf_tmp );
    2467             : 
    2468       10101 :                 exp = 0;
    2469       10101 :                 move16();
    2470       10101 :                 tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */
    2471       10101 :                 temp1 = shl( tempQ15, exp );      /* Q15 exc16kWhtnd scale factor */
    2472             : 
    2473             :                 /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */
    2474       10101 :                 temp = sub( MAX_16, vf_tmp );
    2475       10101 :                 tempQ31 = Mult_32_16( pow1, temp );
    2476       10101 :                 L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
    2477       10101 :                 temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
    2478             :             }
    2479             : 
    2480      864629 :             FOR( j = 0; j < lSubFr; j++ )
    2481             :             {
    2482             :                 /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */
    2483      852800 :                 L_tmp = L_mult( temp2, White_exc16k[k + j] ); /* 16+(Q_bwe_exc-NOISE_QADJ)*/
    2484      852800 :                 L_tmp = L_shl_sat( L_tmp, NOISE_QADJ );       /* 16+(Q_bwe_exc) */
    2485      852800 :                 exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] );
    2486      852800 :                 move16();
    2487             :                 /* Q_bwe_exc */
    2488             :             }
    2489       11829 :             k = add( k, lSubFr );
    2490             : 
    2491             :             /* estimate the pre-emph factor */
    2492       11829 :             tempQ15 = sub( MAX_16, voice_factors[i] );
    2493       11829 :             exp = 0;
    2494       11829 :             move16();
    2495       11829 :             temp = Sqrt16( tempQ15, &exp );
    2496       11829 :             temp = shl( temp, exp - 1 );
    2497             : 
    2498       11829 :             temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */
    2499       11829 :             temp = div_s( temp, temp2 );           /* Q15 */
    2500       11829 :             temp = mult_r( PREEMPH_FAC, temp );
    2501             : 
    2502       11829 :             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        2718 : IF( LT_32( bitrate, ACELP_24k40 ) )
    2510             : {
    2511        1496 :     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        1222 :     set16_fx( zero_mem, 0, LPC_SHB_ORDER );
    2518             : 
    2519        1222 :     Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 );
    2520        1222 :     syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    2521        1222 :     move32();
    2522             : 
    2523        1222 :     Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 );
    2524        1222 :     syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    2525        1222 :     move32();
    2526             : 
    2527        1222 :     Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 );
    2528        1222 :     syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    2529        1222 :     move32();
    2530             : 
    2531        1222 :     Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 );
    2532        1222 :     syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    2533        1222 :     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        1222 :     IF( LE_32( bitrate, ACELP_32k ) )
    2539             :     {
    2540        1222 :         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        1222 :         tmp = shl( Q_shb, 1 );
    2544        1222 :         tmp2 = add( shl( *Q_bwe_exc, 1 ), 1 );
    2545        1222 :         L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */
    2546             : 
    2547        1222 :         *Q_bwe_exc = sub( *Q_bwe_exc, exp );
    2548        1222 :         move16(); /* compensate for the exp shift */
    2549        1222 :         tmp2 = add( prev_Q_bwe_syn, n_mem2 );
    2550        1222 :         IF( GT_16( *Q_bwe_exc, tmp2 ) )
    2551             :         {
    2552           0 :             L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) );
    2553           0 :             *Q_bwe_exc = tmp2;
    2554           0 :             move16();
    2555             :         }
    2556      392262 :         FOR( i = 0; i < L_FRAME16k; i++ )
    2557             :         {
    2558      391040 :             L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */
    2559      391040 :             exc16kWhtnd[i] = round_fx( L_tmp3 );           /* *Q_bwe_exc - exp */
    2560      391040 :             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        1222 :     tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn );
    2569       13442 :     FOR( i = 0; i < LPC_SHB_ORDER; i++ )
    2570             :     {
    2571       12220 :         state_lpc_syn[i] = shl( state_lpc_syn[i], tmp );
    2572       12220 :         move16();
    2573             :     }
    2574       25662 :     FOR( i = -L_SHB_LAHEAD; i < 0; i++ )
    2575             :     {
    2576       24440 :         excSHB[i] = shl( excSHB[i], tmp );
    2577       24440 :         move16();
    2578             :     }
    2579             :     /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */
    2580             : 
    2581        1222 :     Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 );
    2582        1222 :     Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 );
    2583        1222 :     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        1222 :     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        2718 : 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        2718 :     set16_fx( White_exc16k_FB, 0, L_FRAME16k );
    2616             : }
    2617             : 
    2618        2718 : return;
    2619             : }
    2620             : 
    2621      115417 : 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      115417 :     Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */
    2682      115417 :     move16();
    2683      115417 :     Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */
    2684      115417 :     move16();
    2685      115417 :     move16();
    2686             :     Word16 varEnvShape;
    2687      115417 :     Word16 fb_deemph_fac = 15729; /*0.48f in Q15  */
    2688             :     Word16 exc16kWhtnd[L_FRAME16k];
    2689             : 
    2690             :     Word32 L_tmp;
    2691             :     Word16 vf_tmp;
    2692      115417 :     Word16 tmp, exp, tmp2 = 0;
    2693      115417 :     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      115417 :     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      115417 :     mix_factor = 0; /* Q15 */
    2722      115417 :     move16();
    2723             : 
    2724      115417 :     set16_fx( zero_mem, 0, LPC_SHB_ORDER );
    2725      115417 :     set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER );
    2726    37048857 :     FOR( i = 0; i < L_FRAME32k; i = i + 2 )
    2727             :     {
    2728    36933440 :         exc32k[i] = negate( bwe_exc_extended[i] ); // Q_bwe_exc
    2729    36933440 :         move16();
    2730    36933440 :         exc32k[i + 1] = bwe_exc_extended[i + 1]; // Q_bwe_exc
    2731    36933440 :         move16();
    2732             :     }
    2733             : 
    2734             :     /* Decimate by 2 */
    2735      115417 :     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      115417 :     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      115417 :     R_l[0] = s_max( R_l[0], 1 );
    2742      115417 :     move16();
    2743      577085 :     FOR( i = 1; i <= LPC_WHTN_ORDER; i++ )
    2744             :     {
    2745      461668 :         L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
    2746      461668 :         L_Extract( L_tmp, &R_h[i], &R_l[i] ); // Q_R
    2747             :     }
    2748      115417 :     E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL );
    2749      115417 :     Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); // Q12
    2750      115417 :     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      115417 :     IF( GE_32( extl_brate, SWB_TBE_2k8 ) )
    2756             :     {
    2757       25057 :         temp2 = 0;
    2758       25057 :         move16();
    2759      125285 :         FOR( j = 0; j < 4; j++ )
    2760             :         {
    2761      100228 :             temp1 = shb_res_gshape[j];
    2762      100228 :             move16();
    2763     8118468 :             FOR( i = 0; i < 80; i++ )
    2764             :             {
    2765     8018240 :                 exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); // Q_bwe_exc
    2766     8018240 :                 move16();
    2767             :                 /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */
    2768             :             }
    2769      100228 :             temp2 = add( temp2, 80 );
    2770             :         }
    2771             :     }
    2772             : 
    2773             :     /* Estimate pow1 associated with Low band nonlinear extended excitation */
    2774             :     /* pow1=0.00001f */
    2775      115417 :     tmp = sub( shl( *Q_bwe_exc, 1 ), 31 );
    2776      115417 :     W_tmp = W_shl( 21475 /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */
    2777    37048857 :     FOR( k = 0; k < L_FRAME16k; k++ )
    2778             :     {
    2779             :         /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/
    2780    36933440 :         excTmp2[k] = abs_s( exc16kWhtnd[k] );
    2781    36933440 :         move16();
    2782             : 
    2783             :         /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */
    2784    36933440 :         W_tmp = W_mac_16_16( W_tmp, exc16kWhtnd[k], exc16kWhtnd[k] ); // 2*Q_bwe_exc+1
    2785             :     }
    2786      115417 :     exp = W_norm( W_tmp );
    2787      115417 :     pow1 = W_extract_h( W_shl( W_tmp, exp ) ); // 2*Q_bwe_exc+1+exp-32 = // tmp+exp
    2788      115417 :     Q_pow1 = add( tmp, exp );
    2789             : 
    2790      115417 :     IF( flag_ACELP16k == 0 )
    2791             :     {
    2792             :         /* varEnvShape = mean_fx(voice_factors, 4); */
    2793             :         /* unroll the loop */
    2794       55731 :         L_tmp = L_mult( voice_factors[0], 8192 /*0.25 in Q15 */ );
    2795       55731 :         L_tmp = L_mac( L_tmp, voice_factors[1], 8192 /*0.25 in Q15 */ );
    2796       55731 :         L_tmp = L_mac( L_tmp, voice_factors[2], 8192 /*0.25 in Q15 */ );
    2797       55731 :         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       59686 :         L_tmp = L_mult( voice_factors[0], 6554 /*0.2 in Q15 */ );
    2804       59686 :         L_tmp = L_mac( L_tmp, voice_factors[1], 6554 /*0.2 in Q15 */ );
    2805       59686 :         L_tmp = L_mac( L_tmp, voice_factors[2], 6554 /*0.2 in Q15 */ );
    2806       59686 :         L_tmp = L_mac( L_tmp, voice_factors[3], 6554 /*0.2 in Q15 */ );
    2807       59686 :         varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 /*0.2 in Q15 */ ); /* varEnvShape in Q15 */
    2808             :     }
    2809             : 
    2810      115417 :     IF( EQ_16( extl, FB_TBE ) )
    2811             :     {
    2812             :         /*pow(varEnvShape,3) */
    2813       43782 :         tmp = mult_r( varEnvShape, varEnvShape );
    2814       43782 :         tmp = mult_r( tmp, varEnvShape );
    2815             : 
    2816             :         /* max_val((0.68f - (float)pow(varEnvShape, 3)), 0.48f); */
    2817       43782 :         fb_deemph_fac = sub( 22282 /*0.68f Q15*/, tmp );
    2818       43782 :         fb_deemph_fac = s_max( fb_deemph_fac, 15729 /*0.48f Q15*/ );
    2819             :     }
    2820             : 
    2821             :     /*varEnvShape = 1.09875f - 0.49875f * varEnvShape; */
    2822      115417 :     varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape );
    2823             : 
    2824             :     /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */
    2825      115417 :     varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ );
    2826      115417 :     varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ );
    2827      115417 :     varEnvShape = shl( varEnvShape, 1 );
    2828      115417 :     csfilt_num2[0] = sub( MAX_16, varEnvShape ); // Q15
    2829      115417 :     move16();
    2830      115417 :     neg_csfilt_den2[1] = varEnvShape; // Q15
    2831      115417 :     move16();
    2832             : 
    2833      115417 :     test();
    2834      115417 :     test();
    2835      115417 :     test();
    2836      115417 :     test();
    2837      115417 :     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      115417 :     IF( MSFlag > 0 )
    2866             :     {
    2867             :         // varEnvShape = 0.995f;
    2868        5725 :         varEnvShape = 32604;
    2869        5725 :         move16();
    2870        5725 :         csfilt_num2[0] = 32768 - varEnvShape;
    2871             :         // csfilt_num2[0] = sub( 32767, varEnvShape );
    2872        5725 :         move16();
    2873        5725 :         neg_csfilt_den2[1] = varEnvShape;
    2874        5725 :         move16();
    2875             :     }
    2876             : 
    2877      115417 :     White_exc16k = exc16k;
    2878      115417 :     Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc );
    2879      115417 :     IF( *mem_csfilt )
    2880             :     {
    2881       77653 :         Q_excTmp2 = s_min( Q_excTmp2, sub( add( norm_l( *mem_csfilt ), *Q_bwe_exc ), 1 ) );
    2882             :     }
    2883      115417 :     test();
    2884             :     /* Track the low band envelope */
    2885      115417 :     IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) )
    2886             :     {
    2887       30067 :         test();
    2888       30067 :         IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) )
    2889             :         {
    2890       25786 :             mem_csfilt_left = 0;
    2891       25786 :             mem_csfilt_right = 0;
    2892       25786 :             move16();
    2893       25786 :             move16();
    2894     8277306 :             FOR( k = 0; k < L_FRAME16k; k++ )
    2895             :             {
    2896             :                 // excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k];
    2897     8251520 :                 excNoisyEnvLeft[k] = add( mem_csfilt_left, mult_r( csfilt_num2[0], shl( excTmp2[k], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2
    2898     8251520 :                 move16();
    2899             :                 // mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k];
    2900     8251520 :                 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     8251520 :                 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     8251520 :                 move16();
    2904             :                 // mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1];
    2905     8251520 :                 mem_csfilt_right = mult_r( neg_csfilt_den2[1], excNoisyEnvRight[L_FRAME16k - k - 1] ); // Q_excTmp2
    2906             :             }
    2907             : 
    2908       25786 :             alpha = 0;
    2909       25786 :             move16();
    2910             :             // step = 1.0f / L_FRAME16k;
    2911       25786 :             step = 102; // Q15
    2912       25786 :             move16();
    2913     8277306 :             FOR( k = 0; k < L_FRAME16k; k++ )
    2914             :             {
    2915             :                 // excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + (1 - alpha) * excNoisyEnvRight[k];
    2916     8251520 :                 excNoisyEnv[k] = add( mult_r( alpha, excNoisyEnvLeft[k] ), mult_r( sub( 32767, alpha ), excNoisyEnvRight[k] ) ); // Q_excTmp2
    2917     8251520 :                 move16();
    2918     8251520 :                 alpha = add( alpha, step );
    2919             :             }
    2920             :         }
    2921             :     }
    2922             :     ELSE
    2923             :     {
    2924             :         /* Track the low band envelope */
    2925       85350 :         L_tmp = L_shl( *mem_csfilt, sub( Q_excTmp2, *Q_bwe_exc ) );
    2926       85350 :         move32();
    2927    27397350 :         FOR( i = 0; i < L_FRAME16k; i++ )
    2928             :         {
    2929    27312000 :             excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], shl( excTmp2[i], sub( Q_excTmp2, *Q_bwe_exc ) ) );
    2930    27312000 :             move16();
    2931             :             /* Work-around to avoid 0s for very small value*/
    2932    27312000 :             test();
    2933    27312000 :             test();
    2934    27312000 :             test();
    2935    27312000 :             test();
    2936    27312000 :             if ( excNoisyEnv[i] == 0 && ( L_tmp != 0 || ( csfilt_num2[0] != 0 && excTmp2[i] != 0 ) ) )
    2937             :             {
    2938        5786 :                 excNoisyEnv[i] = 1;
    2939        5786 :                 move16();
    2940             :             }
    2941             :             /* excNoisyEnv : Q_excTmp2,
    2942             :              *mem_csfilt: Q_excTmp2+16, excTmp2: Q_excTmp2, csfilt_num2[0] Q_excTmp2  */
    2943    27312000 :             L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_excTmp2 + 16 */
    2944             :         }
    2945       85350 :         *mem_csfilt = L_shr( L_tmp, sub( Q_excTmp2, *Q_bwe_exc ) );
    2946       85350 :         move32();
    2947             :     }
    2948             : 
    2949      115417 :     test();
    2950      115417 :     IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    2951        4281 :     {
    2952             :         /* generate gaussian (white) excitation */
    2953     1374201 :         FOR( k = 0; k < L_FRAME16k; k++ )
    2954             :         {
    2955     1369920 :             White_exc16k[k] = own_random( &bwe_seed[0] ); // Q0
    2956     1369920 :             move16();
    2957             :         }
    2958             : 
    2959             :         /* normalize the amplitude of the gaussian excitation to that of the LB exc. */
    2960        4281 :         Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT; // Q31
    2961        4281 :         move32();
    2962        4281 :         move32();
    2963        4281 :         pow22 = POW_EXC16k_WHTND_FX;
    2964        4281 :         Q_pow22 = -6;
    2965        4281 :         move16();
    2966             :         // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), White_exc16k, L_FRAME16k);
    2967        4281 :         Word16 pow1_exp = sub( Q31, Q_pow1 );
    2968        4281 :         Word32 temp_pow = Sqrt32( pow1, &pow1_exp );
    2969        4281 :         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        4281 :         L_tmp = 0;
    2975        4281 :         move32();
    2976        4281 :         Q_White_exc16k = add( getScaleFactor16( White_exc16k, L_FRAME16k ), norm_l( temp_pow ) );
    2977     1374201 :         FOR( k = 0; k < L_FRAME16k; k++ )
    2978             :         {
    2979     1369920 :             White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] ); // Q31 + Q0 - Q15 = Q16
    2980     1369920 :             move32();
    2981     1369920 :             White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); //  Q16 + Q_White_exc16k - Q16 = Q_White_exc16k
    2982     1369920 :             move16();
    2983     1369920 :             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      111136 :         create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed );                        // Q5
    2990      111136 :         create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); // Q5
    2991             : 
    2992      111136 :         L_tmp = L_deposit_l( 0 );
    2993      111136 :         tmp = add( *Q_bwe_exc, 1 );
    2994    35674656 :         FOR( k = 0; k < L_FRAME16k; k++ )
    2995             :         {
    2996    35563520 :             L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_excTmp2)  +5 +1*/
    2997    35563520 :             White_exc16k_32[k] = L_tmp4;                        /* (Q_excTmp2)  +5 +1*/
    2998    35563520 :             move32();
    2999    35563520 :             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      111136 :         tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 );
    3007      111136 :         W_tmp = W_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(*Q_bwe_exc-NOISE_QADJ) */
    3008      111136 :         Q_White_exc16k = getScaleFactor32( White_exc16k_32, L_FRAME16k );
    3009    35674656 :         FOR( k = 0; k < L_FRAME16k; k++ )
    3010             :         {
    3011             :             /* White_exc16k[k] *= excNoisyEnv[k]; */
    3012    35563520 :             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    35563520 :             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    35563520 :             W_tmp = W_mac0_16_16( W_tmp, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2 + Q_White_exc16k - 10)*/
    3020             :         }
    3021      111136 :         Q_pow22 = W_norm( W_tmp );
    3022      111136 :         pow22 = W_extract_h( W_shl( W_tmp, Q_pow22 ) ); // 2*(Q_excTmp2 + Q_White_exc16k - 10)+Q_pow22-32
    3023      111136 :         Q_pow22 = sub( add( Q_pow22, shl( sub( add( Q_White_exc16k, Q_excTmp2 ), 10 ), 1 ) ), 32 );
    3024      111136 :         Q_White_exc16k = add( Q_White_exc16k, sub( Q_excTmp2, 10 ) );
    3025             :     }
    3026             : 
    3027      115417 :     flag_plosive = 0;
    3028      115417 :     move16();
    3029      115417 :     test();
    3030      115417 :     test();
    3031      115417 :     test();
    3032      115417 :     IF( GE_32( extl_brate, SWB_TBE_2k8 ) || EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    3033             :     {
    3034       29338 :         IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */
    3035             :         {
    3036       29338 :             test();
    3037       29338 :             IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    3038             :             {
    3039     1374201 :                 FOR( k = 0; k < L_FRAME16k; k++ )
    3040             :                 {
    3041     1369920 :                     White_exc16k_tmp[k] = shl( White_exc16k[k], sub( *Q_bwe_exc, Q_White_exc16k ) );
    3042     1369920 :                     move16();
    3043             :                 }
    3044             : 
    3045             :                 /* calculate TD envelopes of exc16kWhtnd and White_exc16k */
    3046        4281 :                 find_td_envelope_fx( White_exc16k_tmp, L_FRAME16k, 20, NULL, EnvWhiteExc16k ); /* Q_bwe_exc */
    3047        4281 :                 find_td_envelope_fx( exc16kWhtnd, L_FRAME16k, 20, NULL, EnvExc16kWhtnd );      /* Q_bwe_exc */
    3048             : 
    3049      346761 :                 FOR( k = 0; k < L_FRAME4k; k++ )
    3050             :                 {
    3051      342480 :                     EnvWhiteExc16k_4k[k] = EnvWhiteExc16k[4 * k]; /* Q_bwe_exc */
    3052      342480 :                     move16();
    3053      342480 :                     EnvExc16kWhtnd_4k[k] = EnvExc16kWhtnd[4 * k]; /* Q_bwe_exc */
    3054      342480 :                     move16();
    3055             :                 }
    3056             : 
    3057             :                 /* calculate the optimal mix factor */
    3058        4281 :                 c0 = c1 = c2 = c3 = c4 = c5 = 0; /* Q0 */
    3059        4281 :                 move32();
    3060        4281 :                 move32();
    3061        4281 :                 move32();
    3062        4281 :                 move32();
    3063        4281 :                 move32();
    3064        4281 :                 move32();
    3065             : 
    3066        4281 :                 temp1 = add( shl( *Q_bwe_exc, 1 ), 1 );
    3067        4281 :                 temp2 = add( add( Q_EnvSHBres_4k, *Q_bwe_exc ), 1 );
    3068        4281 :                 temp3 = add( shl( Q_EnvSHBres_4k, 1 ), 1 );
    3069       21405 :                 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       17124 :                     c0_part[i] = L_shr( sum2_fx( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */
    3073       17124 :                     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       17124 :                     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       17124 :                     move32();
    3077             :                     // c2_part[i] = sum2_f( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
    3078       17124 :                     c2_part[i] = L_shr( sum2_fx( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */
    3079       17124 :                     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       17124 :                     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       17124 :                     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       17124 :                     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       17124 :                     move32();
    3086             :                     // c5_part[i] = sum2_f( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
    3087       17124 :                     c5_part[i] = L_shr( sum2_fx( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp3 ); /* Q0 */
    3088       17124 :                     move32();
    3089             : 
    3090       17124 :                     c0 = L_add( c0, c0_part[i] );
    3091       17124 :                     c1 = L_add( c1, c1_part[i] );
    3092       17124 :                     c2 = L_add( c2, c2_part[i] );
    3093       17124 :                     c3 = L_add( c3, c3_part[i] );
    3094       17124 :                     c4 = L_add( c4, c4_part[i] );
    3095       17124 :                     c5 = L_add( c5, c5_part[i] );
    3096             :                 }
    3097             : 
    3098             :                 // den = 4.0f * c0 * c2 - c4 * c4;
    3099        4281 :                 W_tmp = W_sub( W_shl( W_mult0_32_32( c0, c2 ), 2 ), W_mult0_32_32( c4, c4 ) );
    3100        4281 :                 den_e = 63;
    3101        4281 :                 move16();
    3102        4281 :                 shift = W_norm( W_tmp );
    3103        4281 :                 den = W_extract_h( W_shl( W_tmp, shift ) );
    3104        4281 :                 den_e = sub( den_e, shift );
    3105             : 
    3106        4281 :                 IF( den == 0 )
    3107             :                 {
    3108         267 :                     den = 1;
    3109         267 :                     move32();
    3110         267 :                     den_e = 31;
    3111         267 :                     move16();
    3112             :                 }
    3113             : 
    3114             :                 // g1 = ( c3 * c4 - 2 * c1 * c2 ) / den;
    3115        4281 :                 W_tmp = W_sub( W_mult0_32_32( c3, c4 ), W_shl( W_mult0_32_32( c1, c2 ), 1 ) );
    3116        4281 :                 g1_e = 63;
    3117        4281 :                 move16();
    3118        4281 :                 shift = W_norm( W_tmp );
    3119        4281 :                 L_tmp = W_extract_h( W_shl( W_tmp, shift ) );
    3120        4281 :                 g1_e = sub( g1_e, shift );
    3121             : 
    3122        4281 :                 g1 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e );
    3123        4281 :                 g1_e = sub( add( tmp_e, g1_e ), den_e );
    3124             : 
    3125             :                 // g2 = ( c1 * c4 - 2 * c0 * c3 ) / den;
    3126        4281 :                 W_tmp = W_sub( W_mult0_32_32( c1, c4 ), W_shl( W_mult0_32_32( c0, c3 ), 1 ) );
    3127        4281 :                 g2_e = 63;
    3128        4281 :                 move16();
    3129        4281 :                 shift = W_norm( W_tmp );
    3130        4281 :                 L_tmp = W_extract_h( W_shl( W_tmp, shift ) );
    3131        4281 :                 g2_e = sub( g2_e, shift );
    3132             : 
    3133        4281 :                 g2 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e );
    3134        4281 :                 g2_e = sub( add( tmp_e, g2_e ), den_e );
    3135             : 
    3136             :                 // *Env_error = 0.0f;
    3137        4281 :                 *Env_error = 0;
    3138        4281 :                 move16();
    3139        4281 :                 flag_plosive = 0;
    3140        4281 :                 move16();
    3141       21405 :                 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       17124 :                     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       17124 :                     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       17124 :                     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       17124 :                     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       17124 :                     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       17124 :                     Env_error_part[i] = extract_h( L_shr_sat( L_tmp, sub( Q15, tmp_e ) ) ); /* Q0 */
    3152       17124 :                     move16();
    3153             : 
    3154             :                     // *Env_error += Env_error_part[i];
    3155       17124 :                     *Env_error = add_sat( *Env_error, Env_error_part[i] ); /* Q0 */
    3156       17124 :                     move16();
    3157             : 
    3158       17124 :                     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          46 :                         flag_plosive = 1;
    3162          46 :                         move16();
    3163             :                     }
    3164             :                 }
    3165             : 
    3166        4281 :                 IF( flag_plosive )
    3167             :                 {
    3168             :                     /* plosive detected -> set the mixing factor to 0 */
    3169          39 :                     *vf_ind = 0;
    3170          39 :                     move16();
    3171          39 :                     mix_factor = 0;
    3172          39 :                     move16();
    3173             :                 }
    3174             :                 ELSE
    3175             :                 {
    3176             :                     /* normalize gain */
    3177             :                     // g = g2 / ( g1 + g2 );
    3178        4242 :                     tmp1_e = BASOP_Util_Add_MantExp( g1, g1_e, g2, g2_e, &tmp );
    3179        4242 :                     IF( tmp == 0 )
    3180             :                     {
    3181         340 :                         tmp = 1;
    3182         340 :                         move16();
    3183         340 :                         tmp1_e = 15;
    3184         340 :                         move16();
    3185             :                     }
    3186        4242 :                     g = BASOP_Util_Divide1616_Scale( g2, tmp, &tmp_e );
    3187        4242 :                     g_e = sub( add( tmp_e, g2_e ), tmp1_e );
    3188             : 
    3189             :                     /* quantization of the mixing factor */
    3190        4242 :                     cbsize = 1 << NUM_BITS_SHB_VF;
    3191        4242 :                     move16();
    3192             :                     // delta = 1.0f / ( cbsize - 1 );
    3193        4242 :                     delta = 2341; /* Q14 */
    3194        4242 :                     move16();
    3195             :                     // if ( g > 1.0f )
    3196        4242 :                     IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), ONE_IN_Q31, 0 ) > 0 )
    3197             :                     {
    3198             :                         // g = 1.0f;
    3199         848 :                         g = MAX16B; /* Q15 */
    3200         848 :                         move16();
    3201         848 :                         g_e = 0;
    3202         848 :                         move16();
    3203             :                     }
    3204             :                     // else if ( g < shl( delta, ( 15 - g_e ) - 14 ) )
    3205        3394 :                     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         676 :                         g = shl( delta, 1 ); /* Q15 */
    3210         676 :                         g_e = 0;
    3211         676 :                         move16();
    3212             :                     }
    3213             : 
    3214        4242 :                     g = shl_sat( g, g_e ); /* Q15 */
    3215             : 
    3216        4242 :                     *vf_ind = usquant_fx( g, &mix_factor, 0, delta, cbsize );
    3217        4242 :                     move16();
    3218             :                 }
    3219             :             }
    3220             :             ELSE
    3221             :             {
    3222       25057 :                 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       25057 :                 tmp = voiceFacEst[0];
    3225       25057 :                 tmp2 = MAX_16;
    3226       25057 :                 move16();
    3227       25057 :                 move16();
    3228       25057 :                 if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
    3229             :                 {
    3230       24732 :                     tmp2 = 26214 /*0.8f Q15*/;
    3231       24732 :                     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       29338 :         test();
    3269       29338 :         IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) )
    3270             :         {
    3271       25057 :             voice_factors[0] = mult_r( voice_factors[0], tmp2 );
    3272       25057 :             move16();
    3273       25057 :             voice_factors[1] = mult_r( voice_factors[1], tmp2 );
    3274       25057 :             move16();
    3275       25057 :             voice_factors[2] = mult_r( voice_factors[2], tmp2 );
    3276       25057 :             move16();
    3277       25057 :             voice_factors[3] = mult_r( voice_factors[3], tmp2 );
    3278       25057 :             move16();
    3279       25057 :             voice_factors[4] = mult_r( voice_factors[4], tmp2 );
    3280       25057 :             move16();
    3281             :         }
    3282             :     }
    3283             : 
    3284      115417 :     test();
    3285      115417 :     IF( GE_16( element_mode, IVAS_CPE_DFT ) && nlExc16k != NULL )
    3286             :     {
    3287             :         /* save buffers for IC-BWE */
    3288             :         // mvr2r(exc16kWhtnd, nlExc16k, L_FRAME16k);
    3289       24359 :         Copy( exc16kWhtnd, nlExc16k, L_FRAME16k ); // Q_bwe_exc
    3290       24359 :         *nlExc16k_e = sub( 15, *Q_bwe_exc );
    3291       24359 :         move16();
    3292             : 
    3293             :         // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), mixExc16k, L_FRAME16k);
    3294       24359 :         L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
    3295       24359 :         Word16 temp_fac = round_fx_sat( L_tmp ); // Q15-exp
    3296             : 
    3297     7819239 :         FOR( k = 0; k < L_FRAME16k; k++ )
    3298             :         {
    3299     7794880 :             mixExc16k[k] = mult_r( White_exc16k[k], temp_fac ); // Q_White_exc16k+15-exp-15 = Q_White_exc16k-exp
    3300     7794880 :             move16();
    3301             :         }
    3302       24359 :         *mixExc16k_e = sub( 15, sub( Q_White_exc16k, exp ) );
    3303       24359 :         move16();
    3304             :     }
    3305             : 
    3306      115417 :     Copy( White_exc16k, White_exc16k_FB, L_FRAME16k ); // Q_White_exc16k
    3307      115417 :     prev_Q_bwe_exc_fb = *Q_bwe_exc_fb;
    3308      115417 :     *Q_bwe_exc_fb = Q_White_exc16k;
    3309      115417 :     move16();
    3310      115417 :     move16();
    3311             : 
    3312      115417 :     scale_sig( White_exc16k, L_FRAME16k, -1 /* guard bit to prevent saturation in deemph*/ );
    3313      115417 :     Q_White_exc16k = sub( Q_White_exc16k, 1 );
    3314             : 
    3315      115417 :     Word16 tbe_demph_fx = shl_sat( *tbe_demph, sub( Q_White_exc16k, *Q_bwe_exc ) ); // Q_White_exc16k
    3316             : 
    3317      115417 :     deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, &tbe_demph_fx );
    3318             :     /* i/o: White_exc16k (Q_White_exc16k) */
    3319             :     /* i: tbe_demph_fx (Q_White_exc16k) */
    3320      115417 :     *tbe_demph = shr_sat( tbe_demph_fx, sub( Q_White_exc16k, *Q_bwe_exc ) );
    3321      115417 :     move16();
    3322             : 
    3323      115417 :     test();
    3324      115417 :     IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    3325             :     {
    3326        4281 :         IF( !flag_plosive ) /* use only LB excitation in case of plosives */
    3327             :         {
    3328             :             /* re-scale gaussian excitation at the beginning to gradually move from old energy to new energy */
    3329             :             /* old_scale = (float) sqrt( *prev_pow_exc16kWhtnd / pow1 ); */
    3330        4242 :             old_scale = round_fx_sat( root_a_over_b_fx( *prev_pow_exc16kWhtnd, 0, pow1, Q_pow1, &exp ) ); // exp
    3331        4242 :             old_scale = shl( old_scale, s_min( 0, exp ) );                                                // limit Q factor to 15
    3332        4242 :             exp = s_max( 0, exp );
    3333             : 
    3334             :             // new_scale = 1.0f;
    3335        4242 :             new_scale = shr( 32767, exp ); // exp
    3336             : 
    3337             :             // step_scale = (new_scale - old_scale) / (L_FRAME16k / 2);
    3338        4242 :             step_scale = mult_r( sub( new_scale, old_scale ), 205 ); // exp
    3339        4242 :             scale = old_scale;                                       // exp
    3340        4242 :             move16();
    3341             : 
    3342             :             /* interpolate between the old and the new value of the mixing factor */
    3343        4242 :             old_fact = *prev_mix_factor; // Q15
    3344        4242 :             new_fact = mix_factor;       // Q15
    3345        4242 :             move16();
    3346        4242 :             move16();
    3347             : 
    3348             :             // step = (new_fact - old_fact) / (L_FRAME16k / 2);
    3349        4242 :             step = mult_r( sub( new_fact, old_fact ), 205 ); // Q15
    3350        4242 :             fact = old_fact;                                 // Q15
    3351        4242 :             move16();
    3352             : 
    3353        4242 :             shift = add( exp, sub( *Q_bwe_exc, Q_White_exc16k ) );
    3354             : 
    3355             :             /* mixing of LB and gaussian excitation in the first half of the frame */
    3356      682962 :             FOR( k = 0; k < L_FRAME16k / 2; k++ )
    3357             :             {
    3358             :                 /* exc16kWhtnd[k] = (float)fact * (White_exc16k[k] * scale) + (float)(1 - fact) * exc16kWhtnd[k]; */
    3359      678720 :                 L_tmp = L_shl_sat( L_mult( fact, mult_r( White_exc16k[k], scale ) ), shift ); // Q_bwe_exc+16
    3360      678720 :                 exc16kWhtnd[k] = mac_r_sat( L_tmp, sub( 32767, fact ), exc16kWhtnd[k] );      // Q_bwe_exc
    3361      678720 :                 move16();
    3362             : 
    3363      678720 :                 fact = add_sat( fact, step );         // Q15
    3364      678720 :                 scale = add_sat( scale, step_scale ); // exp
    3365             :             }
    3366             : 
    3367        4242 :             shift = sub( *Q_bwe_exc, Q_White_exc16k );
    3368             :             /* mixing of LB and gaussian excitation in the second half of the frame */
    3369      682962 :             FOR( ; k < L_FRAME16k; k++ )
    3370             :             {
    3371             :                 // exc16kWhtnd[k] = (float)new_fact * White_exc16k[k] + (float)(1 - new_fact) * exc16kWhtnd[k];
    3372      678720 :                 L_tmp = L_shl_sat( L_mult( new_fact, White_exc16k[k] ), shift );         // Q_bwe_exc+16
    3373      678720 :                 exc16kWhtnd[k] = mac_r( L_tmp, sub( 32767, new_fact ), exc16kWhtnd[k] ); // Q_bwe_exc
    3374      678720 :                 move16();
    3375             :             }
    3376             :         }
    3377             :         // preemph(exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph);
    3378        4281 :         PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); // Q_bwe_exc
    3379             :     }
    3380             :     ELSE
    3381             :     {
    3382      111136 :         test();
    3383      111136 :         IF( EQ_16( coder_type, UNVOICED ) || EQ_16( MSFlag, 1 ) )
    3384             :         {
    3385        7274 :             scale = 0;
    3386        7274 :             move16();
    3387             : 
    3388        7274 :             test();
    3389        7274 :             IF( pow1 != 0 && pow22 != 0 )
    3390             :             {
    3391        7274 :                 L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
    3392        7274 :                 scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */
    3393             :             }
    3394             : 
    3395     2334954 :             FOR( k = 0; k < L_FRAME16k; k++ )
    3396             :             {
    3397     2327680 :                 exc16kWhtnd[k] = mult_r_sat( White_exc16k[k], scale ); // Q_White_exc16k
    3398     2327680 :                 move16();
    3399             :             }
    3400             : 
    3401        7274 :             Scale_sig( exc16kWhtnd, L_FRAME16k, sub( *Q_bwe_exc, Q_White_exc16k ) ); // Q_bwe_exc
    3402             : 
    3403        7274 :             PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); // Q_bwe_exc
    3404             :             /* i/o: exc16kWhtnd  (Q_bwe_exc) */
    3405             :             /* i/o: tbe_premph (Q_bwe_exc) */
    3406             :         }
    3407             :         ELSE
    3408             :         {
    3409             :             Word16 nbSubFr, lSubFr;
    3410             :             Word16 tempQ15;
    3411             :             Word32 tempQ31;
    3412      103862 :             nbSubFr = NB_SUBFR16k;
    3413      103862 :             lSubFr = ( L_FRAME16k / NB_SUBFR16k );
    3414      103862 :             move16();
    3415      103862 :             move16();
    3416      103862 :             IF( LT_32( extl_brate, SWB_TBE_2k8 ) )
    3417             :             {
    3418       78805 :                 nbSubFr = NB_SUBFR;
    3419       78805 :                 move16();
    3420       78805 :                 lSubFr = ( L_FRAME16k / NB_SUBFR );
    3421       78805 :                 move16();
    3422             :             }
    3423      103862 :             k = 0;
    3424      103862 :             move16();
    3425      544367 :             FOR( i = 0; i < nbSubFr; i++ )
    3426             :             {
    3427      440505 :                 test();
    3428      440505 :                 IF( EQ_16( coder_type, VOICED ) && ( LT_32( extl_brate, SWB_TBE_2k8 ) ) )
    3429             :                 {
    3430       28208 :                     exp = 0;
    3431       28208 :                     move16();
    3432       28208 :                     tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */
    3433       28208 :                     temp = shl( tempQ15, exp );                 /* Q15 exc16kWhtnd scale factor */
    3434       28208 :                     exp = 0;
    3435       28208 :                     move16();
    3436       28208 :                     tempQ15 = Sqrt16( temp, &exp ); /* Q15 */
    3437       28208 :                     temp1 = shl( tempQ15, exp );    /* Q15 exc16kWhtnd scale factor */
    3438             : 
    3439             :                     /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */
    3440       28208 :                     temp = sub( MAX_16, temp );
    3441       28208 :                     tempQ31 = Mult_32_16( pow1, temp );
    3442       28208 :                     L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
    3443       28208 :                     temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
    3444             :                 }
    3445             :                 ELSE
    3446             :                 {
    3447             :                     /* Adjust noise mixing for formant sharpening filter */
    3448      412297 :                     tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac );
    3449             :                     /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */
    3450      412297 :                     vf_tmp = sub( MAX_16, tempQ15 );
    3451      412297 :                     vf_tmp = mult( voice_factors[i], vf_tmp );
    3452             : 
    3453      412297 :                     exp = 0;
    3454      412297 :                     move16();
    3455      412297 :                     tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */
    3456      412297 :                     temp1 = shl( tempQ15, exp );      /* Q15 exc16kWhtnd scale factor */
    3457             : 
    3458             :                     /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */
    3459      412297 :                     temp = sub( MAX_16, vf_tmp );
    3460      412297 :                     tempQ31 = Mult_32_16( pow1, temp );
    3461      412297 :                     L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
    3462      412297 :                     temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
    3463             :                 }
    3464             : 
    3465      440505 :                 shift = sub( *Q_bwe_exc, Q_White_exc16k );
    3466    33676345 :                 FOR( j = 0; j < lSubFr; j++ )
    3467             :                 {
    3468             :                     /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */
    3469    33235840 :                     L_tmp = L_shl_sat( L_mult( temp2, White_exc16k[k + j] ), shift );   // 16+(Q_bwe_exc)
    3470    33235840 :                     exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] ); // Q_bwe_exc
    3471    33235840 :                     move16();
    3472             :                 }
    3473      440505 :                 k = add( k, lSubFr );
    3474             : 
    3475             :                 /* estimate the pre-emph factor */
    3476      440505 :                 tempQ15 = sub( MAX_16, voice_factors[i] );
    3477      440505 :                 exp = 0;
    3478      440505 :                 move16();
    3479      440505 :                 temp = Sqrt16( tempQ15, &exp );
    3480      440505 :                 temp = shl( temp, sub( exp, 1 ) );
    3481             : 
    3482      440505 :                 temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */
    3483      440505 :                 temp = div_s( temp, temp2 );           /* Q15 */
    3484      440505 :                 temp = mult_r( PREEMPH_FAC, temp );
    3485             : 
    3486      440505 :                 PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph ); // Q_bwe_exc
    3487             :                 /* exc16kWhtnd: Q_bwe_exc;
    3488             :                    tbe_premph: Q_bwe_exc*/
    3489             :             }
    3490             :         }
    3491             :     }
    3492             : 
    3493      115417 :     IF( LT_32( extl_brate, SWB_TBE_2k8 ) )
    3494             :     {
    3495       90360 :         syn_filt_fx( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 );
    3496             :         /* i: exc16kWhtnd in Q_bwe_exc */
    3497             :         /* o: excSHB in Q_bwe_exc */
    3498             :     }
    3499             :     ELSE
    3500             :     {
    3501       25057 :         set16_fx( zero_mem, 0, LPC_SHB_ORDER );
    3502             : 
    3503       25057 :         syn_filt_fx( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 );
    3504       25057 :         tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
    3505       25057 :         Scale_sig( tempSHB, 80, tmp );
    3506       25057 :         syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    3507       25057 :         move32();
    3508       25057 :         syn_shb_ener_sf_q[0] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
    3509       25057 :         move16();
    3510             : 
    3511       25057 :         syn_filt_fx( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 );
    3512       25057 :         tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
    3513       25057 :         Scale_sig( tempSHB, 80, tmp );
    3514       25057 :         syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    3515       25057 :         move32();
    3516       25057 :         syn_shb_ener_sf_q[1] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
    3517       25057 :         move16();
    3518             : 
    3519       25057 :         syn_filt_fx( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 );
    3520       25057 :         tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
    3521       25057 :         Scale_sig( tempSHB, 80, tmp );
    3522       25057 :         syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    3523       25057 :         move32();
    3524       25057 :         syn_shb_ener_sf_q[2] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
    3525       25057 :         move16();
    3526             : 
    3527       25057 :         syn_filt_fx( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 );
    3528       25057 :         tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
    3529       25057 :         Scale_sig( tempSHB, 80, tmp );
    3530       25057 :         syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    3531       25057 :         move32();
    3532       25057 :         syn_shb_ener_sf_q[3] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
    3533       25057 :         move16();
    3534             : 
    3535       25057 :         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] ) );
    3536       25057 :         syn_shb_ener_sf[0] = L_shl( syn_shb_ener_sf[0], sub( tmp2, syn_shb_ener_sf_q[0] ) );
    3537       25057 :         move32();
    3538       25057 :         syn_shb_ener_sf[1] = L_shl( syn_shb_ener_sf[1], sub( tmp2, syn_shb_ener_sf_q[1] ) );
    3539       25057 :         move32();
    3540       25057 :         syn_shb_ener_sf[2] = L_shl( syn_shb_ener_sf[2], sub( tmp2, syn_shb_ener_sf_q[2] ) );
    3541       25057 :         move32();
    3542       25057 :         syn_shb_ener_sf[3] = L_shl( syn_shb_ener_sf[3], sub( tmp2, syn_shb_ener_sf_q[3] ) );
    3543       25057 :         move32();
    3544             : 
    3545             :         /* i: exc16kWhtnd       in Q_bwe_exc        */
    3546             :         /* o: tempSHB           in Q_bwe_exc        */
    3547             :         /* o: syn_shb_ener_sf   in tmp2  */
    3548       25057 :         IF( LE_32( bitrate, MAX_ACELP_BRATE ) )
    3549             :         {
    3550       25057 :             L_tmp = sum32_fx( syn_shb_ener_sf, 4 );
    3551             : 
    3552             :             /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */
    3553       25057 :             tmp = shl( Q_shb, 1 );
    3554       25057 :             L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */
    3555             : 
    3556       25057 :             *Q_bwe_exc = sub( *Q_bwe_exc, exp );
    3557       25057 :             move16(); /* compensate for the exp shift */
    3558       25057 :             tmp2 = add( prev_Q_bwe_syn, n_mem2 );
    3559       25057 :             IF( GT_16( *Q_bwe_exc, tmp2 ) )
    3560             :             {
    3561           0 :                 L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) );
    3562           0 :                 *Q_bwe_exc = tmp2;
    3563           0 :                 move16();
    3564             :             }
    3565     8043297 :             FOR( i = 0; i < L_FRAME16k; i++ )
    3566             :             {
    3567     8018240 :                 L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */
    3568     8018240 :                 exc16kWhtnd[i] = round_fx( L_tmp3 );           /* *Q_bwe_exc - exp */
    3569     8018240 :                 move16();
    3570             :             }
    3571             :         }
    3572             :         /* i: L_tmp2 in (Q31-exp)                       */
    3573             :         /* i: exc16kWhtnd in Q_bwe_exc            */
    3574             :         /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp)   */
    3575             : 
    3576             :         /* Rescale the past memories: LP synth and SHB look ahead buffers */
    3577       25057 :         tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn );
    3578      275627 :         FOR( i = 0; i < LPC_SHB_ORDER; i++ )
    3579             :         {
    3580      250570 :             state_lpc_syn[i] = shl_sat( state_lpc_syn[i], tmp );
    3581      250570 :             move16();
    3582             :         }
    3583      526197 :         FOR( i = -L_SHB_LAHEAD; i < 0; i++ )
    3584             :         {
    3585      501140 :             excSHB[i] = shl_sat( excSHB[i], tmp );
    3586      501140 :             move16();
    3587             :         }
    3588             :         /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */
    3589             : 
    3590       25057 :         syn_filt_fx( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 );
    3591       25057 :         syn_filt_fx( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 );
    3592       25057 :         syn_filt_fx( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 );
    3593       25057 :         syn_filt_fx( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 );
    3594             :         /* i: exc16kWhtnd in (Q_bwe_exc) */
    3595             :         /* o: excSHB in (Q_bwe_exc) */
    3596             :     }
    3597             : 
    3598      115417 :     IF( EQ_16( extl, FB_TBE ) )
    3599             :     {
    3600       43782 :         tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb );
    3601       43782 :         Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp );
    3602       43782 :         Scale_sig( fb_tbe_demph, 1, tmp );
    3603       43782 :         syn_filt_fx( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 );
    3604             :         /* i: White_exc16k_FB       in (Q_bwe_exc_fb) */
    3605             :         /* o: White_exc16k_FB_temp  in (Q_bwe_exc_fb) */
    3606             : 
    3607      481602 :         FOR( i = 0; i < 10; i++ )
    3608             :         {
    3609    14448060 :             FOR( j = 0; j < 32; ++j )
    3610             :             {
    3611    14010240 :                 White_exc16k_FB_temp[i * 32 + j] = mult_r_sat( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] );
    3612    14010240 :                 move16();
    3613             :             }
    3614             :         }
    3615             : 
    3616       43782 :         *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 );
    3617       43782 :         move16(); /**Q_bwe_exc_fb  +35 +1 -16*/
    3618       43782 :         flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k );
    3619             : 
    3620       43782 :         deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph );
    3621             :     }
    3622             :     ELSE
    3623             :     {
    3624       71635 :         set16_fx( White_exc16k_FB, 0, L_FRAME16k );
    3625             :     }
    3626             : 
    3627      115417 :     *prev_pow_exc16kWhtnd = L_shr_sat( pow1, Q_pow1 ); // power goes above MAX_32
    3628      115417 :     *prev_mix_factor = mix_factor;
    3629      115417 :     move32();
    3630      115417 :     move16();
    3631             : 
    3632      115417 :     return;
    3633             : }
    3634             : 
    3635      102554 : void GenShapedSHBExcitation_ivas_dec_fx(
    3636             :     Word16 *excSHB,                      /* o : synthesized shaped shb excitation Q_bwe_exc*/
    3637             :     const Word16 *lpc_shb,               /* i : lpc coefficients Q12*/
    3638             :     Word16 *White_exc16k_FB,             /* o : white excitation for the Fullband extension Q_bwe_exc */
    3639             :     Word32 *mem_csfilt,                  /* i/o: memory */
    3640             :     Word16 *mem_genSHBexc_filt_down_shb, /* i/o: memory */
    3641             :     Word16 *state_lpc_syn,               /* i/o: memory */
    3642             :     const Word16 coder_type,             /* i : coding type */
    3643             :     const Word16 *bwe_exc_extended,      /* i : bwidth extended excitation */
    3644             :     Word16 bwe_seed[],                   /* i/o: random number generator seed */
    3645             :     Word16 voice_factors[],              /* i : voicing factor*/
    3646             :     const Word16 extl,                   /* i : extension layer */
    3647             :     Word16 *tbe_demph,                   /* i/o: de-emphasis memory */
    3648             :     Word16 *tbe_premph,                  /* i/o: pre-emphasis memory */
    3649             :     Word16 *lpc_shb_sf,                  /* i:   LP coefficients  */
    3650             :     const Word32 shb_ener_sf_32,         /* i: input shb ener, Q31 */
    3651             :     Word16 *shb_res_gshape,              /* i: input res gain shape, Q14 */
    3652             :     Word16 *shb_res,
    3653             :     Word16 *vf_ind,
    3654             :     const Word16 formant_fac,  /* i   : Formant sharpening factor [0..1] */
    3655             :     Word16 fb_state_lpc_syn[], /* i/o: memory */
    3656             :     Word16 *fb_tbe_demph,      /* i/o: fb de-emphasis memory */
    3657             :     Word16 *Q_bwe_exc,
    3658             :     Word16 *Q_bwe_exc_fb,
    3659             :     const Word16 Q_shb,
    3660             :     Word16 n_mem2,                /* i :  n_mem2 scale factor to adjust 24.4/32kbps memories         */
    3661             :     Word16 prev_Q_bwe_syn,        /* i :  st_fx->prev_Q_bwe_syn                                      */
    3662             :     const Word32 bitrate,         /* i  : bitrate                                                    */
    3663             :     const Word16 prev_bfi,        /* i  : previous frame was concealed                               */
    3664             :     const Word16 element_mode,    /* i  : element mode                                               */
    3665             :     const Word16 flag_ACELP16k,   /* i  : ACELP@16kHz flag                                           */
    3666             :     Word16 *nlExc16k,             /* i/o: NL exc for IC-BWE                                          */
    3667             :     Word16 *mixExc16k,            /* i/o: exc spreading for IC-BWE                                   */
    3668             :     const Word32 extl_brate,      /* i  : extension layer bitarte                                    */
    3669             :     const Word16 MSFlag,          /* i  : Multi Source flag                                          */
    3670             :     Word16 EnvSHBres_4k[],        /* i/o: TD envelope of the SHB residual signal                     */
    3671             :     Word32 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame    */
    3672             :     Word16 *prev_mix_factor,      /* i/o: mixing factor in the previous frame                        */
    3673             :     Word16 *Env_error,            /* o  : error in SHB residual envelope modelling                Q0 */
    3674             :     Word16 Env_error_part[]       /* o  : per-segment error in SHB residual envelope modelling    Q0 */
    3675             : )
    3676             : {
    3677             :     Word16 i, j, k;
    3678             :     Word16 wht_fil_mem[LPC_WHTN_ORDER];
    3679             :     Word16 lpc_whtn[LPC_WHTN_ORDER + 1];
    3680             :     Word16 R_h[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech MSB */
    3681             :     Word16 R_l[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech LSB */
    3682             :     Word16 Q_R;
    3683             :     Word32 LepsP[LPC_WHTN_ORDER + 1];
    3684             :     Word16 exc32k[L_FRAME32k], exc16k[L_FRAME16k];
    3685             :     Word32 pow1, pow22;
    3686             :     Word16 scale, temp1, temp2, temp3;
    3687             :     Word16 Q_White_exc16k;
    3688             :     Word16 excTmp2[L_FRAME16k];
    3689             :     Word16 *White_exc16k;
    3690             :     Word16 excNoisyEnv[L_FRAME16k];
    3691      102554 :     Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */
    3692      102554 :     move16();
    3693      102554 :     Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */
    3694      102554 :     move16();
    3695      102554 :     move16();
    3696             :     Word16 varEnvShape;
    3697      102554 :     Word16 fb_deemph_fac = 15729; /*0.48f in Q15  */
    3698             :     Word16 exc16kWhtnd[L_FRAME16k];
    3699             : 
    3700             :     Word32 L_tmp;
    3701             :     Word16 vf_tmp;
    3702      102554 :     Word16 tmp, exp, tmp2 = 0;
    3703      102554 :     move16();
    3704             :     Word16 voiceFacEst[NB_SUBFR16k];
    3705             :     Word16 zero_mem[LPC_SHB_ORDER];
    3706             :     Word32 syn_shb_ener_sf[4];
    3707             :     Word16 syn_shb_ener_sf_q[4];
    3708             :     Word16 tempSHB[80];
    3709             :     Word16 Q_pow1, Q_pow22;
    3710             : 
    3711             :     Word32 L_tmp2, L_tmp3, L_tmp4;
    3712             :     Word16 temp;
    3713             : 
    3714             :     Word16 White_exc16k_FB_temp[L_FRAME16k];
    3715             :     Word32 White_exc16k_32[L_FRAME16k];
    3716             :     Word16 White_exc16k_tmp[L_FRAME16k];
    3717             :     Word16 Q_temp;
    3718             :     Word16 prev_Q_bwe_exc_fb, Q_exc16kWhtnd;
    3719             :     Word16 chk1;
    3720             :     Word32 chk2;
    3721      102554 :     chk1 = 0;
    3722      102554 :     chk2 = 0;
    3723      102554 :     move16();
    3724      102554 :     move32();
    3725             : 
    3726             :     Word16 alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k];
    3727             :     Word16 cbsize;
    3728             :     Word16 mix_factor, old_fact, new_fact, fact, old_scale, new_scale, step_scale;
    3729             :     Word32 c0, c1, c2, c3, c4, c5, den;
    3730             :     Word16 g1, g2, g, g1_e, g2_e, g_e, den_e, shift, tmp_e, tmp1_e;
    3731             :     Word16 EnvWhiteExc16k[L_FRAME16k], EnvExc16kWhtnd[L_FRAME16k];
    3732      102554 :     Word16 EnvWhiteExc16k_4k[L_FRAME4k] = { 0 }, EnvExc16kWhtnd_4k[L_FRAME4k] = { 0 };
    3733             :     Word16 flag_plosive;
    3734             :     Word16 delta;
    3735             :     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];
    3736             :     Word64 W_tmp;
    3737             : 
    3738      102554 :     mix_factor = 0; /* Q15 */
    3739      102554 :     move16();
    3740             : 
    3741      102554 :     set16_fx( zero_mem, 0, LPC_SHB_ORDER );
    3742      102554 :     set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER );
    3743    32919834 :     FOR( i = 0; i < L_FRAME32k; i = i + 2 )
    3744             :     {
    3745    32817280 :         exc32k[i] = negate( bwe_exc_extended[i] ); // Q_bwe_exc
    3746    32817280 :         move16();
    3747    32817280 :         exc32k[i + 1] = bwe_exc_extended[i + 1]; // Q_bwe_exc
    3748    32817280 :         move16();
    3749             :     }
    3750             : 
    3751             :     /* Decimate by 2 */
    3752      102554 :     Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k ); // Q_bwe_exc
    3753             :     /* i: exc32k in Q_bwe_exc */
    3754             :     /* o: exc16k in Q_bwe_exc */
    3755             : 
    3756      102554 :     autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 ); // Q_R
    3757             :     /* Ensure R[0] isn't zero when entering Levinson Durbin */
    3758      102554 :     R_l[0] = s_max( R_l[0], 1 );
    3759      102554 :     move16();
    3760      512770 :     FOR( i = 1; i <= LPC_WHTN_ORDER; i++ )
    3761             :     {
    3762      410216 :         L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
    3763      410216 :         L_Extract( L_tmp, &R_h[i], &R_l[i] ); // Q_R
    3764             :     }
    3765      102554 :     E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL );
    3766      102554 :     Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); // Q12
    3767      102554 :     fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 );    // Q_bwe_exc
    3768             : 
    3769             :     /* i: exc16k in Q_bwe_exc */
    3770             :     /* o: exc16kWhtnd in Q_bwe_exc */
    3771             : 
    3772      102554 :     IF( GE_32( extl_brate, SWB_TBE_2k8 ) )
    3773             :     {
    3774       21546 :         temp2 = 0;
    3775       21546 :         move16();
    3776      107730 :         FOR( j = 0; j < 4; j++ )
    3777             :         {
    3778       86184 :             temp1 = shb_res_gshape[j];
    3779       86184 :             move16();
    3780     6980904 :             FOR( i = 0; i < 80; i++ )
    3781             :             {
    3782     6894720 :                 exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); // Q_bwe_exc
    3783     6894720 :                 move16();
    3784             :                 /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */
    3785             :             }
    3786       86184 :             temp2 = add( temp2, 80 );
    3787             :         }
    3788             :     }
    3789             : 
    3790             :     /* Estimate pow1 associated with Low band nonlinear extended excitation */
    3791             :     /* pow1=0.00001f */
    3792      102554 :     tmp = sub( shl( *Q_bwe_exc, 1 ), 31 );
    3793      102554 :     pow1 = L_shl_sat( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */
    3794    32919834 :     FOR( k = 0; k < L_FRAME16k; k++ )
    3795             :     {
    3796             :         /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/
    3797    32817280 :         excTmp2[k] = abs_s( exc16kWhtnd[k] );
    3798    32817280 :         move16();
    3799    32817280 :         chk1 = s_or( chk1, exc16kWhtnd[k] );
    3800             : 
    3801             :         /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */
    3802    32817280 :         pow1 = L_mac0_sat( pow1, exc16kWhtnd[k], exc16kWhtnd[k] ); /* 2*Q_bwe_exc */
    3803             :     }
    3804      102554 :     Q_pow1 = shl( *Q_bwe_exc, 1 );
    3805             : 
    3806      102554 :     test();
    3807             : 
    3808      102554 :     IF( flag_ACELP16k == 0 )
    3809             :     {
    3810             :         /* varEnvShape = mean_fx(voice_factors, 4); */
    3811             :         /* unroll the loop */
    3812       48570 :         L_tmp = L_mult( voice_factors[0], 8192 /*0.25 in Q15 */ );
    3813       48570 :         L_tmp = L_mac( L_tmp, voice_factors[1], 8192 /*0.25 in Q15 */ );
    3814       48570 :         L_tmp = L_mac( L_tmp, voice_factors[2], 8192 /*0.25 in Q15 */ );
    3815       48570 :         varEnvShape = mac_r( L_tmp, voice_factors[3], 8192 /*0.25 in Q15 */ ); /* varEnvShape in Q15 */
    3816             :     }
    3817             :     ELSE /* 16k core */
    3818             :     {
    3819             :         /* varEnvShape = mean_fx(voice_factors, 5); */
    3820             :         /* unroll the loop */
    3821       53984 :         L_tmp = L_mult( voice_factors[0], 6554 /*0.2 in Q15 */ );
    3822       53984 :         L_tmp = L_mac( L_tmp, voice_factors[1], 6554 /*0.2 in Q15 */ );
    3823       53984 :         L_tmp = L_mac( L_tmp, voice_factors[2], 6554 /*0.2 in Q15 */ );
    3824       53984 :         L_tmp = L_mac( L_tmp, voice_factors[3], 6554 /*0.2 in Q15 */ );
    3825       53984 :         varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 /*0.2 in Q15 */ ); /* varEnvShape in Q15 */
    3826             :     }
    3827             : 
    3828      102554 :     IF( EQ_16( extl, FB_TBE ) )
    3829             :     {
    3830             :         /*pow(varEnvShape,3) */
    3831       39990 :         tmp = mult_r( varEnvShape, varEnvShape );
    3832       39990 :         tmp = mult_r( tmp, varEnvShape );
    3833             : 
    3834             :         /* max_val((0.68f - (float)pow(varEnvShape, 3)), 0.48f); */
    3835       39990 :         fb_deemph_fac = sub( 22282 /*0.68f Q15*/, tmp );
    3836       39990 :         fb_deemph_fac = s_max( fb_deemph_fac, 15729 /*0.48f Q15*/ );
    3837             :     }
    3838             : 
    3839             :     /*varEnvShape = 1.09875f - 0.49875f * varEnvShape; */
    3840      102554 :     varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape );
    3841             : 
    3842             :     /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */
    3843      102554 :     varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ );
    3844      102554 :     varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ );
    3845      102554 :     varEnvShape = shl( varEnvShape, 1 );
    3846      102554 :     csfilt_num2[0] = sub( MAX_16, varEnvShape ); // Q15
    3847      102554 :     move16();
    3848      102554 :     neg_csfilt_den2[1] = varEnvShape; // Q15
    3849      102554 :     move16();
    3850             : 
    3851      102554 :     test();
    3852      102554 :     test();
    3853      102554 :     test();
    3854             : 
    3855      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 ) ) ) )
    3856             :     {
    3857             :         /* pre-init smoothing filter to avoid energy drop outs */
    3858           0 :         L_tmp = L_mult( excTmp2[0], 1638 );
    3859           0 :         FOR( i = 1; i < L_SUBFR16k / 4; i++ )
    3860             :         {
    3861           0 :             L_tmp = L_mac( L_tmp, excTmp2[i], 1638 ); /*1638 = 1/20 in Q15*/
    3862             :         }
    3863             :         /*L_tmp = sum(excTmp2, L_SUBFR16k/4)*(1/20) where L_SUBFR16k/4 =20 */
    3864             : 
    3865             :         /* 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 */
    3866             :         /* rather stick to the more conservative approach, to avoid potential clippings */
    3867           0 :         test();
    3868           0 :         IF( !( prev_bfi && EQ_16( extl, FB_TBE ) ) )
    3869             :         {
    3870             :             /* use weak smoothing for 1st frame after switching to make filter recover more quickly */
    3871           0 :             varEnvShape = 26214 /*0.8f Q15*/;
    3872           0 :             move16();
    3873           0 :             csfilt_num2[0] = sub( MAX_16, varEnvShape );
    3874           0 :             move16();
    3875           0 :             neg_csfilt_den2[1] = varEnvShape;
    3876           0 :             move16();
    3877             :         }
    3878             : 
    3879           0 :         *mem_csfilt = Mult_32_16( L_tmp, varEnvShape );
    3880           0 :         move32();
    3881             :     }
    3882             : 
    3883      102554 :     IF( MSFlag > 0 )
    3884             :     {
    3885             :         // varEnvShape = 0.995f;
    3886        5025 :         varEnvShape = 32604;
    3887        5025 :         move16();
    3888        5025 :         csfilt_num2[0] = 32768 - varEnvShape;
    3889             :         // csfilt_num2[0] = sub( 32767, varEnvShape );
    3890        5025 :         move16();
    3891        5025 :         neg_csfilt_den2[1] = varEnvShape;
    3892        5025 :         move16();
    3893             :     }
    3894             : 
    3895      102554 :     White_exc16k = exc16k;
    3896      102554 :     move16();
    3897      102554 :     Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc );
    3898      102554 :     IF( *mem_csfilt )
    3899             :     {
    3900       67708 :         Q_excTmp2 = s_min( Q_excTmp2, sub( add( norm_l( *mem_csfilt ), *Q_bwe_exc ), 1 ) );
    3901             :     }
    3902      102554 :     test();
    3903             :     /* Track the low band envelope */
    3904      102554 :     IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) )
    3905             :     {
    3906       27918 :         test();
    3907       27918 :         IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) )
    3908             :         {
    3909       23812 :             mem_csfilt_left = 0;
    3910       23812 :             mem_csfilt_right = 0;
    3911       23812 :             move16();
    3912       23812 :             move16();
    3913     7643652 :             FOR( k = 0; k < L_FRAME16k; k++ )
    3914             :             {
    3915             :                 // excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k];
    3916     7619840 :                 excNoisyEnvLeft[k] = add( mem_csfilt_left, mult_r( csfilt_num2[0], shl( excTmp2[k], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2
    3917     7619840 :                 move16();
    3918             :                 // mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k];
    3919     7619840 :                 mem_csfilt_left = mult_r( neg_csfilt_den2[1], excNoisyEnvLeft[k] ); // Q_excTmp2
    3920             :                 // excNoisyEnvRight[L_FRAME16k - k - 1] = mem_csfilt_right + csfilt_num2[0] * excTmp2[L_FRAME16k - k - 1];
    3921     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
    3922     7619840 :                 move16();
    3923             :                 // mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1];
    3924     7619840 :                 mem_csfilt_right = mult_r( neg_csfilt_den2[1], excNoisyEnvRight[L_FRAME16k - k - 1] ); // Q_excTmp2
    3925             :             }
    3926             : 
    3927       23812 :             alpha = 0;
    3928       23812 :             move16();
    3929             :             // step = 1.0f / L_FRAME16k;
    3930       23812 :             step = 102; // Q15
    3931       23812 :             move16();
    3932     7643652 :             FOR( k = 0; k < L_FRAME16k; k++ )
    3933             :             {
    3934             :                 // excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + (1 - alpha) * excNoisyEnvRight[k];
    3935     7619840 :                 excNoisyEnv[k] = add( mult_r( alpha, excNoisyEnvLeft[k] ), mult_r( sub( 32767, alpha ), excNoisyEnvRight[k] ) ); // Q_excTmp2
    3936     7619840 :                 move16();
    3937     7619840 :                 alpha = add( alpha, step );
    3938             :             }
    3939             :         }
    3940             :     }
    3941             :     ELSE
    3942             : 
    3943             :     {
    3944             :         /* Track the low band envelope */
    3945       74636 :         L_tmp = L_shl( *mem_csfilt, sub( Q_excTmp2, *Q_bwe_exc ) );
    3946       74636 :         move32();
    3947    23958156 :         FOR( i = 0; i < L_FRAME16k; i++ )
    3948             :         {
    3949    23883520 :             excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], shl( excTmp2[i], sub( Q_excTmp2, *Q_bwe_exc ) ) );
    3950    23883520 :             move16();
    3951             :             /* Work-around to avoid 0s for very small value*/
    3952    23883520 :             test();
    3953    23883520 :             test();
    3954    23883520 :             test();
    3955    23883520 :             test();
    3956    23883520 :             if ( excNoisyEnv[i] == 0 && ( L_tmp != 0 || ( csfilt_num2[0] != 0 && excTmp2[i] != 0 ) ) )
    3957             :             {
    3958        5138 :                 excNoisyEnv[i] = 1;
    3959        5138 :                 move16();
    3960             :             }
    3961             :             /* excNoisyEnv : Q_excTmp2,
    3962             :              *mem_csfilt: Q_excTmp2+16, excTmp2: Q_excTmp2, csfilt_num2[0] Q_excTmp2  */
    3963    23883520 :             L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_excTmp2 + 16 */
    3964             :         }
    3965       74636 :         *mem_csfilt = L_shr( L_tmp, sub( Q_excTmp2, *Q_bwe_exc ) );
    3966       74636 :         move32();
    3967             :     }
    3968      102554 :     test();
    3969      102554 :     IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    3970        4106 :     {
    3971             :         /* generate gaussian (white) excitation */
    3972     1318026 :         FOR( k = 0; k < L_FRAME16k; k++ )
    3973             :         {
    3974     1313920 :             White_exc16k[k] = own_random( &bwe_seed[0] );
    3975     1313920 :             move16();
    3976             :         }
    3977             : 
    3978             :         /* normalize the amplitude of the gaussian excitation to that of the LB exc. */
    3979        4106 :         Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT_IN_Q49;
    3980        4106 :         move32();
    3981        4106 :         move32();
    3982        4106 :         pow22 = POW_EXC16k_WHTND_FX;
    3983        4106 :         Q_pow22 = -6;
    3984        4106 :         move16();
    3985             :         // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), White_exc16k, L_FRAME16k);
    3986        4106 :         Word16 pow1_exp = sub( Q31, Q_pow1 );
    3987        4106 :         Word32 temp_pow = Sqrt32( pow1, &pow1_exp );
    3988        4106 :         temp_pow = Mpy_32_32( temp_pow, pow22_inv );
    3989             :         /*Word16 out_exp;
    3990             :         Word32 temp_pow1 = root_a_over_b_fx(pow1, Q_pow1, pow22, Q_pow22, &out_exp);
    3991             :         temp_pow1 = L_shl(temp_pow1, out_exp);*/
    3992             :         // v_multc_fixed_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k);
    3993        4106 :         L_tmp = 0;
    3994        4106 :         move32();
    3995        4106 :         shift = getScaleFactor16( White_exc16k, L_FRAME16k );
    3996     1318026 :         FOR( k = 0; k < L_FRAME16k; k++ )
    3997             :         {
    3998     1313920 :             White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] );
    3999     1313920 :             move32();
    4000     1313920 :             White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], shift ) ); // Q_White_exc16k
    4001     1313920 :             move16();
    4002     1313920 :             L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
    4003             :         }
    4004        4106 :         Q_White_exc16k = add( shift, sub( 49 - 31, pow1_exp ) );
    4005        4106 :         Q_temp = norm_l( L_tmp );
    4006        4106 :         IF( L_tmp == 0 )
    4007             :         {
    4008           0 :             Q_temp = 31;
    4009           0 :             move16();
    4010             :         }
    4011             :     }
    4012             :     ELSE
    4013             :     {
    4014             :         /* create a random excitation - Reuse exc16k memory */
    4015       98448 :         White_exc16k = exc16k;
    4016       98448 :         move16();
    4017       98448 :         create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed );                        // Q5
    4018       98448 :         create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); // Q5
    4019             : 
    4020       98448 :         L_tmp = L_deposit_l( 0 );
    4021       98448 :         tmp = add( *Q_bwe_exc, 1 );
    4022    31601808 :         FOR( k = 0; k < L_FRAME16k; k++ )
    4023             :         {
    4024    31503360 :             L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_excTmp2)  +5 +1*/
    4025    31503360 :             White_exc16k_32[k] = L_tmp4;                        /* (Q_excTmp2)  +5 +1*/
    4026    31503360 :             move32();
    4027    31503360 :             L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
    4028             :         }
    4029       98448 :         Q_temp = norm_l( L_tmp );
    4030       98448 :         IF( L_tmp == 0 )
    4031             :         {
    4032          23 :             Q_temp = 31;
    4033          23 :             move16();
    4034             :         }
    4035             :         /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/
    4036             :         /* White_exc16k in Q6 */
    4037             : 
    4038             :         /* calculate pow22 */
    4039             :         /* pow22=0.00001f */
    4040       98448 :         tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 );
    4041       98448 :         Word64 sum = W_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(*Q_bwe_exc-NOISE_QADJ) */
    4042       98448 :         Q_White_exc16k = getScaleFactor32( White_exc16k_32, L_FRAME16k );
    4043    31601808 :         FOR( k = 0; k < L_FRAME16k; k++ )
    4044             :         {
    4045             : 
    4046    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
    4047    31503360 :             chk2 = L_or( chk2, White_exc16k_32[k] );
    4048             :             /* i: excNoisyEnv in (Q_excTmp2)     */
    4049             :             /* i: White_exc16k  in Q6               */
    4050             :             /* o: White_exc16k in (Q_White_exc16k)  */
    4051             :             /* pow22 += White_exc16k[k] * White_exc16k[k]; */
    4052    31503360 :             sum = W_mac0_16_16( sum, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2 + Q_White_exc16k - 10)*/
    4053    31503360 :             move16();
    4054             :         }
    4055       98448 :         Q_pow22 = W_norm( sum );
    4056       98448 :         pow22 = W_extract_h( W_shl( sum, Q_pow22 ) ); // 2*(Q_excTmp2 + Q_White_exc16k - 10)+Q_pow22-32
    4057       98448 :         Q_pow22 = sub( add( Q_pow22, shl( sub( add( Q_White_exc16k, Q_excTmp2 ), 10 ), 1 ) ), 32 );
    4058       98448 :         Q_White_exc16k = add( Q_White_exc16k, sub( Q_excTmp2, 10 ) );
    4059             :     }
    4060             : 
    4061      102554 :     flag_plosive = 0;
    4062      102554 :     move16();
    4063      102554 :     test();
    4064      102554 :     test();
    4065      102554 :     test();
    4066      102554 :     IF( GE_32( extl_brate, SWB_TBE_2k8 ) || EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    4067             :     {
    4068       25652 :         IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */
    4069             :         {
    4070           0 :             test();
    4071           0 :             IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    4072             :             {
    4073           0 :                 FOR( k = 0; k < L_FRAME16k; k++ )
    4074             :                 {
    4075           0 :                     White_exc16k_tmp[k] = round_fx( L_shl( White_exc16k_32[k], *Q_bwe_exc ) );
    4076           0 :                     move16();
    4077             :                 }
    4078             : 
    4079             :                 /* calculate TD envelopes of exc16kWhtnd and White_exc16k */
    4080           0 :                 find_td_envelope_fx( White_exc16k_tmp, L_FRAME16k, 20, NULL, EnvWhiteExc16k ); /* Q_bwe_exc */
    4081           0 :                 find_td_envelope_fx( exc16kWhtnd, L_FRAME16k, 20, NULL, EnvExc16kWhtnd );      /* Q_bwe_exc */
    4082             : 
    4083           0 :                 FOR( k = 0; k < L_FRAME4k; k++ )
    4084             :                 {
    4085           0 :                     EnvWhiteExc16k_4k[k] = EnvWhiteExc16k[4 * k]; /* Q_bwe_exc */
    4086           0 :                     move16();
    4087           0 :                     EnvExc16kWhtnd_4k[k] = EnvExc16kWhtnd[4 * k]; /* Q_bwe_exc */
    4088           0 :                     move16();
    4089             :                 }
    4090             : 
    4091             :                 /* calculate the optimal mix factor */
    4092           0 :                 c0 = c1 = c2 = c3 = c4 = c5 = 0; /* Q0 */
    4093           0 :                 move32();
    4094           0 :                 move32();
    4095           0 :                 move32();
    4096           0 :                 move32();
    4097           0 :                 move32();
    4098           0 :                 move32();
    4099             : 
    4100           0 :                 temp1 = add( shl( *Q_bwe_exc, 1 ), 1 );
    4101           0 :                 temp2 = add( add( Q_shb, *Q_bwe_exc ), 1 );
    4102           0 :                 temp3 = add( shl( Q_shb, 1 ), 1 );
    4103           0 :                 FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ )
    4104             :                 {
    4105             :                     // c0_part[i] = sum2_f( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
    4106           0 :                     c0_part[i] = L_shr( sum2_fx( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */
    4107           0 :                     move32();
    4108             :                     // 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 );
    4109           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 */
    4110           0 :                     move32();
    4111             :                     // c2_part[i] = sum2_f( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
    4112           0 :                     c2_part[i] = L_shr( sum2_fx( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */
    4113           0 :                     move32();
    4114             :                     // 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 );
    4115           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 */
    4116           0 :                     move32();
    4117             :                     // 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 );
    4118           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 */
    4119           0 :                     move32();
    4120             :                     // c5_part[i] = sum2_f( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
    4121           0 :                     c5_part[i] = L_shr( sum2_fx( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp3 ); /* Q0 */
    4122           0 :                     move32();
    4123             : 
    4124           0 :                     c0 = L_add( c0, c0_part[i] );
    4125           0 :                     c1 = L_add( c1, c1_part[i] );
    4126           0 :                     c2 = L_add( c2, c2_part[i] );
    4127           0 :                     c3 = L_add( c3, c3_part[i] );
    4128           0 :                     c4 = L_add( c4, c4_part[i] );
    4129           0 :                     c5 = L_add( c5, c5_part[i] );
    4130             :                 }
    4131             : 
    4132             :                 // den = 4.0f * c0 * c2 - c4 * c4;
    4133           0 :                 W_tmp = W_sub( W_shl( W_mult0_32_32( c0, c2 ), 2 ), W_mult0_32_32( c4, c4 ) );
    4134           0 :                 den_e = 63;
    4135           0 :                 move16();
    4136           0 :                 shift = W_norm( W_tmp );
    4137           0 :                 den = W_extract_h( W_shl( W_tmp, shift ) );
    4138           0 :                 den_e = sub( den_e, shift );
    4139             : 
    4140           0 :                 IF( den == 0 )
    4141             :                 {
    4142           0 :                     den = 1;
    4143           0 :                     move32();
    4144           0 :                     den_e = 31;
    4145           0 :                     move16();
    4146             :                 }
    4147             : 
    4148             :                 // g1 = ( c3 * c4 - 2 * c1 * c2 ) / den;
    4149           0 :                 W_tmp = W_sub( W_mult0_32_32( c3, c4 ), W_shl( W_mult0_32_32( c1, c2 ), 1 ) );
    4150           0 :                 g1_e = 63;
    4151           0 :                 move16();
    4152           0 :                 shift = W_norm( W_tmp );
    4153           0 :                 L_tmp = W_extract_h( W_shl( W_tmp, shift ) );
    4154           0 :                 g1_e = sub( g1_e, shift );
    4155             : 
    4156           0 :                 g1 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e );
    4157           0 :                 g1_e = sub( add( tmp_e, g1_e ), den_e );
    4158             : 
    4159             :                 // g2 = ( c1 * c4 - 2 * c0 * c3 ) / den;
    4160           0 :                 W_tmp = W_sub( W_mult0_32_32( c1, c4 ), W_shl( W_mult0_32_32( c0, c3 ), 1 ) );
    4161           0 :                 g2_e = 63;
    4162           0 :                 move16();
    4163           0 :                 shift = W_norm( W_tmp );
    4164           0 :                 L_tmp = W_extract_h( W_shl( W_tmp, shift ) );
    4165           0 :                 g2_e = sub( g2_e, shift );
    4166             : 
    4167           0 :                 g2 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e );
    4168           0 :                 g2_e = sub( add( tmp_e, g2_e ), den_e );
    4169             : 
    4170             :                 // *Env_error = 0.0f;
    4171           0 :                 *Env_error = 0;
    4172           0 :                 move16();
    4173           0 :                 flag_plosive = 0;
    4174           0 :                 move16();
    4175           0 :                 FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ )
    4176             :                 {
    4177             :                     // 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];
    4178           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 );
    4179           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 );
    4180           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 );
    4181           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 );
    4182           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 );
    4183             : 
    4184             :                     // Env_error_part[i] = L_shr( L_tmp, 31 - tmp_e ); // Check Exponent
    4185           0 :                     Env_error_part[i] = extract_h( L_shr_sat( L_tmp, sub( Q15, tmp_e ) ) ); /* Q0 */
    4186           0 :                     move16();
    4187             : 
    4188             :                     // *Env_error += Env_error_part[i];
    4189           0 :                     *Env_error = add_sat( *Env_error, Env_error_part[i] ); /* Q0 */
    4190           0 :                     move16();
    4191             : 
    4192           0 :                     if ( GT_16( Env_error_part[i], THR_ENV_ERROR_PLOSIVE_FX ) ) // Check which Q
    4193             :                     {
    4194             :                         /* envelope error is too high -> likely a plosive */
    4195           0 :                         flag_plosive = 1;
    4196           0 :                         move16();
    4197             :                     }
    4198             :                 }
    4199             : 
    4200           0 :                 IF( flag_plosive )
    4201             :                 {
    4202             :                     /* plosive detected -> set the mixing factor to 0 */
    4203           0 :                     *vf_ind = 0;
    4204           0 :                     move16();
    4205           0 :                     mix_factor = 0;
    4206           0 :                     move16();
    4207             :                 }
    4208             :                 ELSE
    4209             :                 {
    4210             :                     /* normalize gain */
    4211             :                     // g = g2 / ( g1 + g2 );
    4212           0 :                     tmp1_e = BASOP_Util_Add_MantExp( g1, g1_e, g2, g2_e, &tmp );
    4213           0 :                     IF( tmp == 0 )
    4214             :                     {
    4215           0 :                         tmp = 1;
    4216           0 :                         move16();
    4217           0 :                         tmp1_e = 15;
    4218           0 :                         move16();
    4219             :                     }
    4220           0 :                     g = BASOP_Util_Divide1616_Scale( g2, tmp, &tmp_e );
    4221           0 :                     g_e = sub( add( tmp_e, g2_e ), tmp1_e );
    4222             : 
    4223             :                     /* quantization of the mixing factor */
    4224           0 :                     cbsize = 1 << NUM_BITS_SHB_VF;
    4225           0 :                     move16();
    4226             :                     // delta = 1.0f / ( cbsize - 1 );
    4227           0 :                     delta = 2341; /* Q14 */
    4228           0 :                     move16();
    4229             :                     // if ( g > 1.0f )
    4230           0 :                     IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), ONE_IN_Q31, 0 ) > 0 )
    4231             :                     {
    4232             :                         // g = 1.0f;
    4233           0 :                         g = MAX16B; /* Q15 */
    4234             :                     }
    4235             :                     // else if ( g < shl( delta, ( 15 - g_e ) - 14 ) )
    4236           0 :                     ELSE IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), delta, 17 ) < 0 )
    4237             :                     {
    4238             :                         /* prevent low gains to be quantized to 0 as this is reserved for plosives */
    4239             :                         // g = delta;
    4240           0 :                         g = shl( delta, 1 ); /* Q15 */
    4241             :                     }
    4242             : 
    4243           0 :                     *vf_ind = usquant_fx( g, &mix_factor, 0, delta, cbsize );
    4244           0 :                     move16();
    4245             :                 }
    4246             :             }
    4247             :             ELSE
    4248             :             {
    4249           0 :                 Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k,
    4250           0 :                                          ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind );
    4251           0 :                 tmp = voiceFacEst[0];
    4252           0 :                 tmp2 = MAX_16;
    4253           0 :                 move16();
    4254           0 :                 move16();
    4255           0 :                 if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
    4256             :                 {
    4257           0 :                     tmp2 = 26214 /*0.8f Q15*/;
    4258           0 :                     move16();
    4259             :                 }
    4260             :             }
    4261             :         }
    4262             :         ELSE /* decoder side */
    4263             :         {
    4264       25652 :             test();
    4265       25652 :             IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    4266             :             {
    4267        4106 :                 IF( *vf_ind == 0 )
    4268             :                 {
    4269             :                     // mix_factor = 0.0f;
    4270          21 :                     mix_factor = 0;
    4271          21 :                     move16();
    4272          21 :                     flag_plosive = 1;
    4273          21 :                     move16();
    4274             :                 }
    4275             :                 ELSE
    4276             :                 {
    4277             :                     // mix_factor = usdequant(*vf_ind, 0.0f, 1.0f / ((1 << NUM_BITS_SHB_VF) - 1));
    4278        4085 :                     mix_factor = usdequant_fx( *vf_ind, 0, 2341 );
    4279             :                 }
    4280             :             }
    4281             :             ELSE
    4282             :             {
    4283             :                 /* *vf_ind is an integer scale by 0.125f*/
    4284       21546 :                 tmp = shl( *vf_ind, ( 15 - 3 ) );
    4285       21546 :                 tmp2 = MAX_16;
    4286       21546 :                 move16();
    4287       21546 :                 IF( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
    4288             :                 {
    4289       21536 :                     tmp2 = 26214 /*0.8f Q15*/;
    4290       21536 :                     move16();
    4291             :                 }
    4292             :             }
    4293             :         }
    4294       25652 :         test();
    4295       25652 :         IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) )
    4296             :         {
    4297       21546 :             voice_factors[0] = mult_r( voice_factors[0], tmp2 );
    4298       21546 :             move16();
    4299       21546 :             voice_factors[1] = mult_r( voice_factors[1], tmp2 );
    4300       21546 :             move16();
    4301       21546 :             voice_factors[2] = mult_r( voice_factors[2], tmp2 );
    4302       21546 :             move16();
    4303       21546 :             voice_factors[3] = mult_r( voice_factors[3], tmp2 );
    4304       21546 :             move16();
    4305       21546 :             voice_factors[4] = mult_r( voice_factors[4], tmp2 );
    4306       21546 :             move16();
    4307             :         }
    4308             :     }
    4309      102554 :     test();
    4310      102554 :     IF( GE_16( element_mode, IVAS_CPE_DFT ) && nlExc16k != NULL )
    4311             :     {
    4312             :         /* save buffers for IC-BWE */
    4313             :         // mvr2r(exc16kWhtnd, nlExc16k, L_FRAME16k);
    4314       16066 :         Copy( exc16kWhtnd, nlExc16k, L_FRAME16k );
    4315             :         // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), mixExc16k, L_FRAME16k);
    4316             :         /*Word16 temp_fac = divide3232(L_shr(pow1, Q_pow1), pow22);
    4317             :         Word16 temp_fac_exp = 0;
    4318             :         temp_fac = Sqrt16(temp_fac, &temp_fac_exp);*/
    4319       16066 :         L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
    4320       16066 :         Word16 temp_fac = round_fx_sat( L_shl_sat( L_tmp, exp ) ); // Q15
    4321       16066 :         shift = sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k );
    4322             :         // v_multc_fixed_16_16(White_exc16k,shr(temp_fac, temp_fac_exp) , mixExc16k, L_FRAME16k);
    4323     5157186 :         FOR( k = 0; k < L_FRAME16k; k++ )
    4324             :         {
    4325     5141120 :             mixExc16k[k] = mult_r( shl_sat( White_exc16k[k], shift ), temp_fac );
    4326     5141120 :             move16();
    4327             :         }
    4328             :     }
    4329             : 
    4330      102554 :     tmp = sub( Q_temp, 3 );
    4331    32919834 :     FOR( k = 0; k < L_FRAME16k; k++ )
    4332             :     {
    4333    32817280 :         White_exc16k_FB[k] = White_exc16k[k]; /* Q_White_exc16k */
    4334             :     }
    4335      102554 :     prev_Q_bwe_exc_fb = *Q_bwe_exc_fb;
    4336      102554 :     move16();
    4337      102554 :     *Q_bwe_exc_fb = Q_White_exc16k;
    4338      102554 :     move16();
    4339      102554 :     *tbe_demph = shl_sat( *tbe_demph, sub( Q_White_exc16k, sub( *Q_bwe_exc, NOISE_QADJ ) ) );
    4340      102554 :     deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph );
    4341      102554 :     *tbe_demph = shl_sat( *tbe_demph, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) );
    4342             : 
    4343      102554 :     Q_exc16kWhtnd = getScaleFactor16( exc16kWhtnd, L_FRAME16k );
    4344      102554 :     Q_exc16kWhtnd = add( Q_exc16kWhtnd, *Q_bwe_exc );
    4345             : 
    4346      102554 :     shift = getScaleFactor16( White_exc16k, L_FRAME16k );
    4347             : 
    4348      102554 :     shift = s_min( Q_exc16kWhtnd, add( shift, Q_White_exc16k ) );
    4349      102554 :     scale_sig( exc16kWhtnd, L_FRAME16k, sub( shift, *Q_bwe_exc ) );
    4350      102554 :     scale_sig( White_exc16k, L_FRAME16k, sub( shift, Q_White_exc16k ) );
    4351             : 
    4352      102554 :     Q_exc16kWhtnd = Q_White_exc16k = shift;
    4353      102554 :     move16();
    4354      102554 :     move16();
    4355      102554 :     *tbe_premph = shl_sat( *tbe_premph, sub( Q_White_exc16k, sub( *Q_bwe_exc, NOISE_QADJ ) ) );
    4356      102554 :     move16();
    4357      102554 :     test();
    4358      102554 :     IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    4359             :     {
    4360        4106 :         IF( !flag_plosive ) /* use only LB excitation in case of plosives */
    4361             :         {
    4362             :             /* re-scale gaussian excitation at the beginning to gradually move from old energy to new energy */
    4363             :             // old_scale = (float)sqrt(*prev_pow_exc16kWhtnd / pow1);
    4364             :             // old_scale = divide3232(*prev_pow_exc16kWhtnd, pow1); // exp = Q15 - (Q_pow1)
    4365             :             // Word16 old_scale_exp = Q15 - (Q_pow1);
    4366             :             // old_scale = Sqrt16(old_scale, &old_scale_exp);
    4367             :             // old_scale = shl(old_scale, old_scale_exp); //Q15
    4368        4085 :             L_tmp = root_a_over_b_fx( *prev_pow_exc16kWhtnd, 0, pow1, Q_pow1, &exp );
    4369        4085 :             old_scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); // Q15
    4370             :             // new_scale = 1.0f;
    4371        4085 :             new_scale = 32767;
    4372        4085 :             move16();
    4373             :             // step_scale = (new_scale - old_scale) / (L_FRAME16k / 2);
    4374        4085 :             step_scale = mult_r( sub( new_scale, old_scale ), 205 );
    4375        4085 :             scale = old_scale;
    4376        4085 :             move16();
    4377             :             /* interpolate between the old and the new value of the mixing factor */
    4378        4085 :             old_fact = *prev_mix_factor;
    4379        4085 :             move16();
    4380        4085 :             new_fact = mix_factor;
    4381        4085 :             move16();
    4382             :             // step = (new_fact - old_fact) / (L_FRAME16k / 2);
    4383        4085 :             step = mult_r( sub( new_fact, old_fact ), 205 );
    4384        4085 :             fact = old_fact;
    4385        4085 :             move16();
    4386             :             /* mixing of LB and gaussian excitation in the first half of the frame */
    4387      657685 :             FOR( k = 0; k < L_FRAME16k / 2; k++ )
    4388             :             {
    4389      653600 :                 exc16kWhtnd[k] = mac_r( L_mult( fact, mult_r( White_exc16k[k], scale ) ),
    4390      653600 :                                         sub( 32767, fact ), exc16kWhtnd[k] ); // Q_exc16kWhtnd
    4391      653600 :                 move16();
    4392      653600 :                 fact = add_sat( fact, step );
    4393      653600 :                 scale = add_sat( scale, step_scale );
    4394             :             }
    4395             : 
    4396             :             /* mixing of LB and gaussian excitation in the second half of the frame */
    4397      657685 :             FOR( ; k < L_FRAME16k; k++ )
    4398             :             {
    4399      653600 :                 exc16kWhtnd[k] = mac_r( L_mult( new_fact, White_exc16k[k] ),
    4400      653600 :                                         sub( 32767, new_fact ), exc16kWhtnd[k] ); // Q_exc16kWhtnd
    4401      653600 :                 move16();
    4402             :             }
    4403             :         }
    4404             :         // preemph(exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph);
    4405        4106 :         PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph );
    4406             :     }
    4407             :     ELSE
    4408             :     {
    4409       98448 :         test();
    4410       98448 :         IF( EQ_16( coder_type, UNVOICED ) || EQ_16( MSFlag, 1 ) )
    4411             :         {
    4412        6027 :             L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
    4413        6027 :             test();
    4414        6027 :             if ( chk1 == 0 && chk2 == 0 )
    4415             :             {
    4416           0 :                 L_tmp = 0;
    4417           0 :                 move32();
    4418             :             }
    4419        6027 :             scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */
    4420     1934667 :             FOR( k = 0; k < L_FRAME16k; k++ )
    4421             :             {
    4422     1928640 :                 exc16kWhtnd[k] = mult_r_sat( White_exc16k[k], scale );
    4423     1928640 :                 move16();
    4424             :             }
    4425        6027 :             PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph );
    4426             :             /* i/o: exc16kWhtnd  (Q_exc16kWhtnd) */
    4427             :             /* i/o: tbe_premph (Q_exc16kWhtnd) */
    4428             :         }
    4429             :         ELSE
    4430             :         {
    4431             :             Word16 nbSubFr, lSubFr;
    4432             :             Word16 tempQ15;
    4433             :             Word32 tempQ31;
    4434       92421 :             nbSubFr = NB_SUBFR16k;
    4435       92421 :             lSubFr = ( L_FRAME16k / NB_SUBFR16k );
    4436       92421 :             move16();
    4437       92421 :             move16();
    4438       92421 :             IF( LT_32( extl_brate, SWB_TBE_2k8 ) )
    4439             :             {
    4440       70883 :                 nbSubFr = NB_SUBFR;
    4441       70883 :                 move16();
    4442       70883 :                 lSubFr = ( L_FRAME16k / NB_SUBFR );
    4443       70883 :                 move16();
    4444             :             }
    4445       92421 :             k = 0;
    4446       92421 :             move16();
    4447      483643 :             FOR( i = 0; i < nbSubFr; i++ )
    4448             :             {
    4449      391222 :                 test();
    4450      391222 :                 IF( EQ_16( coder_type, VOICED ) && ( LT_32( extl_brate, SWB_TBE_2k8 ) ) )
    4451             :                 {
    4452       23092 :                     exp = 0;
    4453       23092 :                     move16();
    4454       23092 :                     tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */
    4455       23092 :                     temp = shl( tempQ15, exp );                 /* Q15 exc16kWhtnd scale factor */
    4456       23092 :                     exp = 0;
    4457       23092 :                     move16();
    4458       23092 :                     tempQ15 = Sqrt16( temp, &exp ); /* Q15 */
    4459       23092 :                     temp1 = shl( tempQ15, exp );    /* Q15 exc16kWhtnd scale factor */
    4460             : 
    4461             :                     /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */
    4462       23092 :                     temp = sub( MAX_16, temp );
    4463       23092 :                     tempQ31 = Mult_32_16( pow1, temp );
    4464       23092 :                     L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
    4465       23092 :                     temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
    4466             :                 }
    4467             :                 ELSE
    4468             :                 {
    4469             :                     /* Adjust noise mixing for formant sharpening filter */
    4470      368130 :                     tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac );
    4471             :                     /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */
    4472      368130 :                     vf_tmp = sub( MAX_16, tempQ15 );
    4473      368130 :                     vf_tmp = mult( voice_factors[i], vf_tmp );
    4474             : 
    4475      368130 :                     exp = 0;
    4476      368130 :                     move16();
    4477      368130 :                     tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */
    4478      368130 :                     temp1 = shl( tempQ15, exp );      /* Q15 exc16kWhtnd scale factor */
    4479             : 
    4480             :                     /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */
    4481      368130 :                     temp = sub( MAX_16, vf_tmp );
    4482      368130 :                     tempQ31 = Mult_32_16( pow1, temp );
    4483      368130 :                     L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
    4484      368130 :                     temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
    4485             :                 }
    4486             : 
    4487    29965942 :                 FOR( j = 0; j < lSubFr; j++ )
    4488             :                 {
    4489             :                     /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */
    4490    29574720 :                     L_tmp = L_mult( temp2, White_exc16k[k + j] );
    4491    29574720 :                     exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] );
    4492    29574720 :                     move16();
    4493             :                     /* Q_exc16kWhtnd */
    4494             :                 }
    4495      391222 :                 k = add( k, lSubFr );
    4496             : 
    4497             :                 /* estimate the pre-emph factor */
    4498      391222 :                 tempQ15 = sub( MAX_16, voice_factors[i] );
    4499      391222 :                 exp = 0;
    4500      391222 :                 move16();
    4501      391222 :                 temp = Sqrt16( tempQ15, &exp );
    4502      391222 :                 temp = shl( temp, sub( exp, 1 ) );
    4503             : 
    4504      391222 :                 temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */
    4505      391222 :                 temp = div_s( temp, temp2 );           /* Q15 */
    4506      391222 :                 temp = mult_r( PREEMPH_FAC, temp );
    4507      391222 :                 PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph );
    4508             :                 /* exc16kWhtnd: Q_exc16kWhtnd;
    4509             :                    tbe_premph: Q_exc16kWhtnd*/
    4510             :             }
    4511             :         }
    4512             :     }
    4513      102554 :     *tbe_premph = shl_sat( *tbe_premph, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) );
    4514      102554 :     move16();
    4515      102554 :     Scale_sig( White_exc16k, L_FRAME16k, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) );
    4516      102554 :     Scale_sig( exc16kWhtnd, L_FRAME16k, sub( *Q_bwe_exc, Q_White_exc16k ) );
    4517             : 
    4518      102554 :     IF( LT_32( extl_brate, SWB_TBE_2k8 ) )
    4519             :     {
    4520       81008 :         Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 );
    4521             :         /* i: exc16kWhtnd in Q_bwe_exc */
    4522             :         /* o: excSHB in Q_bwe_exc */
    4523             :     }
    4524             :     ELSE
    4525             :     {
    4526       21546 :         set16_fx( zero_mem, 0, LPC_SHB_ORDER );
    4527             : 
    4528       21546 :         Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 );
    4529       21546 :         tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
    4530       21546 :         Scale_sig( tempSHB, 80, tmp );
    4531       21546 :         syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    4532       21546 :         move32();
    4533       21546 :         syn_shb_ener_sf_q[0] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
    4534       21546 :         move16();
    4535             : 
    4536       21546 :         Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 );
    4537       21546 :         tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
    4538       21546 :         Scale_sig( tempSHB, 80, tmp );
    4539       21546 :         syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    4540       21546 :         move32();
    4541       21546 :         syn_shb_ener_sf_q[1] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
    4542       21546 :         move16();
    4543             : 
    4544       21546 :         Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 );
    4545       21546 :         tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
    4546       21546 :         Scale_sig( tempSHB, 80, tmp );
    4547       21546 :         syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    4548       21546 :         move32();
    4549       21546 :         syn_shb_ener_sf_q[2] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
    4550       21546 :         move16();
    4551             : 
    4552       21546 :         Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 );
    4553       21546 :         tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
    4554       21546 :         Scale_sig( tempSHB, 80, tmp );
    4555       21546 :         syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
    4556       21546 :         move32();
    4557       21546 :         syn_shb_ener_sf_q[3] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
    4558       21546 :         move16();
    4559             : 
    4560       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] ) );
    4561       21546 :         syn_shb_ener_sf[0] = L_shl( syn_shb_ener_sf[0], sub( tmp2, syn_shb_ener_sf_q[0] ) );
    4562       21546 :         move32();
    4563       21546 :         syn_shb_ener_sf[1] = L_shl( syn_shb_ener_sf[1], sub( tmp2, syn_shb_ener_sf_q[1] ) );
    4564       21546 :         move32();
    4565       21546 :         syn_shb_ener_sf[2] = L_shl( syn_shb_ener_sf[2], sub( tmp2, syn_shb_ener_sf_q[2] ) );
    4566       21546 :         move32();
    4567       21546 :         syn_shb_ener_sf[3] = L_shl( syn_shb_ener_sf[3], sub( tmp2, syn_shb_ener_sf_q[3] ) );
    4568       21546 :         move32();
    4569             : 
    4570             :         /* i: exc16kWhtnd       in Q_bwe_exc        */
    4571             :         /* o: tempSHB           in Q_bwe_exc        */
    4572             :         /* o: syn_shb_ener_sf   in tmp2  */
    4573       21546 :         IF( LE_32( bitrate, MAX_ACELP_BRATE ) )
    4574             :         {
    4575       21546 :             L_tmp = sum32_fx( syn_shb_ener_sf, 4 );
    4576             : 
    4577             :             /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */
    4578       21546 :             tmp = shl( Q_shb, 1 );
    4579       21546 :             L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */
    4580             : 
    4581       21546 :             *Q_bwe_exc = sub( *Q_bwe_exc, exp );
    4582       21546 :             move16(); /* compensate for the exp shift */
    4583       21546 :             tmp2 = add( prev_Q_bwe_syn, n_mem2 );
    4584       21546 :             IF( GT_16( *Q_bwe_exc, tmp2 ) )
    4585             :             {
    4586           2 :                 L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) );
    4587           2 :                 *Q_bwe_exc = tmp2;
    4588           2 :                 move16();
    4589             :             }
    4590     6916266 :             FOR( i = 0; i < L_FRAME16k; i++ )
    4591             :             {
    4592     6894720 :                 L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */
    4593     6894720 :                 exc16kWhtnd[i] = round_fx( L_tmp3 );           /* *Q_bwe_exc - exp */
    4594     6894720 :                 move16();
    4595             :             }
    4596             :         }
    4597             :         /* i: L_tmp2 in (Q31-exp)                       */
    4598             :         /* i: exc16kWhtnd in Q_bwe_exc            */
    4599             :         /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp)   */
    4600             : 
    4601             :         /* Rescale the past memories: LP synth and SHB look ahead buffers */
    4602       21546 :         tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn );
    4603      237006 :         FOR( i = 0; i < LPC_SHB_ORDER; i++ )
    4604             :         {
    4605      215460 :             state_lpc_syn[i] = shl_sat( state_lpc_syn[i], tmp );
    4606      215460 :             move16();
    4607             :         }
    4608      452466 :         FOR( i = -L_SHB_LAHEAD; i < 0; i++ )
    4609             :         {
    4610      430920 :             excSHB[i] = shl_sat( excSHB[i], tmp );
    4611      430920 :             move16();
    4612             :         }
    4613             :         /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */
    4614             : 
    4615       21546 :         Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 );
    4616       21546 :         Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 );
    4617       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 );
    4618       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 );
    4619             :         /* i: exc16kWhtnd in (Q_bwe_exc) */
    4620             :         /* o: excSHB in (Q_bwe_exc) */
    4621             :     }
    4622             : 
    4623      102554 :     IF( EQ_16( extl, FB_TBE ) )
    4624             :     {
    4625       39990 :         tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb );
    4626       39990 :         Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp );
    4627       39990 :         Scale_sig( fb_tbe_demph, 1, tmp );
    4628       39990 :         Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 );
    4629             :         /* i: White_exc16k_FB       in (14-n2) */
    4630             :         /* o: White_exc16k_FB_temp  in (14-n2) */
    4631             : 
    4632      439890 :         FOR( i = 0; i < 10; i++ )
    4633             :         {
    4634    13196700 :             FOR( j = 0; j < 32; ++j )
    4635             :             {
    4636    12796800 :                 White_exc16k_FB_temp[i * 32 + j] = mult_r_sat( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] );
    4637    12796800 :                 move16();
    4638             :             }
    4639             :         }
    4640             : 
    4641       39990 :         *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 );
    4642       39990 :         move16(); /**Q_bwe_exc_fb  +35 +1 -16*/
    4643       39990 :         flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k );
    4644             : 
    4645       39990 :         deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph );
    4646             :     }
    4647             :     ELSE
    4648             :     {
    4649       62564 :         set16_fx( White_exc16k_FB, 0, L_FRAME16k );
    4650             :     }
    4651             : 
    4652      102554 :     *prev_pow_exc16kWhtnd = L_shr_sat( pow1, Q_pow1 ); // power goes above MAX_32
    4653      102554 :     *prev_mix_factor = mix_factor;
    4654      102554 :     return;
    4655             : }
    4656             : 
    4657             : /*====================================================================================*/
    4658             : /* FUNCTION : void GenSHBSynth_fx() */
    4659             : /*------------------------------------------------------------------------------------*/
    4660             : /* PURPOSE :Generate 32 KHz sampled highband component from synthesized highband*/
    4661             : /*------------------------------------------------------------------------------------*/
    4662             : /* INPUT ARGUMENTS */
    4663             : /* _(Word16*)input_synspeech :input synthesized speech */
    4664             : /* _(Word16) L_frame :ACELP frame length */
    4665             : /*------------------------------------------------------------------------------------*/
    4666             : /* OUTPUT ARGUMENTS : */
    4667             : /* _(Word16*)shb_syn_speech_32k : output highband component */
    4668             : /*------------------------------------------------------------------------------------*/
    4669             : /* INPUT/OUTPUT ARGUMENTS : */
    4670             : /* _(Word16[]) allpass_mem : memory */
    4671             : /* _(Word32[]) Hilbert_Mem : memory */
    4672             : /*------------------------------------------------------------------------------------*/
    4673             : /* RETURN ARGUMENTS : */
    4674             : /* _ None */
    4675             : /*------------------------------------------------------------------------------------*/
    4676             : 
    4677        3146 : void GenSHBSynth_fx(
    4678             :     const Word16 *input_synspeech, /* i : input synthesized speech */
    4679             :     Word16 *shb_syn_speech_32k,    /* o : output highband component */
    4680             :     Word32 Hilbert_Mem[],          /* i/o: memory */
    4681             :     Word16 allpass_mem[],          /* i/o: memory */
    4682             :     const Word16 L_frame,          /* i : ACELP frame length */
    4683             :     Word16 *syn_dm_phase )
    4684             : {
    4685             :     Word16 i, speech_buf_32k[L_FRAME32k];
    4686             :     Word16 maxm, nor, nor32, shift;
    4687             :     Word16 input_synspeech_temp[L_FRAME16k];
    4688             :     Word32 maxm32;
    4689             : 
    4690             : 
    4691        3146 :     maxm = 0;
    4692        3146 :     move16();
    4693        3146 :     maxm32 = L_deposit_l( 0 );
    4694     1009866 :     FOR( i = 0; i < L_FRAME16k; i++ )
    4695     1006720 :     maxm = s_max( maxm, abs_s( input_synspeech[i] ) );
    4696       22022 :     FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
    4697       18876 :     maxm = s_max( maxm, abs_s( allpass_mem[i] ) );
    4698       69212 :     FOR( i = 0; i < HILBERT_MEM_SIZE; i++ )
    4699       66066 :     maxm32 = L_max( maxm32, L_abs( Hilbert_Mem[i] ) );
    4700        3146 :     nor = sub( norm_s( maxm ), 3 );
    4701        3146 :     nor32 = sub( norm_l( maxm32 ), 3 );
    4702        3146 :     if ( maxm == 0 )
    4703             :     {
    4704           0 :         nor = 15;
    4705           0 :         move16();
    4706             :     }
    4707        3146 :     if ( maxm32 == 0 )
    4708             :     {
    4709        2417 :         nor32 = 31;
    4710        2417 :         move16();
    4711             :     }
    4712        3146 :     shift = s_min( nor, nor32 );
    4713             : 
    4714        3146 :     Copy_Scale_sig( input_synspeech, input_synspeech_temp, L_FRAME16k, shift );
    4715        3146 :     Scale_sig( allpass_mem, 2 * ALLPASSSECTIONS_STEEP, shift );
    4716        3146 :     Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, shift );
    4717        3146 :     Interpolate_allpass_steep_fx( input_synspeech_temp, allpass_mem, L_FRAME16k, speech_buf_32k );
    4718             :     /*modify_Fs_fx( input_synspeech, L_FRAME16k, 16000, speech_buf_32k, 32000, allpass_mem, 0);*/
    4719        3146 :     IF( EQ_16( L_frame, L_FRAME ) )
    4720             :     {
    4721             :         /* 12.8 k core flipping and downmixing */
    4722        1594 :         flip_and_downmix_generic_fx( speech_buf_32k, shb_syn_speech_32k, L_FRAME32k,
    4723             :                                      Hilbert_Mem,
    4724             :                                      Hilbert_Mem + HILBERT_ORDER1,
    4725             :                                      Hilbert_Mem + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ),
    4726             :                                      syn_dm_phase );
    4727             :     }
    4728             :     ELSE
    4729             :     {
    4730             :         /* 16 k core flipping and no downmixing */
    4731      498192 :         FOR( i = 0; i < L_FRAME32k; i = i + 2 )
    4732             :         {
    4733      496640 :             shb_syn_speech_32k[i] = negate( speech_buf_32k[i] );
    4734      496640 :             move16();
    4735      496640 :             shb_syn_speech_32k[i + 1] = speech_buf_32k[i + 1];
    4736      496640 :             move16();
    4737             :         }
    4738             :     }
    4739             : 
    4740        3146 :     Scale_sig( shb_syn_speech_32k, L_FRAME32k, negate( shift ) );
    4741        3146 :     Scale_sig( allpass_mem, 2 * ALLPASSSECTIONS_STEEP, negate( shift ) );
    4742        3146 :     Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, negate( shift ) );
    4743             : 
    4744        3146 :     return;
    4745             : }
    4746             : 
    4747             : 
    4748             : /* IVAS 32-bit variant */
    4749      111110 : void GenSHBSynth_fx32(
    4750             :     const Word32 *input_synspeech,      /* i  : input synthesized speech    Qx*/
    4751             :     Word32 *shb_syn_speech_32k,         /* o  : output highband component   Qx*/
    4752             :     Word32 Hilbert_Mem[],               /* i/o: memory                      Qx*/
    4753             :     Word32 state_lsyn_filt_shb_local[], /* i/o: memory                      Qx*/
    4754             :     const Word16 L_frame,               /* i  : ACELP frame length          */
    4755             :     Word16 *syn_dm_phase )
    4756             : {
    4757             :     Word32 speech_buf_32k[L_FRAME32k];
    4758             :     Word16 i;
    4759             : 
    4760      111110 :     Word16 shift = 0;
    4761             :     Word32 maxm32, input_synspeech_temp[L_FRAME16k];
    4762      111110 :     move16();
    4763             : 
    4764             :     /* find the maximum value and derive the shift to improve precision of the Hilber filter */
    4765      111110 :     maxm32 = L_deposit_l( 0 );
    4766    35666310 :     FOR( i = 0; i < L_FRAME16k; i++ )
    4767             :     {
    4768    35555200 :         maxm32 = L_max( maxm32, L_abs( input_synspeech[i] ) );
    4769             :     }
    4770             : 
    4771      777770 :     FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
    4772             :     {
    4773      666660 :         maxm32 = L_max( maxm32, L_abs( state_lsyn_filt_shb_local[i] ) );
    4774             :     }
    4775             : 
    4776     2444420 :     FOR( i = 0; i < HILBERT_MEM_SIZE; i++ )
    4777             :     {
    4778     2333310 :         maxm32 = L_max( maxm32, L_abs( Hilbert_Mem[i] ) );
    4779             :     }
    4780             : 
    4781      111110 :     IF( maxm32 != 0 )
    4782             :     {
    4783      110962 :         shift = sub( norm_l( maxm32 ), 3 );
    4784             : 
    4785      110962 :         Copy_Scale_sig32( input_synspeech, input_synspeech_temp, L_FRAME16k, shift );
    4786      110962 :         Scale_sig32( state_lsyn_filt_shb_local, 2 * ALLPASSSECTIONS_STEEP, shift );
    4787      110962 :         Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, shift );
    4788             :     }
    4789             :     ELSE
    4790             :     {
    4791         148 :         Copy32( input_synspeech, input_synspeech_temp, L_FRAME16k );
    4792             :     }
    4793             : 
    4794      111110 :     Interpolate_allpass_steep_fx32( input_synspeech_temp, state_lsyn_filt_shb_local, L_FRAME16k, speech_buf_32k );
    4795             : 
    4796      111110 :     IF( EQ_16( L_frame, L_FRAME ) )
    4797             :     {
    4798       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 );
    4799             :     }
    4800             :     ELSE
    4801             :     {
    4802    40088140 :         FOR( i = 0; i < L_FRAME32k; i++ )
    4803             :         {
    4804             :             // shb_syn_speech_32k[i] = ( ( i % 2 ) == 0 ) ? ( -speech_buf_32k[i] ) : ( speech_buf_32k[i] );
    4805    40025600 :             IF( i % 2 == 0 )
    4806             :             {
    4807    20012800 :                 shb_syn_speech_32k[i] = L_negate( speech_buf_32k[i] ); // Qx
    4808             :             }
    4809             :             ELSE
    4810             :             {
    4811    20012800 :                 shb_syn_speech_32k[i] = speech_buf_32k[i]; // Qx
    4812             :             }
    4813    40025600 :             move32();
    4814             :         }
    4815             :     }
    4816             : 
    4817      111110 :     IF( maxm32 != 0 )
    4818             :     {
    4819      110962 :         Scale_sig32( shb_syn_speech_32k, L_FRAME32k, negate( shift ) );
    4820      110962 :         Scale_sig32( state_lsyn_filt_shb_local, 2 * ALLPASSSECTIONS_STEEP, negate( shift ) );
    4821      110962 :         Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, negate( shift ) );
    4822             :     }
    4823             : 
    4824      111110 :     return;
    4825             : }
    4826             : 
    4827             : 
    4828             : /*==============================================================================*/
    4829             : /* FUNCTION : void ScaleShapedSHB_fx() */
    4830             : /*------------------------------------------------------------------------------*/
    4831             : /* PURPOSE : */
    4832             : /*------------------------------------------------------------------------------*/
    4833             : /* INPUT ARGUMENTS : */
    4834             : /* _(Word16) length : SHB overlap length */
    4835             : /* _(Word16*) subgain : subframe gain Q15 */
    4836             : /* _(Word32) frame_gain : frame gain Q18 */
    4837             : /* _(Word16*) win : window Q15 */
    4838             : /* _(Word16*) subwin : subframes window Q15 */
    4839             : /* _(Word16) Q_bwe_exc : Q format */
    4840             : /*------------------------------------------------------------------------------*/
    4841             : /* OUTPUT ARGUMENTS : */
    4842             : /* _(Word16) Qx : Q factor of output */
    4843             : /*------------------------------------------------------------------------------*/
    4844             : /* INPUT/OUTPUT ARGUMENTS : */
    4845             : /* _(Word16*) synSHB : synthesized shb signal input Q_bwe_exc / output Qx */
    4846             : /* _(Word16*) overlap : buffer for overlap-add Q_bwe_exc /output Qx */
    4847             : /*------------------------------------------------------------------------------*/
    4848             : /* RETURN ARGUMENTS : */
    4849             : /* _ None */
    4850             : /*------------------------------------------------------------------------------*/
    4851             : /* CALLED FROM : RX */
    4852             : /*==============================================================================*/
    4853             : 
    4854      111552 : void ScaleShapedSHB_fx(
    4855             :     const Word16 length,     /* i    : SHB overlap length                        */
    4856             :     Word16 *synSHB,          /* i/o  : synthesized shb signal Q(Q_bwe_exc)/Q(Qx) */
    4857             :     Word16 *overlap,         /* i/o  : buffer for overlap-add Q(Q_bwe_exc)/Q(Qx) */
    4858             :     const Word16 *subgain,   /* i    : subframe gain                         Q15 */
    4859             :     const Word32 frame_gain, /* i    : frame gain                            Q18 */
    4860             :     const Word16 *win,       /* i    : window                                Q15 */
    4861             :     const Word16 *subwin,    /* i    : subframes window                      Q15 */
    4862             :     Word16 *Q_bwe_exc,
    4863             :     Word16 *Qx, /* o    : newly computed Q factor for  synSHB   */
    4864             :     Word16 n_mem3,
    4865             :     Word16 prev_Q_bwe_syn2 )
    4866             : {
    4867             :     const Word16 *skip;
    4868             :     Word16 i, j, k, l_shb_lahead, l_frame, l_frame_tmp;
    4869             :     Word16 join_length, num_join;
    4870             :     Word32 mod_syn[L_FRAME16k + L_SHB_LAHEAD];
    4871             :     Word16 sum_gain;
    4872             :     Word32 L_tmp;
    4873             :     Word16 tmpQ15;
    4874             :     Word16 Q_gFr_norm, gain_frame_Q16;
    4875             :     Word32 L_tmp2;
    4876             :     Word16 temp1, temp2;
    4877             : 
    4878             :     /* Init */
    4879      111552 :     set32_fx( mod_syn, 0, L_FRAME16k + L_SHB_LAHEAD );
    4880             : 
    4881             :     /* apply gain for each subframe, and store noise output signal using overlap-add */
    4882      111552 :     IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
    4883             :     {
    4884             :         /* WB Gain shape and gain frame application with overlap */
    4885        7640 :         skip = skip_bands_WB_TBE;
    4886        7640 :         l_frame = L_FRAME16k / 4;
    4887        7640 :         move16();
    4888        7640 :         l_shb_lahead = L_SHB_LAHEAD / 4;
    4889        7640 :         move16();
    4890             : 
    4891        7640 :         sum_gain = 0;
    4892        7640 :         move16();
    4893       45840 :         FOR( k = 0; k < length / 2; k++ )
    4894             :         {
    4895       38200 :             sum_gain = mult_r( subwin[2 * k + 2], subgain[0] );             /* Q15 */
    4896       38200 :             mod_syn[skip[0] + k] = L_mult( sum_gain, synSHB[skip[0] + k] ); /* Q_bwe_exc + 16 */
    4897       38200 :             move32();
    4898       38200 :             mod_syn[skip[0] + k + length / 2] = L_mult( subgain[0], synSHB[skip[0] + k + length / 2] ); /* Q_bwe_exc + 16 */
    4899       38200 :             move32();
    4900             :         }
    4901       61120 :         FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ )
    4902             :         {
    4903      588280 :             FOR( k = 0; k < length; k++ )
    4904             :             {
    4905             :                 /* one bit headroom here, otherwise messes up the gain shape application */
    4906             :                 /* keep it as L_mult0 */
    4907      534800 :                 L_tmp = L_mult0( subwin[k + 1], subgain[i] );                                   /* Q30 */
    4908      534800 :                 sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i - 1] ) ); /* Q14 */
    4909      534800 :                 mod_syn[skip[i] + k] = L_shl( L_mult( sum_gain, synSHB[skip[i] + k] ), 1 );     /* Q_bwe_exc + 16 */
    4910      534800 :                 move32();
    4911             :             }
    4912             :         }
    4913       45840 :         FOR( k = 0; k < length / 2; k++ )
    4914             :         {
    4915       38200 :             sum_gain = mult_r( subwin[length - 2 * k - 2], subgain[i - 1] ); /* Q15 */
    4916       38200 :             mod_syn[skip[i] + k] = L_mult( sum_gain, synSHB[skip[i] + k] );  /* Q_bwe_exc + 16 */
    4917       38200 :             move32();
    4918             :         }
    4919             :     }
    4920             :     ELSE
    4921             :     {
    4922             :         /* SWB Gain shape and gain frame application with overlap */
    4923      103912 :         l_frame = L_FRAME16k;
    4924      103912 :         move16();
    4925      103912 :         l_shb_lahead = L_SHB_LAHEAD;
    4926      103912 :         move16();
    4927      103912 :         skip = skip_bands_SWB_TBE;
    4928             : 
    4929      103912 :         num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS;
    4930      103912 :         move16();
    4931      103912 :         join_length = i_mult2( num_join, length );
    4932      103912 :         j = 0;
    4933      103912 :         move16();
    4934     2182152 :         FOR( k = 0; k < length; k++ )
    4935             :         {
    4936     2078240 :             sum_gain = mult_r( subwin[k + 1], subgain[0] ); /* Q15 */
    4937     2078240 :             mod_syn[j] = L_mult( synSHB[j], sum_gain );
    4938     2078240 :             move32(); /* Q_bwe_exc + 16 */
    4939     2078240 :             j = add( j, 1 );
    4940             :         }
    4941             : 
    4942      415648 :         FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ )
    4943             :         {
    4944    19015896 :             FOR( k = 0; k < join_length - length; k++ )
    4945             :             {
    4946    18704160 :                 mod_syn[j] = L_mult( synSHB[j], subgain[i * num_join] );
    4947    18704160 :                 move32(); /* Q_bwe_exc + 16 */
    4948    18704160 :                 j = add( j, 1 );
    4949             :             }
    4950             : 
    4951     6546456 :             FOR( k = 0; k < length; k++ )
    4952             :             {
    4953             :                 /* one bit headroom here, otherwise messes up the gain shape application */
    4954             :                 /* keep it as L_mult0 */
    4955     6234720 :                 L_tmp = L_mult0( subwin[k + 1], subgain[( i + 1 ) * num_join] );                       /* Q30 */
    4956     6234720 :                 sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i * num_join] ) ); /*Q14 */
    4957     6234720 :                 mod_syn[j] = L_shl( L_mult( sum_gain, synSHB[j] ), 1 );
    4958     6234720 :                 move32(); /* Q_bwe_exc + 16 */
    4959     6234720 :                 j = add( j, 1 );
    4960             :             }
    4961             :         }
    4962     6338632 :         FOR( k = 0; k < join_length - length; k++ )
    4963             :         {
    4964     6234720 :             mod_syn[j] = L_mult( synSHB[j], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] );
    4965     6234720 :             move32(); /* Q_bwe_exc + 16 */
    4966     6234720 :             j = add( j, 1 );
    4967             :         }
    4968     2182152 :         FOR( k = 0; k < length; k++ )
    4969             :         {
    4970     2078240 :             sum_gain = mult_r( subwin[length - k - 1], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); /* Q15 */
    4971     2078240 :             mod_syn[j] = L_mult( synSHB[j], sum_gain );
    4972     2078240 :             move32(); /* Q_bwe_exc + 16 */
    4973     2078240 :             j = add( j, 1 );
    4974             :         }
    4975             :     }
    4976             : 
    4977             : 
    4978      111552 :     Q_gFr_norm = norm_l( frame_gain );
    4979      111552 :     if ( frame_gain == 0 )
    4980             :     {
    4981           2 :         Q_gFr_norm = 31;
    4982           2 :         move16();
    4983             :     }
    4984      111552 :     Q_gFr_norm = sub( Q_gFr_norm, 1 ); /* give some headroom */
    4985             : 
    4986      111552 :     gain_frame_Q16 = round_fx( L_shl( frame_gain, Q_gFr_norm ) ); /* Q = 18 + Q_gFr_norm - 16
    4987             :                                                                        = (Q_gFr_norm + 2)    */
    4988             : 
    4989      111552 :     *Q_bwe_exc = add( *Q_bwe_exc, Q_gFr_norm ); /* compensate for the exp shift */
    4990      111552 :     move16();
    4991      111552 :     *Q_bwe_exc = sub( *Q_bwe_exc, 13 ); /* Keep Q-fac at => (Q_bwe_exc + Q_gFr_norm - 13) */
    4992      111552 :     move16();
    4993             : 
    4994             :     /* check for headroom of previous buff memories: overlap, Hilbert, and interp all-pass mem */
    4995      111552 :     tmpQ15 = add( prev_Q_bwe_syn2, n_mem3 );
    4996      111552 :     if ( GT_16( *Q_bwe_exc, tmpQ15 ) )
    4997             :     {
    4998        3753 :         *Q_bwe_exc = tmpQ15;
    4999        3753 :         move16();
    5000             :     }
    5001             : 
    5002      111552 :     *Qx = *Q_bwe_exc;
    5003      111552 :     move16();
    5004             :     /* rescale the overlap memory */
    5005     2342592 :     FOR( i = 0; i < L_SHB_LAHEAD; i++ )
    5006             :     {
    5007     2231040 :         temp2 = 1;
    5008     2231040 :         move16();
    5009     2231040 :         if ( overlap[i] < 0 )
    5010             :         {
    5011      808795 :             temp2 = -1;
    5012      808795 :             move16();
    5013             :         }
    5014     2231040 :         temp1 = abs_s( overlap[i] );
    5015     2231040 :         temp1 = shl( temp1, sub( *Q_bwe_exc, prev_Q_bwe_syn2 ) );
    5016     2231040 :         overlap[i] = i_mult( temp1, temp2 );
    5017     2231040 :         move16(); /* Q_bwe_exc + Q_gFr_norm - 13 */
    5018             :     }
    5019             : 
    5020     2227992 :     FOR( i = 0; i < l_shb_lahead; i++ )
    5021             :     {
    5022     2116440 :         L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 ); /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */
    5023     2116440 :         L_tmp2 = Mpy_32_16_1( L_tmp, win[i] );             /* (Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15) + 15 + (1-16) */
    5024     2116440 :         synSHB[i] = mac_r( L_tmp2, overlap[i], MAX_16 );
    5025     2116440 :         move16();                                     /* Q_bwe_exc + Q_gFr_norm - 13 */
    5026     2116440 :         synSHB[i + l_shb_lahead] = round_fx( L_tmp ); /* Q_bwe_exc + Q_gFr_norm - 13 */
    5027     2116440 :         move16();
    5028             :     }
    5029             : 
    5030    31858152 :     FOR( ; i < l_frame; i++ )
    5031             :     {
    5032    31746600 :         L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 ); /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */
    5033    31746600 :         synSHB[i] = round_fx( L_tmp );                     /* Q_bwe_exc + Q_gFr_norm - 13 */
    5034    31746600 :         move16();
    5035             :     }
    5036             : 
    5037      111552 :     l_frame_tmp = add( l_frame, l_shb_lahead );
    5038     2227992 :     FOR( ; i < l_frame_tmp; i++ )
    5039             :     {
    5040     2116440 :         L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 );                 /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */
    5041     2116440 :         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) */
    5042     2116440 :         overlap[i - l_frame] = round_fx( L_tmp );                          /* Q_bwe_exc + Q_gFr_norm - 13 */
    5043     2116440 :         move16();
    5044             :     }
    5045             : 
    5046      111552 :     return;
    5047             : }
    5048             : 
    5049             : 
    5050             : /* IVAS 32-bit variant */
    5051        8556 : void ScaleShapedSHB_fx32(
    5052             :     const Word16 length,        /* i  : SHB overlap length      */
    5053             :     Word32 *synSHB_fx,          /* i/o: synthesized shb signal  Q_inp/Q_new */
    5054             :     Word32 *overlap_fx,         /* i/o: buffer for overlap-add  Q_inp/Q_new */
    5055             :     const Word16 *subgain_fx,   /* i  : subframe gain           Q15 */
    5056             :     const Word32 frame_gain_fx, /* i  : frame gain              Q18*/
    5057             :     const Word16 *win_fx,       /* i  : window                  Q15 */
    5058             :     const Word16 *subwin_fx,    /* i  : subframes window        Q15 */
    5059             :     Word16 *Q_inp,
    5060             :     Word16 *Q_new )
    5061             : {
    5062             :     const Word16 *skip;
    5063             :     Word16 i, j, k, l_shb_lahead, l_frame;
    5064             :     Word16 join_length, num_join;
    5065             :     Word32 mod_syn_fx[L_FRAME16k + L_SHB_LAHEAD], L_tmp;
    5066             :     Word16 sum_gain_fx;
    5067             : 
    5068             :     /* initilaization */
    5069        8556 :     l_frame = L_FRAME16k;
    5070        8556 :     l_shb_lahead = L_SHB_LAHEAD;
    5071        8556 :     move16();
    5072        8556 :     move16();
    5073        8556 :     skip = skip_bands_SWB_TBE;
    5074             : 
    5075        8556 :     IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
    5076             :     {
    5077           0 :         skip = skip_bands_WB_TBE;
    5078           0 :         l_frame = L_FRAME16k / 4;
    5079           0 :         l_shb_lahead = L_SHB_LAHEAD / 4;
    5080           0 :         move16();
    5081           0 :         move16();
    5082             :     }
    5083             : 
    5084             :     /* apply gain for each subframe, and store noise output signal using overlap-add */
    5085        8556 :     set32_fx( mod_syn_fx, 0, l_frame + l_shb_lahead );
    5086             : 
    5087        8556 :     IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
    5088             :     {
    5089           0 :         sum_gain_fx = 0;
    5090           0 :         move16();
    5091           0 :         FOR( k = 0; k < shr( length, 1 ); k++ )
    5092             :         {
    5093           0 :             sum_gain_fx = mult_r( subwin_fx[2 * k + 2], subgain_fx[0] );
    5094           0 :             mod_syn_fx[skip[0] + k] = Mpy_32_16_1( synSHB_fx[skip[0] + k], sum_gain_fx );
    5095           0 :             move32();                                                                                                 // Qx
    5096           0 :             mod_syn_fx[skip[0] + k + length / 2] = Mpy_32_16_1( synSHB_fx[skip[0] + k + length / 2], subgain_fx[0] ); // Qx
    5097           0 :             move32();
    5098             :         }
    5099           0 :         FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ )
    5100             :         {
    5101           0 :             FOR( k = 0; k < length; k++ )
    5102             :             {
    5103           0 :                 L_tmp = L_mult0( subwin_fx[k + 1], subgain_fx[i] );
    5104           0 :                 sum_gain_fx = round_fx( L_mac0( L_tmp, subwin_fx[length - k - 1], subgain_fx[i - 1] ) );
    5105           0 :                 mod_syn_fx[skip[i] + k] = L_shl( Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ), 1 ); // Qx
    5106           0 :                 move32();
    5107             :             }
    5108             :         }
    5109           0 :         FOR( k = 0; k < shr( length, 1 ); k++ )
    5110             :         {
    5111           0 :             sum_gain_fx = mult_r( subwin_fx[length - k * 2 - 2], subgain_fx[i - 1] );
    5112           0 :             mod_syn_fx[skip[i] + k] = Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ); // Qx
    5113           0 :             move32();
    5114             :         }
    5115             :     }
    5116             :     ELSE
    5117             :     {
    5118        8556 :         num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS;
    5119        8556 :         join_length = i_mult( num_join, length );
    5120        8556 :         j = 0;
    5121        8556 :         move16();
    5122        8556 :         move16();
    5123      179676 :         FOR( k = 0; k < length; k++ )
    5124             :         {
    5125      171120 :             mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[k + 1], subgain_fx[0] ) ); // Qx
    5126      171120 :             move32();
    5127      171120 :             j = add( j, 1 );
    5128             :         }
    5129       34224 :         FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ )
    5130             :         {
    5131     1565748 :             FOR( k = 0; k < join_length - length; k++ )
    5132             :             {
    5133     1540080 :                 mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[i * num_join] ); // Qx
    5134     1540080 :                 move32();
    5135     1540080 :                 j = add( j, 1 );
    5136             :             }
    5137             : 
    5138      539028 :             FOR( k = 0; k < length; k++ )
    5139             :             {
    5140      513360 :                 L_tmp = L_mult0( subwin_fx[length - k - 1], subgain_fx[i * num_join] );
    5141      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
    5142      513360 :                 move32();
    5143      513360 :                 j = add( j, 1 );
    5144             :             }
    5145             :         }
    5146      521916 :         FOR( k = 0; k < join_length - length; k++ )
    5147             :         {
    5148      513360 :             mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); // Qx
    5149      513360 :             move32();
    5150      513360 :             j = add( j, 1 );
    5151             :         }
    5152      179676 :         FOR( k = 0; k < length; k++ )
    5153             :         {
    5154      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
    5155      171120 :             move32();
    5156      171120 :             j = add( j, 1 );
    5157             :         }
    5158             :     }
    5159             : 
    5160        8556 :     Word16 norm_shift = norm_l( frame_gain_fx );
    5161        8556 :     if ( frame_gain_fx == 0 )
    5162             :     {
    5163           0 :         norm_shift = 31;
    5164           0 :         move16();
    5165             :     }
    5166             : 
    5167        8556 :     norm_shift = s_min( norm_shift, 14 );
    5168        8556 :     norm_shift = sub( norm_shift, 1 );
    5169             : 
    5170        8556 :     *Q_new = add( *Q_inp, sub( norm_shift, 13 ) ); // Q_new = Q_inp + min(norm_shift,14) - 14;
    5171        8556 :     move16();
    5172      179676 :     FOR( i = 0; i < L_SHB_LAHEAD; i++ )
    5173             :     {
    5174      171120 :         overlap_fx[i] = L_shl( overlap_fx[i], sub( *Q_new, *Q_inp ) );
    5175      171120 :         move32();
    5176             :     }
    5177             : 
    5178      179676 :     FOR( i = 0; i < l_shb_lahead; i++ )
    5179             :     {
    5180      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
    5181      171120 :         synSHB_fx[i] = L_add( synSHB_fx[i], overlap_fx[i] );
    5182      171120 :         synSHB_fx[i + l_shb_lahead] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new
    5183      171120 :         move32();
    5184      171120 :         move32();
    5185      171120 :         move32();
    5186             :     }
    5187             : 
    5188     2575356 :     FOR( ; i < l_frame; i++ )
    5189             :     {
    5190     2566800 :         synSHB_fx[i] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new
    5191     2566800 :         move32();
    5192             :     }
    5193             : 
    5194      179676 :     FOR( ; i < l_frame + l_shb_lahead; i++ )
    5195             :     {
    5196      171120 :         synSHB_fx[i] = L_shl( synSHB_fx[i], sub( *Q_new, *Q_inp ) );
    5197      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
    5198      171120 :         move32();
    5199      171120 :         move32();
    5200             :     }
    5201             : 
    5202        8556 :     *Q_inp = *Q_new;
    5203        8556 :     move16();
    5204        8556 :     return;
    5205             : }
    5206             : 
    5207             : 
    5208             : /*-------------------------------------------------------------------*
    5209             :  * ScaleShapedWB()
    5210             :  *
    5211             :  *
    5212             :  *-------------------------------------------------------------------*/
    5213             : 
    5214        6870 : void ScaleShapedWB_fx(
    5215             :     const Word16 length,     /* i    : SHB overlap length */
    5216             :     Word16 *synSHB,          /* i/o  : synthesized shb signal Q_bwe_exc/Qx   */
    5217             :     Word16 *overlap,         /* i/o  : buffer for overlap-add Q_bwe_exc/Qx   */
    5218             :     const Word16 *subgain,   /* i    : subframe gain Q15*/
    5219             :     const Word32 frame_gain, /* i    : frame gain Q18                        */
    5220             :     const Word16 *win,       /* i    : window Q15*/
    5221             :     const Word16 *subwin,    /* i    : subframes window Q15*/
    5222             :     const Word16 Q_bwe_exc,
    5223             :     Word16 L_frame,     /* i : Frame length - determines whether 12.8 or 16kHz core in-use */
    5224             :     Word16 dynQ,        /* i : indicate whether output is dynamic Q, or Q0 */
    5225             :     Word16 *Qx,         /* o : newly computed Q factor for  synSHB   */
    5226             :     Word16 prev_Qx,     /* i : prev_Qx for memory scaling            */
    5227             :     Word32 *Hilbert_Mem /* i : Hilbert memory used for computing Qx  */
    5228             : )
    5229             : {
    5230             :     const Word16 *skip;
    5231             :     Word16 i, j, k, l_shb_lahead, l_frame, l_frame_tmp;
    5232             :     Word16 join_length, num_join;
    5233             :     Word32 mod_syn[L_FRAME16k + L_SHB_LAHEAD];
    5234             :     Word16 sum_gain;
    5235             :     Word32 L_tmp;
    5236             :     Word16 max_val, abs_sig, sc1, sc2, shift, max_headroom, min_shift, max_shift, max_shift2;
    5237             :     /* Init */
    5238        6870 :     set32_fx( mod_syn, 0, L_FRAME16k + L_SHB_LAHEAD );
    5239             : 
    5240             :     /* apply gain for each subframe, and store noise output signal using overlap-add */
    5241        6870 :     IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
    5242             :     {
    5243             :         /* WB Gain shape and gain frame application with overlap */
    5244        6870 :         skip = skip_bands_WB_TBE;
    5245        6870 :         move16();
    5246        6870 :         l_frame = L_FRAME16k / 4;
    5247        6870 :         move16();
    5248        6870 :         l_shb_lahead = L_SHB_LAHEAD / 4;
    5249        6870 :         move16();
    5250             : 
    5251        6870 :         sum_gain = 0;
    5252        6870 :         move16();
    5253       41220 :         FOR( k = 0; k < length / 2; k++ )
    5254             :         {
    5255       34350 :             sum_gain = mult_r( subwin[2 * k + 2], subgain[0] ); /* Q15 */
    5256       34350 :             mod_syn[skip[0] + k] = L_mult( sum_gain, synSHB[skip[0] + k] );
    5257       34350 :             move32(); /* Q_bwe_exc + 16 */
    5258       34350 :             mod_syn[skip[0] + k + length / 2] = L_mult( subgain[0], synSHB[skip[0] + k + length / 2] );
    5259       34350 :             move32(); /* Q_bwe_exc + 16 */
    5260             :         }
    5261       54960 :         FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ )
    5262             :         {
    5263      528990 :             FOR( k = 0; k < length; k++ )
    5264             :             {
    5265      480900 :                 L_tmp = L_mult0( subwin[k + 1], subgain[i] );                                   /* Q30 */
    5266      480900 :                 sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i - 1] ) ); /* Q14 */
    5267      480900 :                 mod_syn[skip[i] + k] = L_shl( L_mult( sum_gain, synSHB[skip[i] + k] ), 1 );
    5268      480900 :                 move32(); /* Q_bwe_exc + 16 */
    5269             :             }
    5270             :         }
    5271       41220 :         FOR( k = 0; k < length / 2; k++ )
    5272             :         {
    5273       34350 :             sum_gain = mult_r( subwin[length - 2 * k - 2], subgain[i - 1] ); /* Q15 */
    5274       34350 :             mod_syn[skip[i] + k] = L_mult( sum_gain, synSHB[skip[i] + k] );
    5275       34350 :             move32(); /* Q_bwe_exc + 16 */
    5276             :         }
    5277             :     }
    5278             :     ELSE
    5279             :     {
    5280             :         /* SWB Gain shape and gain frame application with overlap */
    5281           0 :         l_frame = L_FRAME16k;
    5282           0 :         move16();
    5283           0 :         l_shb_lahead = L_SHB_LAHEAD;
    5284           0 :         move16();
    5285           0 :         skip = skip_bands_SWB_TBE;
    5286           0 :         move16();
    5287             : 
    5288           0 :         num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS;
    5289           0 :         move16();
    5290           0 :         join_length = i_mult2( num_join, length );
    5291           0 :         j = 0; /* ptr*/
    5292           0 :         move16();
    5293           0 :         FOR( k = 0; k < length; k++ )
    5294             :         {
    5295           0 :             sum_gain = mult_r( subwin[k + 1], subgain[0] ); /* Q15 */
    5296           0 :             mod_syn[j] = L_mult( synSHB[j], sum_gain );
    5297           0 :             move32(); /* Q_bwe_exc + 16 */
    5298           0 :             j++;
    5299             :         }
    5300             : 
    5301           0 :         FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ )
    5302             :         {
    5303           0 :             FOR( k = 0; k < join_length - length; k++ )
    5304             :             {
    5305           0 :                 mod_syn[j] = L_mult( synSHB[j], subgain[i * num_join] );
    5306           0 :                 move32(); /* Q_bwe_exc + 16 */
    5307           0 :                 j++;
    5308             :             }
    5309             : 
    5310           0 :             FOR( k = 0; k < length; k++ )
    5311             :             {
    5312           0 :                 L_tmp = L_mult0( subwin[k + 1], subgain[i_mult2( ( i + 1 ), num_join )] );             /* Q30 */
    5313           0 :                 sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i * num_join] ) ); /*Q14 */
    5314           0 :                 mod_syn[j] = L_shl( L_mult( sum_gain, synSHB[j] ), 1 );
    5315           0 :                 move32(); /* Q_bwe_exc + 16 */
    5316           0 :                 j++;
    5317             :             }
    5318             :         }
    5319           0 :         FOR( k = 0; k < join_length - length; k++ )
    5320             :         {
    5321           0 :             mod_syn[j] = L_mult( synSHB[j], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] );
    5322           0 :             move32(); /* Q_bwe_exc + 16 */
    5323           0 :             j++;
    5324             :         }
    5325           0 :         FOR( k = 0; k < length; k++ )
    5326             :         {
    5327           0 :             sum_gain = mult_r( subwin[length - k - 1], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); /* Q15 */
    5328           0 :             mod_syn[j] = L_mult( synSHB[j], sum_gain );
    5329           0 :             move32(); /* Q_bwe_exc + 16 */
    5330           0 :             j++;
    5331             :         }
    5332             :     }
    5333             : 
    5334             : 
    5335        6870 :     max_val = 0;
    5336        6870 :     move16();
    5337      590820 :     FOR( i = 0; i < l_frame + l_shb_lahead; i++ )
    5338             :     {
    5339      583950 :         abs_sig = abs_s( round_fx( mod_syn[i] ) );
    5340      583950 :         if ( GT_16( abs_sig, max_val ) )
    5341             :         {
    5342       49852 :             max_val = abs_sig;
    5343       49852 :             move16();
    5344             :         }
    5345             :     }
    5346             : 
    5347      151140 :     FOR( i = 0; i < HILBERT_MEM_SIZE; i++ )
    5348             :     {
    5349      144270 :         abs_sig = abs_s( round_fx( Hilbert_Mem[i] ) );
    5350      144270 :         if ( GT_16( abs_sig, max_val ) )
    5351             :         {
    5352           0 :             max_val = abs_sig;
    5353           0 :             move16();
    5354             :         }
    5355             :     }
    5356             : 
    5357        6870 :     sc1 = norm_s( max_val );                /* max_val headroom in mod_syn[] */
    5358        6870 :     sc2 = norm_s( round_fx( frame_gain ) ); /* headroom in GainFrame */
    5359             : 
    5360        6870 :     IF( dynQ == 0 )
    5361             :     {
    5362        6870 :         shift = sub( 13, Q_bwe_exc ); /* earlier = (10 - Q_bwe_exc) but we changed GainFrame Q21 to Q18 */
    5363        6870 :         *Qx = 0;
    5364        6870 :         move16();
    5365             :     }
    5366           0 :     ELSE IF( EQ_16( L_frame, L_FRAME ) ) /* 12.8k core */
    5367             :     {
    5368           0 :         max_headroom = sub( add( sc1, sc2 ), 4 ); /* Max headroom after multiplying = sc1 + sc2 -3 (keep 3 bit extra headroom) */
    5369             :         /* 12.8k core needs extra headroom than 16k core */
    5370             :         /* otherwise Hilbert transform inside flip_and_downmix have saturation, causes ringing in output */
    5371             : 
    5372             :         /* Qx = (Q_bwe_exc+3) + shift - 16  */
    5373             :         /* make sure 14 > Qx > 2            */
    5374           0 :         min_shift = sub( 2, sub( add( Q_bwe_exc, 3 ), 16 ) );
    5375           0 :         max_shift = sub( 13, sub( add( Q_bwe_exc, 3 ), 16 ) );
    5376           0 :         max_shift2 = s_min( max_shift, max_headroom ); /* avoid shifting more than the available max_val headroom to avoid overflow */
    5377             : 
    5378           0 :         shift = s_min( min_shift, max_shift2 );
    5379           0 :         *Qx = sub( add( add( Q_bwe_exc, 3 ), shift ), 16 );
    5380           0 :         move16();
    5381             :     }
    5382             :     ELSE /* 16k core */
    5383             :     {
    5384           0 :         max_headroom = sub( add( sc1, sc2 ), 1 ); /* Max headroom after multiplying = sc1 + sc2 -1 (keep 1 bit extra headroom) */
    5385             : 
    5386             :         /* Qx = (Q_bwe_exc+3) + shift - 16  */
    5387             :         /* make sure 14 > Qx > 3            */
    5388           0 :         min_shift = sub( 3, sub( add( Q_bwe_exc, 3 ), 16 ) );
    5389           0 :         move16();
    5390           0 :         max_shift = sub( 13, sub( add( Q_bwe_exc, 3 ), 16 ) );
    5391           0 :         move16();
    5392           0 :         max_shift2 = s_min( max_shift, max_headroom ); /* avoid shifting more than the available max_val headroom to avoid overflow */
    5393             : 
    5394           0 :         shift = s_min( min_shift, max_shift2 );
    5395           0 :         *Qx = sub( add( add( Q_bwe_exc, 3 ), shift ), 16 );
    5396           0 :         move16();
    5397             :     }
    5398             : 
    5399             :     /* bring memory st_fx->syn_overlap_fx[] = overlap[i] to new Q = Qx to prepare for addition */
    5400       41220 :     FOR( i = 0; i < l_shb_lahead; i++ )
    5401             :     {
    5402       34350 :         overlap[i] = shl( overlap[i], sub( *Qx, prev_Qx ) );
    5403       34350 :         move16();
    5404             :     }
    5405             : 
    5406       41220 :     FOR( i = 0; i < l_shb_lahead; i++ )
    5407             :     {
    5408             :         /* mod_syn in (16+Q_bwe_exc), frame_gain in Q18 */
    5409       34350 :         L_tmp = Mult_32_32( mod_syn[i], frame_gain );                                /* L_tmp in (Q_bwe_exc+3) */
    5410       34350 :         synSHB[i] = round_fx_sat( L_shl_sat( Mult_32_16( L_tmp, win[i] ), shift ) ); /* Qx */
    5411       34350 :         move16();
    5412       34350 :         synSHB[i] = add_sat( synSHB[i], overlap[i] );
    5413       34350 :         move16();                                                             /* Qx */
    5414       34350 :         synSHB[i + l_shb_lahead] = round_fx_sat( L_shl_sat( L_tmp, shift ) ); /* Qx */
    5415       34350 :         move16();
    5416             :     }
    5417             : 
    5418      522120 :     FOR( ; i < l_frame; i++ )
    5419             :     {
    5420      515250 :         L_tmp = Mult_32_32( mod_syn[i], frame_gain );          /* L_tmp in (Q_bwe_exc+3) */
    5421      515250 :         synSHB[i] = round_fx_sat( L_shl_sat( L_tmp, shift ) ); /* Qx; */
    5422      515250 :         move16();
    5423             :     }
    5424             : 
    5425        6870 :     l_frame_tmp = add( l_frame, l_shb_lahead );
    5426       41220 :     FOR( ; i < l_frame_tmp; i++ )
    5427             :     {
    5428       34350 :         L_tmp = Mult_32_32( mod_syn[i], frame_gain );                                                                        /* (Q_bwe_exc+3) */
    5429       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 */
    5430       34350 :         move16();
    5431             :     }
    5432             : 
    5433        6870 :     return;
    5434             : }
    5435             : 
    5436             : /*-------------------------------------------------------------------*
    5437             :  * non_linearity()
    5438             :  *
    5439             :  * Apply a non linearity to the SHB excitation
    5440             :  * -------------------------------------------------------------------*/
    5441             : 
    5442        8144 : static Word32 non_linearity_scaled_copy(
    5443             :     const Word16 input[],
    5444             :     Word16 j,
    5445             :     const Word16 length,
    5446             :     Word32 output[],
    5447             :     Word32 prev_scale,
    5448             :     const Word16 scale_step,
    5449             :     const Word16 en_abs )
    5450             : {
    5451             :     Word16 i;
    5452             :     Word32 L_tmp;
    5453             : 
    5454             : 
    5455        8144 :     IF( en_abs )
    5456             :     {
    5457           0 :         FOR( i = 0; i < j; i++ )
    5458             :         {
    5459           0 :             L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
    5460           0 :             L_tmp = Mult_32_32( L_tmp, prev_scale );  /* 2*Q_inp */
    5461           0 :             output[i] = L_tmp;
    5462           0 :             move32();
    5463             : 
    5464           0 :             L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */
    5465           0 :             prev_scale = L_shl( L_tmp, 1 );               /* Q30 */
    5466             :         }
    5467           0 :         FOR( ; i < length; i++ )
    5468             :         {
    5469           0 :             L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
    5470           0 :             L_tmp = Mult_32_32( L_tmp, prev_scale );  /* 2*Q_inp */
    5471           0 :             output[i] = L_tmp;
    5472           0 :             move32();
    5473             :         }
    5474             :     }
    5475             :     ELSE
    5476             :     {
    5477     1242572 :         FOR( i = 0; i < j; i++ )
    5478             :         {
    5479     1234428 :             L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
    5480     1234428 :             L_tmp = Mult_32_32( L_tmp, prev_scale );  /* 2*Q_inp */
    5481             : 
    5482     1234428 :             if ( input[i] < 0 )
    5483             :             {
    5484      620126 :                 L_tmp = L_negate( L_tmp );
    5485             :             }
    5486     1234428 :             output[i] = L_tmp;
    5487     1234428 :             move32();
    5488             : 
    5489     1234428 :             L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */
    5490     1234428 :             prev_scale = L_shl( L_tmp, 1 );               /* Q30 */
    5491             :         }
    5492             : 
    5493     1379796 :         FOR( ; i < length; i++ )
    5494             :         {
    5495     1371652 :             L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
    5496     1371652 :             L_tmp = Mult_32_32( L_tmp, prev_scale );  /* 2*Q_inp */
    5497             : 
    5498     1371652 :             if ( input[i] < 0 )
    5499             :             {
    5500      668599 :                 L_tmp = L_negate( L_tmp );
    5501             :             }
    5502     1371652 :             output[i] = L_tmp;
    5503     1371652 :             move32();
    5504             :         }
    5505             :     }
    5506        8144 :     return prev_scale;
    5507             : }
    5508             : 
    5509             : 
    5510             : /*-------------------------------------------------------------------*
    5511             :  * non_linearity()
    5512             :  *
    5513             :  * Apply a non linearity to the SHB excitation
    5514             :  * -------------------------------------------------------------------*/
    5515             : 
    5516      648334 : static Word32 non_linearity_scaled_copy_ivas(
    5517             :     const Word16 input[],
    5518             :     Word16 j,
    5519             :     const Word16 length,
    5520             :     Word32 output[],
    5521             :     Word32 prev_scale,
    5522             :     const Word16 scale_step,
    5523             :     const Word16 en_abs )
    5524             : {
    5525             :     Word16 i;
    5526             :     Word32 L_tmp;
    5527             : 
    5528             : 
    5529      648334 :     IF( en_abs )
    5530             :     {
    5531        1674 :         FOR( i = 0; i < j; i++ )
    5532             :         {
    5533        1666 :             L_tmp = L_mult( input[i], input[i] );    /* 2*Q_inp+1 */
    5534        1666 :             L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
    5535             : 
    5536        1666 :             test();
    5537        1666 :             test();
    5538        1666 :             if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 )
    5539             :             {
    5540             :                 /* NOTE: this is done to avoid the product to become zero for small non-zero input */
    5541         142 :                 L_tmp = 1;
    5542         142 :                 move16();
    5543             :             }
    5544             : 
    5545        1666 :             output[i] = L_tmp;
    5546        1666 :             move32();
    5547             : 
    5548        1666 :             L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */
    5549        1666 :             prev_scale = L_shl( L_tmp, 1 );               /* Q30 */
    5550             :         }
    5551         902 :         FOR( ; i < length; i++ )
    5552             :         {
    5553             :             /* L_tmp = (input[i] * input[i]) * prev_scale;*/
    5554         894 :             L_tmp = Mpy_32_16_1( Mpy_32_16_1( prev_scale, input[i] ), input[i] ); /* 2*Q_inp */
    5555             : 
    5556         894 :             test();
    5557         894 :             test();
    5558         894 :             if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 )
    5559             :             {
    5560             :                 /* NOTE: this is done to avoid the product to become zero for small non-zero input */
    5561          70 :                 L_tmp = 1;
    5562          70 :                 move16();
    5563             :             }
    5564         894 :             output[i] = L_tmp;
    5565         894 :             move32();
    5566             :         }
    5567             :     }
    5568             :     ELSE
    5569             :     {
    5570    95602389 :         FOR( i = 0; i < j; i++ )
    5571             :         {
    5572    94954063 :             L_tmp = L_mult( input[i], input[i] );    /* 2*Q_inp+1 */
    5573    94954063 :             L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
    5574             : 
    5575    94954063 :             test();
    5576    94954063 :             test();
    5577    94954063 :             if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 )
    5578             :             {
    5579             :                 /* NOTE: this is done to avoid the product to become zero for small non-zero input */
    5580    12563736 :                 L_tmp = 1;
    5581    12563736 :                 move16();
    5582             :             }
    5583             : 
    5584    94954063 :             if ( input[i] < 0 )
    5585             :             {
    5586    47095041 :                 L_tmp = L_negate( L_tmp );
    5587             :             }
    5588    94954063 :             output[i] = L_tmp;
    5589    94954063 :             move32();
    5590             : 
    5591    94954063 :             L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */
    5592    94954063 :             prev_scale = L_shl( L_tmp, 1 );               /* Q30 */
    5593             :         }
    5594             : 
    5595   113158583 :         FOR( ; i < length; i++ )
    5596             :         {
    5597   112510257 :             L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
    5598   112510257 :             L_tmp = Mult_32_32( L_tmp, prev_scale );  /* 2*Q_inp */
    5599   112510257 :             test();
    5600   112510257 :             test();
    5601   112510257 :             if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 )
    5602             :             {
    5603             :                 /* NOTE: this is done to avoid the product to become zero for small non-zero input */
    5604    13273215 :                 L_tmp = 1;
    5605    13273215 :                 move16();
    5606             :             }
    5607             : 
    5608   112510257 :             if ( input[i] < 0 )
    5609             :             {
    5610    50406817 :                 L_tmp = L_negate( L_tmp );
    5611             :             }
    5612   112510257 :             output[i] = L_tmp;
    5613   112510257 :             move32();
    5614             :         }
    5615             :     }
    5616      648334 :     return prev_scale;
    5617             : }
    5618             : 
    5619             : 
    5620             : /*==========================================================================*/
    5621             : /* FUNCTION : void non_linearity() */
    5622             : /*--------------------------------------------------------------------------*/
    5623             : /* PURPOSE : Apply a non linearity to the SHB excitation */
    5624             : /*--------------------------------------------------------------------------*/
    5625             : /* INPUT ARGUMENTS : */
    5626             : /* Word16 input[] i : input signal Q_inp */
    5627             : /* Word16 length i : input length */
    5628             : /*--------------------------------------------------------------------------*/
    5629             : /* OUTPUT ARGUMENTS : */
    5630             : /* Word32 output[] o : output signal 2*Q_inp */
    5631             : /*--------------------------------------------------------------------------*/
    5632             : /* INPUT/OUTPUT ARGUMENTS : */
    5633             : /* Word32 *prev_scale i/o: memory Q30 */
    5634             : /*--------------------------------------------------------------------------*/
    5635             : /* RETURN ARGUMENTS : */
    5636             : /* _ None */
    5637             : /*--------------------------------------------------------------------------*/
    5638             : /* CALLED FROM : */
    5639             : /*==========================================================================*/
    5640             : 
    5641        4072 : void non_linearity_fx(
    5642             :     const Word16 input[], /* i : input signal Q_inp */
    5643             :     Word32 output[],      /* o : output signal 2*Q_inp */
    5644             :     const Word16 length,  /* i : input length */
    5645             :     Word32 *pPrevScale,   /* i/o: memory Q30 */
    5646             :     Word16 Q_inp,
    5647             :     Word16 coder_type,     /* i  : Coder Type          */
    5648             :     Word16 *voice_factors, /* i  : Voice Factors       */
    5649             :     const Word16 L_frame   /* i  : ACELP frame length  */
    5650             : 
    5651             : )
    5652             : {
    5653             :     Word16 i, j;
    5654        4072 :     Word16 max_val = 0;
    5655        4072 :     move16();
    5656             :     Word32 scale;
    5657             :     Word16 scale_step;
    5658             :     Word16 exp, tmp;
    5659             :     Word16 e_tmp, f_tmp;
    5660             :     Word16 frac;
    5661             :     Word32 L_tmp;
    5662             :     Word32 L_tmp1;
    5663             : 
    5664        4072 :     Word16 en_abs = 0;
    5665        4072 :     Word16 v_fac = 0;
    5666        4072 :     move16();
    5667        4072 :     move16();
    5668             :     Word16 ths;
    5669             :     Word16 nframes;
    5670             :     Word32 prev_scale;
    5671             :     Word16 length_half;
    5672             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
    5673        4072 :     Flag Overflow = 0;
    5674        4072 :     move32();
    5675             : #endif
    5676             : 
    5677             : 
    5678        4072 :     IF( EQ_16( L_frame, L_FRAME16k ) )
    5679             :     {
    5680        2565 :         nframes = 5;
    5681        2565 :         move16();
    5682        2565 :         ths = 17817;
    5683        2565 :         move16(); /* 0.87*5 in Q12 */
    5684             :     }
    5685             :     ELSE
    5686             :     {
    5687        1507 :         nframes = 4;
    5688        1507 :         move16();
    5689        1507 :         ths = 15400;
    5690        1507 :         move16(); /* 0.94*4 in Q12 */
    5691             :     }
    5692             : 
    5693             : 
    5694       22925 :     FOR( i = 0; i < nframes; i++ )
    5695             :     {
    5696       18853 :         v_fac = add( v_fac, shr( voice_factors[i], 3 ) ); /* Q12 */
    5697             :     }
    5698             : 
    5699        4072 :     test();
    5700        4072 :     if ( EQ_16( coder_type, VOICED ) && GT_16( v_fac, ths ) )
    5701             :     {
    5702           0 :         en_abs = 1;
    5703           0 :         move16();
    5704             :     }
    5705             : 
    5706        4072 :     length_half = shr( length, 1 );
    5707        4072 :     prev_scale = *pPrevScale;
    5708        4072 :     move32();
    5709             : 
    5710             : 
    5711             :     /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */
    5712             : 
    5713     1307112 :     FOR( i = j = 0; i < length_half; i++ )
    5714             :     {
    5715     1303040 :         tmp = abs_s( input[i] );
    5716     1303040 :         if ( GT_16( tmp, max_val ) )
    5717             :         {
    5718       28875 :             j = i;
    5719       28875 :             move16();
    5720             :         }
    5721     1303040 :         max_val = s_max( max_val, tmp );
    5722             :     }
    5723             : 
    5724             : 
    5725        4072 :     IF( GT_16( max_val, shl( 1, Q_inp ) ) )
    5726             :     {
    5727        4069 :         exp = norm_s( max_val );
    5728        4069 :         tmp = div_s( shl( 1, sub( 14, exp ) ), max_val );                    /* Q(29-exp-Q_inp) */
    5729        4069 :         scale = L_shl( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ) ); /* Q31 */
    5730             :     }
    5731             :     ELSE
    5732             :     {
    5733           3 :         scale = 1438814044;
    5734           3 :         move32(); /* Q31; 0.67 in Q31 */
    5735             :     }
    5736             : 
    5737        4072 :     test();
    5738        4072 :     IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 32 ), scale ) )
    5739             :     {
    5740         126 :         scale_step = 16384;
    5741         126 :         move16();                       /* Q14 */
    5742         126 :         prev_scale = L_shr( scale, 1 ); /* Q30 */
    5743             :     }
    5744             :     ELSE
    5745             :     {
    5746             : 
    5747             :         /* Computing log2(scale) */
    5748        3946 :         IF( j == 0 )
    5749             :         {
    5750          32 :             scale_step = 32767;
    5751          32 :             move16();
    5752             :         }
    5753             :         ELSE
    5754             :         {
    5755        3914 :             e_tmp = norm_l( scale );
    5756        3914 :             f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) );
    5757        3914 :             e_tmp = sub( -1, e_tmp );
    5758        3914 :             L_tmp = Mpy_32_16( e_tmp, f_tmp, MAX_16 ); /* Q16 */
    5759             : 
    5760             :             /* Computing log2(prev_scale) */
    5761        3914 :             e_tmp = norm_l( prev_scale );
    5762        3914 :             f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) );
    5763        3914 :             e_tmp = negate( e_tmp );
    5764        3914 :             L_tmp1 = Mpy_32_16( e_tmp, f_tmp, MAX_16 ); /* Q16 */
    5765             : 
    5766             :             /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */
    5767        3914 :             L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */
    5768             : 
    5769             :             /* Computing 1/j */
    5770        3914 :             exp = norm_s( j );
    5771        3914 :             tmp = div_s( shl( 1, sub( 14, exp ) ), j ); /* Q(29-exp) */
    5772             : 
    5773             :             /* (log2(scale / prev_scale))/length */
    5774        3914 :             L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /* Q(16+29-exp+1-16+exp-14)->Q16 */
    5775             : 
    5776        3914 :             frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
    5777             : 
    5778        3914 :             tmp = extract_l( Pow2( 14, frac ) );
    5779        3914 :             scale_step = shl_o( tmp, exp, &Overflow ); /* Q14 */
    5780             :         }
    5781             :     }
    5782             : 
    5783        4072 :     prev_scale = non_linearity_scaled_copy( input, j, length_half, output, prev_scale, scale_step, en_abs );
    5784             : 
    5785        4072 :     max_val = 0;
    5786        4072 :     move16();
    5787        4072 :     j = shr( length, 1 );
    5788     1307112 :     FOR( i = length_half; i < length; i++ )
    5789             :     {
    5790     1303040 :         tmp = abs_s( input[i] );
    5791     1303040 :         if ( GT_16( tmp, max_val ) )
    5792             :         {
    5793       29068 :             j = i;
    5794       29068 :             move16();
    5795             :         }
    5796     1303040 :         max_val = s_max( max_val, tmp );
    5797             :     }
    5798             : 
    5799        4072 :     IF( GT_16( max_val, shl( 1, Q_inp ) ) )
    5800             :     {
    5801        4068 :         exp = norm_s( max_val );
    5802        4068 :         tmp = div_s( shl( 1, sub( 14, exp ) ), max_val );                                                   /* Q(29-exp-Q_inp) */
    5803        4068 :         scale = L_shl_o( L_mult( 21955 /* 0.67 in Q15 */, tmp ), add( exp, sub( Q_inp, 14 ) ), &Overflow ); /* Q31 */
    5804             :     }
    5805             :     ELSE
    5806             :     {
    5807           4 :         scale = 1438814044;
    5808           4 :         move32(); /* Q31; 0.67 in Q31 */
    5809             :     }
    5810             : 
    5811        4072 :     test();
    5812        4072 :     IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 32 ), scale ) )
    5813             :     {
    5814           0 :         scale_step = 16384;
    5815           0 :         move16();                       /*Q14 */
    5816           0 :         prev_scale = L_shr( scale, 1 ); /*Q30 */
    5817             :     }
    5818             :     ELSE
    5819             :     {
    5820             :         /*scale_step = (float) exp(1.0f / (float) (j - length/2) * (float) log(scale / prev_scale)); */
    5821             :         /* Computing log2(scale) */
    5822        4072 :         IF( EQ_16( j, length_half ) )
    5823             :         {
    5824          44 :             scale_step = 32767;
    5825          44 :             move16(); /*Q14 */
    5826             :         }
    5827             :         ELSE
    5828             :         {
    5829        4028 :             e_tmp = norm_l( scale );
    5830        4028 :             f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) );
    5831        4028 :             e_tmp = sub( -e_tmp, 1 );
    5832        4028 :             L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
    5833             : 
    5834             :             /* Computing log2(prev_scale) */
    5835        4028 :             e_tmp = norm_l( prev_scale );
    5836        4028 :             f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) );
    5837        4028 :             e_tmp = negate( e_tmp );
    5838        4028 :             L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
    5839             : 
    5840             :             /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */
    5841        4028 :             L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */
    5842             : 
    5843             :             /* Computing 1/(j - length/2) */
    5844             : 
    5845        4028 :             tmp = sub( j, length_half );
    5846        4028 :             exp = norm_s( tmp );
    5847             : 
    5848             : 
    5849        4028 :             tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /* Q(29-exp) */
    5850             : 
    5851             :             /* (log2(scale / prev_scale))/length */
    5852        4028 :             L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /*Q(16+29-exp+1-16+exp-14)->Q16 */
    5853             : 
    5854        4028 :             frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
    5855             : 
    5856        4028 :             tmp = extract_l( Pow2( 14, frac ) );
    5857        4028 :             scale_step = shl_o( tmp, exp, &Overflow ); /*Q14 */
    5858             :         }
    5859             :     }
    5860             : 
    5861        4072 :     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 );
    5862             : 
    5863        4072 :     *pPrevScale = prev_scale;
    5864        4072 :     move32();
    5865             : 
    5866             :     /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */
    5867             : 
    5868        4072 :     return;
    5869             : }
    5870             : 
    5871             : 
    5872             : /*==========================================================================*/
    5873             : /* FUNCTION : void non_linearity_ivas_fx() */
    5874             : /*--------------------------------------------------------------------------*/
    5875             : /* PURPOSE : Apply a non linearity to the SHB excitation */
    5876             : /*--------------------------------------------------------------------------*/
    5877             : /* INPUT ARGUMENTS : */
    5878             : /* Word16 input[] i : input signal Q_inp */
    5879             : /* Word16 length i : input length */
    5880             : /*--------------------------------------------------------------------------*/
    5881             : /* OUTPUT ARGUMENTS : */
    5882             : /* Word32 output[] o : output signal 2*Q_inp */
    5883             : /*--------------------------------------------------------------------------*/
    5884             : /* INPUT/OUTPUT ARGUMENTS : */
    5885             : /* Word32 *prev_scale i/o: memory Q30 */
    5886             : /*--------------------------------------------------------------------------*/
    5887             : /* RETURN ARGUMENTS : */
    5888             : /* _ None */
    5889             : /*--------------------------------------------------------------------------*/
    5890             : /* CALLED FROM : */
    5891             : /*==========================================================================*/
    5892             : 
    5893      324167 : void non_linearity_ivas_fx(
    5894             :     const Word16 input[], /* i : input signal Q_inp */
    5895             :     Word32 output[],      /* o : output signal 2*Q_inp */
    5896             :     const Word16 length,  /* i : input length */
    5897             :     Word32 *pPrevScale,   /* i/o: memory Q30 */
    5898             :     Word16 Q_inp,
    5899             :     Word16 coder_type,     /* i  : Coder Type          */
    5900             :     Word16 *voice_factors, /* i  : Voice Factors       */
    5901             :     const Word16 L_frame   /* i  : ACELP frame length  */
    5902             : 
    5903             : )
    5904             : {
    5905             :     Word16 i, j;
    5906      324167 :     Word16 max_val = 0;
    5907      324167 :     move16();
    5908             :     Word32 scale;
    5909             :     Word16 scale_step;
    5910             :     Word16 exp, tmp;
    5911             :     Word16 e_tmp, f_tmp;
    5912             :     Word16 frac;
    5913             :     Word32 L_tmp;
    5914             :     Word32 L_tmp1;
    5915             : 
    5916      324167 :     Word16 en_abs = 0;
    5917      324167 :     Word16 v_fac = 0;
    5918      324167 :     move16();
    5919      324167 :     move16();
    5920             :     Word16 ths;
    5921             :     Word16 nframes;
    5922             :     Word32 prev_scale;
    5923             :     Word16 length_half;
    5924             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
    5925      324167 :     Flag Overflow = 0;
    5926      324167 :     move32();
    5927             : #endif
    5928             : 
    5929             : 
    5930      324167 :     IF( EQ_16( L_frame, L_FRAME16k ) )
    5931             :     {
    5932      153766 :         nframes = 5;
    5933      153766 :         move16();
    5934      153766 :         ths = 17817;
    5935      153766 :         move16(); /* 0.87*5 in Q12 */
    5936             :     }
    5937             :     ELSE
    5938             :     {
    5939      170401 :         nframes = 4;
    5940      170401 :         move16();
    5941      170401 :         ths = 15400;
    5942      170401 :         move16(); /* 0.94*4 in Q12 */
    5943             :     }
    5944             : 
    5945             : 
    5946     1774601 :     FOR( i = 0; i < nframes; i++ )
    5947             :     {
    5948     1450434 :         v_fac = add( v_fac, shr( voice_factors[i], 3 ) ); /* Q12 */
    5949             :     }
    5950             : 
    5951      324167 :     test();
    5952      324167 :     if ( EQ_16( coder_type, VOICED ) && GT_16( v_fac, ths ) )
    5953             :     {
    5954           4 :         en_abs = 1;
    5955           4 :         move16();
    5956             :     }
    5957             : 
    5958      324167 :     length_half = shr( length, 1 );
    5959      324167 :     prev_scale = *pPrevScale;
    5960      324167 :     move32();
    5961             : 
    5962             : 
    5963             :     /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */
    5964             : 
    5965   104057607 :     FOR( i = j = 0; i < length_half; i++ )
    5966             :     {
    5967   103733440 :         tmp = abs_s( input[i] );
    5968   103733440 :         if ( GT_16( tmp, max_val ) )
    5969             :         {
    5970     2280235 :             j = i;
    5971     2280235 :             move16();
    5972             :         }
    5973   103733440 :         max_val = s_max( max_val, tmp );
    5974             :     }
    5975             : 
    5976             : 
    5977      324167 :     IF( GT_16( max_val, shl_sat( 1, Q_inp ) ) )
    5978             :     {
    5979      304515 :         exp = norm_s( max_val );
    5980      304515 :         tmp = div_s( shl( 1, sub( 14, exp ) ), max_val );                    /* Q(29-exp-Q_inp) */
    5981      304515 :         scale = L_shl( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ) ); /* Q31 */
    5982             :     }
    5983             :     ELSE
    5984             :     {
    5985       19652 :         scale = 1438814044;
    5986       19652 :         move32(); /* Q31; 0.67 in Q31 */
    5987             :     }
    5988             : 
    5989      324167 :     test();
    5990      324167 :     IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 64 ) /*Q30 -> Q31*/, scale /*Q31*/ ) )
    5991             :     {
    5992       49972 :         scale_step = 16384;
    5993       49972 :         move16();                       /* Q14 */
    5994       49972 :         prev_scale = L_shr( scale, 1 ); /* Q30 */
    5995             :     }
    5996             :     ELSE
    5997             :     {
    5998             : 
    5999             :         /* Computing log2(scale) */
    6000      274195 :         IF( j == 0 )
    6001             :         {
    6002       17916 :             scale_step = 32767;
    6003       17916 :             move16();
    6004             :         }
    6005             :         ELSE
    6006             :         {
    6007      256279 :             e_tmp = norm_l( scale );
    6008      256279 :             f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) );
    6009      256279 :             e_tmp = sub( -1, e_tmp );
    6010      256279 :             L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
    6011             : 
    6012             :             /* Computing log2(prev_scale) */
    6013      256279 :             e_tmp = norm_l( prev_scale );
    6014      256279 :             f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) );
    6015      256279 :             e_tmp = negate( e_tmp );
    6016      256279 :             L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
    6017             : 
    6018             :             /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */
    6019      256279 :             L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */
    6020             : 
    6021             :             /* Computing 1/j */
    6022      256279 :             exp = norm_s( j );
    6023      256279 :             tmp = div_s( shl( 1, sub( 14, exp ) ), j ); /* Q(29-exp) */
    6024             : 
    6025             :             /* (log2(scale / prev_scale))/length */
    6026      256279 :             L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /* Q(16+29-exp+1-16+exp-14)->Q16 */
    6027             : 
    6028      256279 :             frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
    6029             : 
    6030      256279 :             tmp = extract_l( Pow2( 14, frac ) );
    6031      256279 :             scale_step = shl_o( tmp, exp, &Overflow ); /* Q14 */
    6032             :         }
    6033             :     }
    6034             : 
    6035      324167 :     prev_scale = non_linearity_scaled_copy_ivas( input, j, length_half, output, prev_scale, scale_step, en_abs );
    6036             : 
    6037      324167 :     max_val = 0;
    6038      324167 :     move16();
    6039      324167 :     j = shr( length, 1 );
    6040   104057607 :     FOR( i = length_half; i < length; i++ )
    6041             :     {
    6042   103733440 :         tmp = abs_s( input[i] );
    6043   103733440 :         if ( GT_16( tmp, max_val ) )
    6044             :         {
    6045     2295769 :             j = i;
    6046     2295769 :             move16();
    6047             :         }
    6048   103733440 :         max_val = s_max( max_val, tmp );
    6049             :     }
    6050             : 
    6051      324167 :     IF( GT_16( max_val, shl_sat( 1, Q_inp ) ) )
    6052             :     {
    6053      304186 :         exp = norm_s( max_val );
    6054      304186 :         tmp = div_s( shl( 1, sub( 14, exp ) ), max_val );                                 /* Q(29-exp-Q_inp) */
    6055      304186 :         scale = L_shl_o( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ), &Overflow ); /* Q31 */
    6056             :     }
    6057             :     ELSE
    6058             :     {
    6059       19981 :         scale = 1438814044;
    6060       19981 :         move32(); /* Q31; 0.67 in Q31 */
    6061             :     }
    6062             : 
    6063      324167 :     test();
    6064      324167 :     IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 64 ), scale ) )
    6065             :     {
    6066           0 :         scale_step = 16384;
    6067           0 :         move16();                       /*Q14 */
    6068           0 :         prev_scale = L_shr( scale, 1 ); /*Q30 */
    6069             :     }
    6070             :     ELSE
    6071             :     {
    6072             :         /*scale_step = (float) exp(1.0f / (float) (j - length/2) * (float) log(scale / prev_scale)); */
    6073             :         /* Computing log2(scale) */
    6074      324167 :         IF( EQ_16( j, length_half ) )
    6075             :         {
    6076       20460 :             scale_step = 32767;
    6077       20460 :             move16(); /*Q14 */
    6078             :         }
    6079             :         ELSE
    6080             :         {
    6081      303707 :             e_tmp = norm_l( scale );
    6082      303707 :             f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) );
    6083      303707 :             e_tmp = sub( -e_tmp, 1 );
    6084      303707 :             L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
    6085             : 
    6086             :             /* Computing log2(prev_scale) */
    6087      303707 :             e_tmp = norm_l( prev_scale );
    6088      303707 :             f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) );
    6089      303707 :             e_tmp = negate( e_tmp );
    6090      303707 :             L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
    6091             : 
    6092             :             /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */
    6093      303707 :             L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */
    6094             : 
    6095             :             /* Computing 1/(j - length/2) */
    6096             : 
    6097      303707 :             tmp = sub( j, length_half );
    6098      303707 :             exp = norm_s( tmp );
    6099             : 
    6100             : 
    6101      303707 :             tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /* Q(29-exp) */
    6102             : 
    6103             :             /* (log2(scale / prev_scale))/length */
    6104      303707 :             L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /*Q(16+29-exp+1-16+exp-14)->Q16 */
    6105             : 
    6106      303707 :             frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
    6107             : 
    6108      303707 :             tmp = extract_l( Pow2( 14, frac ) );
    6109      303707 :             scale_step = shl_o( tmp, exp, &Overflow ); /*Q14 */
    6110             :         }
    6111             :     }
    6112             : 
    6113      324167 :     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 );
    6114             : 
    6115      324167 :     *pPrevScale = prev_scale;
    6116      324167 :     move32();
    6117             : 
    6118             :     /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */
    6119             : 
    6120      324167 :     return;
    6121             : }
    6122             : 
    6123             : 
    6124             : /*-------------------------------------------------------------------*
    6125             :  * create_random_vector()
    6126             :  *
    6127             :  * creates random number vector
    6128             :  * Note: the abs(max_val) value coming out of create_random_vector should
    6129             :  *       fit into the precision of Q6.
    6130             :  * -------------------------------------------------------------------*/
    6131             : 
    6132      439114 : void create_random_vector_fx(
    6133             :     Word16 output[],     /* o : output random vector Q5*/
    6134             :     const Word16 length, /* i : length of random vector */
    6135             :     Word16 seed[]        /* i/o: start seed */
    6136             : )
    6137             : {
    6138             :     Word16 i, j, k;
    6139             :     Word16 scale1, scale2;
    6140             :     Word32 L_tmp;
    6141             : 
    6142      439114 :     L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[0] ) ) ); /*Q23 */
    6143      439114 :     j = extract_l( L_shr( L_tmp, 23 ) );
    6144      439114 :     j = s_and( j, 0xff );
    6145             : 
    6146      439114 :     L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[1] ) ) ); /*Q23 */
    6147      439114 :     k = extract_l( L_shr( L_tmp, 23 ) );
    6148      439114 :     k = s_and( k, 0xff );
    6149             : 
    6150      440619 :     WHILE( EQ_16( k, j ) )
    6151             :     {
    6152        1505 :         L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[1] ) ) ); /*Q23 */
    6153        1505 :         k = extract_l( L_shr( L_tmp, 23 ) );
    6154        1505 :         k = s_and( k, 0xff );
    6155             :     }
    6156             : 
    6157      439114 :     scale1 = 18021;
    6158      439114 :     move16(); /* 200.00f * 0.35f/0.1243f; */
    6159      439114 :     if ( Random( &seed[0] ) < 0 )
    6160             :     {
    6161      218547 :         scale1 = -18021;
    6162      218547 :         move16(); /*Q5 */ /* -200.00f * 0.35f/0.1243f; */
    6163             :     }
    6164             : 
    6165      439114 :     scale2 = 7208;
    6166      439114 :     move16(); /* 80.00f * 0.35f/0.1243f; */
    6167      439114 :     if ( Random( &seed[1] ) < 0 )
    6168             :     {
    6169      227334 :         scale2 = -7208;
    6170      227334 :         move16(); /*Q5 */ /* -80.00f * 0.35f/0.1243f; */
    6171             :     }
    6172             : 
    6173    69536554 :     FOR( i = 0; i < length; i++ )
    6174             :     {
    6175    69097440 :         j = s_and( j, 0xff );
    6176    69097440 :         k = s_and( k, 0xff );
    6177    69097440 :         output[i] = round_fx( L_add( L_mult( scale1, gaus_dico_swb_fx[j] ), L_mult( scale2, gaus_dico_swb_fx[k] ) ) ); /*Q5 */
    6178    69097440 :         move16();
    6179    69097440 :         j++;
    6180    69097440 :         k++;
    6181             :     }
    6182             : 
    6183      439114 :     return;
    6184             : }
    6185             : 
    6186             : 
    6187             : /*======================================================================================*/
    6188             : /* FUNCTION : interp_code_5over2_fx() */
    6189             : /*--------------------------------------------------------------------------------------*/
    6190             : /* PURPOSE : Used to interpolate the excitation from the core sample rate */
    6191             : /* of 12.8 kHz to 32 kHz. */
    6192             : /* Simple linear interpolator - No need FOR precision here. */
    6193             : /*--------------------------------------------------------------------------------------*/
    6194             : /* INPUT ARGUMENTS : */
    6195             : /* _ (Word16[]) inp_code_fx : input vector (Q12) */
    6196             : /* _ (Word16) inp_length : length of input vector */
    6197             : /*--------------------------------------------------------------------------------------*/
    6198             : /* OUTPUT ARGUMENTS : */
    6199             : /* _ (Word16[]) interp_code_fx : output vector (Q12) */
    6200             : /*--------------------------------------------------------------------------------------*/
    6201             : /* INPUT/OUTPUT ARGUMENTS : */
    6202             : /* _ None */
    6203             : /*--------------------------------------------------------------------------------------*/
    6204             : 
    6205             : /* _ None */
    6206             : /*--------------------------------------------------------------------------------------*/
    6207             : /* RETURN ARGUMENTS : */
    6208             : /* _ None */
    6209             : /*======================================================================================*/
    6210             : 
    6211      528797 : void interp_code_5over2_fx(
    6212             :     const Word16 inp_code_fx[], /* i : input vector Qx*/
    6213             :     Word16 interp_code_fx[],    /* o : output vector Qx*/
    6214             :     const Word16 inp_length     /* i : length of input vector */
    6215             : )
    6216             : {
    6217             :     Word16 i, kk, kkp1, i_len2;
    6218             :     Word32 Ltemp;
    6219      528797 :     Word16 factor_i_fx[5] = { 6554, 19661, 32767, 19661, 6554 };
    6220      528797 :     move16();
    6221      528797 :     move16();
    6222      528797 :     move16();
    6223      528797 :     move16();
    6224      528797 :     move16();
    6225      528797 :     move16();
    6226      528797 :     Word16 factor_j_fx[5] = { 26214, 13107, 0, 13107, 26214 };
    6227      528797 :     move16();
    6228      528797 :     move16();
    6229      528797 :     move16();
    6230      528797 :     move16();
    6231      528797 :     move16();
    6232      528797 :     interp_code_fx[0] = inp_code_fx[0];
    6233      528797 :     move16(); /* Qx */
    6234             : 
    6235      528797 :     Ltemp = L_mult( inp_code_fx[0], factor_i_fx[3] );       /* Q(16+x) */
    6236      528797 :     Ltemp = L_mac( Ltemp, inp_code_fx[1], factor_j_fx[3] ); /* Q(16+x) */
    6237      528797 :     interp_code_fx[1] = round_fx( Ltemp );                  /*Qx */
    6238      528797 :     move16();
    6239      528797 :     Ltemp = L_mult( inp_code_fx[0], factor_i_fx[4] );       /*Q(16+x) */
    6240      528797 :     Ltemp = L_mac( Ltemp, inp_code_fx[1], factor_j_fx[4] ); /*Q(16+x) */
    6241      528797 :     interp_code_fx[2] = round_fx( Ltemp );                  /* Qx */
    6242      528797 :     move16();
    6243      528797 :     kk = 1;
    6244      528797 :     move16();
    6245      528797 :     kkp1 = 2;
    6246      528797 :     move16();
    6247      528797 :     i = 3;
    6248      528797 :     move16();
    6249             :     /*i_len2 = ( inp_length - 2 ) * HIBND_ACB_L_FAC;  */ /*HIBND_ACB_L_FAC == 5/2 */
    6250      528797 :     i_len2 = sub( inp_length, 2 );
    6251      528797 :     i_len2 = shr( add( shl( i_len2, 2 ), i_len2 ), 1 ); /* rounding below during shr makes it non BE*/
    6252             : 
    6253    20701024 :     FOR( ; i < i_len2; i += 5 )
    6254             :     {
    6255    20172227 :         Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[0] );         /*Q(16+x) */
    6256    20172227 :         Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_i_fx[0] ); /*Q(16+x) */
    6257    20172227 :         interp_code_fx[i] = round_fx( Ltemp );                     /*Qx */
    6258    20172227 :         move16();
    6259    20172227 :         Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[1] );         /*Q(16+x) */
    6260    20172227 :         Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_i_fx[1] ); /*Q(16+x) */
    6261    20172227 :         interp_code_fx[i + 1] = round_fx( Ltemp );                 /*Qx */
    6262    20172227 :         move16();
    6263    20172227 :         Ltemp = L_mult( inp_code_fx[kkp1], factor_i_fx[2] ); /*Q(16+x) */
    6264    20172227 :         interp_code_fx[i + 2] = round_fx( Ltemp );           /*Qx */
    6265    20172227 :         move16();
    6266    20172227 :         kk++;
    6267    20172227 :         kkp1++;
    6268             : 
    6269    20172227 :         Ltemp = L_mult( inp_code_fx[kk], factor_i_fx[3] );         /*Q(16+x) */
    6270    20172227 :         Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_j_fx[3] ); /*Q(16+x) */
    6271    20172227 :         interp_code_fx[i + 3] = round_fx( Ltemp );                 /*Qx */
    6272    20172227 :         move16();
    6273    20172227 :         Ltemp = L_mult( inp_code_fx[kk], factor_i_fx[4] );         /*Q(16+x) */
    6274    20172227 :         Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_j_fx[4] ); /*Q(16+x) */
    6275    20172227 :         interp_code_fx[i + 4] = round_fx( Ltemp );                 /*Qx */
    6276    20172227 :         move16();
    6277    20172227 :         kk++;
    6278    20172227 :         kkp1++;
    6279             :     }
    6280             : 
    6281      528797 :     Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[0] ); /*Q(16+x) */
    6282      528797 :     interp_code_fx[i] = round_fx( Ltemp );             /*Qx */
    6283      528797 :     move16();
    6284      528797 :     Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[1] ); /*Q(16+x) */
    6285      528797 :     interp_code_fx[i + 1] = round_fx( Ltemp );         /*Qx */
    6286      528797 :     move16();
    6287      528797 :     return;
    6288             : }
    6289             : 
    6290             : 
    6291             : /*======================================================================================*/
    6292             : /* FUNCTION : interp_code_4over2_fx() */
    6293             : /*--------------------------------------------------------------------------------------*/
    6294             : /* PURPOSE : Used to interpolate the excitation from the core sample rate */
    6295             : /* of 16 kHz to 32 kHz. */
    6296             : /* Simple linear interpolator - No need for precision here. */
    6297             : /*--------------------------------------------------------------------------------------*/
    6298             : /* INPUT ARGUMENTS : */
    6299             : /* _ (Word16[]) inp_code_fx : input vector (Qx) */
    6300             : /* _ (Word16) inp_length : length of input vector */
    6301             : /*--------------------------------------------------------------------------------------*/
    6302             : /* OUTPUT ARGUMENTS : */
    6303             : /* _ (Word16[]) interp_code_fx : output vector (Qx) */
    6304             : /*--------------------------------------------------------------------------------------*/
    6305             : /* INPUT/OUTPUT ARGUMENTS : */
    6306             : /* _ None */
    6307             : /*--------------------------------------------------------------------------------------*/
    6308             : 
    6309             : /* _ None */
    6310             : /*--------------------------------------------------------------------------------------*/
    6311             : /* RETURN ARGUMENTS : */
    6312             : /* _ None */
    6313             : /*======================================================================================*/
    6314             : 
    6315      718684 : void interp_code_4over2_fx(
    6316             :     const Word16 inp_code_fx[], /* i : input vector Qx*/
    6317             :     Word16 interp_code_fx[],    /* o : output vector Qx*/
    6318             :     const Word16 inp_length     /* i : length of input vector */
    6319             : )
    6320             : {
    6321             :     Word16 i, j;
    6322      718684 :     j = 0;
    6323      718684 :     move16();
    6324    51579648 :     FOR( i = 0; i < inp_length - 1; i++ )
    6325             :     {
    6326    50860964 :         interp_code_fx[j] = inp_code_fx[i];
    6327    50860964 :         move16(); /*Qx */
    6328    50860964 :         interp_code_fx[j + 1] = add( shr( inp_code_fx[i], 1 ), shr( inp_code_fx[i + 1], 1 ) );
    6329    50860964 :         move16();
    6330    50860964 :         move16(); /*Qx */
    6331    50860964 :         j = add( j, 2 );
    6332             :     }
    6333             : 
    6334      718684 :     interp_code_fx[j] = inp_code_fx[i];
    6335      718684 :     move16();
    6336      718684 :     interp_code_fx[j + 1] = shr( inp_code_fx[i], 1 );
    6337      718684 :     move16(); /*Qx */
    6338             : 
    6339      718684 :     return;
    6340             : }
    6341             : 
    6342             : 
    6343             : /*-------------------------------------------------------------------*
    6344             :  * wb_tbe_extras_reset_synth()
    6345             :  *
    6346             :  * Reset the extra parameters only required for WB TBE synthesis
    6347             :  *-------------------------------------------------------------------*/
    6348             : 
    6349        9902 : void wb_tbe_extras_reset_synth_fx(
    6350             :     Word16 state_lsyn_filt_shb[],
    6351             :     Word16 state_lsyn_filt_dwn_shb[],
    6352             :     Word16 state_32and48k_WB_upsample[],
    6353             :     Word16 state_resamp_HB[] )
    6354             : {
    6355        9902 :     set16_fx( state_lsyn_filt_shb, 0, 2 * ALLPASSSECTIONS_STEEP );
    6356        9902 :     set16_fx( state_lsyn_filt_dwn_shb, 0, 2 * ALLPASSSECTIONS_STEEP );
    6357        9902 :     set16_fx( state_32and48k_WB_upsample, 0, 2 * ALLPASSSECTIONS_STEEP );
    6358        9902 :     set16_fx( state_resamp_HB, 0, INTERP_3_1_MEM_LEN );
    6359             : 
    6360        9902 :     return;
    6361             : }
    6362             : 
    6363             : /*-------------------------------------------------------------------*
    6364             :  * elliptic_bpf_48k_generic()
    6365             :  *
    6366             :  * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz
    6367             :  * Implemented as 3 fourth order sections cascaded.
    6368             :  *-------------------------------------------------------------------*/
    6369             : 
    6370       78301 : void elliptic_bpf_48k_generic_fx(
    6371             :     const int16_t element_mode,
    6372             :     Word16 IsUpsampled3,
    6373             :     Word16 input_fx[], /* i  : input signal                             Q_input_fx*/
    6374             :     Word16 *Q_input_fx,
    6375             :     Word16 output_fx[],     /* o  : output signal                              memory_fx_Q */
    6376             :     Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory                    */
    6377             :     Word16 memory_fx_Q[],
    6378             :     const Word16 full_band_bpf_fx[][5] /* i  : filter coefficients b0,b1,b2,a0,a1,a2  Q13  */
    6379             : )
    6380             : {
    6381             :     Word16 i, j;
    6382             :     Word16 memory_fx0, Q_temp, Q_temp2;
    6383             :     Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX;
    6384             :     Word32 L_tmpMax;
    6385             :     Word64 W_tmpX;
    6386             :     Word64 W_tmpY;
    6387             : 
    6388       78301 :     Word32 *L_tmp = &L_tmp_buffer[4];
    6389       78301 :     Word32 *L_tmp2 = &L_tmp2_buffer[4];
    6390       78301 :     Word32 *L_output = &L_output_buffer[4];
    6391             : 
    6392      391505 :     FOR( i = 0; i < 4; i++ )
    6393             :     {
    6394      313204 :         memory_fx0 = extract_l( memory_fx2[0][i] );
    6395      313204 :         input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) );
    6396      313204 :         L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) );
    6397      313204 :         L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) );
    6398             :         // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) );
    6399      313204 :         move32();
    6400      313204 :         move32();
    6401      313204 :         move32();
    6402      313204 :         move32();
    6403      313204 :         move32();
    6404             :     }
    6405             : 
    6406       78301 :     L_tmpMax = L_add( 0, 0 );
    6407       78301 :     IF( !IsUpsampled3 )
    6408             :     {
    6409       43782 :         IF( element_mode )
    6410             :         {
    6411    42074502 :             FOR( i = 0; i < L_FRAME48k; i++ )
    6412             :             {
    6413             :                 /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/
    6414    42030720 :                 W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] );
    6415    42030720 :                 W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] );
    6416    42030720 :                 W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] );
    6417    42030720 :                 W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] );
    6418    42030720 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] );
    6419    42030720 :                 W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] );
    6420    42030720 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] );
    6421    42030720 :                 W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] );
    6422    42030720 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] );
    6423    42030720 :                 L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/
    6424    42030720 :                 move32();
    6425             :             }
    6426             :         }
    6427             :         ELSE
    6428             :         {
    6429           0 :             FOR( i = 0; i < L_FRAME48k; i++ )
    6430             :             {
    6431           0 :                 L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 );                             /*Q_input_fx + 13 + 1 - 3*/
    6432           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*/
    6433           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*/
    6434           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*/
    6435           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*/
    6436           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*/
    6437           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*/
    6438           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*/
    6439           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*/
    6440           0 :                 move32();
    6441             :             }
    6442             :         }
    6443             :     } /*IsUpsampled3*/
    6444             :     ELSE
    6445             :     {
    6446       34519 :         IF( element_mode )
    6447             :         {
    6448    11080599 :             FOR( i = 0; i < L_FRAME48k; )
    6449             :             {
    6450    11046080 :                 W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] );
    6451    11046080 :                 W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] );
    6452    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] );
    6453    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] );
    6454    11046080 :                 W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] );
    6455    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] );
    6456    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*/
    6457    11046080 :                 move32();
    6458    11046080 :                 i++;
    6459             : 
    6460    11046080 :                 W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] );
    6461    11046080 :                 W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] );
    6462    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] );
    6463    11046080 :                 W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] );
    6464    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] );
    6465    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] );
    6466    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*/
    6467    11046080 :                 move32();
    6468    11046080 :                 i++;
    6469             : 
    6470    11046080 :                 W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] );
    6471    11046080 :                 W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] );
    6472    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] );
    6473    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] );
    6474    11046080 :                 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] );
    6475    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*/
    6476    11046080 :                 move32();
    6477    11046080 :                 i++;
    6478             :             }
    6479             :         }
    6480             :         ELSE
    6481             :         {
    6482           0 :             FOR( i = 0; i < L_FRAME48k; )
    6483             :             {
    6484           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*/
    6485           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*/
    6486           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*/
    6487           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*/
    6488           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*/
    6489           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*/
    6490           0 :                 move32();
    6491           0 :                 i++;
    6492             : 
    6493           0 :                 L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 );                             /*Q_input_fx + 13 + 1 - 3*/
    6494           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*/
    6495           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*/
    6496           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*/
    6497           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*/
    6498           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*/
    6499           0 :                 move32();
    6500           0 :                 i++;
    6501             : 
    6502           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*/
    6503           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*/
    6504           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*/
    6505           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*/
    6506           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*/
    6507           0 :                 move32();
    6508           0 :                 i++;
    6509             :             }
    6510             :         }
    6511             : 
    6512             :     } /*IsUpsampled3*/
    6513             : 
    6514             : 
    6515       78301 :     memory_fx2[0][0] = input_fx[L_FRAME48k - 4];
    6516       78301 :     memory_fx2[0][1] = input_fx[L_FRAME48k - 3];
    6517       78301 :     memory_fx2[0][2] = input_fx[L_FRAME48k - 2];
    6518       78301 :     memory_fx2[0][3] = input_fx[L_FRAME48k - 1];
    6519       78301 :     move32();
    6520       78301 :     move32();
    6521       78301 :     move32();
    6522       78301 :     move32();
    6523       78301 :     move32();
    6524             : 
    6525       78301 :     L_tmpMax = L_add( 0, 0 );
    6526       78301 :     IF( element_mode )
    6527             :     {
    6528    75247261 :         FOR( i = 0; i < L_FRAME48k; i++ )
    6529             :         {
    6530    75168960 :             W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] );
    6531    75168960 :             W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] );
    6532    75168960 :             W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] );
    6533    75168960 :             W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] );
    6534    75168960 :             W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] );
    6535    75168960 :             W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] );
    6536    75168960 :             W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] );
    6537    75168960 :             W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] );
    6538    75168960 :             W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] );
    6539    75168960 :             L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) );
    6540    75168960 :             move32();
    6541    75168960 :             L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) );
    6542             :         }
    6543             :     }
    6544             :     ELSE
    6545             :     {
    6546           0 :         FOR( i = 0; i < L_FRAME48k; i++ )
    6547             :         {
    6548           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*/
    6549           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*/
    6550           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 */
    6551           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*/
    6552           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 */
    6553           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*/
    6554           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 */
    6555           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*/
    6556           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 */
    6557           0 :             move32();
    6558           0 :             L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) );
    6559             :         }
    6560             :     }
    6561             : 
    6562             : 
    6563       78301 :     Q_temp = norm_l( L_tmpMax );
    6564       78301 :     Q_temp = sub( Q_temp, 4 );
    6565       78301 :     Scale_sig32( L_tmp2, 960, Q_temp );
    6566             : 
    6567       78301 :     memory_fx2[1][0] = L_tmp[L_FRAME48k - 4];
    6568       78301 :     memory_fx2[1][1] = L_tmp[L_FRAME48k - 3];
    6569       78301 :     memory_fx2[1][2] = L_tmp[L_FRAME48k - 2];
    6570       78301 :     memory_fx2[1][3] = L_tmp[L_FRAME48k - 1];
    6571       78301 :     move32();
    6572       78301 :     move32();
    6573       78301 :     move32();
    6574       78301 :     move32();
    6575       78301 :     move32();
    6576      391505 :     FOR( j = 0; j < 4; j++ )
    6577             :     {
    6578      313204 :         L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) );
    6579      313204 :         L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) );
    6580      313204 :         move32();
    6581      313204 :         move32();
    6582      313204 :         move32();
    6583             :     }
    6584       78301 :     L_tmpMax = L_add( 0, 0 );
    6585       78301 :     IF( element_mode )
    6586             :     {
    6587    75247261 :         FOR( i = 0; i < L_FRAME48k; i++ )
    6588             :         {
    6589    75168960 :             W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] );
    6590    75168960 :             W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] );
    6591    75168960 :             W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] );
    6592    75168960 :             W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] );
    6593    75168960 :             W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] );
    6594    75168960 :             W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] );
    6595    75168960 :             W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] );
    6596    75168960 :             W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] );
    6597    75168960 :             W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] );
    6598    75168960 :             L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) );
    6599    75168960 :             move32();
    6600    75168960 :             L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) );
    6601             :         }
    6602             :     }
    6603             :     ELSE
    6604             :     {
    6605           0 :         FOR( i = 0; i < L_FRAME48k; i++ )
    6606             :         {
    6607           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 */
    6608           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*/
    6609           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*/
    6610             : 
    6611           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*/
    6612           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*/
    6613             : 
    6614           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*/
    6615           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*/
    6616             : 
    6617           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*/
    6618           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*/
    6619           0 :             move32();
    6620           0 :             L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) );
    6621             :         }
    6622             :     }
    6623             : 
    6624             : 
    6625       78301 :     memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4];
    6626       78301 :     memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3];
    6627       78301 :     memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2];
    6628       78301 :     memory_fx2[2][3] = L_tmp2[L_FRAME48k - 1];
    6629       78301 :     memory_fx2[3][0] = L_output[L_FRAME48k - 4];
    6630       78301 :     memory_fx2[3][1] = L_output[L_FRAME48k - 3];
    6631       78301 :     memory_fx2[3][2] = L_output[L_FRAME48k - 2];
    6632       78301 :     memory_fx2[3][3] = L_output[L_FRAME48k - 1];
    6633       78301 :     move32();
    6634       78301 :     move32();
    6635       78301 :     move32();
    6636       78301 :     move32();
    6637       78301 :     move32();
    6638       78301 :     move32();
    6639       78301 :     move32();
    6640       78301 :     move32();
    6641       78301 :     move32();
    6642       78301 :     memory_fx_Q[0] = *Q_input_fx;
    6643       78301 :     memory_fx_Q[1] = add( *Q_input_fx, 11 );
    6644       78301 :     memory_fx_Q[2] = add( add( *Q_input_fx, 6 ), Q_temp );
    6645       78301 :     memory_fx_Q[3] = add( add( *Q_input_fx, 1 ), Q_temp );
    6646       78301 :     move16();
    6647       78301 :     move16();
    6648       78301 :     move16();
    6649       78301 :     move16();
    6650       78301 :     Q_temp2 = norm_l( L_tmpMax );
    6651       78301 :     Scale_sig32( L_output, 960, Q_temp2 );
    6652    75247261 :     FOR( i = 0; i < 960; i++ )
    6653             :     {
    6654    75168960 :         output_fx[i] = extract_h( L_output[i] );
    6655    75168960 :         move16();
    6656             :     }
    6657       78301 :     *Q_input_fx = sub( add( add( *Q_input_fx, Q_temp ), Q_temp2 ), 15 );
    6658       78301 :     move16(); /* BASOP_NOGLOB */
    6659             : 
    6660       78301 :     return;
    6661             : }
    6662             : /*-------------------------------------------------------------------*
    6663             :  * synthesise_fb_high_band()
    6664             :  *
    6665             :  * Creates the highband output for full band  - 14.0 to 20 kHz
    6666             :  * Using the energy shaped white excitation signal from the SWB BWE.
    6667             :  * The excitation signal input is sampled at 16kHz and so is upsampled
    6668             :  * to 48 kHz first.
    6669             :  * Uses a complementary split filter to code the two regions from
    6670             :  * 14kHz to 16kHz and 16 kHz to 20 kHz.
    6671             :  * One of 16 tilt filters is also applied afterwards to further
    6672             :  * refine the spectral shape of the fullband signal.
    6673             :  * The tilt is specified in dB per kHz. N.B. Only negative values are
    6674             :  * accomodated.
    6675             :  *-------------------------------------------------------------------*/
    6676             : 
    6677       34519 : void synthesise_fb_high_band_fx(
    6678             :     const Word16 excitation_in[], /* i  : full band excitation                                */
    6679             :     Word16 Q_fb_exc,
    6680             :     Word16 output[],            /* o  : high band speech - 14.0 to 20 kHz                   */
    6681             :     const Word32 fb_exc_energy, /* i  : full band excitation energy                         */
    6682             :     const Word16 ratio,         /* i  : energy ratio                                            */
    6683             :     const Word16 L_frame,       /* i  : ACELP frame length                                  */
    6684             :     const Word16 bfi,           /* i  : fec flag                                                        */
    6685             :     Word16 *prev_fbbwe_ratio,   /* o  : previous frame energy for FEC                       */
    6686             :     Word32 bpf_memory[][4],     /* i/o: memory for elliptic bpf 48k                         */
    6687             :     Word16 bpf_memory_Q[],
    6688             :     Word16 Qout,
    6689             :     int16_t element_mode )
    6690             : {
    6691             :     Word16 i, j;
    6692             :     Word16 excitation_in_interp3_buffer[L_FRAME48k + 4];
    6693       34519 :     Word16 *excitation_in_interp3 = &excitation_in_interp3_buffer[0] + 4;
    6694             :     Word16 tmp[L_FRAME48k];
    6695             :     Word32 temp1;
    6696             :     Word32 ratio2;
    6697             :     Word32 L_tmp;
    6698             :     Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp;
    6699             : 
    6700             :     /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */
    6701       34519 :     j = 0;
    6702             :     /* white excitation from DC to 8 kHz resampled to produce DC to 24 kHz excitation.          */
    6703    11080599 :     FOR( i = 0; i < L_FRAME48k; i += 3 )
    6704             :     {
    6705    11046080 :         excitation_in_interp3[i] = mult( excitation_in[j], 24576 ); /* Q(Q_fb_exc+13-15 = Q_fb_exc-2) */
    6706    11046080 :         move16();
    6707    11046080 :         excitation_in_interp3[i + 1] = 0;
    6708    11046080 :         move16();
    6709    11046080 :         excitation_in_interp3[i + 2] = 0;
    6710    11046080 :         move16();
    6711    11046080 :         j++;
    6712             :     }
    6713       34519 :     exp_tmp = sub( Q_fb_exc, 2 );
    6714             : 
    6715       34519 :     IF( EQ_16( L_frame, L_FRAME16k ) )
    6716             :     {
    6717             :         /* for 16kHz ACELP core */
    6718       26953 :         elliptic_bpf_48k_generic_fx(
    6719             :             element_mode,
    6720             :             1, // IsUpsampled3
    6721             :             excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx
    6722             : 
    6723             :         );
    6724             :     }
    6725             :     ELSE
    6726             :     {
    6727             :         /* for 12.8kHz ACELP core */
    6728        7566 :         elliptic_bpf_48k_generic_fx(
    6729             :             element_mode,
    6730             :             1, // IsUpsampled3
    6731             :             excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx );
    6732             :     }
    6733             :     /* temp1 = sum2_f( tmp, L_FRAME48k ) + 0.001f */
    6734       34519 :     temp1 = sum2_fx_mod( tmp, L_FRAME48k );
    6735             : 
    6736       34519 :     L_tmp = L_max( 1, fb_exc_energy ); /*Q(2*Q_fb_exc + 1)*/
    6737       34519 :     exp = norm_l( L_tmp );
    6738       34519 :     tmp3 = extract_h( L_shl( L_tmp, exp ) );
    6739       34519 :     tmp1 = sub( add( Q_fb_exc, Q_fb_exc ), 8 ); /* 1-9*/
    6740       34519 :     exp = sub( sub( 31, tmp1 ), exp );
    6741             : 
    6742       34519 :     IF( element_mode != EVS_MONO )
    6743             :     {
    6744             :         Word16 sft, t_Q;
    6745       34519 :         Word64 P_ONE = 33; /* 0.001f in Q15 */
    6746       34519 :         move64();
    6747             :         Word64 W_temp;
    6748             : 
    6749       34519 :         t_Q = sub( shl( exp_tmp, 1 ), 8 );
    6750       34519 :         P_ONE = W_shl( P_ONE, sub( t_Q, 15 ) );
    6751             : 
    6752       34519 :         W_temp = W_add( P_ONE, temp1 );
    6753             : 
    6754       34519 :         sft = W_norm( W_temp );
    6755       34519 :         W_temp = W_shl( W_temp, sft );
    6756             : 
    6757       34519 :         temp1 = W_extract_h( W_temp );
    6758       34519 :         t_Q = sub( add( t_Q, sft ), 32 );
    6759             : 
    6760       34519 :         tmp2 = extract_h( temp1 );
    6761       34519 :         exp2 = sub( 31, t_Q );
    6762             :     }
    6763             :     ELSE
    6764             :     {
    6765           0 :         exp2 = norm_l( temp1 );
    6766           0 :         tmp2 = extract_h( L_shl( temp1, exp2 ) );
    6767           0 :         exp2 = sub( sub( 31, sub( shl( exp_tmp, 1 ), 8 ) ), exp2 ); /* in Q15 (temp1 in Q9)*/
    6768             :     }
    6769             : 
    6770       34519 :     exp = sub( exp2, exp ); /* Denormalize and substract */
    6771       34519 :     IF( GT_16( tmp2, tmp3 ) )
    6772             :     {
    6773       15349 :         tmp2 = shr( tmp2, 1 );
    6774       15349 :         exp = add( exp, 1 );
    6775             :     }
    6776       34519 :     IF( 0 != tmp3 )
    6777             :     {
    6778       34519 :         tmp3 = div_s( tmp2, tmp3 );
    6779       34519 :         L_tmp = L_deposit_h( tmp3 );
    6780       34519 :         L_tmp = Isqrt_lc( L_tmp, &exp );     /*Q(31-exp)*/
    6781       34519 :         ratio2 = Mult_32_16( L_tmp, ratio ); /*Q(31-exp+0-15 = 16-exp)*/
    6782             :     }
    6783             :     ELSE
    6784             :     {
    6785           0 :         ratio2 = 0;
    6786             :     }
    6787             : 
    6788       34519 :     IF( !bfi )
    6789             :     {
    6790       33762 :         *prev_fbbwe_ratio = ratio;
    6791       33762 :         move16();
    6792             :     }
    6793             :     ELSE
    6794             :     {
    6795             :         /**prev_fbbwe_ratio = ratio*0.5f;*/
    6796         757 :         *prev_fbbwe_ratio = shr( ratio, 1 );
    6797         757 :         move16();
    6798             :     }
    6799       34519 :     tmp3 = add( sub( Qout, add( sub( 1, exp ), exp_tmp ) ), 16 ); /*Qout - (1 -exp +exp_tmp) + 16 */
    6800    33172759 :     FOR( i = 0; i < L_FRAME48k; i++ )
    6801             :     {
    6802    33138240 :         L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */
    6803    33138240 :         IF( L_tmp < 0 )
    6804             :         {
    6805    16397958 :             output[i] = negate( extract_h( L_shl_sat( L_negate( L_tmp ), tmp3 ) ) ); /*Qout*/
    6806    16397958 :             move16();
    6807             :         }
    6808             :         ELSE
    6809             :         {
    6810    16740282 :             output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/
    6811    16740282 :             move16();
    6812             :         }
    6813             :     }
    6814       34519 :     return;
    6815             : }
    6816             : 
    6817             : /*-------------------------------------------------------------------*
    6818             :  * Estimate_mix_factors_fx()                                         *
    6819             :  *                                                                   *
    6820             :  * Estimate mix factors for SHB excitation generation                *
    6821             :  *-------------------------------------------------------------------*/
    6822       25669 : void Estimate_mix_factors_fx(
    6823             :     const Word16 *shb_res, /* i  : SHB LP residual in Q = Q_shb */
    6824             :     const Word16 Q_shb,
    6825             :     const Word16 *exc16kWhtnd, /* i  : SHB transformed low band excitation Q_bwe_exc */
    6826             :     const Word16 Q_bwe_exc,
    6827             :     const Word16 *White_exc16k_frac, /* i  : Modulated envelope shaped white noise Q_frac */
    6828             :     const Word16 Q_frac,
    6829             :     const Word32 pow1, /* i  : SHB exc. power for normalization in Q_pow1 */
    6830             :     const Word16 Q_pow1,
    6831             :     const Word32 pow22, /* i  : White noise excitation for normalization in Q_pow22 */
    6832             :     const Word16 Q_pow22,
    6833             :     Word16 *vf_modified, /* o  : Estimated voice factors */
    6834             :     Word16 *vf_ind       /* o  : voice factors VQ index */
    6835             : )
    6836             : {
    6837             :     Word16 shb_res_local[L_FRAME16k], WN_exc_local[L_FRAME16k];
    6838             :     Word32 pow3, temp_p1_p2, temp_p1_p3;
    6839             :     Word16 temp_numer1[L_FRAME16k], temp_numer2[L_FRAME16k];
    6840             :     Word16 i, length;
    6841             :     Word16 exp1, exp2, expa, expb, fraca, fracb, scale, num_flag, den_flag;
    6842             :     Word16 tmp, tmp1, sc1, sc2;
    6843             :     Word32 L_tmp1, L_tmp2;
    6844             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
    6845       25669 :     Flag Overflow = 0;
    6846       25669 :     move32();
    6847             : #endif
    6848             : 
    6849       25669 :     Copy( shb_res, shb_res_local, L_FRAME16k );
    6850       25669 :     Copy( White_exc16k_frac, WN_exc_local, L_FRAME16k );
    6851             :     /* WN_exc_local    in (Q_frac) */
    6852             : 
    6853       25669 :     pow3 = Dot_product( shb_res_local, shb_res_local, L_FRAME16k ); /* (2*Q_shb+1) */
    6854             : 
    6855       25669 :     pow3 = L_add( pow3, L_shl( 21475l /*0.00001f in Q31*/, 2 * Q_shb + 1 - 31 ) ); /* (2*Q_shb+1) */
    6856       25669 :     if ( pow3 == 0 )
    6857             :     {
    6858           0 :         pow3 = 1;
    6859           0 :         move32();
    6860             :     }
    6861             : 
    6862             :     /* temp_p1_p2 = (float)sqrt(pow1/pow2); */
    6863       25669 :     temp_p1_p2 = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp1 ); /* temp_p1_p3 in (Q31+exp1) */
    6864             : 
    6865             :     /* temp_p1_p3 = (float)sqrt(pow1/pow3); */
    6866       25669 :     temp_p1_p3 = root_a_over_b_fx( pow1, Q_pow1, pow3, ( 2 * Q_shb + 1 ), &exp2 ); /* temp_p1_p3 in (Q31+exp2) */
    6867             : 
    6868             : 
    6869       25669 :     sc1 = sub( Q_bwe_exc, sub( Q_frac, exp1 ) );
    6870       25669 :     sc2 = sub( Q_bwe_exc, sub( Q_shb, exp2 ) );
    6871     8239749 :     FOR( i = 0; i < L_FRAME16k; i++ )
    6872             :     {
    6873     8214080 :         L_tmp1 = Mult_32_16( temp_p1_p2, WN_exc_local[i] ); /* (Q_frac - exp1) +16 */
    6874     8214080 :         WN_exc_local[i] = round_fx( L_tmp1 );
    6875     8214080 :         move16();
    6876     8214080 :         L_tmp2 = Mult_32_16( temp_p1_p3, shb_res_local[i] ); /* (Q_shb - exp2) +16 */
    6877     8214080 :         shb_res_local[i] = round_fx( L_tmp2 );
    6878     8214080 :         move16();
    6879             :         /* temp_numer1[i] = sub(shb_res_local[i], WN_exc_local[i]); */
    6880     8214080 :         temp_numer1[i] = round_fx_sat( L_sub_sat( L_shl_sat( L_tmp2, sc2 ), L_shl_sat( L_tmp1, sc1 ) ) );
    6881     8214080 :         move16();
    6882             :         /* (Q_bwe_exc) */
    6883             : 
    6884             :         /* temp_numer2[i] = sub(exc16kWhtnd[i], WN_exc_local[i]); */
    6885     8214080 :         temp_numer2[i] = sub_sat( exc16kWhtnd[i], round_fx_sat( L_shl_sat( L_tmp1, sc1 ) ) );
    6886     8214080 :         move16();
    6887             :         /* (Q_bwe_exc) */
    6888             :     }
    6889             : 
    6890             : 
    6891       25669 :     length = L_FRAME16k;
    6892       25669 :     move16();
    6893       25669 :     temp_p1_p2 = Dot_product( temp_numer1, temp_numer2, length ); /* 2*(Q_bwe_exc)+1 */
    6894       25669 :     temp_p1_p3 = Dot_product( temp_numer2, temp_numer2, length ); /* 2*(Q_bwe_exc)+1 */
    6895             : 
    6896             :     /* vf_modified[i] = min( max_val( (temp_p1_p2 / temp_p1_p3), 0.1f), 0.99f); */
    6897             :     /* tmp = (temp_p1_p2 / temp_p1_p3); */
    6898       25669 :     IF( temp_p1_p3 > 0 )
    6899             :     {
    6900       25669 :         expa = norm_l( temp_p1_p3 );
    6901       25669 :         fraca = extract_h( L_shl( temp_p1_p3, expa ) );
    6902       25669 :         expa = sub( 30, expa );
    6903             : 
    6904       25669 :         expb = norm_l( temp_p1_p2 );
    6905       25669 :         fracb = round_fx_o( L_shl_o( temp_p1_p2, expb, &Overflow ), &Overflow );
    6906       25669 :         expb = sub( 30, expb );
    6907             : 
    6908       25669 :         num_flag = 0;
    6909       25669 :         move16();
    6910       25669 :         IF( fraca < 0 )
    6911             :         {
    6912           0 :             num_flag = 1;
    6913           0 :             move16();
    6914           0 :             fraca = negate( fraca );
    6915             :         }
    6916             : 
    6917       25669 :         den_flag = 0;
    6918       25669 :         move16();
    6919       25669 :         IF( fracb < 0 )
    6920             :         {
    6921           0 :             den_flag = 1;
    6922           0 :             move16();
    6923           0 :             fracb = negate( fracb );
    6924             :         }
    6925             : 
    6926       25669 :         scale = shr( sub( fraca, fracb ), 15 );
    6927       25669 :         fracb = shl( fracb, scale );
    6928       25669 :         expb = sub( expb, scale );
    6929             : 
    6930       25669 :         tmp = div_s( fracb, fraca );
    6931       25669 :         exp1 = sub( expb, expa );
    6932       25669 :         tmp = shl_sat( tmp, exp1 );
    6933       25669 :         if ( NE_16( num_flag, den_flag ) )
    6934             :         {
    6935           0 :             tmp = negate( tmp );
    6936             :         }
    6937             :     }
    6938             :     ELSE
    6939             :     {
    6940           0 :         tmp = 0;
    6941           0 :         move16();
    6942             :     }
    6943             : 
    6944       25669 :     vf_modified[0] = s_min( s_max( tmp, 3277 /* 0.1f in Q15*/ ), 32440 /* 0.99f in Q15 */ );
    6945       25669 :     move16();
    6946             : 
    6947       25669 :     *vf_ind = usquant_fx( vf_modified[0], &tmp1, 4096 /* 0.125 in Q15 */, 2048 /* 0.125 in Q14 */, shl( 1, NUM_BITS_SHB_VF ) );
    6948       25669 :     move16();
    6949             : 
    6950       25669 :     vf_modified[0] = tmp1;
    6951       25669 :     move16();
    6952       25669 :     vf_modified[1] = tmp1;
    6953       25669 :     move16();
    6954       25669 :     vf_modified[2] = tmp1;
    6955       25669 :     move16();
    6956       25669 :     vf_modified[3] = tmp1;
    6957       25669 :     move16();
    6958       25669 :     vf_modified[4] = tmp1;
    6959       25669 :     move16();
    6960             : 
    6961             :     /* vf_modified in Q15 */
    6962             : 
    6963       25669 :     return;
    6964             : }
    6965             : 
    6966             : /*======================================================================================*/
    6967             : /* FUNCTION : prep_tbe_exc_fx() */
    6968             : /*--------------------------------------------------------------------------------------*/
    6969             : /* PURPOSE : Prepare TBE excitation */
    6970             : /*--------------------------------------------------------------------------------------*/
    6971             : /* INPUT ARGUMENTS : */
    6972             : /* _ (Word16) L_frame_fx : length of the frame */
    6973             : /* _ (Word16) i_subfr_fx : subframe index */
    6974             : /* _ (Word16) gain_pit_fx : Pitch gain (14) */
    6975             : /* _ (Word32) gain_code_fx : algebraic codebook gain (Q(16+Q_exc)) */
    6976             : /* _ (Word16*[]) code_fx : algebraic excitation (Q9) */
    6977             : /* _ (Word16) voice_fac_fx : voicing factor (Q15) */
    6978             : /* _ (Word16) gain_preQ_fx : prequantizer excitation gain */
    6979             : /* _ (Word16[]) code_preQ_fx : prequantizer excitation */
    6980             : /*--------------------------------------------------------------------------------------*/
    6981             : /* OUTPUT ARGUMENTS : */
    6982             : /* _ (Word16*[]) voice_factors_fx : TBE voicing factor (Q15) */
    6983             : /*--------------------------------------------------------------------------------------*/
    6984             : /* INPUT/OUTPUT ARGUMENTS : */
    6985             : /* _ (Word16[]) bwe_exc_fx : excitation for TBE (Q_exc) */
    6986             : /*--------------------------------------------------------------------------------------*/
    6987             : /* _ None */
    6988             : /*--------------------------------------------------------------------------------------*/
    6989             : /* RETURN ARGUMENTS : */
    6990             : /* _ None */
    6991             : /*======================================================================================*/
    6992             : 
    6993     1146673 : void prep_tbe_exc_fx(
    6994             :     const Word16 L_frame_fx,     /* i  : length of the frame                    */
    6995             :     const Word16 L_subfr,        /* i  : subframe length                        */
    6996             :     const Word16 i_subfr_fx,     /* i  : subframe index                         */
    6997             :     const Word16 gain_pit_fx,    /* i  : Pitch gain                          Q14*/
    6998             :     const Word32 gain_code_fx,   /* i  : algebraic codebook gain        16+Q_exc*/
    6999             :     const Word16 code_fx[],      /* i  : algebraic excitation                 Q9*/
    7000             :     const Word16 voice_fac_fx,   /* i  : voicing factor                      Q15*/
    7001             :     Word16 *voice_factors_fx,    /* o  : TBE voicing factor                  Q15*/
    7002             :     Word16 bwe_exc_fx[],         /* i/o: excitation for TBE                Q_exc*/
    7003             :     const Word16 gain_preQ_fx,   /* i  : prequantizer excitation gain           */
    7004             :     const Word16 code_preQ_fx[], /* i  : prequantizer excitation                */
    7005             :     const Word16 Q_exc,          /* i  : Excitation,           bwe_exc Q-factor */
    7006             :     const Word16 T0,             /* i  : integer pitch variables             Q0 */
    7007             :     const Word16 T0_frac,        /* i  : Fractional pitch variables           Q0*/
    7008             :     const Word16 coder_type,     /* i  : coding type                            */
    7009             :     const Word32 core_brate,     /* i  : core bitrate                           */
    7010             :     const Word16 element_mode,   /* i  : element mode                           */
    7011             :     const Word16 idchan,         /* i  : channel ID                             */
    7012             :     const Word16 flag_TD_BWE,    /* i  : flag indicating whether hTD_BWE exists */
    7013             :     const Word16 tdm_LRTD_flag   /* i  : LRTD stereo mode flag                  */
    7014             : 
    7015             : )
    7016             : {
    7017             :     Word16 i;
    7018             :     Word16 tmp_code_fx[2 * L_SUBFR * HIBND_ACB_L_FAC];
    7019             :     Word16 tmp_code_preInt_fx[L_SUBFR];
    7020     1146673 :     Word16 gain_code16 = 0;
    7021     1146673 :     move16();
    7022             :     Word16 tmp /*, tmp1, tmp2*/;
    7023             :     /*Word16 random_code[L_SUBFR * HIBND_ACB_L_FAC];*/
    7024             :     Word16 pitch;
    7025             : 
    7026             :     Word32 L_tmp, Ltemp1, Ltemp2;
    7027             :     Word32 tempQ31;
    7028             :     Word16 tempQ15;
    7029             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
    7030     1146673 :     Flag Overflow = 0;
    7031     1146673 :     move32();
    7032             : #endif
    7033             : 
    7034             :     /**voice_factors = VF_0th_PARAM + VF_1st_PARAM * voice_fac + VF_2nd_PARAM * voice_fac * voice_fac;
    7035             :                      = VF_0th_PARAM + voice_fac * (VF_1st_PARAM  + VF_2nd_PARAM * voice_fac )
    7036             :     *voice_factors = min( max_val(0.0f, *voice_factors), 1.0f); */
    7037     1146673 :     tempQ31 = L_deposit_h( VF_1st_PARAM_FX );
    7038     1146673 :     tempQ15 = mac_r( tempQ31, VF_2nd_PARAM_FX, voice_fac_fx );
    7039     1146673 :     tempQ31 = L_deposit_h( VF_0th_PARAM_FX );
    7040     1146673 :     *voice_factors_fx = mac_r( tempQ31, voice_fac_fx, tempQ15 );
    7041     1146673 :     move16();
    7042             : 
    7043     1146673 :     tmp = MAX_16;
    7044     1146673 :     move16();
    7045             : 
    7046     1146673 :     pitch = shl_o( add( shl_o( T0, 2, &Overflow ), T0_frac ), 5, &Overflow ); /* Q7 */
    7047             : 
    7048     1146673 :     test();
    7049     1146673 :     test();
    7050     1146673 :     IF( ( ( EQ_16( coder_type, VOICED ) ) || ( GT_16( pitch, 14784 ) ) ) && ( GT_32( core_brate, ACELP_8k00 ) ) )
    7051             :     {
    7052      351748 :         tmp = MAX_16;
    7053      351748 :         move16();
    7054      351748 :         *voice_factors_fx = mult_r( *voice_factors_fx, tmp );
    7055      351748 :         move16();
    7056             :     }
    7057             : 
    7058     1146673 :     *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 );
    7059     1146673 :     move16();
    7060             : 
    7061     1146673 :     test();
    7062     1146673 :     test();
    7063     1146673 :     IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag )
    7064             :     {
    7065         854 :         test();
    7066         854 :         IF( flag_TD_BWE && i_subfr_fx == 0 )
    7067             :         {
    7068           0 :             set16_fx( bwe_exc_fx, 0, L_FRAME32k );
    7069             :         }
    7070         854 :         return;
    7071             :     }
    7072             : 
    7073     1145819 :     IF( EQ_16( L_frame_fx, L_FRAME ) )
    7074             :     {
    7075      461944 :         interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr );                           /* code: Q9, tmp_code: Q9 */
    7076      461944 :         gain_code16 = round_fx_o( L_shl_o( gain_code_fx, Q_exc, &Overflow ), &Overflow ); /*Q_exc */
    7077    74372984 :         FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ )
    7078             :         {
    7079    73911040 :             L_tmp = L_mult( gain_code16, tmp_code_fx[i] );                                                  /* Q9 + Q_exc + 1*/
    7080    73911040 :             L_tmp = L_shl( L_tmp, 5 );                                                                      /* Q9 + Q_exc + Q6*/
    7081    73911040 :             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 */
    7082    73911040 :             L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /*16+Q_exc */                                           /* saturation can occur here */
    7083    73911040 :             bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx_o( L_tmp, &Overflow );                  /*Q_exc */
    7084    73911040 :             move16();
    7085             :         }
    7086             :     }
    7087             :     ELSE
    7088             :     {
    7089      683875 :         Word16 shift = 4;
    7090      683875 :         move16();
    7091      683875 :         IF( gain_preQ_fx != 0 )
    7092             :         {
    7093     8750625 :             FOR( i = 0; i < L_subfr; i++ )
    7094             :             {
    7095             :                 /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */
    7096     8616000 :                 Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] );  /* Q16 + Q9 + 1 - 16 = Q10 */
    7097     8616000 :                 Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12  */
    7098             : 
    7099     8616000 :                 Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow );                   /*Q_exc+16 */
    7100     8616000 :                 Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, shift ) /*Q_exc+ 2 + 6 (or) 10 - 13*/, &Overflow ); /*Q_exc+16 */
    7101             : 
    7102     8616000 :                 tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc  */
    7103     8616000 :                 move16();
    7104             :             }
    7105             :         }
    7106             :         ELSE
    7107             :         {
    7108    35701250 :             FOR( i = 0; i < L_subfr; i++ )
    7109             :             {
    7110             :                 /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */
    7111    35152000 :                 Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] );                        /* Q16 + Q9 + 1 - 16 = Q10 */
    7112    35152000 :                 Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */
    7113    35152000 :                 tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow );                /* Q_exc  */
    7114    35152000 :                 move16();
    7115             :             }
    7116             :         }
    7117             : 
    7118      683875 :         interp_code_4over2_fx( tmp_code_preInt_fx, tmp_code_fx, L_subfr ); /* o: tmp_code in Q_exc */
    7119    88219875 :         FOR( i = 0; i < shl( L_subfr, 1 ); i++ )
    7120             :         {
    7121    87536000 :             L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + shl( i_subfr_fx, 1 )] );                        /*Q14+Q_exc+1 */
    7122    87536000 :             tmp = round_fx_o( L_shl_o( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/, &Overflow ), &Overflow ); /* tmp in Q_exc */
    7123    87536000 :             bwe_exc_fx[i + shl( i_subfr_fx, 1 )] = add_o( tmp, tmp_code_fx[i], &Overflow );             /*Q_exc */
    7124    87536000 :             move16();
    7125             :         }
    7126             :     }
    7127             : 
    7128     1145819 :     return;
    7129             : }
    7130             : 
    7131             : 
    7132             : /*=============================================================================*/
    7133             : /* FUNCTION : void swb_formant_fac_fx ( ) */
    7134             : /*------------------------------------------------------------------------------*/
    7135             : /* PURPOSE : * Find strength of adaptive formant postfilter using tilt */
    7136             : /* of the high band. The 2nd lpc coefficient is used as a tilt approximation. */
    7137             : /*------------------------------------------------------------------------------*/
    7138             : /* INPUT ARGUMENTS : */
    7139             : /* const Word16 lpc_shb2 : 2nd HB LPC coefficient Q12 */
    7140             : /*------------------------------------------------------------------------------*/
    7141             : /*INPUT/OUTPUT ARGUMENTS : */
    7142             : /* Word16 *tilt_mem Q12 */
    7143             : /* OUTPUT ARGUMENTS : */
    7144             : /*------------------------------------------------------------------------------*/
    7145             : /* RETURN ARGUMENTS : */
    7146             : /* formant_fac :Formant filter strength [0,1] Q15 */
    7147             : /*------------------------------------------------------------------------------*/
    7148             : /* CALLED FROM : */
    7149             : /*==============================================================================*/
    7150             : 
    7151             : /*! r: Formant filter strength [0,1] */
    7152      220689 : Word16 swb_formant_fac_fx(
    7153             :     const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient    */
    7154             :     Word16 *tilt_mem       /* i/o: Tilt smoothing memory (Q12)  */
    7155             : )
    7156             : {
    7157             :     Word16 formant_fac;
    7158             :     Word16 tmp;
    7159             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
    7160      220689 :     Flag Overflow = 0;
    7161             : #endif
    7162             : 
    7163             :     /* Smoothen tilt value */
    7164             :     /* tmp = 0.5f * (float)fabs(lpc_shb2) + 0.5f * *tilt_mem; */
    7165      220689 :     tmp = mult_r( 16384, abs_s( lpc_shb2 ) );
    7166      220689 :     tmp = add( tmp, mult_r( 16384, *tilt_mem ) ); /* Q12 */
    7167      220689 :     *tilt_mem = tmp;
    7168      220689 :     move16(); /*Q12 */
    7169             :     /* Map to PF strength */
    7170             :     /* formant_fac = (tmp - SWB_TILT_LOW)*SWB_TILT_DELTA; */
    7171      220689 :     tmp = sub( tmp, SWB_TILT_LOW_FX );              /* Q12 */
    7172      220689 :     formant_fac = mult_r( tmp, SWB_TILT_DELTA_FX ); /* Q12 */
    7173             : 
    7174      220689 :     IF( GT_16( formant_fac, 4096 /* 1 in Q12 */ ) )
    7175             :     {
    7176         144 :         formant_fac = 4096; /* 1 in Q12 */
    7177         144 :         move16();
    7178             :     }
    7179      220545 :     ELSE IF( formant_fac < 0 )
    7180             :     {
    7181      195070 :         formant_fac = 0;
    7182      195070 :         move16();
    7183             :     }
    7184             :     /* now formant_fac in Q12 */
    7185             : 
    7186             :     /* formant_fac = 1.0f - 0.5f*formant_fac */
    7187      220689 :     tmp = mult_r( 16384, formant_fac ); /* 0.5 in Q15 */
    7188      220689 :     formant_fac = shl_o( sub( 4096 /* 1 in Q12 */, tmp ), 3, &Overflow );
    7189      220689 :     return formant_fac; /*Q15 */
    7190             : }
    7191             : 
    7192             : 
    7193             : /*-------------------------------------------------------------------*
    7194             :  * wb_tbe_extras_reset_fx()
    7195             :  *
    7196             :  *
    7197             :  *-------------------------------------------------------------------*/
    7198             : 
    7199       21255 : void wb_tbe_extras_reset_fx(
    7200             :     Word16 mem_genSHBexc_filt_down_wb2[],
    7201             :     Word16 mem_genSHBexc_filt_down_wb3[] )
    7202             : {
    7203       21255 :     set16_fx( mem_genSHBexc_filt_down_wb2, 0, 2 * ALLPASSSECTIONS_STEEP + 1 );
    7204       21255 :     set16_fx( mem_genSHBexc_filt_down_wb3, 0, 2 * ALLPASSSECTIONS_STEEP + 1 );
    7205             : 
    7206       21255 :     return;
    7207             : }
    7208             : 
    7209             : /*-------------------------------------------------------------------*
    7210             :  * get_tbe_bits()                                                    *
    7211             :  *                                                                   *
    7212             :  * Determine TBE bit consumption per frame from bitrate              *
    7213             :  *-------------------------------------------------------------------*/
    7214             : 
    7215        2444 : Word16 get_tbe_bits_fx(
    7216             :     const Word32 total_brate, /* o  : TBE bit consumption per frame           */
    7217             :     const Word16 bwidth,      /* i  : overall bitrate                         */
    7218             :     const Word16 rf_mode      /* i  : bandwidht mode                          */
    7219             : )
    7220             : {
    7221        2444 :     Word16 i, bits = 0;
    7222             : 
    7223        2444 :     IF( EQ_16( rf_mode, 1 ) )
    7224             :     {
    7225             :         /* TBE bits for core, primary frame */
    7226           0 :         test();
    7227           0 :         test();
    7228           0 :         IF( ( EQ_16( bwidth, WB ) ) && ( EQ_32( total_brate, ACELP_13k20 ) ) )
    7229             :         {
    7230             :             /* Gain frame: 4, Gain shapes: 0, and LSFs: 2 */
    7231           0 :             bits = NUM_BITS_SHB_FrameGain_LBR_WB + NUM_BITS_LBR_WB_LSF;
    7232           0 :             move16();
    7233             :         }
    7234           0 :         ELSE IF( ( EQ_16( bwidth, SWB ) ) && ( EQ_32( total_brate, ACELP_13k20 ) ) )
    7235             :         {
    7236             :             /* Gain frame: 5, Gain shapes: 5, and lowrate LSFs: 8 */
    7237           0 :             bits = NUM_BITS_SHB_FRAMEGAIN + NUM_BITS_SHB_SUBGAINS + 8;
    7238           0 :             move16();
    7239             :         }
    7240             :     }
    7241             :     ELSE
    7242             :     {
    7243        2444 :         test();
    7244        2444 :         test();
    7245        2444 :         IF( ( EQ_16( bwidth, WB ) ) && ( EQ_32( total_brate, ACELP_9k60 ) ) )
    7246             :         {
    7247           0 :             bits = NUM_BITS_LBR_WB_LSF + NUM_BITS_SHB_FrameGain_LBR_WB;
    7248           0 :             move16();
    7249             :         }
    7250        2444 :         ELSE IF( ( EQ_16( bwidth, SWB ) ) || ( EQ_16( bwidth, FB ) ) )
    7251             :         {
    7252        2444 :             test();
    7253        2444 :             IF( EQ_32( total_brate, ACELP_9k60 ) )
    7254             :             {
    7255           0 :                 bits = NUM_BITS_SHB_FRAMEGAIN + NUM_BITS_SHB_SUBGAINS + 8;
    7256           0 :                 move16();
    7257             :             }
    7258        2444 :             ELSE IF( ( GE_32( total_brate, ACELP_13k20 ) ) && ( LE_32( total_brate, ACELP_32k ) ) )
    7259             :             {
    7260        2444 :                 bits = NUM_BITS_SHB_SUBGAINS + NUM_BITS_SHB_FRAMEGAIN + NUM_LSF_GRID_BITS + MIRROR_POINT_BITS;
    7261        2444 :                 move16();
    7262             : 
    7263       14664 :                 FOR( i = 0; i < NUM_Q_LSF; i++ )
    7264             :                 {
    7265       12220 :                     bits = add( bits, lsf_q_num_bits[i] );
    7266             :                 }
    7267             :             }
    7268             : 
    7269        2444 :             if ( GE_32( total_brate, ACELP_24k40 ) )
    7270             :             {
    7271        2444 :                 bits = add( bits, NUM_BITS_SHB_ENER_SF + NUM_BITS_SHB_VF + NUM_BITS_SHB_RES_GS * NB_SUBFR16k );
    7272             :             }
    7273             : 
    7274        2444 :             test();
    7275        2444 :             test();
    7276        2444 :             if ( EQ_16( bwidth, SWB ) && ( EQ_32( total_brate, ACELP_16k40 ) || EQ_32( total_brate, ACELP_24k40 ) ) )
    7277             :             {
    7278        2444 :                 bits = add( bits, BITS_TEC + BITS_TFA );
    7279             :             }
    7280             : 
    7281        2444 :             if ( EQ_16( bwidth, FB ) )
    7282             :             {
    7283             :                 /* full band slope */
    7284           0 :                 bits = add( bits, 4 );
    7285             :             }
    7286             :         }
    7287             :     }
    7288             : 
    7289        2444 :     return bits;
    7290             : }

Generated by: LCOV version 1.14