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