Line data Source code
1 : /*====================================================================================
2 : EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
3 : ====================================================================================*/
4 :
5 : #include <stdint.h>
6 : #include <math.h>
7 : #include "options.h" /* Compilation switches */
8 : #include "cnst.h" /* Common constants */
9 : #include "prot_fx.h"
10 : #include "rom_com.h" /* Static table prototypes */
11 : #include <assert.h>
12 : #include "rom_enc.h" /* prototypes */
13 : #include "basop_util.h"
14 : #include "ivas_prot_fx.h"
15 : #include "wmc_auto.h"
16 :
17 :
18 : /*-----------------------------------------------------------------*
19 : * Local functions
20 : *-----------------------------------------------------------------*/
21 :
22 :
23 : /*==============================================================================*/
24 : /* FUNCTION : modify_Fs_fx ( ) */
25 : /*------------------------------------------------------------------------------*/
26 : /* PURPOSE : Modify sampling freq by interpolation */
27 : /*------------------------------------------------------------------------------*/
28 : /* INPUT ARGUMENTS : */
29 : /* const Word16 sigIn_fx[] signal to decimate Q_syn2-1 */
30 : /* const Word16 lg length of input */
31 : /* const Word16 fin frequency of input Q0 */
32 : /* const Word16 fout frequency of output Q0 */
33 : /*------------------------------------------------------------------------------*/
34 : /* OUTPUT ARGUMENTS : */
35 : /* Word16 sigOut_fx[] decimated signal Q_syn2-1 */
36 : /*------------------------------------------------------------------------------*/
37 : /* INPUT/OUTPUT ARGUMENTS : */
38 : /* Word16 mem_fx[] filter memory Q_syn2-1 */
39 : /*------------------------------------------------------------------------------*/
40 : /* RETURN ARGUMENTS : */
41 : /* _ None. */
42 : /*------------------------------------------------------------------------------*/
43 : /* CALLED FROM : TX/RX */
44 : /*==============================================================================*/
45 :
46 302 : Word16 modify_Fs_ivas_fx( /* o : length of output Q0 */
47 : const Word16 sigIn_fx[], /* i : signal to decimate Q0 */
48 : Word16 lg, /* i : length of input Q0 */
49 : const Word32 fin, /* i : frequency of input Q0 */
50 : Word16 sigOut_fx[], /* o : decimated signal Q0 */
51 : const Word32 fout, /* i : frequency of output Q0 */
52 : Word16 mem_fx[], /* i/o: filter memory Q0 */
53 : const Word16 nblp, /* i : flag indicating if NB low-pass is applied */
54 : Word16 *Q_new_inp, /*scaling added on sigOut_fx */
55 : Word16 *mem_decim_size /*i: size modified for mem_fx*/
56 : )
57 : {
58 : Word16 i;
59 :
60 : Word16 lg_out, fac_num, fac_den, filt_len, frac, temp_n, mem_len;
61 : Word16 num_den;
62 : Word16 datastep, fracstep;
63 : Word16 *sigIn_ptr, *sigPtr;
64 : Word16 signal_tab_fx[3 * L_FILT_MAX + L_FRAME48k], *signal_fx, *signal_ana_fx; /* 3* as 2* for memory and 1* for future prediction */
65 : Word16 A_fx[M + 1], r_fx_h[M + 1], r_fx_l[M + 1];
66 : Word16 mem_len_ana;
67 : Word16 plus_sample_in;
68 : Word16 j;
69 : Word16 mu_preemph_fx;
70 : Word16 mem_preemph_fx;
71 : Word16 Q_r;
72 : Word16 mem_lev_fx[18];
73 : Word32 t0, t1, t2, L_tmp; /* temporary variables */
74 : Word32 LepsP[M + 1];
75 302 : Word16 flag_low_order = 0;
76 302 : move16();
77 : Word16 filt_len_tmp;
78 : #ifndef ISSUE_1836_replace_overflow_libcom
79 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
80 : Flag Overflow = 0;
81 : move32();
82 : #endif
83 : #endif
84 : const Resampling_cfg *cfg_ptr_fx;
85 :
86 : /*-------------------------------------------------------------------*
87 : * Find the resampling configuration
88 : *-------------------------------------------------------------------*/
89 302 : *Q_new_inp = 0;
90 302 : move16();
91 : /* check if fin and fout are the same */
92 302 : IF( EQ_32( fin, fout ) )
93 : {
94 : /* just copy the signal_fx and quit */
95 0 : Copy( sigIn_fx, sigOut_fx, lg );
96 0 : *mem_decim_size = 0;
97 0 : *Q_new_inp = 0;
98 0 : move16();
99 0 : move16();
100 0 : return lg;
101 : }
102 : ELSE
103 : {
104 : /* find the resampling configuration in the lookup table */
105 302 : cfg_ptr_fx = &resampling_cfg_tbl[0];
106 6342 : WHILE( ( cfg_ptr_fx->fin_fx != 0 ) && !( EQ_32( cfg_ptr_fx->fin_fx, fin ) && EQ_32( cfg_ptr_fx->fout_fx, fout ) ) )
107 : {
108 6040 : test();
109 6040 : test();
110 6040 : cfg_ptr_fx++;
111 : }
112 :
113 :
114 : /* find config with NB 4kHz low-pass */
115 302 : test();
116 302 : test();
117 302 : IF( nblp && ( GT_32( fin, 8000 ) ) && ( EQ_32( fout, 12800 ) ) )
118 : {
119 0 : flag_low_order = 1;
120 0 : move16();
121 0 : cfg_ptr_fx++;
122 0 : WHILE( ( cfg_ptr_fx->fin_fx != 0 ) && !( ( EQ_32( cfg_ptr_fx->fin_fx, fin ) ) && ( EQ_32( cfg_ptr_fx->fout_fx, fout ) ) ) )
123 : {
124 0 : test();
125 0 : test();
126 0 : cfg_ptr_fx++;
127 : }
128 : }
129 :
130 : /*-------------------------------------------------------------------*
131 : * Retrieve and/or calculate the resampling parameters
132 : *-------------------------------------------------------------------*/
133 302 : fac_num = cfg_ptr_fx->fac_num_fx;
134 302 : move16(); /*Q0*/
135 302 : fac_den = cfg_ptr_fx->fac_den_fx;
136 302 : move16();
137 :
138 302 : lg_out = idiv1616( i_mult2( lg, fac_num ), fac_den );
139 302 : filt_len = cfg_ptr_fx->filt_len_fx;
140 302 : move16();
141 302 : plus_sample_in = 0;
142 302 : move16(); /*default, regular delay*/
143 302 : frac = 0;
144 302 : move16();
145 :
146 302 : test();
147 302 : IF( ( EQ_32( fin, 8000 ) ) && ( EQ_32( fout, 12800 ) ) )
148 : {
149 0 : plus_sample_in = 7;
150 0 : move16();
151 0 : frac = 4;
152 0 : move16();
153 : }
154 :
155 302 : mem_len = shl( filt_len, 1 );
156 302 : *mem_decim_size = mem_len;
157 302 : move16();
158 302 : signal_fx = signal_tab_fx + 2 * L_FILT_MAX + sub( L_FRAME48k, add( mem_len, lg ) );
159 302 : signal_ana_fx = signal_fx;
160 302 : mem_len_ana = mem_len;
161 302 : move16();
162 : }
163 :
164 :
165 : /*-------------------------------------------------------------------*
166 : * Resample
167 : *-------------------------------------------------------------------*/
168 : /* append filter memory */
169 302 : Copy( mem_fx, signal_fx, mem_len );
170 :
171 302 : sigPtr = signal_fx + mem_len;
172 302 : Copy( sigIn_fx, sigPtr, lg );
173 :
174 302 : IF( plus_sample_in > 0 )
175 : {
176 0 : autocorr_fx( signal_ana_fx + mem_len_ana + lg - LEN_WIN_SSS, 1, r_fx_h, r_fx_l, &Q_r, LEN_WIN_SSS, wind_sss_fx, 0, 0 );
177 :
178 :
179 0 : t1 = L_Comp( r_fx_h[1], r_fx_l[1] ); /* R[1] in Q31 */
180 0 : t2 = L_abs( t1 ); /* abs R[1] */
181 0 : t0 = L_deposit_l( 0 );
182 0 : IF( r_fx_h[0] != 0 )
183 : {
184 0 : t0 = Div_32( t2, r_fx_h[0], r_fx_l[0] ); /* R[1]/R[0] in Q31 */
185 : }
186 0 : if ( t1 < 0 )
187 : {
188 0 : t0 = L_negate( t0 ); /* R[1]/R[0] */
189 : }
190 :
191 :
192 0 : mu_preemph_fx = extract_h( t0 ); /*r_fx[1] / r_fx[0]; */
193 0 : mem_preemph_fx = signal_ana_fx[mem_len_ana + lg - LEN_WIN_SSS - 1];
194 0 : move16();
195 0 : PREEMPH_FX( signal_ana_fx + mem_len_ana + lg - LEN_WIN_SSS, mu_preemph_fx, LEN_WIN_SSS, &mem_preemph_fx );
196 :
197 :
198 : /* Autocorrelations */
199 0 : autocorr_fx( signal_ana_fx + mem_len_ana + lg - LEN_WIN_SSS, M, r_fx_h, r_fx_l, &Q_r,
200 : LEN_WIN_SSS, wind_sss_fx, 0, 0 );
201 :
202 : /* Lag windowing */
203 0 : lag_wind( r_fx_h, r_fx_l, M, fin, LAGW_STRONG );
204 :
205 : /* Levinson-Durbin */
206 0 : set16_fx( mem_lev_fx, 0, 18 );
207 0 : E_LPC_lev_dur( r_fx_h, r_fx_l, A_fx, LepsP, M, NULL );
208 :
209 0 : Copy_Scale_sig( A_fx, A_fx, M + 1, sub( norm_s( A_fx[0] ), 2 ) );
210 :
211 0 : FOR( i = 0; i < plus_sample_in; i++ )
212 : {
213 0 : sigPtr = signal_fx + add( lg, add( mem_len, i ) );
214 0 : L_tmp = syn_kern_16( 0, A_fx, sigPtr );
215 0 : L_tmp = L_shl_sat( L_tmp, 3 );
216 0 : *sigPtr = round_fx_sat( L_tmp ); /* AZ ringing padding */
217 0 : move16();
218 : }
219 0 : mem_preemph_fx = signal_fx[mem_len + lg - LEN_WIN_SSS - 1];
220 0 : move16();
221 0 : deemph_fx( signal_fx + mem_len + lg - LEN_WIN_SSS, mu_preemph_fx, LEN_WIN_SSS + plus_sample_in, &mem_preemph_fx );
222 : }
223 : /* interpolation */
224 :
225 302 : datastep = shr( div_s( shl( fac_den, 7 ), shl( fac_num, 10 ) ), 12 );
226 : /* equivalent to 'datastep = fac_den % fac_num' */
227 302 : temp_n = i_mult2( datastep, fac_num ); /*Q0*/
228 302 : fracstep = sub( fac_den, temp_n );
229 :
230 302 : sigIn_ptr = signal_fx + add( filt_len, plus_sample_in );
231 :
232 302 : filt_len_tmp = filt_len;
233 302 : move16();
234 302 : IF( flag_low_order )
235 : {
236 0 : filt_len_tmp = shr( add( filt_len, 1 ), 1 );
237 : }
238 :
239 302 : Word16 norm_cfg_ptr = norm_s( sub( cfg_ptr_fx->filter_fx[0], 1 ) );
240 308342 : FOR( i = 0; i < lg_out; i++ )
241 : {
242 308040 : sigOut_fx[i] = round_fx_sat( Interpol_lc_fx( sigIn_ptr, cfg_ptr_fx->filter_fx, frac, fac_num, filt_len_tmp ) );
243 308040 : move16();
244 308040 : frac = add( frac, fracstep );
245 :
246 308040 : j = sub( fac_num, frac );
247 308040 : if ( j < 0 )
248 : {
249 9966 : frac = sub( frac, fac_num );
250 : }
251 308040 : sigIn_ptr += add( lshr( j, 15 ), datastep );
252 : }
253 302 : *Q_new_inp = negate( norm_cfg_ptr );
254 302 : move16();
255 : /* rescaling */
256 302 : test();
257 :
258 302 : IF( EQ_32( ( GT_16( fac_num, fac_den ) ), ( ( cfg_ptr_fx->flags_fx & RS_INV_FAC ) != 0 ) ) )
259 : {
260 0 : IF( LT_16( fac_num, fac_den ) )
261 : {
262 0 : num_den = div_s( fac_num, fac_den ); /*Q15*/
263 0 : test();
264 0 : IF( GT_32( fin, 16000 ) && EQ_16( lg_out, 512 ) )
265 : {
266 :
267 0 : FOR( i = 0; i < lg_out; i++ )
268 : {
269 0 : sigOut_fx[i] = round_fx( L_shl( L_mult( sigOut_fx[i], num_den ), 1 ) ); /*Q0*/
270 0 : move16();
271 : }
272 0 : *Q_new_inp = add( *Q_new_inp, 1 );
273 0 : move16();
274 : }
275 : ELSE
276 : {
277 0 : test();
278 0 : test();
279 0 : test();
280 0 : IF( GT_32( fin, 16000 ) && ( EQ_16( lg_out, L_FRAME ) || EQ_16( lg_out, L_FRAME16k ) || EQ_16( lg_out, 512 ) ) )
281 : {
282 : #ifdef ISSUE_1836_replace_overflow_libcom
283 0 : num_den = shl_sat( num_den, 1 );
284 : #else
285 : num_den = shl_o( num_den, 1, &Overflow );
286 : #endif
287 0 : *Q_new_inp = add( *Q_new_inp, 1 );
288 0 : move16();
289 : }
290 0 : FOR( i = 0; i < lg_out; i++ )
291 : {
292 0 : sigOut_fx[i] = mult_r( sigOut_fx[i], num_den ); /*Q0*/
293 0 : move16();
294 : }
295 : }
296 : }
297 : ELSE
298 : {
299 0 : IF( EQ_16( fac_num, 8 ) )
300 : {
301 0 : num_den = 26214;
302 0 : move16();
303 0 : FOR( i = 0; i < lg_out; i++ )
304 : {
305 0 : sigOut_fx[i] = mult_r( sigOut_fx[i], num_den ); /*Q-1*/
306 0 : move16();
307 : }
308 : }
309 : ELSE
310 : {
311 0 : num_den = div_s( sub( fac_num, fac_den ), fac_den ); /*Q15*/
312 0 : FOR( i = 0; i < lg_out; i++ )
313 : {
314 0 : sigOut_fx[i] = round_fx( L_mac( L_deposit_h( sigOut_fx[i] ), sigOut_fx[i], num_den ) ); /*Q0*/
315 0 : move16();
316 : }
317 0 : *Q_new_inp = add( *Q_new_inp, 1 );
318 0 : move16();
319 : }
320 : }
321 : }
322 302 : ELSE IF( ( LT_16( fac_num, fac_den ) ) && ( ( cfg_ptr_fx->flags_fx & RS_INV_FAC ) != 0 ) )
323 : {
324 0 : FOR( i = 0; i < lg_out; i++ )
325 : {
326 0 : sigOut_fx[i] = mult_r( sigOut_fx[i], 16384 );
327 0 : move16(); /*Q-1*/
328 : }
329 : }
330 : /* update the filter memory */
331 302 : sigPtr = signal_fx + lg;
332 302 : Copy( sigPtr, mem_fx, mem_len );
333 :
334 302 : return lg_out;
335 : }
336 :
337 1300 : Word16 modify_Fs_fx( /* o : length of output Q0 */
338 : const Word16 sigIn_fx[], /* i : signal to decimate Q0 */
339 : Word16 lg, /* i : length of input Q0 */
340 : const Word32 fin, /* i : frequency of input Q0 */
341 : Word16 sigOut_fx[], /* o : decimated signal Q0 */
342 : const Word32 fout, /* i : frequency of output Q0 */
343 : Word16 mem_fx[], /* i/o: filter memory Q0 */
344 : const Word16 nblp /* i : flag indicating if NB low-pass is applied */
345 : )
346 : {
347 : Word16 i;
348 :
349 : Word16 lg_out, fac_num, fac_den, filt_len, frac, temp_n, mem_len;
350 : Word16 num_den;
351 : Word16 datastep, fracstep;
352 : Word16 *sigIn_ptr, *sigPtr;
353 : Word16 signal_tab_fx[3 * L_FILT_MAX + L_FRAME48k], *signal_fx, *signal_ana_fx; /* 3* as 2* for memory and 1* for future prediction */
354 : Word16 A_fx[M + 1], r_fx_h[M + 1], r_fx_l[M + 1];
355 : Word16 mem_len_ana;
356 : Word16 plus_sample_in;
357 : Word16 j;
358 : Word16 mu_preemph_fx;
359 : Word16 mem_preemph_fx;
360 : Word16 Q_r;
361 : Word16 mem_lev_fx[18];
362 : Word32 t0, t1, t2, L_tmp; /* temporary variables */
363 : Word32 LepsP[M + 1];
364 1300 : Word16 flag_low_order = 0;
365 1300 : move16();
366 : Word16 filt_len_tmp;
367 : #ifndef ISSUE_1836_replace_overflow_libcom
368 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
369 : Flag Overflow = 0;
370 : move32();
371 : #endif
372 : #endif
373 : const Resampling_cfg *cfg_ptr_fx;
374 :
375 : /*-------------------------------------------------------------------*
376 : * Find the resampling configuration
377 : *-------------------------------------------------------------------*/
378 :
379 : /* check if fin and fout are the same */
380 1300 : IF( EQ_32( fin, fout ) )
381 : {
382 : /* just copy the signal_fx and quit */
383 0 : Copy( sigIn_fx, sigOut_fx, lg );
384 :
385 0 : return lg;
386 : }
387 : ELSE
388 : {
389 : /* find the resampling configuration in the lookup table */
390 1300 : cfg_ptr_fx = &resampling_cfg_tbl[0];
391 7150 : WHILE( ( cfg_ptr_fx->fin_fx != 0 ) && !( EQ_32( cfg_ptr_fx->fin_fx, fin ) && EQ_32( cfg_ptr_fx->fout_fx, fout ) ) )
392 : {
393 5850 : test();
394 5850 : test();
395 5850 : cfg_ptr_fx++;
396 : }
397 :
398 :
399 : /* find config with NB 4kHz low-pass */
400 1300 : test();
401 1300 : test();
402 1300 : IF( nblp && ( GT_32( fin, 8000 ) ) && ( EQ_32( fout, 12800 ) ) )
403 : {
404 0 : flag_low_order = 1;
405 0 : move16();
406 0 : cfg_ptr_fx++;
407 0 : WHILE( ( cfg_ptr_fx->fin_fx != 0 ) && !( ( EQ_32( cfg_ptr_fx->fin_fx, fin ) ) && ( EQ_32( cfg_ptr_fx->fout_fx, fout ) ) ) )
408 : {
409 0 : test();
410 0 : test();
411 0 : cfg_ptr_fx++;
412 : }
413 : }
414 :
415 : /*-------------------------------------------------------------------*
416 : * Retrieve and/or calculate the resampling parameters
417 : *-------------------------------------------------------------------*/
418 1300 : fac_num = cfg_ptr_fx->fac_num_fx;
419 1300 : move16(); /*Q0*/
420 1300 : fac_den = cfg_ptr_fx->fac_den_fx;
421 1300 : move16();
422 :
423 1300 : IF( GE_16( lg, L_FRAME ) )
424 : {
425 1300 : lg_out = cfg_ptr_fx->lg_out;
426 1300 : move16();
427 : }
428 : ELSE
429 : {
430 0 : lg_out = idiv1616( i_mult2( lg, fac_num ), fac_den );
431 : }
432 1300 : filt_len = cfg_ptr_fx->filt_len_fx;
433 1300 : move16();
434 1300 : plus_sample_in = 0;
435 1300 : move16(); /*default, regular delay*/
436 1300 : frac = 0;
437 1300 : move16();
438 :
439 1300 : test();
440 1300 : IF( ( EQ_32( fin, 8000 ) ) && ( EQ_32( fout, 12800 ) ) )
441 : {
442 0 : plus_sample_in = 7;
443 0 : move16();
444 0 : frac = 4;
445 0 : move16();
446 : }
447 :
448 1300 : mem_len = shl( filt_len, 1 );
449 1300 : signal_fx = signal_tab_fx + 2 * L_FILT_MAX + sub( L_FRAME48k, add( mem_len, lg ) );
450 1300 : signal_ana_fx = signal_fx;
451 1300 : mem_len_ana = mem_len;
452 1300 : move16();
453 : }
454 :
455 :
456 : /*-------------------------------------------------------------------*
457 : * Resample
458 : *-------------------------------------------------------------------*/
459 : /* append filter memory */
460 1300 : Copy( mem_fx, signal_fx, mem_len );
461 :
462 1300 : sigPtr = signal_fx + mem_len;
463 1300 : Copy( sigIn_fx, sigPtr, lg );
464 :
465 1300 : IF( plus_sample_in > 0 )
466 : {
467 0 : autocorr_fx( signal_ana_fx + sub( add( mem_len_ana, lg ), LEN_WIN_SSS ), 1, r_fx_h, r_fx_l, &Q_r, LEN_WIN_SSS, wind_sss_fx, 0, 0 );
468 :
469 :
470 0 : t1 = L_Comp( r_fx_h[1], r_fx_l[1] ); /* R[1] in Q31 */
471 0 : t2 = L_abs( t1 ); /* abs R[1] */
472 0 : t0 = L_deposit_l( 0 );
473 0 : IF( r_fx_h[0] != 0 )
474 : {
475 0 : t0 = Div_32( t2, r_fx_h[0], r_fx_l[0] ); /* R[1]/R[0] in Q31 */
476 : }
477 0 : if ( t1 < 0 )
478 : {
479 0 : t0 = L_negate( t0 ); /* R[1]/R[0] */
480 : }
481 :
482 :
483 0 : mu_preemph_fx = extract_h( t0 ); /*r_fx[1] / r_fx[0]; */
484 0 : mem_preemph_fx = signal_ana_fx[mem_len_ana + lg - LEN_WIN_SSS - 1];
485 0 : move16();
486 0 : PREEMPH_FX( signal_ana_fx + sub( add( mem_len_ana, lg ), LEN_WIN_SSS ), mu_preemph_fx, LEN_WIN_SSS, &mem_preemph_fx );
487 :
488 :
489 : /* Autocorrelations */
490 0 : autocorr_fx( signal_ana_fx + sub( add( mem_len_ana, lg ), LEN_WIN_SSS ), M, r_fx_h, r_fx_l, &Q_r,
491 : LEN_WIN_SSS, wind_sss_fx, 0, 0 );
492 :
493 : /* Lag windowing */
494 0 : lag_wind( r_fx_h, r_fx_l, M, fin, LAGW_STRONG );
495 :
496 : /* Levinson-Durbin */
497 0 : set16_fx( mem_lev_fx, 0, 18 );
498 0 : E_LPC_lev_dur( r_fx_h, r_fx_l, A_fx, LepsP, M, NULL );
499 :
500 0 : Copy_Scale_sig( A_fx, A_fx, M + 1, sub( norm_s( A_fx[0] ), 2 ) );
501 :
502 0 : FOR( i = 0; i < plus_sample_in; i++ )
503 : {
504 0 : sigPtr = signal_fx + add( add( lg, mem_len ), i );
505 0 : move16(); /*+i*/
506 0 : L_tmp = syn_kern_16( 0, A_fx, sigPtr );
507 0 : L_tmp = L_shl_sat( L_tmp, 3 );
508 0 : *sigPtr = round_fx_sat( L_tmp ); /* AZ ringing padding */
509 : }
510 0 : mem_preemph_fx = signal_fx[mem_len + lg - LEN_WIN_SSS - 1];
511 0 : move16();
512 0 : deemph_fx( signal_fx + sub( add( mem_len, lg ), LEN_WIN_SSS ), mu_preemph_fx, add( LEN_WIN_SSS, plus_sample_in ), &mem_preemph_fx );
513 : }
514 : /* interpolation */
515 :
516 1300 : datastep = shr( div_s( shl( fac_den, 8 ), shl( fac_num, 11 ) ), 12 );
517 : /* equivalent to 'datastep = fac_den % fac_num' */
518 1300 : temp_n = i_mult2( datastep, fac_num ); /*Q0*/
519 1300 : fracstep = sub( fac_den, temp_n );
520 :
521 1300 : sigIn_ptr = signal_fx + add( filt_len, plus_sample_in );
522 :
523 1300 : filt_len_tmp = filt_len;
524 1300 : move16();
525 1300 : IF( flag_low_order )
526 : {
527 0 : filt_len_tmp = shr( add( filt_len, 1 ), 1 );
528 : }
529 :
530 375700 : FOR( i = 0; i < lg_out; i++ )
531 : {
532 374400 : sigOut_fx[i] = round_fx_sat( Interpol_lc_fx( sigIn_ptr, cfg_ptr_fx->filter_fx, frac, fac_num, filt_len_tmp ) );
533 374400 : move16();
534 374400 : frac = add( frac, fracstep );
535 :
536 374400 : j = sub( fac_num, frac );
537 374400 : if ( j < 0 )
538 : {
539 206700 : frac = sub( frac, fac_num );
540 : }
541 374400 : sigIn_ptr += add( lshr( j, 15 ), datastep );
542 : }
543 : /* rescaling */
544 1300 : test();
545 :
546 1300 : IF( EQ_32( ( GT_16( fac_num, fac_den ) ), ( ( cfg_ptr_fx->flags_fx & RS_INV_FAC ) != 0 ) ) )
547 : {
548 650 : IF( LT_16( fac_num, fac_den ) )
549 : {
550 650 : num_den = div_s( fac_num, fac_den ); /*Q15*/
551 650 : test();
552 650 : IF( GT_32( fin, 16000 ) && EQ_16( lg_out, 512 ) )
553 : {
554 :
555 0 : FOR( i = 0; i < lg_out; i++ )
556 : {
557 0 : sigOut_fx[i] = round_fx( L_shl( L_mult( sigOut_fx[i], num_den ), 1 ) ); /*Q0*/
558 : }
559 : }
560 : ELSE
561 : {
562 650 : test();
563 650 : test();
564 650 : test();
565 650 : if ( GT_32( fin, 16000 ) && ( EQ_16( lg_out, L_FRAME ) || EQ_16( lg_out, L_FRAME16k ) || EQ_16( lg_out, 512 ) ) )
566 : {
567 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
568 : #ifdef ISSUE_1836_replace_overflow_libcom
569 0 : num_den = shl_sat( num_den, 1 );
570 : #else
571 : num_den = shl_o( num_den, 1, &Overflow );
572 : #endif
573 : #else
574 : num_den = shl( num_den, 1 );
575 : #endif
576 : }
577 167050 : FOR( i = 0; i < lg_out; i++ )
578 : {
579 166400 : sigOut_fx[i] = mult_r( sigOut_fx[i], num_den ); /*Q0*/
580 166400 : move16();
581 : }
582 : }
583 : }
584 : ELSE
585 : {
586 0 : IF( EQ_16( fac_num, 8 ) )
587 : {
588 0 : num_den = 26214;
589 0 : FOR( i = 0; i < lg_out; i++ )
590 : {
591 0 : sigOut_fx[i] = mult_r( sigOut_fx[i], num_den ); /*Q-1*/
592 0 : move16();
593 : }
594 : }
595 : ELSE
596 : {
597 0 : num_den = div_s( sub( fac_num, fac_den ), fac_den ); /*Q15*/
598 0 : FOR( i = 0; i < lg_out; i++ )
599 : {
600 0 : sigOut_fx[i] = round_fx( L_mac( L_deposit_h( sigOut_fx[i] ), sigOut_fx[i], num_den ) ); /*Q0*/
601 : }
602 : }
603 : }
604 : }
605 650 : ELSE IF( ( LT_16( fac_num, fac_den ) ) && ( ( cfg_ptr_fx->flags_fx & RS_INV_FAC ) != 0 ) )
606 : {
607 0 : FOR( i = 0; i < lg_out; i++ )
608 : {
609 0 : sigOut_fx[i] = mult_r( sigOut_fx[i], 16384 );
610 0 : move16(); /*Q-1*/
611 : }
612 : }
613 : /* update the filter memory */
614 1300 : sigPtr = signal_fx + lg;
615 1300 : Copy( sigPtr, mem_fx, mem_len );
616 :
617 1300 : return lg_out;
618 : }
619 :
620 : /*-------------------------------------------------------------------*
621 : * modify_Fs_intcub3m_sup()
622 : *
623 : *
624 : *-------------------------------------------------------------------*/
625 :
626 25 : Word16 modify_Fs_intcub3m_sup_fx( /* o : length of output */
627 : const Word16 sigIn[], /* i : signal to decimate with memory of 2 samples (indexes -2 & -1) */
628 : const Word16 lg, /* i : length of input (suppose that lg is such that lg_out is integer, ex multiple of 5 in case of 16kHz to 12.8 kHz) */
629 : const Word32 fin, /* i : frequency of input */
630 : Word16 sigOut[], /* o : decimated signal */
631 : const Word32 fout, /* i : frequency of output */
632 : Word16 *delayout /* o : delay of output */
633 : )
634 : {
635 : Word16 i, k, i1, i2, k1, k2, k3, kk, cind;
636 : Word16 lg_out, fk1, k2d, k3d;
637 : Word16 cc[4][4];
638 25 : const Word16( *cu )[3] = 0;
639 : Word16 *sigin_sr, *sigOutptr, *cptr;
640 : const Word16 *uptr, *ctptr;
641 : Word16 *sigin_sr_tab;
642 : Word16 lim, inc, lim2, lim3;
643 : Word32 vv32;
644 : #define QSR 2 /* right shift to avoid overflow, 2 is OK */
645 :
646 25 : k = 0;
647 25 : move16(); /* to avoid compilation warnings */
648 25 : inc = 0;
649 25 : move16(); /* to avoid compilation warnings */
650 :
651 : /*-------------------------------------------------------------------*
652 : * Find the resampling configuration
653 : *-------------------------------------------------------------------*/
654 :
655 : /* check if fin and fout are the same */
656 25 : IF( EQ_32( fin, fout ) )
657 : {
658 : /* just copy the signal_fx and quit */
659 0 : Copy( sigIn, sigOut, lg );
660 0 : *delayout = 0;
661 0 : move16();
662 :
663 0 : return lg;
664 : }
665 : ELSE
666 : {
667 25 : sigin_sr_tab = (Word16 *) calloc( lg + 2, sizeof( *sigin_sr ) ); /*shift right*/
668 25 : sigin_sr = sigin_sr_tab + 2;
669 555 : FOR( i = -2; i < lg; i++ )
670 : {
671 530 : sigin_sr[i] = shr( sigIn[i], QSR );
672 530 : move16(); /* shift right : Q0 -> Q(-QSR) */
673 : }
674 :
675 : /* length of the interpolated signal */
676 : /*lg_out = (short)(lg * fout / fin); */
677 :
678 : /* cc[x][3]*s*s*s + cc[x][2]*s*s + cc[x][1]*s + cc[x][0]; indexes relatives of s : -1 0 1 2 */
679 : /* d : cc[x][0] = s[0] */
680 : /* b : cc[x][2] =(s[-1]+s[1])/2-s[0] */
681 : /* a : cc[x][3] = (s[-1]+s[2]-s[0]-s[1]-4*cc[x][2]) / 6 */
682 : /* c : cc[x][1] = s[1]-s[0]-cc[x][3]-cc[x][2] */
683 :
684 : /* coef inits using memory (indexes < 0) */
685 : /* cc[2][] : indexes -2 -1 0 1 */
686 25 : cptr = &( cc[2][0] );
687 25 : cptr[0] = mult_r( sigin_sr[-1], 10923 );
688 25 : move16(); /* sigIn[-1]/3 */
689 25 : cptr[2] = sub( shr( add( sigin_sr[-2], sigin_sr[0] ), 1 ), sigin_sr[-1] );
690 25 : move16(); /* (sigIn[-2]+sigIn[0])/2-sigIn[-1]; */
691 25 : cptr[3] = sub( mult_r( sub( add( sigin_sr[-2], sigin_sr[1] ), add( sigin_sr[-1], sigin_sr[0] ) ), 5461 ), mult_r( cptr[2], 21845 ) );
692 25 : move16(); /*(sigIn[-2]+sigIn[1]-sigIn[-1]-sigIn[0]) / 6 - 4/6*cc[2][2]);*/
693 25 : cptr[1] = sub( sub( sigin_sr[0], sigin_sr[-1] ), add( cptr[3], cptr[2] ) );
694 25 : move16();
695 :
696 : /* cc[3][] : indexes -1 0 1 2 */
697 25 : cptr = &( cc[3][0] );
698 25 : cptr[0] = mult_r( sigin_sr[0], 10923 );
699 25 : move16(); /* sigIn[-1]/3 */
700 25 : cptr[2] = sub( shr( add( sigin_sr[-1], sigin_sr[1] ), 1 ), sigin_sr[0] );
701 25 : move16(); /* (sigIn[-1]+sigIn[1])/2-sigIn[0]; */
702 25 : cptr[3] = sub( mult_r( sub( add( sigin_sr[-1], sigin_sr[2] ), add( sigin_sr[0], sigin_sr[1] ) ), 5461 ), mult_r( cptr[2], 21845 ) );
703 25 : move16(); /*(sigIn[-2]+sigIn[1]-sigIn[-1]-sigIn[0]) / 6 - 4/6*cc[2][2]);*/
704 25 : cptr[1] = sub( sub( sigin_sr[1], sigin_sr[0] ), add( cptr[3], cptr[2] ) );
705 25 : move16();
706 :
707 25 : sigOutptr = sigOut;
708 25 : cind = -1;
709 25 : move16();
710 25 : move16(); /* for the move */
711 25 : IF( EQ_32( fin, 12800 ) )
712 : {
713 5 : if ( EQ_32( fout, 8000 ) )
714 : {
715 0 : cind = 0;
716 0 : move16();
717 : }
718 5 : if ( EQ_32( fout, 16000 ) )
719 : {
720 0 : cind = 1;
721 0 : move16();
722 : }
723 5 : if ( EQ_32( fout, 32000 ) )
724 : {
725 5 : cind = 2;
726 5 : move16();
727 : }
728 5 : if ( EQ_32( fout, 48000 ) )
729 : {
730 0 : cind = 3;
731 0 : move16();
732 : }
733 : }
734 25 : IF( EQ_32( fin, 16000 ) )
735 : {
736 20 : if ( EQ_32( fout, 12800 ) )
737 : {
738 0 : cind = 4;
739 0 : move16();
740 : }
741 20 : if ( EQ_32( fout, 32000 ) )
742 : {
743 0 : cind = 5;
744 0 : move16();
745 : }
746 20 : if ( EQ_32( fout, 48000 ) )
747 : {
748 20 : cind = 6;
749 20 : move16();
750 : }
751 : }
752 25 : ctptr = &( ct2_fx[cind][0] );
753 25 : lg_out = mult_r( shl( lg, 2 ), ctptr[13] );
754 25 : *delayout = ctptr[9];
755 25 : move16();
756 :
757 25 : if ( EQ_16( ctptr[12], 15 ) )
758 : {
759 25 : cu = cu15_fx;
760 25 : move16(); /*pointer*/
761 : }
762 :
763 25 : if ( EQ_16( ctptr[12], 4 ) )
764 : {
765 0 : cu = cu4_fx;
766 0 : move16(); /*pointer*/
767 : }
768 :
769 25 : k2d = sub( ctptr[12], 1 ); /* shift of index in cu with respect to the next sample (ex 1.25 -> 0.25 ) */
770 25 : fk1 = shl( k2d, 1 );
771 25 : k3d = sub( fk1, 1 ); /* to compurte index in cu with respect to the last sample with - sign (ex 1.25 -> -0.75 ) */
772 :
773 25 : kk = 0;
774 25 : move16();
775 25 : i = 0;
776 25 : move16();
777 :
778 25 : lim = sub( lg, ctptr[11] );
779 25 : lim2 = sub( lg, 3 );
780 25 : lim3 = ctptr[10];
781 25 : move16();
782 400 : WHILE( LT_16( i, lim2 ) )
783 : {
784 375 : if ( GE_16( i, lim ) )
785 : {
786 25 : lim3 = sub( ctptr[11], 3 ); /* last, incomplete period*/
787 : }
788 375 : *sigOutptr++ = sigIn[i];
789 375 : move16();
790 780 : FOR( k = 0; k < lim3; k++ )
791 : {
792 405 : cptr = &( cc[kk][0] );
793 405 : cptr[0] = mult_r( sigin_sr[i + 1], 10923 );
794 405 : move16(); /* sigIn[-1]/3 */
795 405 : cptr[2] = sub( shr( add( sigin_sr[i], sigin_sr[i + 2] ), 1 ), sigin_sr[i + 1] );
796 405 : move16(); /* (sigIn[-1]+sigIn[1])/2-sigIn[0]; */
797 405 : cptr[3] = sub( mult_r( sub( add( sigin_sr[i], sigin_sr[i + 3] ), add( sigin_sr[i + 1], sigin_sr[i + 2] ) ), 5461 ), mult_r( cptr[2], 21845 ) );
798 405 : move16(); /*(sigIn[-1]+sigIn[1]-sigIn[0]-sigIn[1]) / 6 - 4/6*cc[3][2]);*/
799 405 : cptr[1] = sub( sub( sigin_sr[i + 2], sigin_sr[i + 1] ), add( cptr[3], cptr[2] ) );
800 405 : move16();
801 405 : i = add( i, 1 );
802 :
803 405 : i2 = sub( kk, 2 );
804 405 : i1 = sub( kk, 1 );
805 405 : if ( i1 < 0 )
806 : {
807 120 : i1 = add( i1, 4 );
808 : }
809 :
810 405 : if ( i2 < 0 )
811 : {
812 215 : i2 = add( i2, 4 );
813 : }
814 405 : inc = ctptr[8];
815 405 : move16();
816 1215 : FOR( k1 = ctptr[k]; k1 < fk1; k1 += inc )
817 : {
818 810 : k2 = sub( k1, k2d );
819 810 : k3 = sub( k3d, k1 );
820 810 : cptr = &( cc[i2][0] );
821 810 : uptr = &( cu[k1][0] );
822 810 : vv32 = L_mult( 8192, *cptr++ );
823 810 : vv32 = L_mac( vv32, *uptr++, *cptr++ );
824 810 : vv32 = L_mac( vv32, *uptr++, *cptr++ );
825 810 : vv32 = L_mac( vv32, *uptr++, *cptr++ ); /* Q13*Q(-QSR) -> Q(13-QSR+1) 32 bits*/
826 810 : cptr = &( cc[i1][0] );
827 810 : uptr = &( cu[k2][0] );
828 810 : vv32 = L_mac( vv32, 8192, *cptr++ );
829 810 : vv32 = L_mac( vv32, *uptr++, *cptr++ );
830 810 : vv32 = L_mac( vv32, *uptr++, *cptr++ );
831 810 : vv32 = L_mac( vv32, *uptr++, *cptr++ );
832 810 : cptr = &( cc[kk][0] );
833 810 : uptr = &( cu[k3][0] );
834 810 : vv32 = L_mac( vv32, 8192, *cptr++ );
835 810 : vv32 = L_msu( vv32, *uptr++, *cptr++ );
836 810 : vv32 = L_mac( vv32, *uptr++, *cptr++ );
837 810 : vv32 = L_msu( vv32, *uptr++, *cptr++ );
838 810 : vv32 = L_shl( vv32, ( QSR + 2 ) ); /* Q(13-QSR+1) -> Q16 */
839 810 : *sigOutptr++ = round_fx( vv32 ); /* Q16 -> Q0*/
840 : }
841 :
842 405 : kk = add( kk, 1 );
843 405 : if ( EQ_16( kk, 4 ) )
844 : {
845 95 : kk = 0;
846 95 : move16();
847 : }
848 : }
849 : }
850 :
851 :
852 25 : kk = sub( kk, 1 );
853 25 : if ( kk < 0 )
854 : {
855 0 : kk = 3;
856 0 : move16();
857 : }
858 :
859 25 : if ( EQ_16( ctptr[10], 1 ) )
860 : {
861 20 : *sigOutptr++ = sigIn[i];
862 20 : move16();
863 : }
864 :
865 75 : FOR( k1 = ctptr[k]; k1 < fk1; k1 += inc )
866 : {
867 50 : k2 = sub( k1, k2d );
868 :
869 50 : cptr = &( cc[kk][0] );
870 50 : uptr = &( cu[k2][0] );
871 50 : vv32 = L_mult( 8192, *cptr++ );
872 50 : vv32 = L_mac( vv32, *uptr++, *cptr++ );
873 50 : vv32 = L_mac( vv32, *uptr++, *cptr++ );
874 50 : vv32 = L_mac( vv32, *uptr++, *cptr++ ); /* Q13*Q(-QSR) -> Q(13-QSR+1) 32 bits*/
875 50 : vv32 = L_shl( vv32, ( QSR + 2 ) ); /* Q(13-QSR+1) -> Q16 */
876 50 : *sigOutptr++ = i_mult( round_fx( vv32 ), 3 );
877 50 : move16(); /* Q16 -> Q0*/
878 : }
879 :
880 25 : if ( LT_16( ctptr[10], 3 ) )
881 : {
882 25 : *sigOutptr++ = sigIn[i + 1];
883 25 : move16();
884 : }
885 :
886 75 : FOR( k1 = ctptr[k + 1]; k1 < fk1; k1 += inc )
887 : {
888 50 : cptr = &( cc[kk][0] );
889 50 : uptr = &( cu[k1][0] );
890 50 : vv32 = L_mult( 8192, *cptr++ );
891 50 : vv32 = L_mac( vv32, *uptr++, *cptr++ );
892 50 : vv32 = L_mac( vv32, *uptr++, *cptr++ );
893 50 : vv32 = L_mac( vv32, *uptr++, *cptr++ ); /* Q13*Q(-QSR) -> Q(13-QSR+1) 32 bits*/
894 50 : vv32 = L_shl( vv32, ( QSR + 2 ) ); /* Q(13-QSR+1) -> Q16 */
895 50 : *sigOutptr++ = i_mult( round_fx( vv32 ), 3 );
896 50 : move16(); /* Q16 -> Q0*/
897 : }
898 :
899 25 : if ( EQ_16( ctptr[10], 1 ) )
900 : {
901 20 : *sigOutptr = sigIn[i + 2];
902 20 : move16();
903 : }
904 : }
905 :
906 25 : free( sigin_sr_tab );
907 :
908 25 : return lg_out;
909 : }
910 :
911 : /*====================================================================*/
912 : /* FUNCTION : Decimate_allpass_steep_fx1 () */
913 : /*-------------------------------------------------------------------*/
914 : /* PURPOSE : decimation by a factor 2 */
915 : /*-------------------------------------------------------------------*/
916 : /* INPUT ARGUMENTS : */
917 : /* _ (const Word16 *) in_fx : input speech, Q0 */
918 : /* _ (Word16 []) mem: Stateinfo, Q0 */
919 : /* Size: 2*ALLPASSSECTIONS_STEEP+1 */
920 : /* _ (Word16) N: Number of Input samples */
921 : /* _ (Word16 []) out_fx :Output arry of size N/2 Q0 */
922 : /*-------------------------------------------------------------------*/
923 : /* OUTPUT ARGUMENTS : */
924 : /* _ (Word16 []) out_fx : output-signal, Q0 */
925 : /* _ (Word16 []) mem:gets updated, Q0 */
926 : /*-------------------------------------------------------------------*/
927 : /* INPUT/OUTPUT ARGUMENTS : */
928 : /*-------------------------------------------------------------------*/
929 : /* RETURN ARGUMENTS : _ None. */
930 : /*===================================================================*/
931 :
932 126841 : void Decimate_allpass_steep_fx(
933 : const Word16 *in_fx,
934 : Word16 mem[], /* array of size: 2*ALLPASSSECTIONS_STEEP+1 */
935 : Word16 N, /* number of input samples */
936 : Word16 out_fx[] ) /* array of size N/2 */
937 : {
938 :
939 : Word16 k;
940 : Word16 temp[ALLPASSSECTIONS_STEEP];
941 : Word32 Lacc, Lacc1;
942 : Word16 temp1, temp2;
943 126841 : Word16 sum = 0;
944 : #ifndef ISSUE_1836_replace_overflow_libcom
945 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
946 : Flag Overflow = 0;
947 : move32();
948 : #endif
949 : #endif
950 126841 : move16();
951 :
952 : /*upper allpass filter chain */
953 :
954 :
955 37952361 : FOR( k = 0; k < N / 2; k++ )
956 : {
957 :
958 37825520 : Lacc = L_deposit_h( mem[0] ); /* Q(16+x) */
959 : #ifdef ISSUE_1836_replace_overflow_libcom
960 37825520 : Lacc = L_mac_sat( Lacc, AP1_STEEP_FX[0], in_fx[2 * k] ); /* Q(16+x) */
961 37825520 : Lacc1 = L_deposit_h( in_fx[2 * k] ); /* Q16+Qx */
962 37825520 : temp1 = extract_h( Lacc ); /* Qx */
963 37825520 : Lacc1 = L_msu_sat( Lacc1, AP1_STEEP_FX[0], temp1 ); /* Q16+Qx */
964 : #else
965 : Lacc = L_mac_o( Lacc, AP1_STEEP_FX[0], in_fx[2 * k], &Overflow ); /* Q(16+x) */
966 : Lacc1 = L_deposit_h( in_fx[2 * k] ); /* Q16+Qx */
967 : temp1 = extract_h( Lacc ); /* Qx */
968 : Lacc1 = L_msu_o( Lacc1, AP1_STEEP_FX[0], temp1, &Overflow ); /* Q16+Qx */
969 : #endif
970 37825520 : mem[0] = extract_h( Lacc1 ); /* Qx */
971 37825520 : temp[0] = temp1;
972 37825520 : move16();
973 37825520 : move16();
974 :
975 37825520 : Lacc1 = L_deposit_h( mem[1] ); /* Q16+Qx */
976 : #ifdef ISSUE_1836_replace_overflow_libcom
977 37825520 : Lacc1 = ( L_mac_sat( Lacc1, AP1_STEEP_FX[1], temp1 ) ); /* Q16+Qx */
978 :
979 37825520 : temp2 = extract_h( Lacc1 ); /* Qx */
980 37825520 : Lacc = L_msu_sat( Lacc, AP1_STEEP_FX[1], temp2 ); /* Q16+Qx */
981 : #else
982 : Lacc1 = ( L_mac_o( Lacc1, AP1_STEEP_FX[1], temp1, &Overflow ) ); /* Q16+Qx */
983 :
984 : temp2 = extract_h( Lacc1 ); /* Qx */
985 : Lacc = L_msu_o( Lacc, AP1_STEEP_FX[1], temp2, &Overflow ); /* Q16+Qx */
986 : #endif
987 37825520 : mem[1] = extract_h( Lacc ); /* Qx */
988 37825520 : temp[1] = temp2;
989 37825520 : move16();
990 37825520 : move16();
991 :
992 :
993 37825520 : Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */
994 : #ifdef ISSUE_1836_replace_overflow_libcom
995 37825520 : out_fx[k] = extract_h( L_mac_sat( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2 ) ); /* Qx format */
996 37825520 : move16();
997 37825520 : mem[ALLPASSSECTIONS_STEEP - 1] = extract_h( L_msu_sat( Lacc1, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[k] ) ); /* Qx */
998 37825520 : move16();
999 : #else
1000 : out_fx[k] = extract_h( L_mac_o( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ) ); /* Qx format */
1001 : move16();
1002 : mem[ALLPASSSECTIONS_STEEP - 1] = extract_h( L_msu_o( Lacc1, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[k], &Overflow ) ); /* Qx */
1003 : move16();
1004 : #endif
1005 : }
1006 :
1007 : /* lower allpass filter chain */
1008 :
1009 126841 : Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP] ); /* Q(16+x) */
1010 : #ifdef ISSUE_1836_replace_overflow_libcom
1011 126841 : Lacc = L_mac_sat( Lacc, AP2_STEEP_FX[0], mem[2 * ALLPASSSECTIONS_STEEP] ); /* Q(16+x) */
1012 126841 : Lacc1 = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP] ); /* Q(16+x) */
1013 126841 : temp1 = extract_h( Lacc ); /* Qx */
1014 126841 : Lacc1 = L_msu_sat( Lacc1, AP2_STEEP_FX[0], temp1 ); /* Q(16+x) */
1015 : #else
1016 : Lacc = L_mac_o( Lacc, AP2_STEEP_FX[0], mem[2 * ALLPASSSECTIONS_STEEP], &Overflow ); /*Q(16+x) */
1017 : Lacc1 = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP] ); /* Q(16+x) */
1018 : temp1 = extract_h( Lacc ); /* Qx */
1019 : Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[0], temp1, &Overflow ); /* Q(16+x) */
1020 : #endif
1021 126841 : mem[ALLPASSSECTIONS_STEEP] = extract_h( Lacc1 );
1022 126841 : temp[0] = temp1;
1023 126841 : move16();
1024 :
1025 126841 : Lacc1 = L_deposit_h( mem[ALLPASSSECTIONS_STEEP + 1] ); /* Q(16+x) */
1026 : #ifdef ISSUE_1836_replace_overflow_libcom
1027 126841 : Lacc1 = L_mac_sat( Lacc1, AP2_STEEP_FX[1], temp1 ); /* Q(16+x) */
1028 126841 : temp2 = extract_h( Lacc1 ); /* Qx */
1029 126841 : temp[1] = temp2;
1030 126841 : move16();
1031 126841 : Lacc = L_msu_sat( Lacc, AP2_STEEP_FX[1], temp2 ); /* Q(16+x) */
1032 : #else
1033 : Lacc1 = L_mac_o( Lacc1, AP2_STEEP_FX[1], temp1, &Overflow ); /* Q(16+x) */
1034 : temp2 = extract_h( Lacc1 ); /* Qx */
1035 : temp[1] = temp2;
1036 : move16();
1037 : Lacc = L_msu_o( Lacc, AP2_STEEP_FX[1], temp2, &Overflow ); /* Q(16+x) */
1038 : #endif
1039 126841 : mem[ALLPASSSECTIONS_STEEP + 1] = extract_h( Lacc ); /* Qx */
1040 126841 : move16();
1041 :
1042 126841 : Lacc = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */
1043 : #ifdef ISSUE_1836_replace_overflow_libcom
1044 126841 : Lacc = L_mac_sat( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2 ); /* Q(16+x) temp[ALLPASSSECTIONS_STEEP-1] */
1045 126841 : temp[2] = extract_h( Lacc ); /* temp[2] in Qx */
1046 126841 : move16();
1047 126841 : Lacc1 = L_msu_sat( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp[2] ); /* Q(16+x) */
1048 : #else
1049 : Lacc = L_mac_o( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ); /* Q(16+x) temp[ALLPASSSECTIONS_STEEP-1] */
1050 : temp[2] = extract_h( Lacc ); /* temp[2] in Qx */
1051 : move16();
1052 : Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp[2], &Overflow ); /* Q(16+x) */
1053 : #endif
1054 126841 : mem[2 * ALLPASSSECTIONS_STEEP - 1] = extract_h( Lacc1 ); /* Qx */
1055 126841 : move16();
1056 126841 : sum = mult_r( out_fx[0], 16384 ); /* Qx */
1057 126841 : out_fx[0] = add_sat( sum, mult_r( temp[ALLPASSSECTIONS_STEEP - 1], 16384 ) ); /* Qx */
1058 126841 : move16();
1059 :
1060 :
1061 37825520 : FOR( k = 1; k < N / 2; k++ )
1062 : {
1063 :
1064 :
1065 37698679 : Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP] ); /* Q(16+x) */
1066 : #ifdef ISSUE_1836_replace_overflow_libcom
1067 37698679 : Lacc = L_mac_sat( Lacc, AP2_STEEP_FX[0], in_fx[2 * k - 1] ); /* Q(16+x):temp[0] */
1068 37698679 : Lacc1 = L_deposit_h( in_fx[2 * k - 1] ); /* Q(16+x) */
1069 37698679 : temp1 = extract_h( Lacc ); /* Qx */
1070 37698679 : Lacc1 = L_msu_sat( Lacc1, AP2_STEEP_FX[0], temp1 ); /* Q(16+x) */
1071 : #else
1072 : Lacc = L_mac_o( Lacc, AP2_STEEP_FX[0], in_fx[2 * k - 1], &Overflow ); /* Q(16+x):temp[0] */
1073 : Lacc1 = L_deposit_h( in_fx[2 * k - 1] ); /* Q(16+x) */
1074 : temp1 = extract_h( Lacc ); /* Qx */
1075 : Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[0], temp1, &Overflow ); /* Q(16+x) */
1076 : #endif
1077 :
1078 37698679 : mem[ALLPASSSECTIONS_STEEP] = extract_h( Lacc1 ); /* Qx */
1079 37698679 : move16();
1080 37698679 : temp[0] = temp1;
1081 37698679 : move16();
1082 :
1083 :
1084 37698679 : Lacc1 = L_deposit_h( mem[ALLPASSSECTIONS_STEEP + 1] ); /* Q(16+x) */
1085 : #ifdef ISSUE_1836_replace_overflow_libcom
1086 37698679 : Lacc1 = L_mac_sat( Lacc1, AP2_STEEP_FX[1], temp1 ); /* Q(16+x) */
1087 37698679 : temp2 = extract_h( Lacc1 ); /* Qx */
1088 37698679 : temp[1] = temp2;
1089 37698679 : move16();
1090 37698679 : Lacc = L_msu_sat( Lacc, AP2_STEEP_FX[1], temp2 ); /* Q(16+x) */
1091 37698679 : mem[ALLPASSSECTIONS_STEEP + 1] = extract_h( Lacc ); /* Qx */
1092 :
1093 :
1094 37698679 : Lacc = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */
1095 37698679 : Lacc = L_mac_sat( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp[1] ); /* Q(16+x) temp[ALLPASSSECTIONS_STEEP-1] */
1096 37698679 : temp[2] = extract_h( Lacc ); /*temp[2] in Qx */
1097 37698679 : Lacc1 = L_msu_sat( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp[2] ); /* Q(16+x) */
1098 : #else
1099 : Lacc1 = L_mac_o( Lacc1, AP2_STEEP_FX[1], temp1, &Overflow ); /* Q(16+x) */
1100 : temp2 = extract_h( Lacc1 ); /* Qx */
1101 : temp[1] = temp2;
1102 : move16();
1103 : Lacc = L_msu_o( Lacc, AP2_STEEP_FX[1], temp2, &Overflow ); /* Q(16+x) */
1104 : mem[ALLPASSSECTIONS_STEEP + 1] = extract_h( Lacc ); /* Qx */
1105 :
1106 :
1107 : Lacc = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */
1108 : Lacc = L_mac_o( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp[1], &Overflow ); /* Q(16+x) temp[ALLPASSSECTIONS_STEEP-1] */
1109 : temp[2] = extract_h( Lacc ); /*temp[2] in Qx */
1110 : Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp[2], &Overflow ); /* Q(16+x) */
1111 : #endif
1112 37698679 : mem[2 * ALLPASSSECTIONS_STEEP - 1] = extract_h( Lacc1 ); /* Qx */
1113 :
1114 :
1115 37698679 : sum = mult_r( out_fx[k], 16384 ); /* Qx */
1116 37698679 : out_fx[k] = add_sat( sum, mult_r( temp[ALLPASSSECTIONS_STEEP - 1], 16384 ) );
1117 37698679 : move16();
1118 37698679 : move16(); /* Qx */
1119 : }
1120 :
1121 : /* z^(-1) */
1122 :
1123 126841 : mem[2 * ALLPASSSECTIONS_STEEP] = in_fx[N - 1];
1124 126841 : move16(); /* Qx */
1125 126841 : }
1126 :
1127 : /* IVAS 32-bit variant */
1128 4484 : void Decimate_allpass_steep_fx32(
1129 : const Word32 *in, /* i : input array of size N Qx */
1130 : Word32 *mem, /* i/o: memory Qx */
1131 : const Word16 N, /* i : number of input samples */
1132 : Word32 *out /* o : output array of size N/2 Qx */
1133 : )
1134 : {
1135 : Word16 n, k;
1136 : Word32 temp[ALLPASSSECTIONS_STEEP];
1137 :
1138 : /* upper allpass filter chain */
1139 1439364 : FOR( k = 0; k < N / 2; k++ )
1140 : {
1141 1434880 : temp[0] = Madd_32_16( mem[0], in[2 * k], AP1_STEEP_FX[0] ); // Qx
1142 1434880 : move32();
1143 1434880 : mem[0] = Msub_32_16( in[2 * k], temp[0], AP1_STEEP_FX[0] ); // Qx
1144 1434880 : move32();
1145 :
1146 1434880 : temp[1] = Madd_32_16( mem[1], temp[0], AP1_STEEP_FX[1] ); // Qx
1147 1434880 : move32();
1148 1434880 : mem[1] = Msub_32_16( temp[0], temp[1], AP1_STEEP_FX[1] ); // Qx
1149 1434880 : move32();
1150 :
1151 1434880 : out[k] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP - 1], temp[ALLPASSSECTIONS_STEEP - 2], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx
1152 1434880 : move32();
1153 1434880 : mem[ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], out[k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx
1154 1434880 : move32();
1155 : }
1156 :
1157 : /* lower allpass filter chain */
1158 4484 : temp[0] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP], mem[2 * ALLPASSSECTIONS_STEEP], AP2_STEEP_FX[0] ); // Qx
1159 4484 : move32();
1160 4484 : mem[ALLPASSSECTIONS_STEEP] = Msub_32_16( mem[2 * ALLPASSSECTIONS_STEEP], temp[0], AP2_STEEP_FX[0] ); // Qx
1161 4484 : move32();
1162 :
1163 : /* for better performance, unroll this loop */
1164 8968 : FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ )
1165 : {
1166 4484 : temp[n] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP + n], temp[n - 1], AP2_STEEP_FX[n] ); // Qx
1167 4484 : move32();
1168 4484 : mem[ALLPASSSECTIONS_STEEP + 1] = Msub_32_16( temp[n - 1], temp[n], AP2_STEEP_FX[n] ); // Qx
1169 4484 : move32();
1170 : }
1171 :
1172 4484 : temp[ALLPASSSECTIONS_STEEP - 1] = Madd_32_16( mem[2 * ALLPASSSECTIONS_STEEP - 1], temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx
1173 4484 : move32();
1174 :
1175 4484 : mem[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx
1176 4484 : move32();
1177 4484 : out[0] = W_round48_L( W_mac_32_16( W_mult_32_16( out[0], 16384 /*0.5 in Q15*/ ), temp[ALLPASSSECTIONS_STEEP - 1], 16384 /*0.5 in Q15*/ ) ); // Qx
1178 4484 : move32();
1179 :
1180 1434880 : FOR( k = 1; k < N / 2; k++ )
1181 : {
1182 1430396 : temp[0] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP], in[2 * k - 1], AP2_STEEP_FX[0] ); // Qx
1183 1430396 : move32();
1184 1430396 : mem[ALLPASSSECTIONS_STEEP] = Msub_32_16( in[2 * k - 1], temp[0], AP2_STEEP_FX[0] ); // Qx
1185 1430396 : move32();
1186 :
1187 : /* for better performance, unroll this loop */
1188 2860792 : FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ )
1189 : {
1190 1430396 : temp[n] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP + n], temp[n - 1], AP2_STEEP_FX[n] ); // Qx
1191 1430396 : move32();
1192 1430396 : mem[ALLPASSSECTIONS_STEEP + n] = Msub_32_16( temp[n - 1], temp[n], AP2_STEEP_FX[n] ); // Qx
1193 1430396 : move32();
1194 : }
1195 :
1196 1430396 : temp[ALLPASSSECTIONS_STEEP - 1] = Madd_32_16( mem[2 * ALLPASSSECTIONS_STEEP - 1], temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx
1197 1430396 : move32();
1198 1430396 : mem[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx
1199 1430396 : move32();
1200 1430396 : out[k] = W_round48_L( W_mac_32_16( W_mult_32_16( out[k], 16384 /*0.5 in Q15*/ ), temp[ALLPASSSECTIONS_STEEP - 1], 16384 /*0.5 in Q15*/ ) ); // Qx
1201 1430396 : move32();
1202 : }
1203 :
1204 : /* z^(-1) */
1205 4484 : mem[2 * ALLPASSSECTIONS_STEEP] = in[N - 1];
1206 4484 : move32();
1207 :
1208 4484 : return;
1209 : }
1210 :
1211 :
1212 : /*-------------------------------------------------------------------*
1213 : * Interpolate_allpass_steep()
1214 : *
1215 : * Interpolation by a factor 2
1216 : *-------------------------------------------------------------------*/
1217 :
1218 23673 : void Interpolate_allpass_steep_fx(
1219 : const Word16 *in_fx,
1220 : Word16 mem[], /* array of size: 2*ALLPASSSECTIONS_STEEP+1 */
1221 : Word16 N, /* number of input samples */
1222 : Word16 out_fx[] ) /* array of size 2*N */
1223 : {
1224 :
1225 : Word16 k;
1226 23673 : Word32 Lacc = 0, Lacc1 = 0;
1227 : Word16 temp1, temp2;
1228 : #ifndef ISSUE_1836_replace_overflow_libcom
1229 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
1230 : Flag Overflow = 0;
1231 : move32();
1232 : #endif
1233 : #endif
1234 : /*** State in Q0,in_fx Q0, AP1_STEEP in Q15 AP2_STEEP in Q15 OP in Q0 ************/
1235 : /*upper allpass filter chain */
1236 :
1237 3343713 : FOR( k = 0; k < N; k++ )
1238 : {
1239 :
1240 3320040 : Lacc = L_deposit_h( mem[0] ); /* Q(16+x) */
1241 : #ifdef ISSUE_1836_replace_overflow_libcom
1242 3320040 : Lacc = L_mac_sat( Lacc, AP2_STEEP_FX[0], in_fx[k] ); /* Q(16+x):temp[0] */
1243 3320040 : Lacc1 = L_deposit_h( in_fx[k] ); /* Q(16+x) */
1244 3320040 : temp1 = round_fx_sat( Lacc ); /* Qx */
1245 3320040 : Lacc1 = L_msu_sat( Lacc1, AP2_STEEP_FX[0], temp1 ); /* Q(16+x) */
1246 :
1247 3320040 : mem[0] = round_fx_sat( Lacc1 );
1248 3320040 : move16();
1249 3320040 : Lacc1 = L_deposit_h( mem[1] ); /* Q(16+x) */
1250 3320040 : Lacc1 = ( L_mac_sat( Lacc1, AP2_STEEP_FX[1], temp1 ) ); /* Q(16+x):temp[1] */
1251 3320040 : Lacc = L_deposit_h( temp1 );
1252 :
1253 3320040 : temp2 = round_fx_sat( Lacc1 ); /* Qx */
1254 3320040 : Lacc = L_msu_sat( Lacc, AP2_STEEP_FX[1], temp2 ); /* Q(16+x) */
1255 3320040 : mem[1] = round_fx_sat( Lacc ); /* Qx */
1256 3320040 : move16();
1257 :
1258 3320040 : Lacc1 = L_deposit_h( temp2 );
1259 3320040 : Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */
1260 3320040 : out_fx[2 * k + 1] = round_fx_sat( L_mac_sat( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2 ) ); /* Qx format */
1261 3320040 : move16();
1262 3320040 : mem[ALLPASSSECTIONS_STEEP - 1] = round_fx_sat( L_msu_sat( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[2 * k + 1] ) ); /* Qx */
1263 3320040 : move16();
1264 : #else
1265 : Lacc1 = L_deposit_h( in_fx[k] ); /* Q(16+x) */
1266 : temp1 = round_fx_o( Lacc, &Overflow ); /* Qx */
1267 : Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[0], temp1, &Overflow ); /* Q(16+x) */
1268 :
1269 : mem[0] = round_fx_o( Lacc1, &Overflow );
1270 : move16();
1271 : Lacc1 = L_deposit_h( mem[1] ); /* Q(16+x) */
1272 : Lacc1 = ( L_mac_o( Lacc1, AP2_STEEP_FX[1], temp1, &Overflow ) ); /* Q(16+x):temp[1] */
1273 : Lacc = L_deposit_h( temp1 );
1274 :
1275 : temp2 = round_fx_o( Lacc1, &Overflow ); /* Qx */
1276 : Lacc = L_msu_o( Lacc, AP2_STEEP_FX[1], temp2, &Overflow ); /* Q(16+x) */
1277 : mem[1] = round_fx_o( Lacc, &Overflow ); /* Qx */
1278 : move16();
1279 :
1280 : Lacc1 = L_deposit_h( temp2 );
1281 : Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */
1282 : out_fx[2 * k + 1] = round_fx_o( L_mac_o( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ), &Overflow ); /* Qx format */
1283 : move16();
1284 : mem[ALLPASSSECTIONS_STEEP - 1] = round_fx_o( L_msu_o( Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[2 * k + 1], &Overflow ), &Overflow ); /* Qx */
1285 : move16();
1286 : #endif
1287 : }
1288 :
1289 : /* lower allpass filter chain */
1290 :
1291 3343713 : FOR( k = 0; k < N; k++ )
1292 : {
1293 3320040 : Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP] ); /* Q(16+x) */
1294 : #ifdef ISSUE_1836_replace_overflow_libcom
1295 3320040 : Lacc = L_mac_sat( Lacc, AP1_STEEP_FX[0], in_fx[k] ); /* Q(16+x):temp[0] */
1296 3320040 : Lacc1 = L_deposit_h( in_fx[k] ); /* Q(16+x) */
1297 3320040 : temp1 = round_fx_sat( Lacc ); /* Qx */
1298 3320040 : Lacc1 = L_msu_sat( Lacc1, AP1_STEEP_FX[0], temp1 ); /* Q(16+x) */
1299 :
1300 3320040 : mem[ALLPASSSECTIONS_STEEP] = round_fx_sat( Lacc1 );
1301 3320040 : Lacc1 = L_deposit_h( mem[ALLPASSSECTIONS_STEEP + 1] ); /* Q(16+x) */
1302 3320040 : Lacc1 = L_mac_sat( Lacc1, AP1_STEEP_FX[1], temp1 ); /* Q(16+x):temp[1] */
1303 :
1304 3320040 : temp2 = round_fx_sat( Lacc1 ); /* Qx */
1305 3320040 : Lacc = L_deposit_h( temp1 );
1306 3320040 : Lacc = L_msu_sat( Lacc, AP1_STEEP_FX[1], temp2 ); /* Q(16+x) */
1307 3320040 : mem[ALLPASSSECTIONS_STEEP + 1] = round_fx_sat( Lacc ); /* Qx */
1308 :
1309 3320040 : Lacc = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */
1310 3320040 : Lacc1 = L_deposit_h( temp2 );
1311 3320040 : out_fx[2 * k] = round_fx_sat( L_mac_sat( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2 ) ); /* Qx format */
1312 3320040 : move16();
1313 3320040 : mem[2 * ALLPASSSECTIONS_STEEP - 1] = round_fx_sat( L_msu_sat( Lacc1, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[2 * k] ) ); /* Qx */
1314 3320040 : move16();
1315 : #else
1316 : Lacc = L_mac_o( Lacc, AP1_STEEP_FX[0], in_fx[k], &Overflow ); /* Q(16+x):temp[0] */
1317 : Lacc1 = L_deposit_h( in_fx[k] ); /* Q(16+x) */
1318 : temp1 = round_fx_o( Lacc, &Overflow ); /* Qx */
1319 : Lacc1 = L_msu_o( Lacc1, AP1_STEEP_FX[0], temp1, &Overflow ); /* Q(16+x) */
1320 :
1321 : mem[ALLPASSSECTIONS_STEEP] = round_fx_o( Lacc1, &Overflow );
1322 : Lacc1 = L_deposit_h( mem[ALLPASSSECTIONS_STEEP + 1] ); /* Q(16+x) */
1323 : Lacc1 = L_mac_o( Lacc1, AP1_STEEP_FX[1], temp1, &Overflow ); /* Q(16+x):temp[1] */
1324 :
1325 : temp2 = round_fx_o( Lacc1, &Overflow ); /* Qx */
1326 : Lacc = L_deposit_h( temp1 );
1327 : Lacc = L_msu_o( Lacc, AP1_STEEP_FX[1], temp2, &Overflow ); /* Q(16+x) */
1328 : mem[ALLPASSSECTIONS_STEEP + 1] = round_fx_o( Lacc, &Overflow ); /* Qx */
1329 :
1330 : Lacc = L_deposit_h( mem[2 * ALLPASSSECTIONS_STEEP - 1] ); /* Q(16+x) */
1331 : Lacc1 = L_deposit_h( temp2 );
1332 : out_fx[2 * k] = round_fx_o( L_mac_o( Lacc, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], temp2, &Overflow ), &Overflow ); /* Qx format */
1333 : move16();
1334 : mem[2 * ALLPASSSECTIONS_STEEP - 1] = round_fx_o( L_msu_o( Lacc1, AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1], out_fx[2 * k], &Overflow ), &Overflow ); /* Qx */
1335 : move16();
1336 : #endif
1337 : }
1338 :
1339 23673 : return;
1340 : }
1341 :
1342 : /* IVAS 32-bit variant */
1343 119730 : void Interpolate_allpass_steep_fx32(
1344 : const Word32 *in_fx, /* i : input array of size N Qx */
1345 : Word32 *mem_fx, /* i/o: memory Qx */
1346 : const Word16 N, /* i : number of input samples */
1347 : Word32 *out_fx /* o : output array of size 2*N Qx */
1348 : )
1349 : {
1350 : Word16 n, k;
1351 : Word32 temp_fx[ALLPASSSECTIONS_STEEP - 1];
1352 :
1353 : /* upper allpass filter chain */
1354 36566140 : FOR( k = 0; k < N; k++ )
1355 : {
1356 36446410 : temp_fx[0] = Madd_32_16( mem_fx[0], in_fx[k], AP2_STEEP_FX[0] ); // Qx
1357 36446410 : move32();
1358 36446410 : mem_fx[0] = Msub_32_16( in_fx[k], temp_fx[0], AP2_STEEP_FX[0] ); // Qx
1359 36446410 : move32();
1360 :
1361 : /* for better performance, unroll this loop */
1362 72892820 : FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ )
1363 : {
1364 36446410 : temp_fx[n] = Madd_32_16( mem_fx[n], temp_fx[n - 1], AP2_STEEP_FX[n] ); // Qx
1365 36446410 : move32();
1366 36446410 : mem_fx[n] = Msub_32_16( temp_fx[n - 1], temp_fx[n], AP2_STEEP_FX[n] ); // Qx
1367 36446410 : move32();
1368 : }
1369 :
1370 36446410 : out_fx[2 * k + 1] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP - 1], temp_fx[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx
1371 36446410 : move32();
1372 36446410 : mem_fx[ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp_fx[ALLPASSSECTIONS_STEEP - 2], out_fx[2 * k + 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx
1373 36446410 : move32();
1374 : }
1375 :
1376 : /* lower allpass filter chain */
1377 36566140 : FOR( k = 0; k < N; k++ )
1378 : {
1379 36446410 : temp_fx[0] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP], in_fx[k], AP1_STEEP_FX[0] ); // Qx
1380 36446410 : move32();
1381 36446410 : mem_fx[ALLPASSSECTIONS_STEEP] = Msub_32_16( in_fx[k], temp_fx[0], AP1_STEEP_FX[0] ); // Qx
1382 36446410 : move32();
1383 :
1384 : /* for better performance, unroll this loop */
1385 72892820 : FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ )
1386 : {
1387 36446410 : temp_fx[n] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP + n], temp_fx[n - 1], AP1_STEEP_FX[n] ); // Qx
1388 36446410 : move32();
1389 36446410 : mem_fx[ALLPASSSECTIONS_STEEP + n] = Msub_32_16( temp_fx[n - 1], temp_fx[n], AP1_STEEP_FX[n] ); // Qx
1390 36446410 : move32();
1391 : }
1392 :
1393 36446410 : out_fx[2 * k] = Madd_32_16( mem_fx[2 * ALLPASSSECTIONS_STEEP - 1], temp_fx[ALLPASSSECTIONS_STEEP - 2], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx
1394 36446410 : move32();
1395 36446410 : mem_fx[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp_fx[ALLPASSSECTIONS_STEEP - 2], out_fx[2 * k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx
1396 36446410 : move32();
1397 : }
1398 :
1399 119730 : return;
1400 : }
1401 :
1402 :
1403 : /*-------------------------------------------------------------------*
1404 : * interpolate_3_over_2_allpass_fx()
1405 : *
1406 : * Interpolate 3/2 using allpass iir polyphase filter. Delay 4 samples @48k
1407 : *-------------------------------------------------------------------*/
1408 :
1409 1596 : void interpolate_3_over_2_allpass_fx(
1410 : const Word16 *input_fx,
1411 : /* i : input signal */ /* Q_input */
1412 : const Word16 len, /* i : number of input samples */
1413 : Word16 *out_fx,
1414 : /* o : output signal */ /* Q_input */
1415 : Word16 *mem_fx,
1416 : /* i/o: memory */ /* Q_input */
1417 : const Word16 *filt_coeff_fx /* i : filter coefficients */ /* Q15*/
1418 : )
1419 : {
1420 : /* mem of current frame would be stored in Qinput, so the next call to this function shoulf have Q_mem parameter set to prev_Q_input */
1421 : Word16 i, loop_len;
1422 : Word16 input_fx_temp[L_FRAME32k]; /* Limiting length of input signal to a max of L_FRAME32k samples */
1423 : Word16 Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */ /* will be in Q_current */
1424 : Word16 out1_buff[L_FRAME48k * 2];
1425 : Word16 *out1;
1426 : Word16 mem_temp;
1427 :
1428 : Word16 s;
1429 :
1430 1596 : s = 0;
1431 1596 : move16();
1432 1013840 : FOR( i = 0; i < len; i++ )
1433 : {
1434 1012244 : s = s_max( s, abs_s( input_fx[i] ) );
1435 : }
1436 25536 : FOR( i = 0; i < INTERP_3_2_MEM_LEN; i++ )
1437 : {
1438 23940 : s = s_max( s, abs_s( mem_fx[i] ) );
1439 : }
1440 1596 : s = s_max( sub( norm_s( s ), 2 ), 0 );
1441 1596 : Copy_Scale_sig( input_fx, input_fx_temp, len, s );
1442 1596 : Scale_sig( mem_fx, INTERP_3_2_MEM_LEN, s );
1443 1596 : out1 = out1_buff;
1444 :
1445 1013840 : FOR( i = 0; i < len; i++ )
1446 : {
1447 : /* Upper branch */
1448 : /*Vu[0] = mem[0] + filt_coeff[0] * ( input_fx_temp[i] - mem[1] );
1449 : Vu[1] = mem[1] + filt_coeff[1] * ( Vu[0] - mem[2] );
1450 : mem[3] = mem[2] + filt_coeff[2] * ( Vu[1] - mem[3] );*/
1451 :
1452 1012244 : Vu[0] = add_sat( mem_fx[0], mult_r_sat( filt_coeff_fx[0], sub_sat( input_fx_temp[i], mem_fx[1] ) ) );
1453 1012244 : move16(); /* all Vu's in : Q_current*/
1454 1012244 : Vu[1] = add_sat( mem_fx[1], mult_r_sat( filt_coeff_fx[1], sub_sat( Vu[0], mem_fx[2] ) ) );
1455 1012244 : move16();
1456 1012244 : mem_fx[3] = add_sat( mem_fx[2], mult_r_sat( filt_coeff_fx[2], sub_sat( Vu[1], mem_fx[3] ) ) );
1457 1012244 : move16();
1458 :
1459 :
1460 1012244 : mem_fx[1] = Vu[0];
1461 1012244 : move16();
1462 1012244 : mem_fx[2] = Vu[1];
1463 1012244 : move16();
1464 1012244 : *out1++ = mem_fx[3];
1465 1012244 : move16();
1466 :
1467 : /* Middle branch */
1468 : /* Vm[0] = mem[0] + filt_coeff[3] * (input[i]-mem[4]);
1469 : Vm[1] = mem[4] + filt_coeff[4] * (Vm[0]-mem[5]);
1470 : mem[6] = mem[5] + filt_coeff[5] * (Vm[1]-mem[6]); */
1471 1012244 : Vm[0] = add_sat( mem_fx[0], mult_r_sat( filt_coeff_fx[3], sub_sat( input_fx_temp[i], mem_fx[4] ) ) );
1472 1012244 : move16();
1473 1012244 : Vm[1] = add_sat( mem_fx[4], mult_r_sat( filt_coeff_fx[4], sub_sat( Vm[0], mem_fx[5] ) ) );
1474 1012244 : move16();
1475 1012244 : mem_fx[6] = add_sat( mem_fx[5], mult_r_sat( filt_coeff_fx[5], sub_sat( Vm[1], mem_fx[6] ) ) );
1476 1012244 : move16();
1477 1012244 : mem_fx[4] = Vm[0];
1478 1012244 : move16();
1479 1012244 : mem_fx[5] = Vm[1];
1480 1012244 : move16();
1481 1012244 : *out1++ = mem_fx[6];
1482 1012244 : move16();
1483 :
1484 : /* Lower branch */
1485 : /* Vl[0] = mem[0] + filt_coeff[6] * (input[i]-mem[7]);
1486 : Vl[1] = mem[7] + filt_coeff[7] * (Vl[0]-mem[8]);
1487 : mem[9] = mem[8] + filt_coeff[8] * (Vl[1]-mem[9]); */
1488 1012244 : Vl[0] = add_sat( mem_fx[0], mult_r_sat( filt_coeff_fx[6], sub_sat( input_fx_temp[i], mem_fx[7] ) ) );
1489 1012244 : move16();
1490 1012244 : Vl[1] = add_sat( mem_fx[7], mult_r_sat( filt_coeff_fx[7], sub_sat( Vl[0], mem_fx[8] ) ) );
1491 1012244 : move16();
1492 1012244 : mem_fx[9] = add_sat( mem_fx[8], mult_r_sat( filt_coeff_fx[8], sub_sat( Vl[1], mem_fx[9] ) ) );
1493 1012244 : move16();
1494 1012244 : mem_fx[0] = input_fx_temp[i];
1495 1012244 : move16();
1496 1012244 : mem_fx[7] = Vl[0];
1497 1012244 : move16();
1498 1012244 : mem_fx[8] = Vl[1];
1499 1012244 : move16();
1500 1012244 : *out1++ = mem_fx[9];
1501 1012244 : move16();
1502 : }
1503 :
1504 : /* loop_len = len*3/2 */
1505 1596 : loop_len = shr( i_mult( len, 3 ), 1 );
1506 :
1507 : /*decimate by 2 and LPF*/
1508 1519962 : FOR( i = 0; i < loop_len; i++ )
1509 : {
1510 1518366 : mem_temp = out1_buff[shl( i, 1 )];
1511 1518366 : move16();
1512 1518366 : out_fx[i] = add_sat( mult_r_sat( 1550 /* 0.0473147f Q15*/, add_sat( mem_temp, mem_fx[10] ) ), mult_r_sat( -4965 /*-0.151521f Q15*/, add_sat( mem_fx[11], mem_fx[14] ) ) );
1513 1518366 : out_fx[i] = add_sat( out_fx[i], mult_r_sat( 20125 /*0.614152f Q15*/, add_sat( mem_fx[12], mem_fx[13] ) ) );
1514 1518366 : mem_fx[10] = mem_fx[11];
1515 1518366 : move16();
1516 1518366 : mem_fx[11] = mem_fx[12];
1517 1518366 : move16();
1518 1518366 : mem_fx[12] = mem_fx[13];
1519 1518366 : move16();
1520 1518366 : mem_fx[13] = mem_fx[14];
1521 1518366 : move16();
1522 1518366 : mem_fx[14] = mem_temp;
1523 1518366 : move16();
1524 : }
1525 1596 : Scale_sig( out_fx, i_mult( 3, shr( len, 1 ) ), -s );
1526 1596 : Scale_sig( mem_fx, INTERP_3_2_MEM_LEN, -s );
1527 1596 : return;
1528 : }
1529 :
1530 : /* IVAS 32-bit variant */
1531 82520 : void interpolate_3_over_2_allpass_fx32(
1532 : const Word32 *input, /* i : input signal Qx*/
1533 : const Word16 len, /* i : number of input samples */
1534 : Word32 *out, /* o : output signal Qx*/
1535 : Word32 *mem /* i/o: memory Qx*/
1536 : )
1537 : {
1538 : Word16 i, loop_len;
1539 : Word32 Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */
1540 : Word32 out1_buff[L_FRAME32k * 3];
1541 : Word32 *out1;
1542 : Word32 mem_temp;
1543 82520 : const Word16 *filt_coeff = allpass_poles_3_ov_2; // Q15
1544 :
1545 82520 : out1 = out1_buff;
1546 :
1547 51051104 : FOR( i = 0; i < len; i++ )
1548 : {
1549 : /* Upper branch */
1550 50968584 : Vu[0] = Madd_32_16( mem[0], L_sub( input[i], mem[1] ), filt_coeff[0] ); // Qx + Q15 - Q15 -> Qx
1551 50968584 : move32();
1552 50968584 : Vu[1] = Madd_32_16( mem[1], L_sub( Vu[0], mem[2] ), filt_coeff[1] ); // Qx + Q15 - Q15 -> Qx
1553 50968584 : move32();
1554 50968584 : mem[3] = Madd_32_16( mem[2], L_sub( Vu[1], mem[3] ), filt_coeff[2] ); // Qx + Q15 - Q15 -> Qx
1555 50968584 : move32();
1556 :
1557 50968584 : mem[1] = Vu[0]; // Qx
1558 50968584 : move32();
1559 50968584 : mem[2] = Vu[1]; // Qx
1560 50968584 : move32();
1561 50968584 : *out1++ = mem[3]; // Qx
1562 50968584 : move32();
1563 :
1564 : /* Middle branch */
1565 50968584 : Vm[0] = Madd_32_16( mem[0], L_sub( input[i], mem[4] ), filt_coeff[3] ); // Qx + Q15 - Q15 -> Qx
1566 50968584 : move32();
1567 50968584 : Vm[1] = Madd_32_16( mem[4], L_sub( Vm[0], mem[5] ), filt_coeff[4] ); // Qx + Q15 - Q15 -> Qx
1568 50968584 : move32();
1569 50968584 : mem[6] = Madd_32_16( mem[5], L_sub( Vm[1], mem[6] ), filt_coeff[5] ); // Qx + Q15 - Q15 -> Qx
1570 50968584 : move32();
1571 :
1572 50968584 : mem[4] = Vm[0]; // Qx
1573 50968584 : move32();
1574 50968584 : mem[5] = Vm[1]; // Qx
1575 50968584 : move32();
1576 50968584 : *out1++ = mem[6]; // Qx
1577 50968584 : move32();
1578 :
1579 : /* Lower branch */
1580 50968584 : Vl[0] = Madd_32_16( mem[0], L_sub( input[i], mem[7] ), filt_coeff[6] ); // Qx + Q15 - Q15 -> Qx
1581 50968584 : move32();
1582 50968584 : Vl[1] = Madd_32_16( mem[7], L_sub( Vl[0], mem[8] ), filt_coeff[7] ); // Qx + Q15 - Q15 -> Qx
1583 50968584 : move32();
1584 50968584 : mem[9] = Madd_32_16( mem[8], L_sub( Vl[1], mem[9] ), filt_coeff[8] ); // Qx + Q15 - Q15 -> Qx
1585 50968584 : move32();
1586 :
1587 50968584 : mem[0] = input[i]; // Qx
1588 50968584 : move32();
1589 50968584 : mem[7] = Vl[0]; // Qx
1590 50968584 : move32();
1591 50968584 : mem[8] = Vl[1]; // Qx
1592 50968584 : move32();
1593 50968584 : *out1++ = mem[9]; // Qx
1594 50968584 : move32();
1595 : }
1596 :
1597 82520 : loop_len = shr( i_mult( len, 3 ), 1 );
1598 :
1599 : /*decimate by 2 and LPF*/
1600 76535396 : FOR( i = 0; i < loop_len; i++ )
1601 : {
1602 76452876 : mem_temp = out1_buff[2 * i];
1603 76452876 : move32();
1604 76452876 : out[i] = Madd_32_16( Mpy_32_16_1( L_add( mem_temp, mem[10] ), 1550 ), L_add( mem[11], mem[14] ), -4965 ); // Qx + Q15 - Q15 -> Qx
1605 : // 0.0473147f in Q15 -> 1550, -0.151521f in Q15 -> -4965
1606 76452876 : out[i] = Madd_32_16( out[i], L_add( mem[12], mem[13] ), 20125 );
1607 : // 0.614152f in Q15 -> 20125
1608 76452876 : mem[10] = mem[11]; // Qx
1609 76452876 : move32();
1610 76452876 : mem[11] = mem[12]; // Qx
1611 76452876 : move32();
1612 76452876 : mem[12] = mem[13]; // Qx
1613 76452876 : move32();
1614 76452876 : mem[13] = mem[14]; // Qx
1615 76452876 : move32();
1616 76452876 : mem[14] = mem_temp; // Qx
1617 76452876 : move32();
1618 : }
1619 :
1620 82520 : return;
1621 : }
1622 :
1623 :
1624 : /*-------------------------------------------------------------------*
1625 : * interpolate_3_over_1_allpass_fx()
1626 : *
1627 : * Interpolate 3/1 using allpass iir polyphase filter. Delay 4 samples @48k
1628 : *-------------------------------------------------------------------*/
1629 :
1630 0 : void ivas_interpolate_3_over_1_allpass_fx(
1631 : const Word16 *input_fx,
1632 : /* i : input signal */ /* Q_input */
1633 : const Word16 len, /* i : number of input samples */
1634 : Word16 *out_fx,
1635 : /* o : output signal */ /* Q_input */
1636 : Word16 *mem_fx /* i/o: memory */ /* Q_input */
1637 : )
1638 : {
1639 : /* mem of current frame would be stored in Qinput, so the next call to this function shoulf have Q_mem parameter set to prev_Q_input */
1640 : Word16 i;
1641 : Word16 Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */
1642 : Word16 *out1;
1643 : Word16 mem_temp;
1644 0 : const Word16 *filt_coeff_fx = allpass_poles_3_ov_2;
1645 :
1646 0 : out1 = &out_fx[0];
1647 :
1648 0 : FOR( i = 0; i < len; i++ )
1649 : {
1650 : /* Upper branch */
1651 : /*Vu[0] = mem[0] + filt_coeff[0] * ( input_fx_temp[i] - mem[1] );
1652 : Vu[1] = mem[1] + filt_coeff[1] * ( Vu[0] - mem[2] );
1653 : mem[3] = mem[2] + filt_coeff[2] * ( Vu[1] - mem[3] );*/
1654 :
1655 0 : Vu[0] = add_sat( mem_fx[0], mult_r( filt_coeff_fx[0], sub_sat( input_fx[i], mem_fx[1] ) ) );
1656 0 : move16(); /* all Vu's in : Q_current*/
1657 0 : Vu[1] = add_sat( mem_fx[1], mult_r( filt_coeff_fx[1], sub_sat( Vu[0], mem_fx[2] ) ) );
1658 0 : move16();
1659 0 : mem_fx[3] = add_sat( mem_fx[2], mult_r( filt_coeff_fx[2], sub_sat( Vu[1], mem_fx[3] ) ) );
1660 0 : move16();
1661 :
1662 :
1663 0 : mem_fx[1] = Vu[0];
1664 0 : move16();
1665 0 : mem_fx[2] = Vu[1];
1666 0 : move16();
1667 0 : *out1++ = mem_fx[3];
1668 0 : move16();
1669 :
1670 : /* Middle branch */
1671 : /* Vm[0] = mem[0] + filt_coeff[3] * (input[i]-mem[4]);
1672 : Vm[1] = mem[4] + filt_coeff[4] * (Vm[0]-mem[5]);
1673 : mem[6] = mem[5] + filt_coeff[5] * (Vm[1]-mem[6]); */
1674 0 : Vm[0] = add_sat( mem_fx[0], mult_r( filt_coeff_fx[3], sub_sat( input_fx[i], mem_fx[4] ) ) );
1675 0 : move16();
1676 0 : Vm[1] = add_sat( mem_fx[4], mult_r( filt_coeff_fx[4], sub_sat( Vm[0], mem_fx[5] ) ) );
1677 0 : move16();
1678 0 : mem_fx[6] = add_sat( mem_fx[5], mult_r( filt_coeff_fx[5], sub_sat( Vm[1], mem_fx[6] ) ) );
1679 0 : move16();
1680 :
1681 0 : mem_fx[4] = Vm[0];
1682 0 : move16();
1683 0 : mem_fx[5] = Vm[1];
1684 0 : move16();
1685 0 : *out1++ = mem_fx[6];
1686 0 : move16();
1687 :
1688 : /* Lower branch */
1689 : /* Vl[0] = mem[0] + filt_coeff[6] * (input[i]-mem[7]);
1690 : Vl[1] = mem[7] + filt_coeff[7] * (Vl[0]-mem[8]);
1691 : mem[9] = mem[8] + filt_coeff[8] * (Vl[1]-mem[9]); */
1692 0 : Vl[0] = add_sat( mem_fx[0], mult_r( filt_coeff_fx[6], sub_sat( input_fx[i], mem_fx[7] ) ) );
1693 0 : move16();
1694 0 : Vl[1] = add_sat( mem_fx[7], mult_r( filt_coeff_fx[7], sub_sat( Vl[0], mem_fx[8] ) ) );
1695 0 : move16();
1696 0 : mem_fx[9] = add_sat( mem_fx[8], mult_r( filt_coeff_fx[8], sub_sat( Vl[1], mem_fx[9] ) ) );
1697 0 : move16();
1698 :
1699 0 : mem_fx[0] = input_fx[i];
1700 0 : move16();
1701 0 : mem_fx[7] = Vl[0];
1702 0 : move16();
1703 0 : mem_fx[8] = Vl[1];
1704 0 : move16();
1705 0 : *out1++ = mem_fx[9];
1706 0 : move16();
1707 : }
1708 : /*LPF*/
1709 0 : FOR( i = 0; i < len * 3; i++ )
1710 : {
1711 0 : mem_temp = out_fx[i];
1712 0 : move16();
1713 0 : out_fx[i] = sub_sat( mult_r( 18768 /*0.57276865021499168f Q15*/, add_sat( mem_fx[12], mem_fx[11] ) ), mult_r( 2425 /*0.074004974641176793f Q15*/, add_sat( mem_temp, mem_fx[10] ) ) );
1714 0 : mem_fx[10] = mem_fx[11];
1715 0 : move16();
1716 0 : mem_fx[11] = mem_fx[12];
1717 0 : move16();
1718 0 : mem_fx[12] = mem_temp;
1719 0 : move16();
1720 : }
1721 0 : return;
1722 : }
1723 :
1724 50004 : void interpolate_3_over_1_allpass_fx(
1725 : const Word16 *input_fx,
1726 : /* i : input signal */ /* Q_input */
1727 : const Word16 len, /* i : number of input samples */
1728 : Word16 *out_fx,
1729 : /* o : output signal */ /* Q_input */
1730 : Word16 *mem_fx /* i/o: memory */ /* Q_input */
1731 : )
1732 : {
1733 : /* mem of current frame would be stored in Qinput, so the next call to this function shoulf have Q_mem parameter set to prev_Q_input */
1734 : Word16 i;
1735 : Word16 Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */
1736 : Word16 *out1;
1737 : Word16 mem_temp;
1738 50004 : const Word16 *filt_coeff_fx = allpass_poles_3_ov_2; // Q15
1739 :
1740 50004 : out1 = &out_fx[0];
1741 :
1742 4050324 : FOR( i = 0; i < len; i++ )
1743 : {
1744 : /* Upper branch */
1745 : /*Vu[0] = mem[0] + filt_coeff[0] * ( input_fx_temp[i] - mem[1] );
1746 : Vu[1] = mem[1] + filt_coeff[1] * ( Vu[0] - mem[2] );
1747 : mem[3] = mem[2] + filt_coeff[2] * ( Vu[1] - mem[3] );*/
1748 :
1749 4000320 : Vu[0] = add_sat( mem_fx[0], mult_r( filt_coeff_fx[0], sub_sat( input_fx[i], mem_fx[1] ) ) );
1750 4000320 : move16(); /* all Vu's in : Q_current*/
1751 4000320 : Vu[1] = add_sat( mem_fx[1], mult_r( filt_coeff_fx[1], sub_sat( Vu[0], mem_fx[2] ) ) );
1752 4000320 : move16();
1753 4000320 : mem_fx[3] = add_sat( mem_fx[2], mult_r( filt_coeff_fx[2], sub_sat( Vu[1], mem_fx[3] ) ) );
1754 4000320 : move16();
1755 :
1756 :
1757 4000320 : mem_fx[1] = Vu[0];
1758 4000320 : move16();
1759 4000320 : mem_fx[2] = Vu[1];
1760 4000320 : move16();
1761 4000320 : *out1++ = mem_fx[3];
1762 4000320 : move16();
1763 :
1764 : /* Middle branch */
1765 : /* Vm[0] = mem[0] + filt_coeff[3] * (input[i]-mem[4]);
1766 : Vm[1] = mem[4] + filt_coeff[4] * (Vm[0]-mem[5]);
1767 : mem[6] = mem[5] + filt_coeff[5] * (Vm[1]-mem[6]); */
1768 4000320 : Vm[0] = add_sat( mem_fx[0], mult_r( filt_coeff_fx[3], sub_sat( input_fx[i], mem_fx[4] ) ) );
1769 4000320 : move16();
1770 4000320 : Vm[1] = add_sat( mem_fx[4], mult_r( filt_coeff_fx[4], sub_sat( Vm[0], mem_fx[5] ) ) );
1771 4000320 : move16();
1772 4000320 : mem_fx[6] = add_sat( mem_fx[5], mult_r( filt_coeff_fx[5], sub_sat( Vm[1], mem_fx[6] ) ) );
1773 4000320 : move16();
1774 :
1775 4000320 : mem_fx[4] = Vm[0];
1776 4000320 : move16();
1777 4000320 : mem_fx[5] = Vm[1];
1778 4000320 : move16();
1779 4000320 : *out1++ = mem_fx[6];
1780 4000320 : move16();
1781 :
1782 : /* Lower branch */
1783 : /* Vl[0] = mem[0] + filt_coeff[6] * (input[i]-mem[7]);
1784 : Vl[1] = mem[7] + filt_coeff[7] * (Vl[0]-mem[8]);
1785 : mem[9] = mem[8] + filt_coeff[8] * (Vl[1]-mem[9]); */
1786 4000320 : Vl[0] = add_sat( mem_fx[0], mult_r( filt_coeff_fx[6], sub_sat( input_fx[i], mem_fx[7] ) ) );
1787 4000320 : move16();
1788 4000320 : Vl[1] = add_sat( mem_fx[7], mult_r( filt_coeff_fx[7], sub_sat( Vl[0], mem_fx[8] ) ) );
1789 4000320 : move16();
1790 4000320 : mem_fx[9] = add_sat( mem_fx[8], mult_r( filt_coeff_fx[8], sub_sat( Vl[1], mem_fx[9] ) ) );
1791 4000320 : move16();
1792 :
1793 4000320 : mem_fx[0] = input_fx[i];
1794 4000320 : move16();
1795 4000320 : mem_fx[7] = Vl[0];
1796 4000320 : move16();
1797 4000320 : mem_fx[8] = Vl[1];
1798 4000320 : move16();
1799 4000320 : *out1++ = mem_fx[9];
1800 4000320 : move16();
1801 : }
1802 : /*LPF*/
1803 12050964 : FOR( i = 0; i < len * 3; i++ )
1804 : {
1805 12000960 : mem_temp = out_fx[i];
1806 12000960 : move16();
1807 12000960 : out_fx[i] = sub_sat( mult_r( 18768 /*0.57276865021499168f Q15*/, add_sat( mem_fx[12], mem_fx[11] ) ), mult_r( 2425 /*0.074004974641176793f Q15*/, add_sat( mem_temp, mem_fx[10] ) ) );
1808 12000960 : mem_fx[10] = mem_fx[11];
1809 12000960 : move16();
1810 12000960 : mem_fx[11] = mem_fx[12];
1811 12000960 : move16();
1812 12000960 : mem_fx[12] = mem_temp;
1813 12000960 : move16();
1814 : }
1815 50004 : return;
1816 : }
1817 :
1818 : /* IVAS 32-bit variant */
1819 3338 : void interpolate_3_over_1_allpass_fx32(
1820 : const Word32 *input, /* i : input signal Qx */
1821 : const Word16 len, /* i : number of input samples */
1822 : Word32 *out, /* o : output signal */
1823 : Word32 *mem /* i/o: memory */
1824 : )
1825 : {
1826 : Word16 i, tmp16;
1827 : Word32 Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */
1828 : Word32 *out1;
1829 : Word32 mem_temp;
1830 3338 : const Word16 *filt_coeff = allpass_poles_3_ov_2; // Qx
1831 :
1832 3338 : out1 = &out[0];
1833 :
1834 1071498 : FOR( i = 0; i < len; i++ )
1835 : {
1836 : /* Upper branch */
1837 1068160 : Vu[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[1] ), filt_coeff[0] ) ); // Qx
1838 1068160 : move32();
1839 1068160 : Vu[1] = L_add_sat( mem[1], Mpy_32_16_1( L_sub( Vu[0], mem[2] ), filt_coeff[1] ) ); // Qx
1840 1068160 : move32();
1841 1068160 : mem[3] = L_add_sat( mem[2], Mpy_32_16_1( L_sub( Vu[1], mem[3] ), filt_coeff[2] ) ); // Qx
1842 1068160 : move32();
1843 :
1844 1068160 : mem[1] = Vu[0]; // Qx
1845 1068160 : move32();
1846 1068160 : mem[2] = Vu[1]; // Qx
1847 1068160 : move32();
1848 1068160 : *out1++ = mem[3]; // Qx
1849 1068160 : move32();
1850 :
1851 : /* Middle branch */
1852 1068160 : Vm[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[4] ), filt_coeff[3] ) ); // Qx
1853 1068160 : move32();
1854 1068160 : Vm[1] = L_add_sat( mem[4], Mpy_32_16_1( L_sub( Vm[0], mem[5] ), filt_coeff[4] ) ); // Qx
1855 1068160 : move32();
1856 1068160 : mem[6] = L_add_sat( mem[5], Mpy_32_16_1( L_sub( Vm[1], mem[6] ), filt_coeff[5] ) ); // Qx
1857 1068160 : move32();
1858 :
1859 1068160 : mem[4] = Vm[0]; // Qx
1860 1068160 : move32();
1861 1068160 : mem[5] = Vm[1]; // Qx
1862 1068160 : move32();
1863 1068160 : *out1++ = mem[6]; // Qx
1864 1068160 : move32();
1865 :
1866 : /* Lower branch */
1867 1068160 : Vl[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[7] ), filt_coeff[6] ) ); // Qx
1868 1068160 : move32();
1869 1068160 : Vl[1] = L_add_sat( mem[7], Mpy_32_16_1( L_sub( Vl[0], mem[8] ), filt_coeff[7] ) ); // Qx
1870 1068160 : move32();
1871 1068160 : mem[9] = L_add_sat( mem[8], Mpy_32_16_1( L_sub( Vl[1], mem[9] ), filt_coeff[8] ) ); // Qx
1872 1068160 : move32();
1873 :
1874 1068160 : mem[0] = input[i]; // Qx
1875 1068160 : move32();
1876 1068160 : mem[7] = Vl[0]; // Qx
1877 1068160 : move32();
1878 1068160 : mem[8] = Vl[1]; // Qx
1879 1068160 : move32();
1880 1068160 : *out1++ = mem[9]; // Qx
1881 1068160 : move32();
1882 : }
1883 :
1884 : /*LPF*/
1885 3338 : tmp16 = imult1616( len, 3 );
1886 3207818 : FOR( i = 0; i < tmp16; i++ )
1887 : {
1888 3204480 : mem_temp = out[i]; // Qx
1889 3204480 : move32();
1890 3204480 : out[i] = L_sub_sat( Mpy_32_16_1( L_add_sat( mem[12], mem[11] ), 18768 ), Mpy_32_16_1( L_add_sat( mem_temp, mem[10] ), 2425 ) ); // Qx
1891 : // 0.572769 in Q15 -> 18768, 0.074005 in Q15 -> 2425
1892 3204480 : move32();
1893 3204480 : mem[10] = mem[11]; // Qx
1894 3204480 : move32();
1895 3204480 : mem[11] = mem[12]; // Qx
1896 3204480 : move32();
1897 3204480 : mem[12] = mem_temp; // Qx
1898 3204480 : move32();
1899 : }
1900 :
1901 3338 : return;
1902 : }
1903 :
1904 :
1905 : /*-------------------------------------------------------------------*
1906 : * decimate_3_over_2_allpass_fx()
1907 : *
1908 : * Decimate 2/3 using allpass iir polyphase filter. Delay 4 samples @48k
1909 : *-------------------------------------------------------------------*/
1910 :
1911 0 : void decimate_2_over_3_allpass_fx(
1912 : const Word16 *input,
1913 : /* i : input signal */ /* Q_input */
1914 : const Word16 len, /* i : number of input samples */
1915 : Word16 *out_fx,
1916 : /* o : output signal */ /* Q_input */
1917 : Word16 *mem_fx,
1918 : /* i/o: memory */ /* Q_input */
1919 : const Word16 *filt_coeff_fx,
1920 : /* i : filter coefficients */ /* Q15*/
1921 : const Word16 *lp_num_fx, /* i : Num Coefficients : Q15 */
1922 : const Word16 *lp_den_fx, /* o : Den Coefficients : Q15 */
1923 : Word16 *lp_mem_fx /* o : Filter memories : Q_input */
1924 : )
1925 : {
1926 :
1927 : Word16 i, loop_len;
1928 : Word16 Vu1, Vm1, Vl1; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */
1929 0 : Word16 Vu0 = 0, Vm0 = 0, Vl0 = 0; /* initialize just to avoid compiler warnings */
1930 : Word16 out1_buff[L_FRAME48k * 2];
1931 : Word16 *out1, *in;
1932 : Word16 out, tmp;
1933 : Word16 mem_fx_11, mem_fx_7, mem_fx_3;
1934 : Word16 sc, input_fx[960];
1935 0 : sc = s_min( s_min( sub( Find_Max_Norm16( input, len ), 2 ), sub( Find_Max_Norm16( mem_fx, 12 ), 2 ) ), sub( Find_Max_Norm16( lp_mem_fx, 3 ), 2 ) );
1936 0 : Scale_sig( lp_mem_fx, 3, sc );
1937 0 : Copy_Scale_sig( input, input_fx, len, sc );
1938 0 : Scale_sig( mem_fx, 12, sc );
1939 0 : out1 = out1_buff;
1940 : /* *out1++ = lp_num[0] * ( input[0] + lp_mem[0] ) - lp_den[2] * lp_mem[2]; */
1941 0 : *out1++ = msu_r( L_mult( lp_num_fx[0], add( input_fx[0], lp_mem_fx[0] ) ), lp_den_fx[2], lp_mem_fx[2] );
1942 0 : move16();
1943 : /* *out1++ = lp_num[1] * input[0] - lp_den[2] * lp_mem[1]; */
1944 0 : *out1++ = msu_r( L_mult( lp_num_fx[1], input_fx[0] ), lp_den_fx[2], lp_mem_fx[1] );
1945 0 : move16();
1946 :
1947 0 : FOR( i = 1; i < len; i++ )
1948 : {
1949 : /* tmp = lp_num[0] * ( input[i] + input[i-1] ) - lp_den[2] * out1[-2];
1950 : *out1++ = tmp; */
1951 0 : tmp = msu_r( L_mult( lp_num_fx[0], add( input_fx[i], input_fx[i - 1] ) ), lp_den_fx[2], out1[-2] );
1952 0 : *out1++ = tmp;
1953 0 : move16();
1954 : /* tmp = lp_num[1] * input[i] - lp_den[2] * out1[-2];
1955 : *out1++ = tmp; */
1956 0 : tmp = msu_r( L_mult( lp_num_fx[1], input_fx[i] ), lp_den_fx[2], out1[-2] );
1957 0 : *out1++ = tmp;
1958 0 : move16();
1959 : }
1960 0 : lp_mem_fx[0] = input_fx[len - 1];
1961 0 : move16();
1962 0 : lp_mem_fx[1] = out1[-1];
1963 0 : move16();
1964 0 : lp_mem_fx[2] = out1[-2];
1965 0 : move16();
1966 :
1967 : /* do the all pass polyphase filter with pi/3 cutoff */
1968 0 : out1 = out_fx;
1969 0 : in = out1_buff;
1970 : /* loop_len = len*2/3 */
1971 0 : loop_len = shl( len, 1 ) / 3; /* Replace with a better way to divide by 3 when len is divisible by 3 */
1972 :
1973 0 : assert( loop_len > 0 );
1974 :
1975 0 : mem_fx_11 = mem_fx[11];
1976 0 : move16();
1977 0 : mem_fx_7 = mem_fx[7];
1978 0 : move16();
1979 0 : mem_fx_3 = mem_fx[3];
1980 0 : move16();
1981 0 : FOR( i = 0; i < loop_len; i++ )
1982 : {
1983 : /* Lower branch */
1984 : /*Vl0 = mem[8] + filt_coeff[6] * (*in - mem[9]);
1985 : Vl1 = mem[9] + filt_coeff[7] * (Vl0 - mem[10]);
1986 : mem[11] = mem[10] + filt_coeff[8] * (Vl1 - mem[11]); */
1987 0 : tmp = mult_r( filt_coeff_fx[6], sub( *in++, mem_fx[9] ) );
1988 0 : if ( i == 0 )
1989 : {
1990 0 : Vl0 = add( mem_fx[8], tmp );
1991 : }
1992 0 : if ( i != 0 )
1993 : {
1994 0 : Vl0 = add( *( in - 4 ), tmp );
1995 : }
1996 0 : Vl1 = add( mem_fx[9], mult_r( filt_coeff_fx[7], sub( Vl0, mem_fx[10] ) ) );
1997 0 : mem_fx_11 = add( mem_fx[10], mult_r( filt_coeff_fx[8], sub( Vl1, mem_fx_11 ) ) );
1998 :
1999 : /* mem[8] = *in++;
2000 : mem[9] = Vl0;
2001 : mem[10] = Vl1;
2002 : *out1 = mem[11]; */
2003 :
2004 0 : mem_fx[9] = Vl0;
2005 0 : move16();
2006 0 : mem_fx[10] = Vl1;
2007 0 : move16();
2008 :
2009 : /* Middle branch */
2010 : /* Vm0 = mem[4] + filt_coeff[3] * (*in - mem[5]);
2011 : Vm1 = mem[5] + filt_coeff[4] * (Vm0-mem[6]);
2012 : mem[7] = mem[6] + filt_coeff[5] * (Vm1-mem[7]); */
2013 0 : tmp = mult_r( filt_coeff_fx[3], sub( *in++, mem_fx[5] ) );
2014 0 : if ( i == 0 )
2015 : {
2016 0 : Vm0 = add( mem_fx[4], tmp );
2017 : }
2018 0 : if ( i != 0 )
2019 : {
2020 0 : Vm0 = add( *( in - 4 ), tmp );
2021 : }
2022 0 : Vm1 = add( mem_fx[5], mult_r( filt_coeff_fx[4], sub( Vm0, mem_fx[6] ) ) );
2023 0 : mem_fx_7 = add( mem_fx[6], mult_r( filt_coeff_fx[5], sub( Vm1, mem_fx_7 ) ) );
2024 :
2025 0 : mem_fx[5] = Vm0;
2026 0 : move16();
2027 0 : mem_fx[6] = Vm1;
2028 0 : move16();
2029 0 : out = add( mem_fx_11, mem_fx_7 );
2030 :
2031 : /* Upper branch */
2032 : /* Vu0 = mem[0] + filt_coeff[0] * ( *in - mem[1] );
2033 : Vu1 = mem[1] + filt_coeff[1] * ( Vu0 - mem[2] );
2034 : mem[3] = mem[2] + filt_coeff[2] * ( Vu1 - mem[3] ); */
2035 0 : tmp = mult_r( filt_coeff_fx[0], sub( *in++, mem_fx[1] ) );
2036 0 : if ( i == 0 )
2037 : {
2038 0 : Vu0 = add( mem_fx[0], tmp );
2039 : }
2040 0 : if ( i != 0 )
2041 : {
2042 0 : Vu0 = add( *( in - 4 ), tmp );
2043 : }
2044 0 : Vu1 = add( mem_fx[1], mult_r( filt_coeff_fx[1], sub( Vu0, mem_fx[2] ) ) );
2045 0 : mem_fx_3 = add( mem_fx[2], mult_r( filt_coeff_fx[2], sub( Vu1, mem_fx_3 ) ) );
2046 :
2047 0 : mem_fx[1] = Vu0;
2048 0 : move16();
2049 0 : mem_fx[2] = Vu1;
2050 0 : move16();
2051 0 : *out1++ = add( out, mem_fx_3 );
2052 0 : move16();
2053 : }
2054 0 : mem_fx[8] = *( in - 3 );
2055 0 : move16();
2056 0 : mem_fx[4] = *( in - 2 );
2057 0 : move16();
2058 0 : mem_fx[0] = *( in - 1 );
2059 0 : move16();
2060 0 : mem_fx[11] = mem_fx_11;
2061 0 : move16();
2062 0 : mem_fx[7] = mem_fx_7;
2063 0 : move16();
2064 0 : mem_fx[3] = mem_fx_3;
2065 0 : move16();
2066 :
2067 0 : Scale_sig( mem_fx, 12, negate( sc ) );
2068 0 : Scale_sig( out_fx, loop_len, negate( sc ) );
2069 0 : Scale_sig( lp_mem_fx, 3, negate( sc ) );
2070 0 : return;
2071 : }
2072 :
2073 :
2074 : /*-------------------------------------------------------------------*
2075 : * retro_interp4_5_fx()
2076 : *
2077 : *
2078 : *-------------------------------------------------------------------*/
2079 :
2080 544 : void retro_interp4_5_fx(
2081 : const Word16 *syn_fx,
2082 : Word16 *pst_old_syn_fx )
2083 : {
2084 : Word16 *pf5, *pf4;
2085 : Word16 c;
2086 :
2087 : /* resample st->pst_old_syn in a reverse way to preserve time-alignment */
2088 544 : pf4 = (Word16 *) &pst_old_syn_fx[58];
2089 544 : pf5 = (Word16 *) pst_old_syn_fx;
2090 31552 : FOR( c = 0; c < 57; c++ )
2091 : {
2092 31008 : *pf5++ = pf4[0];
2093 31008 : move16();
2094 : /* *pf5++ = 0.2f * pf4[0] + 0.8f * pf4[1]; */
2095 31008 : *pf5++ = mac_r( L_mult( 6554, pf4[0] ), 26214, pf4[1] );
2096 31008 : move16();
2097 : /* *pf5++ = 0.4f * pf4[1] + 0.6f * pf4[2]; */
2098 31008 : *pf5++ = mac_r( L_mult( 13107, pf4[1] ), 19661, pf4[2] );
2099 31008 : move16();
2100 : /* *pf5++ = 0.6f * pf4[2] + 0.4f * pf4[3]; */
2101 31008 : *pf5++ = mac_r( L_mult( 19661, pf4[2] ), 13107, pf4[3] );
2102 31008 : move16();
2103 : /* *pf5++ = 0.8f * pf4[3] + 0.2f * pf4[4]; */
2104 31008 : *pf5++ = mac_r( L_mult( 26214, pf4[3] ), 6554, pf4[4] );
2105 31008 : move16();
2106 31008 : pf4 += 4;
2107 : }
2108 544 : *pf5++ = pf4[0];
2109 544 : move16();
2110 : /* *pf5++ = 0.2f * pf4[0] + 0.8f * pf4[1]; */
2111 544 : *pf5++ = mac_r( L_mult( 6554, pf4[0] ), 26214, pf4[1] );
2112 544 : move16();
2113 : /* *pf5++ = 0.4f * pf4[1] + 0.6f * pf4[2]; */
2114 544 : *pf5++ = mac_r( L_mult( 13107, pf4[1] ), 19661, pf4[2] );
2115 544 : move16();
2116 : /* *pf5++ = 0.6f * pf4[2] + 0.4f * pf4[3]; */
2117 544 : *pf5++ = mac_r( L_mult( 19661, pf4[2] ), 13107, pf4[3] );
2118 544 : move16();
2119 : /* *pf5++ = 0.8f * pf4[3] + 0.2f * syn[0]; */
2120 544 : *pf5++ = mac_r( L_mult( 26214, pf4[3] ), 6554, syn_fx[0] );
2121 544 : move16();
2122 : /* all samples processed: NBPSF_PIT_MAX = 290 = (58*5) */
2123 :
2124 544 : return;
2125 : }
2126 :
2127 :
2128 : /*-------------------------------------------------------------------*
2129 : * retro_interp5_4_fx()
2130 : *
2131 : *
2132 : *-------------------------------------------------------------------*/
2133 :
2134 1222 : void retro_interp5_4_fx(
2135 : Word16 *pst_old_syn_fx )
2136 : {
2137 : Word16 *pf5, *pf4;
2138 : Word16 c;
2139 :
2140 : /* resample st->pst_old_syn in a reverse way to preserve time-alignment */
2141 1222 : pf4 = (Word16 *) &pst_old_syn_fx[NBPSF_PIT_MAX - 1];
2142 1222 : pf5 = pf4;
2143 72098 : FOR( c = 0; c < 58; c++ )
2144 : {
2145 : /* *pf4-- = 0.75f * pf5[0] + 0.25f * pf5[-1]; */
2146 70876 : *pf4-- = mac_r( L_mult( 24576, pf5[0] ), 8192, pf5[-1] );
2147 70876 : move16();
2148 : /* *pf4-- = 0.50f * pf5[-1] + 0.50f * pf5[-2]; */
2149 70876 : *pf4-- = mac_r( L_mult( 16384, pf5[-1] ), 16384, pf5[-2] );
2150 70876 : move16();
2151 : /* *pf4-- = 0.25f * pf5[-2] + 0.75f * pf5[-3]; */
2152 70876 : *pf4-- = mac_r( L_mult( 8192, pf5[-2] ), 24576, pf5[-3] );
2153 70876 : move16();
2154 70876 : *pf4-- = pf5[-4];
2155 70876 : move16();
2156 70876 : pf5 -= 5;
2157 : }
2158 : /* all samples processed: NBPSF_PIT_MAX = 290 = (58*5) */
2159 :
2160 1222 : return;
2161 : }
|