LCOV - code coverage report
Current view: top level - lib_com - swb_tbe_com_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main -- dec/rend @ 633e3f2e309758d10805ef21e0436356fe719b7a Lines: 2133 3411 62.5 %
Date: 2025-08-23 01:22:27 Functions: 42 49 85.7 %

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

Generated by: LCOV version 1.14