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

Generated by: LCOV version 1.14