Line data Source code
1 : /*====================================================================================
2 : EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
3 : ====================================================================================*/
4 :
5 : #include "options.h" /* Compilation switches */
6 : #include "prot_fx.h" /* Function prototypes */
7 : #include "rom_com.h" /* Function prototypes */
8 : #include "stl.h"
9 :
10 165 : void sinq_fx(
11 : const Word16 tmp, /* i : sinus factor cos(tmp*i+phi) Q15*/
12 : const Word16 phi, /* i : sinus phase cos(tmp*i+phi) Q15*/
13 : const Word16 N, /* i : size of output */
14 : Word16 x[] /* o : output vector Q15*/
15 : )
16 : {
17 : Word16 i;
18 : Word16 tmp1, tmp2;
19 : Word32 L_tmp, A32, tmp_old, tmp_old_old;
20 :
21 :
22 165 : x[0] = phi;
23 165 : move16(); /*sin(x) approximated by x; Q15 */
24 165 : tmp1 = add( tmp, phi ); /*Q15 */
25 165 : L_tmp = L_mult( tmp1, tmp1 ); /*Q31 */
26 165 : L_tmp = Mult_32_16( L_tmp, tmp1 ); /*Q31 */
27 165 : L_tmp = Mult_32_16( L_tmp, 5461 ); /*Q31; division by 6 */
28 165 : tmp2 = round_fx( L_tmp ); /*Q15 */
29 165 : x[1] = sub( tmp1, tmp2 );
30 165 : move16(); /* sin(x) approximated by (x-x^3/3!); Q15 */
31 165 : tmp1 = add_sat( shl_sat( tmp, 1 ), phi ); /*Q15 */
32 165 : L_tmp = L_mult( tmp1, tmp1 ); /*Q31 */
33 165 : L_tmp = Mult_32_16( L_tmp, tmp1 ); /*Q31 */
34 165 : L_tmp = Mult_32_16( L_tmp, 5461 ); /*Q31; division by 6 */
35 165 : tmp2 = round_fx( L_tmp ); /*Q15 */
36 165 : x[2] = sub( tmp1, tmp2 );
37 165 : move16(); /* sin(x) approximated by (x-x^3/3!); Q15 */
38 :
39 :
40 165 : IF( GT_16( abs_s( tmp ), 3 ) )
41 : {
42 : /*A=(x[2]+x[0])/x[1]=2*cos(tmp); here approximated by 2*(1-tmp^2/2!) */
43 165 : A32 = L_mult0( tmp, tmp ); /*Q30 */
44 165 : A32 = L_add( L_sub( 1073741824 /*1.Q30*/, A32 ), 1073741824 /*1.Q30*/ ); /*Q30 */
45 : }
46 : ELSE
47 : {
48 0 : A32 = L_deposit_l( 0 );
49 : }
50 :
51 165 : tmp_old = L_deposit_h( x[2] ); /*Q31 */
52 165 : tmp_old_old = L_deposit_h( x[1] ); /*Q31 */
53 :
54 11942 : FOR( i = 3; i < N; i++ )
55 : {
56 : /*L_tmp = Mult_32_16(A32,(*pt1++)); //30+15-15+1=Q31 */
57 : /* x[i] = shl(sub(round_fx(L_tmp), shr((*pt2++),1)),1); move16(); //Q15 */
58 11777 : L_tmp = Mult_32_32( A32, tmp_old ); /*Q30 */
59 11777 : L_tmp = L_sub( L_tmp, L_shr( tmp_old_old, 1 ) ); /*Q30 */
60 11777 : tmp_old_old = L_add( tmp_old, 0 ); /*Q31 */
61 11777 : tmp_old = L_shl_sat( L_tmp, 1 ); /*Q31 */
62 11777 : x[i] = round_fx_sat( tmp_old ); /*Q15 */
63 11777 : move16();
64 : }
65 :
66 165 : return;
67 : }
68 :
69 : /*--------------------------------------------------------------------------*/
70 : /* Function Window_Ola */
71 : /* ~~~~~~~~~~~~~~~~~~~~ */
72 : /* */
73 : /* Windowing, Overlap and Add */
74 : /*--------------------------------------------------------------------------*/
75 : /* Word32 ImdctOut[] (i) input */
76 : /* Word32 auOut[] (o) output audio */
77 : /* Word16 Q_sig (i/o) Q of Input and Output Signal */
78 : /* Word32 OldauOut[] (i/o) audio from previous frame */
79 : /* Word16 Q_old (i/o) Q for audio from previous frame */
80 : /* Word16 L (i) length */
81 : /*--------------------------------------------------------------------------*/
82 :
83 1780848 : void window_ola_fx(
84 : Word32 *wtda_audio,
85 : Word16 *auOut,
86 : Word16 *Q_sig, /* in Q IMDCT /out auOut */
87 : Word16 *OldauOut,
88 : Word16 *Q_old, /* in/out Q OldauOut */
89 : const Word16 L,
90 : const Word16 right_mode,
91 : const Word16 left_mode, /* window overlap of current frame (0: full, 2: none, or 3: half) */
92 : const Word16 use_bfi_win,
93 : const Word16 oldHqVoicing,
94 : Word16 *oldgapsynth )
95 : {
96 : Word16 i, decimate, decay, temp, temp_len;
97 : Word16 n, windecay48;
98 : Word16 win_right[R2_48];
99 : Word16 win_int_left[R1_16];
100 : Word16 win_left[R1_48];
101 : Word16 win_int_right[R2_16];
102 : Word16 *p1, *p2, *p3, *p4, *p5, *paout;
103 : Word32 *pa;
104 : Word32 ImdctOut[2 * L_FRAME48k]; /*for not to overwrite wtda_audio (ImdctOut) by the rescaling. If problem of max RAM, alternative solution is to output the new Q value of ImdctOut after rescaling */
105 : Word16 SS2[L_FRAME48k - NS2SA( 48000, N_ZERO_MDCT_NS )];
106 : Word16 wret2[L_FRAME48k - NS2SA( 48000, N_ZERO_MDCT_NS )];
107 : Word16 tmp2;
108 :
109 : /* Windows loading */
110 1780848 : tcx_get_windows_mode1( left_mode, right_mode, win_left, win_right, win_int_left, win_int_right, L );
111 :
112 1780848 : temp = Find_Max_Norm16( OldauOut, L );
113 1780848 : Copy_Scale_sig( OldauOut, OldauOut, L, temp );
114 1780848 : *Q_old = add( *Q_old, temp );
115 :
116 : /* need to rescale input (because ImdctOut not full scaled and cause issue in 16 bit conversion) */
117 1780848 : temp = sub( Find_Max_Norm32( wtda_audio, L ), 2 ); /* rescale to temp-1 because left shift after */
118 1164830384 : FOR( i = 0; i < L; i++ )
119 : {
120 1163049536 : ImdctOut[i] = L_shl( wtda_audio[i], temp );
121 1163049536 : move32();
122 : }
123 1780848 : *Q_sig = add( *Q_sig, temp );
124 1780848 : move16();
125 :
126 :
127 : /* rescaling for overlapp add */
128 1780848 : IF( GT_16( add( *Q_old, 15 ), *Q_sig ) )
129 : {
130 1577155 : Copy_Scale_sig( OldauOut, OldauOut, L, sub( *Q_sig, add( *Q_old, 15 ) ) );
131 1577155 : *Q_old = sub( *Q_sig, 15 );
132 1577155 : move16();
133 : }
134 203693 : ELSE IF( LT_16( add( *Q_old, 15 ), *Q_sig ) )
135 : {
136 27925 : Scale_sig32( ImdctOut, L, sub( add( *Q_old, 15 ), *Q_sig ) );
137 27925 : *Q_sig = add( *Q_old, 15 );
138 27925 : move16();
139 : }
140 :
141 1780848 : *Q_sig = *Q_old; /*fixing output to new Q_old */
142 1780848 : move16();
143 :
144 :
145 1780848 : decimate = 1;
146 1780848 : move16(); /* L_FRAME 48k */
147 1780848 : decay = 0;
148 1780848 : move16();
149 1780848 : windecay48 = WINDECAY48;
150 1780848 : move16();
151 1780848 : n = R1_48 - R2_48;
152 1780848 : move16();
153 :
154 1780848 : test();
155 1780848 : IF( EQ_16( L, L_FRAME32k ) || EQ_16( L, L_FRAME16k ) )
156 : {
157 914619 : decimate = 3;
158 914619 : move16();
159 914619 : decay = 1;
160 914619 : move16();
161 914619 : n = R1_16 - R2_16;
162 914619 : move16();
163 :
164 914619 : if ( EQ_16( L, L_FRAME32k ) )
165 : {
166 651009 : n = 2 * N16_CORE_SW;
167 651009 : move16();
168 : }
169 : }
170 866229 : ELSE IF( EQ_16( L, L_FRAME8k ) )
171 : {
172 0 : decimate = 6;
173 0 : move16();
174 0 : decay = 2;
175 0 : move16();
176 0 : n = ( R1_16 - R2_16 ) / 2;
177 0 : move16();
178 : }
179 866229 : ELSE IF( EQ_16( L, 512 ) )
180 : {
181 230149 : windecay48 = WINDECAY48_256;
182 230149 : move16();
183 230149 : decimate = 1;
184 230149 : move16();
185 230149 : decay = 0;
186 230149 : move16();
187 230149 : n = R1_25 - R2_25;
188 230149 : move16();
189 : }
190 636080 : ELSE IF( EQ_16( L, 256 ) )
191 : {
192 94353 : windecay48 = WINDECAY48_256;
193 94353 : move16();
194 94353 : decimate = 2;
195 94353 : move16();
196 94353 : decay = 0;
197 94353 : move16();
198 94353 : n = ( R1_25 - R2_25 ) / 2;
199 94353 : move16();
200 : }
201 :
202 :
203 1780848 : paout = auOut - n;
204 :
205 1780848 : IF( EQ_16( use_bfi_win, 1 ) )
206 : {
207 :
208 2 : temp = sub( L, n );
209 :
210 2 : tmp2 = div_s( 1, temp ); /*Q15 */
211 2 : tmp2 = round_fx( L_shl( L_mult( tmp2, 25736 /*(pi/2).Q14*/ ), 2 ) ); /*Q15 */
212 :
213 2 : sinq_fx( shr( tmp2, 1 ), shr( tmp2, 2 ), temp, SS2 );
214 :
215 2 : IF( EQ_16( L, L_FRAME32k ) )
216 : {
217 1 : p4 = SS2 + sub( shr( L, 1 ), 1 );
218 1 : p1 = wret2 + sub( shr( L, 1 ), n );
219 1 : p2 = win_int_left + L_FRAME16k / 2 - 1;
220 1 : p3 = win_left + ( L_FRAME16k / 2 - 1 ) * 3 + 1;
221 :
222 1 : temp_len = shr( L, 1 );
223 161 : FOR( i = 0; i < temp_len; i += 2 )
224 : {
225 160 : *p1++ = div_s( shr( *p4--, 5 ), add( *p2--, 10 ) );
226 160 : move16();
227 160 : *p1++ = div_s( shr( *p4--, 5 ), add( *p3, 10 ) ); /*Wret2 Q10 */
228 160 : move16();
229 160 : p3 -= decimate;
230 : }
231 1 : p4 = SS2 + sub( temp, 1 );
232 1 : p1 = wret2;
233 1 : p2 = win_left + ( L_FRAME16k - N16_CORE_SW ) * 3 - 1 - 1;
234 1 : p3 = win_int_left + ( L_FRAME16k - N16_CORE_SW - 1 );
235 :
236 1 : temp_len = sub( shr( L, 1 ), n );
237 71 : FOR( i = 0; i < temp_len; i += 2 )
238 : {
239 70 : *p1++ = div_s( shr( *p4--, 5 ), *p2 );
240 70 : move16();
241 70 : *p1++ = div_s( shr( *p4--, 5 ), *p3-- );
242 70 : move16();
243 70 : p2 -= decimate;
244 : }
245 : }
246 : ELSE
247 : {
248 :
249 1 : p2 = win_left + add( i_mult2( sub( shr( L, 1 ), 1 ), decimate ), decay );
250 1 : p1 = wret2 + sub( shr( L, 1 ), n );
251 1 : p4 = SS2 + sub( shr( L, 1 ), 1 );
252 :
253 1 : temp_len = shr( L, 1 );
254 161 : FOR( i = 0; i < temp_len; i++ )
255 : {
256 160 : *p1++ = div_s( shr( *p4--, 5 ), add( *p2, 10 ) ); /*Wret2 Q10 */
257 160 : move16();
258 160 : p2 -= decimate;
259 : }
260 :
261 1 : p1 = wret2;
262 1 : p4 = SS2 + sub( temp, 1 );
263 :
264 :
265 1 : p2 = win_left + sub( sub( i_mult2( sub( L, n ), decimate ), decay ), 1 );
266 1 : temp_len = sub( shr( L, 1 ), n );
267 71 : FOR( i = 0; i < temp_len; i++ )
268 : {
269 70 : *p1++ = div_s( shr( *p4--, 5 ), *p2 );
270 70 : move16();
271 70 : p2 -= decimate;
272 : }
273 : }
274 :
275 :
276 2 : p1 = paout + n;
277 2 : pa = ImdctOut + add( shr( L, 1 ), n );
278 :
279 2 : temp_len = sub( shr( L, 1 ), n );
280 212 : FOR( i = 0; i < temp_len; i++ )
281 : {
282 210 : *p1++ = round_fx( L_shl( *pa++, 1 ) );
283 210 : move16();
284 : }
285 :
286 : /*p1=paout+shr(L,1);*/
287 2 : pa = ImdctOut + sub( L, 1 );
288 2 : temp_len = shr( L, 1 );
289 482 : FOR( i = 0; i < temp_len; i++ )
290 : {
291 480 : *p1++ = round_fx( L_negate( L_shl( *pa--, 1 ) ) );
292 480 : move16();
293 : }
294 :
295 :
296 2 : p1 = auOut;
297 2 : p2 = SS2;
298 :
299 2 : IF( oldHqVoicing )
300 : {
301 : /* rescale oldgapsynth */
302 0 : Copy_Scale_sig( oldgapsynth, oldgapsynth, L, *Q_sig );
303 0 : p3 = SS2 + sub( temp, 1 );
304 0 : p4 = oldgapsynth + n;
305 0 : FOR( i = 0; i < temp; i++ )
306 : {
307 0 : *p1 = add( mult( *p1, *p2 ), mult( *p4, *p3 ) ); /* auOut[i]*SS2[i]+ oldgapsynth[i+n]*(SS2[L-n-i-1]);*/
308 0 : move16();
309 0 : p1++;
310 0 : p2++;
311 0 : p3--;
312 0 : p4++;
313 : }
314 0 : Copy_Scale_sig( oldgapsynth, oldgapsynth, L, -( *Q_sig ) );
315 : }
316 : ELSE
317 : {
318 2 : p3 = wret2;
319 2 : p4 = OldauOut + n;
320 692 : FOR( i = 0; i < temp; i++ )
321 : {
322 690 : *p1 = add_sat( mult( *p1, *p2 ), shl_sat( mult( *p4, *p3 ), 5 ) ); /*auOut[i]*SS2[i]+ OldauOut[i+n]*(SS2[L-n-i-1])/(wret2[i]+0.01f);;*/
323 690 : move16();
324 690 : p1++;
325 690 : p2++;
326 690 : p3++;
327 690 : p4++;
328 : }
329 : }
330 : }
331 :
332 1780848 : IF( EQ_16( L, L_FRAME32k ) )
333 : {
334 :
335 651009 : IF( use_bfi_win == 0 )
336 : {
337 : /*decimate=3 */
338 : /*decay=1 */
339 651008 : p1 = paout + n;
340 651008 : pa = ImdctOut + add( shr( L, 1 ), n );
341 : /*p3=win_right+ sub(sub(sub(i_mult2(sub(shl(L,1),n),decimate),1),decay),WINDECAY48); */
342 651008 : p3 = win_right + ( ( 2 * L_FRAME16k - N16_CORE_SW ) * 3 - 1 - 1 - WINDECAY48 );
343 651008 : p5 = win_int_right + ( ( 2 * L_FRAME16k - N16_CORE_SW ) - 1 - WINDECAY16 );
344 651008 : p4 = OldauOut + n;
345 :
346 651008 : temp_len = sub( shr( L, 1 ), n );
347 46221568 : FOR( i = 0; i < temp_len; i += 2 )
348 : {
349 45570560 : *p1++ = round_fx_sat( L_add_sat( L_shl_sat( Mult_32_16( *pa++, *p3 ), 1 ), L_deposit_h( *p4++ ) ) ); /* (( Qin + Q15 -15)+1 + ( Qin - 15 + 16))-1 */
350 45570560 : p3 -= decimate;
351 45570560 : *p1++ = round_fx_sat( L_add_sat( L_shl_sat( Mult_32_16( *pa++, *p5-- ), 1 ), L_deposit_h( *p4++ ) ) ); /* (( Qin + Q15 -15)+1 + ( Qin - 15 + 16))-1 */
352 45570560 : move16();
353 : /* paout[i] = ImdctOut[L/2 + i] * win_right[(2*L_FRAME16k-(n16+(i-n)/2))*decimate-1-decay-windecay48]+OldauOut[i];
354 : paout[i+1] = ImdctOut[L/2 + i +1] * win_int_right[2*L_FRAME16k-(n16+(i-n)/2)-1-windecay16]+OldauOut[i+1];*/
355 : }
356 :
357 651008 : pa = ImdctOut + sub( L, 1 );
358 651008 : p3 = win_right + ( ( 3 * L_FRAME16k / 2 - 1 ) * 3 + 1 - WINDECAY48 );
359 651008 : p5 = win_int_right + ( ( 3 * L_FRAME16k / 2 ) - 1 - WINDECAY16 );
360 :
361 651008 : temp_len = sub( shr( L, 1 ), n );
362 46221568 : FOR( i = 0; i < temp_len; i += 2 )
363 : {
364 45570560 : *p1++ = round_fx_sat( L_sub_sat( L_deposit_h( *p4++ ), L_shl_sat( Mult_32_16( *pa--, *p5-- ), 1 ) ) ); /* (( Qin + Q15 -15)+1 + ( Qin - 15 + 16))-1 */
365 45570560 : *p1++ = round_fx_sat( L_sub_sat( L_deposit_h( *p4++ ), L_shl_sat( Mult_32_16( *pa--, *p3 ), 1 ) ) ); /* (( Qin + Q15 -15)+1 + ( Qin - 15 + 16))-1 */
366 45570560 : move16();
367 45570560 : p3 -= decimate;
368 : /* paout[L/2 + i ] = -ImdctOut[L - 1 - i] * win_int_right[(3*L_FRAME16k/2-1-i/2)-windecay16]+OldauOut[i+L/2];
369 : paout[L/2 + i +1] = -ImdctOut[L - 1 - (i+1)] * win_right[(3*L_FRAME16k/2-1-i/2)*decimate+decay-windecay48]+OldauOut[i+L/2+1]; */
370 : }
371 59241728 : FOR( i = 0; i < n; i += 2 )
372 : {
373 58590720 : *p1++ = round_fx_sat( L_sub_sat( L_deposit_h( *p4++ ), L_shl( *pa--, 1 ) ) );
374 58590720 : move16();
375 58590720 : *p1++ = round_fx_sat( L_sub_sat( L_deposit_h( *p4++ ), L_shl( *pa--, 1 ) ) );
376 58590720 : move16();
377 : /* paout[L/2 + i +1] = -ImdctOut[L - 1 - (i+1)]+OldauOut[i+L/2+1] ;
378 : paout[L/2 + i ] = -ImdctOut[L - 1 - i]+OldauOut[i+L/2]; */
379 : }
380 : }
381 :
382 651009 : p1 = OldauOut + shr( L, 1 );
383 651009 : pa = ImdctOut;
384 651009 : p2 = win_int_left + L_FRAME16k / 2 - 1;
385 651009 : p3 = win_left + ( L_FRAME16k / 2 - 1 ) * 3 + 1;
386 :
387 651009 : temp_len = shr( L, 1 );
388 104812449 : FOR( i = 0; i < temp_len; i += 2 )
389 : {
390 104161440 : *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa++, *p2-- ), 1 ) ) );
391 104161440 : move16();
392 104161440 : *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa++, *p3 ), 1 ) ) );
393 104161440 : move16();
394 104161440 : p3 -= decimate;
395 : /* OldauOut[L/2 + i] = -ImdctOut[i] * win_int_left[(L_FRAME16k/2-i/2-1)];
396 : OldauOut[L/2 + i +1] = -ImdctOut[i+1] * win_left[(L_FRAME16k/2-i/2-1)*decimate+decay]*/
397 : ;
398 : }
399 :
400 651009 : p1 = OldauOut + n;
401 651009 : pa = ImdctOut + sub( sub( shr( L, 1 ), 1 ), n );
402 651009 : p2 = win_left + ( L_FRAME16k - N16_CORE_SW ) * 3 - 1 - 1;
403 651009 : p3 = win_int_left + ( L_FRAME16k - N16_CORE_SW - 1 );
404 651009 : temp_len = sub( shr( L, 1 ), n );
405 46221639 : FOR( i = 0; i < temp_len; i += 2 )
406 : {
407 45570630 : *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa--, *p2 ), 1 ) ) );
408 45570630 : move16();
409 45570630 : *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa--, *p3-- ), 1 ) ) );
410 45570630 : move16();
411 45570630 : p2 -= decimate;
412 : /* OldauOut[ i] = -ImdctOut[L/2 - 1 - i] *win_left[(L_FRAME16k-i/2)*decimate-decay-1];
413 : OldauOut[ i +1] = -ImdctOut[L/2 - 1 - (i +1)] * win_int_left[L_FRAME16k-(i/2)-1];; */
414 : }
415 : }
416 : ELSE
417 : {
418 1129839 : IF( use_bfi_win == 0 )
419 : {
420 :
421 1129838 : p1 = paout + n;
422 1129838 : pa = ImdctOut + add( shr( L, 1 ), n );
423 1129838 : p3 = win_right + sub( sub( sub( i_mult2( sub( shl( L, 1 ), n ), decimate ), 1 ), decay ), windecay48 );
424 1129838 : p4 = OldauOut + n;
425 :
426 1129838 : temp_len = sub( shr( L, 1 ), n );
427 164405594 : FOR( i = 0; i < temp_len; i++ )
428 : {
429 163275756 : *p1++ = round_fx_sat( L_add_sat( L_shl( Mult_32_16( *pa++, *p3 ), 1 ), L_deposit_h( *p4++ ) ) ); /* (( Qin + Q15 -15)+1 + ( Qin - 15 + 16))-1 */
430 163275756 : move16();
431 163275756 : p3 -= decimate;
432 : /*paout[i] = ImdctOut[L/2 + i] * win_right[(2*L-i)*decimate-1-decay-windecay48]+OldauOut[i];*/
433 : }
434 :
435 :
436 1129838 : pa = ImdctOut + sub( L, 1 );
437 1129838 : p3 = win_right + sub( add( i_mult2( sub( i_mult2( shr( L, 1 ), 3 ), 1 ), decimate ), decay ), windecay48 );
438 1129838 : temp_len = sub( shr( L, 1 ), n );
439 164405594 : FOR( i = 0; i < temp_len; i++ )
440 : {
441 163275756 : *p1++ = round_fx_sat( L_sub_sat( L_deposit_h( *p4++ ), L_shl_sat( Mult_32_16( *pa--, *p3 ), 1 ) ) ); /* (( Qin + Q15 -15)+1 + ( Qin - 15 + 16))-1 */
442 163275756 : move16();
443 163275756 : p3 -= decimate;
444 : /* paout[L/2 + i] = -ImdctOut[L - 1 - i] * win_right[(3*L/2-1-i)*decimate+decay-windecay48]+OldauOut[i+L/2]; */
445 : }
446 211055810 : FOR( i = 0; i < n; i++ )
447 : {
448 209925972 : *p1++ = round_fx_sat( L_sub_sat( L_deposit_h( *p4++ ), L_shl( *pa--, 1 ) ) );
449 209925972 : move16();
450 : /* paout[L/2 + i] = -ImdctOut[L - 1 - i] + OldauOut[i+L/2]; */
451 : }
452 : }
453 :
454 :
455 1129839 : p1 = OldauOut + shr( L, 1 );
456 1129839 : pa = ImdctOut;
457 1129839 : p2 = win_left + add( i_mult2( sub( shr( L, 1 ), 1 ), decimate ), decay );
458 :
459 1129839 : temp_len = shr( L, 1 );
460 374331727 : FOR( i = 0; i < temp_len; i++ )
461 : {
462 373201888 : *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa++, *p2 ), 1 ) ) );
463 373201888 : move16();
464 373201888 : p2 -= decimate;
465 : /*OldauOut[L/2 + i] = -ImdctOut[i] * win_left[(L/2-i-1)*decimate+decay]; */
466 : }
467 :
468 1129839 : p1 = OldauOut + n;
469 1129839 : pa = ImdctOut + sub( sub( shr( L, 1 ), 1 ), n );
470 1129839 : p2 = win_left + sub( sub( i_mult2( sub( L, n ), decimate ), decay ), 1 );
471 1129839 : temp_len = sub( shr( L, 1 ), n );
472 164405665 : FOR( i = 0; i < temp_len; i++ )
473 : {
474 163275826 : *p1++ = round_fx( L_negate( L_shl( Mult_32_16( *pa--, *p2 ), 1 ) ) );
475 163275826 : move16();
476 163275826 : p2 -= decimate;
477 : /* OldauOut[ i] = -ImdctOut[L/2 - 1 - i] * win_left[(L-i)*decimate-decay-1]; */
478 : }
479 : }
480 :
481 1780848 : p1 = OldauOut;
482 1780848 : pa = ImdctOut + sub( shr( L, 1 ), 1 );
483 1780848 : p2 = paout + L;
484 :
485 328888530 : FOR( i = 0; i < n; i++ )
486 : {
487 327107682 : *p1 = round_fx( L_negate( L_shl( *pa--, 1 ) ) );
488 327107682 : move16();
489 327107682 : *p2++ = *p1++;
490 327107682 : move16();
491 : }
492 :
493 1780848 : return;
494 : }
495 :
496 : /*-------------------------------------------------------------------*
497 : * window_ola_ext_fx()
498 : *
499 : *
500 : *-------------------------------------------------------------------*/
501 :
502 1578 : void window_ola_ext_fx(
503 : const Word32 *ImdstOut, /* i : input Qx */
504 : Word32 *auOut, /* o : output audio Qx */
505 : Word32 *OldauOut, /* i/o: audio from previous frame Qx */
506 : const Word16 L, /* i : length */
507 : const Word16 right_mode,
508 : const Word16 left_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */
509 : const UWord16 kernel_type /* i : transform kernel type */
510 : )
511 : {
512 : Word16 temp;
513 1578 : IF( s_and( kernel_type, 1 ) )
514 : {
515 1110 : temp = MAX_16;
516 : }
517 : ELSE
518 : {
519 468 : temp = MIN_16;
520 : }
521 1578 : move16();
522 :
523 1578 : const Word16 sign_left = temp;
524 1578 : move16();
525 :
526 1578 : IF( GE_16( kernel_type, MDCT_II ) )
527 : {
528 1068 : temp = MIN_16;
529 : }
530 : ELSE
531 : {
532 510 : temp = MAX_16;
533 : }
534 1578 : move16();
535 :
536 1578 : const Word16 sign_right = temp;
537 1578 : move16();
538 :
539 : Word16 i, decimate, decay;
540 : Word16 n, n16, windecay48, windecay16;
541 : Word16 win_right[R2_48];
542 : Word16 win_int_left[R1_16];
543 : Word16 win_left[R1_48];
544 : Word16 win_int_right[R2_16];
545 : Word32 *paout;
546 :
547 1578 : n = shr( mult( shl( L, Q5 ), N_ZERO_BY_FS ), Q5 ); // Q0
548 1578 : n16 = N16_CORE_SW;
549 1578 : move16();
550 1578 : windecay48 = WINDECAY48;
551 1578 : move16();
552 1578 : windecay16 = WINDECAY16;
553 1578 : move16();
554 1578 : decimate = 1;
555 1578 : move16();
556 1578 : decay = 0;
557 1578 : move16();
558 :
559 1578 : tcx_get_windows_mode1( left_mode, right_mode, win_left, win_right, win_int_left, win_int_right, L );
560 :
561 1578 : test();
562 1578 : IF( EQ_16( L, L_FRAME32k ) || EQ_16( L, L_FRAME16k ) )
563 : {
564 1024 : decimate = 3;
565 1024 : move16();
566 1024 : decay = 1;
567 1024 : move16();
568 : }
569 554 : ELSE IF( EQ_16( L, L_FRAME8k ) )
570 : {
571 0 : decimate = 6;
572 0 : move16();
573 0 : decay = 2;
574 0 : move16();
575 : }
576 :
577 554 : ELSE IF( EQ_16( L, 512 ) )
578 : {
579 397 : windecay48 = WINDECAY48_256;
580 397 : move16();
581 397 : decimate = 1;
582 397 : move16();
583 397 : decay = 0;
584 397 : move16();
585 : }
586 157 : ELSE IF( EQ_16( L, 256 ) )
587 : {
588 0 : windecay48 = WINDECAY48_256;
589 0 : move16();
590 0 : decimate = 2;
591 0 : move16();
592 0 : decay = 0;
593 0 : move16();
594 : }
595 :
596 1578 : paout = auOut - n; // Qx
597 :
598 1578 : IF( EQ_16( L, L_FRAME32k ) )
599 : {
600 22010 : FOR( i = n; i < ( L >> 1 ); i += 2 )
601 : {
602 21700 : paout[i] = L_add_sat( Mpy_32_16_1( Mpy_32_16_1( ImdstOut[( ( L >> 1 ) + i )], sign_right ), win_right[( ( ( ( ( ( 2 * L_FRAME16k - ( n16 + ( ( i - n ) >> 1 ) ) ) ) * decimate ) - 1 ) - decay ) - windecay48 )] ), OldauOut[i] );
603 21700 : move32();
604 21700 : paout[i + 1] = L_add_sat( Mpy_32_16_1( Mpy_32_16_1( ImdstOut[( ( ( L >> 1 ) + i ) + 1 )], sign_right ), win_int_right[( ( ( 2 * L_FRAME16k - ( n16 + ( ( i - n ) >> 1 ) ) ) - 1 ) - windecay16 )] ), OldauOut[i + 1] );
605 21700 : move32();
606 : }
607 :
608 22010 : FOR( i = 0; i < ( L >> 1 ) - n; i += 2 )
609 : {
610 21700 : paout[( ( ( L >> 1 ) + i ) + 1 )] = L_add_sat( Mpy_32_16_1( L_negate( ImdstOut[( ( L - 1 ) - ( i + 1 ) )] ), win_right[( ( ( ( ( 3 * L_FRAME16k / 2 - 1 - ( i >> 1 ) ) ) * decimate ) + decay ) - windecay48 )] ), OldauOut[( ( i + ( L >> 1 ) ) + 1 )] );
611 21700 : move32();
612 21700 : paout[( ( L >> 1 ) + i )] = L_add_sat( Mpy_32_16_1( L_negate( ImdstOut[( ( L - 1 ) - i )] ), win_int_right[( ( 3 * L_FRAME16k / 2 - 1 - ( i >> 1 ) ) - windecay16 )] ), OldauOut[( i + ( L >> 1 ) )] );
613 21700 : move32();
614 : }
615 :
616 28210 : FOR( i = ( ( L >> 1 ) - n ); i < ( L >> 1 ); i += 2 )
617 : {
618 27900 : paout[( ( ( L >> 1 ) + i ) + 1 )] = L_add_sat( L_negate( ImdstOut[( ( L - 1 ) - ( i + 1 ) )] ), OldauOut[( ( i + ( L >> 1 ) ) + 1 )] );
619 27900 : move32();
620 27900 : paout[( ( L >> 1 ) + i )] = L_add_sat( L_negate( ImdstOut[( L - ( 1 + i ) )] ), OldauOut[( i + ( L >> 1 ) )] );
621 27900 : move32();
622 : }
623 :
624 49910 : FOR( i = 0; i < ( L >> 1 ); i += 2 )
625 : {
626 49600 : OldauOut[( ( ( L >> 1 ) + i ) + 1 )] = Mpy_32_16_1( Mpy_32_16_1( ImdstOut[i + 1], sign_left ), win_left[( ( ( L_FRAME16k / 2 - 1 - ( i >> 1 ) ) * decimate ) + decay )] );
627 49600 : move32();
628 49600 : OldauOut[( ( L >> 1 ) + i )] = Mpy_32_16_1( Mpy_32_16_1( ImdstOut[i], sign_left ), win_int_left[( L_FRAME16k / 2 - 1 - ( i >> 1 ) )] );
629 49600 : move32();
630 : }
631 :
632 :
633 22010 : FOR( i = n; i < ( L >> 1 ); i += 2 )
634 : {
635 21700 : OldauOut[i] = Mpy_32_16_1( L_negate( ImdstOut[( ( ( L >> 1 ) - 1 ) - i )] ), win_left[( ( ( ( L_FRAME16k - ( i >> 1 ) ) * decimate ) - decay ) - 1 )] );
636 21700 : move32();
637 21700 : OldauOut[i + 1] = Mpy_32_16_1( L_negate( ImdstOut[( ( ( L >> 1 ) - 1 ) - ( i + 1 ) )] ), win_int_left[( L_FRAME16k - 1 - ( i >> 1 ) )] );
638 21700 : move32();
639 : }
640 : }
641 : ELSE
642 : {
643 128682 : FOR( i = n; i < ( L >> 1 ); i++ )
644 : {
645 127414 : paout[i] = L_add_sat( Mpy_32_16_1( Mpy_32_16_1( ImdstOut[( ( L >> 1 ) + i )], sign_right ), win_right[( ( ( ( ( ( ( L << 1 ) - i ) ) * decimate ) - 1 ) - decay ) - windecay48 )] ), OldauOut[i] );
646 127414 : move32();
647 : }
648 :
649 128682 : FOR( i = 0; i < ( L >> 1 ) - n; i++ )
650 : {
651 127414 : paout[( ( L >> 1 ) + i )] = L_add_sat( Mpy_32_16_1( L_negate( ImdstOut[( L - ( 1 + i ) )] ), win_right[( ( ( ( ( ( ( 3 * ( L >> 1 ) ) - 1 ) - i ) ) * decimate ) + decay ) - windecay48 )] ), OldauOut[( i + ( L >> 1 ) )] );
652 127414 : move32();
653 : }
654 :
655 165086 : FOR( i = ( ( L >> 1 ) - n ); i < ( L >> 1 ); i++ )
656 : {
657 163818 : paout[( ( L >> 1 ) + i )] = L_add_sat( L_negate( ImdstOut[( L - ( 1 + i ) )] ), OldauOut[( i + ( L >> 1 ) )] );
658 163818 : move32();
659 : }
660 :
661 292500 : FOR( i = 0; i < ( L >> 1 ); i++ )
662 : {
663 291232 : OldauOut[( ( L >> 1 ) + i )] = Mpy_32_16_1( Mpy_32_16_1( ImdstOut[i], sign_left ), win_left[( ( ( ( ( L >> 1 ) - ( i + 1 ) ) ) * decimate ) + decay )] );
664 291232 : move32();
665 : }
666 :
667 :
668 128682 : FOR( i = n; i < ( L >> 1 ); i++ )
669 : {
670 127414 : OldauOut[i] = Mpy_32_16_1( L_negate( ImdstOut[( ( L >> 1 ) - ( 1 + i ) )] ), win_left[( ( ( ( L - i ) * decimate ) - decay ) - 1 )] );
671 127414 : move32();
672 : }
673 : }
674 :
675 221196 : FOR( i = 0; i < n; i++ )
676 : {
677 219618 : OldauOut[i] = L_negate( ImdstOut[( ( L >> 1 ) - ( 1 + i ) )] );
678 219618 : move32();
679 : }
680 221196 : FOR( i = 0; i < n; i++ )
681 : {
682 219618 : paout[( L + i )] = OldauOut[i];
683 219618 : move32();
684 : }
685 :
686 1578 : return;
687 : }
688 :
689 :
690 : /*---------------------------------------------------------------------*
691 : * core_switching_OLA()
692 : *
693 : * modify window after HQ core decoding
694 : * overlapp ACELP and HQ
695 : *---------------------------------------------------------------------*/
696 24 : void core_switching_OLA_fx(
697 : Word16 *mem_over_hp, /* i : upsampling filter memory Qsubrf (except at 8kHz) */
698 : const Word16 last_L_frame, /* i : last L_frame lengthture */
699 : const Word32 output_Fs, /* i : output sampling rate */
700 : Word16 *synth, /* i/o: synthesized signal from HQ core Qsynth*/
701 : Word16 *synth_subfr_out, /* i : synthesized signal from ACELP core Qsubfr*/
702 : Word16 *synth_subfr_bwe, /* i : synthesized BWE from ACELP core Qbwe (todo) */
703 : const Word16 output_frame, /* i : output frame length */
704 : const Word16 bwidth, /* i : output bandwidth */
705 : Word16 *Qsynth,
706 : Word16 *Qsubfr )
707 : {
708 : Word16 i, Loverlapp, out_filt_length, filt_delay, L;
709 : Word16 tmp_buf_switch[SWITCH_MAX_GAP], tmp_buf_switch2[HQ_DELAY_COMP * HQ_DELTA_MAX + 2]; /*Q0 */
710 24 : const Word16 *pt_sin = NULL, *pt_cos;
711 : Word16 *pt2, *pt3, *pt;
712 : const Word16 *pt4, *pt5;
713 : Word16 tmp, tmp2, temp_len;
714 24 : Word16 decimate = 0, delta = 0; /* initialize just to avoid compiler warnings */
715 24 : move16();
716 24 : move16();
717 : const Word16 *on_win, *on_win_int;
718 : Word16 a, b, divisor, buf_offset;
719 : Word32 L_tmp;
720 :
721 : /* Scaling (if needed) */
722 24 : tmp = s_min( *Qsynth, *Qsubfr );
723 24 : Scale_sig( synth, output_frame, sub( tmp, *Qsynth ) );
724 24 : *Qsynth = tmp;
725 24 : move16();
726 24 : Scale_sig( synth_subfr_out, SWITCH_MAX_GAP, sub( tmp, *Qsubfr ) );
727 24 : Scale_sig( mem_over_hp, NS2SA_FX2( 16000, DELAY_CLDFB_NS ) + 2, sub( tmp, *Qsubfr ) ); /* reScale mem over HP at Qsynth */
728 24 : *Qsubfr = tmp;
729 24 : move16();
730 :
731 : /* win = window_48kHz_fx;*/
732 : /* win_int = window_8_16_32kHz_fx;*/
733 24 : on_win = one_on_win_48k_fx; // Q14
734 24 : on_win_int = one_on_win_8k_16k_48k_fx; // Q14
735 :
736 :
737 24 : SWITCH( output_frame )
738 : {
739 0 : case L_FRAME8k:
740 0 : decimate = 6;
741 0 : move16();
742 : /*decay = 2; move16();*/
743 0 : delta = 1;
744 0 : move16();
745 0 : pt_sin = sin_switch_8;
746 0 : BREAK;
747 0 : case L_FRAME16k:
748 0 : decimate = 3;
749 0 : move16();
750 : /*decay = 1; move16(); */
751 0 : delta = 2;
752 0 : move16();
753 0 : pt_sin = sin_switch_16;
754 0 : BREAK;
755 5 : case L_FRAME32k:
756 5 : decimate = 3;
757 5 : move16();
758 : /*decay = 1; move16(); */
759 5 : delta = 4;
760 5 : move16();
761 5 : pt_sin = sin_switch_32;
762 5 : BREAK;
763 19 : case L_FRAME48k:
764 19 : decimate = 1;
765 19 : move16();
766 : /*decay = 0; move16();*/
767 19 : delta = 6;
768 19 : move16();
769 19 : pt_sin = sin_switch_48;
770 19 : BREAK;
771 : }
772 :
773 24 : set16_fx( tmp_buf_switch, 0, SWITCH_MAX_GAP );
774 24 : set16_fx( tmp_buf_switch2, 0, HQ_DELAY_COMP * HQ_DELTA_MAX + 2 );
775 :
776 24 : Loverlapp = i_mult2( delta, SWITCH_OVERLAP_8k );
777 24 : pt_cos = pt_sin + Loverlapp - 1;
778 :
779 24 : Copy( synth_subfr_out, tmp_buf_switch, i_mult2( SWITCH_GAP_LENGTH_8k, delta ) ); /* copy 6.25 ms subframe */
780 :
781 :
782 : /* conversion from 12.8kHz to output_Fs */
783 24 : IF( EQ_16( last_L_frame, L_FRAME ) )
784 : {
785 : /* resample filter memory */
786 5 : IF( EQ_16( output_frame, L_FRAME8k ) )
787 : {
788 0 : Copy( synth_subfr_out + SWITCH_GAP_LENGTH_8k, tmp_buf_switch + SWITCH_GAP_LENGTH_8k, NS2SA_FX2( output_Fs, DELAY_CLDFB_NS ) ); /* copy subframe to tmp buffer */
789 : }
790 : ELSE
791 : {
792 5 : filt_delay = 0;
793 5 : move16();
794 5 : out_filt_length = 0;
795 5 : move16();
796 5 : out_filt_length = modify_Fs_intcub3m_sup_fx( mem_over_hp + 2, NS2SA_FX2( 12800, DELAY_CLDFB_NS ), 12800, tmp_buf_switch2, output_Fs, &filt_delay );
797 5 : pt = tmp_buf_switch2 + sub( out_filt_length, filt_delay );
798 5 : pt2 = pt - 1;
799 15 : FOR( i = 0; i < filt_delay; i++ )
800 : {
801 10 : *pt++ = *pt2;
802 10 : move16();
803 : }
804 :
805 5 : test();
806 5 : test();
807 5 : test();
808 5 : IF( ( EQ_16( bwidth, NB ) && GE_32( output_Fs, 16000 ) ) || ( GT_16( bwidth, NB ) && GT_32( output_Fs, 16000 ) ) )
809 : {
810 : /* mix cubic and CLDFB resampled buffers in case of resampling to higher frequency rates */
811 5 : buf_offset = i_mult2( SWITCH_GAP_LENGTH_8k, delta );
812 5 : divisor = getNormReciprocalWord16( out_filt_length );
813 205 : FOR( i = 0; i < out_filt_length; i++ )
814 : {
815 200 : a = i_mult2( i, divisor );
816 200 : b = sub( 32767, a );
817 :
818 200 : L_tmp = L_mult( a, tmp_buf_switch2[i] );
819 200 : tmp_buf_switch[buf_offset + i] = mac_r( L_tmp, b, synth_subfr_out[buf_offset + i] );
820 200 : move16();
821 : }
822 : }
823 : ELSE
824 : {
825 : /* copy cubic resampled buffer (memory) */
826 0 : Copy( tmp_buf_switch2, tmp_buf_switch + i_mult2( SWITCH_GAP_LENGTH_8k, delta ), out_filt_length );
827 : }
828 : }
829 : }
830 : ELSE
831 : {
832 :
833 :
834 19 : IF( ( output_frame - L_FRAME16k ) == 0 ) /* no resampling */
835 : {
836 0 : Copy( mem_over_hp + 2, tmp_buf_switch + i_mult2( SWITCH_GAP_LENGTH_8k, delta ), NS2SA_FX2( output_Fs, DELAY_CLDFB_NS ) );
837 : }
838 : ELSE
839 : {
840 19 : IF( ( output_frame - L_FRAME8k ) == 0 ) /* not done yet */
841 : {
842 0 : Copy( synth_subfr_out + SWITCH_GAP_LENGTH_8k, tmp_buf_switch + SWITCH_GAP_LENGTH_8k, NS2SA_FX2( output_Fs, DELAY_CLDFB_NS ) ); /* copy subframe to tmp buffer */
843 : }
844 : ELSE
845 : {
846 19 : out_filt_length = modify_Fs_intcub3m_sup_fx( mem_over_hp + 2, NS2SA( 16000, DELAY_CLDFB_NS ), 16000, tmp_buf_switch2, output_Fs, &filt_delay );
847 19 : pt = tmp_buf_switch2 + sub( out_filt_length, filt_delay );
848 19 : pt2 = pt - 1;
849 57 : FOR( i = 0; i < filt_delay; i++ )
850 : {
851 38 : *pt++ = *pt2;
852 38 : move16();
853 : }
854 :
855 19 : test();
856 19 : test();
857 19 : test();
858 19 : IF( ( EQ_16( bwidth, NB ) && GE_32( output_Fs, 16000 ) ) || ( GT_16( bwidth, NB ) && GT_32( output_Fs, 16000 ) ) )
859 : {
860 : /* mix cubic and CLDFB resampled buffers in case of resampling to higher frequency rates */
861 19 : buf_offset = i_mult2( SWITCH_GAP_LENGTH_8k, delta );
862 19 : divisor = getNormReciprocalWord16( out_filt_length );
863 1159 : FOR( i = 0; i < out_filt_length; i++ )
864 : {
865 1140 : a = i_mult2( i, divisor );
866 1140 : b = sub( 32767, a );
867 :
868 1140 : L_tmp = L_mult( a, tmp_buf_switch2[i] );
869 1140 : tmp_buf_switch[buf_offset + i] = mac_r( L_tmp, b, synth_subfr_out[buf_offset + i] );
870 1140 : move16();
871 : }
872 : }
873 : ELSE
874 : {
875 : /* copy cubic resampled buffer (memory) */
876 0 : Copy( tmp_buf_switch2, tmp_buf_switch + i_mult2( SWITCH_GAP_LENGTH_8k, delta ), out_filt_length );
877 : }
878 : }
879 : }
880 : }
881 :
882 :
883 : /* compensate aldo */
884 24 : L = i_mult2( delta, SWITCH_GAP_LENGTH_8k + NS2SA( 8000, DELAY_CLDFB_NS ) ); /* 6.25 ms gap + 1.25 ms resamp */
885 24 : tmp = sub( L, Loverlapp );
886 :
887 :
888 24 : set16_fx( synth, 0, tmp );
889 :
890 :
891 24 : IF( EQ_16( output_frame, L_FRAME32k ) )
892 : {
893 :
894 5 : pt = synth + tmp;
895 5 : pt2 = pt + 1;
896 5 : pt5 = on_win + 210 - 1;
897 5 : pt4 = on_win_int + 70 - 1;
898 5 : temp_len = i_mult2( ( R2_16 >> 2 ), delta );
899 355 : FOR( i = 0; i < temp_len; i += 2 )
900 : {
901 350 : *pt = shl_sat( mult_r_sat( *pt, *pt5 ), 1 );
902 350 : move16(); /* // Q14* Q15 + shl ==> Q15 */
903 350 : *pt2 = shl_sat( mult_r_sat( *pt2, *pt4 ), 1 );
904 350 : move16(); /*/= win[(3*L_FRAME16k/2-1-i/2)*decimate+decay-L_FRAME48k*14/20]; */
905 350 : pt += 2;
906 350 : pt2 += 2;
907 350 : pt5 -= 3;
908 350 : pt4--;
909 : }
910 : }
911 : ELSE
912 : {
913 :
914 19 : pt = synth + tmp;
915 19 : pt5 = on_win + 210 - 1;
916 19 : temp_len = i_mult2( ( R2_16 >> 2 ), delta );
917 4009 : FOR( i = 0; i < temp_len; i++ )
918 : {
919 3990 : *pt = shl_sat( mult_r_sat( *pt, *pt5 ), 1 );
920 3990 : move16(); /* /= win[(3*output_frame/2-1-i)*decimate+decay-L_FRAME48k*14/20]; */
921 3990 : pt++;
922 3990 : pt5 -= decimate;
923 3990 : move16();
924 : }
925 : }
926 :
927 :
928 24 : pt = synth + tmp;
929 24 : move16(); /*Q15 */
930 24 : pt2 = synth_subfr_bwe + tmp - NS2SA_FX2( output_Fs, DELAY_CLDFB_NS );
931 24 : move16(); /*Q15 */
932 24 : pt3 = tmp_buf_switch + tmp;
933 24 : move16(); /*Q15 */
934 :
935 2034 : FOR( i = 0; i < Loverlapp; i++ ) /*Windowing for overlapadd */
936 : {
937 2010 : *pt = mult_r( *pt, *pt_sin );
938 2010 : move16();
939 2010 : pt_sin++;
940 2010 : tmp2 = mult_r( *pt_cos, *pt_cos );
941 2010 : pt_cos--;
942 2010 : *pt2 = mult_r( *pt2, tmp2 );
943 2010 : move16();
944 2010 : *pt3 = mult_r( *pt3, tmp2 );
945 2010 : move16();
946 2010 : pt++;
947 2010 : pt2++;
948 2010 : pt3++;
949 : }
950 :
951 24 : pt = synth;
952 24 : pt2 = tmp_buf_switch;
953 24 : tmp = NS2SA_FX2( output_Fs, DELAY_CLDFB_NS );
954 24 : move16();
955 24 : pt3 = synth_subfr_bwe;
956 :
957 : /* overlapadd ACELP (tmp_buf_switch) + HQ (synth) */ /*Q15 */
958 1364 : FOR( i = 0; i < tmp; i++ )
959 : {
960 1340 : *pt = add( *pt, *pt2++ );
961 1340 : move16();
962 1340 : pt++;
963 : }
964 :
965 24 : temp_len = sub( L, tmp );
966 6724 : FOR( i = 0; i < temp_len; i++ )
967 : {
968 6700 : *pt = add_sat( add_sat( *pt, *pt2++ ), *pt3++ );
969 6700 : move16();
970 6700 : pt++;
971 : }
972 :
973 24 : return;
974 : }
|