LCOV - code coverage report
Current view: top level - lib_dec - er_dec_tcx_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main -- dec/rend @ 633e3f2e309758d10805ef21e0436356fe719b7a Lines: 894 1001 89.3 %
Date: 2025-08-23 01:22:27 Functions: 3 4 75.0 %

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : 
       6             : #include <assert.h>
       7             : #include <stdint.h>
       8             : #include "options.h"
       9             : #include "prot_fx.h"
      10             : #include "basop_util.h"
      11             : #include "rom_dec.h"
      12             : 
      13             : /*****************************************************
      14             :     calcGainc calculates st->lp_gainc
      15             : ******************************************************/
      16        2360 : static void calcGainc_fx( Word16 *exc, Word16 Q_exc, Word32 old_fpitch /*Q16*/, Word16 L_subfr /*Q0*/, Word32 lp_gainp /*Q16*/, Word32 *lp_gainc /*Q16*/ )
      17             : {
      18             :     Word32 L_c;
      19             :     Word16 tmp16, tmp16_2, tmp16_3, tmp_e, tmp2_e, tmp_loop, i;
      20             :     Word32 L_acc, L_tmp;
      21             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
      22        2360 :     Flag Overflow = 0;
      23        2360 :     Flag Carry = 0;
      24        2360 :     move32();
      25        2360 :     move32();
      26             : #endif
      27             : 
      28             : 
      29        2360 :     L_acc = L_deposit_l( 0 );
      30        2360 :     L_c = L_deposit_l( 0 );
      31        2360 :     Overflow = 0;
      32        2360 :     move16();
      33        2360 :     Carry = 0;
      34        2360 :     move16();
      35             : 
      36        2360 :     tmp16 = round_fx( old_fpitch ); /*Q0*/
      37        2360 :     tmp_loop = shl( L_subfr, 1 );
      38             :     BASOP_SATURATE_WARNING_OFF_EVS
      39             : #ifdef ISSUE_1866_replace_overflow_libdec
      40        2360 :     tmp16_2 = round_fx_sat( L_shl_sat( lp_gainp, 2 ) ); /*Q31->Q15, no severe saturation, because st->lp_gainp here is [0,1]*/
      41             : #else
      42             :     tmp16_2 = round_fx_o( L_shl_o( lp_gainp, 2, &Overflow ), &Overflow ); /*Q31->Q15, no severe saturation, because st->lp_gainp here is [0,1]*/
      43             : #endif
      44             :     BASOP_SATURATE_WARNING_ON_EVS
      45             : 
      46      755032 :     FOR( i = 0; i < tmp_loop; i++ )
      47             :     {
      48             :         /*st->lp_gainc += ( exc[i-2*L_subfr] - st->Mode2_lp_gainp * exc[i-2*L_subfr-(int)(st->old_fpitch+0.5f)] ) *
      49             :                           ( exc[i-2*L_subfr] - st->Mode2_lp_gainp * exc[i-2*L_subfr-(int)(st->old_fpitch+0.5f)] );*/
      50             : #ifdef ISSUE_1866_replace_overflow_libdec
      51      752672 :         tmp16_3 = sub_sat( exc[( i - ( L_subfr * 2 ) )] /*Q1*/, mult_r( tmp16_2 /*Q15*/, exc[( ( i - ( L_subfr * 2 ) ) - tmp16 )] /*Q1*/ ) /*Q1*/ );
      52             : #else
      53             :         tmp16_3 = sub_o( exc[( i - ( L_subfr * 2 ) )] /*Q1*/, mult_r( tmp16_2 /*Q15*/, exc[( ( i - ( L_subfr * 2 ) ) - tmp16 )] /*Q1*/ ) /*Q1*/, &Overflow );
      54             : #endif
      55      752672 :         L_acc = L_macNs_co( L_acc, tmp16_3, tmp16_3, &Carry, &Overflow ); /*Q3*/
      56      752672 :         Overflow = 0;
      57      752672 :         move16();
      58      752672 :         L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); /*Accumulate Carrys Q-1*/
      59      752672 :         Carry = 0;
      60      752672 :         move16();
      61             :     }
      62        2360 :     L_tmp = norm_llQ31( L_c, L_acc, &tmp_e );                 /*Q3,norm,tmp_e*/
      63        2360 :     tmp_e = add( tmp_e, 31 - ( add( shl( Q_exc, 1 ), 1 ) ) ); /*L_tmp is Q31, now*/
      64        2360 :     tmp16 = BASOP_Util_Divide3216_Scale( L_tmp /*Q31,norm,tmp_e*/, shl( L_subfr, 1 ) /*Q15,15*/, &tmp2_e ) /*Q15,tmp2_e+tmp_e-15*/;
      65        2360 :     tmp_e = sub( add( tmp2_e, tmp_e ), 15 );
      66             : 
      67        2360 :     IF( tmp16 != 0 )
      68             :     {
      69        2360 :         tmp16 = Sqrt16( tmp16, &tmp_e ); /*Q15,norm,tmp_e*/
      70             :     }
      71        2360 :     *lp_gainc = L_shl( L_deposit_l( tmp16 ), add( tmp_e, 1 ) ); /*15Q16*/
      72        2360 :     move32();
      73        2360 : }
      74             : 
      75           0 : static void calcGainc2_fx( Word16 *exc, Word16 Q_exc, Word16 L_subfr /*Q0*/, Word32 *lp_gainc /*Q16*/ )
      76             : {
      77             :     Word16 i, cnt, tmp16, tmp_e, tmp2_e;
      78             :     Word32 L_c, L_acc, L_tmp;
      79             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
      80           0 :     Flag Overflow = 0;
      81           0 :     Flag Carry = 0;
      82             : #endif
      83           0 :     move16();
      84           0 :     move16();
      85             : 
      86             : 
      87           0 :     Carry = 0;
      88           0 :     move16();
      89           0 :     Overflow = 0;
      90           0 :     move16();
      91             : 
      92           0 :     L_c = L_deposit_l( 0 );
      93           0 :     L_acc = L_deposit_l( 0 );
      94             : 
      95           0 :     cnt = shl( L_subfr, 1 );
      96             : 
      97           0 :     FOR( i = 0; i < cnt; i++ )
      98             :     {
      99             :         /* *gainc += ( exc[i-2*L_subfr] ) * ( exc[i-2*L_subfr]); */
     100           0 :         L_acc = L_macNs_co( L_acc, exc[( i - ( L_subfr * 2 ) )] /*Q1*/, exc[( i - ( L_subfr * 2 ) )] /*Q1*/, &Carry, &Overflow ); /*Q3*/
     101           0 :         Overflow = 0;
     102           0 :         move16();
     103           0 :         L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); /* Accumulate Carrys Q-1*/
     104           0 :         Carry = 0;
     105           0 :         move16();
     106             :     }
     107             : 
     108           0 :     L_tmp = norm_llQ31( L_c, L_acc, &tmp_e );                       /*Q3,norm,tmp_e*/
     109           0 :     tmp_e = add( tmp_e, sub( 31, ( add( shl( Q_exc, 1 ), 1 ) ) ) ); /*L_tmp is Q31, now*/
     110           0 :     tmp16 = BASOP_Util_Divide3216_Scale( L_tmp /*Q31,norm,tmp_e*/, shl( L_subfr, 1 ) /*Q15,15*/, &tmp2_e ) /*Q15,tmp2_e+tmp_e-15*/;
     111           0 :     tmp_e = sub( add( tmp2_e, tmp_e ), 15 );
     112             : 
     113           0 :     IF( tmp16 != 0 )
     114             :     {
     115           0 :         tmp16 = Sqrt16( tmp16, &tmp_e ); /*Q15,norm,tmp_e*/
     116             :     }
     117           0 :     *lp_gainc = L_shl( L_deposit_l( tmp16 ), add( tmp_e, 1 ) ); /*15Q16*/
     118           0 :     move32();
     119           0 : }
     120             : 
     121             : /******************************************************
     122             : 
     123             : con_tcx
     124             : 
     125             : \brief main function in time domain TCX concealment
     126             : 
     127             : *******************************************************/
     128             : 
     129        1097 : void con_tcx_fx(
     130             :     Decoder_State *st, /* i/o: coder memory state            */
     131             :     Word16 synth[]     /* i/o:   synth[]                     Q0*/
     132             : )
     133             : {
     134             :     Word16 i, s, c, L_frame, L_subfr, fLowPassFilter, T0;
     135             :     Word16 n, mem_syn_r_size_old, mem_syn_r_size_new;
     136             :     Word16 *noise;
     137             :     Word16 mem_syn[M], *syn;
     138             :     Word16 *exc, buf[OLD_EXC_SIZE_DEC + L_FRAME_MAX + L_FRAME_MAX / NB_SUBFR + 1 + L_FRAME_MAX / 2];
     139             :     Word16 pre_emph_buf;
     140             :     Word16 hp_filt[L_FIR_FER2];
     141             :     Word16 alpha;
     142             :     Word16 tmp_deemph, gain, gainCNG, gain_inov;
     143             :     Word16 *pt_exc, *pt1_exc;
     144             :     Word16 Tc, tmpSeed;
     145             :     Word16 fUseExtrapolatedPitch;
     146             :     Word16 *ana_window;
     147             :     Word16 r_h[M + 1], A_local[M + 1], mem, r_l[M + 1];
     148             :     PWord16 const *w;
     149             :     Word16 W1, W2, W12;
     150             :     Word16 Q_r;
     151             :     Word16 tmp16, tmp16_2, tmp_loop, tmp_e, gain_tmp;
     152             :     Word16 gainCNG_e, noise_e, gain_inov_e; /*Exponents for gainCNG, noise, gain_inov*/
     153             :     Word16 Q_syn;                           /*Q format of temporary synthesis buffer syn*/
     154             :     Word32 L_tmp, L_tmp2, step32_tmp;
     155             :     Word32 predPitchLag, pitch_buf[NB_SUBFR16k], step32, gain32;
     156             :     Word16 extrapolationFailed;
     157             :     Word16 gainSynthDeemph;
     158             :     Word16 gainSynthDeemph_e;
     159             :     Word32 old_pitch_buf[2 * NB_SUBFR16k + 2];
     160             :     Word16 Q_exc, new_Q, exp_scale;
     161             :     Word16 offset;
     162             :     HQ_DEC_HANDLE hHQ_core;
     163             :     TCX_LTP_DEC_HANDLE hTcxLtpDec;
     164             :     TCX_DEC_HANDLE hTcxDec;
     165             : 
     166        1097 :     hTcxLtpDec = st->hTcxLtpDec;
     167        1097 :     hHQ_core = st->hHQ_core;
     168        1097 :     hTcxDec = st->hTcxDec;
     169             : 
     170             :     /* inits */
     171        1097 :     alpha = 0;
     172        1097 :     move16();
     173        1097 :     fUseExtrapolatedPitch = 0;
     174        1097 :     move16();
     175        1097 :     extrapolationFailed = 1;
     176        1097 :     move16();
     177             : 
     178        1097 :     noise_e = 0;
     179        1097 :     move16();
     180        1097 :     Q_syn = -1; /*Q format of temporary synthesis buffer syn*/
     181        1097 :     move16();
     182        1097 :     offset = 0;
     183        1097 :     move16();
     184             : 
     185             :     /* Framing parameters */
     186        1097 :     L_frame = hTcxDec->L_frameTCX; /*Q0*/
     187        1097 :     move16();
     188             :     /* L_subfr = st->L_frameTCX/st->nb_subfr */
     189        1097 :     L_subfr = mult_r( hTcxDec->L_frameTCX, div_s( 1, st->nb_subfr ) ); /*Q0*/
     190        1097 :     assert( L_subfr == hTcxDec->L_frameTCX / st->nb_subfr );
     191        1097 :     move32();
     192        1097 :     w = st->hTcxCfg->tcx_mdct_windowFB; /*pointer - no need to instrument Q15*/
     193        1097 :     W1 = st->hTcxCfg->tcx_mdct_window_lengthFB;
     194        1097 :     move16();
     195        1097 :     W2 = shr( st->hTcxCfg->tcx_mdct_window_lengthFB, 1 );
     196        1097 :     W12 = shr( W1, 1 );
     197             : 
     198             :     /* take the previous frame last pitch */
     199        1097 :     Tc = round_fx( st->old_fpitchFB ); /*Q0*/
     200             : 
     201             : 
     202        1097 :     set16_fx( buf, 0, OLD_EXC_SIZE_DEC + L_FRAME_MAX + L_FRAME_MAX / NB_SUBFR + 1 + L_FRAME_MAX / 2 ); /* initialize buf with 0 */
     203             :     // set16_fx(buf,0,shr(sizeof(buf),1)); /* initialize buf with 0 */
     204             : 
     205        1097 :     c = BASOP_Util_Divide1616_Scale(
     206             :         L_frame,
     207        1097 :         st->L_frame,
     208             :         &s );
     209             : 
     210       14261 :     FOR( i = 0; i < 2 * NB_SUBFR16k + 2; i++ )
     211             :     {
     212       13164 :         old_pitch_buf[i] = L_shl( Mpy_32_16_1( st->old_pitch_buf_fx[i], c ), s ); /*Q16*/
     213       13164 :         move32();
     214             :     }
     215             : 
     216             :     /* set excitation memory*/
     217        1097 :     exc = buf + OLD_EXC_SIZE_DEC; /*Q_exc*/
     218        1097 :     tmp_deemph = synth[-1];       /*Q0*/
     219        1097 :     move16();
     220        1097 :     pre_emph_buf = synth[-1]; /*Q0*/
     221        1097 :     move16();
     222             : 
     223        1097 :     test();
     224        1097 :     IF( ( EQ_16( st->nbLostCmpt, 1 ) ) || hTcxDec->tcxConceal_recalc_exc )
     225             :     {
     226             :         /* apply pre-emphasis to the signal */
     227         737 :         mem = synth[( -( ( ( ( L_frame / 2 ) + hTcxDec->pit_max_TCX ) + M + M ) ) - 1 )]; /*Q0*/
     228         737 :         move16();
     229         737 :         Q_exc = E_UTIL_f_preemph3( &( synth[-( ( ( L_frame / 2 ) + hTcxDec->pit_max_TCX ) + 2 * M )] ), st->preemph_fac, add( add( shr( L_frame, 1 ), hTcxDec->pit_max_TCX ), shl( M, 1 ) ), &mem, 1 );
     230         737 :         st->Mode2_lp_gainc = L_deposit_l( 0 );
     231             : 
     232         737 :         st->Mode2_lp_gainp = get_gain2( synth - shl( L_subfr, 1 ), synth - add( shl( L_subfr, 1 ), Tc ), shl( L_subfr, 1 ) ); /*Q16*/
     233             : 
     234         737 :         st->Mode2_lp_gainp = L_max( st->Mode2_lp_gainp, 0 );                   /*Q16*/
     235         737 :         st->Mode2_lp_gainp = L_min( st->Mode2_lp_gainp, 65536l /*1.0f Q16*/ ); /*Q16*/
     236         737 :         st->Mode2_lp_gainp = L_shl( st->Mode2_lp_gainp, 13 );                  /*Q29*/
     237             : 
     238         737 :         ana_window = buf; /*Q15*/
     239         737 :         ham_cos_window( ana_window, mult( L_frame, 24576 /*0.75f Q15*/ ), shr( L_frame, 2 ) );
     240             : 
     241             :         /* Autocorrelation */
     242         737 :         autocorr_fx( &( synth[( -L_frame - 1 )] ), M, r_h, r_l, &Q_r, L_frame, ana_window, 0, 0 );
     243             : 
     244             :         /* Lag windowing */
     245         737 :         lag_wind( r_h, r_l, M, st->output_Fs, LAGW_STRONG );
     246             : 
     247             :         /* Levinson Durbin */
     248         737 :         E_LPC_lev_dur( r_h, r_l, A_local, NULL, M, NULL );
     249             : 
     250             :         /* copy for multiple frame loss */
     251         737 :         Copy( A_local, st->old_Aq_12_8_fx, M + 1 ); /*Q12*/
     252             : 
     253             :         /* Residu */
     254         737 :         assert( ( 2 * L_subfr + Tc + 1 + M ) <= hTcxDec->old_synth_lenFB );
     255             : 
     256             :         BASOP_SATURATE_WARNING_OFF_EVS /*saturation possible in case of spiky synthesis*/
     257        2211 :             Residu3_fx(
     258             :                 A_local,
     259         737 :                 &( synth[-( ( add( ( L_subfr * 2 ), Tc ) + 1 ) + M )] ), /*Qx   = Q0*/
     260         737 :                 &( exc[-( ( add( ( L_subfr * 2 ), Tc ) + 1 ) + M )] ),   /*Qx+1 = Q1*/
     261         737 :                 add( add( add( shl( L_subfr, 1 ), Tc ), 1 ), M ),
     262             :                 1 );
     263             :         BASOP_SATURATE_WARNING_ON_EVS
     264             :     }
     265             :     ELSE
     266             :     {
     267             :         /* apply pre-emphasis to the signal */
     268         360 :         mem = synth[( -L_frame - 1 )]; /*Q0*/
     269         360 :         move16();
     270         360 :         Q_exc = E_UTIL_f_preemph3( &( synth[-L_frame] ), st->preemph_fac, L_frame, &mem, 1 );
     271         360 :         Copy( st->old_Aq_12_8_fx, A_local, M + 1 ); /*Q12*/
     272             : 
     273         360 :         offset = shr( L_frame, 1 );
     274         360 :         IF( GE_16( st->last_good, UNVOICED_TRANSITION ) )
     275             :         {
     276         360 :             tmp16 = s_max( sub( Tc, shr( L_frame, 1 ) ), 0 );
     277         360 :             Copy_Scale_sig( hTcxDec->old_excFB_fx, &( exc[-tmp16] ), add( offset, tmp16 ), sub( Q_exc, st->Q_exc ) ); /*Q_exc*/
     278             :         }
     279             :         ELSE
     280             :         {
     281           0 :             Copy_Scale_sig( hTcxDec->old_excFB_fx, &( exc[-( L_subfr * 2 )] ), add( shl( L_subfr, 1 ), offset ), sub( Q_exc, st->Q_exc ) ); /*Q_exc*/
     282             :         }
     283             :     }
     284             : 
     285             :     /*-----------------------------------------------------------------*
     286             :      * PLC: Construct the harmonic part of excitation
     287             :      *-----------------------------------------------------------------*/
     288             : 
     289        1097 :     test();
     290        1097 :     test();
     291        1097 :     IF( GT_16( st->last_good, UNVOICED_CLAS ) && !( EQ_16( st->last_good, UNVOICED_TRANSITION ) && EQ_16( st->core_ext_mode, GENERIC ) ) )
     292             :     {
     293        1097 :         test();
     294        1097 :         IF( EQ_16( st->nbLostCmpt, 1 ) || hTcxDec->tcxConceal_recalc_exc )
     295             :         {
     296         737 :             calcGainc_fx( exc, Q_exc, st->old_fpitchFB, L_subfr, st->Mode2_lp_gainp, &( st->Mode2_lp_gainc ) );
     297             :         }
     298             : 
     299        1097 :         tmp16 = 0;
     300        1097 :         move16();
     301        1097 :         if ( GT_32( st->output_Fs, 25600 ) )
     302             :         {
     303         864 :             tmp16 = 1;
     304         864 :             move16();
     305             :         }
     306             : 
     307        1097 :         test();
     308        1097 :         test();
     309        1097 :         test();
     310        1097 :         test();
     311        1097 :         IF( ( ( EQ_16( st->nbLostCmpt, 1 ) ) || hTcxDec->tcxConceal_recalc_exc ) && GE_16( st->rf_frame_type, RF_TCXFD ) && LE_16( st->rf_frame_type, RF_TCXTD2 ) && st->use_partial_copy )
     312           0 :         {
     313             :             Word32 tcxltp_pitch_tmp; /*15Q16*/
     314             :             Word16 scale_tmp;        /*getInvFrameLen()->9Q6*/
     315             :             Word16 tmp_shift;
     316           0 :             tcxltp_pitch_tmp = L_add( L_deposit_h( hTcxLtpDec->tcxltp_pitch_int ), L_shl( L_deposit_l( div_s( hTcxLtpDec->tcxltp_pitch_fr, st->pit_res_max ) ), 1 ) ); /*15Q16*/
     317           0 :             scale_tmp = mult_r( hTcxDec->L_frameTCX, getInvFrameLen( st->L_frame ) );                                                                                  /*getInvFrameLen()->9Q6*/
     318           0 :             tmp_shift = norm_s( scale_tmp );
     319           0 :             predPitchLag = L_shl( Mpy_32_16_1( tcxltp_pitch_tmp, shl( scale_tmp, tmp_shift ) ), sub( 9, tmp_shift ) ); /*Q16*/
     320             : 
     321           0 :             T0 = round_fx( predPitchLag ); /*Q0*/
     322             : 
     323           0 :             test();
     324           0 :             test();
     325           0 :             if ( ( T0 > 0 ) && ( NE_16( T0, Tc ) ) && ( LT_32( L_deposit_h( abs_s( sub( T0, Tc ) ) ) /*Q16*/, L_mult( 4915 /*.15f Q15*/ /*Q15*/, Tc /*Q0*/ ) /*Q16*/ ) ) )
     326             :             {
     327           0 :                 fUseExtrapolatedPitch = 1;
     328           0 :                 move16();
     329             :             }
     330             :         }
     331             :         ELSE
     332             :         {
     333        1097 :             pitch_pred_linear_fit(
     334        1097 :                 st->nbLostCmpt,
     335        1097 :                 st->last_good,
     336             :                 old_pitch_buf,
     337             :                 &( st->old_fpitchFB ),
     338             :                 &predPitchLag,
     339        1097 :                 hTcxDec->pit_min_TCX,
     340        1097 :                 hTcxDec->pit_max_TCX,
     341        1097 :                 st->mem_pitch_gain,
     342             :                 tmp16,
     343        1097 :                 st->plc_use_future_lag,
     344             :                 &extrapolationFailed,
     345        1097 :                 st->nb_subfr );
     346             : 
     347        1097 :             T0 = round_fx( predPitchLag ); /*Q0*/
     348        1097 :             test();
     349        1097 :             test();
     350        1097 :             test();
     351        1097 :             if ( ( T0 > 0 ) && ( NE_16( T0, Tc ) ) && ( LT_32( L_deposit_h( abs_s( sub( T0, Tc ) ) ) /*Q16*/, L_mult( 4915 /*.15f Q15*/ /*Q15*/, Tc /*Q0*/ ) /*Q16*/ ) ) && ( extrapolationFailed == 0 ) )
     352             :             {
     353         259 :                 fUseExtrapolatedPitch = 1;
     354         259 :                 move16();
     355             :             }
     356             :         }
     357             : 
     358             : 
     359        1097 :         fLowPassFilter = 0;
     360        1097 :         move16();
     361        1097 :         pt_exc = exc + offset; /*Q_exc*/
     362        1097 :         pt1_exc = pt_exc - Tc; /*Q_exc*/
     363             : 
     364        1097 :         if ( fUseExtrapolatedPitch != 0 )
     365             :         {
     366         259 :             pt_exc = buf; /*Q_exc*/
     367             :         }
     368        1097 :         test();
     369        1097 :         IF( LT_16( st->stab_fac_fx, 32767 /*1.f Q15*/ ) && EQ_16( st->nbLostCmpt, 1 ) )
     370             :         {
     371             :             /* pitch cycle is first low-pass filtered */
     372             : 
     373         442 :             IF( LE_32( st->output_Fs, 16000 ) )
     374             :             {
     375        8012 :                 FOR( i = 0; i < Tc; i++ )
     376             :                 {
     377        7933 :                     *pt_exc++ = mac_r_sat( L_mac_sat( L_mac_sat( L_mac_sat( L_mac_sat( L_mac_sat( L_mac_sat( L_mac_sat( L_mac_sat( L_mac_sat(
     378        7933 :                                                                                                                                        L_mult( 174 /* 0.0053f Q15*/, pt1_exc[-5] ),
     379        7933 :                                                                                                                                        0 /* 0.0000f Q15*/, pt1_exc[-4] ),
     380        7933 :                                                                                                                                    -1442 /*-0.0440f Q15*/, pt1_exc[-3] ),
     381        7933 :                                                                                                                         0 /* 0.0000f Q15*/, pt1_exc[-2] ),
     382        7933 :                                                                                                              8641 /* 0.2637f Q15*/, pt1_exc[-1] ),
     383        7933 :                                                                                                   18022 /* 0.5500f Q15*/, pt1_exc[0] ),
     384        7933 :                                                                                        8641 /* 0.2637f Q15*/, pt1_exc[1] ),
     385        7933 :                                                                             0 /* 0.0000f Q15*/, pt1_exc[2] ),
     386        7933 :                                                                  -1442 /*-0.0440f Q15*/, pt1_exc[3] ),
     387        7933 :                                                       0 /* 0.0000f Q15*/, pt1_exc[4] ),
     388        7933 :                                            174 /* 0.0053f Q15*/, pt1_exc[5] ); /*Q_exc*/
     389        7933 :                     move16();
     390        7933 :                     pt1_exc++;
     391             :                 }
     392             :             }
     393             :             ELSE /*(st->output_Fs >= 32000)*/
     394             :             {
     395      104272 :                 FOR( i = 0; i < Tc; i++ )
     396             :                 {
     397      103909 :                     *pt_exc++ = mac_r_sat( L_mac_sat( L_mac_sat( L_mac_sat( L_mac_sat( L_mac_sat( L_mac_sat( L_mac_sat( L_mac_sat( L_mac_sat(
     398      103909 :                                                                                                                                        L_mult( -174 /*-0.0053f Q15*/, pt1_exc[-5] ),
     399      103909 :                                                                                                                                        -121 /*-0.0037f Q15*/, pt1_exc[-4] ),
     400      103909 :                                                                                                                                    -459 /*-0.0140f Q15*/, pt1_exc[-3] ),
     401      103909 :                                                                                                                         590 /* 0.0180f Q15*/, pt1_exc[-2] ),
     402      103909 :                                                                                                              8743 /* 0.2668f Q15*/, pt1_exc[-1] ),
     403      103909 :                                                                                                   16355 /* 0.4991f Q15*/, pt1_exc[0] ),
     404      103909 :                                                                                        8743 /* 0.2668f Q15*/, pt1_exc[1] ),
     405      103909 :                                                                             590 /* 0.0180f Q15*/, pt1_exc[2] ),
     406      103909 :                                                                  -459 /*-0.0140f Q15*/, pt1_exc[3] ),
     407      103909 :                                                       -121 /*-0.0037f Q15*/, pt1_exc[4] ),
     408      103909 :                                            -174 /*-0.0053f Q15*/, pt1_exc[5] ); /*Q_exc*/
     409      103909 :                     move16();
     410      103909 :                     pt1_exc++;
     411             :                 }
     412             :             }
     413             : 
     414         442 :             fLowPassFilter = 1;
     415         442 :             move16();
     416             :         }
     417             :         ELSE
     418             :         {
     419             :             /* copy the first pitch cycle without low-pass filtering */
     420      157145 :             FOR( i = 0; i < Tc; i++ )
     421             :             {
     422      156490 :                 *pt_exc++ = *pt1_exc++; /*Q_exc*/
     423      156490 :                 move16();
     424             :             }
     425         655 :             fLowPassFilter = 1;
     426         655 :             move16();
     427             :         }
     428             : 
     429        1097 :         if ( fUseExtrapolatedPitch != 0 )
     430             :         {
     431         259 :             pt1_exc = buf; /*Q_exc*/
     432             :         }
     433        1097 :         tmp16 = add( sub( L_frame, imult1616( fLowPassFilter, Tc ) ), L_subfr );
     434      721325 :         FOR( i = 0; i < tmp16; i++ )
     435             :         {
     436      720228 :             *pt_exc++ = *pt1_exc++; /*Q_exc*/
     437      720228 :             move16();
     438             :         }
     439             : 
     440        1097 :         if ( fUseExtrapolatedPitch != 0 )
     441             :         {
     442         259 :             get_subframe_pitch( st->nb_subfr,
     443             :                                 st->old_fpitch,
     444             :                                 /* predPitchLag * L_frame/st->L_frame, */
     445             :                                 L_shr( Mpy_32_16_1( predPitchLag /*Q16*/,
     446         259 :                                                     mult_r( st->L_frame /*Q0*/,
     447         259 :                                                             getInvFrameLen( L_frame ) /*Q21*/
     448             :                                                             )                         /*Q6*/
     449             :                                                     ) /*Q7*/,
     450             :                                        7 - 16 ) /*Q16*/,
     451             :                                 pitch_buf );
     452             : 
     453         259 :             PulseResynchronization_fx( buf, exc, L_frame, st->nb_subfr, st->old_fpitchFB, predPitchLag );
     454             :         }
     455             :         ELSE
     456             :         {
     457         838 :             set32_fx( pitch_buf, st->old_fpitch, st->nb_subfr ); /*Q16*/
     458             :         }
     459             : 
     460        1097 :         IF( EQ_16( st->nbLostCmpt, 1 ) )
     461             :         {
     462         737 :             pt_exc = exc + L_frame;
     463         737 :             IF( T0 == 0 )
     464             :             {
     465         250 :                 pt1_exc = pt_exc - Tc;
     466             :             }
     467             :             ELSE
     468             :             {
     469         487 :                 pt1_exc = pt_exc - T0;
     470             :             }
     471             : 
     472         737 :             tmp_loop = shr( L_frame, 1 );
     473      286177 :             FOR( i = 0; i < tmp_loop; i++ )
     474             :             {
     475      285440 :                 *pt_exc++ = *pt1_exc++; /*Q_exc*/
     476      285440 :                 move16();
     477             :             }
     478             :         }
     479             : 
     480        1097 :         if ( fUseExtrapolatedPitch != 0 )
     481             :         {
     482         259 :             st->old_fpitchFB = predPitchLag; /*Q16*/
     483         259 :             move32();
     484             :         }
     485        1097 :         st->bpf_gain_param = 0;
     486        1097 :         move16();
     487             : 
     488             :         /* PLC: calculate damping factor */
     489        1097 :         alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &( st->Mode2_lp_gainp ), 0 ); /*Q14*/
     490        1097 :         IF( EQ_16( st->nbLostCmpt, 1 ) )
     491             :         {
     492         737 :             st->cummulative_damping = 32767 /*1.f Q15*/;
     493         737 :             move16();
     494             :         }
     495             :         ELSE
     496             :         {
     497         360 :             st->cummulative_damping = shl_sat( mult_r_sat( st->cummulative_damping /*Q15*/, alpha /*Q14*/ ), 1 ) /*Q15*/;
     498         360 :             move16();
     499             :         }
     500             : 
     501        1097 :         gain32 = L_add( 2147483647l /*1.f Q31*/, 0 ); /*Q31*/
     502        1097 :         gain = 32767 /*1.f Q15*/;                     /*Q15*/
     503        1097 :         move16();
     504        1097 :         test();
     505        1097 :         IF( EQ_16( st->rf_frame_type, RF_TCXTD1 ) && EQ_16( st->use_partial_copy, 1 ) )
     506             :         {
     507           0 :             gain32 = 1073741824l /*0.5f Q31*/;
     508           0 :             move32();
     509           0 :             gain = 16384 /*0.5f Q15*/;
     510           0 :             move16();
     511             :         }
     512             : 
     513             :         /*step = (1.0f/(L_frame+(L_frame/2))) * (gain - alpha);*/
     514        1097 :         tmp16 = shr( imult1616( 3, L_frame ), 1 );
     515        1097 :         tmp_e = norm_s( tmp16 );
     516        1097 :         tmp16 = shl( tmp16, tmp_e );
     517        1097 :         tmp16 = div_s( 16384 /*1.f Q14*/, tmp16 ); /*Q15,1+tmp_e-15*/
     518        1097 :         tmp16_2 = sub( shr( gain, 1 ), alpha ) /*Q14*/;
     519        1097 :         step32 = L_shl( L_mult( tmp16, tmp16_2 ) /*Q30, 1+tmp_e-15*/, add( 1 - 14, tmp_e ) ) /*Q31*/;
     520             : 
     521             :         /* PLC: Apply fade out */
     522        1097 :         tmp_loop = shr( imult1616( L_frame, 3 ), 1 );
     523     1100617 :         FOR( i = offset; i < tmp_loop; i++ )
     524             :         {
     525     1099520 :             exc[i] = mult_r( exc[i], round_fx_sat( gain32 ) ) /*Q1*/;
     526     1099520 :             move16();
     527     1099520 :             gain32 = L_sub_sat( gain32, step32 ); /*Q31*/
     528             :         }
     529             : 
     530             :         /* update old exc without random part */
     531        1097 :         offset = s_max( sub( round_fx( st->old_fpitchFB ), shr( L_frame, 1 ) ), 0 );                   /*Q0*/
     532        1097 :         Copy( exc + sub( L_frame, offset ), hTcxDec->old_excFB_fx, add( shr( L_frame, 1 ), offset ) ); /*Q_exc*/
     533             :         /* copy old_exc as 16kHz for acelp decoding */
     534        1097 :         IF( EQ_16( st->nbLostCmpt, 1 ) )
     535             :         {
     536         737 :             lerp( exc - shr( L_frame, 1 ), st->old_exc_fx, L_EXC_MEM_DEC, add( L_frame, shr( L_frame, 1 ) ) );
     537             :         }
     538             :         ELSE
     539             :         {
     540         360 :             Copy( st->old_exc_fx + L_FRAME16k, st->old_exc_fx, L_FRAME16k / 2 ); /*Q_exc*/
     541         360 :             lerp( exc, st->old_exc_fx + L_FRAME16k / 2, L_FRAME16k, L_frame );
     542             :         }
     543        1097 :         st->Q_exc = Q_exc;
     544        1097 :         move16();
     545             :     }
     546             :     ELSE
     547             :     {
     548             :         /* No harmonic part */
     549           0 :         set16_fx( &exc[0], 0, add( L_frame, shr( L_frame, 1 ) ) );
     550           0 :         IF( EQ_16( st->nbLostCmpt, 1 ) )
     551             :         {
     552           0 :             calcGainc2_fx( &exc[0], Q_exc, L_subfr, &( st->Mode2_lp_gainc ) );
     553             :         }
     554           0 :         set32_fx( pitch_buf, L_deposit_h( L_SUBFR ), st->nb_subfr );                                                              /*Q16*/
     555             :                                                                                                                                   /* PLC: calculate damping factor */
     556           0 :         alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &( st->Mode2_lp_gainp ), 0 ); /*Q14*/
     557             :     }
     558             : 
     559             :     /*-----------------------------------------------------------------*
     560             :      * Construct the random part of excitation
     561             :      *-----------------------------------------------------------------*/
     562             : 
     563             :     {
     564        1097 :         tmpSeed = st->seed_acelp;
     565        1097 :         move16();
     566        1097 :         noise = buf;
     567        1097 :         noise_e = 1; /*set exponent of noise to 1*/
     568        1097 :         move16();
     569             : 
     570        1097 :         tmp_loop = add( L_frame, L_FIR_FER2 - 1 );
     571      826147 :         FOR( i = 0; i < tmp_loop; i++ )
     572             :         {
     573      825050 :             Random( &tmpSeed );
     574      825050 :             noise[i] = shr( tmpSeed, noise_e ); /*Q: -noise_e*/
     575      825050 :             move16();
     576             :         }
     577        1097 :         st->seed_acelp = tmpSeed;
     578        1097 :         move16();
     579             : 
     580        1097 :         tmp_loop = add( add( L_frame, shr( L_frame, 1 ) ), shl( L_FIR_FER2, 1 ) );
     581      421301 :         FOR( ; i < tmp_loop; i++ )
     582             :         {
     583      420204 :             Random( &tmpSeed );
     584      420204 :             noise[i] = shr( tmpSeed, noise_e ); /*Q: -noise_e*/
     585      420204 :             move16();
     586             :         }
     587             :     }
     588        1097 :     test();
     589        1097 :     IF( EQ_16( st->last_good, VOICED_CLAS ) || EQ_16( st->last_good, ONSET ) )
     590             :     {
     591        1063 :         tmp16 = 19661 /*0.6f Q15*/;
     592        1063 :         move16();
     593        1063 :         if ( LE_32( st->output_Fs, 16000 ) )
     594             :         {
     595         222 :             tmp16 = 6554 /*0.2f Q15*/;
     596         222 :             move16();
     597             :         }
     598             : 
     599        1063 :         mem = noise[0];
     600        1063 :         move16();
     601        1063 :         preemph_copy_fx( &noise[1], &noise[1], tmp16, add( add( L_frame, shr( L_frame, 1 ) ), L_FIR_FER2 ), &mem );
     602             :     }
     603             :     /* high rate filter tuning */
     604        1097 :     IF( LE_32( st->output_Fs, 16000 ) )
     605             :     {
     606        2796 :         FOR( i = 0; i < L_FIR_FER2; i++ )
     607             :         {
     608        2563 :             hp_filt[i] = h_high3_16[i]; /*Q15*/
     609        2563 :             move16();
     610             :         }
     611             :     }
     612             :     ELSE /*(st->output_Fs==32000)*/
     613             :     {
     614       10368 :         FOR( i = 0; i < L_FIR_FER2; i++ )
     615             :         {
     616        9504 :             hp_filt[i] = h_high3_32[i]; /*Q15*/
     617        9504 :             move16();
     618             :         }
     619             :     }
     620        1097 :     IF( EQ_16( st->nbLostCmpt, 1 ) )
     621             :     {
     622         737 :         highPassFiltering_fx( st->last_good, add( add( L_frame, shr( L_frame, 1 ) ), L_FIR_FER2 ), noise, hp_filt, L_FIR_FER2 );
     623             :     }
     624             :     ELSE
     625             :     {
     626         360 :         IF( GT_16( st->last_good, UNVOICED_TRANSITION ) )
     627             :         {
     628         360 :             tmp_loop = add( add( L_frame, shr( L_frame, 1 ) ), L_FIR_FER2 );
     629         360 :             gain_tmp = negate( add( -32768, st->cummulative_damping ) ); /*Q15*/
     630      369120 :             FOR( i = 0; i < tmp_loop; i++ )
     631             :             {
     632             :                 Word16 j;
     633      368760 :                 L_tmp2 = 0;
     634      368760 :                 move32();
     635     4425120 :                 FOR( j = 11; j > 0; j-- )
     636             :                 {
     637     4056360 :                     L_tmp2 = L_mac( L_tmp2, noise[( i + sub( L_FIR_FER2, j ) )], hp_filt[( L_FIR_FER2 - j )] );
     638             :                 }
     639      368760 :                 L_tmp2 = Mpy_32_16_1( L_tmp2, st->cummulative_damping /*Q15*/ ); /*Q0, noise_e*/
     640      368760 :                 noise[i] = mac_r( L_tmp2, gain_tmp, noise[i] );                  /*Q15, noise_e*/
     641      368760 :                 move16();
     642             :             }
     643             :         }
     644             :     }
     645             : 
     646             :     /* PLC: [TCX: Fade-out] retrieve background level */
     647        1097 :     tmp16 = 32767;
     648        1097 :     move16();
     649        1097 :     gainSynthDeemph = getLevelSynDeemph_fx( &( tmp16 ), A_local, M, shr( L_frame, 2 ), st->preemph_fac, 1, &gainSynthDeemph_e ); /*Q5*/
     650        1097 :     IF( st->tcxonly != 0 )
     651             :     {
     652             :         /* gainCNG = st->conCngLevelBackgroundTrace/gainSynthDeemph; */
     653         281 :         BASOP_Util_Divide_MantExp( hTcxDec->conCngLevelBackgroundTrace,
     654         281 :                                    hTcxDec->conCngLevelBackgroundTrace_e,
     655             :                                    gainSynthDeemph, gainSynthDeemph_e,
     656             :                                    &gainCNG, &gainCNG_e );
     657             :     }
     658             :     ELSE
     659             :     {
     660             :         /* gainCNG = st->cngTDLevel/gainSynthDeemph; */
     661         816 :         BASOP_Util_Divide_MantExp( st->cngTDLevel,
     662         816 :                                    st->cngTDLevel_e,
     663             :                                    gainSynthDeemph, gainSynthDeemph_e,
     664             :                                    &gainCNG, &gainCNG_e );
     665             :     }
     666             : 
     667        1097 :     gain32 = L_add( st->Mode2_lp_gainc, 0 ); /* start-of-the-frame gain - Q16*/
     668        1097 :     test();
     669        1097 :     if ( EQ_16( st->rf_frame_type, RF_TCXTD1 ) && EQ_16( st->use_partial_copy, 1 ) )
     670             :     {
     671           0 :         gain32 = Mpy_32_16_1( gain32, 22938 /*0.7f Q15*/ ); /*Q16*/
     672             :     }
     673        1097 :     L_tmp = L_shl_sat( gain32, 1 ); /*Q16*/
     674        1097 :     IF( GT_32( L_shl( L_deposit_h( gainCNG ), sub( gainCNG_e, 31 - 16 ) /*Q16*/ ), L_tmp ) )
     675             :     {
     676          17 :         gainCNG_e = sub( 15 + 1, norm_l( L_tmp ) );
     677          17 :         gainCNG = extract_l( L_shr( L_tmp, gainCNG_e ) ); /*Q15,gainCNG_e*/
     678          17 :         gainCNG_e = sub( gainCNG_e, 1 );
     679             :     }
     680             : 
     681             :     /* st->Mode2_lp_gainc = alpha * (st->Mode2_lp_gainc) + (1.0f - alpha) * gainCNG;*/ /* end-of-the-frame gain */
     682             : 
     683        1097 :     L_tmp = Mpy_32_16_1( st->Mode2_lp_gainc, alpha ) /*Q15*/;
     684        1097 :     L_tmp2 = L_mult( sub( 16384 /*1.f Q14*/, alpha ) /*Q14*/, gainCNG /*Q15,gainCNG_e*/ );                      /*Q30,gainCNG_e*/
     685        1097 :     st->Mode2_lp_gainc = BASOP_Util_Add_Mant32Exp( L_tmp, 31 - 15, L_tmp2, add( gainCNG_e, 31 - 30 ), &tmp_e ); /*Q31-tmp_e*/
     686        1097 :     st->Mode2_lp_gainc = L_shl( st->Mode2_lp_gainc, sub( tmp_e, 31 - 16 ) );                                    /*Q16*/
     687        1097 :     move32();
     688        1097 :     move32();
     689             : 
     690             :     /* PLC: [TCX: Fade-out] Linearly attenuate the gain through the frame */
     691             :     /*step = (1.0f/L_frame) * (gain - (st->Mode2_lp_gainc));*/
     692        1097 :     L_tmp = L_sub( gain32, st->Mode2_lp_gainc ); /*Q16*/
     693        1097 :     tmp_e = norm_l( L_tmp );
     694        1097 :     L_tmp = L_shl( L_tmp, tmp_e );                                                      /*Q16,-tmp_e*/
     695        1097 :     step32 = Mpy_32_16_1( L_tmp /*Q16,-tmp_e*/, getInvFrameLen( L_frame ) /*W16Q21*/ ); /*Q22,-tmp_e*/
     696        1097 :     step32 = L_shl( step32, sub( 25 - 22, tmp_e ) );                                    /*Q25*/
     697             : 
     698        1097 :     pt_exc = noise + L_FIR_FER2 / 2;
     699             : 
     700             :     /*gain_inov = 1.0f / (float)sqrt( dot_product( pt_exc, pt_exc, L_frame ) / L_frame + 0.01f );*/ /* normalize energy */
     701        1097 :     L_tmp = Dot_productSq16HQ( 0, pt_exc /*Q0,15+1*/, L_frame, &tmp_e ) /*Q31,tmp_e+16+16*/;
     702        1097 :     L_tmp = Mpy_32_16_1( L_tmp, getInvFrameLen( L_frame ) /*W16Q21*/ ) /*W32Q37,tmp_e+16+16*/ /*Q5,tmp_e*/;
     703        1097 :     tmp_e = add( tmp_e, 31 - 5 );                     /*-->Q31*/
     704        1097 :     gain_inov = round_fx( ISqrt32( L_tmp, &tmp_e ) ); /*Q15,tmp_e*/
     705        1097 :     gain_inov_e = tmp_e;
     706        1097 :     move16();
     707        1097 :     test();
     708        1097 :     test();
     709        1097 :     IF( EQ_16( st->last_good, UNVOICED_CLAS ) && NE_16( st->core_ext_mode, UNVOICED ) )
     710             :     {
     711           0 :         gain_inov = mult_r( gain_inov, 26214 /*0.8f Q15*/ ); /*Q30*/
     712             :     }
     713        1097 :     ELSE IF( !( EQ_16( st->last_good, UNVOICED_CLAS ) || EQ_16( st->last_good, UNVOICED_TRANSITION ) ) )
     714             :     {
     715             :         /*gain_inov *= (1.1f- 0.75*st->lp_gainp);*/
     716        1097 :         L_tmp = Mpy_32_16_1( L_sub( 590558016l /*1.1f Q29*/, Mpy_32_16_1( st->Mode2_lp_gainp, 24576 ) ) /*Q29*/, gain_inov /*Q15,gain_inov_e*/ ); /*Q29,gain_inov_e*/
     717        1097 :         tmp_e = norm_l( L_tmp );
     718        1097 :         L_tmp = L_shl( L_tmp, tmp_e );
     719        1097 :         gain_inov_e = add( sub( gain_inov_e, tmp_e ), 31 - 29 ); /*->Q31*/
     720        1097 :         gain_inov = round_fx_sat( L_tmp );                       /*Q15,gain_inov_e*/
     721             :     }
     722             : 
     723        1097 :     st->Mode2_lp_gainp = L_shr( L_deposit_h( alpha /*Q14*/ ) /*Q14+16*/, 1 ); /*Q29*/
     724        1097 :     move32();
     725        1097 :     pt_exc = noise; /* non-causal ringing of the FIR filter   */
     726             : 
     727        1097 :     tmp_e = norm_l( gain32 );
     728        1097 :     tmp_e = sub( tmp_e, 5 );         /*5 Bit additional Headroom for the gain - should be enough*/
     729        1097 :     gain32 = L_shl( gain32, tmp_e ); /*Q16,-tmp_e*/
     730        1097 :     L_tmp = Mpy_32_16_1( gain32 /*Q16,-tmp_e*/, gain_inov /*Q15,gain_inov_e*/ ) /*Q16,gain_inov_e-tmp_e*/;
     731             : 
     732        1097 :     gain_tmp = round_fx( L_tmp ); /*Q0, gain_inov_e-tmp_e*/
     733             : 
     734        6582 :     FOR( i = 0; i < L_FIR_FER2 / 2; i++ )
     735             :     {
     736        5485 :         *pt_exc = mult_r( *pt_exc, gain_tmp ); /*Q-15,noise_e+gain_inov_e-tmp_e*/
     737        5485 :         move16();
     738        5485 :         pt_exc++;
     739             :     }
     740        1097 :     tmp16 = add( L_frame, L_FIR_FER2 / 2 );
     741        1097 :     step32_tmp = L_shl( step32 /*Q25*/, sub( tmp_e, 25 - 16 ) ); /*Q16,-tmp_e*/
     742      820662 :     FOR( i = 0; i < tmp16; i++ )                                 /* Actual filtered random part of excitation */
     743             :     {
     744      819565 :         *pt_exc = mult_r( *pt_exc, gain_tmp ); /*Q-15,noise_e+gain_inov_e-tmp_e*/
     745      819565 :         move16();
     746      819565 :         pt_exc++;
     747      819565 :         gain32 = L_sub( gain32 /*Q16,-tmp_e*/, step32_tmp ); /*Q16,-tmp_e*/
     748      819565 :         gain_tmp = mult_r( round_fx( gain32 /*Q16,-tmp_e*/ ) /*Q0*/, gain_inov /*Q15,gain_inov_e*/ ) /*Q0,gain_inov_e-tmp_e*/;
     749             :     }
     750        1097 :     tmp16 = shr( L_frame, 1 );
     751      408137 :     FOR( i = 0; i < tmp16; i++ ) /* causal ringing of the FIR filter */
     752             :     {
     753      407040 :         *pt_exc = mult_r( *pt_exc, gain_tmp ); /*Q-15,noise_e+gain_inov_e-tmp_e*/
     754      407040 :         move16();
     755      407040 :         pt_exc++;
     756             :     }
     757        1097 :     noise_e = add( sub( add( noise_e, gain_inov_e ), tmp_e ), 15 ); /*--> noise is Q0, noise_e*/
     758             :     /*buf[0;L_FIR_FER2 + L_Frame + L_Frame/2] Q0, noise_e*/
     759             : 
     760             :     /*-----------------------------------------------------------------*
     761             :      * Construct the total excitation
     762             :      *-----------------------------------------------------------------*/
     763             : 
     764        1097 :     IF( GE_16( st->last_good, UNVOICED_TRANSITION ) )
     765             :     {
     766        1097 :         tmp16 = add( L_frame, shr( L_frame, 1 ) );
     767     1222217 :         FOR( i = 0; i < tmp16; i++ )
     768             :         {
     769     1221120 :             exc[i] = add_sat( exc[i], shl_sat( noise[i + ( L_FIR_FER2 / 2 )], add( Q_exc, noise_e ) ) ); /*Q1*/
     770     1221120 :             move16();
     771             :         }
     772             :     }
     773             :     ELSE
     774             :     {
     775           0 :         bufferCopyFx( noise + L_FIR_FER2 / 2, exc, add( L_frame, shr( L_frame, 1 ) ), 0 /*Q_noise*/, noise_e, Q_exc, 0 /*exc_e*/ );
     776           0 :         Copy( exc + sub( L_frame, shl( L_subfr, 1 ) ), hTcxDec->old_excFB_fx, add( shl( L_subfr, 1 ), shr( L_frame, 1 ) ) ); /*Q_exc*/
     777             :         /* copy old_exc as 16kHz for acelp decoding */
     778           0 :         IF( EQ_16( st->nbLostCmpt, 1 ) )
     779             :         {
     780           0 :             lerp( exc, st->old_exc_fx, L_EXC_MEM_DEC, add( L_frame, shr( L_frame, 1 ) ) );
     781             :         }
     782             :         ELSE
     783             :         {
     784           0 :             Copy( st->old_exc_fx + L_FRAME16k, st->old_exc_fx, L_FRAME16k / 2 ); /*Q_exc*/
     785           0 :             lerp( exc, st->old_exc_fx + L_FRAME16k / 2, L_FRAME16k, L_frame );
     786             :         }
     787           0 :         st->Q_exc = Q_exc;
     788           0 :         move16();
     789             :     }
     790             :     /*buf[0;L_FIR_FER2 + L_Frame + L_Frame/2] Q0, noise_e*/
     791             :     /*buf[OLD_EXC_SIZE_DEC;3/2 L_frame] Q1*/
     792             : 
     793             :     /* Update Pitch Lag memory */
     794        1097 :     Copy32( &st->old_pitch_buf_fx[st->nb_subfr], st->old_pitch_buf_fx, st->nb_subfr ); /*Q16*/
     795        1097 :     Copy32( pitch_buf, &st->old_pitch_buf_fx[st->nb_subfr], st->nb_subfr );            /*Q16*/
     796             : 
     797             :     /*----------------------------------------------------------*
     798             :      * - compute the synthesis speech                           *
     799             :      *----------------------------------------------------------*/
     800             : 
     801        1097 :     syn = buf + M;             /*Q_syn*/
     802        1097 :     Copy( synth - M, buf, M ); /*Q_syn*/
     803             : 
     804        1097 :     new_Q = sub( Q_exc, 3 );
     805        1097 :     new_Q = s_max( new_Q, -1 );
     806             : 
     807        1097 :     tmp16 = s_min( new_Q, st->prev_Q_syn );
     808        1097 :     st->prev_Q_syn = new_Q;
     809        1097 :     move16();
     810             : 
     811        1097 :     exp_scale = sub( tmp16, sub( Q_exc, 1 ) );
     812        1097 :     Q_syn = tmp16;
     813        1097 :     move16();
     814             : 
     815        1097 :     Copy_Scale_sig( buf, mem_syn, M, exp_scale ); /*Q: tmp16*/
     816             : 
     817        1097 :     tmp_deemph = shl_sat( tmp_deemph, Q_syn ); /*Q_syn*/
     818        1097 :     st->Q_syn = Q_syn;
     819        1097 :     move16();
     820             : 
     821             :     /*buf[OLD_EXC_SIZE_DEC;3/2 L_frame] Q1: exc*/
     822             :     /*buf[0;M] Q0: mem_syn*/
     823        1097 :     E_UTIL_synthesis(
     824        1097 :         sub( Q_exc, Q_syn ),
     825             :         A_local,
     826             :         &exc[0],
     827             :         &syn[0],
     828        1097 :         add( L_frame, shr( L_frame, 1 ) ),
     829             :         mem_syn,
     830             :         1,
     831             :         M );
     832             : 
     833             :     /*buf[OLD_EXC_SIZE_DEC;3/2 L_frame-1] Q1: exc*/
     834             :     /*buf[0;M-1] Q0: mem_syn*/
     835             :     /*buf[M;3/2 L_frame-1] Q-1: syn*/
     836             : 
     837        1097 :     n = extract_h( L_mult( L_frame, 9216 /*(float)N_ZERO_MDCT_NS/(float)FRAME_SIZE_NS Q15*/ ) ); /*q0*/
     838             : 
     839             :     /* update ACELP synthesis memory */
     840        1097 :     mem_syn_r_size_old = shr( L_frame, 4 ); /* replace 1.25/20.0 by shr(4) */
     841             :     /* copy mem_syn as 16kHz */
     842        1097 :     mem_syn_r_size_new = shr( L_FRAME16k, 4 ); /* replace 1.25/20.0 by shr(4) */
     843             : 
     844        1097 :     Copy( syn + sub( L_frame, L_SYN_MEM ), st->mem_syn_r, L_SYN_MEM ); /*Q_syn*/
     845        1097 :     lerp( st->mem_syn_r + sub( L_SYN_MEM, mem_syn_r_size_old ), st->mem_syn_r + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old );
     846        1097 :     Copy( st->mem_syn_r + L_SYN_MEM - M, st->mem_syn2_fx, M ); /*Q_syn*/
     847             : 
     848             :     /* Deemphasis and output synth and ZIR */
     849        1097 :     deemph_fx( syn, st->preemph_fac, add( L_frame, shr( L_frame, 1 ) ), &tmp_deemph );
     850        1097 :     bufferCopyFx( syn + sub( L_frame, M + 1 ), st->syn, 1 + M, Q_syn, 0, 0, 0 ); /*Q_syn*/
     851             : 
     852             : 
     853        1097 :     lerp( syn + sub( L_frame, shr( L_frame, 1 ) ), hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) );
     854        1097 :     st->hTcxDec->Q_old_syn_Overl = Q_syn;
     855        1097 :     move16();
     856        1097 :     Copy( syn + sub( L_frame, n ), hHQ_core->old_out_fx, sub( L_frame, n ) ); /*Q_syn*/
     857             : 
     858      179177 :     FOR( i = 0; i < W12; i++ )
     859             :     {
     860      178080 :         hHQ_core->old_out_fx[( i + n )] = round_fx( Mpy_32_16_1( L_mult( w[i].v.re, w[i].v.re ), hHQ_core->old_out_fx[( i + n )] ) ); /*Q_syn*/
     861      178080 :         move16();
     862             :     }
     863      179177 :     FOR( ; i < W1; i++ )
     864             :     {
     865      178080 :         hHQ_core->old_out_fx[( i + n )] = round_fx( Mpy_32_16_1( L_mult( w[( ( W12 - 1 ) - ( i - W12 ) )].v.im, w[( ( W12 - 1 ) - ( i - W12 ) )].v.im ), hHQ_core->old_out_fx[( i + n )] ) ); /*Q_syn*/
     866      178080 :         move16();
     867             :     }
     868             : 
     869        1097 :     set16_fx( &hHQ_core->old_out_fx[( W1 + n )], 0, n );
     870             : 
     871        1097 :     hHQ_core->Q_old_wtda = Q_syn;
     872        1097 :     move16();
     873             : 
     874             :     /* As long as there is no synth scaling factor introduced, which
     875             :     is given to the outside, there might occur overflows here */
     876             :     BASOP_SATURATE_WARNING_OFF_EVS
     877        1097 :     bufferCopyFx( syn, synth, L_frame, Q_syn, 0, 0, 0 ); /*Q_syn*/
     878             :     BASOP_SATURATE_WARNING_ON_EVS
     879             : 
     880        1097 :     Copy_Scale_sig( syn + L_frame, hTcxDec->syn_OverlFB, shr( L_frame, 1 ), sub( 0, Q_syn ) ); /*Q0*/
     881        1097 :     hTcxDec->Q_syn_OverlFB = 0;
     882        1097 :     move16();
     883             : 
     884             :     /* copy total excitation exc2 as 16kHz for acelp mode1 decoding */
     885        1097 :     IF( st->hWIDec != NULL )
     886             :     {
     887           0 :         lerp( exc, st->hWIDec->old_exc2_fx, L_EXC_MEM, L_frame );
     888           0 :         lerp( syn, st->hWIDec->old_syn2_fx, L_EXC_MEM, L_frame );
     889             :     }
     890             : 
     891        1097 :     st->bfi_pitch_fx /*Q6*/ = round_fx_sat( L_shl_sat( pitch_buf[( st->nb_subfr - 1 )] /*15Q16*/, 6 /*Q6*/ ) );
     892        1097 :     move16();
     893        1097 :     st->bfi_pitch_frame = st->L_frame;
     894        1097 :     move16();
     895             : 
     896             :     /* create aliasing and windowing need for transition to TCX10/5 */
     897        1097 :     bufferCopyFx( syn + L_frame, hTcxDec->syn_Overl_TDACFB, shr( L_frame, 1 ), Q_syn, 0, -1, 0 );
     898        1097 :     hTcxDec->Q_syn_Overl_TDACFB = add( st->Q_syn, sub( st->Q_syn, -1 ) );
     899        1097 :     move16();
     900             : 
     901      179177 :     FOR( i = 0; i < W12; i++ )
     902             :     {
     903      178080 :         buf[i] = mult_r( hTcxDec->syn_Overl_TDACFB[i], w[i].v.re ); /*hTcxDec->Q_syn_Overl_TDACFB*/
     904      178080 :         move16();
     905             :     }
     906      179177 :     FOR( ; i < W1; i++ )
     907             :     {
     908      178080 :         buf[i] = mult_r( hTcxDec->syn_Overl_TDACFB[i], w[( ( W12 - 1 ) - ( i - W12 ) )].v.im ); /*hTcxDec->Q_syn_Overl_TDACFB*/
     909      178080 :         move16();
     910             :     }
     911             : 
     912             : 
     913      179177 :     FOR( i = 0; i < W2; i++ )
     914             :     {
     915      178080 :         hTcxDec->syn_Overl_TDACFB[i] = add_sat( buf[i], buf[( ( W1 - 1 ) - i )] ); /*hTcxDec->Q_syn_Overl_TDACFB*/
     916      178080 :         move16();
     917             :     }
     918             : 
     919      179177 :     FOR( i = 0; i < W2; i++ )
     920             :     {
     921      178080 :         hTcxDec->syn_Overl_TDACFB[( W2 + i )] = add_sat( buf[( W2 + i )], buf[( ( ( W1 - 1 ) - W2 ) - i )] ); /*hTcxDec->Q_syn_Overl_TDACFB*/
     922      178080 :         move16();
     923             :     }
     924             : 
     925      179177 :     FOR( i = 0; i < W12; i++ )
     926             :     {
     927      178080 :         hTcxDec->syn_Overl_TDACFB[i] = mult_r( hTcxDec->syn_Overl_TDACFB[i], w[i].v.re ); /*hTcxDec->Q_syn_Overl_TDACFB*/
     928      178080 :         move16();
     929             :     }
     930      179177 :     FOR( ; i < W1; i++ )
     931             :     {
     932      178080 :         hTcxDec->syn_Overl_TDACFB[i] = mult_r( hTcxDec->syn_Overl_TDACFB[i], w[( ( W12 - 1 ) - ( i - W12 ) )].v.im ); /*hTcxDec->Q_syn_Overl_TDACFB*/
     933      178080 :         move16();
     934             :     }
     935             : 
     936        1097 :     st->hTcxCfg->tcx_curr_overlap_mode = FULL_OVERLAP;
     937        1097 :     move16();
     938             : 
     939        1097 :     synth[-1] = pre_emph_buf; /*Q0*/
     940        1097 :     move16();
     941             : 
     942             :     /* update memory for low band */
     943        1097 :     Scale_sig( hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), sub( -1, Q_syn ) ); /*Q_syn*/
     944        1097 :     hTcxDec->Q_old_syn_Overl = -1;
     945        1097 :     move16();
     946        1097 :     lerp( hTcxDec->syn_OverlFB, hTcxDec->syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) );
     947        1097 :     hTcxDec->Q_syn_Overl = hTcxDec->Q_syn_OverlFB;
     948        1097 :     move16();
     949        1097 :     lerp( hTcxDec->syn_Overl_TDACFB, hTcxDec->syn_Overl_TDAC, shr( st->L_frame, 1 ), shr( L_frame, 1 ) );
     950        1097 :     hTcxDec->Q_syn_Overl_TDAC = hTcxDec->Q_syn_Overl_TDACFB;
     951        1097 :     move16();
     952        1097 :     lerp( st->hHQ_core->old_out_fx, st->hHQ_core->old_out_LB_fx, st->L_frame, L_frame );
     953             : 
     954        1097 :     st->old_enr_LP = Enr_1_Az_fx( A_local, L_SUBFR ); /*Q3*/
     955        1097 :     move16();
     956             : 
     957        1097 :     return;
     958             : }
     959             : 
     960        3555 : void con_tcx_ivas_fx(
     961             :     Decoder_State *st, /* i/o: coder memory state            */
     962             :     Word16 synth[],
     963             :     /* i/o:   synth[]                     */ /*Q0 */
     964             :     const Word16 coh,                        /* i  : coherence of stereo signal  Q14*/
     965             :     Word16 *noise_seed,                      /* i/o: noise seed for stereo       Q0*/
     966             :     const Word16 only_left,                  /* i  : TD-PLC only in left channel Q0*/
     967             :     const Word16 *A_cng                      /* i  : CNG LP filter coefficients  Q14*/
     968             : )
     969             : {
     970             :     Word16 i, s, c, L_frame, L_subfr, fLowPassFilter, T0;
     971             :     Word16 n, mem_syn_r_size_old, mem_syn_r_size_new;
     972             :     Word16 *noise;
     973             :     Word16 mem_syn[M], *syn;
     974             :     Word16 *exc, buf[OLD_EXC_SIZE_DEC + L_FRAME_MAX + L_FRAME_MAX / NB_SUBFR + 1 + L_FRAME_MAX / 2];
     975             :     Word16 pre_emph_buf;
     976             :     Word16 hp_filt[L_FIR_FER2];
     977             :     Word16 alpha;
     978             :     Word16 tmp_deemph, gain, gainCNG, gain_inov;
     979             :     Word16 *pt_exc, *pt1_exc;
     980             :     Word16 Tc, tmpSeed;
     981             :     Word16 fUseExtrapolatedPitch;
     982             :     Word16 *ana_window;
     983             :     Word16 r_h[M + 1], A_local[M + 1], mem, r_l[M + 1];
     984             :     PWord16 const *w;
     985             :     Word16 W1, W2, W12;
     986             :     Word16 Q_r;
     987             :     Word16 tmp16, tmp16_2, tmp_loop, tmp_e, gain_tmp;
     988             :     Word16 gainCNG_e, noise_e, gain_inov_e; /*Exponents for gainCNG, noise, gain_inov*/
     989             :     Word16 Q_syn;                           /*Q format of temporary synthesis buffer syn*/
     990             :     Word32 L_tmp, L_tmp2, step32_tmp;
     991             :     Word32 predPitchLag, pitch_buf[NB_SUBFR16k], step32, gain32;
     992             :     Word16 extrapolationFailed;
     993             :     Word16 gainSynthDeemph;
     994             :     Word16 gainSynthDeemph_e;
     995             :     Word32 old_pitch_buf[2 * NB_SUBFR16k + 2];
     996             :     Word16 Q_exc, new_Q, exp_scale;
     997             :     Word16 offset;
     998             :     HQ_DEC_HANDLE hHQ_core;
     999             :     TCX_LTP_DEC_HANDLE hTcxLtpDec;
    1000             :     TCX_DEC_HANDLE hTcxDec;
    1001             : 
    1002        3555 :     hTcxLtpDec = st->hTcxLtpDec;
    1003        3555 :     hHQ_core = st->hHQ_core;
    1004        3555 :     hTcxDec = st->hTcxDec;
    1005             : 
    1006             :     /* inits */
    1007        3555 :     alpha = 0;
    1008        3555 :     move16();
    1009        3555 :     fUseExtrapolatedPitch = 0;
    1010        3555 :     move16();
    1011        3555 :     extrapolationFailed = 1;
    1012        3555 :     move16();
    1013             : 
    1014        3555 :     noise_e = 0;
    1015        3555 :     move16();
    1016        3555 :     Q_syn = -1; /*Q format of temporary synthesis buffer syn*/
    1017        3555 :     move16();
    1018        3555 :     offset = 0;
    1019        3555 :     move16();
    1020             : 
    1021             :     /* Framing parameters */
    1022        3555 :     L_frame = hTcxDec->L_frameTCX;
    1023        3555 :     move16();
    1024             :     /* L_subfr = st->L_frameTCX/st->nb_subfr */
    1025        3555 :     L_subfr = mult_r( hTcxDec->L_frameTCX, div_s( 1, st->nb_subfr ) ); /*Q0*/
    1026        3555 :     assert( L_subfr == hTcxDec->L_frameTCX / st->nb_subfr );
    1027        3555 :     w = st->hTcxCfg->tcx_mdct_windowFB; /*pointer - no need to instrument Q15*/
    1028        3555 :     W1 = st->hTcxCfg->tcx_mdct_window_lengthFB;
    1029        3555 :     move16();
    1030        3555 :     W2 = shr( st->hTcxCfg->tcx_mdct_window_lengthFB, 1 );
    1031        3555 :     W12 = shr( W1, 1 );
    1032             : 
    1033             :     /* take the previous frame last pitch */
    1034        3555 :     Tc = round_fx( st->old_fpitchFB ); /*Q0*/
    1035             : 
    1036             : 
    1037        3555 :     set16_fx( buf, 0, OLD_EXC_SIZE_DEC + L_FRAME_MAX + L_FRAME_MAX / NB_SUBFR + 1 + L_FRAME_MAX / 2 ); /* initialize buf with 0 */
    1038             :     // set16_fx(buf,0,shr(sizeof(buf),1)); /* initialize buf with 0 */
    1039             : 
    1040        3555 :     c = BASOP_Util_Divide1616_Scale(
    1041             :         L_frame,
    1042        3555 :         st->L_frame,
    1043             :         &s );
    1044             : 
    1045       46215 :     FOR( i = 0; i < 2 * NB_SUBFR16k + 2; i++ )
    1046             :     {
    1047       42660 :         old_pitch_buf[i] = L_shl( Mpy_32_16_1( st->old_pitch_buf_fx[i], c ), s ); /*Q16*/
    1048       42660 :         move32();
    1049             :     }
    1050             : 
    1051             :     /* set excitation memory*/
    1052        3555 :     exc = buf + OLD_EXC_SIZE_DEC;
    1053        3555 :     tmp_deemph = synth[-1]; /*Q0*/
    1054        3555 :     move16();
    1055        3555 :     pre_emph_buf = synth[-1]; /*Q0*/
    1056        3555 :     move16();
    1057             : 
    1058        3555 :     test();
    1059        3555 :     IF( ( EQ_16( st->nbLostCmpt, 1 ) ) || hTcxDec->tcxConceal_recalc_exc )
    1060             :     {
    1061             :         /* apply pre-emphasis to the signal */
    1062        1623 :         mem = synth[( -( ( ( L_frame / 2 ) + hTcxDec->pit_max_TCX ) + M + M ) - 1 )]; /*Q0*/
    1063        1623 :         move16();
    1064        1623 :         Q_exc = E_UTIL_f_preemph3_ivas_fx( &( synth[-( ( ( L_frame / 2 ) + hTcxDec->pit_max_TCX ) + 2 * M )] ), st->preemph_fac, add( add( shr( L_frame, 1 ), hTcxDec->pit_max_TCX ), shl( M, 1 ) ), &mem, 1 );
    1065        1623 :         st->Mode2_lp_gainc = L_deposit_l( 0 );
    1066             : 
    1067        1623 :         st->Mode2_lp_gainp = get_gain2( synth - shl( L_subfr, 1 ), synth - add( shl( L_subfr, 1 ), Tc ), shl( L_subfr, 1 ) );
    1068        1623 :         move32();
    1069             : 
    1070        1623 :         st->Mode2_lp_gainp = L_max( st->Mode2_lp_gainp, 0 );                   /*Q16*/
    1071        1623 :         st->Mode2_lp_gainp = L_min( st->Mode2_lp_gainp, 65536l /*1.0f Q16*/ ); /*Q16*/
    1072        1623 :         st->Mode2_lp_gainp = L_shl( st->Mode2_lp_gainp, 13 );                  /*Q29*/
    1073        1623 :         move32();
    1074        1623 :         move32();
    1075        1623 :         move32();
    1076             : 
    1077        1623 :         ana_window = buf; /*Q15*/
    1078        1623 :         ham_cos_window( ana_window, mult( L_frame, 24576 /*0.75f Q15*/ ), shr( L_frame, 2 ) );
    1079             : 
    1080             :         /* Autocorrelation */
    1081        1623 :         autocorr_fx( &( synth[( -L_frame - 1 )] ), M, r_h, r_l, &Q_r, L_frame, ana_window, 0, 0 );
    1082             : 
    1083             :         /* Lag windowing */
    1084        1623 :         lag_wind( r_h, r_l, M, st->output_Fs, LAGW_STRONG );
    1085             : 
    1086             :         /* Levinson Durbin */
    1087        1623 :         E_LPC_lev_dur_ivas_fx( r_h, r_l, A_local, NULL, M, NULL );
    1088             : 
    1089             :         /* copy for multiple frame loss */
    1090        1623 :         Copy( A_local, st->old_Aq_12_8_fx, M + 1 ); /*Q14*/
    1091             : 
    1092             :         /* Residu */
    1093        1623 :         assert( ( 2 * L_subfr + Tc + 1 + M ) <= hTcxDec->old_synth_lenFB );
    1094             : 
    1095             :         BASOP_SATURATE_WARNING_OFF_EVS /*saturation possible in case of spiky synthesis*/
    1096        4869 :             Residu3_fx(
    1097             :                 A_local,
    1098        1623 :                 &( synth[-add( add( add( shl( L_subfr, 1 ), Tc ), 1 ), M )] ), /*Qx   = Q0*/
    1099        1623 :                 &( exc[-add( add( add( shl( L_subfr, 1 ), Tc ), 1 ), M )] ),   /*Qx+1 = Q1*/
    1100        1623 :                 add( add( add( shl( L_subfr, 1 ), Tc ), 1 ), M ),
    1101             :                 1 );
    1102             :         BASOP_SATURATE_WARNING_ON_EVS
    1103             :     }
    1104             :     ELSE
    1105             :     {
    1106             :         /* apply pre-emphasis to the signal */
    1107        1932 :         mem = synth[( -L_frame - 1 )]; /*Q0*/
    1108        1932 :         move16();
    1109        1932 :         Q_exc = E_UTIL_f_preemph3_ivas_fx( &( synth[-L_frame] ), st->preemph_fac, L_frame, &mem, 1 );
    1110        1932 :         Copy( st->old_Aq_12_8_fx, A_local, M + 1 ); /*Q14*/
    1111             : 
    1112        1932 :         offset = shr( L_frame, 1 );
    1113        1932 :         IF( GE_16( st->last_good, UNVOICED_TRANSITION ) )
    1114             :         {
    1115        1932 :             tmp16 = s_max( Tc - shr( L_frame, 1 ), 0 );
    1116        1932 :             Copy_Scale_sig( hTcxDec->old_excFB_fx, &( exc[-tmp16] ), add( offset, tmp16 ), sub( Q_exc, st->Q_exc ) ); /*Q_exc*/
    1117             :         }
    1118             :         ELSE
    1119             :         {
    1120           0 :             Copy_Scale_sig( hTcxDec->old_excFB_fx, &( exc[-( L_subfr * 2 )] ), add( shl( L_subfr, 1 ), offset ), sub( Q_exc, st->Q_exc ) ); /*Q_exc*/
    1121             :         }
    1122             :     }
    1123             : 
    1124             :     /*-----------------------------------------------------------------*
    1125             :      * PLC: Construct the harmonic part of excitation
    1126             :      *-----------------------------------------------------------------*/
    1127             : 
    1128        3555 :     test();
    1129        3555 :     test();
    1130        3555 :     IF( GT_16( st->last_good, UNVOICED_CLAS ) && !( EQ_16( st->last_good, UNVOICED_TRANSITION ) && EQ_16( st->core_ext_mode, GENERIC ) ) )
    1131             :     {
    1132        3555 :         test();
    1133        3555 :         IF( EQ_16( st->nbLostCmpt, 1 ) || hTcxDec->tcxConceal_recalc_exc )
    1134             :         {
    1135        1623 :             calcGainc_fx( exc, Q_exc, st->old_fpitchFB, L_subfr, st->Mode2_lp_gainp, &( st->Mode2_lp_gainc ) );
    1136             :         }
    1137             : 
    1138        3555 :         tmp16 = 0;
    1139        3555 :         move16();
    1140        3555 :         if ( GT_32( st->output_Fs, 25600 ) )
    1141             :         {
    1142        2519 :             tmp16 = 1;
    1143        2519 :             move16();
    1144             :         }
    1145             : 
    1146        3555 :         test();
    1147        3555 :         test();
    1148        3555 :         test();
    1149        3555 :         test();
    1150        3555 :         IF( ( ( EQ_16( st->nbLostCmpt, 1 ) ) || hTcxDec->tcxConceal_recalc_exc ) && GE_16( st->rf_frame_type, RF_TCXFD ) && LE_16( st->rf_frame_type, RF_TCXTD2 ) && st->use_partial_copy )
    1151           0 :         {
    1152             :             Word32 tcxltp_pitch_tmp; /*15Q16*/
    1153             :             Word16 scale_tmp;        /*getInvFrameLen()->9Q6*/
    1154             :             Word16 tmp_shift;
    1155           0 :             tcxltp_pitch_tmp = L_add( L_deposit_h( hTcxLtpDec->tcxltp_pitch_int ), L_shl( L_deposit_l( div_s( hTcxLtpDec->tcxltp_pitch_fr, st->pit_res_max ) ), 1 ) ); /*15Q16*/
    1156           0 :             scale_tmp = mult_r( hTcxDec->L_frameTCX, getInvFrameLen( st->L_frame ) );                                                                                  /*getInvFrameLen()->9Q6*/
    1157           0 :             tmp_shift = norm_s( scale_tmp );
    1158             : 
    1159           0 :             predPitchLag = L_shl( Mpy_32_16_1( tcxltp_pitch_tmp, shl( scale_tmp, tmp_shift ) ), sub( 9, tmp_shift ) ); /*Q16*/
    1160             : 
    1161           0 :             T0 = round_fx( predPitchLag ); /*Q0*/
    1162             : 
    1163           0 :             test();
    1164           0 :             test();
    1165           0 :             if ( ( T0 > 0 ) && ( NE_16( T0, Tc ) ) && ( LT_32( L_deposit_h( abs_s( sub( T0, Tc ) ) ) /*Q16*/, L_mult( 4915 /*.15f Q15*/ /*Q15*/, Tc /*Q0*/ ) /*Q16*/ ) ) )
    1166             :             {
    1167           0 :                 fUseExtrapolatedPitch = 1;
    1168           0 :                 move16();
    1169             :             }
    1170             :         }
    1171             :         ELSE
    1172             :         {
    1173             : 
    1174        3555 :             pitch_pred_linear_fit(
    1175        3555 :                 st->nbLostCmpt,
    1176        3555 :                 st->last_good,
    1177             :                 old_pitch_buf,
    1178             :                 &( st->old_fpitchFB ),
    1179             :                 &predPitchLag,
    1180        3555 :                 hTcxDec->pit_min_TCX,
    1181        3555 :                 hTcxDec->pit_max_TCX,
    1182        3555 :                 st->mem_pitch_gain,
    1183             :                 tmp16,
    1184        3555 :                 st->plc_use_future_lag,
    1185             :                 &extrapolationFailed,
    1186        3555 :                 st->nb_subfr );
    1187             : 
    1188        3555 :             T0 = round_fx( predPitchLag );
    1189        3555 :             test();
    1190        3555 :             test();
    1191        3555 :             test();
    1192        3555 :             if ( ( T0 > 0 ) && ( NE_16( T0, Tc ) ) && ( LT_32( L_deposit_h( abs_s( sub( T0, Tc ) ) ) /*Q16*/, L_mult( 4915 /*.15f Q15*/ /*Q15*/, Tc /*Q0*/ ) /*Q16*/ ) ) && ( extrapolationFailed == 0 ) )
    1193             :             {
    1194         686 :                 fUseExtrapolatedPitch = 1;
    1195         686 :                 move16();
    1196             :             }
    1197             :         }
    1198             : 
    1199             : 
    1200        3555 :         fLowPassFilter = 0;
    1201        3555 :         move16();
    1202        3555 :         pt_exc = exc + offset; /*Q_exc*/
    1203        3555 :         pt1_exc = pt_exc - Tc; /*Q_exc*/
    1204             : 
    1205        3555 :         if ( fUseExtrapolatedPitch != 0 )
    1206             :         {
    1207         686 :             pt_exc = buf; /*Q_exc*/
    1208             :         }
    1209        3555 :         test();
    1210        3555 :         IF( LT_16( st->stab_fac_fx, 32767 /*1.f Q15*/ ) && EQ_16( st->nbLostCmpt, 1 ) )
    1211             :         {
    1212             :             /* pitch cycle is first low-pass filtered */
    1213             : 
    1214         278 :             IF( LE_32( st->output_Fs, 16000 ) )
    1215             :             {
    1216        5273 :                 FOR( i = 0; i < Tc; i++ )
    1217             :                 {
    1218        5215 :                     *pt_exc++ = mac_r( L_mac( L_mac( L_mac( L_mac( L_mac( L_mac( L_mac( L_mac( L_mac(
    1219        5215 :                                                                                                    L_mult( 174 /* 0.0053f Q15*/, pt1_exc[-5] ),
    1220        5215 :                                                                                                    0 /* 0.0000f Q15*/, pt1_exc[-4] ),
    1221        5215 :                                                                                                -1442 /*-0.0440f Q15*/, pt1_exc[-3] ),
    1222        5215 :                                                                                         0 /* 0.0000f Q15*/, pt1_exc[-2] ),
    1223        5215 :                                                                                  8641 /* 0.2637f Q15*/, pt1_exc[-1] ),
    1224        5215 :                                                                           18022 /* 0.5500f Q15*/, pt1_exc[0] ),
    1225        5215 :                                                                    8641 /* 0.2637f Q15*/, pt1_exc[1] ),
    1226        5215 :                                                             0 /* 0.0000f Q15*/, pt1_exc[2] ),
    1227        5215 :                                                      -1442 /*-0.0440f Q15*/, pt1_exc[3] ),
    1228        5215 :                                               0 /* 0.0000f Q15*/, pt1_exc[4] ),
    1229        5215 :                                        174 /* 0.0053f Q15*/, pt1_exc[5] ); /*Q_exc*/
    1230        5215 :                     move16();
    1231        5215 :                     pt1_exc++;
    1232             :                 }
    1233             :             }
    1234             :             ELSE /*(st->output_Fs >= 32000)*/
    1235             :             {
    1236       57467 :                 FOR( i = 0; i < Tc; i++ )
    1237             :                 {
    1238       57247 :                     *pt_exc++ = mac_r( L_mac( L_mac( L_mac( L_mac( L_mac( L_mac( L_mac( L_mac( L_mac(
    1239       57247 :                                                                                                    L_mult( -174 /*-0.0053f Q15*/, pt1_exc[-5] ),
    1240       57247 :                                                                                                    -121 /*-0.0037f Q15*/, pt1_exc[-4] ),
    1241       57247 :                                                                                                -459 /*-0.0140f Q15*/, pt1_exc[-3] ),
    1242       57247 :                                                                                         590 /* 0.0180f Q15*/, pt1_exc[-2] ),
    1243       57247 :                                                                                  8743 /* 0.2668f Q15*/, pt1_exc[-1] ),
    1244       57247 :                                                                           16355 /* 0.4991f Q15*/, pt1_exc[0] ),
    1245       57247 :                                                                    8743 /* 0.2668f Q15*/, pt1_exc[1] ),
    1246       57247 :                                                             590 /* 0.0180f Q15*/, pt1_exc[2] ),
    1247       57247 :                                                      -459 /*-0.0140f Q15*/, pt1_exc[3] ),
    1248       57247 :                                               -121 /*-0.0037f Q15*/, pt1_exc[4] ),
    1249       57247 :                                        -174 /*-0.0053f Q15*/, pt1_exc[5] ); /*Q_exc*/
    1250       57247 :                     move16();
    1251       57247 :                     pt1_exc++;
    1252             :                 }
    1253             :             }
    1254             : 
    1255         278 :             fLowPassFilter = 1;
    1256         278 :             move16();
    1257             :         }
    1258             :         ELSE
    1259             :         {
    1260             :             /* copy the first pitch cycle without low-pass filtering */
    1261      752909 :             FOR( i = 0; i < Tc; i++ )
    1262             :             {
    1263      749632 :                 *pt_exc++ = *pt1_exc++; /*Q_exc*/
    1264      749632 :                 move16();
    1265             :             }
    1266        3277 :             fLowPassFilter = 1;
    1267        3277 :             move16();
    1268             :         }
    1269             : 
    1270        3555 :         if ( fUseExtrapolatedPitch != 0 )
    1271             :         {
    1272         686 :             pt1_exc = buf;
    1273             :         }
    1274        3555 :         tmp16 = add( sub( L_frame, imult1616( fLowPassFilter, Tc ) ), L_subfr );
    1275     2124789 :         FOR( i = 0; i < tmp16; i++ )
    1276             :         {
    1277     2121234 :             *pt_exc++ = *pt1_exc++; /*Q_exc*/
    1278     2121234 :             move16();
    1279             :         }
    1280             : 
    1281        3555 :         IF( fUseExtrapolatedPitch != 0 )
    1282             :         {
    1283         686 :             get_subframe_pitch( st->nb_subfr,
    1284             :                                 st->old_fpitch,
    1285             :                                 /* predPitchLag * L_frame/st->L_frame, */
    1286             :                                 L_shr( Mpy_32_16_1( predPitchLag /*Q16*/,
    1287         686 :                                                     mult_r( st->L_frame /*Q0*/,
    1288         686 :                                                             getInvFrameLen( L_frame ) /*Q21*/
    1289             :                                                             )                         /*Q6*/
    1290             :                                                     ) /*Q7*/,
    1291             :                                        7 - 16 ) /*Q16*/,
    1292             :                                 pitch_buf );
    1293             : 
    1294         686 :             PulseResynchronization_fx( buf, exc, L_frame, st->nb_subfr, st->old_fpitchFB, predPitchLag );
    1295             :         }
    1296             :         ELSE
    1297             :         {
    1298        2869 :             set32_fx( pitch_buf, st->old_fpitch, st->nb_subfr ); /*Q16*/
    1299             :         }
    1300             : 
    1301        3555 :         IF( EQ_16( st->nbLostCmpt, 1 ) )
    1302             :         {
    1303        1623 :             pt_exc = exc + L_frame;
    1304        1623 :             IF( T0 == 0 )
    1305             :             {
    1306         477 :                 pt1_exc = pt_exc - Tc; /*Q_exc*/
    1307             :             }
    1308             :             ELSE
    1309             :             {
    1310        1146 :                 pt1_exc = pt_exc - T0; /*Q_exc*/
    1311             :             }
    1312             : 
    1313        1623 :             tmp_loop = shr( L_frame, 1 );
    1314      571223 :             FOR( i = 0; i < tmp_loop; i++ )
    1315             :             {
    1316      569600 :                 *pt_exc++ = *pt1_exc++; /*Q_exc*/
    1317      569600 :                 move16();
    1318             :             }
    1319             :         }
    1320             : 
    1321        3555 :         if ( fUseExtrapolatedPitch != 0 )
    1322             :         {
    1323         686 :             st->old_fpitchFB = predPitchLag; /*Q16*/
    1324         686 :             move32();
    1325             :         }
    1326        3555 :         st->bpf_gain_param = 0;
    1327        3555 :         move16();
    1328             : 
    1329             :         /* PLC: calculate damping factor */
    1330        3555 :         alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &( st->Mode2_lp_gainp ), 0 ); /*Q14*/
    1331        3555 :         IF( EQ_16( st->nbLostCmpt, 1 ) )
    1332             :         {
    1333        1623 :             st->cummulative_damping = 32767 /*1.f Q15*/;
    1334        1623 :             move16();
    1335             :         }
    1336             :         ELSE
    1337             :         {
    1338        1932 :             st->cummulative_damping = shl_sat( mult_r_sat( st->cummulative_damping /*Q15*/, alpha /*Q14*/ ), 1 ) /*Q15*/;
    1339        1932 :             move16();
    1340             :         }
    1341             : 
    1342        3555 :         gain32 = L_add( 2147483647l /*1.f Q31*/, 0 ); /*Q31*/
    1343        3555 :         gain = 32767 /*1.f Q15*/;                     /*Q15*/
    1344        3555 :         move16();
    1345        3555 :         test();
    1346        3555 :         IF( EQ_16( st->rf_frame_type, RF_TCXTD1 ) && EQ_16( st->use_partial_copy, 1 ) )
    1347             :         {
    1348           0 :             gain32 = 1073741824l /*0.5f Q31*/;
    1349           0 :             move32();
    1350           0 :             gain = 16384 /*0.5f Q15*/;
    1351           0 :             move16();
    1352             :         }
    1353             : 
    1354             :         /*step = (1.0f/(L_frame+(L_frame/2))) * (gain - alpha);*/
    1355        3555 :         tmp16 = shr( imult1616( 3, L_frame ), 1 );
    1356        3555 :         tmp_e = norm_s( tmp16 );
    1357        3555 :         tmp16 = shl( tmp16, tmp_e );
    1358        3555 :         tmp16 = div_s( 16384 /*1.f Q14*/, tmp16 ); /*Q15,1+tmp_e-15*/
    1359        3555 :         tmp16_2 = sub( shr( gain, 1 ), alpha ) /*Q14*/;
    1360        3555 :         step32 = L_shl( L_mult( tmp16, tmp16_2 ) /*Q30, 1+tmp_e-15*/, add( 1 - 14, tmp_e ) ) /*Q31*/;
    1361             : 
    1362             :         /* PLC: Apply fade out */
    1363        3555 :         tmp_loop = shr( imult1616( L_frame, 3 ), 1 );
    1364     2972195 :         FOR( i = offset; i < tmp_loop; i++ )
    1365             :         {
    1366     2968640 :             exc[i] = mult_r( exc[i], round_fx_sat( gain32 ) ) /*Q1*/;
    1367     2968640 :             move16();
    1368     2968640 :             gain32 = L_sub_sat( gain32, step32 ); /*Q31*/
    1369             :         }
    1370             : 
    1371             :         /* update old exc without random part */
    1372        3555 :         offset = s_max( sub( round_fx( st->old_fpitchFB ), shr( L_frame, 1 ) ), 0 );                   /*Q0*/
    1373        3555 :         Copy( exc + sub( L_frame, offset ), hTcxDec->old_excFB_fx, add( shr( L_frame, 1 ), offset ) ); /*Q_exc*/
    1374             :         /* copy old_exc as 16kHz for acelp decoding */
    1375        3555 :         IF( EQ_16( st->nbLostCmpt, 1 ) )
    1376             :         {
    1377        1623 :             lerp( exc - shr( L_frame, 1 ), st->old_exc_fx, L_EXC_MEM_DEC, add( L_frame, shr( L_frame, 1 ) ) );
    1378             :         }
    1379             :         ELSE
    1380             :         {
    1381        1932 :             Copy( st->old_exc_fx + L_FRAME16k, st->old_exc_fx, L_FRAME16k / 2 ); /*Q_exc*/
    1382        1932 :             lerp( exc, st->old_exc_fx + L_FRAME16k / 2, L_FRAME16k, L_frame );
    1383             :         }
    1384        3555 :         st->Q_exc = Q_exc;
    1385        3555 :         move16();
    1386             :     }
    1387             :     ELSE
    1388             :     {
    1389             :         /* No harmonic part */
    1390           0 :         set16_fx( &exc[0], 0, add( L_frame, shr( L_frame, 1 ) ) );
    1391           0 :         IF( EQ_16( st->nbLostCmpt, 1 ) )
    1392             :         {
    1393           0 :             calcGainc2_fx( &exc[0], Q_exc, L_subfr, &( st->Mode2_lp_gainc ) );
    1394             :         }
    1395           0 :         set32_fx( pitch_buf, L_deposit_h( L_SUBFR ), st->nb_subfr );                                                              /*Q16*/
    1396             :                                                                                                                                   /* PLC: calculate damping factor */
    1397           0 :         alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &( st->Mode2_lp_gainp ), 0 ); /*Q14*/
    1398             :     }
    1399             : 
    1400             :     /*-----------------------------------------------------------------*
    1401             :      * Construct the random part of excitation
    1402             :      *-----------------------------------------------------------------*/
    1403             : 
    1404        3555 :     IF( NE_16( coh, -16384 ) )
    1405             :     {
    1406             :         Word16 tmpSeed1;
    1407             :         Word16 alpha_coh;
    1408             :         Word16 random1, random2;
    1409             :         Word16 e;
    1410             : 
    1411         911 :         tmpSeed1 = *noise_seed;
    1412         911 :         noise = buf; /*Q15*/
    1413         911 :         noise_e = 2;
    1414         911 :         move16();
    1415         911 :         e = 0;
    1416         911 :         move16();
    1417         911 :         alpha_coh = 0;
    1418         911 :         move16();
    1419             : 
    1420         911 :         IF( NE_16( coh, 16384 /*1.0f in Q14*/ ) )
    1421             :         {
    1422         909 :             alpha_coh = Sqrt16( div_s( sub( 16384 /*1.0f in Q14*/, coh ), add( 16384 /*1.0f in Q14*/, coh ) ), &e ); /* Q15 - e */
    1423             :         }
    1424         911 :         if ( EQ_16( st->idchan, 1 ) )
    1425             :         {
    1426         422 :             alpha_coh = negate( alpha_coh );
    1427             :         }
    1428             : 
    1429      600741 :         FOR( i = 0; i < L_frame + L_FIR_FER2 - 1; i++ )
    1430             :         {
    1431      599830 :             random1 = Random( &tmpSeed1 );
    1432      599830 :             random2 = Random( &tmpSeed1 );
    1433      599830 :             noise[i] = add( shr( random1, noise_e ), shr( mult( alpha_coh, random2 ), sub( noise_e, e ) ) );
    1434      599830 :             move16();
    1435             :         }
    1436             : 
    1437         911 :         test();
    1438         911 :         if ( EQ_16( st->idchan, 1 ) || only_left )
    1439             :         {
    1440         531 :             *noise_seed = tmpSeed1;
    1441         531 :             move16();
    1442             :         }
    1443             : 
    1444      307203 :         FOR( ; i < L_frame + ( L_frame / 2 ) + 2 * L_FIR_FER2; i++ )
    1445             :         {
    1446      306292 :             random1 = Random( &tmpSeed1 );
    1447      306292 :             random2 = Random( &tmpSeed1 );
    1448      306292 :             noise[i] = add( shr( random1, noise_e ), shr( mult( alpha_coh, random2 ), sub( noise_e, e ) ) );
    1449      306292 :             move16();
    1450             :         }
    1451             :     }
    1452             :     ELSE
    1453             :     {
    1454        2644 :         tmpSeed = st->seed_acelp; /*Q0*/
    1455        2644 :         move16();
    1456        2644 :         noise = buf;
    1457        2644 :         noise_e = 1; /*set exponent of noise to 1*/
    1458        2644 :         move16();
    1459             : 
    1460        2644 :         tmp_loop = add( L_frame, L_FIR_FER2 - 1 );
    1461     1837404 :         FOR( i = 0; i < tmp_loop; i++ )
    1462             :         {
    1463     1834760 :             Random( &tmpSeed );
    1464     1834760 :             noise[i] = shr( tmpSeed, noise_e ); /*Q: -noise_e*/
    1465     1834760 :             move16();
    1466             :         }
    1467        2644 :         st->seed_acelp = tmpSeed;
    1468        2644 :         move16();
    1469             : 
    1470        2644 :         tmp_loop = add( add( L_frame, shr( L_frame, 1 ) ), shl( L_FIR_FER2, 1 ) );
    1471      938532 :         FOR( ; i < tmp_loop; i++ )
    1472             :         {
    1473      935888 :             Random( &tmpSeed );
    1474      935888 :             noise[i] = shr( tmpSeed, noise_e ); /*Q: -noise_e*/
    1475      935888 :             move16();
    1476             :         }
    1477             :     }
    1478        3555 :     test();
    1479        3555 :     IF( EQ_16( st->last_good, VOICED_CLAS ) || EQ_16( st->last_good, ONSET ) )
    1480             :     {
    1481        3540 :         tmp16 = 19661 /*0.6f Q15*/;
    1482        3540 :         move16();
    1483        3540 :         if ( LE_32( st->output_Fs, 16000 ) )
    1484             :         {
    1485        1033 :             tmp16 = 6554 /*0.2f Q15*/;
    1486        1033 :             move16();
    1487             :         }
    1488             : 
    1489        3540 :         mem = noise[0];
    1490        3540 :         move16();
    1491        3540 :         preemph_copy_fx( &noise[1], &noise[1], tmp16, add( add( L_frame, shr( L_frame, 1 ) ), L_FIR_FER2 ), &mem );
    1492             :     }
    1493             :     /* high rate filter tuning */
    1494        3555 :     IF( LE_32( st->output_Fs, 16000 ) )
    1495             :     {
    1496       12432 :         FOR( i = 0; i < L_FIR_FER2; i++ )
    1497             :         {
    1498       11396 :             hp_filt[i] = h_high3_16[i]; /*Q15*/
    1499       11396 :             move16();
    1500             :         }
    1501             :     }
    1502             :     ELSE /*(st->output_Fs==32000)*/
    1503             :     {
    1504       30228 :         FOR( i = 0; i < L_FIR_FER2; i++ )
    1505             :         {
    1506       27709 :             hp_filt[i] = h_high3_32[i]; /*Q15*/
    1507       27709 :             move16();
    1508             :         }
    1509             :     }
    1510        3555 :     IF( EQ_16( st->nbLostCmpt, 1 ) )
    1511             :     {
    1512        1623 :         highPassFiltering_fx( st->last_good, add( add( L_frame, shr( L_frame, 1 ) ), L_FIR_FER2 ), noise, hp_filt, L_FIR_FER2 );
    1513             :     }
    1514             :     ELSE
    1515             :     {
    1516        1932 :         IF( GT_16( st->last_good, UNVOICED_TRANSITION ) )
    1517             :         {
    1518        1932 :             tmp_loop = add( add( L_frame, shr( L_frame, 1 ) ), L_FIR_FER2 );
    1519        1932 :             gain_tmp = negate( add( -32768, st->cummulative_damping ) ); /*Q15*/
    1520     1912944 :             FOR( i = 0; i < tmp_loop; i++ )
    1521             :             {
    1522             :                 Word16 j;
    1523     1911012 :                 L_tmp2 = 0;
    1524     1911012 :                 move32();
    1525    22932144 :                 FOR( j = 11; j > 0; j-- )
    1526             :                 {
    1527    21021132 :                     L_tmp2 = L_mac( L_tmp2, noise[( i + ( L_FIR_FER2 - j ) )], hp_filt[sub( L_FIR_FER2, j )] );
    1528             :                 }
    1529     1911012 :                 L_tmp2 = Mpy_32_16_1( L_tmp2, st->cummulative_damping /*Q15*/ ); /*Q0, noise_e*/
    1530     1911012 :                 noise[i] = mac_r( L_tmp2, gain_tmp, noise[i] );                  /*Q15, noise_e*/
    1531     1911012 :                 move16();
    1532             :             }
    1533             :         }
    1534             :     }
    1535             : 
    1536             :     /* PLC: [TCX: Fade-out] retrieve background level */
    1537        3555 :     tmp16 = 32767;
    1538        3555 :     move16();
    1539        3555 :     IF( A_cng != NULL )
    1540             :     {
    1541         911 :         gainSynthDeemph = shr( getLevelSynDeemph_fx( &( tmp16 ), A_cng, M, shr( L_frame, 2 ), st->preemph_fac, 1, &gainSynthDeemph_e ), 2 ); /*Q13*/
    1542             :     }
    1543             :     ELSE
    1544             :     {
    1545        2644 :         gainSynthDeemph = getLevelSynDeemph_fx( &( tmp16 ), A_local, M, shr( L_frame, 2 ), st->preemph_fac, 1, &gainSynthDeemph_e ); /*Q13*/
    1546             :     }
    1547        3555 :     IF( st->tcxonly != 0 )
    1548             :     {
    1549             :         /* gainCNG = st->conCngLevelBackgroundTrace/gainSynthDeemph; */
    1550        3555 :         BASOP_Util_Divide_MantExp( hTcxDec->conCngLevelBackgroundTrace,
    1551        3555 :                                    hTcxDec->conCngLevelBackgroundTrace_e,
    1552             :                                    gainSynthDeemph, gainSynthDeemph_e,
    1553             :                                    &gainCNG, &gainCNG_e );
    1554        3555 :         test();
    1555        3555 :         IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && A_cng != NULL )
    1556             :         {
    1557         911 :             IF( GT_16( st->nbLostCmpt, add( MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME, MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN ) ) )
    1558             :             {
    1559           0 :                 gainCNG = 0;
    1560           0 :                 move16();
    1561             :             }
    1562         911 :             ELSE IF( GT_16( st->nbLostCmpt, MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME ) )
    1563             :             {
    1564             :                 // gainCNG *= 1.f - (float)(st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME) / MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN;
    1565           0 :                 L_tmp = L_sub( ONE_IN_Q31, imult3216( 107374182 /* 1 / MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN in Q31*/, sub( st->nbLostCmpt, MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME ) ) ); /* Q31 */
    1566           0 :                 gainCNG = extract_l( Mpy_32_32( gainCNG, L_tmp ) );                                                                                                             /*Q15-gainCNG_e*/
    1567             :             }
    1568             :         }
    1569             :     }
    1570             :     ELSE
    1571             :     {
    1572             :         /* gainCNG = st->cngTDLevel/gainSynthDeemph; */
    1573           0 :         BASOP_Util_Divide_MantExp( st->cngTDLevel,
    1574           0 :                                    st->cngTDLevel_e,
    1575             :                                    gainSynthDeemph, gainSynthDeemph_e,
    1576             :                                    &gainCNG, &gainCNG_e );
    1577             :     }
    1578             : 
    1579        3555 :     gain32 = L_add( st->Mode2_lp_gainc, 0 ); /* start-of-the-frame gain - Q16*/
    1580        3555 :     IF( EQ_16( st->rf_frame_type, RF_TCXTD1 ) && EQ_16( st->use_partial_copy, 1 ) )
    1581             :     {
    1582           0 :         gain32 = Mpy_32_16_1( gain32, 22938 /*0.7f Q15*/ ); /*Q16*/
    1583             :     }
    1584        3555 :     L_tmp = L_shl( gain32, 1 ); /*Q16*/
    1585             : 
    1586        3555 :     IF( GT_32( L_shl( L_deposit_h( gainCNG ), sub( gainCNG_e, 31 - 16 ) /*Q16*/ ), L_tmp ) )
    1587             :     {
    1588           1 :         gainCNG_e = sub( 15 + 1, norm_l( L_tmp ) );
    1589           1 :         gainCNG = extract_l( L_shr( L_tmp, gainCNG_e ) ); /*Q15,gainCNG_e*/
    1590           1 :         gainCNG_e = sub( gainCNG_e, 1 );
    1591             :     }
    1592             : 
    1593             :     /* st->Mode2_lp_gainc = alpha * (st->Mode2_lp_gainc) + (1.0f - alpha) * gainCNG;*/ /* end-of-the-frame gain */
    1594             : 
    1595        3555 :     L_tmp = Mpy_32_16_1( st->Mode2_lp_gainc, alpha ) /*Q15*/;
    1596        3555 :     L_tmp2 = L_mult( sub( 16384 /*1.f Q14*/, alpha ) /*Q14*/, gainCNG /*Q15,gainCNG_e*/ );                      /*Q30,gainCNG_e*/
    1597        3555 :     st->Mode2_lp_gainc = BASOP_Util_Add_Mant32Exp( L_tmp, 31 - 15, L_tmp2, add( gainCNG_e, 31 - 30 ), &tmp_e ); /*Q31-tmp_e*/
    1598        3555 :     st->Mode2_lp_gainc = L_shl( st->Mode2_lp_gainc, sub( tmp_e, 31 - 16 ) );                                    /*Q16*/
    1599        3555 :     move32();
    1600        3555 :     move32();
    1601             : 
    1602             :     /* PLC: [TCX: Fade-out] Linearly attenuate the gain through the frame */
    1603             :     /*step = (1.0f/L_frame) * (gain - (st->Mode2_lp_gainc));*/
    1604        3555 :     L_tmp = L_sub( gain32, st->Mode2_lp_gainc ); /*Q16*/
    1605        3555 :     tmp_e = norm_l( L_tmp );
    1606        3555 :     L_tmp = L_shl( L_tmp, tmp_e );                                                      /*Q16,-tmp_e*/
    1607        3555 :     step32 = Mpy_32_16_1( L_tmp /*Q16,-tmp_e*/, getInvFrameLen( L_frame ) /*W16Q21*/ ); /*Q22,-tmp_e*/
    1608        3555 :     step32 = L_shl( step32, sub( 25 - 22, tmp_e ) );                                    /*Q25*/
    1609             : 
    1610        3555 :     pt_exc = noise + shr( L_FIR_FER2, 1 );
    1611             : 
    1612             :     /*gain_inov = 1.0f / (float)sqrt( dot_product( pt_exc, pt_exc, L_frame ) / L_frame + 0.01f );*/ /* normalize energy */
    1613        3555 :     L_tmp = Dot_productSq16HQ( 0, pt_exc /*Q0,15+1*/, L_frame, &tmp_e ) /*Q31,tmp_e+16+16*/;
    1614        3555 :     tmp_e = sub( add( tmp_e, shl( noise_e, 1 ) ), 1 ); // actual multiplier!
    1615        3555 :     L_tmp = Mpy_32_16_1( L_tmp, getInvFrameLen( L_frame ) /*W16Q21*/ ) /*W32Q37,tmp_e+16+16*/ /*Q5,tmp_e*/;
    1616        3555 :     tmp_e = add( tmp_e, 31 - 6 ); /*-->Q31*/
    1617        3555 :     gain_inov = 0;
    1618        3555 :     move16();
    1619        3555 :     gain_inov_e = 0;
    1620        3555 :     move16();
    1621        3555 :     IF( NE_32( L_tmp, 0 ) )
    1622             :     {
    1623        3555 :         gain_inov = round_fx( ISqrt32( L_tmp, &tmp_e ) ); /*Q15,tmp_e*/
    1624        3555 :         gain_inov_e = tmp_e;
    1625        3555 :         move16();
    1626             :     }
    1627        3555 :     test();
    1628        3555 :     test();
    1629        3555 :     IF( EQ_16( st->last_good, UNVOICED_CLAS ) && NE_16( st->core_ext_mode, UNVOICED ) )
    1630             :     {
    1631           0 :         gain_inov = mult_r( gain_inov, 26214 /*0.8f Q15*/ ); /*Q30*/
    1632             :     }
    1633        3555 :     ELSE IF( !( EQ_16( st->last_good, UNVOICED_CLAS ) || EQ_16( st->last_good, UNVOICED_TRANSITION ) ) )
    1634             :     {
    1635             :         /*gain_inov *= (1.1f- 0.75*st->lp_gainp);*/
    1636        3555 :         L_tmp = Mpy_32_16_1( L_sub( 590558016l /*1.1f Q29*/, Mpy_32_16_1( st->Mode2_lp_gainp, 24576 ) ) /*Q29*/, gain_inov /*Q15,gain_inov_e*/ ); /*Q29,gain_inov_e*/
    1637        3555 :         tmp_e = norm_l( L_tmp );
    1638        3555 :         L_tmp = L_shl( L_tmp, tmp_e );
    1639        3555 :         gain_inov_e = add( sub( gain_inov_e, tmp_e ), 31 - 29 ); /*->Q31*/
    1640        3555 :         gain_inov = round_fx_sat( L_tmp );                       /*Q15,gain_inov_e*/
    1641             :     }
    1642             : 
    1643        3555 :     st->Mode2_lp_gainp = L_shr( L_deposit_h( alpha /*Q14*/ ) /*Q14+16*/, 1 ); /*Q29*/
    1644        3555 :     move32();
    1645             : 
    1646        3555 :     pt_exc = noise; /* non-causal ringing of the FIR filter   */
    1647             : 
    1648        3555 :     tmp_e = norm_l( gain32 );
    1649        3555 :     tmp_e = sub( tmp_e, 5 );         /*5 Bit additional Headroom for the gain - should be enough*/
    1650        3555 :     gain32 = L_shl( gain32, tmp_e ); /*Q16,-tmp_e*/
    1651        3555 :     L_tmp = Mpy_32_16_1( gain32 /*Q16,-tmp_e*/, gain_inov /*Q15,gain_inov_e*/ ) /*Q16,gain_inov_e-tmp_e*/;
    1652             : 
    1653        3555 :     gain_tmp = round_fx( L_tmp ); /*Q0, gain_inov_e-tmp_e*/
    1654             : 
    1655       21330 :     FOR( i = 0; i < L_FIR_FER2 / 2; i++ )
    1656             :     {
    1657       17775 :         *pt_exc = mult_r( *pt_exc, gain_tmp ); /*Q-15,noise_e+gain_inov_e-tmp_e*/
    1658       17775 :         move16();
    1659       17775 :         pt_exc++;
    1660             :     }
    1661        3555 :     tmp16 = add( L_frame, L_FIR_FER2 / 2 );
    1662        3555 :     step32_tmp = L_shl( step32 /*Q25*/, sub( tmp_e, 25 - 16 ) ); /*Q16,-tmp_e*/
    1663     2420370 :     FOR( i = 0; i < tmp16; i++ )                                 /* Actual filtered random part of excitation */
    1664             :     {
    1665     2416815 :         *pt_exc = mult_r( *pt_exc, gain_tmp ); /*Q-15,noise_e+gain_inov_e-tmp_e*/
    1666     2416815 :         move16();
    1667     2416815 :         pt_exc++;
    1668     2416815 :         gain32 = L_sub( gain32 /*Q16,-tmp_e*/, step32_tmp ); /*Q16,-tmp_e*/
    1669     2416815 :         gain_tmp = mult_r( round_fx( gain32 /*Q16,-tmp_e*/ ) /*Q0*/, gain_inov /*Q15,gain_inov_e*/ ) /*Q0,gain_inov_e-tmp_e*/;
    1670             :     }
    1671        3555 :     tmp16 = shr( L_frame, 1 );
    1672     1203075 :     FOR( i = 0; i < tmp16; i++ ) /* causal ringing of the FIR filter */
    1673             :     {
    1674     1199520 :         *pt_exc = mult_r( *pt_exc, gain_tmp ); /*Q-15,noise_e+gain_inov_e-tmp_e*/
    1675     1199520 :         move16();
    1676     1199520 :         pt_exc++;
    1677             :     }
    1678        3555 :     noise_e = add( sub( add( noise_e, gain_inov_e ), tmp_e ), 15 ); /*--> noise is Q0, noise_e*/
    1679             :     /*buf[0;L_FIR_FER2 + L_Frame + L_Frame/2] Q0, noise_e*/
    1680             : 
    1681             :     /*-----------------------------------------------------------------*
    1682             :      * Construct the total excitation
    1683             :      *-----------------------------------------------------------------*/
    1684             : 
    1685        3555 :     IF( GE_16( st->last_good, UNVOICED_TRANSITION ) )
    1686             :     {
    1687        3555 :         tmp16 = add( L_frame, shr( L_frame, 1 ) );
    1688     3602115 :         FOR( i = 0; i < tmp16; i++ )
    1689             :         {
    1690     3598560 :             exc[i] = add_sat( exc[i], shl_sat( noise[i + ( L_FIR_FER2 / 2 )], add( Q_exc, noise_e ) ) ); /*Q1*/
    1691     3598560 :             move16();
    1692             :         }
    1693             :     }
    1694             :     ELSE
    1695             :     {
    1696           0 :         bufferCopyFx( noise + L_FIR_FER2 / 2, exc, add( L_frame, shr( L_frame, 1 ) ), 0 /*Q_noise*/, noise_e, Q_exc, 0 /*exc_e*/ );
    1697           0 :         Copy( exc + sub( L_frame, shl( L_subfr, 1 ) ), hTcxDec->old_excFB_fx, add( shl( L_subfr, 1 ), shr( L_frame, 1 ) ) ); /*Q_exc*/
    1698             :         /* copy old_exc as 16kHz for acelp decoding */
    1699           0 :         IF( EQ_16( st->nbLostCmpt, 1 ) )
    1700             :         {
    1701           0 :             lerp( exc, st->old_exc_fx, L_EXC_MEM_DEC, add( L_frame, shr( L_frame, 1 ) ) );
    1702             :         }
    1703             :         ELSE
    1704             :         {
    1705           0 :             Copy( st->old_exc_fx + L_FRAME16k, st->old_exc_fx, L_FRAME16k / 2 ); /*Q_exc*/
    1706           0 :             lerp( exc, st->old_exc_fx + L_FRAME16k / 2, L_FRAME16k, L_frame );
    1707             :         }
    1708           0 :         st->Q_exc = Q_exc;
    1709           0 :         move16();
    1710             :     }
    1711             :     /*buf[0;L_FIR_FER2 + L_Frame + L_Frame/2] Q0, noise_e*/
    1712             :     /*buf[OLD_EXC_SIZE_DEC;3/2 L_frame] Q1*/
    1713             : 
    1714             :     /* Update Pitch Lag memory */
    1715        3555 :     Copy32( &st->old_pitch_buf_fx[st->nb_subfr], st->old_pitch_buf_fx, st->nb_subfr ); /*Q16*/
    1716        3555 :     Copy32( pitch_buf, &st->old_pitch_buf_fx[st->nb_subfr], st->nb_subfr );            /*Q16*/
    1717             : 
    1718             :     /*----------------------------------------------------------*
    1719             :      * - compute the synthesis speech                           *
    1720             :      *----------------------------------------------------------*/
    1721             : 
    1722        3555 :     syn = buf + M;             /*Q_syn*/
    1723        3555 :     Copy( synth - M, buf, M ); /*Q_syn*/
    1724             : 
    1725        3555 :     new_Q = sub( Q_exc, 3 );
    1726        3555 :     new_Q = s_max( new_Q, -1 );
    1727        3555 :     new_Q = s_min( new_Q, norm_s( tmp_deemph ) );
    1728             : 
    1729        3555 :     tmp16 = s_min( new_Q, st->prev_Q_syn );
    1730        3555 :     st->prev_Q_syn = new_Q;
    1731        3555 :     move16();
    1732             : 
    1733        3555 :     exp_scale = sub( tmp16, sub( Q_exc, 1 ) );
    1734        3555 :     Q_syn = tmp16;
    1735        3555 :     move16();
    1736             : 
    1737        3555 :     Copy_Scale_sig( buf, mem_syn, M, exp_scale ); /* Q: tmp16 */
    1738             : 
    1739        3555 :     tmp_deemph = shl_sat( tmp_deemph, Q_syn );
    1740        3555 :     st->Q_syn = Q_syn;
    1741        3555 :     move16();
    1742             : 
    1743             :     /*buf[OLD_EXC_SIZE_DEC;3/2 L_frame] Q1: exc*/
    1744             :     /*buf[0;M] Q0: mem_syn*/
    1745        3555 :     IF( A_cng != NULL )
    1746             :     {
    1747             :         Word16 alpha_delayed;
    1748             : 
    1749         911 :         alpha_delayed = 16384; /*1.0f in Q14*/
    1750         911 :         move16();
    1751         911 :         IF( GT_16( st->nbLostCmpt, MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE ) )
    1752             :         {
    1753         294 :             alpha_delayed = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE, st->last_good, st->stab_fac_fx, &( st->Mode2_lp_gainp ), ACELP_CORE ); /*Q14*/
    1754             :         }
    1755             : 
    1756         911 :         test();
    1757         911 :         IF( st->plcBackgroundNoiseUpdated && NE_16( alpha_delayed, 16384 ) )
    1758             :         {
    1759             :             Word16 lsp_local[M], lsp_fade[M], alpha_inv;
    1760             : 
    1761           0 :             alpha_inv = sub( 16384 /*Q.0f in Q14*/, alpha_delayed ); /*Q14*/
    1762             : 
    1763           0 :             E_LPC_a_lsp_conversion( A_local, lsp_local, st->lspold_cng, M );
    1764             : 
    1765           0 :             FOR( i = 0; i < M; i++ )
    1766             :             {
    1767           0 :                 lsp_fade[i] = add( mult_r( alpha_delayed, lsp_local[i] ), mult_r( alpha_inv, st->lspold_cng[i] ) ); /*Q14*/
    1768           0 :                 move16();
    1769             :             }
    1770             : 
    1771           0 :             Scale_sig( lsp_fade, M, 1 ); /* Q14 -> Q15 */
    1772             : 
    1773           0 :             E_LPC_f_lsp_a_conversion( lsp_fade, A_local, M );
    1774             :         }
    1775             :     }
    1776             : 
    1777        3555 :     E_UTIL_synthesis(
    1778        3555 :         sub( Q_exc, Q_syn ),
    1779             :         A_local,
    1780             :         &exc[0],
    1781             :         &syn[0],
    1782        3555 :         add( L_frame, shr( L_frame, 1 ) ),
    1783             :         mem_syn,
    1784             :         1,
    1785             :         M );
    1786             : 
    1787             :     /*buf[OLD_EXC_SIZE_DEC;3/2 L_frame-1] Q1: exc*/
    1788             :     /*buf[0;M-1] Q0: mem_syn*/
    1789             :     /*buf[M;3/2 L_frame-1] Q-1: syn*/
    1790             : 
    1791        3555 :     n = extract_h( L_mult( L_frame, 9216 /*(float)N_ZERO_MDCT_NS/(float)FRAME_SIZE_NS Q15*/ ) ); /*Q0*/
    1792             : 
    1793             :     /* update ACELP synthesis memory */
    1794        3555 :     mem_syn_r_size_old = shr( L_frame, 4 ); /* replace 1.25/20.0 by shr(4) */
    1795             :     /* copy mem_syn as 16kHz */
    1796        3555 :     mem_syn_r_size_new = shr( L_FRAME16k, 4 ); /* replace 1.25/20.0 by shr(4) */
    1797             : 
    1798        3555 :     Copy( syn + sub( L_frame, L_SYN_MEM ), st->mem_syn_r, L_SYN_MEM ); /*Q_syn*/
    1799        3555 :     lerp( st->mem_syn_r + sub( L_SYN_MEM, mem_syn_r_size_old ), st->mem_syn_r + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old );
    1800        3555 :     Copy( st->mem_syn_r + L_SYN_MEM - M, st->mem_syn2_fx, M ); /*Q_syn*/
    1801             : 
    1802             :     /* Deemphasis and output synth and ZIR */
    1803        3555 :     deemph_fx( syn, st->preemph_fac, add( L_frame, shr( L_frame, 1 ) ), &tmp_deemph );
    1804        3555 :     bufferCopyFx( syn + sub( L_frame, M + 1 ), st->syn, 1 + M, Q_syn, 0, 0, 0 ); /*Q_syn*/
    1805             : 
    1806             : 
    1807        3555 :     lerp( syn + sub( L_frame, shr( L_frame, 1 ) ), hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) );
    1808        3555 :     hTcxDec->Q_old_syn_Overl = Q_syn;
    1809        3555 :     move16();
    1810        3555 :     Copy( syn + sub( L_frame, n ), hHQ_core->old_out_fx, sub( L_frame, n ) ); /*Q_syn*/
    1811             : 
    1812      528345 :     FOR( i = 0; i < W12; i++ )
    1813             :     {
    1814      524790 :         hHQ_core->old_out_fx[( i + n )] = round_fx( Mpy_32_16_1( L_mult( w[i].v.re, w[i].v.re ), hHQ_core->old_out_fx[( i + n )] ) ); /*Q_syn*/
    1815      524790 :         move16();
    1816             :     }
    1817      528345 :     FOR( ; i < W1; i++ )
    1818             :     {
    1819      524790 :         hHQ_core->old_out_fx[( i + n )] = round_fx( Mpy_32_16_1( L_mult( w[( ( W12 - 1 ) - ( i - W12 ) )].v.im, w[( ( W12 - 1 ) - ( i - W12 ) )].v.im ), hHQ_core->old_out_fx[( i + n )] ) ); /*Q_syn*/
    1820      524790 :         move16();
    1821             :     }
    1822             : 
    1823        3555 :     set16_fx( &hHQ_core->old_out_fx[( W1 + n )], 0, n );
    1824             : 
    1825        3555 :     hHQ_core->Q_old_wtda = Q_syn;
    1826        3555 :     move16();
    1827             : 
    1828             :     /* As long as there is no synth scaling factor introduced, which
    1829             :     is given to the outside, there might occur overflows here */
    1830             :     BASOP_SATURATE_WARNING_OFF_EVS
    1831        3555 :     bufferCopyFx( syn, synth, L_frame, Q_syn, 0, 0, 0 ); /*Q_syn*/
    1832             :     BASOP_SATURATE_WARNING_ON_EVS
    1833             : 
    1834        3555 :     Copy_Scale_sig( syn + L_frame, hTcxDec->syn_OverlFB, shr( L_frame, 1 ), sub( 0, Q_syn ) ); /*Q0*/
    1835        3555 :     hTcxDec->Q_syn_OverlFB = 0;
    1836        3555 :     move16();
    1837             : 
    1838             :     /* copy total excitation exc2 as 16kHz for acelp mode1 decoding */
    1839        3555 :     IF( st->hWIDec != NULL )
    1840             :     {
    1841           0 :         lerp( exc, st->hWIDec->old_exc2_fx, L_EXC_MEM, L_frame );
    1842           0 :         lerp( syn, st->hWIDec->old_syn2_fx, L_EXC_MEM, L_frame );
    1843             :     }
    1844             : 
    1845        3555 :     st->bfi_pitch_fx /*Q6*/ = round_fx_sat( L_shl_sat( pitch_buf[sub( st->nb_subfr, 1 )] /*15Q16*/, 6 /*Q6*/ ) );
    1846        3555 :     move16();
    1847        3555 :     st->bfi_pitch_frame = st->L_frame;
    1848        3555 :     move16();
    1849             : 
    1850             :     /* create aliasing and windowing need for transition to TCX10/5 */
    1851        3555 :     Copy( syn + L_frame, hTcxDec->syn_Overl_TDACFB, shr( L_frame, 1 ) );
    1852        3555 :     hTcxDec->Q_syn_Overl_TDACFB = Q_syn;
    1853        3555 :     move16();
    1854             : 
    1855      528345 :     FOR( i = 0; i < W12; i++ )
    1856             :     {
    1857      524790 :         buf[i] = mult_r( hTcxDec->syn_Overl_TDACFB[i], w[i].v.re ); /*hTcxDec->Q_syn_Overl_TDACFB*/
    1858      524790 :         move16();
    1859             :     }
    1860      528345 :     FOR( ; i < W1; i++ )
    1861             :     {
    1862      524790 :         buf[i] = mult_r( hTcxDec->syn_Overl_TDACFB[i], w[( ( W12 - 1 ) - ( i - W12 ) )].v.im ); /*hTcxDec->Q_syn_Overl_TDACFB*/
    1863      524790 :         move16();
    1864             :     }
    1865             : 
    1866             : 
    1867      528345 :     FOR( i = 0; i < W2; i++ )
    1868             :     {
    1869      524790 :         hTcxDec->syn_Overl_TDACFB[i] = add_sat( buf[i], buf[( ( W1 - 1 ) - i )] ); /*hTcxDec->Q_syn_Overl_TDACFB*/
    1870      524790 :         move16();
    1871             :     }
    1872             : 
    1873      528345 :     FOR( i = 0; i < W2; i++ )
    1874             :     {
    1875      524790 :         hTcxDec->syn_Overl_TDACFB[( W2 + i )] = add_sat( buf[( W2 + i )], buf[( ( ( W1 - 1 ) - W2 ) - i )] ); /*hTcxDec->Q_syn_Overl_TDACFB*/
    1876      524790 :         move16();
    1877             :     }
    1878             : 
    1879      528345 :     FOR( i = 0; i < W12; i++ )
    1880             :     {
    1881      524790 :         hTcxDec->syn_Overl_TDACFB[i] = mult_r( hTcxDec->syn_Overl_TDACFB[i], w[i].v.re ); /*hTcxDec->Q_syn_Overl_TDACFB*/
    1882      524790 :         move16();
    1883             :     }
    1884      528345 :     FOR( ; i < W1; i++ )
    1885             :     {
    1886      524790 :         hTcxDec->syn_Overl_TDACFB[i] = mult_r( hTcxDec->syn_Overl_TDACFB[i], w[( ( W12 - 1 ) - ( i - W12 ) )].v.im ); /*hTcxDec->Q_syn_Overl_TDACFB*/
    1887      524790 :         move16();
    1888             :     }
    1889             : 
    1890        3555 :     st->hTcxCfg->tcx_curr_overlap_mode = FULL_OVERLAP;
    1891        3555 :     move16();
    1892             : 
    1893        3555 :     synth[-1] = pre_emph_buf; /*Q0*/
    1894        3555 :     move16();
    1895             : 
    1896             :     /* update memory for low band */
    1897        3555 :     st->Q_syn = Q_syn;
    1898        3555 :     move16();
    1899        3555 :     lerp( hTcxDec->syn_OverlFB, hTcxDec->syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) );
    1900        3555 :     hTcxDec->Q_syn_Overl = hTcxDec->Q_syn_OverlFB;
    1901        3555 :     move16();
    1902        3555 :     lerp( hTcxDec->syn_Overl_TDACFB, hTcxDec->syn_Overl_TDAC, shr( st->L_frame, 1 ), shr( L_frame, 1 ) );
    1903        3555 :     hTcxDec->Q_syn_Overl_TDAC = hTcxDec->Q_syn_Overl_TDACFB;
    1904        3555 :     move16();
    1905        3555 :     lerp( st->hHQ_core->old_out_fx, st->hHQ_core->old_out_LB_fx, st->L_frame, L_frame );
    1906        3555 :     st->hHQ_core->Q_old_wtda_LB = Q_syn;              // st->hHQ_core->Q_old_wtda
    1907        3555 :     st->old_enr_LP = Enr_1_Az_fx( A_local, L_SUBFR ); /*Q3*/
    1908        3555 :     move16();
    1909             : 
    1910        3555 :     return;
    1911             : }

Generated by: LCOV version 1.14