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

Generated by: LCOV version 1.14