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 : }
|