Line data Source code
1 : /*====================================================================================
2 : EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
3 : ====================================================================================*/
4 :
5 :
6 : #include <stdint.h>
7 : #include "options.h"
8 : #include "cnst.h" /* Common constants */
9 : #include "rom_com.h" /* Static table prototypes */
10 : #include "prot_fx.h"
11 : #include "basop_util.h"
12 : #include "ivas_prot_fx.h"
13 : #include "options_warnings.h"
14 :
15 : #define POW_EXC16k_WHTND 1.14e11f /* power of random excitation, length 320 samples, uniform distribution */
16 : #define POW_EXC16k_WHTND_FX_INV_SQRT 6360 // Q31
17 : #define POW_EXC16k_WHTND_FX_INV_SQRT_IN_Q49 1667313793 // Q49
18 : #define POW_EXC16k_WHTND_FX 178125000 // Q-6
19 : #define THR_ENV_ERROR_PLOSIVE 200.0f /* threshold for envelope error used in plosive detection */
20 : #define THR_ENV_ERROR_PLOSIVE_FX 200 /* threshold for envelope error used in plosive detection Q0 */
21 :
22 : /*-----------------------------------------------------------------*
23 : * Local function prototypes
24 : *-----------------------------------------------------------------*/
25 :
26 : static void create_random_vector_fx( Word16 output[], const Word16 length, Word16 seed[] );
27 : static void flip_spectrum_fx( const Word16 input[], Word16 output[], const Word16 length );
28 : static void Calc_st_filt_tbe( Word16 *apond2, Word16 *apond1, Word16 *parcor0, Word16 *sig_ltp_ptr, Word16 *mem_zero );
29 : static void Hilbert_transform_fx( Word32 tmp_R[], Word32 tmp_I[], Word32 *tmpi_R, Word32 *tmpi_I, const Word16 length, const Word16 HB_stage_id );
30 : static void Hilbert_transform_sp_fx( Word16 tmp_R[], Word16 tmp_I[], Word32 *tmpi_R, Word32 *tmpi_I, const Word16 length, const Word16 HB_stage_id );
31 : void Estimate_mix_factors_fx( const Word16 *shb_res, const Word16 Q_shb, const Word16 *exc16kWhtnd, const Word16 Q_bwe_exc, const Word16 *White_exc16k_frac, const Word16 Q_frac, const Word32 pow1, const Word16 Q_pow1, const Word32 pow22, const Word16 Q_pow22, Word16 *vf_modified, Word16 *vf_ind );
32 :
33 : /*-------------------------------------------------------------------*
34 : * swb_tbe_reset()
35 : *
36 : * Reset the SWB TBE encoder
37 : *-------------------------------------------------------------------*/
38 :
39 467539 : void swb_tbe_reset_fx(
40 : Word32 mem_csfilt[],
41 : Word16 mem_genSHBexc_filt_down_shb[],
42 : Word16 state_lpc_syn[],
43 : Word16 syn_overlap[],
44 : Word16 state_syn_shbexc[],
45 : Word16 *tbe_demph,
46 : Word16 *tbe_premph,
47 : Word16 mem_stp_swb[],
48 : Word16 *gain_prec_swb )
49 : {
50 467539 : set32_fx( mem_csfilt, 0, 2 );
51 467539 : set16_fx( mem_genSHBexc_filt_down_shb, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) );
52 467539 : set16_fx( state_lpc_syn, 0, LPC_SHB_ORDER );
53 :
54 467539 : set16_fx( syn_overlap, 0, L_SHB_LAHEAD );
55 467539 : set16_fx( state_syn_shbexc, 0, L_SHB_LAHEAD );
56 :
57 467539 : *tbe_demph = 0;
58 467539 : move16();
59 467539 : *tbe_premph = 0;
60 467539 : move16();
61 :
62 467539 : set16_fx( mem_stp_swb, 0, LPC_SHB_ORDER );
63 467539 : *gain_prec_swb = 16384;
64 467539 : move16(); /*Q14 = 1 */
65 :
66 467539 : return;
67 : }
68 :
69 :
70 : /*-------------------------------------------------------------------*
71 : * swb_tbe_reset_synth()
72 : *
73 : * Reset the extra parameters needed for synthesis of the SWB TBE output
74 : *-------------------------------------------------------------------*/
75 :
76 232715 : void swb_tbe_reset_synth_fx(
77 : Word32 genSHBsynth_Hilbert_Mem[],
78 : Word16 genSHBsynth_state_lsyn_filt_shb_local_fx[],
79 : Word32 genSHBsynth_state_lsyn_filt_shb_local_fx_32[] )
80 : {
81 :
82 232715 : set32_fx( genSHBsynth_Hilbert_Mem, 0, HILBERT_MEM_SIZE );
83 232715 : set16_fx( genSHBsynth_state_lsyn_filt_shb_local_fx, 0, 2 * ALLPASSSECTIONS_STEEP );
84 :
85 232715 : if ( genSHBsynth_state_lsyn_filt_shb_local_fx_32 != NULL )
86 : {
87 232715 : set32_fx( genSHBsynth_state_lsyn_filt_shb_local_fx_32, 0, 2 * ALLPASSSECTIONS_STEEP );
88 : }
89 :
90 232715 : return;
91 : }
92 :
93 :
94 : /*-------------------------------------------------------------------*
95 : * fb_tbe_reset_synth_fx()
96 : *
97 : * reset of FB TBE memories
98 : *-------------------------------------------------------------------*/
99 :
100 156159 : void fb_tbe_reset_synth_fx(
101 : Word32 fbbwe_hpf_mem_fx[][4],
102 : Word16 fbbwe_hpf_mem_fx_Q[],
103 : Word16 *prev_fbbwe_ratio_fx )
104 : {
105 156159 : set32_fx( fbbwe_hpf_mem_fx[0], 0, 4 );
106 156159 : set32_fx( fbbwe_hpf_mem_fx[1], 0, 4 );
107 156159 : set32_fx( fbbwe_hpf_mem_fx[2], 0, 4 );
108 156159 : set32_fx( fbbwe_hpf_mem_fx[3], 0, 4 );
109 156159 : set16_fx( fbbwe_hpf_mem_fx_Q, 0, 4 );
110 156159 : *prev_fbbwe_ratio_fx = 1;
111 156159 : move16(); /*should be set to 1.0f, scaling unknown */
112 :
113 156159 : return;
114 : }
115 :
116 :
117 : /*-------------------------------------------------------------------*
118 : * tbe_celp_exc_offset()
119 : *
120 : * Compute tbe bwe celp excitation offset
121 : *-------------------------------------------------------------------*/
122 :
123 1065446 : Word16 tbe_celp_exc_offset(
124 : const Word16 T0_fx, /* i : Integer pitch Q0 */
125 : const Word16 T0_frac_fx, /* i : Fractional part of the pitch Q1 */
126 : const Word16 L_frame /* i : frame lenght */
127 : )
128 : {
129 : Word16 offset_fx, tmp_fx, tmp1_fx, tmp2_fx, tmp_fac;
130 1065446 : tmp_fac = 320;
131 1065446 : move16(); /*2.5 in Q7*/
132 1065446 : if ( EQ_16( L_frame, L_FRAME16k ) )
133 : {
134 632973 : tmp_fac = 256;
135 632973 : move16(); /*2.0 in Q7*/
136 : }
137 1065446 : tmp_fx = extract_l( L_mult( T0_frac_fx, 32 ) ); /*Q8, 0.25 in Q7*/
138 1065446 : tmp_fx = add( 512, tmp_fx ); /*Q8; 2 in Q8*/
139 1065446 : tmp_fx = mult_r( tmp_fx, tmp_fac ); /*Q16->Q0; 2.5 in Q7 or 2.0 in Q7 */
140 :
141 1065446 : tmp1_fx = sub( T0_fx, 2 ); /*Q0*/
142 :
143 1065446 : tmp2_fx = shl( tmp1_fx, 1 ); /*Q0 */
144 :
145 1065446 : IF( EQ_16( L_frame, L_FRAME ) )
146 : {
147 432473 : tmp2_fx = add( shl( tmp1_fx, 1 ), shr( tmp1_fx, 1 ) ); /*Q0; (5/2 = 2 + 1/2)*/
148 : }
149 :
150 1065446 : offset_fx = add( tmp_fx, tmp2_fx ); /*Q0*/
151 :
152 1065446 : return offset_fx;
153 : }
154 :
155 : /*-------------------------------------------------------------------*
156 : * swb_tbe_celp_exc()
157 : *
158 : * Compute tbe bwe celp excitation
159 : *-------------------------------------------------------------------*/
160 11874 : void tbe_celp_exc(
161 : const Word16 L_frame_fx, /* i : Frame lenght */
162 : const Word16 i_subfr_fx, /* i : sub frame */
163 : const Word16 T0_fx, /* i : Integer pitch Q0 */
164 : const Word16 T0_frac_fx, /* i : Fractional part of the pitch Q1 */
165 : Word16 *error_fx, /* i/o: Error Q5 */
166 : Word16 *bwe_exc_fx /* i/o: bandwitdh extension signal */
167 : )
168 : {
169 : Word16 offset_fx, tmp_fx, i;
170 11874 : IF( EQ_16( L_frame_fx, L_FRAME ) )
171 : {
172 : /*offset = T0 * HIBND_ACB_L_FAC + (int) ((float) T0_frac * 0.25f * HIBND_ACB_L_FAC + 2 * HIBND_ACB_L_FAC + 0.5f) - 2 * HIBND_ACB_L_FAC;
173 : for (i=0; i<L_SUBFR * HIBND_ACB_L_FAC; i++)
174 : {
175 : bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset + (int) error];
176 : }
177 : error += (float) offset - (float) T0 * HIBND_ACB_L_FAC - 0.25f * HIBND_ACB_L_FAC * (float) T0_frac;*/
178 :
179 2684 : offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx );
180 2684 : IF( *error_fx > 0 )
181 : {
182 363 : tmp_fx = shr( *error_fx, 5 ); /*Q0*/
183 : }
184 : ELSE
185 : {
186 2321 : tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/
187 : }
188 :
189 432124 : FOR( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ )
190 : {
191 429440 : bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC - offset_fx + tmp_fx]; // Qx
192 429440 : move16();
193 : }
194 2684 : tmp_fx = extract_l( L_mult( T0_frac_fx, 1 ) ); /*Q3; 0.25 in Q2*/
195 2684 : tmp_fx = add( shl( T0_fx, 3 ), tmp_fx ); /*Q3*/
196 2684 : tmp_fx = extract_l( L_mult( tmp_fx, 5 ) ); /*Q5, 2.5 in Q1*/
197 2684 : tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*Q5*/
198 2684 : *error_fx = add( *error_fx, tmp_fx ); /*Q5*/
199 2684 : move16();
200 : }
201 : ELSE
202 : {
203 : /* offset = T0*2.5 + (int) ((float) T0_frac * 0.25f*2.5 + 2*2.5 + 0.5f) - 2*2.5; - case above*/
204 : /* offset = T0*2 + (int) ((float) T0_frac * 0.25f*2 + 2*2 + 0.5f) - 2*2; - case here*/
205 :
206 : /*(int) ((float) T0_frac * 0.25f*2 + 2*2 + 0.5f)*/
207 9190 : offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx );
208 9190 : IF( *error_fx > 0 )
209 : {
210 4191 : tmp_fx = shr( *error_fx, 5 ); /*Q0*/
211 : }
212 : ELSE
213 : {
214 4999 : tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/
215 : }
216 :
217 1185510 : FOR( i = 0; i < L_SUBFR * 2; i++ )
218 : {
219 1176320 : bwe_exc_fx[i + i_subfr_fx * 2] = bwe_exc_fx[i + i_subfr_fx * 2 - offset_fx + tmp_fx]; // Qx
220 1176320 : move16();
221 : }
222 :
223 : /* error += (float) offset - (float) T0 * 2 - 0.5f * (float) T0_frac;*/
224 9190 : tmp_fx = extract_l( L_mult( T0_frac_fx, 2 ) ); /*Q3; 0.5 in Q2*/
225 9190 : tmp_fx = add( shl( T0_fx, 4 ), tmp_fx ); /* now tmp_fx = "T0_fx*2+ 0.5f*T0_frac_fx" in Q3*/
226 9190 : tmp_fx = shl( tmp_fx, 2 ); /*now above tmp_fx in Q5*/
227 9190 : tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*move offset_fx to Q5, tmp_fx in Q5, ans tmp_fx in Q5*/
228 9190 : *error_fx = add( *error_fx, tmp_fx ); /*error_fx in Q5*/
229 9190 : move16();
230 : }
231 11874 : }
232 :
233 : /*-------------------------------------------------------------------*
234 : * swb_tbe_celp_exc_ivas()
235 : *
236 : * Compute tbe bwe celp excitation
237 : *-------------------------------------------------------------------*/
238 1012669 : void tbe_celp_exc_ivas(
239 : const Word16 element_mode, /* i : element mode */
240 : const Word16 idchan, /* i : channel ID */
241 : const Word16 L_frame_fx, /* i : Frame lenght */
242 : const Word16 L_subfr, /* i : subframe length */
243 : const Word16 i_subfr_fx, /* i : sub frame */
244 : const Word16 T0_fx, /* i : Integer pitch Q0 */
245 : const Word16 T0_frac_fx, /* i : Fractional part of the pitch Q1 */
246 : Word16 *error_fx, /* i/o: Error Q5 */
247 : Word16 *bwe_exc_fx, /* i/o: bandwitdh extension signal Qx */
248 : const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */
249 : )
250 : {
251 : Word16 offset_fx, tmp_fx, i;
252 :
253 1012669 : test();
254 1012669 : test();
255 1012669 : IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag )
256 : {
257 914 : return;
258 : }
259 :
260 1011755 : IF( EQ_16( L_frame_fx, L_FRAME ) )
261 : {
262 : /*offset = T0 * HIBND_ACB_L_FAC + (int) ((float) T0_frac * 0.25f * HIBND_ACB_L_FAC + 2 * HIBND_ACB_L_FAC + 0.5f) - 2 * HIBND_ACB_L_FAC;
263 : for (i=0; i<L_SUBFR * HIBND_ACB_L_FAC; i++)
264 : {
265 : bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset + (int) error];
266 : }
267 : error += (float) offset - (float) T0 * HIBND_ACB_L_FAC - 0.25f * HIBND_ACB_L_FAC * (float) T0_frac;*/
268 :
269 402120 : offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx );
270 402120 : IF( *error_fx > 0 )
271 : {
272 55826 : tmp_fx = shr( *error_fx, 5 ); /*Q0*/
273 : }
274 : ELSE
275 : {
276 346294 : tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/
277 : }
278 :
279 64741320 : FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ )
280 : {
281 64339200 : bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC - offset_fx + tmp_fx];
282 64339200 : move16();
283 : }
284 402120 : tmp_fx = extract_l( L_mult( T0_frac_fx, 1 ) ); /*Q3; 0.25 in Q2*/
285 402120 : tmp_fx = add( shl( T0_fx, 3 ), tmp_fx ); /*Q3*/
286 402120 : tmp_fx = extract_l( L_mult( tmp_fx, 5 ) ); /*Q5, 2.5 in Q1*/
287 402120 : tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*Q5*/
288 402120 : *error_fx = add( *error_fx, tmp_fx ); /*Q5*/
289 402120 : move16();
290 : }
291 : ELSE
292 : {
293 : /* offset = T0*2.5 + (int) ((float) T0_frac * 0.25f*2.5 + 2*2.5 + 0.5f) - 2*2.5; - case above*/
294 : /* offset = T0*2 + (int) ((float) T0_frac * 0.25f*2 + 2*2 + 0.5f) - 2*2; - case here*/
295 :
296 : /*(int) ((float) T0_frac * 0.25f*2 + 2*2 + 0.5f)*/
297 609635 : offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx );
298 609635 : IF( *error_fx > 0 )
299 : {
300 368307 : tmp_fx = shr( *error_fx, 5 ); /*Q0*/
301 : }
302 : ELSE
303 : {
304 241328 : tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/
305 : }
306 :
307 78642915 : FOR( i = 0; i < L_subfr * 2; i++ )
308 : {
309 78033280 : bwe_exc_fx[i + i_subfr_fx * 2] = bwe_exc_fx[i + i_subfr_fx * 2 - offset_fx + tmp_fx];
310 78033280 : move16();
311 : }
312 :
313 : /* error += (float) offset - (float) T0 * 2 - 0.5f * (float) T0_frac;*/
314 609635 : tmp_fx = extract_l( L_mult( T0_frac_fx, 2 ) ); /*Q3; 0.5 in Q2*/
315 609635 : tmp_fx = add( shl( T0_fx, 4 ), tmp_fx ); /* now tmp_fx = "T0_fx*2+ 0.5f*T0_frac_fx" in Q3*/
316 609635 : tmp_fx = shl( tmp_fx, 2 ); /*now above tmp_fx in Q5*/
317 609635 : tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*move offset_fx to Q5, tmp_fx in Q5, ans tmp_fx in Q5*/
318 609635 : *error_fx = add( *error_fx, tmp_fx ); /*error_fx in Q5*/
319 609635 : move16();
320 : }
321 : }
322 :
323 : /*===========================================================================*/
324 : /* FUNCTION : flip_and_downmix_generic_fx() */
325 : /*---------------------------------------------------------------------------*/
326 : /* PURPOSE :flips the spectrum and downmixes the signals, lpf if needed*/
327 : /*---------------------------------------------------------------------------*/
328 : /* INPUT ARGUMENTS */
329 : /* _(Word16[]) input :input spectrum */
330 : /* _(Word16) length :length of spectra */
331 : /* _(Word16) ramp_flag :flag to indicate slow ramp need after switching */
332 : /* _(Word16[]) lpf_num :lpf numerator */
333 : /* _(Word16[]) lpf_den :lpf denominator */
334 : /*---------------------------------------------------------------------------*/
335 : /* OUTPUT ARGUMENTS : */
336 : /* _(Word16[])output : output spectrum */
337 : /*---------------------------------------------------------------------------*/
338 : /* INPUT/OUTPUT ARGUMENTS : */
339 : /* _(Word32[9])mem1 : memory */
340 : /* _(Word32[8])mem2 : memory */
341 : /* _(Word32[8])mem3 : memory */
342 : /* _(Word16) dm_frequency_inHz :Downmix frequency in Hz */
343 : /* _(Word16*) phase_state :Phase state in case frequency isn't */
344 : /* multiple of 50 Hz */
345 : /*---------------------------------------------------------------------------*/
346 : /* RETURN ARGUMENTS : */
347 : /* _ None */
348 : /*---------------------------------------------------------------------------*/
349 1594 : void flip_and_downmix_generic_fx(
350 : Word16 input[], /* i : input spectrum Qx*/
351 : Word16 output[], /* o : output spectrum Qx*/
352 : const Word16 length, /* i : length of spectra */
353 : Word32 mem1_ext[HILBERT_ORDER1], /* i/o: memory Qx+16*/
354 : Word32 mem2_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx+16*/
355 : Word32 mem3_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx+16*/
356 : Word16 *phase_state /* i/o: Phase state in case frequency isn't multiple of 50 Hz */
357 : )
358 : {
359 : Word16 i, j;
360 : Word16 tmp_16[L_FRAME32k + HILBERT_ORDER1];
361 : Word32 tmpi_R[L_FRAME32k];
362 : Word32 tmpi_I[L_FRAME32k];
363 : Word32 tmpi2_R[L_FRAME32k + HILBERT_ORDER2];
364 : Word32 tmpi2_I[L_FRAME32k + HILBERT_ORDER2];
365 : Word32 tmp_R[L_FRAME32k + HILBERT_ORDER2];
366 : Word32 tmp_I[L_FRAME32k + HILBERT_ORDER2];
367 :
368 : /*Word16 s_tmp[L_FRAME32k];*/
369 : /*Word16 factor;*/
370 : Word16 period;
371 1594 : Word16 local_negsin_table17[17] = { 0, -11793, -22005, -29268, -32609, -31580,
372 : -26319, -17530, -6393, 6393, 17530, 26319,
373 : 31580, 32609, 29268, 22005, 11793 }; /* Q15 */
374 1594 : Word16 local_cos_table17[17] = { 32767, 30571, 24279, 14732, 3212, -8739,
375 : -19519, -27683, -32137, -32137, -27683,
376 : -19519, -8739, 3212, 14732, 24279, 30571 }; /* Q15 */
377 : Word16 *local_negsin_table, *local_cos_table;
378 : Word32 L_tmp;
379 :
380 : /* 1850 Hz downmix */
381 1594 : period = 17;
382 1594 : move16();
383 1594 : local_negsin_table = local_negsin_table17;
384 1594 : local_cos_table = local_cos_table17;
385 :
386 :
387 511674 : FOR( i = 0; i < length; i = i + 2 )
388 : {
389 510080 : input[i] = negate( input[i] );
390 510080 : move16();
391 : }
392 :
393 1594 : Copy( input, tmp_16 + HILBERT_ORDER1, length );
394 :
395 : /*Copy32( mem1_ext, tmp_16, 5 ); */
396 9564 : FOR( i = 0; i < HILBERT_ORDER1; i++ )
397 : {
398 7970 : tmp_16[i] = extract_h( mem1_ext[i] ); /* mem1_ext (Qx+16) tmp16 (Qx) */
399 7970 : move16();
400 : }
401 :
402 : /* Hilber transform stage - 0 - single precision */
403 1594 : Hilbert_transform_sp_fx( tmp_16, /* i: Real component of HB */
404 : tmp_16, /* i: Imag component of HB */
405 : tmpi_R, /* o: Real component of HB */
406 : tmpi_I, /* o: Imag. component of HB */
407 : length, /* i: length of the spectra */
408 : 0 ); /* i: HB transform stage */
409 :
410 9564 : FOR( i = 0; i < HILBERT_ORDER1; i++ )
411 : {
412 7970 : mem1_ext[i] = L_deposit_h( tmp_16[i + length] ); /* mem1_ext (Qx+16) tmp16 (Qx) */
413 7970 : move32();
414 : }
415 :
416 1594 : Copy32( mem2_ext, tmpi2_R, HILBERT_ORDER2 );
417 1594 : Copy32( mem3_ext, tmpi2_I, HILBERT_ORDER2 );
418 :
419 : /* Hilber transform stage - 1 */
420 1594 : Hilbert_transform_fx( tmpi_R, /* i: Real component of HB */
421 : tmpi_I, /* i: Imag component of HB */
422 : tmpi2_R, /* o: Real component of HB */
423 : tmpi2_I, /* o: Imag. component of HB */
424 : length, /* i: length of the spectra */
425 : 1 ); /* i: HB transform stage */
426 :
427 1594 : Copy32( mem2_ext + HILBERT_ORDER2, tmp_R, HILBERT_ORDER2 );
428 1594 : Copy32( mem3_ext + HILBERT_ORDER2, tmp_I, HILBERT_ORDER2 );
429 :
430 : /* Hilber transform stage - 2 */
431 1594 : Hilbert_transform_fx( tmpi2_R, /* i: Real component of HB */
432 : tmpi2_I, /* i: Imag component of HB */
433 : tmpi_R, /* o: Real component of HB */
434 : tmpi_I, /* o: Imag. component of HB */
435 : length, /* i: length of the spectra */
436 : 2 ); /* i: HB transform stage */
437 :
438 1594 : Copy32( tmpi2_R + length, mem2_ext, HILBERT_ORDER2 );
439 1594 : Copy32( tmpi2_I + length, mem3_ext, HILBERT_ORDER2 );
440 :
441 : /* Hilber transform stage - 3 */
442 1594 : Hilbert_transform_fx( tmpi_R, /* i: Real component of HB */
443 : tmpi_I, /* i: Imag component of HB */
444 : tmp_R, /* o: Real component of HB */
445 : tmp_I, /* o: Imag. component of HB */
446 : length, /* i: length of the spectra */
447 : 3 ); /* i: HB transform stage */
448 :
449 1594 : Copy32( tmp_R + length, mem2_ext + HILBERT_ORDER2, HILBERT_ORDER2 );
450 1594 : Copy32( tmp_I + length, mem3_ext + HILBERT_ORDER2, HILBERT_ORDER2 );
451 :
452 1594 : if ( GE_16( *phase_state, period ) )
453 : {
454 0 : *phase_state = 0;
455 0 : move16();
456 : }
457 :
458 1594 : i = 0;
459 1594 : move16();
460 1594 : j = *phase_state;
461 1594 : move16();
462 :
463 63100 : WHILE( i < length )
464 : {
465 1081666 : WHILE( ( j < period ) && ( i < length ) )
466 : {
467 1020160 : L_tmp = Mult_32_16( tmp_R[i + 4], local_cos_table[j] ); /*//Qx+16 */
468 1020160 : L_tmp = Madd_32_16( L_tmp, tmp_I[i + 4], local_negsin_table[j] ); /*Qx+16 */
469 1020160 : output[i] = round_fx( L_tmp ); /*Qx */
470 1020160 : move16();
471 1020160 : i++;
472 1020160 : j++;
473 : }
474 :
475 61506 : if ( GE_16( j, period ) )
476 : {
477 60004 : j = 0;
478 60004 : move16();
479 : }
480 : }
481 :
482 1594 : *phase_state = j;
483 1594 : move16();
484 :
485 1594 : return;
486 : }
487 :
488 :
489 50523 : void flip_and_downmix_generic_fx32(
490 : Word32 input[], /* i : input spectrum Qx*/
491 : Word32 output[], /* o : output spectrum Qx*/
492 : const Word16 length, /* i : length of spectra */
493 : Word32 mem1_ext[HILBERT_ORDER1], /* i/o: memory Qx*/
494 : Word32 mem2_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx*/
495 : Word32 mem3_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx*/
496 : Word16 *phase_state /* i/o: Phase state in case frequency isn't multiple of 50 Hz */
497 : )
498 : {
499 : Word16 i, j;
500 : Word32 tmp[L_FRAME32k + HILBERT_ORDER1];
501 : Word32 tmpi_R[L_FRAME32k];
502 : Word32 tmpi_I[L_FRAME32k];
503 : Word32 tmpi2_R[L_FRAME32k + HILBERT_ORDER2];
504 : Word32 tmpi2_I[L_FRAME32k + HILBERT_ORDER2];
505 : Word32 tmp_R[L_FRAME32k + HILBERT_ORDER2];
506 : Word32 tmp_I[L_FRAME32k + HILBERT_ORDER2];
507 :
508 : /*Word16 s_tmp[L_FRAME32k];*/
509 : /*Word16 factor;*/
510 : Word16 period;
511 50523 : Word16 local_negsin_table17[17] = { 0, -11793, -22005, -29268, -32609, -31580,
512 : -26319, -17530, -6393, 6393, 17530, 26319,
513 : 31580, 32609, 29268, 22005, 11793 }; /* Q15 */
514 50523 : Word16 local_cos_table17[17] = { 32767, 30571, 24279, 14732, 3212, -8739,
515 : -19519, -27683, -32137, -32137, -27683,
516 : -19519, -8739, 3212, 14732, 24279, 30571 }; /* Q15 */
517 : Word16 *local_negsin_table, *local_cos_table;
518 : Word32 L_tmp;
519 :
520 : /* 1850 Hz downmix */
521 50523 : period = 17;
522 50523 : move16();
523 50523 : local_negsin_table = local_negsin_table17;
524 50523 : local_cos_table = local_cos_table17;
525 :
526 :
527 15631983 : FOR( i = 0; i < length; i = i + 2 )
528 : {
529 15581460 : input[i] = L_negate( input[i] );
530 15581460 : move16();
531 : }
532 :
533 50523 : Copy32( input, tmp + HILBERT_ORDER1, length );
534 50523 : Copy32( mem1_ext, tmp, HILBERT_ORDER1 );
535 :
536 : /* Hilber transform stage - 0 - single precision */
537 50523 : Hilbert_transform_fx( tmp, /* i: Real component of HB */
538 : tmp, /* i: Imag component of HB */
539 : tmpi_R, /* o: Real component of HB */
540 : tmpi_I, /* o: Imag. component of HB */
541 : length, /* i: length of the spectra */
542 : 0 ); /* i: HB transform stage */
543 :
544 :
545 50523 : Copy32( mem2_ext, tmpi2_R, HILBERT_ORDER2 );
546 50523 : Copy32( mem3_ext, tmpi2_I, HILBERT_ORDER2 );
547 :
548 : /* Hilber transform stage - 1 */
549 50523 : Hilbert_transform_fx( tmpi_R, /* i: Real component of HB */
550 : tmpi_I, /* i: Imag component of HB */
551 : tmpi2_R, /* o: Real component of HB */
552 : tmpi2_I, /* o: Imag. component of HB */
553 : length, /* i: length of the spectra */
554 : 1 ); /* i: HB transform stage */
555 50523 : Copy32( tmp + length, mem1_ext, HILBERT_ORDER1 );
556 50523 : Copy32( mem2_ext + HILBERT_ORDER2, tmp_R, HILBERT_ORDER2 );
557 50523 : Copy32( mem3_ext + HILBERT_ORDER2, tmp_I, HILBERT_ORDER2 );
558 :
559 : /* Hilber transform stage - 2 */
560 50523 : Hilbert_transform_fx( tmpi2_R, /* i: Real component of HB */
561 : tmpi2_I, /* i: Imag component of HB */
562 : tmpi_R, /* o: Real component of HB */
563 : tmpi_I, /* o: Imag. component of HB */
564 : length, /* i: length of the spectra */
565 : 2 ); /* i: HB transform stage */
566 :
567 50523 : Copy32( tmpi2_R + length, mem2_ext, HILBERT_ORDER2 );
568 50523 : Copy32( tmpi2_I + length, mem3_ext, HILBERT_ORDER2 );
569 :
570 : /* Hilber transform stage - 3 */
571 50523 : Hilbert_transform_fx( tmpi_R, /* i: Real component of HB */
572 : tmpi_I, /* i: Imag component of HB */
573 : tmp_R, /* o: Real component of HB */
574 : tmp_I, /* o: Imag. component of HB */
575 : length, /* i: length of the spectra */
576 : 3 ); /* i: HB transform stage */
577 :
578 50523 : Copy32( tmp_R + length, mem2_ext + HILBERT_ORDER2, HILBERT_ORDER2 );
579 50523 : Copy32( tmp_I + length, mem3_ext + HILBERT_ORDER2, HILBERT_ORDER2 );
580 :
581 50523 : if ( GE_16( *phase_state, period ) )
582 : {
583 0 : *phase_state = 0;
584 0 : move16();
585 : }
586 :
587 50523 : i = 0;
588 50523 : move16();
589 50523 : j = *phase_state;
590 50523 : move16();
591 :
592 1930668 : WHILE( LT_16( i, length ) )
593 : {
594 33043065 : WHILE( ( j < period ) && ( i < length ) )
595 : {
596 31162920 : test();
597 31162920 : L_tmp = Mult_32_16( tmp_R[i + 4], local_cos_table[j] ); /*//Qx+16 */
598 31162920 : L_tmp = Madd_32_16( L_tmp, tmp_I[i + 4], local_negsin_table[j] ); /*Qx+16 */
599 31162920 : output[i] = L_tmp; /*Qx */
600 31162920 : move32();
601 31162920 : i++;
602 31162920 : j++;
603 : }
604 :
605 1880145 : if ( GE_16( j, period ) )
606 : {
607 1832533 : j = 0;
608 1832533 : move16();
609 : }
610 : }
611 :
612 50523 : *phase_state = j;
613 50523 : move16();
614 50523 : return;
615 : }
616 :
617 : /*----------------------------------------------
618 : * Hilbert transform - Double precision
619 : *------------------------------------------------*/
620 206874 : static void Hilbert_transform_fx(
621 : Word32 tmp_R[], /* i: Real component of HB */
622 : Word32 tmp_I[], /* i: Real component of HB */
623 : Word32 tmpi_R[], /* o: Real component of HB */
624 : Word32 tmpi_I[], /* o: Imag. component of HB */
625 : const Word16 length, /* i: input length */
626 : const Word16 HB_stage_id /* i: HB transform stage */
627 : )
628 : {
629 : Word16 i, hb_filter_stage, offset;
630 : Word32 L_tmp;
631 :
632 206874 : hb_filter_stage = shl( HB_stage_id, 1 );
633 206874 : offset = 0;
634 206874 : move16();
635 206874 : if ( HB_stage_id == 0 )
636 : {
637 50523 : offset = 1;
638 50523 : move16();
639 : }
640 :
641 206874 : test();
642 206874 : test();
643 206874 : IF( HB_stage_id == 0 || EQ_16( HB_stage_id, 2 ) )
644 : {
645 63448640 : FOR( i = 0; i < length; i++ )
646 : {
647 63346000 : L_tmp = Mult_32_16( tmp_R[i + 4], Hilbert_coeffs_fx[hb_filter_stage][0 + offset] ); /*Qx+15 */
648 63346000 : L_tmp = Madd_32_16( L_tmp, tmp_R[i + 2], Hilbert_coeffs_fx[hb_filter_stage][2 + offset] ); /*Qx+15 */
649 63346000 : L_tmp = Madd_32_16( L_tmp, tmp_R[i], Hilbert_coeffs_fx[hb_filter_stage][4 + offset] ); /*Qx+15 */
650 63346000 : tmpi_R[i] = L_shl( L_tmp, 1 );
651 63346000 : move32(); /*Qx+16 */
652 :
653 63346000 : L_tmp = Mult_32_16( tmp_I[i + 4 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][0] ); /*Qx+15 */
654 63346000 : L_tmp = Madd_32_16( L_tmp, tmp_I[i + 2 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][2] ); /*Qx+15 */
655 63346000 : L_tmp = Madd_32_16( L_tmp, tmp_I[i + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][4] ); /*Qx+15 */
656 63346000 : tmpi_I[i] = L_shl( L_tmp, 1 );
657 63346000 : move32(); /*Qx+16 */
658 : }
659 : }
660 104234 : ELSE IF( EQ_16( HB_stage_id, 1 ) || EQ_16( HB_stage_id, 3 ) )
661 : {
662 64470394 : FOR( i = 0; i < length; i++ )
663 : {
664 :
665 64366160 : L_tmp = Mult_32_16( tmpi_R[i + 2], Hilbert_coeffs_fx[hb_filter_stage][2] ); /*Qx+15 */
666 64366160 : L_tmp = Madd_32_16( L_tmp, tmpi_R[i], Hilbert_coeffs_fx[hb_filter_stage][4] ); /*Qx+15 */
667 64366160 : tmpi_R[i + 4] = L_sub( tmp_R[i], L_shl( L_tmp, 1 ) );
668 64366160 : move32(); /*Qx+16 */
669 :
670 64366160 : L_tmp = Mult_32_16( tmpi_I[i + 2], Hilbert_coeffs_fx[hb_filter_stage + 1][2] ); /*Qx+15 */
671 64366160 : L_tmp = Madd_32_16( L_tmp, tmpi_I[i], Hilbert_coeffs_fx[hb_filter_stage + 1][4] ); /*Qx+15 */
672 64366160 : tmpi_I[i + 4] = L_sub( tmp_I[i], L_shl( L_tmp, 1 ) );
673 64366160 : move32(); /*Qx+16 */
674 : }
675 : }
676 206874 : }
677 :
678 :
679 : /*----------------------------------------------
680 : * Hilbert transform - Single precision Stage 0
681 : *------------------------------------------------*/
682 1594 : static void Hilbert_transform_sp_fx(
683 : Word16 tmp_R[], /* i: Real component of HB */
684 : Word16 tmp_I[], /* i: Real component of HB */
685 : Word32 tmpi_R[], /* o: Real component of HB */
686 : Word32 tmpi_I[], /* o: Imag. component of HB */
687 : const Word16 length, /* i: input length */
688 : const Word16 HB_stage_id /* i: HB transform stage */
689 : )
690 : {
691 : Word16 i, hb_filter_stage, offset;
692 : Word32 L_tmp;
693 :
694 1594 : hb_filter_stage = shl( HB_stage_id, 1 );
695 1594 : offset = 0;
696 1594 : move16();
697 1594 : if ( HB_stage_id == 0 )
698 : {
699 1594 : offset = 1;
700 1594 : move16();
701 : }
702 :
703 : /* Hilbert single precision stage 0 */
704 1021754 : FOR( i = 0; i < length; i++ )
705 : {
706 1020160 : L_tmp = L_mult( tmp_R[i + 4], Hilbert_coeffs_fx[hb_filter_stage][0 + offset] ); /*Qx */
707 1020160 : L_tmp = L_mac( L_tmp, tmp_R[i + 2], Hilbert_coeffs_fx[hb_filter_stage][2 + offset] ); /*Qx */
708 1020160 : L_tmp = L_mac( L_tmp, tmp_R[i], Hilbert_coeffs_fx[hb_filter_stage][4 + offset] ); /*Qx */
709 1020160 : tmpi_R[i] = L_shl( L_tmp, 1 );
710 1020160 : move32(); /*Qx+16 */
711 :
712 1020160 : L_tmp = L_mult( tmp_I[i + 4 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][0] ); /*Qx */
713 1020160 : L_tmp = L_mac( L_tmp, tmp_I[i + 2 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][2] ); /*Qx */
714 1020160 : L_tmp = L_mac( L_tmp, tmp_I[i + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][4] ); /*Qx */
715 1020160 : tmpi_I[i] = L_shl( L_tmp, 1 );
716 1020160 : move32(); /*Qx+16 */
717 : }
718 :
719 1594 : return;
720 : }
721 :
722 :
723 : /*----------------------------------------------
724 : * flip_spectrum_fx
725 : *----------------------------------------------*/
726 90512 : void flip_spectrum_fx(
727 : const Word16 input[], /* i : input spectrum */
728 : Word16 output[], /* o : output spectrum */
729 : const Word16 length /* i : vector length */
730 : )
731 : {
732 : Word16 i;
733 :
734 14572432 : FOR( i = 0; i < length; i = i + 2 )
735 : {
736 14481920 : output[i] = negate( input[i] );
737 14481920 : move16();
738 14481920 : output[i + 1] = input[i + 1];
739 14481920 : move16();
740 : }
741 :
742 90512 : return;
743 : }
744 :
745 :
746 : /*----------------------------------------------------------------------------
747 : * calc_rc0_h
748 : *
749 : * computes 1st parcor from composed filter impulse response
750 : *---------------------------------------------------------------------------*/
751 1077464 : void Calc_rc0_h(
752 : Word16 *h, /* i : impulse response of composed filter */
753 : Word16 *rc0 /* o : 1st parcor */
754 : )
755 : {
756 : Word32 L_acc;
757 : Word16 *ptrs;
758 : Word16 acf0, acf1;
759 : Word16 temp, sh_acf;
760 : Word16 i;
761 :
762 : /* computation of the autocorrelation function acf */
763 1077464 : L_acc = L_mult( h[0], h[0] );
764 21549280 : FOR( i = 1; i < LONG_H_ST; i++ )
765 : {
766 20471816 : L_acc = L_mac( L_acc, h[i], h[i] );
767 : }
768 1077464 : sh_acf = norm_l( L_acc );
769 1077464 : L_acc = L_shl( L_acc, sh_acf );
770 1077464 : acf0 = extract_h( L_acc );
771 :
772 1077464 : ptrs = h;
773 :
774 1077464 : temp = *ptrs++;
775 1077464 : move16();
776 1077464 : L_acc = L_mult( temp, *ptrs );
777 20471816 : FOR( i = 1; i < LONG_H_ST - 1; i++ )
778 : {
779 19394352 : temp = *ptrs++;
780 19394352 : move16();
781 19394352 : L_acc = L_mac( L_acc, temp, *ptrs );
782 : }
783 1077464 : L_acc = L_shl( L_acc, sh_acf );
784 1077464 : acf1 = extract_h( L_acc );
785 :
786 : /* Compute 1st parcor */
787 1077464 : IF( acf0 == 0 )
788 : {
789 0 : *rc0 = 0;
790 0 : move16();
791 0 : return;
792 : }
793 :
794 1077464 : IF( LT_16( acf0, abs_s( acf1 ) ) )
795 : {
796 0 : *rc0 = 0;
797 0 : move16();
798 0 : return;
799 : }
800 1077464 : *rc0 = div_s( abs_s( acf1 ), acf0 );
801 1077464 : move16();
802 1077464 : IF( acf1 > 0 )
803 : {
804 337719 : *rc0 = negate( *rc0 );
805 337719 : move16();
806 : }
807 : }
808 :
809 443304 : void Calc_rc0_h_ivas_enc_fx(
810 : Word16 *h, /* i : impulse response of composed filter */
811 : Word16 *rc0 /* o : 1st parcor */
812 : )
813 : {
814 : Word32 L_acc;
815 : Word16 *ptrs;
816 : Word16 acf0, acf1;
817 : Word16 temp, sh_acf, tmp2;
818 : Word16 i;
819 :
820 : /* computation of the autocorrelation function acf */
821 443304 : L_acc = L_mult( h[0], h[0] );
822 8866080 : FOR( i = 1; i < LONG_H_ST; i++ )
823 : {
824 8422776 : tmp2 = shr( h[i], 2 );
825 8422776 : L_acc = L_mac( L_acc, tmp2, tmp2 );
826 : }
827 443304 : sh_acf = norm_l( L_acc );
828 443304 : L_acc = L_shl( L_acc, sh_acf );
829 443304 : acf0 = extract_h( L_acc );
830 :
831 443304 : ptrs = h;
832 :
833 443304 : temp = *ptrs++;
834 443304 : move16();
835 443304 : L_acc = L_mult( temp, *ptrs );
836 8422776 : FOR( i = 1; i < LONG_H_ST - 1; i++ )
837 : {
838 7979472 : temp = shr( *ptrs++, 2 );
839 7979472 : move16();
840 7979472 : L_acc = L_mac( L_acc, temp, shr( *ptrs, 2 ) );
841 : }
842 443304 : L_acc = L_shl( L_acc, sh_acf );
843 443304 : acf1 = extract_h( L_acc );
844 :
845 : /* Compute 1st parcor */
846 443304 : IF( acf0 == 0 )
847 : {
848 0 : *rc0 = 0;
849 0 : move16();
850 0 : return;
851 : }
852 :
853 443304 : IF( LT_16( acf0, abs_s( acf1 ) ) )
854 : {
855 0 : *rc0 = 0;
856 0 : move16();
857 0 : return;
858 : }
859 443304 : *rc0 = div_s( abs_s( acf1 ), acf0 );
860 443304 : move16();
861 443304 : IF( acf1 > 0 )
862 : {
863 75524 : *rc0 = negate( *rc0 );
864 75524 : move16();
865 : }
866 : }
867 :
868 10832 : static void Calc_st_filt_tbe(
869 : Word16 *apond2, /* i : coefficients of numerator */
870 : Word16 *apond1, /* i : coefficients of denominator */
871 : Word16 *parcor0, /* o : 1st parcor calcul. on composed filter */
872 : Word16 *sig_ltp_ptr, /* i/o: i of 1/A(gamma1) : scaled by 1/g0 */
873 : Word16 *mem_zero /* i : All zero memory */
874 : )
875 : {
876 : Word32 L_g0;
877 :
878 : Word16 h[LONG_H_ST];
879 :
880 : Word16 g0, temp;
881 : Word16 i;
882 10832 : temp = sub( 2, norm_s( apond2[0] ) );
883 : /* compute i.r. of composed filter apond2 / apond1 */
884 10832 : Syn_filt_s( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 );
885 : /* compute 1st parcor */
886 10832 : Calc_rc0_h( h, parcor0 );
887 :
888 : /* compute g0 */
889 10832 : L_g0 = L_mult0( 1, abs_s( h[0] ) );
890 216640 : FOR( i = 1; i < LONG_H_ST; i++ )
891 : {
892 205808 : L_g0 = L_mac0( L_g0, 1, abs_s( h[i] ) );
893 : }
894 10832 : g0 = extract_h( L_shl( L_g0, 14 ) );
895 :
896 : /* Scale signal i of 1/A(gamma1) */
897 10832 : IF( GT_16( g0, 1024 ) )
898 : {
899 10832 : temp = div_s( 1024, g0 ); /* temp = 2**15 / gain0 */
900 877392 : FOR( i = 0; i < L_SUBFR16k; i++ )
901 : {
902 866560 : sig_ltp_ptr[i] = mult_r( sig_ltp_ptr[i], temp );
903 866560 : move16();
904 : }
905 : }
906 10832 : }
907 :
908 443304 : static void Calc_st_filt_tbe_ivas_enc_fx(
909 : Word16 *apond2, /* i : coefficients of numerator */
910 : Word16 *apond1, /* i : coefficients of denominator */
911 : Word16 *parcor0, /* o : 1st parcor calcul. on composed filter */
912 : Word16 *sig_ltp_ptr, /* i/o: i of 1/A(gamma1) : scaled by 1/g0 */
913 : Word16 *mem_zero /* i : All zero memory */
914 : )
915 : {
916 : Word32 L_g0;
917 :
918 : Word16 h[LONG_H_ST];
919 :
920 : Word16 g0, temp;
921 : Word16 i;
922 443304 : temp = sub( 2, norm_s( apond2[0] ) );
923 : /* compute i.r. of composed filter apond2 / apond1 */
924 443304 : syn_filt_fx( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 );
925 : /* compute 1st parcor */
926 443304 : Calc_rc0_h_ivas_enc_fx( h, parcor0 );
927 :
928 : /* compute g0 */
929 443304 : L_g0 = L_mult0( 1, abs_s( h[0] ) );
930 8866080 : FOR( i = 1; i < LONG_H_ST; i++ )
931 : {
932 8422776 : L_g0 = L_mac0( L_g0, 1, abs_s( h[i] ) );
933 : }
934 443304 : g0 = extract_h( L_shl( L_g0, 14 ) );
935 :
936 : /* Scale signal i of 1/A(gamma1) */
937 443304 : IF( GT_16( g0, 1024 ) )
938 : {
939 443304 : temp = div_s( 1024, g0 ); /* temp = 2**15 / gain0 */
940 35907624 : FOR( i = 0; i < L_SUBFR16k; i++ )
941 : {
942 35464320 : sig_ltp_ptr[i] = mult_r( sig_ltp_ptr[i], temp );
943 35464320 : move16();
944 : }
945 : }
946 443304 : }
947 :
948 393792 : static void Calc_st_filt_tbe_ivas_dec_fx(
949 : Word16 *apond2, /* i : coefficients of numerator */
950 : Word16 *apond1, /* i : coefficients of denominator */
951 : Word16 *parcor0, /* o : 1st parcor calcul. on composed filter */
952 : Word16 *sig_ltp_ptr, /* i/o: i of 1/A(gamma1) : scaled by 1/g0 */
953 : Word16 *mem_zero /* i : All zero memory */
954 : )
955 : {
956 : Word32 L_g0;
957 :
958 : Word16 h[LONG_H_ST];
959 :
960 : Word16 g0, temp;
961 : Word16 i;
962 393792 : temp = sub( 2, norm_s( apond2[0] ) );
963 : /* compute i.r. of composed filter apond2 / apond1 */
964 393792 : Syn_filt_s( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 );
965 : /* compute 1st parcor */
966 393792 : Calc_rc0_h( h, parcor0 );
967 :
968 : /* compute g0 */
969 393792 : L_g0 = L_mult0( 1, abs_s( h[0] ) );
970 7875840 : FOR( i = 1; i < LONG_H_ST; i++ )
971 : {
972 7482048 : L_g0 = L_mac0( L_g0, 1, abs_s( h[i] ) );
973 : }
974 393792 : g0 = extract_h( L_shl( L_g0, 14 ) );
975 :
976 : /* Scale signal i of 1/A(gamma1) */
977 393792 : IF( GT_16( g0, 1024 ) )
978 : {
979 393792 : temp = div_s( 1024, g0 ); /* temp = 2**15 / gain0 */
980 31897152 : FOR( i = 0; i < L_SUBFR16k; i++ )
981 : {
982 31503360 : sig_ltp_ptr[i] = mult_r( sig_ltp_ptr[i], temp );
983 31503360 : move16();
984 : }
985 : }
986 393792 : }
987 :
988 847928 : static void filt_mu_fx(
989 : const Word16 *sig_in, /* i : signal (beginning at sample -1) */
990 : Word16 *sig_out, /* o : output signal */
991 : const Word16 parcor0, /* i : parcor0 (mu = parcor0 * gamma3) */
992 : Word16 SubFrameLength /* i : the length of subframe */
993 : )
994 : {
995 : Word16 n;
996 : Word16 mu, ga, temp;
997 : const Word16 *ptrs;
998 : Word16 tmp, exp;
999 847928 : Flag Overflow = 0;
1000 847928 : move32();
1001 :
1002 :
1003 847928 : IF( EQ_16( SubFrameLength, L_SUBFR ) )
1004 : {
1005 0 : IF( parcor0 > 0 )
1006 : {
1007 0 : mu = mult_r( parcor0, GAMMA3_PLUS_FX );
1008 : }
1009 : ELSE
1010 : {
1011 0 : mu = mult_r( parcor0, GAMMA3_MINUS_FX );
1012 : }
1013 : }
1014 : ELSE
1015 : {
1016 847928 : IF( parcor0 > 0 )
1017 : {
1018 708332 : mu = mult_r( parcor0, GAMMA3_PLUS_WB_FX );
1019 : }
1020 : ELSE
1021 : {
1022 139596 : mu = mult_r( parcor0, GAMMA3_MINUS_WB_FX );
1023 : }
1024 : }
1025 :
1026 847928 : tmp = abs_s( mu );
1027 847928 : tmp = sub( 32767, tmp );
1028 847928 : exp = norm_s( tmp );
1029 847928 : tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /*(14 - exp) */
1030 847928 : ga = shl_sat( tmp, exp ); /*Q14 */
1031 :
1032 :
1033 : /* ga = (float) 1. / ((float) 1. - (float) fabs (mu)); */
1034 :
1035 847928 : ptrs = sig_in; /* points on sig_in(-1) */
1036 :
1037 68682168 : FOR( n = 0; n < SubFrameLength; n++ )
1038 : {
1039 67834240 : temp = mult_r( mu, ( *ptrs++ ) );
1040 67834240 : temp = add_sat( temp, *ptrs ); /*Q12 */
1041 67834240 : sig_out[n] = shl_o( mult_r( ga, temp ), 1, &Overflow );
1042 67834240 : move16(); /*Q12 */
1043 : }
1044 :
1045 847928 : return;
1046 : }
1047 :
1048 847928 : static void scale_st_swb(
1049 : const Word16 *sig_in_fx, /* i : postfilter i signal */
1050 : Word16 *sig_out_fx, /* i/o: postfilter o signal */
1051 : Word16 *gain_prec_fx, /* i/o: last value of gain for subframe */
1052 : Word16 SubFrameLength )
1053 : {
1054 : Word16 i;
1055 : Word16 agc_fac1_para_fx;
1056 : Word16 agc_fac_para_fx;
1057 : Word32 L_acc, L_temp;
1058 : Word16 g0_fx, gain_fx;
1059 : Word16 scal_in, scal_out;
1060 : Word16 s_g_in, s_g_out, sh_g0, temp;
1061 :
1062 :
1063 847928 : IF( EQ_16( SubFrameLength, L_SUBFR ) )
1064 : {
1065 0 : agc_fac1_para_fx = AGC_FAC1_FX;
1066 0 : move16();
1067 0 : agc_fac_para_fx = AGC_FAC_FX;
1068 0 : move16();
1069 : }
1070 : ELSE /*IF( SubFrameLength == L_SUBFR16k ) */
1071 : {
1072 847928 : agc_fac1_para_fx = AGC_FAC1_WB_FX;
1073 847928 : move16();
1074 847928 : agc_fac_para_fx = AGC_FAC_WB_FX;
1075 847928 : move16();
1076 : }
1077 :
1078 : /* compute input gain */
1079 847928 : L_acc = L_mult0( 1, abs_s( sig_in_fx[0] ) ); /*0 +Q_bwe_exc-1 */
1080 67834240 : FOR( i = 1; i < SubFrameLength; i++ )
1081 : {
1082 66986312 : L_acc = L_mac0( L_acc, 1, abs_s( sig_in_fx[i] ) ); /*Q_bwe_exc-1 */
1083 : }
1084 :
1085 847928 : g0_fx = 0;
1086 847928 : move16();
1087 847928 : IF( L_acc != 0L )
1088 : {
1089 847045 : scal_in = norm_l( L_acc );
1090 847045 : L_acc = L_shl( L_acc, scal_in );
1091 847045 : s_g_in = extract_h( L_acc ); /* normalized */
1092 :
1093 : /* Compute o gain */
1094 847045 : L_acc = L_mult0( 1, abs_s( sig_out_fx[0] ) );
1095 67763600 : FOR( i = 1; i < SubFrameLength; i++ )
1096 : {
1097 66916555 : L_acc = L_mac0( L_acc, 1, abs_s( sig_out_fx[i] ) );
1098 : }
1099 847045 : IF( L_acc == 0L )
1100 : {
1101 0 : *gain_prec_fx = 0;
1102 0 : move16();
1103 :
1104 0 : return;
1105 : }
1106 :
1107 847045 : scal_out = norm_l( L_acc );
1108 847045 : L_acc = L_shl( L_acc, scal_out );
1109 847045 : s_g_out = extract_h( L_acc ); /* normalized */
1110 :
1111 :
1112 847045 : sh_g0 = add( scal_in, 1 );
1113 847045 : sh_g0 = sub( sh_g0, scal_out ); /* scal_in - scal_out + 1 */
1114 847045 : IF( LT_16( s_g_in, s_g_out ) )
1115 : {
1116 157852 : g0_fx = div_s( s_g_in, s_g_out ); /* s_g_in/s_g_out in Q15 */
1117 : }
1118 : ELSE
1119 : {
1120 689193 : temp = sub( s_g_in, s_g_out ); /* sufficient since normalized */
1121 689193 : g0_fx = shr( div_s( temp, s_g_out ), 1 );
1122 689193 : g0_fx = add( g0_fx, (Word16) 0x4000 ); /* s_g_in/s_g_out in Q14 */
1123 689193 : sh_g0 = sub( sh_g0, 1 );
1124 : }
1125 : /* L_gain_in/L_gain_out in Q14 */
1126 : /* overflows if L_gain_in > 2 * L_gain_out */
1127 847045 : g0_fx = shr_sat( g0_fx, sh_g0 ); /* sh_g0 may be >0, <0, or =0 */ // Need to verify?
1128 :
1129 847045 : g0_fx = mult_r( g0_fx, agc_fac1_para_fx ); /* L_gain_in/L_gain_out * AGC_FAC1_FX */
1130 : }
1131 : /* compute gain(n) = AGC_FAC gain(n-1) + (1-AGC_FAC)gain_in/gain_out */
1132 : /* sig_out(n) = gain(n) sig_out(n) */
1133 847928 : gain_fx = *gain_prec_fx;
1134 847928 : move16(); /*14 */
1135 68682168 : FOR( i = 0; i < SubFrameLength; i++ )
1136 : {
1137 67834240 : temp = mult_r( agc_fac_para_fx, gain_fx ); /*15 +14 -15 =14 */
1138 67834240 : gain_fx = add( temp, g0_fx ); /* in Q14 */
1139 67834240 : L_temp = L_mult( gain_fx, sig_out_fx[i] ); /*14 + Q_bwe_exc-1 +1 = 14 + Q_bwe_exc */
1140 67834240 : L_temp = L_shl_sat( L_temp, 1 ); /*14 + Q_bwe_exc +1 */
1141 67834240 : sig_out_fx[i] = round_fx_sat( L_temp ); /*Q_bwe_exc +15 -16 = Q_bwe_exc-1 */
1142 67834240 : move16();
1143 : }
1144 847928 : *gain_prec_fx = gain_fx;
1145 847928 : move16();
1146 :
1147 847928 : return;
1148 : }
1149 :
1150 10832 : void PostShortTerm_fx(
1151 : Word16 *sig_in, /* i : input signal (pointer to current subframe */
1152 : Word16 *lpccoeff, /* i : LPC coefficients for current subframe */
1153 : Word16 *sig_out, /* o : postfiltered output */
1154 : Word16 *mem_stp, /* i/o: postfilter memory*/
1155 : Word16 *ptr_mem_stp, /* i/o: pointer to postfilter memory*/
1156 : Word16 *ptr_gain_prec, /* i/o: for gain adjustment*/
1157 : Word16 *mem_zero, /* i/o: null memory to compute h_st*/
1158 : const Word16 formant_fac_fx /* i : Strength of post-filter*/
1159 : )
1160 : {
1161 : Word16 apond1_fx[LPC_SHB_ORDER + 1]; /* denominator coeff.*/
1162 : Word16 apond2_fx[LONG_H_ST]; /* numerator coeff. */
1163 : Word16 sig_ltp_fx[L_SUBFR16k + 1]; /* residual signal */
1164 : /*Word16 lpccoeff_fx[LPC_SHB_ORDER+1];//Q12 */
1165 : Word16 g1_fx, g2_fx, parcor0_fx; /*Q15 */
1166 : Word16 tmp;
1167 :
1168 10832 : parcor0_fx = 0;
1169 10832 : move16();
1170 10832 : set16_fx( apond1_fx, 0, LPC_SHB_ORDER + 1 );
1171 10832 : set16_fx( apond2_fx, 0, LONG_H_ST );
1172 10832 : set16_fx( sig_ltp_fx, 0, L_SUBFR16k + 1 );
1173 :
1174 : /* Obtain post-filter weights */
1175 10832 : tmp = extract_h( L_mult( GAMMA_SHARP_FX, formant_fac_fx ) ); /*Q15 */
1176 10832 : g1_fx = add( GAMMA0_FX, tmp ); /*Q15 */
1177 10832 : g2_fx = sub( GAMMA0_FX, tmp ); /*Q15 */
1178 :
1179 : /* Compute weighted LPC coefficients */
1180 10832 : weight_a_fx( lpccoeff, apond1_fx, g1_fx, LPC_SHB_ORDER );
1181 10832 : weight_a_fx( lpccoeff, apond2_fx, g2_fx, LPC_SHB_ORDER );
1182 : /* o: apond1_fx, apond2_fx in Q12 */
1183 :
1184 : /* Compute A(gamma2) residual */
1185 10832 : Residu3_10_fx( apond2_fx, sig_in, sig_ltp_fx + 1, L_SUBFR16k, 0 );
1186 : /* o: sig_ltp_fx in Q_bwe_exc */
1187 :
1188 : /* Save last output of 1/A(gamma1) */
1189 10832 : sig_ltp_fx[0] = *ptr_mem_stp;
1190 10832 : move16();
1191 :
1192 : /* Control short term pst filter gain and compute parcor0 */
1193 10832 : Calc_st_filt_tbe( apond2_fx, apond1_fx, &parcor0_fx, sig_ltp_fx + 1, mem_zero );
1194 : /* o: parcor0 in Q15 */
1195 : /* i/o: sig_ltp_fx in Q_bwe_exc */
1196 :
1197 : /* 1/A(gamma1) filtering, mem_stp is updated */
1198 10832 : Syn_filt_s( 0, apond1_fx, LPC_SHB_ORDER, sig_ltp_fx + 1, sig_ltp_fx + 1, L_SUBFR16k, mem_stp, 1 );
1199 :
1200 : /* (1 + mu z-1) tilt filtering */
1201 10832 : filt_mu_fx( sig_ltp_fx, sig_out, parcor0_fx, L_SUBFR16k );
1202 : /* o: sig_out in Q_bwe_exc */
1203 :
1204 : /* gain control */
1205 10832 : scale_st_swb( sig_in, sig_out, ptr_gain_prec, L_SUBFR16k );
1206 :
1207 10832 : return;
1208 : }
1209 :
1210 443304 : void PostShortTerm_ivas_enc_fx(
1211 : Word16 *sig_in, /* i : input signal (pointer to current subframe */
1212 : Word16 *lpccoeff, /* i : LPC coefficients for current subframe */
1213 : Word16 *sig_out, /* o : postfiltered output */
1214 : Word16 *mem_stp, /* i/o: postfilter memory*/
1215 : Word16 *ptr_mem_stp, /* i/o: pointer to postfilter memory*/
1216 : Word16 *ptr_gain_prec, /* i/o: for gain adjustment*/
1217 : Word16 *mem_zero, /* i/o: null memory to compute h_st*/
1218 : const Word16 formant_fac_fx /* i : Strength of post-filter*/
1219 : )
1220 : {
1221 : Word16 apond1_fx[LPC_SHB_ORDER + 1]; /* denominator coeff.*/
1222 : Word16 apond2_fx[LONG_H_ST]; /* numerator coeff. */
1223 : Word16 sig_ltp_fx[L_SUBFR16k + 1]; /* residual signal */
1224 : /*Word16 lpccoeff_fx[LPC_SHB_ORDER+1];//Q12 */
1225 : Word16 g1_fx, g2_fx, parcor0_fx; /*Q15 */
1226 : Word16 tmp;
1227 :
1228 443304 : parcor0_fx = 0;
1229 443304 : move16();
1230 443304 : set16_fx( apond1_fx, 0, LPC_SHB_ORDER + 1 );
1231 443304 : set16_fx( apond2_fx, 0, LONG_H_ST );
1232 443304 : set16_fx( sig_ltp_fx, 0, L_SUBFR16k + 1 );
1233 :
1234 : /* Obtain post-filter weights */
1235 443304 : tmp = extract_h( L_mult( GAMMA_SHARP_FX, formant_fac_fx ) ); /*Q15 */
1236 443304 : g1_fx = add( GAMMA0_FX, tmp ); /*Q15 */
1237 443304 : g2_fx = sub( GAMMA0_FX, tmp ); /*Q15 */
1238 :
1239 : /* Compute weighted LPC coefficients */
1240 443304 : weight_a_fx( lpccoeff, apond1_fx, g1_fx, LPC_SHB_ORDER );
1241 443304 : weight_a_fx( lpccoeff, apond2_fx, g2_fx, LPC_SHB_ORDER );
1242 : /* o: apond1_fx, apond2_fx in Q12 */
1243 :
1244 : /* Compute A(gamma2) residual */
1245 443304 : Residu3_10_fx( apond2_fx, sig_in, sig_ltp_fx + 1, L_SUBFR16k, 0 );
1246 : /* o: sig_ltp_fx in Q_bwe_exc */
1247 :
1248 : /* Save last output of 1/A(gamma1) */
1249 443304 : sig_ltp_fx[0] = *ptr_mem_stp;
1250 443304 : move16();
1251 :
1252 : /* Control short term pst filter gain and compute parcor0 */
1253 443304 : Calc_st_filt_tbe_ivas_enc_fx( apond2_fx, apond1_fx, &parcor0_fx, sig_ltp_fx + 1, mem_zero );
1254 : /* o: parcor0 in Q15 */
1255 : /* i/o: sig_ltp_fx in Q_bwe_exc */
1256 :
1257 : /* 1/A(gamma1) filtering, mem_stp is updated */
1258 443304 : syn_filt_fx( 0, apond1_fx, LPC_SHB_ORDER, sig_ltp_fx + 1, sig_ltp_fx + 1, L_SUBFR16k, mem_stp, 1 );
1259 :
1260 : /* (1 + mu z-1) tilt filtering */
1261 443304 : filt_mu_fx( sig_ltp_fx, sig_out, parcor0_fx, L_SUBFR16k );
1262 : /* o: sig_out in Q_bwe_exc */
1263 :
1264 : /* gain control */
1265 443304 : scale_st_swb( sig_in, sig_out, ptr_gain_prec, L_SUBFR16k );
1266 :
1267 443304 : return;
1268 : }
1269 :
1270 393792 : void PostShortTerm_ivas_dec_fx(
1271 : Word16 *sig_in, /* i : input signal (pointer to current subframe */
1272 : Word16 *lpccoeff, /* i : LPC coefficients for current subframe */
1273 : Word16 *sig_out, /* o : postfiltered output */
1274 : Word16 *mem_stp, /* i/o: postfilter memory*/
1275 : Word16 *ptr_mem_stp, /* i/o: pointer to postfilter memory*/
1276 : Word16 *ptr_gain_prec, /* i/o: for gain adjustment*/
1277 : Word16 *mem_zero, /* i/o: null memory to compute h_st*/
1278 : const Word16 formant_fac_fx /* i : Strength of post-filter*/
1279 : )
1280 : {
1281 : Word16 apond1_fx[LPC_SHB_ORDER + 1]; /* denominator coeff.*/
1282 : Word16 apond2_fx[LONG_H_ST]; /* numerator coeff. */
1283 : Word16 sig_ltp_fx[L_SUBFR16k + 1]; /* residual signal */
1284 : /*Word16 lpccoeff_fx[LPC_SHB_ORDER+1];//Q12 */
1285 : Word16 g1_fx, g2_fx, parcor0_fx; /*Q15 */
1286 : Word16 tmp;
1287 :
1288 393792 : parcor0_fx = 0;
1289 393792 : move16();
1290 393792 : set16_fx( apond1_fx, 0, LPC_SHB_ORDER + 1 );
1291 393792 : set16_fx( apond2_fx, 0, LONG_H_ST );
1292 393792 : set16_fx( sig_ltp_fx, 0, L_SUBFR16k + 1 );
1293 :
1294 : /* Obtain post-filter weights */
1295 393792 : tmp = extract_h( L_mult( GAMMA_SHARP_FX, formant_fac_fx ) ); /*Q15 */
1296 393792 : g1_fx = add( GAMMA0_FX, tmp ); /*Q15 */
1297 393792 : g2_fx = sub( GAMMA0_FX, tmp ); /*Q15 */
1298 :
1299 : /* Compute weighted LPC coefficients */
1300 393792 : weight_a_fx( lpccoeff, apond1_fx, g1_fx, LPC_SHB_ORDER );
1301 393792 : weight_a_fx( lpccoeff, apond2_fx, g2_fx, LPC_SHB_ORDER );
1302 : /* o: apond1_fx, apond2_fx in Q12 */
1303 :
1304 : /* Compute A(gamma2) residual */
1305 393792 : Residu3_10_fx( apond2_fx, sig_in, sig_ltp_fx + 1, L_SUBFR16k, 0 );
1306 : /* o: sig_ltp_fx in Q_bwe_exc */
1307 :
1308 : /* Save last output of 1/A(gamma1) */
1309 393792 : sig_ltp_fx[0] = *ptr_mem_stp;
1310 393792 : move16();
1311 :
1312 : /* Control short term pst filter gain and compute parcor0 */
1313 393792 : Calc_st_filt_tbe_ivas_dec_fx( apond2_fx, apond1_fx, &parcor0_fx, sig_ltp_fx + 1, mem_zero );
1314 : /* o: parcor0 in Q15 */
1315 : /* i/o: sig_ltp_fx in Q_bwe_exc */
1316 :
1317 : /* 1/A(gamma1) filtering, mem_stp is updated */
1318 393792 : Syn_filt_s( 0, apond1_fx, LPC_SHB_ORDER, sig_ltp_fx + 1, sig_ltp_fx + 1, L_SUBFR16k, mem_stp, 1 );
1319 :
1320 : /* (1 + mu z-1) tilt filtering */
1321 393792 : filt_mu_fx( sig_ltp_fx, sig_out, parcor0_fx, L_SUBFR16k );
1322 : /* o: sig_out in Q_bwe_exc */
1323 :
1324 : /* gain control */
1325 393792 : scale_st_swb( sig_in, sig_out, ptr_gain_prec, L_SUBFR16k );
1326 :
1327 393792 : return;
1328 : }
1329 :
1330 56411 : void flip_spectrum_and_decimby4_fx(
1331 : const Word16 input[], /* i : input spectrum Q_inp */
1332 : Word16 output[], /* o : output spectrum Q_inp */
1333 : const Word16 length, /* i : vector length */
1334 : Word16 mem1[], /* i/o : memory Q_inp */
1335 : Word16 mem2[], /* i/o : memory Q_inp */
1336 : const Word16 ramp_flag /*i: flag to trigger slow ramp-up of output following change of core (HQ to ACELP or 12k8 to 16k ACELP) */
1337 : )
1338 : {
1339 : Word16 i;
1340 : Word16 factor, tmp[L_FRAME16k / 2];
1341 : Word16 tmp1, tmp2;
1342 : Word16 input_change[L_FRAME16k];
1343 :
1344 56411 : IF( ramp_flag )
1345 : {
1346 573 : factor = div_s( 4, length ); /* Q15 */
1347 23493 : FOR( i = 0; i < length / 4; i += 2 )
1348 : {
1349 22920 : tmp1 = extract_l( L_mult0( i, factor ) ); /* Q15 */
1350 22920 : tmp2 = extract_l( L_mult0( add( i, 1 ), factor ) ); /*Q15 */
1351 22920 : input_change[i] = negate( mult_r( input[i], tmp1 ) );
1352 22920 : move16();
1353 22920 : input_change[i + 1] = mult_r( input[i + 1], tmp2 );
1354 22920 : move16();
1355 : }
1356 : }
1357 : ELSE
1358 : {
1359 55838 : i = 0;
1360 55838 : move16();
1361 : }
1362 :
1363 6238643 : FOR( ; i < length; i = i + 2 )
1364 : {
1365 6182232 : input_change[i] = negate( input[i] );
1366 6182232 : move16();
1367 6182232 : input_change[i + 1] = input[i + 1];
1368 6182232 : move16();
1369 : }
1370 :
1371 56411 : Decimate_allpass_steep_fx( input_change, mem1, length, tmp );
1372 56411 : Decimate_allpass_steep_fx( tmp, mem2, shr( length, 1 ), output );
1373 :
1374 56411 : return;
1375 : }
1376 :
1377 :
1378 : /*==========================================================================*/
1379 : /* FUNCTION : void GenShapedWBExcitation_fx () */
1380 : /*--------------------------------------------------------------------------*/
1381 : /* PURPOSE : Synthesize spectrally shaped highband excitation signal for the wideband */
1382 : /*--------------------------------------------------------------------------*/
1383 : /* INPUT ARGUMENTS : */
1384 : /* _Word16 *lpc_shb i : lpc coefficients Q12 */
1385 : /* _Word16 coder_type i : coding type */
1386 : /* _Word16 *bwe_exc_extended i : bwidth extended exciatation Q_bwe_exc*/
1387 : /* _Word16 Q_bwe_exc i : Q format */
1388 : /* _Word16 voice_factors[] i : voicing factor Q15 */
1389 : /*--------------------------------------------------------------------------*/
1390 : /* OUTPUT ARGUMENTS : */
1391 : /* _Word16 *excSHB o : synthesized shaped shb exctiation Q_bwe_exc*/
1392 : /* _Word16 *exc4kWhtnd o : whitened synthesized shb excitation Q_bwe_exc*/
1393 : /*--------------------------------------------------------------------------*/
1394 : /* INPUT/OUTPUT ARGUMENTS : */
1395 : /* _Word32 *mem_csfilt i/o : memory Q_bwe_exc+16*/
1396 : /* _Word16 *mem_genSHBexc_filt_down1 i/o : memory Q_bwe_exc */
1397 : /* _Word16 *mem_genSHBexc_filt_down2 i/o : memory Q_bwe_exc */
1398 : /* _Word16 *mem_genSHBexc_filt_down3 i/o : memory Q_bwe_exc */
1399 : /* _Word16 *state_lpc_syn i/o : memory Q_bwe_exc */
1400 : /* _Word16 bwe_seed[] i/o : random number generator seed */
1401 : /*--------------------------------------------------------------------------*/
1402 : /* RETURN ARGUMENTS : */
1403 : /* _ None */
1404 : /*--------------------------------------------------------------------------*/
1405 : /* CALLED FROM : */
1406 : /*==========================================================================*/
1407 :
1408 14213 : void GenShapedWBExcitation_ivas_fx(
1409 : Word16 *excSHB, /* o : synthesized shaped shb exctiation Q_bwe_exc*/
1410 : const Word16 *lpc_shb, /* i : lpc coefficients Q12*/
1411 : Word16 *exc4kWhtnd, /* o : whitened synthesized shb excitation Q_bwe_exc*/
1412 : Word32 *mem_csfilt, /* i/o : memory Q_bwe_exc+16*/
1413 : Word16 *mem_genSHBexc_filt_down1, /* i/o : memory Q_bwe_exc*/
1414 : Word16 *mem_genSHBexc_filt_down2, /* i/o : memory Q_bwe_exc*/
1415 : Word16 *mem_genSHBexc_filt_down3, /* i/o : memory Q_bwe_exc*/
1416 : Word16 *state_lpc_syn, /* i/o : memory Q_bwe_exc*/
1417 : const Word16 coder_type, /* i : coding type */
1418 : const Word16 *bwe_exc_extended, /* i : bwidth extended exciatation Q_bwe_exc*/
1419 : const Word16 Q_bwe_exc,
1420 : Word16 bwe_seed[], /* i/o : random number generator seed */
1421 : const Word16 voice_factors[], /* i : voicing factor Q15*/
1422 : const Word16 uv_flag, /* i : unvoiced flag */
1423 : const Word16 igf_flag )
1424 : {
1425 : Word16 i, j, k;
1426 : Word16 wht_fil_mem[LPC_WHTN_ORDER_WB];
1427 : Word16 lpc_whtn[LPC_WHTN_ORDER_WB + 1];
1428 : Word16 R_h[LPC_WHTN_ORDER_WB + 2], R_l[LPC_WHTN_ORDER_WB + 2];
1429 : Word16 Q_R;
1430 : Word16 excTmp[L_FRAME16k];
1431 : Word16 excTmp2[L_FRAME16k / 4];
1432 : Word16 excTmp2_frac[L_FRAME16k / 4];
1433 : Word16 exc4k[L_FRAME16k / 4];
1434 : Word16 exc4k_frac[L_FRAME16k / 4];
1435 : Word32 exc4k_32[L_FRAME16k / 4];
1436 : Word32 pow1, pow22;
1437 : Word16 scale;
1438 : Word32 excNoisyEnv[L_FRAME16k / 4];
1439 14213 : Word16 csfilt_num2[1] = { 1638 }; /* Q15*/
1440 14213 : Word16 neg_csfilt_den2[2] = { -32768, 31457 }; /* Q15 */
1441 : Word32 L_tmp, Ltemp1, Ltemp2;
1442 : Word16 temp1, temp2, exp;
1443 : Word32 Lmax;
1444 : Word16 max_val, n1, n2, sc;
1445 : Word32 LepsP[LPC_WHTN_ORDER_WB + 1];
1446 : Word16 tmp_vfac;
1447 : Word16 avg_voice_fac;
1448 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
1449 14213 : Flag Overflow = 0;
1450 14213 : move16();
1451 : #endif
1452 :
1453 : /*0.25f*sum_f(voice_factors, NB_SUBFR)*/
1454 14213 : L_tmp = L_mult( voice_factors[0], 8192 /* 0.25 in Q15 */ );
1455 56852 : FOR( i = 1; i < NB_SUBFR; i++ )
1456 : {
1457 42639 : L_tmp = L_mac( L_tmp, voice_factors[i], 8192 /* 0.25 in Q15 */ );
1458 : }
1459 14213 : avg_voice_fac = round_fx( L_tmp );
1460 :
1461 14213 : test();
1462 14213 : test();
1463 14213 : test();
1464 14213 : test();
1465 14213 : IF( igf_flag != 0 && ( EQ_16( coder_type, VOICED ) || GT_16( avg_voice_fac, 11469 /* 0.35 in Q15 */ ) ) ) /*Q15 -> 0.35f*/
1466 : {
1467 0 : csfilt_num2[0] = 6554;
1468 0 : move16(); /*Q15 -> 0.2f*/
1469 0 : neg_csfilt_den2[1] = 26214;
1470 0 : move16(); /*Q15 -> 0.8f*/
1471 : }
1472 14213 : ELSE IF( igf_flag != 0 && ( EQ_16( coder_type, UNVOICED ) || LT_16( avg_voice_fac, 6654 /* 0.2 in Q15*/ ) ) ) /*Q15 -> 0.2f*/
1473 : {
1474 0 : csfilt_num2[0] = 328;
1475 0 : move16(); /*Q15 -> 0.01f*/
1476 0 : neg_csfilt_den2[1] = 32440;
1477 0 : move16(); /*Q15 -> 0.99f*/
1478 : }
1479 14213 : set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER_WB );
1480 14213 : Decimate_allpass_steep_fx( bwe_exc_extended, mem_genSHBexc_filt_down1, L_FRAME32k, excTmp );
1481 14213 : flip_spectrum_and_decimby4_fx( excTmp, exc4k, L_FRAME16k, mem_genSHBexc_filt_down2, mem_genSHBexc_filt_down3, 0 );
1482 :
1483 14213 : IF( uv_flag )
1484 : {
1485 859 : create_random_vector_fx( exc4kWhtnd, L_FRAME16k / 4, bwe_seed );
1486 859 : IF( LT_16( Q_bwe_exc, 5 ) )
1487 : {
1488 :
1489 69579 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1490 : {
1491 68720 : exc4kWhtnd[i] = shl_r( exc4kWhtnd[i], sub( Q_bwe_exc, 5 ) ); /*Q(Q_bwe_exc)/Q5(if Q_bwe_exc > 5) */
1492 68720 : move16();
1493 : }
1494 : }
1495 : }
1496 : ELSE
1497 : {
1498 13354 : autocorr_fx( exc4k, LPC_WHTN_ORDER_WB + 1, R_h, R_l, &Q_R,
1499 : L_FRAME16k / 4, win_flatten_4k_fx, 0, 1 );
1500 :
1501 : /* Ensure R[0] isn't zero when entering Levinson Durbin */
1502 13354 : R_l[0] = s_max( R_l[0], 1 );
1503 13354 : move16();
1504 40062 : FOR( i = 1; i <= LPC_WHTN_ORDER_WB; i++ )
1505 : {
1506 26708 : L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
1507 26708 : L_Extract( L_tmp, &R_h[i], &R_l[i] );
1508 : }
1509 :
1510 13354 : E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER_WB, NULL );
1511 :
1512 13354 : Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER_WB + 1, sub( norm_s( lpc_whtn[0] ), 2 ) );
1513 :
1514 13354 : fir_fx( exc4k, lpc_whtn, exc4kWhtnd, wht_fil_mem, L_FRAME16k / 4,
1515 : LPC_WHTN_ORDER_WB, 0, 3 );
1516 :
1517 : /* Ensure pow1 is greater than zero when computing normalization */
1518 13354 : max_val = 0;
1519 13354 : move16();
1520 1081674 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1521 : {
1522 1068320 : excTmp2[i] = abs_s( exc4kWhtnd[i] );
1523 1068320 : move16(); /* Q_bwe_exc */
1524 1068320 : max_val = s_max( max_val, excTmp2[i] );
1525 1068320 : move16();
1526 : }
1527 :
1528 13354 : IF( max_val == 0 )
1529 : {
1530 0 : pow1 = 1;
1531 0 : move16();
1532 0 : n1 = 0;
1533 0 : move16();
1534 : }
1535 : ELSE
1536 : {
1537 13354 : n1 = norm_s( max_val );
1538 1081674 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1539 : {
1540 1068320 : excTmp2_frac[i] = shl_o( excTmp2[i], n1, &Overflow ); // Q_bwe_exc + n1
1541 1068320 : move16(); /* Q14 */
1542 : }
1543 13354 : n1 = sub( sub( 14, n1 ), Q_bwe_exc );
1544 13354 : pow1 = 1;
1545 13354 : move32();
1546 1081674 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1547 : {
1548 1068320 : L_tmp = L_mult_o( excTmp2_frac[i], excTmp2_frac[i], &Overflow ); /* Q29 */
1549 1068320 : pow1 = L_add_o( pow1, L_shr( L_tmp, 10 ), &Overflow ); /* Q22 */
1550 : }
1551 : }
1552 :
1553 1081674 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1554 : {
1555 1068320 : excNoisyEnv[i] = L_add_o( *mem_csfilt, L_mult_o( csfilt_num2[0], excTmp2[i], &Overflow ), &Overflow );
1556 1068320 : move32(); /* Q_bwe_exc+16 */
1557 1068320 : *mem_csfilt = Mult_32_16( excNoisyEnv[i], neg_csfilt_den2[1] );
1558 1068320 : move32(); /* Q_bwe_exc+16 */
1559 : }
1560 :
1561 13354 : create_random_vector_fx( exc4k, L_FRAME16k / 4, bwe_seed );
1562 :
1563 : /* Ensure pow22 is greater than zero when computing normalization */
1564 13354 : Lmax = 0;
1565 1081674 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1566 : {
1567 1068320 : exc4k_32[i] = Mult_32_16( excNoisyEnv[i], exc4k[i] );
1568 1068320 : move32(); /* Q_bwe_exc+6 */
1569 1068320 : Lmax = L_max( Lmax, L_abs( exc4k_32[i] ) );
1570 : }
1571 :
1572 13354 : IF( Lmax == 0 )
1573 : {
1574 0 : pow22 = 1;
1575 0 : move16();
1576 0 : n2 = 0;
1577 0 : move16();
1578 0 : set16_fx( exc4k_frac, 0, L_FRAME16k / 4 );
1579 : }
1580 : ELSE
1581 : {
1582 13354 : n2 = norm_l( Lmax );
1583 1081674 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1584 : {
1585 1068320 : exc4k_frac[i] = extract_h( L_shl_o( exc4k_32[i], n2, &Overflow ) ); /* Q(14-n2) */
1586 1068320 : move16();
1587 : }
1588 13354 : n2 = 30 - n2 - ( Q_bwe_exc + 6 );
1589 13354 : pow22 = 1;
1590 13354 : move32();
1591 1081674 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1592 : {
1593 1068320 : L_tmp = L_mult_o( exc4k_frac[i], exc4k_frac[i], &Overflow ); /* Q29 */
1594 1068320 : pow22 = L_add_o( pow22, L_shr( L_tmp, 10 ), &Overflow ); /* Q22 */
1595 : }
1596 : }
1597 :
1598 13354 : test();
1599 13354 : test();
1600 13354 : IF( EQ_16( coder_type, UNVOICED ) || ( igf_flag != 0 && LT_16( avg_voice_fac, 6654 /* 0.2 in Q15 */ ) ) )
1601 : {
1602 388 : L_tmp = root_a_over_b_fx( pow1, sub( 19, shl( n1, 1 ) ), pow22, sub( 19, shl( n2, 1 ) ), &exp );
1603 388 : scale = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /*Q15 */
1604 388 : sc = sub( add( n2, Q_bwe_exc ), 14 );
1605 31428 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1606 : {
1607 31040 : exc4kWhtnd[i] = round_fx_o( L_shl_o( L_mult_o( exc4k_frac[i], scale, &Overflow ), sc, &Overflow ), &Overflow ); /* Q_bwe_exc+n2-10+16+ Q_bwe_exc + n2 -14 -16 = //Q_bwe_exc */
1608 31040 : move16();
1609 : }
1610 : }
1611 : ELSE
1612 : {
1613 12966 : sc = sub( add( n2, Q_bwe_exc ), 14 ); /* Q_bwe_exc+n2-14*/
1614 :
1615 12966 : k = 0;
1616 64830 : FOR( i = 0; i < 4; i++ )
1617 : {
1618 51864 : test();
1619 51864 : IF( igf_flag != 0 && EQ_16( coder_type, VOICED ) )
1620 : {
1621 : /*tmp_vfac = 2*voice_factors[i];
1622 : tmp_vfac = min(1, tmp_vfac);*/
1623 0 : tmp_vfac = shl_o( voice_factors[i], 1, &Overflow );
1624 : }
1625 : ELSE
1626 : {
1627 51864 : tmp_vfac = voice_factors[i];
1628 51864 : move16();
1629 : }
1630 :
1631 51864 : Ltemp1 = root_a_fx( L_deposit_h( tmp_vfac ), 31, &exp );
1632 51864 : temp1 = round_fx_o( L_shl_o( Ltemp1, exp, &Overflow ), &Overflow ); /* Q15 */
1633 51864 : L_tmp = Mult_32_16( pow1, sub( 32767, tmp_vfac ) ); /* Q22*/
1634 51864 : Ltemp2 = root_a_over_b_fx( L_tmp, sub( 19, shl( n1, 1 ) ), pow22, sub( 19, shl( n2, 1 ) ), &exp );
1635 51864 : temp2 = round_fx_o( L_shl_o( Ltemp2, exp, &Overflow ), &Overflow ); /* Q15 */
1636 1089144 : FOR( j = 0; j < L_FRAME16k / 16; j++ )
1637 : {
1638 1037280 : L_tmp = L_mult_o( temp1, exc4kWhtnd[k], &Overflow ); /* Q(16+Q_bwe_exc) */
1639 1037280 : L_tmp = L_add_o( L_tmp, L_shl_o( L_mult_o( temp2, exc4k_frac[k], &Overflow ), sc, &Overflow ), &Overflow ); /* Q(16+Q_bwe_exc) */
1640 1037280 : exc4kWhtnd[k] = round_fx_o( L_tmp, &Overflow ); /* Q_bwe_exc */
1641 1037280 : move16();
1642 1037280 : k++;
1643 : }
1644 : }
1645 : }
1646 : }
1647 :
1648 14213 : Scale_sig( state_lpc_syn, LPC_SHB_ORDER, -Q2 ); /* Q(Q_bwe_exc) -> Q(Q_bwe_exc - 2) */
1649 :
1650 14213 : Syn_filt_s( Q2, lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 );
1651 :
1652 14213 : Scale_sig( state_lpc_syn, LPC_SHB_ORDER, Q2 ); /* Q(Q_bwe_exc - 2) -> Q(Q_bwe_exc) */
1653 14213 : Scale_sig( excSHB, L_FRAME16k / 4, Q2 ); /* Q(Q_bwe_exc - 2) -> Q(Q_bwe_exc) */
1654 :
1655 14213 : return;
1656 : }
1657 :
1658 0 : void GenShapedWBExcitation_fx(
1659 : Word16 *excSHB, /* o : synthesized shaped shb exctiation Q(Q_bwe_exc) */
1660 : const Word16 *lpc_shb, /* i : lpc coefficients Q12 */
1661 : Word16 *exc4kWhtnd, /* o : whitened synthesized shb excitation Q(Q_bwe_exc) */
1662 : Word32 *mem_csfilt, /* i/o : memory Q(Q_bwe_exc+16) */
1663 : Word16 *mem_genSHBexc_filt_down1, /* i/o : memory Q(Q_bwe_exc) */
1664 : Word16 *mem_genSHBexc_filt_down2, /* i/o : memory Q(Q_bwe_exc) */
1665 : Word16 *mem_genSHBexc_filt_down3, /* i/o : memory Q(Q_bwe_exc) */
1666 : Word16 *state_lpc_syn, /* i/o : memory Q(Q_bwe_exc) */
1667 : const Word16 coder_type, /* i : coding type */
1668 : const Word16 *bwe_exc_extended, /* i : bwidth extended exciatation Q(Q_bwe_exc) */
1669 : const Word16 Q_bwe_exc, /* i : Q for memories */
1670 : Word16 bwe_seed[], /* i/o : random number generator seed */
1671 : const Word16 voice_factors[], /* i : voicing factor Q15 */
1672 : const Word16 uv_flag, /* i : unvoiced flag */
1673 : const Word16 igf_flag )
1674 : {
1675 : Word16 i, j, k;
1676 : Word16 wht_fil_mem[LPC_WHTN_ORDER_WB];
1677 : Word16 lpc_whtn[LPC_WHTN_ORDER_WB + 1];
1678 : Word16 R_h[LPC_WHTN_ORDER_WB + 2], R_l[LPC_WHTN_ORDER_WB + 2];
1679 : Word16 Q_R;
1680 : Word16 excTmp[L_FRAME16k];
1681 : Word16 excTmp2[L_FRAME16k / 4];
1682 : Word16 excTmp2_frac[L_FRAME16k / 4];
1683 : Word16 exc4k[L_FRAME16k / 4];
1684 : Word16 exc4k_frac[L_FRAME16k / 4];
1685 : Word32 exc4k_32[L_FRAME16k / 4];
1686 : Word32 pow1, pow22;
1687 : Word16 scale;
1688 : Word32 excNoisyEnv[L_FRAME16k / 4];
1689 0 : Word16 csfilt_num2[1] = { 1638 }; /* Q15*/
1690 0 : Word16 neg_csfilt_den2[2] = { -32768, 31457 }; /* Q15 */
1691 : Word32 L_tmp, Ltemp1, Ltemp2;
1692 : Word16 temp1, temp2, exp;
1693 : Word32 Lmax;
1694 : Word16 max_val, n1, n2, sc;
1695 : Word32 LepsP[LPC_WHTN_ORDER_WB + 1];
1696 : Word16 tmp_vfac;
1697 : Word16 avg_voice_fac;
1698 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
1699 0 : Flag Overflow = 0;
1700 0 : move32();
1701 : #endif
1702 0 : move16();
1703 0 : move16();
1704 0 : move16();
1705 :
1706 : /*0.25f*sum_f(voice_factors, NB_SUBFR)*/
1707 0 : L_tmp = L_mult( voice_factors[0], 8192 /*0.25 in Q15 */ );
1708 0 : FOR( i = 1; i < NB_SUBFR; i++ )
1709 : {
1710 0 : L_tmp = L_mac( L_tmp, voice_factors[i], 8192 /*0.25 in Q15 */ );
1711 : }
1712 0 : avg_voice_fac = round_fx( L_tmp );
1713 :
1714 0 : test();
1715 0 : test();
1716 0 : test();
1717 0 : test();
1718 0 : IF( igf_flag != 0 && ( EQ_16( coder_type, VOICED ) || GT_16( avg_voice_fac, 11469 /* 0.35 in Q15 */ ) ) ) /*Q15 -> 0.35f*/
1719 : {
1720 0 : csfilt_num2[0] = 6554;
1721 0 : move16(); /*Q15 -> 0.2f*/
1722 0 : neg_csfilt_den2[1] = 26214;
1723 0 : move16(); /*Q15 -> 0.8f*/
1724 : }
1725 0 : ELSE IF( igf_flag != 0 && ( EQ_16( coder_type, UNVOICED ) || LT_16( avg_voice_fac, 6654 /* 0.2 in Q15 */ ) ) ) /*Q15 -> 0.2f*/
1726 : {
1727 0 : csfilt_num2[0] = 328;
1728 0 : move16(); /*Q15 -> 0.01f*/
1729 0 : neg_csfilt_den2[1] = 32440;
1730 0 : move16(); /*Q15 -> 0.99f*/
1731 : }
1732 0 : set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER_WB );
1733 0 : Decimate_allpass_steep_fx( bwe_exc_extended, mem_genSHBexc_filt_down1, L_FRAME32k, excTmp );
1734 0 : flip_spectrum_and_decimby4_fx( excTmp, exc4k, L_FRAME16k, mem_genSHBexc_filt_down2, mem_genSHBexc_filt_down3, 0 );
1735 :
1736 0 : IF( uv_flag )
1737 : {
1738 0 : create_random_vector_fx( exc4kWhtnd, L_FRAME16k / 4, bwe_seed );
1739 0 : IF( LT_16( Q_bwe_exc, 5 ) )
1740 : {
1741 0 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1742 : {
1743 0 : exc4kWhtnd[i] = shl_r( exc4kWhtnd[i], sub( Q_bwe_exc, 5 ) ); /*Q(Q_bwe_exc)/Q5(if Q_bwe_exc > 5) */
1744 0 : move16();
1745 : }
1746 : }
1747 : }
1748 : ELSE
1749 : {
1750 0 : autocorr_fx( exc4k, LPC_WHTN_ORDER_WB + 1, R_h, R_l, &Q_R,
1751 : L_FRAME16k / 4, win_flatten_4k_fx, 0, 1 );
1752 :
1753 : /* Ensure R[0] isn't zero when entering Levinson Durbin */
1754 0 : R_l[0] = s_max( R_l[0], 1 );
1755 0 : move16();
1756 0 : FOR( i = 1; i <= LPC_WHTN_ORDER_WB; i++ )
1757 : {
1758 0 : L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
1759 0 : L_Extract( L_tmp, &R_h[i], &R_l[i] );
1760 : }
1761 :
1762 0 : E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER_WB, NULL );
1763 :
1764 0 : Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER_WB + 1, sub( norm_s( lpc_whtn[0] ), 2 ) );
1765 :
1766 0 : fir_fx( exc4k, lpc_whtn, exc4kWhtnd, wht_fil_mem, L_FRAME16k / 4,
1767 : LPC_WHTN_ORDER_WB, 0, 3 );
1768 :
1769 : /* Ensure pow1 is greater than zero when computing normalization */
1770 0 : max_val = 0;
1771 0 : move16();
1772 0 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1773 : {
1774 0 : excTmp2[i] = abs_s( exc4kWhtnd[i] );
1775 0 : move16(); /* Q_bwe_exc */
1776 0 : max_val = s_max( max_val, excTmp2[i] );
1777 0 : move16();
1778 : }
1779 :
1780 0 : IF( max_val == 0 )
1781 : {
1782 0 : pow1 = 1;
1783 0 : move16();
1784 0 : n1 = 0;
1785 0 : move16();
1786 : }
1787 : ELSE
1788 : {
1789 0 : n1 = norm_s( max_val );
1790 0 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1791 : {
1792 0 : excTmp2_frac[i] = shl_o( excTmp2[i], n1, &Overflow );
1793 0 : move16(); /* Q14 */
1794 : }
1795 0 : n1 = sub( sub( 14, n1 ), Q_bwe_exc );
1796 0 : pow1 = 1;
1797 0 : move32();
1798 0 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1799 : {
1800 0 : L_tmp = L_mult_o( excTmp2_frac[i], excTmp2_frac[i], &Overflow ); /* Q29 */
1801 0 : pow1 = L_add_o( pow1, L_shr( L_tmp, 7 ), &Overflow ); /* Q22 */
1802 : }
1803 : }
1804 :
1805 0 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1806 : {
1807 0 : excNoisyEnv[i] = L_add_o( *mem_csfilt, L_mult_o( csfilt_num2[0], excTmp2[i], &Overflow ), &Overflow );
1808 0 : move32(); /* Q_bwe_exc+16 */
1809 0 : *mem_csfilt = Mpy_32_16_1( excNoisyEnv[i], neg_csfilt_den2[1] );
1810 0 : move32(); /* Q_bwe_exc+16 */
1811 : }
1812 :
1813 0 : create_random_vector_fx( exc4k, L_FRAME16k / 4, bwe_seed );
1814 :
1815 : /* Ensure pow22 is greater than zero when computing normalization */
1816 0 : Lmax = 0;
1817 0 : move32();
1818 0 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1819 : {
1820 0 : exc4k_32[i] = Mpy_32_16_1( excNoisyEnv[i], exc4k[i] );
1821 0 : move32(); /* Q_bwe_exc+6 */
1822 0 : Lmax = L_max( Lmax, L_abs( exc4k_32[i] ) );
1823 : }
1824 :
1825 0 : IF( Lmax == 0 )
1826 : {
1827 0 : pow22 = 1;
1828 0 : move16();
1829 0 : n2 = 0;
1830 0 : move16();
1831 0 : set16_fx( exc4k_frac, 0, L_FRAME16k / 4 );
1832 : }
1833 : ELSE
1834 : {
1835 0 : n2 = norm_l( Lmax );
1836 0 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1837 : {
1838 0 : exc4k_frac[i] = extract_h( L_shl_o( exc4k_32[i], n2, &Overflow ) ); /* Q(14-n2) */
1839 0 : move16();
1840 : }
1841 0 : n2 = sub( sub( 30, n2 ), add( Q_bwe_exc, 6 ) );
1842 0 : pow22 = 1;
1843 0 : move32();
1844 0 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1845 : {
1846 0 : L_tmp = L_mult_o( exc4k_frac[i], exc4k_frac[i], &Overflow ); /* Q29 */
1847 0 : pow22 = L_add_o( pow22, L_shr( L_tmp, 7 ), &Overflow ); /* Q22 */
1848 : }
1849 : }
1850 :
1851 0 : test();
1852 0 : test();
1853 0 : IF( EQ_16( coder_type, UNVOICED ) || ( igf_flag != 0 && LT_16( avg_voice_fac, 6654 /*0.2 in Q15 */ ) ) )
1854 : {
1855 0 : L_tmp = root_a_over_b_fx( pow1, sub( 22, shl( n1, 1 ) ), pow22, sub( 22, shl( n2, 1 ) ), &exp );
1856 0 : scale = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /*Q15 */
1857 0 : sc = sub( add( n2, Q_bwe_exc ), 14 );
1858 0 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1859 : {
1860 0 : exc4kWhtnd[i] = round_fx_o( L_shl_o( L_mult_o( exc4k_frac[i], scale, &Overflow ), sc, &Overflow ), &Overflow ); /* Q_bwe_exc+n2-10+16+ Q_bwe_exc + n2 -14 -16 = //Q_bwe_exc */
1861 0 : move16();
1862 : }
1863 : }
1864 : ELSE
1865 : {
1866 0 : sc = sub( add( n2, Q_bwe_exc ), 14 ); /* Q_bwe_exc+n2-14*/
1867 :
1868 0 : k = 0;
1869 0 : move16();
1870 0 : FOR( i = 0; i < 4; i++ )
1871 : {
1872 0 : test();
1873 0 : IF( igf_flag != 0 && EQ_16( coder_type, VOICED ) )
1874 : {
1875 : /*tmp_vfac = 2*voice_factors[i];
1876 : tmp_vfac = min(1, tmp_vfac);*/
1877 0 : tmp_vfac = shl_o( voice_factors[i], 1, &Overflow );
1878 : }
1879 : ELSE
1880 : {
1881 0 : tmp_vfac = voice_factors[i];
1882 0 : move16();
1883 : }
1884 :
1885 0 : Ltemp1 = root_a_fx( L_deposit_h( tmp_vfac ), 31, &exp );
1886 0 : temp1 = round_fx_o( L_shl_o( Ltemp1, exp, &Overflow ), &Overflow ); /* Q15 */
1887 0 : L_tmp = Mpy_32_16_1( pow1, sub( 32767, tmp_vfac ) ); /* Q22*/
1888 0 : Ltemp2 = root_a_over_b_fx( L_tmp, sub( 22, shl( n1, 1 ) ), pow22, sub( 22, shl( n2, 1 ) ), &exp );
1889 0 : temp2 = round_fx_o( L_shl_o( Ltemp2, exp, &Overflow ), &Overflow ); /* Q15 */
1890 0 : FOR( j = 0; j < L_FRAME16k / 16; j++ )
1891 : {
1892 0 : L_tmp = L_mult_o( temp1, exc4kWhtnd[k], &Overflow ); /* Q(16+Q_bwe_exc) */
1893 0 : L_tmp = L_add_o( L_tmp, L_shl_o( L_mult_o( temp2, exc4k_frac[k], &Overflow ), sc, &Overflow ), &Overflow ); /* Q(16+Q_bwe_exc) */
1894 0 : exc4kWhtnd[k] = round_fx_o( L_tmp, &Overflow ); /* Q_bwe_exc */
1895 0 : move16();
1896 0 : k = add( k, 1 );
1897 : }
1898 : }
1899 : }
1900 : }
1901 :
1902 0 : Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 );
1903 :
1904 :
1905 0 : return;
1906 : }
1907 :
1908 : /*-------------------------------------------------------------------*
1909 : * GenWBSynth()
1910 : *
1911 : * Generate 16 KHz sampled highband component from synthesized highband
1912 : *-------------------------------------------------------------------*/
1913 :
1914 6870 : void GenWBSynth_fx(
1915 : const Word16 *input_synspeech, /* i : input synthesized speech Qx*/
1916 : Word16 *shb_syn_speech_16k, /* o : output highband compnent Qx*/
1917 : Word16 *state_lsyn_filt_shb1, /* i/o: memory Qx*/
1918 : Word16 *state_lsyn_filt_shb2 /* i/o: memory Qx*/
1919 : )
1920 : {
1921 : Word16 speech_buf_16k1[L_FRAME16k], speech_buf_16k2[L_FRAME16k];
1922 : Word16 i, maxm, nor;
1923 : Word16 input_synspeech_temp[L_FRAME16k / 4];
1924 :
1925 6870 : maxm = 0;
1926 6870 : move16();
1927 556470 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1928 : {
1929 549600 : maxm = s_max( maxm, abs_s( input_synspeech[i] ) );
1930 : }
1931 48090 : FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
1932 : {
1933 41220 : maxm = s_max( maxm, abs_s( state_lsyn_filt_shb1[i] ) );
1934 : }
1935 48090 : FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
1936 : {
1937 41220 : maxm = s_max( maxm, abs_s( state_lsyn_filt_shb2[i] ) );
1938 : }
1939 :
1940 6870 : nor = s_max( sub( norm_s( maxm ), 3 ), 0 ); /* Headroom = 3 */
1941 6870 : IF( maxm == 0 )
1942 158 : nor = 15;
1943 6870 : move16();
1944 :
1945 6870 : Copy_Scale_sig( input_synspeech, input_synspeech_temp, L_FRAME16k / 4, nor );
1946 6870 : Scale_sig( state_lsyn_filt_shb1, 2 * ALLPASSSECTIONS_STEEP, nor );
1947 6870 : Scale_sig( state_lsyn_filt_shb2, 2 * ALLPASSSECTIONS_STEEP, nor );
1948 6870 : Interpolate_allpass_steep_fx( input_synspeech_temp, state_lsyn_filt_shb1, L_FRAME16k / 4, speech_buf_16k1 );
1949 6870 : Interpolate_allpass_steep_fx( speech_buf_16k1, state_lsyn_filt_shb2, L_FRAME16k / 2, speech_buf_16k2 );
1950 6870 : flip_spectrum_fx( speech_buf_16k2, shb_syn_speech_16k, L_FRAME16k );
1951 :
1952 6870 : Scale_sig( shb_syn_speech_16k, L_FRAME16k, negate( nor ) );
1953 6870 : Scale_sig( state_lsyn_filt_shb1, 2 * ALLPASSSECTIONS_STEEP, negate( nor ) );
1954 6870 : Scale_sig( state_lsyn_filt_shb2, 2 * ALLPASSSECTIONS_STEEP, negate( nor ) );
1955 :
1956 6870 : return;
1957 : }
1958 :
1959 :
1960 12849 : void find_td_envelope_fx(
1961 : const Word16 inp[], /* i : input signal Qx */
1962 : const Word16 len, /* i : length of the input signal */
1963 : const Word16 len_h, /* i : length of the MA filter */
1964 : Word16 mem_h[], /* i/o: memory of the MA filter, length len_h/2 Qx */
1965 : Word16 out[] /* o : td envelope of the input signal Qx */
1966 : )
1967 : {
1968 : Word16 k, K;
1969 : Word16 buf_in[L_FRAME16k + MAX_LEN_MA_FILTER], *p_in, *p_out, *p_prev, w;
1970 : Word16 tmp1, tmp2;
1971 :
1972 12849 : assert( len > 0 && len <= L_FRAME16k );
1973 :
1974 : // len_h is 20 at all calling locations
1975 12849 : K = 10; /* length of FIR filter memory = half of the total filter length */
1976 12849 : move16();
1977 12849 : w = 1639; /* 1 / 20 in Q15 */ /* MA filtering coefficient */
1978 12849 : move16();
1979 :
1980 : /* copy filter memory to the input buffer */
1981 12849 : IF( mem_h != NULL )
1982 : {
1983 4283 : Copy( mem_h, buf_in, K );
1984 : }
1985 : ELSE
1986 : {
1987 : /* no memory available, use the first len_h/2 samples as memory */
1988 8566 : p_in = buf_in;
1989 94226 : FOR( k = 0; k < K; k++ )
1990 : {
1991 85660 : *p_in++ = mult_r( abs_s( inp[k] ), w ); /* Qx */
1992 85660 : move16();
1993 : }
1994 : }
1995 :
1996 : /* take the absolute value of the input signal and copy it to the input buffer */
1997 : /* multiply each value by 1 / filter length */
1998 12849 : p_in = &buf_in[K];
1999 4124529 : FOR( k = 0; k < len; k++ )
2000 : {
2001 4111680 : *p_in++ = mult_r( abs_s( inp[k] ), w ); /* Qx */
2002 4111680 : move16();
2003 : }
2004 :
2005 : /* update filter memory from the end of the input buffer */
2006 12849 : IF( mem_h != NULL )
2007 : {
2008 4283 : Copy( &buf_in[len], mem_h, K );
2009 : }
2010 :
2011 : /* do MA filtering */
2012 12849 : out[0] = sum16_fx( buf_in, len_h );
2013 12849 : move16();
2014 12849 : p_out = &buf_in[0]; /* pointer to leaving sample */
2015 12849 : p_in = &buf_in[len_h]; /* pointer to entering sample*/
2016 3983190 : FOR( k = 1; k < len - K; k++ )
2017 : {
2018 3970341 : tmp1 = *p_out++;
2019 3970341 : move16();
2020 3970341 : tmp2 = *p_in++;
2021 3970341 : move16();
2022 3970341 : out[k] = add( sub( out[k - 1], tmp1 ), tmp2 ); /* Qx */
2023 3970341 : move16();
2024 : }
2025 :
2026 : /* use IIR filtering to extrapolate the last K samples */
2027 12849 : p_in = &buf_in[len - K];
2028 12849 : p_out = &out[len - K];
2029 12849 : p_prev = p_out - 1;
2030 141339 : FOR( k = 0; k < K; k++ )
2031 : {
2032 128490 : tmp1 = *p_in++;
2033 128490 : move16();
2034 128490 : tmp2 = *p_prev++;
2035 128490 : move16();
2036 128490 : *p_out++ = add( mult_r( 1638 /* 0.05f in Q15 */, ( tmp1 ) ), mult_r( 31130 /* 0.95f in Q15 */, ( tmp2 ) ) );
2037 128490 : move16();
2038 : }
2039 :
2040 12849 : return;
2041 : }
2042 :
2043 :
2044 : /*======================================================================================*/
2045 : /* FUNCTION : void GenShapedSHBExcitation_fx () */
2046 : /*--------------------------------------------------------------------------------------*/
2047 : /* PURPOSE : Synthesize spectrally shaped highband excitation signal */
2048 : /*--------------------------------------------------------------------------------------*/
2049 : /* INPUT ARGUMENTS : */
2050 : /* _(Word16) coder_type : coding type Q_bwe_exc */
2051 : /* _(Word16) bwidth : input signal bwidth Q0 */
2052 : /* _(Word16*) bwe_exc_extended :bwidth extended exciatation Q_bwe_exc */
2053 : /* _(Word16[]) voice_factors :voicing factors Q15 */
2054 : /* _(Word16*) lpc_shb :lpc coefficients Q12 */
2055 : /* _(Word16*) Q_bwe_exc :Q Format of bwe_exc_extended */
2056 : /* _(Word16) L_frame : Frame length - determines whether 12.8 or 16kHz core */
2057 : /* _(Word16) last_L_frame : last L_frame */
2058 : /*--------------------------------------------------------------------------------------*/
2059 : /* OUTPUT ARGUMENTS : */
2060 : /* _(Word16*)excSHB :synthesized shaped shb excitation Q_bwe_exc */
2061 : /* _(Word16*)White_exc16k :white excitation for the Fullband extension Q_bwe_exc */
2062 : /* _(Word16*)slope :slope +ve (high freq > low freq), -ve or neutral Q12 */
2063 : /*--------------------------------------------------------------------------------------*/
2064 : /* INPUT/OUTPUT ARGUMENTS : */
2065 : /* _(Word16*)mem_csfilt :memory */
2066 : /* _(Word16*)mem_genSHBexc_filt_down_shb :memory */
2067 : /* _(Word16*)state_lpc_syn :memory */
2068 : /* _(Word16[]) bwe_seed :random number generator seed */
2069 : /* _(Word16[]) lpf_14k_mem :memory */
2070 : /* _(Word32[])Hilbert_Mem :memory */
2071 : /*--------------------------------------------------------------------------------------*/
2072 : /* RETURN ARGUMENTS : */
2073 : /* _ None */
2074 : /*--------------------------------------------------------------------------------------*/
2075 : /* CALLED FROM : RX */
2076 : /*======================================================================================*/
2077 2708 : void GenShapedSHBExcitation_fx(
2078 : Word16 *excSHB, /* o : synthesized shaped shb excitation Q_bwe_exc*/
2079 : const Word16 *lpc_shb, /* i : lpc coefficients Q12*/
2080 : Word16 *White_exc16k_FB, /* o : white excitation for the Fullband extension Q_bwe_exc */
2081 : Word32 *mem_csfilt, /* i/o: memory */
2082 : Word16 *mem_genSHBexc_filt_down_shb, /* i/o: memory */
2083 : Word16 *state_lpc_syn, /* i/o: memory */
2084 : const Word16 coder_type, /* i : coding type */
2085 : const Word16 *bwe_exc_extended, /* i : bwidth extended excitation */
2086 : Word16 bwe_seed[], /* i/o: random number generator seed */
2087 : Word16 voice_factors[], /* i : voicing factor*/
2088 : const Word16 extl, /* i : extension layer */
2089 : Word16 *tbe_demph, /* i/o: de-emphasis memory */
2090 : Word16 *tbe_premph, /* i/o: pre-emphasis memory */
2091 : Word16 *lpc_shb_sf, /* i: LP coefficients */
2092 : const Word32 shb_ener_sf_32, /* i: input shb ener, Q31 */
2093 : Word16 *shb_res_gshape, /* i: input res gain shape, Q14 */
2094 : Word16 *shb_res,
2095 : Word16 *vf_ind,
2096 : const Word16 formant_fac, /* i : Formant sharpening factor [0..1] */
2097 : Word16 fb_state_lpc_syn[], /* i/o: memory */
2098 : Word16 *fb_tbe_demph, /* i/o: fb de-emphasis memory */
2099 : Word16 *Q_bwe_exc,
2100 : Word16 *Q_bwe_exc_fb,
2101 : const Word16 Q_shb,
2102 : Word16 n_mem2, /* i : n_mem2 scale factor to adjust 24.4/32kbps memories */
2103 : Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */
2104 : const Word32 bitrate,
2105 : const Word16 prev_bfi )
2106 : {
2107 : Word16 i, j, k;
2108 : Word16 wht_fil_mem[LPC_WHTN_ORDER];
2109 : Word16 lpc_whtn[LPC_WHTN_ORDER + 1];
2110 : Word16 R_h[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech MSB */
2111 : Word16 R_l[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech LSB */
2112 : Word16 Q_R;
2113 : Word32 LepsP[LPC_WHTN_ORDER + 1];
2114 : Word16 exc32k[L_FRAME32k], exc16k[L_FRAME16k];
2115 : Word32 pow1, pow22;
2116 : Word16 scale, temp1, temp2;
2117 :
2118 : Word16 excTmp2[L_FRAME16k];
2119 : Word16 *White_exc16k;
2120 : Word16 excNoisyEnv[L_FRAME16k];
2121 2708 : Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */
2122 2708 : move16();
2123 2708 : Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */
2124 2708 : move16();
2125 2708 : move16();
2126 : Word16 varEnvShape;
2127 2708 : Word16 fb_deemph_fac = 15729; /*0.48f in Q15 */
2128 2708 : move16();
2129 : Word16 exc16kWhtnd[L_FRAME16k];
2130 :
2131 : Word32 L_tmp;
2132 : Word16 vf_tmp;
2133 : Word16 tmp, exp, tmp2;
2134 : Word16 voiceFacEst[NB_SUBFR16k];
2135 : Word16 zero_mem[LPC_SHB_ORDER];
2136 : Word32 syn_shb_ener_sf[4];
2137 : Word16 tempSHB[80];
2138 : Word16 Q_pow1, Q_pow22;
2139 :
2140 : Word32 L_tmp2, L_tmp3, L_tmp4;
2141 : Word16 temp;
2142 :
2143 : Word16 White_exc16k_FB_temp[L_FRAME16k];
2144 : Word32 White_exc16k_32[L_FRAME16k];
2145 : Word16 Q_temp;
2146 : Word16 prev_Q_bwe_exc_fb;
2147 :
2148 2708 : set16_fx( zero_mem, 0, LPC_SHB_ORDER );
2149 2708 : set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER );
2150 :
2151 869268 : FOR( i = 0; i < L_FRAME32k; i = i + 2 )
2152 : {
2153 866560 : exc32k[i] = negate( bwe_exc_extended[i] );
2154 866560 : move16();
2155 866560 : exc32k[i + 1] = bwe_exc_extended[i + 1];
2156 866560 : move16();
2157 : }
2158 :
2159 : /* Decimate by 2 */
2160 2708 : Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k );
2161 : /* i: exc32k in Q_bwe_exc */
2162 : /* o: exc16k in Q_bwe_exc */
2163 :
2164 2708 : autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 );
2165 : /* Ensure R[0] isn't zero when entering Levinson Durbin */
2166 2708 : R_l[0] = s_max( R_l[0], 1 );
2167 2708 : move16();
2168 13540 : FOR( i = 1; i <= LPC_WHTN_ORDER; i++ )
2169 : {
2170 10832 : L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
2171 10832 : L_Extract( L_tmp, &R_h[i], &R_l[i] );
2172 : }
2173 2708 : E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL );
2174 2708 : Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) );
2175 2708 : fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 );
2176 :
2177 : /* i: exc16k in Q_bwe_exc */
2178 : /* o: exc16kWhtnd in Q_bwe_exc */
2179 2708 : IF( GE_32( bitrate, ACELP_24k40 ) )
2180 : {
2181 1214 : temp2 = 0;
2182 1214 : move16();
2183 6070 : FOR( j = 0; j < 4; j++ )
2184 : {
2185 4856 : temp1 = shb_res_gshape[j];
2186 4856 : move16();
2187 393336 : FOR( i = 0; i < 80; i++ )
2188 : {
2189 388480 : exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) );
2190 388480 : move16();
2191 : /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */
2192 : }
2193 4856 : temp2 = add( temp2, 80 );
2194 : }
2195 : }
2196 :
2197 : /* Estimate pow1 associated with Low band nonlinear extended excitation */
2198 : /* pow1=0.00001f */
2199 2708 : tmp = sub( shl( *Q_bwe_exc, 1 ), 31 );
2200 2708 : pow1 = L_shl_sat( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */
2201 869268 : FOR( k = 0; k < L_FRAME16k; k++ )
2202 : {
2203 : /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/
2204 866560 : excTmp2[k] = abs_s( exc16kWhtnd[k] );
2205 866560 : move16();
2206 :
2207 : /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */
2208 866560 : pow1 = L_mac0_sat( pow1, exc16kWhtnd[k], exc16kWhtnd[k] ); /* 2*Q_bwe_exc */
2209 : }
2210 2708 : Q_pow1 = shl( *Q_bwe_exc, 1 );
2211 :
2212 2708 : test();
2213 2708 : IF( ( LE_32( bitrate, ACELP_13k20 ) ) && ( GE_32( bitrate, ACELP_7k20 ) ) )
2214 : {
2215 : /* varEnvShape = mean_fx(voice_factors, 4); */
2216 : /* unroll the loop */
2217 1494 : L_tmp = L_mult( voice_factors[0], 8192 );
2218 1494 : L_tmp = L_mac( L_tmp, voice_factors[1], 8192 );
2219 1494 : L_tmp = L_mac( L_tmp, voice_factors[2], 8192 );
2220 1494 : varEnvShape = mac_r( L_tmp, voice_factors[3], 8192 ); /* varEnvShape in Q15 */
2221 : }
2222 : ELSE /* 16k core */
2223 : {
2224 : /* varEnvShape = mean_fx(voice_factors, 5); */
2225 : /* unroll the loop */
2226 1214 : L_tmp = L_mult( voice_factors[0], 6554 );
2227 1214 : L_tmp = L_mac( L_tmp, voice_factors[1], 6554 );
2228 1214 : L_tmp = L_mac( L_tmp, voice_factors[2], 6554 );
2229 1214 : L_tmp = L_mac( L_tmp, voice_factors[3], 6554 );
2230 1214 : varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 ); /* varEnvShape in Q15 */
2231 : }
2232 :
2233 2708 : IF( EQ_16( extl, FB_TBE ) )
2234 : {
2235 : /*pow(varEnvShape,3) */
2236 0 : tmp = mult_r( varEnvShape, varEnvShape );
2237 0 : tmp = mult_r( tmp, varEnvShape );
2238 :
2239 : /* max_val((0.68f - (float)pow(varEnvShape, 3)), 0.48f); */
2240 0 : fb_deemph_fac = sub( 22282 /*0.68f Q15*/, tmp );
2241 0 : fb_deemph_fac = s_max( fb_deemph_fac, 15729 /*0.48f Q15*/ );
2242 : }
2243 :
2244 : /*varEnvShape = 1.09875f - 0.49875f * varEnvShape; */
2245 2708 : varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape );
2246 :
2247 : /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */
2248 2708 : varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ );
2249 2708 : varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ );
2250 2708 : varEnvShape = shl( varEnvShape, 1 );
2251 2708 : csfilt_num2[0] = sub( MAX_16, varEnvShape );
2252 2708 : move16();
2253 2708 : neg_csfilt_den2[1] = varEnvShape;
2254 2708 : move16();
2255 :
2256 2708 : test();
2257 2708 : test();
2258 2708 : test();
2259 2708 : IF( *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) )
2260 : {
2261 : /* pre-init smoothing filter to avoid energy drop outs */
2262 60 : L_tmp = L_mult( excTmp2[0], 1638 );
2263 1200 : FOR( i = 1; i < L_SUBFR16k / 4; i++ )
2264 : {
2265 1140 : L_tmp = L_mac( L_tmp, excTmp2[i], 1638 ); /*1638 = 1/20 in Q15*/
2266 : }
2267 : /*L_tmp = sum(excTmp2, L_SUBFR16k/4)*(1/20) where L_SUBFR16k/4 =20 */
2268 :
2269 : /* don't apply for FB in case the FB start-frame was potentially lost - White_exc16k is very sensitive to enery mismatch between enc - dec */
2270 : /* rather stick to the more conservative approach, to avoid potential clippings */
2271 60 : test();
2272 60 : IF( !( prev_bfi && EQ_16( extl, FB_TBE ) ) )
2273 : {
2274 : /* use weak smoothing for 1st frame after switching to make filter recover more quickly */
2275 60 : varEnvShape = 26214 /*0.8f Q15*/;
2276 60 : move16();
2277 60 : csfilt_num2[0] = sub( MAX_16, varEnvShape );
2278 60 : move16();
2279 60 : neg_csfilt_den2[1] = varEnvShape;
2280 60 : move16();
2281 : }
2282 :
2283 60 : *mem_csfilt = Mult_32_16( L_tmp, varEnvShape );
2284 60 : move32();
2285 : }
2286 : {
2287 : /* Track the low band envelope */
2288 2708 : L_tmp = *mem_csfilt;
2289 2708 : move32();
2290 869268 : FOR( i = 0; i < L_FRAME16k; i++ )
2291 : {
2292 866560 : excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], excTmp2[i] );
2293 866560 : move16();
2294 : /* excNoisyEnv : Q_bwe_exc,
2295 : *mem_csfilt: Q_bwe_exc+16, excTmp2: Q_bwe_exc, csfilt_num2[0] Q15 */
2296 866560 : L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_bwe_exc+16 */
2297 : }
2298 2708 : *mem_csfilt = L_tmp;
2299 2708 : move32();
2300 : }
2301 : {
2302 : /* create a random excitation - Reuse exc16k memory */
2303 2708 : White_exc16k = exc16k;
2304 2708 : create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed );
2305 2708 : create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed );
2306 :
2307 2708 : L_tmp = L_deposit_l( 0 );
2308 2708 : tmp = add( *Q_bwe_exc, 1 );
2309 869268 : FOR( k = 0; k < L_FRAME16k; k++ )
2310 : {
2311 866560 : L_tmp4 = L_shl_sat( L_deposit_l( White_exc16k[k] ), tmp );
2312 866560 : if ( excNoisyEnv[k] != 0 )
2313 : {
2314 864891 : L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_bwe_exc) +5 +1*/
2315 : }
2316 866560 : White_exc16k_32[k] = L_tmp4;
2317 866560 : move32();
2318 866560 : L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
2319 : }
2320 2708 : Q_temp = norm_l( L_tmp );
2321 2708 : if ( L_tmp == 0 )
2322 : {
2323 0 : Q_temp = 31;
2324 0 : move16();
2325 : }
2326 : /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/
2327 : /* White_exc16k in Q6 */
2328 :
2329 : /* calculate pow22 */
2330 : /* pow22=0.00001f */
2331 2708 : tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 );
2332 2708 : pow22 = L_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc-NOISE_QADJ) */
2333 2708 : tmp = sub( NOISE_QFAC, 5 );
2334 869268 : FOR( k = 0; k < L_FRAME16k; k++ )
2335 : {
2336 : /* White_exc16k[k] *= excNoisyEnv[k]; */
2337 866560 : White_exc16k[k] = mult_r( excNoisyEnv[k], shl( White_exc16k[k], tmp ) );
2338 866560 : move16();
2339 : /* i: excNoisyEnv in (Q_bwe_exc) */
2340 : /* i: White_exc16k in Q6 */
2341 : /* o: White_exc16k in (Q_bwe_exc-NOISE_QADJ) */
2342 : /* pow22 += White_exc16k[k] * White_exc16k[k]; */
2343 866560 : pow22 = L_mac0_sat( pow22, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_bwe_exc-NOISE_QADJ)*/
2344 : }
2345 : /*Q_pow22 = sub( shl(*Q_bwe_exc,1), 18 );*/
2346 2708 : Q_pow22 = shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 );
2347 : }
2348 :
2349 2708 : IF( GE_32( bitrate, ACELP_24k40 ) )
2350 : {
2351 1214 : IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */
2352 : {
2353 : {
2354 604 : Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k,
2355 604 : ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind );
2356 604 : tmp = voiceFacEst[0];
2357 604 : move16();
2358 604 : tmp2 = MAX_16;
2359 604 : move16();
2360 604 : if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
2361 : {
2362 580 : tmp2 = 26214 /*0.8f Q15*/;
2363 580 : move16();
2364 : }
2365 : }
2366 : }
2367 : ELSE /* decoder side */
2368 : {
2369 : { /* *vf_ind is an integer scale by 0.125f*/
2370 610 : tmp = shl( *vf_ind, ( 15 - 3 ) );
2371 610 : tmp2 = MAX_16;
2372 610 : move16();
2373 610 : if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
2374 : {
2375 607 : tmp2 = 26214 /*0.8f Q15*/;
2376 607 : move16();
2377 : }
2378 : }
2379 : }
2380 : {
2381 1214 : voice_factors[0] = mult_r( voice_factors[0], tmp2 );
2382 1214 : move16();
2383 1214 : voice_factors[1] = mult_r( voice_factors[1], tmp2 );
2384 1214 : move16();
2385 1214 : voice_factors[2] = mult_r( voice_factors[2], tmp2 );
2386 1214 : move16();
2387 1214 : voice_factors[3] = mult_r( voice_factors[3], tmp2 );
2388 1214 : move16();
2389 1214 : voice_factors[4] = mult_r( voice_factors[4], tmp2 );
2390 1214 : move16();
2391 : }
2392 : }
2393 :
2394 2708 : tmp = sub( Q_temp, 3 );
2395 869268 : FOR( k = 0; k < L_FRAME16k; k++ )
2396 : {
2397 866560 : White_exc16k_FB[k] = round_fx( L_shl( White_exc16k_32[k], tmp ) ); /* Q_bwe_exc +5 +1 +Q_temp -16 -3 */
2398 : }
2399 2708 : prev_Q_bwe_exc_fb = *Q_bwe_exc_fb;
2400 2708 : move16();
2401 2708 : *Q_bwe_exc_fb = sub( add( *Q_bwe_exc, Q_temp ), 13 );
2402 2708 : move16();
2403 2708 : deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph );
2404 : /* i/o: White_exc16k (Q_bwe_exc-NOISE_QADJ) */
2405 : /* i: tbe_demph (Q_bwe_exc-NOISE_QADJ) */
2406 : {
2407 2708 : IF( EQ_16( coder_type, UNVOICED ) )
2408 : {
2409 57 : L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
2410 57 : scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */
2411 18297 : FOR( k = 0; k < L_FRAME16k; k++ )
2412 : {
2413 : /* White_exc16k: (Q_bwe_exc-NOISE_QADJ), scale: Q15 */
2414 18240 : L_tmp = L_mult( White_exc16k[k], scale );
2415 : /* L_tmp: (Q_bwe_exc-NOISE_QADJ) + 15 + 1 */
2416 18240 : exc16kWhtnd[k] = round_fx( L_shl( L_tmp, NOISE_QADJ ) );
2417 18240 : move16();
2418 : /* exc16kWhtnd: Q_bwe_exc */
2419 : }
2420 57 : PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph );
2421 : /* i/o: exc16kWhtnd (Q_bwe_exc) */
2422 : /* i/o: tbe_premph (Q_bwe_exc) */
2423 : }
2424 : ELSE
2425 : {
2426 : Word16 nbSubFr, lSubFr;
2427 : Word16 tempQ15;
2428 : Word32 tempQ31;
2429 : /*nbSubFr = ( bitrate < ACELP_24k40 )? NB_SUBFR : NB_SUBFR16k;*/
2430 2651 : nbSubFr = NB_SUBFR16k;
2431 2651 : lSubFr = ( L_FRAME16k / NB_SUBFR16k );
2432 2651 : IF( LT_32( bitrate, ACELP_24k40 ) )
2433 : {
2434 1494 : nbSubFr = NB_SUBFR;
2435 1494 : move16();
2436 1494 : lSubFr = ( L_FRAME16k / NB_SUBFR );
2437 1494 : move16();
2438 : }
2439 2651 : k = 0;
2440 14412 : FOR( i = 0; i < nbSubFr; i++ )
2441 : {
2442 11761 : test();
2443 11761 : IF( EQ_16( coder_type, VOICED ) && ( LT_32( bitrate, ACELP_24k40 ) ) )
2444 : {
2445 1716 : exp = 0;
2446 1716 : move16();
2447 1716 : tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */
2448 1716 : temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
2449 1716 : exp = 0;
2450 1716 : move16();
2451 1716 : tempQ15 = Sqrt16( temp, &exp ); /* Q15 */
2452 1716 : temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
2453 :
2454 : /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */
2455 1716 : temp = sub( MAX_16, temp );
2456 1716 : tempQ31 = Mult_32_16( pow1, temp );
2457 1716 : L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
2458 1716 : temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
2459 : }
2460 : ELSE
2461 : {
2462 : /* Adjust noise mixing for formant sharpening filter */
2463 10045 : tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac );
2464 : /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */
2465 10045 : vf_tmp = sub( MAX_16, tempQ15 );
2466 10045 : vf_tmp = mult_r( voice_factors[i], vf_tmp );
2467 :
2468 10045 : exp = 0;
2469 10045 : move16();
2470 10045 : tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */
2471 10045 : temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
2472 :
2473 : /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */
2474 10045 : temp = sub( MAX_16, vf_tmp );
2475 10045 : tempQ31 = Mult_32_16( pow1, temp );
2476 10045 : L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
2477 10045 : temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
2478 : }
2479 :
2480 860081 : FOR( j = 0; j < lSubFr; j++ )
2481 : {
2482 : /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */
2483 848320 : L_tmp = L_mult( temp2, White_exc16k[k + j] ); /* 16+(Q_bwe_exc-NOISE_QADJ)*/
2484 848320 : L_tmp = L_shl_sat( L_tmp, NOISE_QADJ ); /* 16+(Q_bwe_exc) */
2485 848320 : exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] );
2486 848320 : move16();
2487 : /* Q_bwe_exc */
2488 : }
2489 11761 : k = add( k, lSubFr );
2490 :
2491 : /* estimate the pre-emph factor */
2492 11761 : tempQ15 = sub( MAX_16, voice_factors[i] );
2493 11761 : exp = 0;
2494 11761 : move16();
2495 11761 : temp = Sqrt16( tempQ15, &exp );
2496 11761 : temp = shl( temp, exp - 1 );
2497 :
2498 11761 : temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */
2499 11761 : temp = div_s( temp, temp2 ); /* Q15 */
2500 11761 : temp = mult_r( PREEMPH_FAC, temp );
2501 :
2502 11761 : PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph );
2503 : /* exc16kWhtnd: Q_bwe_exc;
2504 : tbe_premph: Q_bwe_exc*/
2505 : }
2506 : }
2507 : }
2508 :
2509 2708 : IF( LT_32( bitrate, ACELP_24k40 ) )
2510 : {
2511 1494 : Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 );
2512 : /* i: exc16kWhtnd in Q_bwe_exc */
2513 : /* o: excSHB in Q_bwe_exc */
2514 : }
2515 : ELSE
2516 : {
2517 1214 : set16_fx( zero_mem, 0, LPC_SHB_ORDER );
2518 :
2519 1214 : Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 );
2520 1214 : syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
2521 1214 : move32();
2522 :
2523 1214 : Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 );
2524 1214 : syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
2525 1214 : move32();
2526 :
2527 1214 : Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 );
2528 1214 : syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
2529 1214 : move32();
2530 :
2531 1214 : Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 );
2532 1214 : syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
2533 1214 : move32();
2534 :
2535 : /* i: exc16kWhtnd in Q_bwe_exc */
2536 : /* o: tempSHB in Q_bwe_exc */
2537 : /* o: syn_shb_ener_sf in (2*Q_bwe_exc+1) */
2538 1214 : IF( LE_32( bitrate, ACELP_32k ) )
2539 : {
2540 1214 : L_tmp = sum32_fx( syn_shb_ener_sf, 4 );
2541 :
2542 : /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */
2543 1214 : tmp = shl( Q_shb, 1 );
2544 1214 : tmp2 = add( shl( *Q_bwe_exc, 1 ), 1 );
2545 1214 : L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */
2546 :
2547 1214 : *Q_bwe_exc = sub( *Q_bwe_exc, exp );
2548 1214 : move16(); /* compensate for the exp shift */
2549 1214 : tmp2 = add( prev_Q_bwe_syn, n_mem2 );
2550 1214 : IF( GT_16( *Q_bwe_exc, tmp2 ) )
2551 : {
2552 1 : L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) );
2553 1 : *Q_bwe_exc = tmp2;
2554 1 : move16();
2555 : }
2556 389694 : FOR( i = 0; i < L_FRAME16k; i++ )
2557 : {
2558 388480 : L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */
2559 388480 : exc16kWhtnd[i] = round_fx( L_tmp3 ); /* *Q_bwe_exc - exp */
2560 388480 : move16();
2561 : }
2562 : }
2563 : /* i: L_tmp2 in (Q31-exp) */
2564 : /* i: exc16kWhtnd in Q_bwe_exc */
2565 : /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp) */
2566 :
2567 : /* Rescale the past memories: LP synth and SHB look ahead buffers */
2568 1214 : tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn );
2569 13354 : FOR( i = 0; i < LPC_SHB_ORDER; i++ )
2570 : {
2571 12140 : state_lpc_syn[i] = shl( state_lpc_syn[i], tmp );
2572 12140 : move16();
2573 : }
2574 25494 : FOR( i = -L_SHB_LAHEAD; i < 0; i++ )
2575 : {
2576 24280 : excSHB[i] = shl( excSHB[i], tmp );
2577 24280 : move16();
2578 : }
2579 : /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */
2580 :
2581 1214 : Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 );
2582 1214 : Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 );
2583 1214 : Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 );
2584 1214 : Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 );
2585 : /* i: exc16kWhtnd in (Q_bwe_exc) */
2586 : /* o: excSHB in (Q_bwe_exc) */
2587 : }
2588 :
2589 2708 : IF( EQ_16( extl, FB_TBE ) )
2590 : {
2591 0 : tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb );
2592 0 : Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp );
2593 0 : Scale_sig( fb_tbe_demph, 1, tmp );
2594 0 : Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 );
2595 : /* i: White_exc16k_FB in (14-n2) */
2596 : /* o: White_exc16k_FB_temp in (14-n2) */
2597 :
2598 0 : FOR( i = 0; i < 10; i++ )
2599 : {
2600 0 : FOR( j = 0; j < 32; ++j )
2601 : {
2602 0 : White_exc16k_FB_temp[i * 32 + j] = mult_r( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] );
2603 0 : move16();
2604 : }
2605 : }
2606 :
2607 0 : *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 );
2608 0 : move16(); /**Q_bwe_exc_fb +35 +1 -16*/
2609 0 : flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k );
2610 :
2611 0 : deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph );
2612 : }
2613 : ELSE
2614 : {
2615 2708 : set16_fx( White_exc16k_FB, 0, L_FRAME16k );
2616 : }
2617 :
2618 2708 : return;
2619 : }
2620 :
2621 115109 : void GenShapedSHBExcitation_ivas_enc_fx(
2622 : Word16 *excSHB, /* o : synthesized shaped shb excitation Q_bwe_exc*/
2623 : const Word16 *lpc_shb, /* i : lpc coefficients Q12*/
2624 : Word16 *White_exc16k_FB, /* o : white excitation for the Fullband extension Q_bwe_exc_fb */
2625 : Word32 *mem_csfilt, /* i/o: memory */
2626 : Word16 *mem_genSHBexc_filt_down_shb, /* i/o: memory */
2627 : Word16 *state_lpc_syn, /* i/o: memory */
2628 : const Word16 coder_type, /* i : coding type */
2629 : const Word16 *bwe_exc_extended, /* i : bwidth extended excitation */
2630 : Word16 bwe_seed[], /* i/o: random number generator seed */
2631 : Word16 voice_factors[], /* i : voicing factor*/
2632 : const Word16 extl, /* i : extension layer */
2633 : Word16 *tbe_demph, /* i/o: de-emphasis memory */
2634 : Word16 *tbe_premph, /* i/o: pre-emphasis memory */
2635 : Word16 *lpc_shb_sf, /* i: LP coefficients */
2636 : const Word32 shb_ener_sf_32, /* i: input shb ener, Q31 */
2637 : Word16 *shb_res_gshape, /* i: input res gain shape, Q14 */
2638 : Word16 *shb_res,
2639 : Word16 *vf_ind,
2640 : const Word16 formant_fac, /* i : Formant sharpening factor [0..1] */
2641 : Word16 fb_state_lpc_syn[], /* i/o: memory */
2642 : Word16 *fb_tbe_demph, /* i/o: fb de-emphasis memory */
2643 : Word16 *Q_bwe_exc,
2644 : Word16 *Q_bwe_exc_fb,
2645 : const Word16 Q_shb,
2646 : Word16 n_mem2, /* i : n_mem2 scale factor to adjust 24.4/32kbps memories */
2647 : Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */
2648 : const Word32 bitrate,
2649 : const Word16 prev_bfi,
2650 : const Word16 element_mode, /* i : element mode */
2651 : const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */
2652 : Word16 *nlExc16k, /* i/o: NL exc for IC-BWE */
2653 : Word16 *nlExc16k_e, /* i/o: exp of nlExc16k */
2654 : Word16 *mixExc16k, /* i/o: exc spreading for IC-BWE */
2655 : Word16 *mixExc16k_e, /* i/o: exp of mixExc16k_fx */
2656 : const Word32 extl_brate, /* i : extension layer bitarte */
2657 : const Word16 MSFlag, /* i : Multi Source flag */
2658 : Word16 EnvSHBres_4k[], /* i/o: TD envelope of the SHB residual signal */
2659 : Word16 Q_EnvSHBres_4k,
2660 : Word32 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */
2661 : Word16 *prev_mix_factor, /* i/o: mixing factor in the previous frame */
2662 : Word16 *Env_error, /* o : error in SHB residual envelope modelling*/
2663 : Word16 Env_error_part[] /* o : per-segment error in SHB residual envelope modelling */
2664 : )
2665 : {
2666 : Word16 i, j, k;
2667 : Word16 wht_fil_mem[LPC_WHTN_ORDER];
2668 : Word16 lpc_whtn[LPC_WHTN_ORDER + 1];
2669 : Word16 R_h[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech MSB */
2670 : Word16 R_l[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech LSB */
2671 : Word16 Q_R;
2672 : Word32 LepsP[LPC_WHTN_ORDER + 1];
2673 : Word16 exc32k[L_FRAME32k], exc16k[L_FRAME16k];
2674 : Word32 pow1, pow22;
2675 : Word16 scale, temp1, temp2, temp3;
2676 :
2677 : Word16 excTmp2[L_FRAME16k];
2678 : Word16 *White_exc16k;
2679 : Word16 Q_White_exc16k;
2680 : Word16 excNoisyEnv[L_FRAME16k];
2681 115109 : Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */
2682 115109 : move16();
2683 115109 : Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */
2684 115109 : move16();
2685 115109 : move16();
2686 : Word16 varEnvShape;
2687 115109 : Word16 fb_deemph_fac = 15729; /*0.48f in Q15 */
2688 : Word16 exc16kWhtnd[L_FRAME16k];
2689 :
2690 : Word32 L_tmp;
2691 : Word16 vf_tmp;
2692 115109 : Word16 tmp, exp, tmp2 = 0;
2693 115109 : move16();
2694 : Word16 voiceFacEst[NB_SUBFR16k];
2695 : Word16 zero_mem[LPC_SHB_ORDER];
2696 : Word32 syn_shb_ener_sf[4];
2697 : Word16 syn_shb_ener_sf_q[4];
2698 : Word16 tempSHB[80];
2699 : Word16 Q_pow1, Q_pow22;
2700 :
2701 : Word32 L_tmp2, L_tmp3, L_tmp4;
2702 : Word16 temp;
2703 :
2704 : Word16 White_exc16k_FB_temp[L_FRAME16k];
2705 : Word32 White_exc16k_32[L_FRAME16k];
2706 : Word16 White_exc16k_tmp[L_FRAME16k];
2707 : Word16 prev_Q_bwe_exc_fb;
2708 :
2709 : Word16 alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k];
2710 : Word16 cbsize;
2711 : Word16 mix_factor, old_fact, new_fact, fact, old_scale, new_scale, step_scale;
2712 : Word32 c0, c1, c2, c3, c4, c5, den;
2713 : Word16 g1, g2, g, g1_e, g2_e, g_e, den_e, shift, tmp_e, tmp1_e;
2714 : Word16 EnvWhiteExc16k[L_FRAME16k], EnvExc16kWhtnd[L_FRAME16k];
2715 115109 : Word16 EnvWhiteExc16k_4k[L_FRAME4k] = { 0 }, EnvExc16kWhtnd_4k[L_FRAME4k] = { 0 };
2716 : Word16 flag_plosive;
2717 : Word16 delta;
2718 : Word32 c0_part[NUM_SHB_SUBGAINS], c1_part[NUM_SHB_SUBGAINS], c2_part[NUM_SHB_SUBGAINS], c3_part[NUM_SHB_SUBGAINS], c4_part[NUM_SHB_SUBGAINS], c5_part[NUM_SHB_SUBGAINS];
2719 : Word64 W_tmp;
2720 :
2721 115109 : mix_factor = 0; /* Q15 */
2722 115109 : move16();
2723 :
2724 115109 : set16_fx( zero_mem, 0, LPC_SHB_ORDER );
2725 115109 : set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER );
2726 36949989 : FOR( i = 0; i < L_FRAME32k; i = i + 2 )
2727 : {
2728 36834880 : exc32k[i] = negate( bwe_exc_extended[i] ); // Q_bwe_exc
2729 36834880 : move16();
2730 36834880 : exc32k[i + 1] = bwe_exc_extended[i + 1]; // Q_bwe_exc
2731 36834880 : move16();
2732 : }
2733 :
2734 : /* Decimate by 2 */
2735 115109 : Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k ); // Q_bwe_exc
2736 : /* i: exc32k in Q_bwe_exc */
2737 : /* o: exc16k in Q_bwe_exc */
2738 :
2739 115109 : autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 ); // Q_R
2740 : /* Ensure R[0] isn't zero when entering Levinson Durbin */
2741 115109 : R_l[0] = s_max( R_l[0], 1 );
2742 115109 : move16();
2743 575545 : FOR( i = 1; i <= LPC_WHTN_ORDER; i++ )
2744 : {
2745 460436 : L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
2746 460436 : L_Extract( L_tmp, &R_h[i], &R_l[i] ); // Q_R
2747 : }
2748 115109 : E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL );
2749 115109 : Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); // Q12
2750 115109 : fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 ); // Q_bwe_exc
2751 :
2752 : /* i: exc16k in Q_bwe_exc */
2753 : /* o: exc16kWhtnd in Q_bwe_exc */
2754 :
2755 115109 : IF( GE_32( extl_brate, SWB_TBE_2k8 ) )
2756 : {
2757 25058 : temp2 = 0;
2758 25058 : move16();
2759 125290 : FOR( j = 0; j < 4; j++ )
2760 : {
2761 100232 : temp1 = shb_res_gshape[j];
2762 100232 : move16();
2763 8118792 : FOR( i = 0; i < 80; i++ )
2764 : {
2765 8018560 : exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); // Q_bwe_exc
2766 8018560 : move16();
2767 : /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */
2768 : }
2769 100232 : temp2 = add( temp2, 80 );
2770 : }
2771 : }
2772 :
2773 : /* Estimate pow1 associated with Low band nonlinear extended excitation */
2774 : /* pow1=0.00001f */
2775 115109 : tmp = sub( shl( *Q_bwe_exc, 1 ), 31 );
2776 115109 : W_tmp = W_shl( 21475 /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */
2777 36949989 : FOR( k = 0; k < L_FRAME16k; k++ )
2778 : {
2779 : /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/
2780 36834880 : excTmp2[k] = abs_s( exc16kWhtnd[k] );
2781 36834880 : move16();
2782 :
2783 : /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */
2784 36834880 : W_tmp = W_mac_16_16( W_tmp, exc16kWhtnd[k], exc16kWhtnd[k] ); // 2*Q_bwe_exc+1
2785 : }
2786 115109 : exp = W_norm( W_tmp );
2787 115109 : pow1 = W_extract_h( W_shl( W_tmp, exp ) ); // 2*Q_bwe_exc+1+exp-32 = // tmp+exp
2788 115109 : Q_pow1 = add( tmp, exp );
2789 :
2790 115109 : IF( flag_ACELP16k == 0 )
2791 : {
2792 : /* varEnvShape = mean_fx(voice_factors, 4); */
2793 : /* unroll the loop */
2794 55593 : L_tmp = L_mult( voice_factors[0], 8192 /*0.25 in Q15 */ );
2795 55593 : L_tmp = L_mac( L_tmp, voice_factors[1], 8192 /*0.25 in Q15 */ );
2796 55593 : L_tmp = L_mac( L_tmp, voice_factors[2], 8192 /*0.25 in Q15 */ );
2797 55593 : varEnvShape = mac_r( L_tmp, voice_factors[3], 8192 /*0.25 in Q15 */ ); /* varEnvShape in Q15 */
2798 : }
2799 : ELSE /* 16k core */
2800 : {
2801 : /* varEnvShape = mean_fx(voice_factors, 5); */
2802 : /* unroll the loop */
2803 59516 : L_tmp = L_mult( voice_factors[0], 6554 /*0.2 in Q15 */ );
2804 59516 : L_tmp = L_mac( L_tmp, voice_factors[1], 6554 /*0.2 in Q15 */ );
2805 59516 : L_tmp = L_mac( L_tmp, voice_factors[2], 6554 /*0.2 in Q15 */ );
2806 59516 : L_tmp = L_mac( L_tmp, voice_factors[3], 6554 /*0.2 in Q15 */ );
2807 59516 : varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 /*0.2 in Q15 */ ); /* varEnvShape in Q15 */
2808 : }
2809 :
2810 115109 : IF( EQ_16( extl, FB_TBE ) )
2811 : {
2812 : /*pow(varEnvShape,3) */
2813 43652 : tmp = mult_r( varEnvShape, varEnvShape );
2814 43652 : tmp = mult_r( tmp, varEnvShape );
2815 :
2816 : /* max_val((0.68f - (float)pow(varEnvShape, 3)), 0.48f); */
2817 43652 : fb_deemph_fac = sub( 22282 /*0.68f Q15*/, tmp );
2818 43652 : fb_deemph_fac = s_max( fb_deemph_fac, 15729 /*0.48f Q15*/ );
2819 : }
2820 :
2821 : /*varEnvShape = 1.09875f - 0.49875f * varEnvShape; */
2822 115109 : varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape );
2823 :
2824 : /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */
2825 115109 : varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ );
2826 115109 : varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ );
2827 115109 : varEnvShape = shl( varEnvShape, 1 );
2828 115109 : csfilt_num2[0] = sub( MAX_16, varEnvShape ); // Q15
2829 115109 : move16();
2830 115109 : neg_csfilt_den2[1] = varEnvShape; // Q15
2831 115109 : move16();
2832 :
2833 115109 : test();
2834 115109 : test();
2835 115109 : test();
2836 115109 : test();
2837 115109 : IF( EQ_16( element_mode, EVS_MONO ) && *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) )
2838 : {
2839 : /* pre-init smoothing filter to avoid energy drop outs */
2840 0 : L_tmp = L_mult( excTmp2[0], 1638 );
2841 0 : FOR( i = 1; i < L_SUBFR16k / 4; i++ )
2842 : {
2843 0 : L_tmp = L_mac( L_tmp, excTmp2[i], 1638 ); /*1638 = 1/20 in Q15*/
2844 : }
2845 : /*L_tmp = sum(excTmp2, L_SUBFR16k/4)*(1/20) where L_SUBFR16k/4 =20 */
2846 :
2847 : /* don't apply for FB in case the FB start-frame was potentially lost - White_exc16k is very sensitive to enery mismatch between enc - dec */
2848 : /* rather stick to the more conservative approach, to avoid potential clippings */
2849 0 : test();
2850 0 : IF( !( prev_bfi && EQ_16( extl, FB_TBE ) ) )
2851 : {
2852 : /* use weak smoothing for 1st frame after switching to make filter recover more quickly */
2853 0 : varEnvShape = 26214 /*0.8f Q15*/;
2854 0 : move16();
2855 0 : csfilt_num2[0] = sub( MAX_16, varEnvShape );
2856 0 : move16();
2857 0 : neg_csfilt_den2[1] = varEnvShape;
2858 0 : move16();
2859 : }
2860 :
2861 0 : *mem_csfilt = Mult_32_16( L_tmp, varEnvShape );
2862 0 : move32();
2863 : }
2864 :
2865 115109 : IF( MSFlag > 0 )
2866 : {
2867 : // varEnvShape = 0.995f;
2868 5694 : varEnvShape = 32604;
2869 5694 : move16();
2870 5694 : csfilt_num2[0] = 32768 - varEnvShape;
2871 : // csfilt_num2[0] = sub( 32767, varEnvShape );
2872 5694 : move16();
2873 5694 : neg_csfilt_den2[1] = varEnvShape;
2874 5694 : move16();
2875 : }
2876 :
2877 115109 : White_exc16k = exc16k;
2878 115109 : Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc );
2879 115109 : IF( *mem_csfilt )
2880 : {
2881 77572 : Q_excTmp2 = s_min( Q_excTmp2, sub( add( norm_l( *mem_csfilt ), *Q_bwe_exc ), 1 ) );
2882 : }
2883 115109 : test();
2884 : /* Track the low band envelope */
2885 115109 : IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) )
2886 : {
2887 29855 : test();
2888 29855 : IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) )
2889 : {
2890 25572 : mem_csfilt_left = 0;
2891 25572 : mem_csfilt_right = 0;
2892 25572 : move16();
2893 25572 : move16();
2894 8208612 : FOR( k = 0; k < L_FRAME16k; k++ )
2895 : {
2896 : // excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k];
2897 8183040 : excNoisyEnvLeft[k] = add( mem_csfilt_left, mult_r( csfilt_num2[0], shl( excTmp2[k], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2
2898 8183040 : move16();
2899 : // mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k];
2900 8183040 : mem_csfilt_left = mult_r( neg_csfilt_den2[1], excNoisyEnvLeft[k] ); // Q_excTmp2
2901 : // excNoisyEnvRight[L_FRAME16k - k - 1] = mem_csfilt_right + csfilt_num2[0] * excTmp2[L_FRAME16k - k - 1];
2902 8183040 : excNoisyEnvRight[L_FRAME16k - k - 1] = add( mem_csfilt_right, mult_r( csfilt_num2[0], shl( excTmp2[L_FRAME16k - k - 1], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2
2903 8183040 : move16();
2904 : // mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1];
2905 8183040 : mem_csfilt_right = mult_r( neg_csfilt_den2[1], excNoisyEnvRight[L_FRAME16k - k - 1] ); // Q_excTmp2
2906 : }
2907 :
2908 25572 : alpha = 0;
2909 25572 : move16();
2910 : // step = 1.0f / L_FRAME16k;
2911 25572 : step = 102; // Q15
2912 25572 : move16();
2913 8208612 : FOR( k = 0; k < L_FRAME16k; k++ )
2914 : {
2915 : // excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + (1 - alpha) * excNoisyEnvRight[k];
2916 8183040 : excNoisyEnv[k] = add( mult_r( alpha, excNoisyEnvLeft[k] ), mult_r( sub( 32767, alpha ), excNoisyEnvRight[k] ) ); // Q_excTmp2
2917 8183040 : move16();
2918 8183040 : alpha = add( alpha, step );
2919 : }
2920 : }
2921 : }
2922 : ELSE
2923 : {
2924 : /* Track the low band envelope */
2925 85254 : L_tmp = L_shl( *mem_csfilt, sub( Q_excTmp2, *Q_bwe_exc ) );
2926 85254 : move32();
2927 27366534 : FOR( i = 0; i < L_FRAME16k; i++ )
2928 : {
2929 27281280 : excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], shl( excTmp2[i], sub( Q_excTmp2, *Q_bwe_exc ) ) );
2930 27281280 : move16();
2931 : /* Work-around to avoid 0s for very small value*/
2932 27281280 : test();
2933 27281280 : test();
2934 27281280 : test();
2935 27281280 : test();
2936 27281280 : if ( excNoisyEnv[i] == 0 && ( L_tmp != 0 || ( csfilt_num2[0] != 0 && excTmp2[i] != 0 ) ) )
2937 : {
2938 5772 : excNoisyEnv[i] = 1;
2939 5772 : move16();
2940 : }
2941 : /* excNoisyEnv : Q_excTmp2,
2942 : *mem_csfilt: Q_excTmp2+16, excTmp2: Q_excTmp2, csfilt_num2[0] Q_excTmp2 */
2943 27281280 : L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_excTmp2 + 16 */
2944 : }
2945 85254 : *mem_csfilt = L_shr( L_tmp, sub( Q_excTmp2, *Q_bwe_exc ) );
2946 85254 : move32();
2947 : }
2948 :
2949 115109 : test();
2950 115109 : IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
2951 4283 : {
2952 : /* generate gaussian (white) excitation */
2953 1374843 : FOR( k = 0; k < L_FRAME16k; k++ )
2954 : {
2955 1370560 : White_exc16k[k] = own_random( &bwe_seed[0] ); // Q0
2956 1370560 : move16();
2957 : }
2958 :
2959 : /* normalize the amplitude of the gaussian excitation to that of the LB exc. */
2960 4283 : Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT; // Q31
2961 4283 : move32();
2962 4283 : move32();
2963 4283 : pow22 = POW_EXC16k_WHTND_FX;
2964 4283 : Q_pow22 = -6;
2965 4283 : move16();
2966 : // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), White_exc16k, L_FRAME16k);
2967 4283 : Word16 pow1_exp = sub( Q31, Q_pow1 );
2968 4283 : Word32 temp_pow = Sqrt32( pow1, &pow1_exp );
2969 4283 : temp_pow = L_shl( Mpy_32_32( temp_pow, pow22_inv ), pow1_exp );
2970 : /*Word16 out_exp;
2971 : Word32 temp_pow1 = root_a_over_b_fx(pow1, Q_pow1, pow22, Q_pow22, &out_exp);
2972 : temp_pow1 = L_shl(temp_pow1, out_exp);*/
2973 : // v_multc_fixed_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k);
2974 4283 : L_tmp = 0;
2975 4283 : move32();
2976 4283 : Q_White_exc16k = add( getScaleFactor16( White_exc16k, L_FRAME16k ), norm_l( temp_pow ) );
2977 1374843 : FOR( k = 0; k < L_FRAME16k; k++ )
2978 : {
2979 1370560 : White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] ); // Q31 + Q0 - Q15 = Q16
2980 1370560 : move32();
2981 1370560 : White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); // Q16 + Q_White_exc16k - Q16 = Q_White_exc16k
2982 1370560 : move16();
2983 1370560 : L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
2984 : }
2985 : }
2986 : ELSE
2987 : {
2988 : /* create a random excitation - Reuse exc16k memory */
2989 110826 : create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed ); // Q5
2990 110826 : create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); // Q5
2991 :
2992 110826 : L_tmp = L_deposit_l( 0 );
2993 110826 : tmp = add( *Q_bwe_exc, 1 );
2994 35575146 : FOR( k = 0; k < L_FRAME16k; k++ )
2995 : {
2996 35464320 : L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_excTmp2) +5 +1*/
2997 35464320 : White_exc16k_32[k] = L_tmp4; /* (Q_excTmp2) +5 +1*/
2998 35464320 : move32();
2999 35464320 : L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
3000 : }
3001 : /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/
3002 : /* White_exc16k in Q6 */
3003 :
3004 : /* calculate pow22 */
3005 : /* pow22=0.00001f */
3006 110826 : tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 );
3007 110826 : W_tmp = W_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(*Q_bwe_exc-NOISE_QADJ) */
3008 110826 : Q_White_exc16k = getScaleFactor32( White_exc16k_32, L_FRAME16k );
3009 35575146 : FOR( k = 0; k < L_FRAME16k; k++ )
3010 : {
3011 : /* White_exc16k[k] *= excNoisyEnv[k]; */
3012 35464320 : White_exc16k[k] = extract_h( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); // Q_excTmp2 + 6 + Q_White_exc16k - 16 ==> Q_excTmp2 + Q_White_exc16k - 10
3013 35464320 : move16();
3014 : /* i: excNoisyEnv in (Q_excTmp2) */
3015 : /* i: White_exc16k in Q6 */
3016 : /* o: White_exc16k in (Q_bwe_exc-NOISE_QADJ) */
3017 :
3018 : /* pow22 += White_exc16k[k] * White_exc16k[k]; */
3019 35464320 : W_tmp = W_mac0_16_16( W_tmp, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2 + Q_White_exc16k - 10)*/
3020 : }
3021 110826 : Q_pow22 = W_norm( W_tmp );
3022 110826 : pow22 = W_extract_h( W_shl( W_tmp, Q_pow22 ) ); // 2*(Q_excTmp2 + Q_White_exc16k - 10)+Q_pow22-32
3023 110826 : Q_pow22 = sub( add( Q_pow22, shl( sub( add( Q_White_exc16k, Q_excTmp2 ), 10 ), 1 ) ), 32 );
3024 110826 : Q_White_exc16k = add( Q_White_exc16k, sub( Q_excTmp2, 10 ) );
3025 : }
3026 :
3027 115109 : flag_plosive = 0;
3028 115109 : move16();
3029 115109 : test();
3030 115109 : test();
3031 115109 : test();
3032 115109 : IF( GE_32( extl_brate, SWB_TBE_2k8 ) || EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
3033 : {
3034 29341 : IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */
3035 : {
3036 29341 : test();
3037 29341 : IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
3038 : {
3039 1374843 : FOR( k = 0; k < L_FRAME16k; k++ )
3040 : {
3041 1370560 : White_exc16k_tmp[k] = shl( White_exc16k[k], sub( *Q_bwe_exc, Q_White_exc16k ) );
3042 1370560 : move16();
3043 : }
3044 :
3045 : /* calculate TD envelopes of exc16kWhtnd and White_exc16k */
3046 4283 : find_td_envelope_fx( White_exc16k_tmp, L_FRAME16k, 20, NULL, EnvWhiteExc16k ); /* Q_bwe_exc */
3047 4283 : find_td_envelope_fx( exc16kWhtnd, L_FRAME16k, 20, NULL, EnvExc16kWhtnd ); /* Q_bwe_exc */
3048 :
3049 346923 : FOR( k = 0; k < L_FRAME4k; k++ )
3050 : {
3051 342640 : EnvWhiteExc16k_4k[k] = EnvWhiteExc16k[4 * k]; /* Q_bwe_exc */
3052 342640 : move16();
3053 342640 : EnvExc16kWhtnd_4k[k] = EnvExc16kWhtnd[4 * k]; /* Q_bwe_exc */
3054 342640 : move16();
3055 : }
3056 :
3057 : /* calculate the optimal mix factor */
3058 4283 : c0 = c1 = c2 = c3 = c4 = c5 = 0; /* Q0 */
3059 4283 : move32();
3060 4283 : move32();
3061 4283 : move32();
3062 4283 : move32();
3063 4283 : move32();
3064 4283 : move32();
3065 :
3066 4283 : temp1 = add( shl( *Q_bwe_exc, 1 ), 1 );
3067 4283 : temp2 = add( add( Q_EnvSHBres_4k, *Q_bwe_exc ), 1 );
3068 4283 : temp3 = add( shl( Q_EnvSHBres_4k, 1 ), 1 );
3069 21415 : FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ )
3070 : {
3071 : // c0_part[i] = sum2_f( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
3072 17132 : c0_part[i] = L_shr( sum2_fx( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */
3073 17132 : move32();
3074 : // c1_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
3075 17132 : c1_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */
3076 17132 : move32();
3077 : // c2_part[i] = sum2_f( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
3078 17132 : c2_part[i] = L_shr( sum2_fx( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */
3079 17132 : move32();
3080 : // c3_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
3081 17132 : c3_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */
3082 17132 : move32();
3083 : // c4_part[i] = 2.0f * dotp( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
3084 17132 : c4_part[i] = L_shr( Dot_product( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), sub( temp1, 1 ) ); /* Q0 */
3085 17132 : move32();
3086 : // c5_part[i] = sum2_f( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
3087 17132 : c5_part[i] = L_shr( sum2_fx( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp3 ); /* Q0 */
3088 17132 : move32();
3089 :
3090 17132 : c0 = L_add( c0, c0_part[i] );
3091 17132 : c1 = L_add( c1, c1_part[i] );
3092 17132 : c2 = L_add( c2, c2_part[i] );
3093 17132 : c3 = L_add( c3, c3_part[i] );
3094 17132 : c4 = L_add( c4, c4_part[i] );
3095 17132 : c5 = L_add( c5, c5_part[i] );
3096 : }
3097 :
3098 : // den = 4.0f * c0 * c2 - c4 * c4;
3099 4283 : W_tmp = W_sub( W_shl( W_mult0_32_32( c0, c2 ), 2 ), W_mult0_32_32( c4, c4 ) );
3100 4283 : den_e = 63;
3101 4283 : move16();
3102 4283 : shift = W_norm( W_tmp );
3103 4283 : den = W_extract_h( W_shl( W_tmp, shift ) );
3104 4283 : den_e = sub( den_e, shift );
3105 :
3106 4283 : IF( den == 0 )
3107 : {
3108 277 : den = 1;
3109 277 : move32();
3110 277 : den_e = 31;
3111 277 : move16();
3112 : }
3113 :
3114 : // g1 = ( c3 * c4 - 2 * c1 * c2 ) / den;
3115 4283 : W_tmp = W_sub( W_mult0_32_32( c3, c4 ), W_shl( W_mult0_32_32( c1, c2 ), 1 ) );
3116 4283 : g1_e = 63;
3117 4283 : move16();
3118 4283 : shift = W_norm( W_tmp );
3119 4283 : L_tmp = W_extract_h( W_shl( W_tmp, shift ) );
3120 4283 : g1_e = sub( g1_e, shift );
3121 :
3122 4283 : g1 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e );
3123 4283 : g1_e = sub( add( tmp_e, g1_e ), den_e );
3124 :
3125 : // g2 = ( c1 * c4 - 2 * c0 * c3 ) / den;
3126 4283 : W_tmp = W_sub( W_mult0_32_32( c1, c4 ), W_shl( W_mult0_32_32( c0, c3 ), 1 ) );
3127 4283 : g2_e = 63;
3128 4283 : move16();
3129 4283 : shift = W_norm( W_tmp );
3130 4283 : L_tmp = W_extract_h( W_shl( W_tmp, shift ) );
3131 4283 : g2_e = sub( g2_e, shift );
3132 :
3133 4283 : g2 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e );
3134 4283 : g2_e = sub( add( tmp_e, g2_e ), den_e );
3135 :
3136 : // *Env_error = 0.0f;
3137 4283 : *Env_error = 0;
3138 4283 : move16();
3139 4283 : flag_plosive = 0;
3140 4283 : move16();
3141 21415 : FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ )
3142 : {
3143 : // Env_error_part[i] = c5_part[i] + g1 * g1 * c0_part[i] + g1 * c1_part[i] + g2 * g2 * c2_part[i] + g2 * c3_part[i] + g1 * g2 * c4_part[i];
3144 17132 : L_tmp = BASOP_Util_Add_Mant32Exp( c5_part[i], 31, Mpy_32_32( L_mult( g1, g1 ), c0_part[i] ), add( shl( g1_e, 1 ), 31 ), &tmp_e );
3145 17132 : L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c1_part[i], g1 ), add( 31, g1_e ), &tmp_e );
3146 17132 : L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g2, g2 ), c2_part[i] ), add( shl( g2_e, 1 ), 31 ), &tmp_e );
3147 17132 : L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c3_part[i], g2 ), add( 31, g2_e ), &tmp_e );
3148 17132 : L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g1, g2 ), c4_part[i] ), add( add( g1_e, g2_e ), 31 ), &tmp_e );
3149 :
3150 : // Env_error_part[i] = L_shr( L_tmp, 31 - tmp_e ); // Check Exponent
3151 17132 : Env_error_part[i] = extract_h( L_shr_sat( L_tmp, sub( Q15, tmp_e ) ) ); /* Q0 */
3152 17132 : move16();
3153 :
3154 : // *Env_error += Env_error_part[i];
3155 17132 : *Env_error = add_sat( *Env_error, Env_error_part[i] ); /* Q0 */
3156 17132 : move16();
3157 :
3158 17132 : if ( GT_16( Env_error_part[i], THR_ENV_ERROR_PLOSIVE_FX ) ) // Check which Q
3159 : {
3160 : /* envelope error is too high -> likely a plosive */
3161 37 : flag_plosive = 1;
3162 37 : move16();
3163 : }
3164 : }
3165 :
3166 4283 : IF( flag_plosive )
3167 : {
3168 : /* plosive detected -> set the mixing factor to 0 */
3169 36 : *vf_ind = 0;
3170 36 : move16();
3171 36 : mix_factor = 0;
3172 36 : move16();
3173 : }
3174 : ELSE
3175 : {
3176 : /* normalize gain */
3177 : // g = g2 / ( g1 + g2 );
3178 4247 : tmp1_e = BASOP_Util_Add_MantExp( g1, g1_e, g2, g2_e, &tmp );
3179 4247 : IF( tmp == 0 )
3180 : {
3181 322 : tmp = 1;
3182 322 : move16();
3183 322 : tmp1_e = 15;
3184 322 : move16();
3185 : }
3186 4247 : g = BASOP_Util_Divide1616_Scale( g2, tmp, &tmp_e );
3187 4247 : g_e = sub( add( tmp_e, g2_e ), tmp1_e );
3188 :
3189 : /* quantization of the mixing factor */
3190 4247 : cbsize = 1 << NUM_BITS_SHB_VF;
3191 4247 : move16();
3192 : // delta = 1.0f / ( cbsize - 1 );
3193 4247 : delta = 2341; /* Q14 */
3194 4247 : move16();
3195 : // if ( g > 1.0f )
3196 4247 : IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), ONE_IN_Q31, 0 ) > 0 )
3197 : {
3198 : // g = 1.0f;
3199 797 : g = MAX16B; /* Q15 */
3200 797 : move16();
3201 797 : g_e = 0;
3202 797 : move16();
3203 : }
3204 : // else if ( g < shl( delta, ( 15 - g_e ) - 14 ) )
3205 3450 : ELSE IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), delta, 17 ) < 0 )
3206 : {
3207 : /* prevent low gains to be quantized to 0 as this is reserved for plosives */
3208 : // g = delta;
3209 734 : g = shl( delta, 1 ); /* Q15 */
3210 734 : g_e = 0;
3211 734 : move16();
3212 : }
3213 :
3214 4247 : g = shl_sat( g, g_e ); /* Q15 */
3215 :
3216 4247 : *vf_ind = usquant_fx( g, &mix_factor, 0, delta, cbsize );
3217 4247 : move16();
3218 : }
3219 : }
3220 : ELSE
3221 : {
3222 25058 : Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k,
3223 : Q_White_exc16k, pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind );
3224 25058 : tmp = voiceFacEst[0];
3225 25058 : tmp2 = MAX_16;
3226 25058 : move16();
3227 25058 : move16();
3228 25058 : if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
3229 : {
3230 24694 : tmp2 = 26214 /*0.8f Q15*/;
3231 24694 : move16();
3232 : }
3233 : }
3234 : }
3235 : ELSE /* decoder side */
3236 : {
3237 0 : test();
3238 0 : IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
3239 : {
3240 0 : IF( *vf_ind == 0 )
3241 : {
3242 : // mix_factor = 0.0f;
3243 0 : mix_factor = 0;
3244 0 : move16();
3245 0 : flag_plosive = 1;
3246 0 : move16();
3247 : }
3248 : ELSE
3249 : {
3250 : // mix_factor = usdequant(*vf_ind, 0.0f, 1.0f / ((1 << NUM_BITS_SHB_VF) - 1));
3251 0 : mix_factor = usdequant_fx( *vf_ind, 0, 2341 );
3252 : }
3253 : }
3254 : ELSE
3255 : {
3256 : /* *vf_ind is an integer scale by 0.125f*/
3257 0 : tmp = shl( *vf_ind, ( 15 - 3 ) );
3258 0 : tmp2 = MAX_16;
3259 0 : move16();
3260 0 : IF( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
3261 : {
3262 0 : tmp2 = 26214 /*0.8f Q15*/;
3263 0 : move16();
3264 : }
3265 : }
3266 : }
3267 :
3268 29341 : test();
3269 29341 : IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) )
3270 : {
3271 25058 : voice_factors[0] = mult_r( voice_factors[0], tmp2 );
3272 25058 : move16();
3273 25058 : voice_factors[1] = mult_r( voice_factors[1], tmp2 );
3274 25058 : move16();
3275 25058 : voice_factors[2] = mult_r( voice_factors[2], tmp2 );
3276 25058 : move16();
3277 25058 : voice_factors[3] = mult_r( voice_factors[3], tmp2 );
3278 25058 : move16();
3279 25058 : voice_factors[4] = mult_r( voice_factors[4], tmp2 );
3280 25058 : move16();
3281 : }
3282 : }
3283 :
3284 115109 : test();
3285 115109 : IF( GE_16( element_mode, IVAS_CPE_DFT ) && nlExc16k != NULL )
3286 : {
3287 : /* save buffers for IC-BWE */
3288 : // mvr2r(exc16kWhtnd, nlExc16k, L_FRAME16k);
3289 24220 : Copy( exc16kWhtnd, nlExc16k, L_FRAME16k ); // Q_bwe_exc
3290 24220 : *nlExc16k_e = sub( 15, *Q_bwe_exc );
3291 24220 : move16();
3292 :
3293 : // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), mixExc16k, L_FRAME16k);
3294 24220 : L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
3295 24220 : Word16 temp_fac = round_fx_sat( L_tmp ); // Q15-exp
3296 :
3297 7774620 : FOR( k = 0; k < L_FRAME16k; k++ )
3298 : {
3299 7750400 : mixExc16k[k] = mult_r( White_exc16k[k], temp_fac ); // Q_White_exc16k+15-exp-15 = Q_White_exc16k-exp
3300 7750400 : move16();
3301 : }
3302 24220 : *mixExc16k_e = sub( 15, sub( Q_White_exc16k, exp ) );
3303 24220 : move16();
3304 : }
3305 :
3306 115109 : Copy( White_exc16k, White_exc16k_FB, L_FRAME16k ); // Q_White_exc16k
3307 115109 : prev_Q_bwe_exc_fb = *Q_bwe_exc_fb;
3308 115109 : *Q_bwe_exc_fb = Q_White_exc16k;
3309 115109 : move16();
3310 115109 : move16();
3311 :
3312 115109 : Word16 tbe_demph_fx = shl_sat( *tbe_demph, sub( Q_White_exc16k, *Q_bwe_exc ) ); // Q_White_exc16k
3313 :
3314 115109 : deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, &tbe_demph_fx );
3315 : /* i/o: White_exc16k (Q_White_exc16k) */
3316 : /* i: tbe_demph_fx (Q_White_exc16k) */
3317 115109 : *tbe_demph = shr_sat( tbe_demph_fx, sub( Q_White_exc16k, *Q_bwe_exc ) );
3318 115109 : move16();
3319 :
3320 115109 : test();
3321 115109 : IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
3322 : {
3323 4283 : IF( !flag_plosive ) /* use only LB excitation in case of plosives */
3324 : {
3325 : /* re-scale gaussian excitation at the beginning to gradually move from old energy to new energy */
3326 : /* old_scale = (float) sqrt( *prev_pow_exc16kWhtnd / pow1 ); */
3327 4247 : old_scale = round_fx_sat( root_a_over_b_fx( *prev_pow_exc16kWhtnd, 0, pow1, Q_pow1, &exp ) ); // exp
3328 4247 : old_scale = shl( old_scale, s_min( 0, exp ) ); // limit Q factor to 15
3329 4247 : exp = s_max( 0, exp );
3330 :
3331 : // new_scale = 1.0f;
3332 4247 : new_scale = shr( 32767, exp ); // exp
3333 :
3334 : // step_scale = (new_scale - old_scale) / (L_FRAME16k / 2);
3335 4247 : step_scale = mult_r( sub( new_scale, old_scale ), 205 ); // exp
3336 4247 : scale = old_scale; // exp
3337 4247 : move16();
3338 :
3339 : /* interpolate between the old and the new value of the mixing factor */
3340 4247 : old_fact = *prev_mix_factor; // Q15
3341 4247 : new_fact = mix_factor; // Q15
3342 4247 : move16();
3343 4247 : move16();
3344 :
3345 : // step = (new_fact - old_fact) / (L_FRAME16k / 2);
3346 4247 : step = mult_r( sub( new_fact, old_fact ), 205 ); // Q15
3347 4247 : fact = old_fact; // Q15
3348 4247 : move16();
3349 :
3350 4247 : shift = add( exp, sub( *Q_bwe_exc, Q_White_exc16k ) );
3351 :
3352 : /* mixing of LB and gaussian excitation in the first half of the frame */
3353 683767 : FOR( k = 0; k < L_FRAME16k / 2; k++ )
3354 : {
3355 : /* exc16kWhtnd[k] = (float)fact * (White_exc16k[k] * scale) + (float)(1 - fact) * exc16kWhtnd[k]; */
3356 679520 : L_tmp = L_shl_sat( L_mult( fact, mult_r( White_exc16k[k], scale ) ), shift ); // Q_bwe_exc+16
3357 679520 : exc16kWhtnd[k] = mac_r_sat( L_tmp, sub( 32767, fact ), exc16kWhtnd[k] ); // Q_bwe_exc
3358 679520 : move16();
3359 :
3360 679520 : fact = add_sat( fact, step ); // Q15
3361 679520 : scale = add_sat( scale, step_scale ); // exp
3362 : }
3363 :
3364 4247 : shift = sub( *Q_bwe_exc, Q_White_exc16k );
3365 : /* mixing of LB and gaussian excitation in the second half of the frame */
3366 683767 : FOR( ; k < L_FRAME16k; k++ )
3367 : {
3368 : // exc16kWhtnd[k] = (float)new_fact * White_exc16k[k] + (float)(1 - new_fact) * exc16kWhtnd[k];
3369 679520 : L_tmp = L_shl_sat( L_mult( new_fact, White_exc16k[k] ), shift ); // Q_bwe_exc+16
3370 679520 : exc16kWhtnd[k] = mac_r( L_tmp, sub( 32767, new_fact ), exc16kWhtnd[k] ); // Q_bwe_exc
3371 679520 : move16();
3372 : }
3373 : }
3374 : // preemph(exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph);
3375 4283 : PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); // Q_bwe_exc
3376 : }
3377 : ELSE
3378 : {
3379 110826 : test();
3380 110826 : IF( EQ_16( coder_type, UNVOICED ) || EQ_16( MSFlag, 1 ) )
3381 : {
3382 7222 : scale = 0;
3383 7222 : move16();
3384 :
3385 7222 : test();
3386 7222 : IF( pow1 != 0 && pow22 != 0 )
3387 : {
3388 7222 : L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
3389 7222 : scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */
3390 : }
3391 :
3392 2318262 : FOR( k = 0; k < L_FRAME16k; k++ )
3393 : {
3394 2311040 : exc16kWhtnd[k] = mult_r_sat( White_exc16k[k], scale ); // Q_White_exc16k
3395 2311040 : move16();
3396 : }
3397 :
3398 7222 : Scale_sig( exc16kWhtnd, L_FRAME16k, sub( *Q_bwe_exc, Q_White_exc16k ) ); // Q_bwe_exc
3399 :
3400 7222 : PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); // Q_bwe_exc
3401 : /* i/o: exc16kWhtnd (Q_bwe_exc) */
3402 : /* i/o: tbe_premph (Q_bwe_exc) */
3403 : }
3404 : ELSE
3405 : {
3406 : Word16 nbSubFr, lSubFr;
3407 : Word16 tempQ15;
3408 : Word32 tempQ31;
3409 103604 : nbSubFr = NB_SUBFR16k;
3410 103604 : lSubFr = ( L_FRAME16k / NB_SUBFR16k );
3411 103604 : move16();
3412 103604 : move16();
3413 103604 : IF( LT_32( extl_brate, SWB_TBE_2k8 ) )
3414 : {
3415 78546 : nbSubFr = NB_SUBFR;
3416 78546 : move16();
3417 78546 : lSubFr = ( L_FRAME16k / NB_SUBFR );
3418 78546 : move16();
3419 : }
3420 103604 : k = 0;
3421 103604 : move16();
3422 543078 : FOR( i = 0; i < nbSubFr; i++ )
3423 : {
3424 439474 : test();
3425 439474 : IF( EQ_16( coder_type, VOICED ) && ( LT_32( extl_brate, SWB_TBE_2k8 ) ) )
3426 : {
3427 28164 : exp = 0;
3428 28164 : move16();
3429 28164 : tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */
3430 28164 : temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
3431 28164 : exp = 0;
3432 28164 : move16();
3433 28164 : tempQ15 = Sqrt16( temp, &exp ); /* Q15 */
3434 28164 : temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
3435 :
3436 : /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */
3437 28164 : temp = sub( MAX_16, temp );
3438 28164 : tempQ31 = Mult_32_16( pow1, temp );
3439 28164 : L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
3440 28164 : temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
3441 : }
3442 : ELSE
3443 : {
3444 : /* Adjust noise mixing for formant sharpening filter */
3445 411310 : tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac );
3446 : /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */
3447 411310 : vf_tmp = sub( MAX_16, tempQ15 );
3448 411310 : vf_tmp = mult( voice_factors[i], vf_tmp );
3449 :
3450 411310 : exp = 0;
3451 411310 : move16();
3452 411310 : tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */
3453 411310 : temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
3454 :
3455 : /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */
3456 411310 : temp = sub( MAX_16, vf_tmp );
3457 411310 : tempQ31 = Mult_32_16( pow1, temp );
3458 411310 : L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
3459 411310 : temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
3460 : }
3461 :
3462 439474 : shift = sub( *Q_bwe_exc, Q_White_exc16k );
3463 33592754 : FOR( j = 0; j < lSubFr; j++ )
3464 : {
3465 : /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */
3466 33153280 : L_tmp = L_shl_sat( L_mult( temp2, White_exc16k[k + j] ), shift ); // 16+(Q_bwe_exc)
3467 33153280 : exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] ); // Q_bwe_exc
3468 33153280 : move16();
3469 : }
3470 439474 : k = add( k, lSubFr );
3471 :
3472 : /* estimate the pre-emph factor */
3473 439474 : tempQ15 = sub( MAX_16, voice_factors[i] );
3474 439474 : exp = 0;
3475 439474 : move16();
3476 439474 : temp = Sqrt16( tempQ15, &exp );
3477 439474 : temp = shl( temp, sub( exp, 1 ) );
3478 :
3479 439474 : temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */
3480 439474 : temp = div_s( temp, temp2 ); /* Q15 */
3481 439474 : temp = mult_r( PREEMPH_FAC, temp );
3482 :
3483 439474 : PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph ); // Q_bwe_exc
3484 : /* exc16kWhtnd: Q_bwe_exc;
3485 : tbe_premph: Q_bwe_exc*/
3486 : }
3487 : }
3488 : }
3489 :
3490 115109 : IF( LT_32( extl_brate, SWB_TBE_2k8 ) )
3491 : {
3492 90051 : syn_filt_fx( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 );
3493 : /* i: exc16kWhtnd in Q_bwe_exc */
3494 : /* o: excSHB in Q_bwe_exc */
3495 : }
3496 : ELSE
3497 : {
3498 25058 : set16_fx( zero_mem, 0, LPC_SHB_ORDER );
3499 :
3500 25058 : syn_filt_fx( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 );
3501 25058 : tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
3502 25058 : Scale_sig( tempSHB, 80, tmp );
3503 25058 : syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
3504 25058 : move32();
3505 25058 : syn_shb_ener_sf_q[0] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
3506 25058 : move16();
3507 :
3508 25058 : syn_filt_fx( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 );
3509 25058 : tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
3510 25058 : Scale_sig( tempSHB, 80, tmp );
3511 25058 : syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
3512 25058 : move32();
3513 25058 : syn_shb_ener_sf_q[1] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
3514 25058 : move16();
3515 :
3516 25058 : syn_filt_fx( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 );
3517 25058 : tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
3518 25058 : Scale_sig( tempSHB, 80, tmp );
3519 25058 : syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
3520 25058 : move32();
3521 25058 : syn_shb_ener_sf_q[2] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
3522 25058 : move16();
3523 :
3524 25058 : syn_filt_fx( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 );
3525 25058 : tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
3526 25058 : Scale_sig( tempSHB, 80, tmp );
3527 25058 : syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
3528 25058 : move32();
3529 25058 : syn_shb_ener_sf_q[3] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
3530 25058 : move16();
3531 :
3532 25058 : tmp2 = s_min( s_min( syn_shb_ener_sf_q[0], syn_shb_ener_sf_q[1] ), s_min( syn_shb_ener_sf_q[3], syn_shb_ener_sf_q[2] ) );
3533 25058 : syn_shb_ener_sf[0] = L_shl( syn_shb_ener_sf[0], sub( tmp2, syn_shb_ener_sf_q[0] ) );
3534 25058 : move32();
3535 25058 : syn_shb_ener_sf[1] = L_shl( syn_shb_ener_sf[1], sub( tmp2, syn_shb_ener_sf_q[1] ) );
3536 25058 : move32();
3537 25058 : syn_shb_ener_sf[2] = L_shl( syn_shb_ener_sf[2], sub( tmp2, syn_shb_ener_sf_q[2] ) );
3538 25058 : move32();
3539 25058 : syn_shb_ener_sf[3] = L_shl( syn_shb_ener_sf[3], sub( tmp2, syn_shb_ener_sf_q[3] ) );
3540 25058 : move32();
3541 :
3542 : /* i: exc16kWhtnd in Q_bwe_exc */
3543 : /* o: tempSHB in Q_bwe_exc */
3544 : /* o: syn_shb_ener_sf in tmp2 */
3545 25058 : IF( LE_32( bitrate, MAX_ACELP_BRATE ) )
3546 : {
3547 25058 : L_tmp = sum32_fx( syn_shb_ener_sf, 4 );
3548 :
3549 : /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */
3550 25058 : tmp = shl( Q_shb, 1 );
3551 25058 : L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */
3552 :
3553 25058 : *Q_bwe_exc = sub( *Q_bwe_exc, exp );
3554 25058 : move16(); /* compensate for the exp shift */
3555 25058 : tmp2 = add( prev_Q_bwe_syn, n_mem2 );
3556 25058 : IF( GT_16( *Q_bwe_exc, tmp2 ) )
3557 : {
3558 0 : L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) );
3559 0 : *Q_bwe_exc = tmp2;
3560 0 : move16();
3561 : }
3562 8043618 : FOR( i = 0; i < L_FRAME16k; i++ )
3563 : {
3564 8018560 : L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */
3565 8018560 : exc16kWhtnd[i] = round_fx( L_tmp3 ); /* *Q_bwe_exc - exp */
3566 8018560 : move16();
3567 : }
3568 : }
3569 : /* i: L_tmp2 in (Q31-exp) */
3570 : /* i: exc16kWhtnd in Q_bwe_exc */
3571 : /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp) */
3572 :
3573 : /* Rescale the past memories: LP synth and SHB look ahead buffers */
3574 25058 : tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn );
3575 275638 : FOR( i = 0; i < LPC_SHB_ORDER; i++ )
3576 : {
3577 250580 : state_lpc_syn[i] = shl_sat( state_lpc_syn[i], tmp );
3578 250580 : move16();
3579 : }
3580 526218 : FOR( i = -L_SHB_LAHEAD; i < 0; i++ )
3581 : {
3582 501160 : excSHB[i] = shl_sat( excSHB[i], tmp );
3583 501160 : move16();
3584 : }
3585 : /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */
3586 :
3587 25058 : syn_filt_fx( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 );
3588 25058 : syn_filt_fx( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 );
3589 25058 : syn_filt_fx( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 );
3590 25058 : syn_filt_fx( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 );
3591 : /* i: exc16kWhtnd in (Q_bwe_exc) */
3592 : /* o: excSHB in (Q_bwe_exc) */
3593 : }
3594 :
3595 115109 : IF( EQ_16( extl, FB_TBE ) )
3596 : {
3597 43652 : tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb );
3598 43652 : Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp );
3599 43652 : Scale_sig( fb_tbe_demph, 1, tmp );
3600 43652 : syn_filt_fx( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 );
3601 : /* i: White_exc16k_FB in (Q_bwe_exc_fb) */
3602 : /* o: White_exc16k_FB_temp in (Q_bwe_exc_fb) */
3603 :
3604 480172 : FOR( i = 0; i < 10; i++ )
3605 : {
3606 14405160 : FOR( j = 0; j < 32; ++j )
3607 : {
3608 13968640 : White_exc16k_FB_temp[i * 32 + j] = mult_r_sat( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] );
3609 13968640 : move16();
3610 : }
3611 : }
3612 :
3613 43652 : *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 );
3614 43652 : move16(); /**Q_bwe_exc_fb +35 +1 -16*/
3615 43652 : flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k );
3616 :
3617 43652 : deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph );
3618 : }
3619 : ELSE
3620 : {
3621 71457 : set16_fx( White_exc16k_FB, 0, L_FRAME16k );
3622 : }
3623 :
3624 115109 : *prev_pow_exc16kWhtnd = L_shr_sat( pow1, Q_pow1 ); // power goes above MAX_32
3625 115109 : *prev_mix_factor = mix_factor;
3626 115109 : move32();
3627 115109 : move16();
3628 :
3629 115109 : return;
3630 : }
3631 :
3632 102554 : void GenShapedSHBExcitation_ivas_dec_fx(
3633 : Word16 *excSHB, /* o : synthesized shaped shb excitation Q_bwe_exc*/
3634 : const Word16 *lpc_shb, /* i : lpc coefficients Q12*/
3635 : Word16 *White_exc16k_FB, /* o : white excitation for the Fullband extension Q_bwe_exc */
3636 : Word32 *mem_csfilt, /* i/o: memory */
3637 : Word16 *mem_genSHBexc_filt_down_shb, /* i/o: memory */
3638 : Word16 *state_lpc_syn, /* i/o: memory */
3639 : const Word16 coder_type, /* i : coding type */
3640 : const Word16 *bwe_exc_extended, /* i : bwidth extended excitation */
3641 : Word16 bwe_seed[], /* i/o: random number generator seed */
3642 : Word16 voice_factors[], /* i : voicing factor*/
3643 : const Word16 extl, /* i : extension layer */
3644 : Word16 *tbe_demph, /* i/o: de-emphasis memory */
3645 : Word16 *tbe_premph, /* i/o: pre-emphasis memory */
3646 : Word16 *lpc_shb_sf, /* i: LP coefficients */
3647 : const Word32 shb_ener_sf_32, /* i: input shb ener, Q31 */
3648 : Word16 *shb_res_gshape, /* i: input res gain shape, Q14 */
3649 : Word16 *shb_res,
3650 : Word16 *vf_ind,
3651 : const Word16 formant_fac, /* i : Formant sharpening factor [0..1] */
3652 : Word16 fb_state_lpc_syn[], /* i/o: memory */
3653 : Word16 *fb_tbe_demph, /* i/o: fb de-emphasis memory */
3654 : Word16 *Q_bwe_exc,
3655 : Word16 *Q_bwe_exc_fb,
3656 : const Word16 Q_shb,
3657 : Word16 n_mem2, /* i : n_mem2 scale factor to adjust 24.4/32kbps memories */
3658 : Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */
3659 : const Word32 bitrate, /* i : bitrate */
3660 : const Word16 prev_bfi, /* i : previous frame was concealed */
3661 : const Word16 element_mode, /* i : element mode */
3662 : const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */
3663 : Word16 *nlExc16k, /* i/o: NL exc for IC-BWE */
3664 : Word16 *mixExc16k, /* i/o: exc spreading for IC-BWE */
3665 : const Word32 extl_brate, /* i : extension layer bitarte */
3666 : const Word16 MSFlag, /* i : Multi Source flag */
3667 : Word16 EnvSHBres_4k[], /* i/o: TD envelope of the SHB residual signal */
3668 : Word32 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */
3669 : Word16 *prev_mix_factor, /* i/o: mixing factor in the previous frame */
3670 : Word16 *Env_error, /* o : error in SHB residual envelope modelling Q0 */
3671 : Word16 Env_error_part[] /* o : per-segment error in SHB residual envelope modelling Q0 */
3672 : )
3673 : {
3674 : Word16 i, j, k;
3675 : Word16 wht_fil_mem[LPC_WHTN_ORDER];
3676 : Word16 lpc_whtn[LPC_WHTN_ORDER + 1];
3677 : Word16 R_h[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech MSB */
3678 : Word16 R_l[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech LSB */
3679 : Word16 Q_R;
3680 : Word32 LepsP[LPC_WHTN_ORDER + 1];
3681 : Word16 exc32k[L_FRAME32k], exc16k[L_FRAME16k];
3682 : Word32 pow1, pow22;
3683 : Word16 scale, temp1, temp2, temp3;
3684 : Word16 Q_White_exc16k;
3685 : Word16 excTmp2[L_FRAME16k];
3686 : Word16 *White_exc16k;
3687 : Word16 excNoisyEnv[L_FRAME16k];
3688 102554 : Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */
3689 102554 : move16();
3690 102554 : Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */
3691 102554 : move16();
3692 102554 : move16();
3693 : Word16 varEnvShape;
3694 102554 : Word16 fb_deemph_fac = 15729; /*0.48f in Q15 */
3695 : Word16 exc16kWhtnd[L_FRAME16k];
3696 :
3697 : Word32 L_tmp;
3698 : Word16 vf_tmp;
3699 102554 : Word16 tmp, exp, tmp2 = 0;
3700 102554 : move16();
3701 : Word16 voiceFacEst[NB_SUBFR16k];
3702 : Word16 zero_mem[LPC_SHB_ORDER];
3703 : Word32 syn_shb_ener_sf[4];
3704 : Word16 syn_shb_ener_sf_q[4];
3705 : Word16 tempSHB[80];
3706 : Word16 Q_pow1, Q_pow22;
3707 :
3708 : Word32 L_tmp2, L_tmp3, L_tmp4;
3709 : Word16 temp;
3710 :
3711 : Word16 White_exc16k_FB_temp[L_FRAME16k];
3712 : Word32 White_exc16k_32[L_FRAME16k];
3713 : Word16 White_exc16k_tmp[L_FRAME16k];
3714 : Word16 Q_temp;
3715 : Word16 prev_Q_bwe_exc_fb, Q_exc16kWhtnd;
3716 : Word16 chk1;
3717 : Word32 chk2;
3718 102554 : chk1 = 0;
3719 102554 : chk2 = 0;
3720 102554 : move16();
3721 102554 : move32();
3722 :
3723 : Word16 alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k];
3724 : Word16 cbsize;
3725 : Word16 mix_factor, old_fact, new_fact, fact, old_scale, new_scale, step_scale;
3726 : Word32 c0, c1, c2, c3, c4, c5, den;
3727 : Word16 g1, g2, g, g1_e, g2_e, g_e, den_e, shift, tmp_e, tmp1_e;
3728 : Word16 EnvWhiteExc16k[L_FRAME16k], EnvExc16kWhtnd[L_FRAME16k];
3729 102554 : Word16 EnvWhiteExc16k_4k[L_FRAME4k] = { 0 }, EnvExc16kWhtnd_4k[L_FRAME4k] = { 0 };
3730 : Word16 flag_plosive;
3731 : Word16 delta;
3732 : Word32 c0_part[NUM_SHB_SUBGAINS], c1_part[NUM_SHB_SUBGAINS], c2_part[NUM_SHB_SUBGAINS], c3_part[NUM_SHB_SUBGAINS], c4_part[NUM_SHB_SUBGAINS], c5_part[NUM_SHB_SUBGAINS];
3733 : Word64 W_tmp;
3734 :
3735 102554 : mix_factor = 0; /* Q15 */
3736 102554 : move16();
3737 :
3738 102554 : set16_fx( zero_mem, 0, LPC_SHB_ORDER );
3739 102554 : set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER );
3740 32919834 : FOR( i = 0; i < L_FRAME32k; i = i + 2 )
3741 : {
3742 32817280 : exc32k[i] = negate( bwe_exc_extended[i] ); // Q_bwe_exc
3743 32817280 : move16();
3744 32817280 : exc32k[i + 1] = bwe_exc_extended[i + 1]; // Q_bwe_exc
3745 32817280 : move16();
3746 : }
3747 :
3748 : /* Decimate by 2 */
3749 102554 : Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k ); // Q_bwe_exc
3750 : /* i: exc32k in Q_bwe_exc */
3751 : /* o: exc16k in Q_bwe_exc */
3752 :
3753 102554 : autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 ); // Q_R
3754 : /* Ensure R[0] isn't zero when entering Levinson Durbin */
3755 102554 : R_l[0] = s_max( R_l[0], 1 );
3756 102554 : move16();
3757 512770 : FOR( i = 1; i <= LPC_WHTN_ORDER; i++ )
3758 : {
3759 410216 : L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
3760 410216 : L_Extract( L_tmp, &R_h[i], &R_l[i] ); // Q_R
3761 : }
3762 102554 : E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL );
3763 102554 : Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); // Q12
3764 102554 : fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 ); // Q_bwe_exc
3765 :
3766 : /* i: exc16k in Q_bwe_exc */
3767 : /* o: exc16kWhtnd in Q_bwe_exc */
3768 :
3769 102554 : IF( GE_32( extl_brate, SWB_TBE_2k8 ) )
3770 : {
3771 21546 : temp2 = 0;
3772 21546 : move16();
3773 107730 : FOR( j = 0; j < 4; j++ )
3774 : {
3775 86184 : temp1 = shb_res_gshape[j];
3776 86184 : move16();
3777 6980904 : FOR( i = 0; i < 80; i++ )
3778 : {
3779 6894720 : exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); // Q_bwe_exc
3780 6894720 : move16();
3781 : /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */
3782 : }
3783 86184 : temp2 = add( temp2, 80 );
3784 : }
3785 : }
3786 :
3787 : /* Estimate pow1 associated with Low band nonlinear extended excitation */
3788 : /* pow1=0.00001f */
3789 102554 : tmp = sub( shl( *Q_bwe_exc, 1 ), 31 );
3790 102554 : pow1 = L_shl_sat( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */
3791 32919834 : FOR( k = 0; k < L_FRAME16k; k++ )
3792 : {
3793 : /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/
3794 32817280 : excTmp2[k] = abs_s( exc16kWhtnd[k] );
3795 32817280 : move16();
3796 32817280 : chk1 = s_or( chk1, exc16kWhtnd[k] );
3797 :
3798 : /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */
3799 32817280 : pow1 = L_mac0_sat( pow1, exc16kWhtnd[k], exc16kWhtnd[k] ); /* 2*Q_bwe_exc */
3800 : }
3801 102554 : Q_pow1 = shl( *Q_bwe_exc, 1 );
3802 :
3803 102554 : test();
3804 :
3805 102554 : IF( flag_ACELP16k == 0 )
3806 : {
3807 : /* varEnvShape = mean_fx(voice_factors, 4); */
3808 : /* unroll the loop */
3809 48570 : L_tmp = L_mult( voice_factors[0], 8192 /*0.25 in Q15 */ );
3810 48570 : L_tmp = L_mac( L_tmp, voice_factors[1], 8192 /*0.25 in Q15 */ );
3811 48570 : L_tmp = L_mac( L_tmp, voice_factors[2], 8192 /*0.25 in Q15 */ );
3812 48570 : varEnvShape = mac_r( L_tmp, voice_factors[3], 8192 /*0.25 in Q15 */ ); /* varEnvShape in Q15 */
3813 : }
3814 : ELSE /* 16k core */
3815 : {
3816 : /* varEnvShape = mean_fx(voice_factors, 5); */
3817 : /* unroll the loop */
3818 53984 : L_tmp = L_mult( voice_factors[0], 6554 /*0.2 in Q15 */ );
3819 53984 : L_tmp = L_mac( L_tmp, voice_factors[1], 6554 /*0.2 in Q15 */ );
3820 53984 : L_tmp = L_mac( L_tmp, voice_factors[2], 6554 /*0.2 in Q15 */ );
3821 53984 : L_tmp = L_mac( L_tmp, voice_factors[3], 6554 /*0.2 in Q15 */ );
3822 53984 : varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 /*0.2 in Q15 */ ); /* varEnvShape in Q15 */
3823 : }
3824 :
3825 102554 : IF( EQ_16( extl, FB_TBE ) )
3826 : {
3827 : /*pow(varEnvShape,3) */
3828 39990 : tmp = mult_r( varEnvShape, varEnvShape );
3829 39990 : tmp = mult_r( tmp, varEnvShape );
3830 :
3831 : /* max_val((0.68f - (float)pow(varEnvShape, 3)), 0.48f); */
3832 39990 : fb_deemph_fac = sub( 22282 /*0.68f Q15*/, tmp );
3833 39990 : fb_deemph_fac = s_max( fb_deemph_fac, 15729 /*0.48f Q15*/ );
3834 : }
3835 :
3836 : /*varEnvShape = 1.09875f - 0.49875f * varEnvShape; */
3837 102554 : varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape );
3838 :
3839 : /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */
3840 102554 : varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ );
3841 102554 : varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ );
3842 102554 : varEnvShape = shl( varEnvShape, 1 );
3843 102554 : csfilt_num2[0] = sub( MAX_16, varEnvShape ); // Q15
3844 102554 : move16();
3845 102554 : neg_csfilt_den2[1] = varEnvShape; // Q15
3846 102554 : move16();
3847 :
3848 102554 : test();
3849 102554 : test();
3850 102554 : test();
3851 :
3852 102554 : IF( EQ_16( element_mode, EVS_MONO ) && *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) )
3853 : {
3854 : /* pre-init smoothing filter to avoid energy drop outs */
3855 0 : L_tmp = L_mult( excTmp2[0], 1638 );
3856 0 : FOR( i = 1; i < L_SUBFR16k / 4; i++ )
3857 : {
3858 0 : L_tmp = L_mac( L_tmp, excTmp2[i], 1638 ); /*1638 = 1/20 in Q15*/
3859 : }
3860 : /*L_tmp = sum(excTmp2, L_SUBFR16k/4)*(1/20) where L_SUBFR16k/4 =20 */
3861 :
3862 : /* don't apply for FB in case the FB start-frame was potentially lost - White_exc16k is very sensitive to enery mismatch between enc - dec */
3863 : /* rather stick to the more conservative approach, to avoid potential clippings */
3864 0 : test();
3865 0 : IF( !( prev_bfi && EQ_16( extl, FB_TBE ) ) )
3866 : {
3867 : /* use weak smoothing for 1st frame after switching to make filter recover more quickly */
3868 0 : varEnvShape = 26214 /*0.8f Q15*/;
3869 0 : move16();
3870 0 : csfilt_num2[0] = sub( MAX_16, varEnvShape );
3871 0 : move16();
3872 0 : neg_csfilt_den2[1] = varEnvShape;
3873 0 : move16();
3874 : }
3875 :
3876 0 : *mem_csfilt = Mult_32_16( L_tmp, varEnvShape );
3877 0 : move32();
3878 : }
3879 :
3880 102554 : IF( MSFlag > 0 )
3881 : {
3882 : // varEnvShape = 0.995f;
3883 5025 : varEnvShape = 32604;
3884 5025 : move16();
3885 5025 : csfilt_num2[0] = 32768 - varEnvShape;
3886 : // csfilt_num2[0] = sub( 32767, varEnvShape );
3887 5025 : move16();
3888 5025 : neg_csfilt_den2[1] = varEnvShape;
3889 5025 : move16();
3890 : }
3891 :
3892 102554 : White_exc16k = exc16k;
3893 102554 : move16();
3894 102554 : Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc );
3895 102554 : IF( *mem_csfilt )
3896 : {
3897 67708 : Q_excTmp2 = s_min( Q_excTmp2, sub( add( norm_l( *mem_csfilt ), *Q_bwe_exc ), 1 ) );
3898 : }
3899 102554 : test();
3900 : /* Track the low band envelope */
3901 102554 : IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) )
3902 : {
3903 27918 : test();
3904 27918 : IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) )
3905 : {
3906 23812 : mem_csfilt_left = 0;
3907 23812 : mem_csfilt_right = 0;
3908 23812 : move16();
3909 23812 : move16();
3910 7643652 : FOR( k = 0; k < L_FRAME16k; k++ )
3911 : {
3912 : // excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k];
3913 7619840 : excNoisyEnvLeft[k] = add( mem_csfilt_left, mult_r( csfilt_num2[0], shl( excTmp2[k], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2
3914 7619840 : move16();
3915 : // mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k];
3916 7619840 : mem_csfilt_left = mult_r( neg_csfilt_den2[1], excNoisyEnvLeft[k] ); // Q_excTmp2
3917 : // excNoisyEnvRight[L_FRAME16k - k - 1] = mem_csfilt_right + csfilt_num2[0] * excTmp2[L_FRAME16k - k - 1];
3918 7619840 : excNoisyEnvRight[L_FRAME16k - k - 1] = add( mem_csfilt_right, mult_r( csfilt_num2[0], shl( excTmp2[L_FRAME16k - k - 1], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2
3919 7619840 : move16();
3920 : // mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1];
3921 7619840 : mem_csfilt_right = mult_r( neg_csfilt_den2[1], excNoisyEnvRight[L_FRAME16k - k - 1] ); // Q_excTmp2
3922 : }
3923 :
3924 23812 : alpha = 0;
3925 23812 : move16();
3926 : // step = 1.0f / L_FRAME16k;
3927 23812 : step = 102; // Q15
3928 23812 : move16();
3929 7643652 : FOR( k = 0; k < L_FRAME16k; k++ )
3930 : {
3931 : // excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + (1 - alpha) * excNoisyEnvRight[k];
3932 7619840 : excNoisyEnv[k] = add( mult_r( alpha, excNoisyEnvLeft[k] ), mult_r( sub( 32767, alpha ), excNoisyEnvRight[k] ) ); // Q_excTmp2
3933 7619840 : move16();
3934 7619840 : alpha = add( alpha, step );
3935 : }
3936 : }
3937 : }
3938 : ELSE
3939 :
3940 : {
3941 : /* Track the low band envelope */
3942 74636 : L_tmp = L_shl( *mem_csfilt, sub( Q_excTmp2, *Q_bwe_exc ) );
3943 74636 : move32();
3944 23958156 : FOR( i = 0; i < L_FRAME16k; i++ )
3945 : {
3946 23883520 : excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], shl( excTmp2[i], sub( Q_excTmp2, *Q_bwe_exc ) ) );
3947 23883520 : move16();
3948 : /* Work-around to avoid 0s for very small value*/
3949 23883520 : test();
3950 23883520 : test();
3951 23883520 : test();
3952 23883520 : test();
3953 23883520 : if ( excNoisyEnv[i] == 0 && ( L_tmp != 0 || ( csfilt_num2[0] != 0 && excTmp2[i] != 0 ) ) )
3954 : {
3955 5133 : excNoisyEnv[i] = 1;
3956 5133 : move16();
3957 : }
3958 : /* excNoisyEnv : Q_excTmp2,
3959 : *mem_csfilt: Q_excTmp2+16, excTmp2: Q_excTmp2, csfilt_num2[0] Q_excTmp2 */
3960 23883520 : L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_excTmp2 + 16 */
3961 : }
3962 74636 : *mem_csfilt = L_shr( L_tmp, sub( Q_excTmp2, *Q_bwe_exc ) );
3963 74636 : move32();
3964 : }
3965 102554 : test();
3966 102554 : IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
3967 4106 : {
3968 : /* generate gaussian (white) excitation */
3969 1318026 : FOR( k = 0; k < L_FRAME16k; k++ )
3970 : {
3971 1313920 : White_exc16k[k] = own_random( &bwe_seed[0] );
3972 1313920 : move16();
3973 : }
3974 :
3975 : /* normalize the amplitude of the gaussian excitation to that of the LB exc. */
3976 4106 : Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT_IN_Q49;
3977 4106 : move32();
3978 4106 : move32();
3979 4106 : pow22 = POW_EXC16k_WHTND_FX;
3980 4106 : Q_pow22 = -6;
3981 4106 : move16();
3982 : // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), White_exc16k, L_FRAME16k);
3983 4106 : Word16 pow1_exp = sub( Q31, Q_pow1 );
3984 4106 : Word32 temp_pow = Sqrt32( pow1, &pow1_exp );
3985 4106 : temp_pow = Mpy_32_32( temp_pow, pow22_inv );
3986 : /*Word16 out_exp;
3987 : Word32 temp_pow1 = root_a_over_b_fx(pow1, Q_pow1, pow22, Q_pow22, &out_exp);
3988 : temp_pow1 = L_shl(temp_pow1, out_exp);*/
3989 : // v_multc_fixed_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k);
3990 4106 : L_tmp = 0;
3991 4106 : move32();
3992 4106 : shift = getScaleFactor16( White_exc16k, L_FRAME16k );
3993 1318026 : FOR( k = 0; k < L_FRAME16k; k++ )
3994 : {
3995 1313920 : White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] );
3996 1313920 : move32();
3997 1313920 : White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], shift ) ); // Q_White_exc16k
3998 1313920 : move16();
3999 1313920 : L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
4000 : }
4001 4106 : Q_White_exc16k = add( shift, sub( 49 - 31, pow1_exp ) );
4002 4106 : Q_temp = norm_l( L_tmp );
4003 4106 : IF( L_tmp == 0 )
4004 : {
4005 0 : Q_temp = 31;
4006 0 : move16();
4007 : }
4008 : }
4009 : ELSE
4010 : {
4011 : /* create a random excitation - Reuse exc16k memory */
4012 98448 : White_exc16k = exc16k;
4013 98448 : move16();
4014 98448 : create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed ); // Q5
4015 98448 : create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); // Q5
4016 :
4017 98448 : L_tmp = L_deposit_l( 0 );
4018 98448 : tmp = add( *Q_bwe_exc, 1 );
4019 31601808 : FOR( k = 0; k < L_FRAME16k; k++ )
4020 : {
4021 31503360 : L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_excTmp2) +5 +1*/
4022 31503360 : White_exc16k_32[k] = L_tmp4; /* (Q_excTmp2) +5 +1*/
4023 31503360 : move32();
4024 31503360 : L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
4025 : }
4026 98448 : Q_temp = norm_l( L_tmp );
4027 98448 : IF( L_tmp == 0 )
4028 : {
4029 23 : Q_temp = 31;
4030 23 : move16();
4031 : }
4032 : /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/
4033 : /* White_exc16k in Q6 */
4034 :
4035 : /* calculate pow22 */
4036 : /* pow22=0.00001f */
4037 98448 : tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 );
4038 98448 : Word64 sum = W_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(*Q_bwe_exc-NOISE_QADJ) */
4039 98448 : Q_White_exc16k = getScaleFactor32( White_exc16k_32, L_FRAME16k );
4040 31601808 : FOR( k = 0; k < L_FRAME16k; k++ )
4041 : {
4042 :
4043 31503360 : White_exc16k[k] = extract_h( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); // Q_excTmp2 + 6 + Q_White_exc16k - 16 ==> Q_excTmp2 + Q_White_exc16k - 10
4044 31503360 : chk2 = L_or( chk2, White_exc16k_32[k] );
4045 : /* i: excNoisyEnv in (Q_excTmp2) */
4046 : /* i: White_exc16k in Q6 */
4047 : /* o: White_exc16k in (Q_White_exc16k) */
4048 : /* pow22 += White_exc16k[k] * White_exc16k[k]; */
4049 31503360 : sum = W_mac0_16_16( sum, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2 + Q_White_exc16k - 10)*/
4050 31503360 : move16();
4051 : }
4052 98448 : Q_pow22 = W_norm( sum );
4053 98448 : pow22 = W_extract_h( W_shl( sum, Q_pow22 ) ); // 2*(Q_excTmp2 + Q_White_exc16k - 10)+Q_pow22-32
4054 98448 : Q_pow22 = sub( add( Q_pow22, shl( sub( add( Q_White_exc16k, Q_excTmp2 ), 10 ), 1 ) ), 32 );
4055 98448 : Q_White_exc16k = add( Q_White_exc16k, sub( Q_excTmp2, 10 ) );
4056 : }
4057 :
4058 102554 : flag_plosive = 0;
4059 102554 : move16();
4060 102554 : test();
4061 102554 : test();
4062 102554 : test();
4063 102554 : IF( GE_32( extl_brate, SWB_TBE_2k8 ) || EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
4064 : {
4065 25652 : IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */
4066 : {
4067 0 : test();
4068 0 : IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
4069 : {
4070 0 : FOR( k = 0; k < L_FRAME16k; k++ )
4071 : {
4072 0 : White_exc16k_tmp[k] = round_fx( L_shl( White_exc16k_32[k], *Q_bwe_exc ) );
4073 0 : move16();
4074 : }
4075 :
4076 : /* calculate TD envelopes of exc16kWhtnd and White_exc16k */
4077 0 : find_td_envelope_fx( White_exc16k_tmp, L_FRAME16k, 20, NULL, EnvWhiteExc16k ); /* Q_bwe_exc */
4078 0 : find_td_envelope_fx( exc16kWhtnd, L_FRAME16k, 20, NULL, EnvExc16kWhtnd ); /* Q_bwe_exc */
4079 :
4080 0 : FOR( k = 0; k < L_FRAME4k; k++ )
4081 : {
4082 0 : EnvWhiteExc16k_4k[k] = EnvWhiteExc16k[4 * k]; /* Q_bwe_exc */
4083 0 : move16();
4084 0 : EnvExc16kWhtnd_4k[k] = EnvExc16kWhtnd[4 * k]; /* Q_bwe_exc */
4085 0 : move16();
4086 : }
4087 :
4088 : /* calculate the optimal mix factor */
4089 0 : c0 = c1 = c2 = c3 = c4 = c5 = 0; /* Q0 */
4090 0 : move32();
4091 0 : move32();
4092 0 : move32();
4093 0 : move32();
4094 0 : move32();
4095 0 : move32();
4096 :
4097 0 : temp1 = add( shl( *Q_bwe_exc, 1 ), 1 );
4098 0 : temp2 = add( add( Q_shb, *Q_bwe_exc ), 1 );
4099 0 : temp3 = add( shl( Q_shb, 1 ), 1 );
4100 0 : FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ )
4101 : {
4102 : // c0_part[i] = sum2_f( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
4103 0 : c0_part[i] = L_shr( sum2_fx( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */
4104 0 : move32();
4105 : // c1_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
4106 0 : c1_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */
4107 0 : move32();
4108 : // c2_part[i] = sum2_f( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
4109 0 : c2_part[i] = L_shr( sum2_fx( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */
4110 0 : move32();
4111 : // c3_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
4112 0 : c3_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */
4113 0 : move32();
4114 : // c4_part[i] = 2.0f * dotp( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
4115 0 : c4_part[i] = L_shr( Dot_product( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), sub( temp1, 1 ) ); /* Q0 */
4116 0 : move32();
4117 : // c5_part[i] = sum2_f( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
4118 0 : c5_part[i] = L_shr( sum2_fx( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp3 ); /* Q0 */
4119 0 : move32();
4120 :
4121 0 : c0 = L_add( c0, c0_part[i] );
4122 0 : c1 = L_add( c1, c1_part[i] );
4123 0 : c2 = L_add( c2, c2_part[i] );
4124 0 : c3 = L_add( c3, c3_part[i] );
4125 0 : c4 = L_add( c4, c4_part[i] );
4126 0 : c5 = L_add( c5, c5_part[i] );
4127 : }
4128 :
4129 : // den = 4.0f * c0 * c2 - c4 * c4;
4130 0 : W_tmp = W_sub( W_shl( W_mult0_32_32( c0, c2 ), 2 ), W_mult0_32_32( c4, c4 ) );
4131 0 : den_e = 63;
4132 0 : move16();
4133 0 : shift = W_norm( W_tmp );
4134 0 : den = W_extract_h( W_shl( W_tmp, shift ) );
4135 0 : den_e = sub( den_e, shift );
4136 :
4137 0 : IF( den == 0 )
4138 : {
4139 0 : den = 1;
4140 0 : move32();
4141 0 : den_e = 31;
4142 0 : move16();
4143 : }
4144 :
4145 : // g1 = ( c3 * c4 - 2 * c1 * c2 ) / den;
4146 0 : W_tmp = W_sub( W_mult0_32_32( c3, c4 ), W_shl( W_mult0_32_32( c1, c2 ), 1 ) );
4147 0 : g1_e = 63;
4148 0 : move16();
4149 0 : shift = W_norm( W_tmp );
4150 0 : L_tmp = W_extract_h( W_shl( W_tmp, shift ) );
4151 0 : g1_e = sub( g1_e, shift );
4152 :
4153 0 : g1 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e );
4154 0 : g1_e = sub( add( tmp_e, g1_e ), den_e );
4155 :
4156 : // g2 = ( c1 * c4 - 2 * c0 * c3 ) / den;
4157 0 : W_tmp = W_sub( W_mult0_32_32( c1, c4 ), W_shl( W_mult0_32_32( c0, c3 ), 1 ) );
4158 0 : g2_e = 63;
4159 0 : move16();
4160 0 : shift = W_norm( W_tmp );
4161 0 : L_tmp = W_extract_h( W_shl( W_tmp, shift ) );
4162 0 : g2_e = sub( g2_e, shift );
4163 :
4164 0 : g2 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e );
4165 0 : g2_e = sub( add( tmp_e, g2_e ), den_e );
4166 :
4167 : // *Env_error = 0.0f;
4168 0 : *Env_error = 0;
4169 0 : move16();
4170 0 : flag_plosive = 0;
4171 0 : move16();
4172 0 : FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ )
4173 : {
4174 : // Env_error_part[i] = c5_part[i] + g1 * g1 * c0_part[i] + g1 * c1_part[i] + g2 * g2 * c2_part[i] + g2 * c3_part[i] + g1 * g2 * c4_part[i];
4175 0 : L_tmp = BASOP_Util_Add_Mant32Exp( c5_part[i], 31, Mpy_32_32( L_mult( g1, g1 ), c0_part[i] ), add( shl( g1_e, 1 ), 31 ), &tmp_e );
4176 0 : L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c1_part[i], g1 ), add( 31, g1_e ), &tmp_e );
4177 0 : L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g2, g2 ), c2_part[i] ), add( shl( g2_e, 1 ), 31 ), &tmp_e );
4178 0 : L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c3_part[i], g2 ), add( 31, g2_e ), &tmp_e );
4179 0 : L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g1, g2 ), c4_part[i] ), add( add( g1_e, g2_e ), 31 ), &tmp_e );
4180 :
4181 : // Env_error_part[i] = L_shr( L_tmp, 31 - tmp_e ); // Check Exponent
4182 0 : Env_error_part[i] = extract_h( L_shr_sat( L_tmp, sub( Q15, tmp_e ) ) ); /* Q0 */
4183 0 : move16();
4184 :
4185 : // *Env_error += Env_error_part[i];
4186 0 : *Env_error = add_sat( *Env_error, Env_error_part[i] ); /* Q0 */
4187 0 : move16();
4188 :
4189 0 : if ( GT_16( Env_error_part[i], THR_ENV_ERROR_PLOSIVE_FX ) ) // Check which Q
4190 : {
4191 : /* envelope error is too high -> likely a plosive */
4192 0 : flag_plosive = 1;
4193 0 : move16();
4194 : }
4195 : }
4196 :
4197 0 : IF( flag_plosive )
4198 : {
4199 : /* plosive detected -> set the mixing factor to 0 */
4200 0 : *vf_ind = 0;
4201 0 : move16();
4202 0 : mix_factor = 0;
4203 0 : move16();
4204 : }
4205 : ELSE
4206 : {
4207 : /* normalize gain */
4208 : // g = g2 / ( g1 + g2 );
4209 0 : tmp1_e = BASOP_Util_Add_MantExp( g1, g1_e, g2, g2_e, &tmp );
4210 0 : IF( tmp == 0 )
4211 : {
4212 0 : tmp = 1;
4213 0 : move16();
4214 0 : tmp1_e = 15;
4215 0 : move16();
4216 : }
4217 0 : g = BASOP_Util_Divide1616_Scale( g2, tmp, &tmp_e );
4218 0 : g_e = sub( add( tmp_e, g2_e ), tmp1_e );
4219 :
4220 : /* quantization of the mixing factor */
4221 0 : cbsize = 1 << NUM_BITS_SHB_VF;
4222 0 : move16();
4223 : // delta = 1.0f / ( cbsize - 1 );
4224 0 : delta = 2341; /* Q14 */
4225 0 : move16();
4226 : // if ( g > 1.0f )
4227 0 : IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), ONE_IN_Q31, 0 ) > 0 )
4228 : {
4229 : // g = 1.0f;
4230 0 : g = MAX16B; /* Q15 */
4231 : }
4232 : // else if ( g < shl( delta, ( 15 - g_e ) - 14 ) )
4233 0 : ELSE IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), delta, 17 ) < 0 )
4234 : {
4235 : /* prevent low gains to be quantized to 0 as this is reserved for plosives */
4236 : // g = delta;
4237 0 : g = shl( delta, 1 ); /* Q15 */
4238 : }
4239 :
4240 0 : *vf_ind = usquant_fx( g, &mix_factor, 0, delta, cbsize );
4241 0 : move16();
4242 : }
4243 : }
4244 : ELSE
4245 : {
4246 0 : Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k,
4247 0 : ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind );
4248 0 : tmp = voiceFacEst[0];
4249 0 : tmp2 = MAX_16;
4250 0 : move16();
4251 0 : move16();
4252 0 : if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
4253 : {
4254 0 : tmp2 = 26214 /*0.8f Q15*/;
4255 0 : move16();
4256 : }
4257 : }
4258 : }
4259 : ELSE /* decoder side */
4260 : {
4261 25652 : test();
4262 25652 : IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
4263 : {
4264 4106 : IF( *vf_ind == 0 )
4265 : {
4266 : // mix_factor = 0.0f;
4267 21 : mix_factor = 0;
4268 21 : move16();
4269 21 : flag_plosive = 1;
4270 21 : move16();
4271 : }
4272 : ELSE
4273 : {
4274 : // mix_factor = usdequant(*vf_ind, 0.0f, 1.0f / ((1 << NUM_BITS_SHB_VF) - 1));
4275 4085 : mix_factor = usdequant_fx( *vf_ind, 0, 2341 );
4276 : }
4277 : }
4278 : ELSE
4279 : {
4280 : /* *vf_ind is an integer scale by 0.125f*/
4281 21546 : tmp = shl( *vf_ind, ( 15 - 3 ) );
4282 21546 : tmp2 = MAX_16;
4283 21546 : move16();
4284 21546 : IF( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
4285 : {
4286 21536 : tmp2 = 26214 /*0.8f Q15*/;
4287 21536 : move16();
4288 : }
4289 : }
4290 : }
4291 25652 : test();
4292 25652 : IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) )
4293 : {
4294 21546 : voice_factors[0] = mult_r( voice_factors[0], tmp2 );
4295 21546 : move16();
4296 21546 : voice_factors[1] = mult_r( voice_factors[1], tmp2 );
4297 21546 : move16();
4298 21546 : voice_factors[2] = mult_r( voice_factors[2], tmp2 );
4299 21546 : move16();
4300 21546 : voice_factors[3] = mult_r( voice_factors[3], tmp2 );
4301 21546 : move16();
4302 21546 : voice_factors[4] = mult_r( voice_factors[4], tmp2 );
4303 21546 : move16();
4304 : }
4305 : }
4306 102554 : test();
4307 102554 : IF( GE_16( element_mode, IVAS_CPE_DFT ) && nlExc16k != NULL )
4308 : {
4309 : /* save buffers for IC-BWE */
4310 : // mvr2r(exc16kWhtnd, nlExc16k, L_FRAME16k);
4311 16066 : Copy( exc16kWhtnd, nlExc16k, L_FRAME16k );
4312 : // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), mixExc16k, L_FRAME16k);
4313 : /*Word16 temp_fac = divide3232(L_shr(pow1, Q_pow1), pow22);
4314 : Word16 temp_fac_exp = 0;
4315 : temp_fac = Sqrt16(temp_fac, &temp_fac_exp);*/
4316 16066 : L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
4317 16066 : Word16 temp_fac = round_fx_sat( L_shl_sat( L_tmp, exp ) ); // Q15
4318 16066 : shift = sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k );
4319 : // v_multc_fixed_16_16(White_exc16k,shr(temp_fac, temp_fac_exp) , mixExc16k, L_FRAME16k);
4320 5157186 : FOR( k = 0; k < L_FRAME16k; k++ )
4321 : {
4322 5141120 : mixExc16k[k] = mult_r( shl_sat( White_exc16k[k], shift ), temp_fac );
4323 5141120 : move16();
4324 : }
4325 : }
4326 :
4327 102554 : tmp = sub( Q_temp, 3 );
4328 32919834 : FOR( k = 0; k < L_FRAME16k; k++ )
4329 : {
4330 32817280 : White_exc16k_FB[k] = White_exc16k[k]; /* Q_White_exc16k */
4331 : }
4332 102554 : prev_Q_bwe_exc_fb = *Q_bwe_exc_fb;
4333 102554 : move16();
4334 102554 : *Q_bwe_exc_fb = Q_White_exc16k;
4335 102554 : move16();
4336 102554 : *tbe_demph = shl_sat( *tbe_demph, sub( Q_White_exc16k, sub( *Q_bwe_exc, NOISE_QADJ ) ) );
4337 102554 : deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph );
4338 102554 : *tbe_demph = shl_sat( *tbe_demph, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) );
4339 :
4340 102554 : Q_exc16kWhtnd = getScaleFactor16( exc16kWhtnd, L_FRAME16k );
4341 102554 : Q_exc16kWhtnd = add( Q_exc16kWhtnd, *Q_bwe_exc );
4342 :
4343 102554 : shift = getScaleFactor16( White_exc16k, L_FRAME16k );
4344 :
4345 102554 : shift = s_min( Q_exc16kWhtnd, add( shift, Q_White_exc16k ) );
4346 102554 : scale_sig( exc16kWhtnd, L_FRAME16k, sub( shift, *Q_bwe_exc ) );
4347 102554 : scale_sig( White_exc16k, L_FRAME16k, sub( shift, Q_White_exc16k ) );
4348 :
4349 102554 : Q_exc16kWhtnd = Q_White_exc16k = shift;
4350 102554 : move16();
4351 102554 : move16();
4352 102554 : *tbe_premph = shl_sat( *tbe_premph, sub( Q_White_exc16k, sub( *Q_bwe_exc, NOISE_QADJ ) ) );
4353 102554 : move16();
4354 102554 : test();
4355 102554 : IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
4356 : {
4357 4106 : IF( !flag_plosive ) /* use only LB excitation in case of plosives */
4358 : {
4359 : /* re-scale gaussian excitation at the beginning to gradually move from old energy to new energy */
4360 : // old_scale = (float)sqrt(*prev_pow_exc16kWhtnd / pow1);
4361 : // old_scale = divide3232(*prev_pow_exc16kWhtnd, pow1); // exp = Q15 - (Q_pow1)
4362 : // Word16 old_scale_exp = Q15 - (Q_pow1);
4363 : // old_scale = Sqrt16(old_scale, &old_scale_exp);
4364 : // old_scale = shl(old_scale, old_scale_exp); //Q15
4365 4085 : L_tmp = root_a_over_b_fx( *prev_pow_exc16kWhtnd, 0, pow1, Q_pow1, &exp );
4366 4085 : old_scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); // Q15
4367 : // new_scale = 1.0f;
4368 4085 : new_scale = 32767;
4369 4085 : move16();
4370 : // step_scale = (new_scale - old_scale) / (L_FRAME16k / 2);
4371 4085 : step_scale = mult_r( sub( new_scale, old_scale ), 205 );
4372 4085 : scale = old_scale;
4373 4085 : move16();
4374 : /* interpolate between the old and the new value of the mixing factor */
4375 4085 : old_fact = *prev_mix_factor;
4376 4085 : move16();
4377 4085 : new_fact = mix_factor;
4378 4085 : move16();
4379 : // step = (new_fact - old_fact) / (L_FRAME16k / 2);
4380 4085 : step = mult_r( sub( new_fact, old_fact ), 205 );
4381 4085 : fact = old_fact;
4382 4085 : move16();
4383 : /* mixing of LB and gaussian excitation in the first half of the frame */
4384 657685 : FOR( k = 0; k < L_FRAME16k / 2; k++ )
4385 : {
4386 653600 : exc16kWhtnd[k] = mac_r( L_mult( fact, mult_r( White_exc16k[k], scale ) ),
4387 653600 : sub( 32767, fact ), exc16kWhtnd[k] ); // Q_exc16kWhtnd
4388 653600 : move16();
4389 653600 : fact = add_sat( fact, step );
4390 653600 : scale = add_sat( scale, step_scale );
4391 : }
4392 :
4393 : /* mixing of LB and gaussian excitation in the second half of the frame */
4394 657685 : FOR( ; k < L_FRAME16k; k++ )
4395 : {
4396 653600 : exc16kWhtnd[k] = mac_r( L_mult( new_fact, White_exc16k[k] ),
4397 653600 : sub( 32767, new_fact ), exc16kWhtnd[k] ); // Q_exc16kWhtnd
4398 653600 : move16();
4399 : }
4400 : }
4401 : // preemph(exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph);
4402 4106 : PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph );
4403 : }
4404 : ELSE
4405 : {
4406 98448 : test();
4407 98448 : IF( EQ_16( coder_type, UNVOICED ) || EQ_16( MSFlag, 1 ) )
4408 : {
4409 6027 : L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
4410 6027 : test();
4411 6027 : if ( chk1 == 0 && chk2 == 0 )
4412 : {
4413 0 : L_tmp = 0;
4414 0 : move32();
4415 : }
4416 6027 : scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */
4417 1934667 : FOR( k = 0; k < L_FRAME16k; k++ )
4418 : {
4419 1928640 : exc16kWhtnd[k] = mult_r_sat( White_exc16k[k], scale );
4420 1928640 : move16();
4421 : }
4422 6027 : PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph );
4423 : /* i/o: exc16kWhtnd (Q_exc16kWhtnd) */
4424 : /* i/o: tbe_premph (Q_exc16kWhtnd) */
4425 : }
4426 : ELSE
4427 : {
4428 : Word16 nbSubFr, lSubFr;
4429 : Word16 tempQ15;
4430 : Word32 tempQ31;
4431 92421 : nbSubFr = NB_SUBFR16k;
4432 92421 : lSubFr = ( L_FRAME16k / NB_SUBFR16k );
4433 92421 : move16();
4434 92421 : move16();
4435 92421 : IF( LT_32( extl_brate, SWB_TBE_2k8 ) )
4436 : {
4437 70883 : nbSubFr = NB_SUBFR;
4438 70883 : move16();
4439 70883 : lSubFr = ( L_FRAME16k / NB_SUBFR );
4440 70883 : move16();
4441 : }
4442 92421 : k = 0;
4443 92421 : move16();
4444 483643 : FOR( i = 0; i < nbSubFr; i++ )
4445 : {
4446 391222 : test();
4447 391222 : IF( EQ_16( coder_type, VOICED ) && ( LT_32( extl_brate, SWB_TBE_2k8 ) ) )
4448 : {
4449 23092 : exp = 0;
4450 23092 : move16();
4451 23092 : tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */
4452 23092 : temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
4453 23092 : exp = 0;
4454 23092 : move16();
4455 23092 : tempQ15 = Sqrt16( temp, &exp ); /* Q15 */
4456 23092 : temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
4457 :
4458 : /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */
4459 23092 : temp = sub( MAX_16, temp );
4460 23092 : tempQ31 = Mult_32_16( pow1, temp );
4461 23092 : L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
4462 23092 : temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
4463 : }
4464 : ELSE
4465 : {
4466 : /* Adjust noise mixing for formant sharpening filter */
4467 368130 : tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac );
4468 : /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */
4469 368130 : vf_tmp = sub( MAX_16, tempQ15 );
4470 368130 : vf_tmp = mult( voice_factors[i], vf_tmp );
4471 :
4472 368130 : exp = 0;
4473 368130 : move16();
4474 368130 : tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */
4475 368130 : temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
4476 :
4477 : /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */
4478 368130 : temp = sub( MAX_16, vf_tmp );
4479 368130 : tempQ31 = Mult_32_16( pow1, temp );
4480 368130 : L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
4481 368130 : temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
4482 : }
4483 :
4484 29965942 : FOR( j = 0; j < lSubFr; j++ )
4485 : {
4486 : /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */
4487 29574720 : L_tmp = L_mult( temp2, White_exc16k[k + j] );
4488 29574720 : exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] );
4489 29574720 : move16();
4490 : /* Q_exc16kWhtnd */
4491 : }
4492 391222 : k = add( k, lSubFr );
4493 :
4494 : /* estimate the pre-emph factor */
4495 391222 : tempQ15 = sub( MAX_16, voice_factors[i] );
4496 391222 : exp = 0;
4497 391222 : move16();
4498 391222 : temp = Sqrt16( tempQ15, &exp );
4499 391222 : temp = shl( temp, sub( exp, 1 ) );
4500 :
4501 391222 : temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */
4502 391222 : temp = div_s( temp, temp2 ); /* Q15 */
4503 391222 : temp = mult_r( PREEMPH_FAC, temp );
4504 391222 : PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph );
4505 : /* exc16kWhtnd: Q_exc16kWhtnd;
4506 : tbe_premph: Q_exc16kWhtnd*/
4507 : }
4508 : }
4509 : }
4510 102554 : *tbe_premph = shl_sat( *tbe_premph, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) );
4511 102554 : move16();
4512 102554 : Scale_sig( White_exc16k, L_FRAME16k, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) );
4513 102554 : Scale_sig( exc16kWhtnd, L_FRAME16k, sub( *Q_bwe_exc, Q_White_exc16k ) );
4514 :
4515 102554 : IF( LT_32( extl_brate, SWB_TBE_2k8 ) )
4516 : {
4517 81008 : Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 );
4518 : /* i: exc16kWhtnd in Q_bwe_exc */
4519 : /* o: excSHB in Q_bwe_exc */
4520 : }
4521 : ELSE
4522 : {
4523 21546 : set16_fx( zero_mem, 0, LPC_SHB_ORDER );
4524 :
4525 21546 : Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 );
4526 21546 : tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
4527 21546 : Scale_sig( tempSHB, 80, tmp );
4528 21546 : syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
4529 21546 : move32();
4530 21546 : syn_shb_ener_sf_q[0] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
4531 21546 : move16();
4532 :
4533 21546 : Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 );
4534 21546 : tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
4535 21546 : Scale_sig( tempSHB, 80, tmp );
4536 21546 : syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
4537 21546 : move32();
4538 21546 : syn_shb_ener_sf_q[1] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
4539 21546 : move16();
4540 :
4541 21546 : Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 );
4542 21546 : tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
4543 21546 : Scale_sig( tempSHB, 80, tmp );
4544 21546 : syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
4545 21546 : move32();
4546 21546 : syn_shb_ener_sf_q[2] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
4547 21546 : move16();
4548 :
4549 21546 : Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 );
4550 21546 : tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
4551 21546 : Scale_sig( tempSHB, 80, tmp );
4552 21546 : syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
4553 21546 : move32();
4554 21546 : syn_shb_ener_sf_q[3] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
4555 21546 : move16();
4556 :
4557 21546 : tmp2 = s_min( s_min( syn_shb_ener_sf_q[0], syn_shb_ener_sf_q[1] ), s_min( syn_shb_ener_sf_q[3], syn_shb_ener_sf_q[2] ) );
4558 21546 : syn_shb_ener_sf[0] = L_shl( syn_shb_ener_sf[0], sub( tmp2, syn_shb_ener_sf_q[0] ) );
4559 21546 : move32();
4560 21546 : syn_shb_ener_sf[1] = L_shl( syn_shb_ener_sf[1], sub( tmp2, syn_shb_ener_sf_q[1] ) );
4561 21546 : move32();
4562 21546 : syn_shb_ener_sf[2] = L_shl( syn_shb_ener_sf[2], sub( tmp2, syn_shb_ener_sf_q[2] ) );
4563 21546 : move32();
4564 21546 : syn_shb_ener_sf[3] = L_shl( syn_shb_ener_sf[3], sub( tmp2, syn_shb_ener_sf_q[3] ) );
4565 21546 : move32();
4566 :
4567 : /* i: exc16kWhtnd in Q_bwe_exc */
4568 : /* o: tempSHB in Q_bwe_exc */
4569 : /* o: syn_shb_ener_sf in tmp2 */
4570 21546 : IF( LE_32( bitrate, MAX_ACELP_BRATE ) )
4571 : {
4572 21546 : L_tmp = sum32_fx( syn_shb_ener_sf, 4 );
4573 :
4574 : /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */
4575 21546 : tmp = shl( Q_shb, 1 );
4576 21546 : L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */
4577 :
4578 21546 : *Q_bwe_exc = sub( *Q_bwe_exc, exp );
4579 21546 : move16(); /* compensate for the exp shift */
4580 21546 : tmp2 = add( prev_Q_bwe_syn, n_mem2 );
4581 21546 : IF( GT_16( *Q_bwe_exc, tmp2 ) )
4582 : {
4583 2 : L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) );
4584 2 : *Q_bwe_exc = tmp2;
4585 2 : move16();
4586 : }
4587 6916266 : FOR( i = 0; i < L_FRAME16k; i++ )
4588 : {
4589 6894720 : L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */
4590 6894720 : exc16kWhtnd[i] = round_fx( L_tmp3 ); /* *Q_bwe_exc - exp */
4591 6894720 : move16();
4592 : }
4593 : }
4594 : /* i: L_tmp2 in (Q31-exp) */
4595 : /* i: exc16kWhtnd in Q_bwe_exc */
4596 : /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp) */
4597 :
4598 : /* Rescale the past memories: LP synth and SHB look ahead buffers */
4599 21546 : tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn );
4600 237006 : FOR( i = 0; i < LPC_SHB_ORDER; i++ )
4601 : {
4602 215460 : state_lpc_syn[i] = shl_sat( state_lpc_syn[i], tmp );
4603 215460 : move16();
4604 : }
4605 452466 : FOR( i = -L_SHB_LAHEAD; i < 0; i++ )
4606 : {
4607 430920 : excSHB[i] = shl_sat( excSHB[i], tmp );
4608 430920 : move16();
4609 : }
4610 : /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */
4611 :
4612 21546 : Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 );
4613 21546 : Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 );
4614 21546 : Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 );
4615 21546 : Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 );
4616 : /* i: exc16kWhtnd in (Q_bwe_exc) */
4617 : /* o: excSHB in (Q_bwe_exc) */
4618 : }
4619 :
4620 102554 : IF( EQ_16( extl, FB_TBE ) )
4621 : {
4622 39990 : tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb );
4623 39990 : Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp );
4624 39990 : Scale_sig( fb_tbe_demph, 1, tmp );
4625 39990 : Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 );
4626 : /* i: White_exc16k_FB in (14-n2) */
4627 : /* o: White_exc16k_FB_temp in (14-n2) */
4628 :
4629 439890 : FOR( i = 0; i < 10; i++ )
4630 : {
4631 13196700 : FOR( j = 0; j < 32; ++j )
4632 : {
4633 12796800 : White_exc16k_FB_temp[i * 32 + j] = mult_r_sat( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] );
4634 12796800 : move16();
4635 : }
4636 : }
4637 :
4638 39990 : *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 );
4639 39990 : move16(); /**Q_bwe_exc_fb +35 +1 -16*/
4640 39990 : flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k );
4641 :
4642 39990 : deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph );
4643 : }
4644 : ELSE
4645 : {
4646 62564 : set16_fx( White_exc16k_FB, 0, L_FRAME16k );
4647 : }
4648 :
4649 102554 : *prev_pow_exc16kWhtnd = L_shr_sat( pow1, Q_pow1 ); // power goes above MAX_32
4650 102554 : *prev_mix_factor = mix_factor;
4651 102554 : return;
4652 : }
4653 :
4654 : /*====================================================================================*/
4655 : /* FUNCTION : void GenSHBSynth_fx() */
4656 : /*------------------------------------------------------------------------------------*/
4657 : /* PURPOSE :Generate 32 KHz sampled highband component from synthesized highband*/
4658 : /*------------------------------------------------------------------------------------*/
4659 : /* INPUT ARGUMENTS */
4660 : /* _(Word16*)input_synspeech :input synthesized speech */
4661 : /* _(Word16) L_frame :ACELP frame length */
4662 : /*------------------------------------------------------------------------------------*/
4663 : /* OUTPUT ARGUMENTS : */
4664 : /* _(Word16*)shb_syn_speech_32k : output highband component */
4665 : /*------------------------------------------------------------------------------------*/
4666 : /* INPUT/OUTPUT ARGUMENTS : */
4667 : /* _(Word16[]) allpass_mem : memory */
4668 : /* _(Word32[]) Hilbert_Mem : memory */
4669 : /*------------------------------------------------------------------------------------*/
4670 : /* RETURN ARGUMENTS : */
4671 : /* _ None */
4672 : /*------------------------------------------------------------------------------------*/
4673 :
4674 3146 : void GenSHBSynth_fx(
4675 : const Word16 *input_synspeech, /* i : input synthesized speech */
4676 : Word16 *shb_syn_speech_32k, /* o : output highband component */
4677 : Word32 Hilbert_Mem[], /* i/o: memory */
4678 : Word16 allpass_mem[], /* i/o: memory */
4679 : const Word16 L_frame, /* i : ACELP frame length */
4680 : Word16 *syn_dm_phase )
4681 : {
4682 : Word16 i, speech_buf_32k[L_FRAME32k];
4683 : Word16 maxm, nor, nor32, shift;
4684 : Word16 input_synspeech_temp[L_FRAME16k];
4685 : Word32 maxm32;
4686 :
4687 :
4688 3146 : maxm = 0;
4689 3146 : move16();
4690 3146 : maxm32 = L_deposit_l( 0 );
4691 1009866 : FOR( i = 0; i < L_FRAME16k; i++ )
4692 1006720 : maxm = s_max( maxm, abs_s( input_synspeech[i] ) );
4693 22022 : FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
4694 18876 : maxm = s_max( maxm, abs_s( allpass_mem[i] ) );
4695 69212 : FOR( i = 0; i < HILBERT_MEM_SIZE; i++ )
4696 66066 : maxm32 = L_max( maxm32, L_abs( Hilbert_Mem[i] ) );
4697 3146 : nor = sub( norm_s( maxm ), 3 );
4698 3146 : nor32 = sub( norm_l( maxm32 ), 3 );
4699 3146 : if ( maxm == 0 )
4700 : {
4701 0 : nor = 15;
4702 0 : move16();
4703 : }
4704 3146 : if ( maxm32 == 0 )
4705 : {
4706 2417 : nor32 = 31;
4707 2417 : move16();
4708 : }
4709 3146 : shift = s_min( nor, nor32 );
4710 :
4711 3146 : Copy_Scale_sig( input_synspeech, input_synspeech_temp, L_FRAME16k, shift );
4712 3146 : Scale_sig( allpass_mem, 2 * ALLPASSSECTIONS_STEEP, shift );
4713 3146 : Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, shift );
4714 3146 : Interpolate_allpass_steep_fx( input_synspeech_temp, allpass_mem, L_FRAME16k, speech_buf_32k );
4715 : /*modify_Fs_fx( input_synspeech, L_FRAME16k, 16000, speech_buf_32k, 32000, allpass_mem, 0);*/
4716 3146 : IF( EQ_16( L_frame, L_FRAME ) )
4717 : {
4718 : /* 12.8 k core flipping and downmixing */
4719 1594 : flip_and_downmix_generic_fx( speech_buf_32k, shb_syn_speech_32k, L_FRAME32k,
4720 : Hilbert_Mem,
4721 : Hilbert_Mem + HILBERT_ORDER1,
4722 : Hilbert_Mem + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ),
4723 : syn_dm_phase );
4724 : }
4725 : ELSE
4726 : {
4727 : /* 16 k core flipping and no downmixing */
4728 498192 : FOR( i = 0; i < L_FRAME32k; i = i + 2 )
4729 : {
4730 496640 : shb_syn_speech_32k[i] = negate( speech_buf_32k[i] );
4731 496640 : move16();
4732 496640 : shb_syn_speech_32k[i + 1] = speech_buf_32k[i + 1];
4733 496640 : move16();
4734 : }
4735 : }
4736 :
4737 3146 : Scale_sig( shb_syn_speech_32k, L_FRAME32k, negate( shift ) );
4738 3146 : Scale_sig( allpass_mem, 2 * ALLPASSSECTIONS_STEEP, negate( shift ) );
4739 3146 : Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, negate( shift ) );
4740 :
4741 3146 : return;
4742 : }
4743 :
4744 :
4745 : /* IVAS 32-bit variant */
4746 111110 : void GenSHBSynth_fx32(
4747 : const Word32 *input_synspeech, /* i : input synthesized speech Qx*/
4748 : Word32 *shb_syn_speech_32k, /* o : output highband component Qx*/
4749 : Word32 Hilbert_Mem[], /* i/o: memory Qx*/
4750 : Word32 state_lsyn_filt_shb_local[], /* i/o: memory Qx*/
4751 : const Word16 L_frame, /* i : ACELP frame length */
4752 : Word16 *syn_dm_phase )
4753 : {
4754 : Word32 speech_buf_32k[L_FRAME32k];
4755 : Word16 i;
4756 :
4757 111110 : Word16 shift = 0;
4758 : Word32 maxm32, input_synspeech_temp[L_FRAME16k];
4759 111110 : move16();
4760 :
4761 : /* find the maximum value and derive the shift to improve precision of the Hilber filter */
4762 111110 : maxm32 = L_deposit_l( 0 );
4763 35666310 : FOR( i = 0; i < L_FRAME16k; i++ )
4764 : {
4765 35555200 : maxm32 = L_max( maxm32, L_abs( input_synspeech[i] ) );
4766 : }
4767 :
4768 777770 : FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
4769 : {
4770 666660 : maxm32 = L_max( maxm32, L_abs( state_lsyn_filt_shb_local[i] ) );
4771 : }
4772 :
4773 2444420 : FOR( i = 0; i < HILBERT_MEM_SIZE; i++ )
4774 : {
4775 2333310 : maxm32 = L_max( maxm32, L_abs( Hilbert_Mem[i] ) );
4776 : }
4777 :
4778 111110 : IF( maxm32 != 0 )
4779 : {
4780 110970 : shift = sub( norm_l( maxm32 ), 3 );
4781 :
4782 110970 : Copy_Scale_sig32( input_synspeech, input_synspeech_temp, L_FRAME16k, shift );
4783 110970 : Scale_sig32( state_lsyn_filt_shb_local, 2 * ALLPASSSECTIONS_STEEP, shift );
4784 110970 : Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, shift );
4785 : }
4786 : ELSE
4787 : {
4788 140 : Copy32( input_synspeech, input_synspeech_temp, L_FRAME16k );
4789 : }
4790 :
4791 111110 : Interpolate_allpass_steep_fx32( input_synspeech_temp, state_lsyn_filt_shb_local, L_FRAME16k, speech_buf_32k );
4792 :
4793 111110 : IF( EQ_16( L_frame, L_FRAME ) )
4794 : {
4795 48570 : flip_and_downmix_generic_fx32( speech_buf_32k, shb_syn_speech_32k, L_FRAME32k, Hilbert_Mem, Hilbert_Mem + HILBERT_ORDER1, Hilbert_Mem + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ), syn_dm_phase );
4796 : }
4797 : ELSE
4798 : {
4799 40088140 : FOR( i = 0; i < L_FRAME32k; i++ )
4800 : {
4801 : // shb_syn_speech_32k[i] = ( ( i % 2 ) == 0 ) ? ( -speech_buf_32k[i] ) : ( speech_buf_32k[i] );
4802 40025600 : IF( i % 2 == 0 )
4803 : {
4804 20012800 : shb_syn_speech_32k[i] = L_negate( speech_buf_32k[i] ); // Qx
4805 : }
4806 : ELSE
4807 : {
4808 20012800 : shb_syn_speech_32k[i] = speech_buf_32k[i]; // Qx
4809 : }
4810 40025600 : move32();
4811 : }
4812 : }
4813 :
4814 111110 : IF( maxm32 != 0 )
4815 : {
4816 110970 : Scale_sig32( shb_syn_speech_32k, L_FRAME32k, negate( shift ) );
4817 110970 : Scale_sig32( state_lsyn_filt_shb_local, 2 * ALLPASSSECTIONS_STEEP, negate( shift ) );
4818 110970 : Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, negate( shift ) );
4819 : }
4820 :
4821 111110 : return;
4822 : }
4823 :
4824 :
4825 : /*==============================================================================*/
4826 : /* FUNCTION : void ScaleShapedSHB_fx() */
4827 : /*------------------------------------------------------------------------------*/
4828 : /* PURPOSE : */
4829 : /*------------------------------------------------------------------------------*/
4830 : /* INPUT ARGUMENTS : */
4831 : /* _(Word16) length : SHB overlap length */
4832 : /* _(Word16*) subgain : subframe gain Q15 */
4833 : /* _(Word32) frame_gain : frame gain Q18 */
4834 : /* _(Word16*) win : window Q15 */
4835 : /* _(Word16*) subwin : subframes window Q15 */
4836 : /* _(Word16) Q_bwe_exc : Q format */
4837 : /*------------------------------------------------------------------------------*/
4838 : /* OUTPUT ARGUMENTS : */
4839 : /* _(Word16) Qx : Q factor of output */
4840 : /*------------------------------------------------------------------------------*/
4841 : /* INPUT/OUTPUT ARGUMENTS : */
4842 : /* _(Word16*) synSHB : synthesized shb signal input Q_bwe_exc / output Qx */
4843 : /* _(Word16*) overlap : buffer for overlap-add Q_bwe_exc /output Qx */
4844 : /*------------------------------------------------------------------------------*/
4845 : /* RETURN ARGUMENTS : */
4846 : /* _ None */
4847 : /*------------------------------------------------------------------------------*/
4848 : /* CALLED FROM : RX */
4849 : /*==============================================================================*/
4850 :
4851 111255 : void ScaleShapedSHB_fx(
4852 : const Word16 length, /* i : SHB overlap length */
4853 : Word16 *synSHB, /* i/o : synthesized shb signal Q(Q_bwe_exc)/Q(Qx) */
4854 : Word16 *overlap, /* i/o : buffer for overlap-add Q(Q_bwe_exc)/Q(Qx) */
4855 : const Word16 *subgain, /* i : subframe gain Q15 */
4856 : const Word32 frame_gain, /* i : frame gain Q18 */
4857 : const Word16 *win, /* i : window Q15 */
4858 : const Word16 *subwin, /* i : subframes window Q15 */
4859 : Word16 *Q_bwe_exc,
4860 : Word16 *Qx, /* o : newly computed Q factor for synSHB */
4861 : Word16 n_mem3,
4862 : Word16 prev_Q_bwe_syn2 )
4863 : {
4864 : const Word16 *skip;
4865 : Word16 i, j, k, l_shb_lahead, l_frame, l_frame_tmp;
4866 : Word16 join_length, num_join;
4867 : Word32 mod_syn[L_FRAME16k + L_SHB_LAHEAD];
4868 : Word16 sum_gain;
4869 : Word32 L_tmp;
4870 : Word16 tmpQ15;
4871 : Word16 Q_gFr_norm, gain_frame_Q16;
4872 : Word32 L_tmp2;
4873 : Word16 temp1, temp2;
4874 :
4875 : /* Init */
4876 111255 : set32_fx( mod_syn, 0, L_FRAME16k + L_SHB_LAHEAD );
4877 :
4878 : /* apply gain for each subframe, and store noise output signal using overlap-add */
4879 111255 : IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
4880 : {
4881 : /* WB Gain shape and gain frame application with overlap */
4882 7343 : skip = skip_bands_WB_TBE;
4883 7343 : l_frame = L_FRAME16k / 4;
4884 7343 : move16();
4885 7343 : l_shb_lahead = L_SHB_LAHEAD / 4;
4886 7343 : move16();
4887 :
4888 7343 : sum_gain = 0;
4889 7343 : move16();
4890 44058 : FOR( k = 0; k < length / 2; k++ )
4891 : {
4892 36715 : sum_gain = mult_r( subwin[2 * k + 2], subgain[0] ); /* Q15 */
4893 36715 : mod_syn[skip[0] + k] = L_mult( sum_gain, synSHB[skip[0] + k] ); /* Q_bwe_exc + 16 */
4894 36715 : move32();
4895 36715 : mod_syn[skip[0] + k + length / 2] = L_mult( subgain[0], synSHB[skip[0] + k + length / 2] ); /* Q_bwe_exc + 16 */
4896 36715 : move32();
4897 : }
4898 58744 : FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ )
4899 : {
4900 565411 : FOR( k = 0; k < length; k++ )
4901 : {
4902 : /* one bit headroom here, otherwise messes up the gain shape application */
4903 : /* keep it as L_mult0 */
4904 514010 : L_tmp = L_mult0( subwin[k + 1], subgain[i] ); /* Q30 */
4905 514010 : sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i - 1] ) ); /* Q14 */
4906 514010 : mod_syn[skip[i] + k] = L_shl( L_mult( sum_gain, synSHB[skip[i] + k] ), 1 ); /* Q_bwe_exc + 16 */
4907 514010 : move32();
4908 : }
4909 : }
4910 44058 : FOR( k = 0; k < length / 2; k++ )
4911 : {
4912 36715 : sum_gain = mult_r( subwin[length - 2 * k - 2], subgain[i - 1] ); /* Q15 */
4913 36715 : mod_syn[skip[i] + k] = L_mult( sum_gain, synSHB[skip[i] + k] ); /* Q_bwe_exc + 16 */
4914 36715 : move32();
4915 : }
4916 : }
4917 : ELSE
4918 : {
4919 : /* SWB Gain shape and gain frame application with overlap */
4920 103912 : l_frame = L_FRAME16k;
4921 103912 : move16();
4922 103912 : l_shb_lahead = L_SHB_LAHEAD;
4923 103912 : move16();
4924 103912 : skip = skip_bands_SWB_TBE;
4925 :
4926 103912 : num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS;
4927 103912 : move16();
4928 103912 : join_length = i_mult2( num_join, length );
4929 103912 : j = 0;
4930 103912 : move16();
4931 2182152 : FOR( k = 0; k < length; k++ )
4932 : {
4933 2078240 : sum_gain = mult_r( subwin[k + 1], subgain[0] ); /* Q15 */
4934 2078240 : mod_syn[j] = L_mult( synSHB[j], sum_gain );
4935 2078240 : move32(); /* Q_bwe_exc + 16 */
4936 2078240 : j = add( j, 1 );
4937 : }
4938 :
4939 415648 : FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ )
4940 : {
4941 19015896 : FOR( k = 0; k < join_length - length; k++ )
4942 : {
4943 18704160 : mod_syn[j] = L_mult( synSHB[j], subgain[i * num_join] );
4944 18704160 : move32(); /* Q_bwe_exc + 16 */
4945 18704160 : j = add( j, 1 );
4946 : }
4947 :
4948 6546456 : FOR( k = 0; k < length; k++ )
4949 : {
4950 : /* one bit headroom here, otherwise messes up the gain shape application */
4951 : /* keep it as L_mult0 */
4952 6234720 : L_tmp = L_mult0( subwin[k + 1], subgain[( i + 1 ) * num_join] ); /* Q30 */
4953 6234720 : sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i * num_join] ) ); /*Q14 */
4954 6234720 : mod_syn[j] = L_shl( L_mult( sum_gain, synSHB[j] ), 1 );
4955 6234720 : move32(); /* Q_bwe_exc + 16 */
4956 6234720 : j = add( j, 1 );
4957 : }
4958 : }
4959 6338632 : FOR( k = 0; k < join_length - length; k++ )
4960 : {
4961 6234720 : mod_syn[j] = L_mult( synSHB[j], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] );
4962 6234720 : move32(); /* Q_bwe_exc + 16 */
4963 6234720 : j = add( j, 1 );
4964 : }
4965 2182152 : FOR( k = 0; k < length; k++ )
4966 : {
4967 2078240 : sum_gain = mult_r( subwin[length - k - 1], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); /* Q15 */
4968 2078240 : mod_syn[j] = L_mult( synSHB[j], sum_gain );
4969 2078240 : move32(); /* Q_bwe_exc + 16 */
4970 2078240 : j = add( j, 1 );
4971 : }
4972 : }
4973 :
4974 :
4975 111255 : Q_gFr_norm = norm_l( frame_gain );
4976 111255 : if ( frame_gain == 0 )
4977 : {
4978 2 : Q_gFr_norm = 31;
4979 2 : move16();
4980 : }
4981 111255 : Q_gFr_norm = sub( Q_gFr_norm, 1 ); /* give some headroom */
4982 :
4983 111255 : gain_frame_Q16 = round_fx( L_shl( frame_gain, Q_gFr_norm ) ); /* Q = 18 + Q_gFr_norm - 16
4984 : = (Q_gFr_norm + 2) */
4985 :
4986 111255 : *Q_bwe_exc = add( *Q_bwe_exc, Q_gFr_norm ); /* compensate for the exp shift */
4987 111255 : move16();
4988 111255 : *Q_bwe_exc = sub( *Q_bwe_exc, 13 ); /* Keep Q-fac at => (Q_bwe_exc + Q_gFr_norm - 13) */
4989 111255 : move16();
4990 :
4991 : /* check for headroom of previous buff memories: overlap, Hilbert, and interp all-pass mem */
4992 111255 : tmpQ15 = add( prev_Q_bwe_syn2, n_mem3 );
4993 111255 : if ( GT_16( *Q_bwe_exc, tmpQ15 ) )
4994 : {
4995 3529 : *Q_bwe_exc = tmpQ15;
4996 3529 : move16();
4997 : }
4998 :
4999 111255 : *Qx = *Q_bwe_exc;
5000 111255 : move16();
5001 : /* rescale the overlap memory */
5002 2336355 : FOR( i = 0; i < L_SHB_LAHEAD; i++ )
5003 : {
5004 2225100 : temp2 = 1;
5005 2225100 : move16();
5006 2225100 : if ( overlap[i] < 0 )
5007 : {
5008 807997 : temp2 = -1;
5009 807997 : move16();
5010 : }
5011 2225100 : temp1 = abs_s( overlap[i] );
5012 2225100 : temp1 = shl( temp1, sub( *Q_bwe_exc, prev_Q_bwe_syn2 ) );
5013 2225100 : overlap[i] = i_mult( temp1, temp2 );
5014 2225100 : move16(); /* Q_bwe_exc + Q_gFr_norm - 13 */
5015 : }
5016 :
5017 2226210 : FOR( i = 0; i < l_shb_lahead; i++ )
5018 : {
5019 2114955 : L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 ); /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */
5020 2114955 : L_tmp2 = Mpy_32_16_1( L_tmp, win[i] ); /* (Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15) + 15 + (1-16) */
5021 2114955 : synSHB[i] = mac_r( L_tmp2, overlap[i], MAX_16 );
5022 2114955 : move16(); /* Q_bwe_exc + Q_gFr_norm - 13 */
5023 2114955 : synSHB[i + l_shb_lahead] = round_fx( L_tmp ); /* Q_bwe_exc + Q_gFr_norm - 13 */
5024 2114955 : move16();
5025 : }
5026 :
5027 31835580 : FOR( ; i < l_frame; i++ )
5028 : {
5029 31724325 : L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 ); /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */
5030 31724325 : synSHB[i] = round_fx( L_tmp ); /* Q_bwe_exc + Q_gFr_norm - 13 */
5031 31724325 : move16();
5032 : }
5033 :
5034 111255 : l_frame_tmp = add( l_frame, l_shb_lahead );
5035 2226210 : FOR( ; i < l_frame_tmp; i++ )
5036 : {
5037 2114955 : L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 ); /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */
5038 2114955 : L_tmp = Mpy_32_16_1( L_tmp, win[l_frame + l_shb_lahead - 1 - i] ); /* (Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15) + 15 + (1-16) */
5039 2114955 : overlap[i - l_frame] = round_fx( L_tmp ); /* Q_bwe_exc + Q_gFr_norm - 13 */
5040 2114955 : move16();
5041 : }
5042 :
5043 111255 : return;
5044 : }
5045 :
5046 :
5047 : /* IVAS 32-bit variant */
5048 8556 : void ScaleShapedSHB_fx32(
5049 : const Word16 length, /* i : SHB overlap length */
5050 : Word32 *synSHB_fx, /* i/o: synthesized shb signal Q_inp/Q_new */
5051 : Word32 *overlap_fx, /* i/o: buffer for overlap-add Q_inp/Q_new */
5052 : const Word16 *subgain_fx, /* i : subframe gain Q15 */
5053 : const Word32 frame_gain_fx, /* i : frame gain Q18*/
5054 : const Word16 *win_fx, /* i : window Q15 */
5055 : const Word16 *subwin_fx, /* i : subframes window Q15 */
5056 : Word16 *Q_inp,
5057 : Word16 *Q_new )
5058 : {
5059 : const Word16 *skip;
5060 : Word16 i, j, k, l_shb_lahead, l_frame;
5061 : Word16 join_length, num_join;
5062 : Word32 mod_syn_fx[L_FRAME16k + L_SHB_LAHEAD], L_tmp;
5063 : Word16 sum_gain_fx;
5064 :
5065 : /* initilaization */
5066 8556 : l_frame = L_FRAME16k;
5067 8556 : l_shb_lahead = L_SHB_LAHEAD;
5068 8556 : move16();
5069 8556 : move16();
5070 8556 : skip = skip_bands_SWB_TBE;
5071 :
5072 8556 : IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
5073 : {
5074 0 : skip = skip_bands_WB_TBE;
5075 0 : l_frame = L_FRAME16k / 4;
5076 0 : l_shb_lahead = L_SHB_LAHEAD / 4;
5077 0 : move16();
5078 0 : move16();
5079 : }
5080 :
5081 : /* apply gain for each subframe, and store noise output signal using overlap-add */
5082 8556 : set32_fx( mod_syn_fx, 0, l_frame + l_shb_lahead );
5083 :
5084 8556 : IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
5085 : {
5086 0 : sum_gain_fx = 0;
5087 0 : move16();
5088 0 : FOR( k = 0; k < shr( length, 1 ); k++ )
5089 : {
5090 0 : sum_gain_fx = mult_r( subwin_fx[2 * k + 2], subgain_fx[0] );
5091 0 : mod_syn_fx[skip[0] + k] = Mpy_32_16_1( synSHB_fx[skip[0] + k], sum_gain_fx );
5092 0 : move32(); // Qx
5093 0 : mod_syn_fx[skip[0] + k + length / 2] = Mpy_32_16_1( synSHB_fx[skip[0] + k + length / 2], subgain_fx[0] ); // Qx
5094 0 : move32();
5095 : }
5096 0 : FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ )
5097 : {
5098 0 : FOR( k = 0; k < length; k++ )
5099 : {
5100 0 : L_tmp = L_mult0( subwin_fx[k + 1], subgain_fx[i] );
5101 0 : sum_gain_fx = round_fx( L_mac0( L_tmp, subwin_fx[length - k - 1], subgain_fx[i - 1] ) );
5102 0 : mod_syn_fx[skip[i] + k] = L_shl( Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ), 1 ); // Qx
5103 0 : move32();
5104 : }
5105 : }
5106 0 : FOR( k = 0; k < shr( length, 1 ); k++ )
5107 : {
5108 0 : sum_gain_fx = mult_r( subwin_fx[length - k * 2 - 2], subgain_fx[i - 1] );
5109 0 : mod_syn_fx[skip[i] + k] = Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ); // Qx
5110 0 : move32();
5111 : }
5112 : }
5113 : ELSE
5114 : {
5115 8556 : num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS;
5116 8556 : join_length = i_mult( num_join, length );
5117 8556 : j = 0;
5118 8556 : move16();
5119 8556 : move16();
5120 179676 : FOR( k = 0; k < length; k++ )
5121 : {
5122 171120 : mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[k + 1], subgain_fx[0] ) ); // Qx
5123 171120 : move32();
5124 171120 : j = add( j, 1 );
5125 : }
5126 34224 : FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ )
5127 : {
5128 1565748 : FOR( k = 0; k < join_length - length; k++ )
5129 : {
5130 1540080 : mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[i * num_join] ); // Qx
5131 1540080 : move32();
5132 1540080 : j = add( j, 1 );
5133 : }
5134 :
5135 539028 : FOR( k = 0; k < length; k++ )
5136 : {
5137 513360 : L_tmp = L_mult0( subwin_fx[length - k - 1], subgain_fx[i * num_join] );
5138 513360 : mod_syn_fx[j] = L_shl( Mpy_32_16_1( synSHB_fx[j], round_fx( L_mac0( L_tmp, subwin_fx[k + 1], subgain_fx[( i + 1 ) * num_join] ) ) ), 1 ); // Qx
5139 513360 : move32();
5140 513360 : j = add( j, 1 );
5141 : }
5142 : }
5143 521916 : FOR( k = 0; k < join_length - length; k++ )
5144 : {
5145 513360 : mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); // Qx
5146 513360 : move32();
5147 513360 : j = add( j, 1 );
5148 : }
5149 179676 : FOR( k = 0; k < length; k++ )
5150 : {
5151 171120 : mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[length - k - 1], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ) ); // Qx
5152 171120 : move32();
5153 171120 : j = add( j, 1 );
5154 : }
5155 : }
5156 :
5157 8556 : Word16 norm_shift = norm_l( frame_gain_fx );
5158 8556 : if ( frame_gain_fx == 0 )
5159 : {
5160 0 : norm_shift = 31;
5161 0 : move16();
5162 : }
5163 :
5164 8556 : norm_shift = s_min( norm_shift, 14 );
5165 8556 : norm_shift = sub( norm_shift, 1 );
5166 :
5167 8556 : *Q_new = add( *Q_inp, sub( norm_shift, 13 ) ); // Q_new = Q_inp + min(norm_shift,14) - 14;
5168 8556 : move16();
5169 179676 : FOR( i = 0; i < L_SHB_LAHEAD; i++ )
5170 : {
5171 171120 : overlap_fx[i] = L_shl( overlap_fx[i], sub( *Q_new, *Q_inp ) );
5172 171120 : move32();
5173 : }
5174 :
5175 179676 : FOR( i = 0; i < l_shb_lahead; i++ )
5176 : {
5177 171120 : synSHB_fx[i] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[i] ) ); // Q_new
5178 171120 : synSHB_fx[i] = L_add( synSHB_fx[i], overlap_fx[i] );
5179 171120 : synSHB_fx[i + l_shb_lahead] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new
5180 171120 : move32();
5181 171120 : move32();
5182 171120 : move32();
5183 : }
5184 :
5185 2575356 : FOR( ; i < l_frame; i++ )
5186 : {
5187 2566800 : synSHB_fx[i] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new
5188 2566800 : move32();
5189 : }
5190 :
5191 179676 : FOR( ; i < l_frame + l_shb_lahead; i++ )
5192 : {
5193 171120 : synSHB_fx[i] = L_shl( synSHB_fx[i], sub( *Q_new, *Q_inp ) );
5194 171120 : overlap_fx[i - l_frame] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[l_frame + l_shb_lahead - 1 - i] ) ); // Q_new
5195 171120 : move32();
5196 171120 : move32();
5197 : }
5198 :
5199 8556 : *Q_inp = *Q_new;
5200 8556 : move16();
5201 8556 : return;
5202 : }
5203 :
5204 :
5205 : /*-------------------------------------------------------------------*
5206 : * ScaleShapedWB()
5207 : *
5208 : *
5209 : *-------------------------------------------------------------------*/
5210 :
5211 6870 : void ScaleShapedWB_fx(
5212 : const Word16 length, /* i : SHB overlap length */
5213 : Word16 *synSHB, /* i/o : synthesized shb signal Q_bwe_exc/Qx */
5214 : Word16 *overlap, /* i/o : buffer for overlap-add Q_bwe_exc/Qx */
5215 : const Word16 *subgain, /* i : subframe gain Q15*/
5216 : const Word32 frame_gain, /* i : frame gain Q18 */
5217 : const Word16 *win, /* i : window Q15*/
5218 : const Word16 *subwin, /* i : subframes window Q15*/
5219 : const Word16 Q_bwe_exc,
5220 : Word16 L_frame, /* i : Frame length - determines whether 12.8 or 16kHz core in-use */
5221 : Word16 dynQ, /* i : indicate whether output is dynamic Q, or Q0 */
5222 : Word16 *Qx, /* o : newly computed Q factor for synSHB */
5223 : Word16 prev_Qx, /* i : prev_Qx for memory scaling */
5224 : Word32 *Hilbert_Mem /* i : Hilbert memory used for computing Qx */
5225 : )
5226 : {
5227 : const Word16 *skip;
5228 : Word16 i, j, k, l_shb_lahead, l_frame, l_frame_tmp;
5229 : Word16 join_length, num_join;
5230 : Word32 mod_syn[L_FRAME16k + L_SHB_LAHEAD];
5231 : Word16 sum_gain;
5232 : Word32 L_tmp;
5233 : Word16 max_val, abs_sig, sc1, sc2, shift, max_headroom, min_shift, max_shift, max_shift2;
5234 : /* Init */
5235 6870 : set32_fx( mod_syn, 0, L_FRAME16k + L_SHB_LAHEAD );
5236 :
5237 : /* apply gain for each subframe, and store noise output signal using overlap-add */
5238 6870 : IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
5239 : {
5240 : /* WB Gain shape and gain frame application with overlap */
5241 6870 : skip = skip_bands_WB_TBE;
5242 6870 : move16();
5243 6870 : l_frame = L_FRAME16k / 4;
5244 6870 : move16();
5245 6870 : l_shb_lahead = L_SHB_LAHEAD / 4;
5246 6870 : move16();
5247 :
5248 6870 : sum_gain = 0;
5249 6870 : move16();
5250 41220 : FOR( k = 0; k < length / 2; k++ )
5251 : {
5252 34350 : sum_gain = mult_r( subwin[2 * k + 2], subgain[0] ); /* Q15 */
5253 34350 : mod_syn[skip[0] + k] = L_mult( sum_gain, synSHB[skip[0] + k] );
5254 34350 : move32(); /* Q_bwe_exc + 16 */
5255 34350 : mod_syn[skip[0] + k + length / 2] = L_mult( subgain[0], synSHB[skip[0] + k + length / 2] );
5256 34350 : move32(); /* Q_bwe_exc + 16 */
5257 : }
5258 54960 : FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ )
5259 : {
5260 528990 : FOR( k = 0; k < length; k++ )
5261 : {
5262 480900 : L_tmp = L_mult0( subwin[k + 1], subgain[i] ); /* Q30 */
5263 480900 : sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i - 1] ) ); /* Q14 */
5264 480900 : mod_syn[skip[i] + k] = L_shl( L_mult( sum_gain, synSHB[skip[i] + k] ), 1 );
5265 480900 : move32(); /* Q_bwe_exc + 16 */
5266 : }
5267 : }
5268 41220 : FOR( k = 0; k < length / 2; k++ )
5269 : {
5270 34350 : sum_gain = mult_r( subwin[length - 2 * k - 2], subgain[i - 1] ); /* Q15 */
5271 34350 : mod_syn[skip[i] + k] = L_mult( sum_gain, synSHB[skip[i] + k] );
5272 34350 : move32(); /* Q_bwe_exc + 16 */
5273 : }
5274 : }
5275 : ELSE
5276 : {
5277 : /* SWB Gain shape and gain frame application with overlap */
5278 0 : l_frame = L_FRAME16k;
5279 0 : move16();
5280 0 : l_shb_lahead = L_SHB_LAHEAD;
5281 0 : move16();
5282 0 : skip = skip_bands_SWB_TBE;
5283 0 : move16();
5284 :
5285 0 : num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS;
5286 0 : move16();
5287 0 : join_length = i_mult2( num_join, length );
5288 0 : j = 0; /* ptr*/
5289 0 : move16();
5290 0 : FOR( k = 0; k < length; k++ )
5291 : {
5292 0 : sum_gain = mult_r( subwin[k + 1], subgain[0] ); /* Q15 */
5293 0 : mod_syn[j] = L_mult( synSHB[j], sum_gain );
5294 0 : move32(); /* Q_bwe_exc + 16 */
5295 0 : j++;
5296 : }
5297 :
5298 0 : FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ )
5299 : {
5300 0 : FOR( k = 0; k < join_length - length; k++ )
5301 : {
5302 0 : mod_syn[j] = L_mult( synSHB[j], subgain[i * num_join] );
5303 0 : move32(); /* Q_bwe_exc + 16 */
5304 0 : j++;
5305 : }
5306 :
5307 0 : FOR( k = 0; k < length; k++ )
5308 : {
5309 0 : L_tmp = L_mult0( subwin[k + 1], subgain[i_mult2( ( i + 1 ), num_join )] ); /* Q30 */
5310 0 : sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i * num_join] ) ); /*Q14 */
5311 0 : mod_syn[j] = L_shl( L_mult( sum_gain, synSHB[j] ), 1 );
5312 0 : move32(); /* Q_bwe_exc + 16 */
5313 0 : j++;
5314 : }
5315 : }
5316 0 : FOR( k = 0; k < join_length - length; k++ )
5317 : {
5318 0 : mod_syn[j] = L_mult( synSHB[j], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] );
5319 0 : move32(); /* Q_bwe_exc + 16 */
5320 0 : j++;
5321 : }
5322 0 : FOR( k = 0; k < length; k++ )
5323 : {
5324 0 : sum_gain = mult_r( subwin[length - k - 1], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); /* Q15 */
5325 0 : mod_syn[j] = L_mult( synSHB[j], sum_gain );
5326 0 : move32(); /* Q_bwe_exc + 16 */
5327 0 : j++;
5328 : }
5329 : }
5330 :
5331 :
5332 6870 : max_val = 0;
5333 6870 : move16();
5334 590820 : FOR( i = 0; i < l_frame + l_shb_lahead; i++ )
5335 : {
5336 583950 : abs_sig = abs_s( round_fx( mod_syn[i] ) );
5337 583950 : if ( GT_16( abs_sig, max_val ) )
5338 : {
5339 49877 : max_val = abs_sig;
5340 49877 : move16();
5341 : }
5342 : }
5343 :
5344 151140 : FOR( i = 0; i < HILBERT_MEM_SIZE; i++ )
5345 : {
5346 144270 : abs_sig = abs_s( round_fx( Hilbert_Mem[i] ) );
5347 144270 : if ( GT_16( abs_sig, max_val ) )
5348 : {
5349 0 : max_val = abs_sig;
5350 0 : move16();
5351 : }
5352 : }
5353 :
5354 6870 : sc1 = norm_s( max_val ); /* max_val headroom in mod_syn[] */
5355 6870 : sc2 = norm_s( round_fx( frame_gain ) ); /* headroom in GainFrame */
5356 :
5357 6870 : IF( dynQ == 0 )
5358 : {
5359 6870 : shift = sub( 13, Q_bwe_exc ); /* earlier = (10 - Q_bwe_exc) but we changed GainFrame Q21 to Q18 */
5360 6870 : *Qx = 0;
5361 6870 : move16();
5362 : }
5363 0 : ELSE IF( EQ_16( L_frame, L_FRAME ) ) /* 12.8k core */
5364 : {
5365 0 : max_headroom = sub( add( sc1, sc2 ), 4 ); /* Max headroom after multiplying = sc1 + sc2 -3 (keep 3 bit extra headroom) */
5366 : /* 12.8k core needs extra headroom than 16k core */
5367 : /* otherwise Hilbert transform inside flip_and_downmix have saturation, causes ringing in output */
5368 :
5369 : /* Qx = (Q_bwe_exc+3) + shift - 16 */
5370 : /* make sure 14 > Qx > 2 */
5371 0 : min_shift = sub( 2, sub( add( Q_bwe_exc, 3 ), 16 ) );
5372 0 : max_shift = sub( 13, sub( add( Q_bwe_exc, 3 ), 16 ) );
5373 0 : max_shift2 = s_min( max_shift, max_headroom ); /* avoid shifting more than the available max_val headroom to avoid overflow */
5374 :
5375 0 : shift = s_min( min_shift, max_shift2 );
5376 0 : *Qx = sub( add( add( Q_bwe_exc, 3 ), shift ), 16 );
5377 0 : move16();
5378 : }
5379 : ELSE /* 16k core */
5380 : {
5381 0 : max_headroom = sub( add( sc1, sc2 ), 1 ); /* Max headroom after multiplying = sc1 + sc2 -1 (keep 1 bit extra headroom) */
5382 :
5383 : /* Qx = (Q_bwe_exc+3) + shift - 16 */
5384 : /* make sure 14 > Qx > 3 */
5385 0 : min_shift = sub( 3, sub( add( Q_bwe_exc, 3 ), 16 ) );
5386 0 : move16();
5387 0 : max_shift = sub( 13, sub( add( Q_bwe_exc, 3 ), 16 ) );
5388 0 : move16();
5389 0 : max_shift2 = s_min( max_shift, max_headroom ); /* avoid shifting more than the available max_val headroom to avoid overflow */
5390 :
5391 0 : shift = s_min( min_shift, max_shift2 );
5392 0 : *Qx = sub( add( add( Q_bwe_exc, 3 ), shift ), 16 );
5393 0 : move16();
5394 : }
5395 :
5396 : /* bring memory st_fx->syn_overlap_fx[] = overlap[i] to new Q = Qx to prepare for addition */
5397 41220 : FOR( i = 0; i < l_shb_lahead; i++ )
5398 : {
5399 34350 : overlap[i] = shl( overlap[i], sub( *Qx, prev_Qx ) );
5400 34350 : move16();
5401 : }
5402 :
5403 41220 : FOR( i = 0; i < l_shb_lahead; i++ )
5404 : {
5405 : /* mod_syn in (16+Q_bwe_exc), frame_gain in Q18 */
5406 34350 : L_tmp = Mult_32_32( mod_syn[i], frame_gain ); /* L_tmp in (Q_bwe_exc+3) */
5407 34350 : synSHB[i] = round_fx_sat( L_shl_sat( Mult_32_16( L_tmp, win[i] ), shift ) ); /* Qx */
5408 34350 : move16();
5409 34350 : synSHB[i] = add_sat( synSHB[i], overlap[i] );
5410 34350 : move16(); /* Qx */
5411 34350 : synSHB[i + l_shb_lahead] = round_fx_sat( L_shl_sat( L_tmp, shift ) ); /* Qx */
5412 34350 : move16();
5413 : }
5414 :
5415 522120 : FOR( ; i < l_frame; i++ )
5416 : {
5417 515250 : L_tmp = Mult_32_32( mod_syn[i], frame_gain ); /* L_tmp in (Q_bwe_exc+3) */
5418 515250 : synSHB[i] = round_fx_sat( L_shl_sat( L_tmp, shift ) ); /* Qx; */
5419 515250 : move16();
5420 : }
5421 :
5422 6870 : l_frame_tmp = add( l_frame, l_shb_lahead );
5423 41220 : FOR( ; i < l_frame_tmp; i++ )
5424 : {
5425 34350 : L_tmp = Mult_32_32( mod_syn[i], frame_gain ); /* (Q_bwe_exc+3) */
5426 34350 : overlap[i - l_frame] = round_fx_sat( L_shl_sat( Mult_32_16( L_tmp, win[l_frame + l_shb_lahead - 1 - i] ), shift ) ); /* Qx */
5427 34350 : move16();
5428 : }
5429 :
5430 6870 : return;
5431 : }
5432 :
5433 : /*-------------------------------------------------------------------*
5434 : * non_linearity()
5435 : *
5436 : * Apply a non linearity to the SHB excitation
5437 : * -------------------------------------------------------------------*/
5438 :
5439 8128 : static Word32 non_linearity_scaled_copy(
5440 : const Word16 input[],
5441 : Word16 j,
5442 : const Word16 length,
5443 : Word32 output[],
5444 : Word32 prev_scale,
5445 : const Word16 scale_step,
5446 : const Word16 en_abs )
5447 : {
5448 : Word16 i;
5449 : Word32 L_tmp;
5450 :
5451 :
5452 8128 : IF( en_abs )
5453 : {
5454 0 : FOR( i = 0; i < j; i++ )
5455 : {
5456 0 : L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
5457 0 : L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
5458 0 : output[i] = L_tmp;
5459 0 : move32();
5460 :
5461 0 : L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */
5462 0 : prev_scale = L_shl( L_tmp, 1 ); /* Q30 */
5463 : }
5464 0 : FOR( ; i < length; i++ )
5465 : {
5466 0 : L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
5467 0 : L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
5468 0 : output[i] = L_tmp;
5469 0 : move32();
5470 : }
5471 : }
5472 : ELSE
5473 : {
5474 1234639 : FOR( i = 0; i < j; i++ )
5475 : {
5476 1226511 : L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
5477 1226511 : L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
5478 :
5479 1226511 : if ( input[i] < 0 )
5480 : {
5481 615622 : L_tmp = L_negate( L_tmp );
5482 : }
5483 1226511 : output[i] = L_tmp;
5484 1226511 : move32();
5485 :
5486 1226511 : L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */
5487 1226511 : prev_scale = L_shl( L_tmp, 1 ); /* Q30 */
5488 : }
5489 :
5490 1382577 : FOR( ; i < length; i++ )
5491 : {
5492 1374449 : L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
5493 1374449 : L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
5494 :
5495 1374449 : if ( input[i] < 0 )
5496 : {
5497 669586 : L_tmp = L_negate( L_tmp );
5498 : }
5499 1374449 : output[i] = L_tmp;
5500 1374449 : move32();
5501 : }
5502 : }
5503 8128 : return prev_scale;
5504 : }
5505 :
5506 :
5507 : /*-------------------------------------------------------------------*
5508 : * non_linearity()
5509 : *
5510 : * Apply a non linearity to the SHB excitation
5511 : * -------------------------------------------------------------------*/
5512 :
5513 649282 : static Word32 non_linearity_scaled_copy_ivas(
5514 : const Word16 input[],
5515 : Word16 j,
5516 : const Word16 length,
5517 : Word32 output[],
5518 : Word32 prev_scale,
5519 : const Word16 scale_step,
5520 : const Word16 en_abs )
5521 : {
5522 : Word16 i;
5523 : Word32 L_tmp;
5524 :
5525 :
5526 649282 : IF( en_abs )
5527 : {
5528 1672 : FOR( i = 0; i < j; i++ )
5529 : {
5530 1664 : L_tmp = L_mult( input[i], input[i] ); /* 2*Q_inp+1 */
5531 1664 : L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
5532 :
5533 1664 : test();
5534 1664 : test();
5535 1664 : if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 )
5536 : {
5537 : /* NOTE: this is done to avoid the product to become zero for small non-zero input */
5538 139 : L_tmp = 1;
5539 139 : move16();
5540 : }
5541 :
5542 1664 : output[i] = L_tmp;
5543 1664 : move32();
5544 :
5545 1664 : L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */
5546 1664 : prev_scale = L_shl( L_tmp, 1 ); /* Q30 */
5547 : }
5548 904 : FOR( ; i < length; i++ )
5549 : {
5550 : /* L_tmp = (input[i] * input[i]) * prev_scale;*/
5551 896 : L_tmp = Mpy_32_16_1( Mpy_32_16_1( prev_scale, input[i] ), input[i] ); /* 2*Q_inp */
5552 :
5553 896 : test();
5554 896 : test();
5555 896 : if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 )
5556 : {
5557 : /* NOTE: this is done to avoid the product to become zero for small non-zero input */
5558 71 : L_tmp = 1;
5559 71 : move16();
5560 : }
5561 896 : output[i] = L_tmp;
5562 896 : move32();
5563 : }
5564 : }
5565 : ELSE
5566 : {
5567 95587927 : FOR( i = 0; i < j; i++ )
5568 : {
5569 94938653 : L_tmp = L_mult( input[i], input[i] ); /* 2*Q_inp+1 */
5570 94938653 : L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
5571 :
5572 94938653 : test();
5573 94938653 : test();
5574 94938653 : if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 )
5575 : {
5576 : /* NOTE: this is done to avoid the product to become zero for small non-zero input */
5577 12593549 : L_tmp = 1;
5578 12593549 : move16();
5579 : }
5580 :
5581 94938653 : if ( input[i] < 0 )
5582 : {
5583 47064704 : L_tmp = L_negate( L_tmp );
5584 : }
5585 94938653 : output[i] = L_tmp;
5586 94938653 : move32();
5587 :
5588 94938653 : L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */
5589 94938653 : prev_scale = L_shl( L_tmp, 1 ); /* Q30 */
5590 : }
5591 :
5592 113478301 : FOR( ; i < length; i++ )
5593 : {
5594 112829027 : L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
5595 112829027 : L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
5596 112829027 : test();
5597 112829027 : test();
5598 112829027 : if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 )
5599 : {
5600 : /* NOTE: this is done to avoid the product to become zero for small non-zero input */
5601 13223345 : L_tmp = 1;
5602 13223345 : move16();
5603 : }
5604 :
5605 112829027 : if ( input[i] < 0 )
5606 : {
5607 50243983 : L_tmp = L_negate( L_tmp );
5608 : }
5609 112829027 : output[i] = L_tmp;
5610 112829027 : move32();
5611 : }
5612 : }
5613 649282 : return prev_scale;
5614 : }
5615 :
5616 :
5617 : /*==========================================================================*/
5618 : /* FUNCTION : void non_linearity() */
5619 : /*--------------------------------------------------------------------------*/
5620 : /* PURPOSE : Apply a non linearity to the SHB excitation */
5621 : /*--------------------------------------------------------------------------*/
5622 : /* INPUT ARGUMENTS : */
5623 : /* Word16 input[] i : input signal Q_inp */
5624 : /* Word16 length i : input length */
5625 : /*--------------------------------------------------------------------------*/
5626 : /* OUTPUT ARGUMENTS : */
5627 : /* Word32 output[] o : output signal 2*Q_inp */
5628 : /*--------------------------------------------------------------------------*/
5629 : /* INPUT/OUTPUT ARGUMENTS : */
5630 : /* Word32 *prev_scale i/o: memory Q30 */
5631 : /*--------------------------------------------------------------------------*/
5632 : /* RETURN ARGUMENTS : */
5633 : /* _ None */
5634 : /*--------------------------------------------------------------------------*/
5635 : /* CALLED FROM : */
5636 : /*==========================================================================*/
5637 :
5638 4064 : void non_linearity_fx(
5639 : const Word16 input[], /* i : input signal Q_inp */
5640 : Word32 output[], /* o : output signal 2*Q_inp */
5641 : const Word16 length, /* i : input length */
5642 : Word32 *pPrevScale, /* i/o: memory Q30 */
5643 : Word16 Q_inp,
5644 : Word16 coder_type, /* i : Coder Type */
5645 : Word16 *voice_factors, /* i : Voice Factors */
5646 : const Word16 L_frame /* i : ACELP frame length */
5647 :
5648 : )
5649 : {
5650 : Word16 i, j;
5651 4064 : Word16 max_val = 0;
5652 4064 : move16();
5653 : Word32 scale;
5654 : Word16 scale_step;
5655 : Word16 exp, tmp;
5656 : Word16 e_tmp, f_tmp;
5657 : Word16 frac;
5658 : Word32 L_tmp;
5659 : Word32 L_tmp1;
5660 :
5661 4064 : Word16 en_abs = 0;
5662 4064 : Word16 v_fac = 0;
5663 4064 : move16();
5664 4064 : move16();
5665 : Word16 ths;
5666 : Word16 nframes;
5667 : Word32 prev_scale;
5668 : Word16 length_half;
5669 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
5670 4064 : Flag Overflow = 0;
5671 4064 : move32();
5672 : #endif
5673 :
5674 :
5675 4064 : IF( EQ_16( L_frame, L_FRAME16k ) )
5676 : {
5677 2557 : nframes = 5;
5678 2557 : move16();
5679 2557 : ths = 17817;
5680 2557 : move16(); /* 0.87*5 in Q12 */
5681 : }
5682 : ELSE
5683 : {
5684 1507 : nframes = 4;
5685 1507 : move16();
5686 1507 : ths = 15400;
5687 1507 : move16(); /* 0.94*4 in Q12 */
5688 : }
5689 :
5690 :
5691 22877 : FOR( i = 0; i < nframes; i++ )
5692 : {
5693 18813 : v_fac = add( v_fac, shr( voice_factors[i], 3 ) ); /* Q12 */
5694 : }
5695 :
5696 4064 : test();
5697 4064 : if ( EQ_16( coder_type, VOICED ) && GT_16( v_fac, ths ) )
5698 : {
5699 0 : en_abs = 1;
5700 0 : move16();
5701 : }
5702 :
5703 4064 : length_half = shr( length, 1 );
5704 4064 : prev_scale = *pPrevScale;
5705 4064 : move32();
5706 :
5707 :
5708 : /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */
5709 :
5710 1304544 : FOR( i = j = 0; i < length_half; i++ )
5711 : {
5712 1300480 : tmp = abs_s( input[i] );
5713 1300480 : if ( GT_16( tmp, max_val ) )
5714 : {
5715 28847 : j = i;
5716 28847 : move16();
5717 : }
5718 1300480 : max_val = s_max( max_val, tmp );
5719 : }
5720 :
5721 :
5722 4064 : IF( GT_16( max_val, shl( 1, Q_inp ) ) )
5723 : {
5724 4061 : exp = norm_s( max_val );
5725 4061 : tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */
5726 4061 : scale = L_shl( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ) ); /* Q31 */
5727 : }
5728 : ELSE
5729 : {
5730 3 : scale = 1438814044;
5731 3 : move32(); /* Q31; 0.67 in Q31 */
5732 : }
5733 :
5734 4064 : test();
5735 4064 : IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 32 ), scale ) )
5736 : {
5737 127 : scale_step = 16384;
5738 127 : move16(); /* Q14 */
5739 127 : prev_scale = L_shr( scale, 1 ); /* Q30 */
5740 : }
5741 : ELSE
5742 : {
5743 :
5744 : /* Computing log2(scale) */
5745 3937 : IF( j == 0 )
5746 : {
5747 36 : scale_step = 32767;
5748 36 : move16();
5749 : }
5750 : ELSE
5751 : {
5752 3901 : e_tmp = norm_l( scale );
5753 3901 : f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) );
5754 3901 : e_tmp = sub( -1, e_tmp );
5755 3901 : L_tmp = Mpy_32_16( e_tmp, f_tmp, MAX_16 ); /* Q16 */
5756 :
5757 : /* Computing log2(prev_scale) */
5758 3901 : e_tmp = norm_l( prev_scale );
5759 3901 : f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) );
5760 3901 : e_tmp = negate( e_tmp );
5761 3901 : L_tmp1 = Mpy_32_16( e_tmp, f_tmp, MAX_16 ); /* Q16 */
5762 :
5763 : /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */
5764 3901 : L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */
5765 :
5766 : /* Computing 1/j */
5767 3901 : exp = norm_s( j );
5768 3901 : tmp = div_s( shl( 1, sub( 14, exp ) ), j ); /* Q(29-exp) */
5769 :
5770 : /* (log2(scale / prev_scale))/length */
5771 3901 : L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /* Q(16+29-exp+1-16+exp-14)->Q16 */
5772 :
5773 3901 : frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
5774 :
5775 3901 : tmp = extract_l( Pow2( 14, frac ) );
5776 3901 : scale_step = shl_o( tmp, exp, &Overflow ); /* Q14 */
5777 : }
5778 : }
5779 :
5780 4064 : prev_scale = non_linearity_scaled_copy( input, j, length_half, output, prev_scale, scale_step, en_abs );
5781 :
5782 4064 : max_val = 0;
5783 4064 : move16();
5784 4064 : j = shr( length, 1 );
5785 1304544 : FOR( i = length_half; i < length; i++ )
5786 : {
5787 1300480 : tmp = abs_s( input[i] );
5788 1300480 : if ( GT_16( tmp, max_val ) )
5789 : {
5790 29288 : j = i;
5791 29288 : move16();
5792 : }
5793 1300480 : max_val = s_max( max_val, tmp );
5794 : }
5795 :
5796 4064 : IF( GT_16( max_val, shl( 1, Q_inp ) ) )
5797 : {
5798 4060 : exp = norm_s( max_val );
5799 4060 : tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */
5800 4060 : scale = L_shl_o( L_mult( 21955 /* 0.67 in Q15 */, tmp ), add( exp, sub( Q_inp, 14 ) ), &Overflow ); /* Q31 */
5801 : }
5802 : ELSE
5803 : {
5804 4 : scale = 1438814044;
5805 4 : move32(); /* Q31; 0.67 in Q31 */
5806 : }
5807 :
5808 4064 : test();
5809 4064 : IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 32 ), scale ) )
5810 : {
5811 0 : scale_step = 16384;
5812 0 : move16(); /*Q14 */
5813 0 : prev_scale = L_shr( scale, 1 ); /*Q30 */
5814 : }
5815 : ELSE
5816 : {
5817 : /*scale_step = (float) exp(1.0f / (float) (j - length/2) * (float) log(scale / prev_scale)); */
5818 : /* Computing log2(scale) */
5819 4064 : IF( EQ_16( j, length_half ) )
5820 : {
5821 53 : scale_step = 32767;
5822 53 : move16(); /*Q14 */
5823 : }
5824 : ELSE
5825 : {
5826 4011 : e_tmp = norm_l( scale );
5827 4011 : f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) );
5828 4011 : e_tmp = sub( -e_tmp, 1 );
5829 4011 : L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
5830 :
5831 : /* Computing log2(prev_scale) */
5832 4011 : e_tmp = norm_l( prev_scale );
5833 4011 : f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) );
5834 4011 : e_tmp = negate( e_tmp );
5835 4011 : L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
5836 :
5837 : /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */
5838 4011 : L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */
5839 :
5840 : /* Computing 1/(j - length/2) */
5841 :
5842 4011 : tmp = sub( j, length_half );
5843 4011 : exp = norm_s( tmp );
5844 :
5845 :
5846 4011 : tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /* Q(29-exp) */
5847 :
5848 : /* (log2(scale / prev_scale))/length */
5849 4011 : L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /*Q(16+29-exp+1-16+exp-14)->Q16 */
5850 :
5851 4011 : frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
5852 :
5853 4011 : tmp = extract_l( Pow2( 14, frac ) );
5854 4011 : scale_step = shl_o( tmp, exp, &Overflow ); /*Q14 */
5855 : }
5856 : }
5857 :
5858 4064 : prev_scale = non_linearity_scaled_copy( input + length_half, sub( j, length_half ), sub( length, length_half ), output + length_half, prev_scale, scale_step, en_abs );
5859 :
5860 4064 : *pPrevScale = prev_scale;
5861 4064 : move32();
5862 :
5863 : /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */
5864 :
5865 4064 : return;
5866 : }
5867 :
5868 :
5869 : /*==========================================================================*/
5870 : /* FUNCTION : void non_linearity_ivas_fx() */
5871 : /*--------------------------------------------------------------------------*/
5872 : /* PURPOSE : Apply a non linearity to the SHB excitation */
5873 : /*--------------------------------------------------------------------------*/
5874 : /* INPUT ARGUMENTS : */
5875 : /* Word16 input[] i : input signal Q_inp */
5876 : /* Word16 length i : input length */
5877 : /*--------------------------------------------------------------------------*/
5878 : /* OUTPUT ARGUMENTS : */
5879 : /* Word32 output[] o : output signal 2*Q_inp */
5880 : /*--------------------------------------------------------------------------*/
5881 : /* INPUT/OUTPUT ARGUMENTS : */
5882 : /* Word32 *prev_scale i/o: memory Q30 */
5883 : /*--------------------------------------------------------------------------*/
5884 : /* RETURN ARGUMENTS : */
5885 : /* _ None */
5886 : /*--------------------------------------------------------------------------*/
5887 : /* CALLED FROM : */
5888 : /*==========================================================================*/
5889 :
5890 324641 : void non_linearity_ivas_fx(
5891 : const Word16 input[], /* i : input signal Q_inp */
5892 : Word32 output[], /* o : output signal 2*Q_inp */
5893 : const Word16 length, /* i : input length */
5894 : Word32 *pPrevScale, /* i/o: memory Q30 */
5895 : Word16 Q_inp,
5896 : Word16 coder_type, /* i : Coder Type */
5897 : Word16 *voice_factors, /* i : Voice Factors */
5898 : const Word16 L_frame /* i : ACELP frame length */
5899 :
5900 : )
5901 : {
5902 : Word16 i, j;
5903 324641 : Word16 max_val = 0;
5904 324641 : move16();
5905 : Word32 scale;
5906 : Word16 scale_step;
5907 : Word16 exp, tmp;
5908 : Word16 e_tmp, f_tmp;
5909 : Word16 frac;
5910 : Word32 L_tmp;
5911 : Word32 L_tmp1;
5912 :
5913 324641 : Word16 en_abs = 0;
5914 324641 : Word16 v_fac = 0;
5915 324641 : move16();
5916 324641 : move16();
5917 : Word16 ths;
5918 : Word16 nframes;
5919 : Word32 prev_scale;
5920 : Word16 length_half;
5921 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
5922 324641 : Flag Overflow = 0;
5923 324641 : move32();
5924 : #endif
5925 :
5926 :
5927 324641 : IF( EQ_16( L_frame, L_FRAME16k ) )
5928 : {
5929 154217 : nframes = 5;
5930 154217 : move16();
5931 154217 : ths = 17817;
5932 154217 : move16(); /* 0.87*5 in Q12 */
5933 : }
5934 : ELSE
5935 : {
5936 170424 : nframes = 4;
5937 170424 : move16();
5938 170424 : ths = 15400;
5939 170424 : move16(); /* 0.94*4 in Q12 */
5940 : }
5941 :
5942 :
5943 1777422 : FOR( i = 0; i < nframes; i++ )
5944 : {
5945 1452781 : v_fac = add( v_fac, shr( voice_factors[i], 3 ) ); /* Q12 */
5946 : }
5947 :
5948 324641 : test();
5949 324641 : if ( EQ_16( coder_type, VOICED ) && GT_16( v_fac, ths ) )
5950 : {
5951 4 : en_abs = 1;
5952 4 : move16();
5953 : }
5954 :
5955 324641 : length_half = shr( length, 1 );
5956 324641 : prev_scale = *pPrevScale;
5957 324641 : move32();
5958 :
5959 :
5960 : /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */
5961 :
5962 104209761 : FOR( i = j = 0; i < length_half; i++ )
5963 : {
5964 103885120 : tmp = abs_s( input[i] );
5965 103885120 : if ( GT_16( tmp, max_val ) )
5966 : {
5967 2272867 : j = i;
5968 2272867 : move16();
5969 : }
5970 103885120 : max_val = s_max( max_val, tmp );
5971 : }
5972 :
5973 :
5974 324641 : IF( GT_16( max_val, shl( 1, Q_inp ) ) )
5975 : {
5976 305574 : exp = norm_s( max_val );
5977 305574 : tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */
5978 305574 : scale = L_shl( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ) ); /* Q31 */
5979 : }
5980 : ELSE
5981 : {
5982 19067 : scale = 1438814044;
5983 19067 : move32(); /* Q31; 0.67 in Q31 */
5984 : }
5985 :
5986 324641 : test();
5987 324641 : IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 64 ) /*Q30 -> Q31*/, scale /*Q31*/ ) )
5988 : {
5989 50837 : scale_step = 16384;
5990 50837 : move16(); /* Q14 */
5991 50837 : prev_scale = L_shr( scale, 1 ); /* Q30 */
5992 : }
5993 : ELSE
5994 : {
5995 :
5996 : /* Computing log2(scale) */
5997 273804 : IF( j == 0 )
5998 : {
5999 17862 : scale_step = 32767;
6000 17862 : move16();
6001 : }
6002 : ELSE
6003 : {
6004 255942 : e_tmp = norm_l( scale );
6005 255942 : f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) );
6006 255942 : e_tmp = sub( -1, e_tmp );
6007 255942 : L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
6008 :
6009 : /* Computing log2(prev_scale) */
6010 255942 : e_tmp = norm_l( prev_scale );
6011 255942 : f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) );
6012 255942 : e_tmp = negate( e_tmp );
6013 255942 : L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
6014 :
6015 : /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */
6016 255942 : L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */
6017 :
6018 : /* Computing 1/j */
6019 255942 : exp = norm_s( j );
6020 255942 : tmp = div_s( shl( 1, sub( 14, exp ) ), j ); /* Q(29-exp) */
6021 :
6022 : /* (log2(scale / prev_scale))/length */
6023 255942 : L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /* Q(16+29-exp+1-16+exp-14)->Q16 */
6024 :
6025 255942 : frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
6026 :
6027 255942 : tmp = extract_l( Pow2( 14, frac ) );
6028 255942 : scale_step = shl_o( tmp, exp, &Overflow ); /* Q14 */
6029 : }
6030 : }
6031 :
6032 324641 : prev_scale = non_linearity_scaled_copy_ivas( input, j, length_half, output, prev_scale, scale_step, en_abs );
6033 :
6034 324641 : max_val = 0;
6035 324641 : move16();
6036 324641 : j = shr( length, 1 );
6037 104209761 : FOR( i = length_half; i < length; i++ )
6038 : {
6039 103885120 : tmp = abs_s( input[i] );
6040 103885120 : if ( GT_16( tmp, max_val ) )
6041 : {
6042 2289516 : j = i;
6043 2289516 : move16();
6044 : }
6045 103885120 : max_val = s_max( max_val, tmp );
6046 : }
6047 :
6048 324641 : IF( GT_16( max_val, shl( 1, Q_inp ) ) )
6049 : {
6050 305094 : exp = norm_s( max_val );
6051 305094 : tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */
6052 305094 : scale = L_shl_o( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ), &Overflow ); /* Q31 */
6053 : }
6054 : ELSE
6055 : {
6056 19547 : scale = 1438814044;
6057 19547 : move32(); /* Q31; 0.67 in Q31 */
6058 : }
6059 :
6060 324641 : test();
6061 324641 : IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 64 ), scale ) )
6062 : {
6063 0 : scale_step = 16384;
6064 0 : move16(); /*Q14 */
6065 0 : prev_scale = L_shr( scale, 1 ); /*Q30 */
6066 : }
6067 : ELSE
6068 : {
6069 : /*scale_step = (float) exp(1.0f / (float) (j - length/2) * (float) log(scale / prev_scale)); */
6070 : /* Computing log2(scale) */
6071 324641 : IF( EQ_16( j, length_half ) )
6072 : {
6073 21284 : scale_step = 32767;
6074 21284 : move16(); /*Q14 */
6075 : }
6076 : ELSE
6077 : {
6078 303357 : e_tmp = norm_l( scale );
6079 303357 : f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) );
6080 303357 : e_tmp = sub( -e_tmp, 1 );
6081 303357 : L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
6082 :
6083 : /* Computing log2(prev_scale) */
6084 303357 : e_tmp = norm_l( prev_scale );
6085 303357 : f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) );
6086 303357 : e_tmp = negate( e_tmp );
6087 303357 : L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
6088 :
6089 : /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */
6090 303357 : L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */
6091 :
6092 : /* Computing 1/(j - length/2) */
6093 :
6094 303357 : tmp = sub( j, length_half );
6095 303357 : exp = norm_s( tmp );
6096 :
6097 :
6098 303357 : tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /* Q(29-exp) */
6099 :
6100 : /* (log2(scale / prev_scale))/length */
6101 303357 : L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /*Q(16+29-exp+1-16+exp-14)->Q16 */
6102 :
6103 303357 : frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
6104 :
6105 303357 : tmp = extract_l( Pow2( 14, frac ) );
6106 303357 : scale_step = shl_o( tmp, exp, &Overflow ); /*Q14 */
6107 : }
6108 : }
6109 :
6110 324641 : prev_scale = non_linearity_scaled_copy_ivas( input + length_half, sub( j, length_half ), sub( length, length_half ), output + length_half, prev_scale, scale_step, en_abs );
6111 :
6112 324641 : *pPrevScale = prev_scale;
6113 324641 : move32();
6114 :
6115 : /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */
6116 :
6117 324641 : return;
6118 : }
6119 :
6120 :
6121 : /*-------------------------------------------------------------------*
6122 : * create_random_vector()
6123 : *
6124 : * creates random number vector
6125 : * Note: the abs(max_val) value coming out of create_random_vector should
6126 : * fit into the precision of Q6.
6127 : * -------------------------------------------------------------------*/
6128 :
6129 438177 : void create_random_vector_fx(
6130 : Word16 output[], /* o : output random vector Q5*/
6131 : const Word16 length, /* i : length of random vector */
6132 : Word16 seed[] /* i/o: start seed */
6133 : )
6134 : {
6135 : Word16 i, j, k;
6136 : Word16 scale1, scale2;
6137 : Word32 L_tmp;
6138 :
6139 438177 : L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[0] ) ) ); /*Q23 */
6140 438177 : j = extract_l( L_shr( L_tmp, 23 ) );
6141 438177 : j = s_and( j, 0xff );
6142 :
6143 438177 : L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[1] ) ) ); /*Q23 */
6144 438177 : k = extract_l( L_shr( L_tmp, 23 ) );
6145 438177 : k = s_and( k, 0xff );
6146 :
6147 439686 : WHILE( EQ_16( k, j ) )
6148 : {
6149 1509 : L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[1] ) ) ); /*Q23 */
6150 1509 : k = extract_l( L_shr( L_tmp, 23 ) );
6151 1509 : k = s_and( k, 0xff );
6152 : }
6153 :
6154 438177 : scale1 = 18021;
6155 438177 : move16(); /* 200.00f * 0.35f/0.1243f; */
6156 438177 : if ( Random( &seed[0] ) < 0 )
6157 : {
6158 218048 : scale1 = -18021;
6159 218048 : move16(); /*Q5 */ /* -200.00f * 0.35f/0.1243f; */
6160 : }
6161 :
6162 438177 : scale2 = 7208;
6163 438177 : move16(); /* 80.00f * 0.35f/0.1243f; */
6164 438177 : if ( Random( &seed[1] ) < 0 )
6165 : {
6166 226825 : scale2 = -7208;
6167 226825 : move16(); /*Q5 */ /* -80.00f * 0.35f/0.1243f; */
6168 : }
6169 :
6170 69409457 : FOR( i = 0; i < length; i++ )
6171 : {
6172 68971280 : j = s_and( j, 0xff );
6173 68971280 : k = s_and( k, 0xff );
6174 68971280 : output[i] = round_fx( L_add( L_mult( scale1, gaus_dico_swb_fx[j] ), L_mult( scale2, gaus_dico_swb_fx[k] ) ) ); /*Q5 */
6175 68971280 : move16();
6176 68971280 : j++;
6177 68971280 : k++;
6178 : }
6179 :
6180 438177 : return;
6181 : }
6182 :
6183 :
6184 : /*======================================================================================*/
6185 : /* FUNCTION : interp_code_5over2_fx() */
6186 : /*--------------------------------------------------------------------------------------*/
6187 : /* PURPOSE : Used to interpolate the excitation from the core sample rate */
6188 : /* of 12.8 kHz to 32 kHz. */
6189 : /* Simple linear interpolator - No need FOR precision here. */
6190 : /*--------------------------------------------------------------------------------------*/
6191 : /* INPUT ARGUMENTS : */
6192 : /* _ (Word16[]) inp_code_fx : input vector (Q12) */
6193 : /* _ (Word16) inp_length : length of input vector */
6194 : /*--------------------------------------------------------------------------------------*/
6195 : /* OUTPUT ARGUMENTS : */
6196 : /* _ (Word16[]) interp_code_fx : output vector (Q12) */
6197 : /*--------------------------------------------------------------------------------------*/
6198 : /* INPUT/OUTPUT ARGUMENTS : */
6199 : /* _ None */
6200 : /*--------------------------------------------------------------------------------------*/
6201 :
6202 : /* _ None */
6203 : /*--------------------------------------------------------------------------------------*/
6204 : /* RETURN ARGUMENTS : */
6205 : /* _ None */
6206 : /*======================================================================================*/
6207 :
6208 527649 : void interp_code_5over2_fx(
6209 : const Word16 inp_code_fx[], /* i : input vector Qx*/
6210 : Word16 interp_code_fx[], /* o : output vector Qx*/
6211 : const Word16 inp_length /* i : length of input vector */
6212 : )
6213 : {
6214 : Word16 i, kk, kkp1, i_len2;
6215 : Word32 Ltemp;
6216 527649 : Word16 factor_i_fx[5] = { 6554, 19661, 32767, 19661, 6554 };
6217 527649 : move16();
6218 527649 : move16();
6219 527649 : move16();
6220 527649 : move16();
6221 527649 : move16();
6222 527649 : move16();
6223 527649 : Word16 factor_j_fx[5] = { 26214, 13107, 0, 13107, 26214 };
6224 527649 : move16();
6225 527649 : move16();
6226 527649 : move16();
6227 527649 : move16();
6228 527649 : move16();
6229 527649 : interp_code_fx[0] = inp_code_fx[0];
6230 527649 : move16(); /* Qx */
6231 :
6232 527649 : Ltemp = L_mult( inp_code_fx[0], factor_i_fx[3] ); /* Q(16+x) */
6233 527649 : Ltemp = L_mac( Ltemp, inp_code_fx[1], factor_j_fx[3] ); /* Q(16+x) */
6234 527649 : interp_code_fx[1] = round_fx( Ltemp ); /*Qx */
6235 527649 : move16();
6236 527649 : Ltemp = L_mult( inp_code_fx[0], factor_i_fx[4] ); /*Q(16+x) */
6237 527649 : Ltemp = L_mac( Ltemp, inp_code_fx[1], factor_j_fx[4] ); /*Q(16+x) */
6238 527649 : interp_code_fx[2] = round_fx( Ltemp ); /* Qx */
6239 527649 : move16();
6240 527649 : kk = 1;
6241 527649 : move16();
6242 527649 : kkp1 = 2;
6243 527649 : move16();
6244 527649 : i = 3;
6245 527649 : move16();
6246 : /*i_len2 = ( inp_length - 2 ) * HIBND_ACB_L_FAC; */ /*HIBND_ACB_L_FAC == 5/2 */
6247 527649 : i_len2 = sub( inp_length, 2 );
6248 527649 : i_len2 = shr( add( shl( i_len2, 2 ), i_len2 ), 1 ); /* rounding below during shr makes it non BE*/
6249 :
6250 20707872 : FOR( ; i < i_len2; i += 5 )
6251 : {
6252 20180223 : Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[0] ); /*Q(16+x) */
6253 20180223 : Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_i_fx[0] ); /*Q(16+x) */
6254 20180223 : interp_code_fx[i] = round_fx( Ltemp ); /*Qx */
6255 20180223 : move16();
6256 20180223 : Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[1] ); /*Q(16+x) */
6257 20180223 : Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_i_fx[1] ); /*Q(16+x) */
6258 20180223 : interp_code_fx[i + 1] = round_fx( Ltemp ); /*Qx */
6259 20180223 : move16();
6260 20180223 : Ltemp = L_mult( inp_code_fx[kkp1], factor_i_fx[2] ); /*Q(16+x) */
6261 20180223 : interp_code_fx[i + 2] = round_fx( Ltemp ); /*Qx */
6262 20180223 : move16();
6263 20180223 : kk++;
6264 20180223 : kkp1++;
6265 :
6266 20180223 : Ltemp = L_mult( inp_code_fx[kk], factor_i_fx[3] ); /*Q(16+x) */
6267 20180223 : Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_j_fx[3] ); /*Q(16+x) */
6268 20180223 : interp_code_fx[i + 3] = round_fx( Ltemp ); /*Qx */
6269 20180223 : move16();
6270 20180223 : Ltemp = L_mult( inp_code_fx[kk], factor_i_fx[4] ); /*Q(16+x) */
6271 20180223 : Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_j_fx[4] ); /*Q(16+x) */
6272 20180223 : interp_code_fx[i + 4] = round_fx( Ltemp ); /*Qx */
6273 20180223 : move16();
6274 20180223 : kk++;
6275 20180223 : kkp1++;
6276 : }
6277 :
6278 527649 : Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[0] ); /*Q(16+x) */
6279 527649 : interp_code_fx[i] = round_fx( Ltemp ); /*Qx */
6280 527649 : move16();
6281 527649 : Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[1] ); /*Q(16+x) */
6282 527649 : interp_code_fx[i + 1] = round_fx( Ltemp ); /*Qx */
6283 527649 : move16();
6284 527649 : return;
6285 : }
6286 :
6287 :
6288 : /*======================================================================================*/
6289 : /* FUNCTION : interp_code_4over2_fx() */
6290 : /*--------------------------------------------------------------------------------------*/
6291 : /* PURPOSE : Used to interpolate the excitation from the core sample rate */
6292 : /* of 16 kHz to 32 kHz. */
6293 : /* Simple linear interpolator - No need for precision here. */
6294 : /*--------------------------------------------------------------------------------------*/
6295 : /* INPUT ARGUMENTS : */
6296 : /* _ (Word16[]) inp_code_fx : input vector (Qx) */
6297 : /* _ (Word16) inp_length : length of input vector */
6298 : /*--------------------------------------------------------------------------------------*/
6299 : /* OUTPUT ARGUMENTS : */
6300 : /* _ (Word16[]) interp_code_fx : output vector (Qx) */
6301 : /*--------------------------------------------------------------------------------------*/
6302 : /* INPUT/OUTPUT ARGUMENTS : */
6303 : /* _ None */
6304 : /*--------------------------------------------------------------------------------------*/
6305 :
6306 : /* _ None */
6307 : /*--------------------------------------------------------------------------------------*/
6308 : /* RETURN ARGUMENTS : */
6309 : /* _ None */
6310 : /*======================================================================================*/
6311 :
6312 718810 : void interp_code_4over2_fx(
6313 : const Word16 inp_code_fx[], /* i : input vector Qx*/
6314 : Word16 interp_code_fx[], /* o : output vector Qx*/
6315 : const Word16 inp_length /* i : length of input vector */
6316 : )
6317 : {
6318 : Word16 i, j;
6319 718810 : j = 0;
6320 718810 : move16();
6321 51718016 : FOR( i = 0; i < inp_length - 1; i++ )
6322 : {
6323 50999206 : interp_code_fx[j] = inp_code_fx[i];
6324 50999206 : move16(); /*Qx */
6325 50999206 : interp_code_fx[j + 1] = add( shr( inp_code_fx[i], 1 ), shr( inp_code_fx[i + 1], 1 ) );
6326 50999206 : move16();
6327 50999206 : move16(); /*Qx */
6328 50999206 : j = add( j, 2 );
6329 : }
6330 :
6331 718810 : interp_code_fx[j] = inp_code_fx[i];
6332 718810 : move16();
6333 718810 : interp_code_fx[j + 1] = shr( inp_code_fx[i], 1 );
6334 718810 : move16(); /*Qx */
6335 :
6336 718810 : return;
6337 : }
6338 :
6339 :
6340 : /*-------------------------------------------------------------------*
6341 : * wb_tbe_extras_reset_synth()
6342 : *
6343 : * Reset the extra parameters only required for WB TBE synthesis
6344 : *-------------------------------------------------------------------*/
6345 :
6346 9902 : void wb_tbe_extras_reset_synth_fx(
6347 : Word16 state_lsyn_filt_shb[],
6348 : Word16 state_lsyn_filt_dwn_shb[],
6349 : Word16 state_32and48k_WB_upsample[],
6350 : Word16 state_resamp_HB[] )
6351 : {
6352 9902 : set16_fx( state_lsyn_filt_shb, 0, 2 * ALLPASSSECTIONS_STEEP );
6353 9902 : set16_fx( state_lsyn_filt_dwn_shb, 0, 2 * ALLPASSSECTIONS_STEEP );
6354 9902 : set16_fx( state_32and48k_WB_upsample, 0, 2 * ALLPASSSECTIONS_STEEP );
6355 9902 : set16_fx( state_resamp_HB, 0, INTERP_3_1_MEM_LEN );
6356 :
6357 9902 : return;
6358 : }
6359 :
6360 : /*-------------------------------------------------------------------*
6361 : * elliptic_bpf_48k_generic()
6362 : *
6363 : * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz
6364 : * Implemented as 3 fourth order sections cascaded.
6365 : *-------------------------------------------------------------------*/
6366 :
6367 78171 : void elliptic_bpf_48k_generic_fx(
6368 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6369 : int16_t element_mode,
6370 : #endif
6371 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6372 : Word16 IsUpsampled3,
6373 : Word16 input_fx[], /* i : input signal Q_input_fx*/
6374 : #else
6375 : const Word16 input_fx[], /* i : input signal Q_input_fx*/
6376 : #endif
6377 : Word16 *Q_input_fx,
6378 : Word16 output_fx[], /* o : output signal memory_fx_Q */
6379 : Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */
6380 : Word16 memory_fx_Q[],
6381 : const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */
6382 : )
6383 : {
6384 : Word16 i, j;
6385 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6386 : Word16 memory_fx0, Q_temp, Q_temp2;
6387 : Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX;
6388 : Word32 L_tmpMax;
6389 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6390 : Word64 W_tmpX;
6391 : Word64 W_tmpY;
6392 : #endif
6393 :
6394 78171 : Word32 *L_tmp = &L_tmp_buffer[4];
6395 78171 : Word32 *L_tmp2 = &L_tmp2_buffer[4];
6396 78171 : Word32 *L_output = &L_output_buffer[4];
6397 : #else
6398 : Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2;
6399 : Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax;
6400 : Word32 memory2_fx_2[4], memory2_fx_3[4];
6401 : #endif
6402 :
6403 390855 : FOR( i = 0; i < 4; i++ )
6404 : {
6405 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6406 312684 : memory_fx0 = extract_l( memory_fx2[0][i] );
6407 312684 : input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) );
6408 312684 : L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) );
6409 312684 : L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) );
6410 : // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) );
6411 312684 : move32();
6412 312684 : move32();
6413 312684 : move32();
6414 312684 : move32();
6415 312684 : move32();
6416 : #else
6417 : memory_fx0[0][i] = extract_l( memory_fx2[0][i] );
6418 : memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) );
6419 : memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) );
6420 : memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) );
6421 : move32();
6422 : move32();
6423 : move32();
6424 : move32();
6425 : move32();
6426 : #endif
6427 : }
6428 :
6429 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6430 78171 : L_tmpMax = L_add( 0, 0 );
6431 78171 : IF( !IsUpsampled3 )
6432 : {
6433 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6434 43652 : IF( element_mode )
6435 : {
6436 41949572 : FOR( i = 0; i < L_FRAME48k; i++ )
6437 : {
6438 : /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/
6439 41905920 : W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] );
6440 41905920 : W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] );
6441 41905920 : W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] );
6442 41905920 : W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] );
6443 41905920 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] );
6444 41905920 : W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] );
6445 41905920 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] );
6446 41905920 : W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] );
6447 41905920 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] );
6448 41905920 : L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/
6449 41905920 : move32();
6450 : }
6451 : }
6452 : ELSE
6453 : #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/
6454 : {
6455 0 : FOR( i = 0; i < L_FRAME48k; i++ )
6456 : {
6457 0 : L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/
6458 0 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6459 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6460 0 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6461 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6462 0 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6463 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6464 0 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6465 0 : L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6466 0 : move32();
6467 : }
6468 : }
6469 : } /*IsUpsampled3*/
6470 : ELSE
6471 : {
6472 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6473 34519 : IF( element_mode )
6474 : {
6475 11080599 : FOR( i = 0; i < L_FRAME48k; )
6476 : {
6477 11046080 : W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] );
6478 11046080 : W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] );
6479 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] );
6480 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] );
6481 11046080 : W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] );
6482 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] );
6483 11046080 : L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/
6484 11046080 : move32();
6485 11046080 : i++;
6486 :
6487 11046080 : W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] );
6488 11046080 : W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] );
6489 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] );
6490 11046080 : W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] );
6491 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] );
6492 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] );
6493 11046080 : L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/
6494 11046080 : move32();
6495 11046080 : i++;
6496 :
6497 11046080 : W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] );
6498 11046080 : W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] );
6499 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] );
6500 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] );
6501 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] );
6502 11046080 : L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/
6503 11046080 : move32();
6504 11046080 : i++;
6505 : }
6506 : }
6507 : ELSE
6508 : #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/
6509 : {
6510 0 : FOR( i = 0; i < L_FRAME48k; )
6511 : {
6512 0 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/
6513 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6514 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6515 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6516 0 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6517 0 : L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6518 0 : move32();
6519 0 : i++;
6520 :
6521 0 : L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/
6522 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6523 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6524 0 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6525 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6526 0 : L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6527 0 : move32();
6528 0 : i++;
6529 :
6530 0 : L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6531 0 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6532 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6533 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6534 0 : L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6535 0 : move32();
6536 0 : i++;
6537 : }
6538 : }
6539 :
6540 : } /*IsUpsampled3*/
6541 :
6542 : #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/
6543 : L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/
6544 : L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6545 : L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6546 : L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6547 : L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6548 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6549 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6550 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6551 : L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6552 : move32();
6553 :
6554 : L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/
6555 : L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6556 : L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6557 : L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6558 : L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6559 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6560 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6561 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6562 : L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6563 : move32();
6564 :
6565 : L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/
6566 : L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6567 : L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6568 : L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6569 : L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6570 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6571 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6572 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6573 : L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6574 : move32();
6575 : L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/
6576 : L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6577 : L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6578 : L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6579 : L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6580 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6581 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6582 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6583 : L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6584 : move32();
6585 : FOR( i = 4; i < L_FRAME48k; i++ )
6586 : {
6587 : L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/
6588 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6589 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6590 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6591 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6592 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6593 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6594 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6595 : L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6596 : move32();
6597 : }
6598 : #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/
6599 :
6600 78171 : memory_fx2[0][0] = input_fx[L_FRAME48k - 4];
6601 78171 : memory_fx2[0][1] = input_fx[L_FRAME48k - 3];
6602 78171 : memory_fx2[0][2] = input_fx[L_FRAME48k - 2];
6603 78171 : memory_fx2[0][3] = input_fx[L_FRAME48k - 1];
6604 78171 : move32();
6605 78171 : move32();
6606 78171 : move32();
6607 78171 : move32();
6608 78171 : move32();
6609 :
6610 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6611 78171 : L_tmpMax = L_add( 0, 0 );
6612 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6613 78171 : IF( element_mode )
6614 : {
6615 75122331 : FOR( i = 0; i < L_FRAME48k; i++ )
6616 : {
6617 75044160 : W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] );
6618 75044160 : W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] );
6619 75044160 : W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] );
6620 75044160 : W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] );
6621 75044160 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] );
6622 75044160 : W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] );
6623 75044160 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] );
6624 75044160 : W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] );
6625 75044160 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] );
6626 75044160 : L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) );
6627 75044160 : move32();
6628 75044160 : L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) );
6629 : }
6630 : }
6631 : ELSE
6632 : #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/
6633 : {
6634 0 : FOR( i = 0; i < L_FRAME48k; i++ )
6635 : {
6636 0 : L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/
6637 0 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6638 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6639 0 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6640 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6641 0 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6642 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6643 0 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6644 0 : L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6645 0 : move32();
6646 0 : L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) );
6647 : }
6648 : }
6649 : #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/
6650 : L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/
6651 : L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6652 : L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6653 : L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6654 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6655 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6656 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/
6657 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/
6658 : L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/
6659 : move32();
6660 : L_tmpMax = L_abs( L_tmp2[0] );
6661 : L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/
6662 : L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6663 : L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6664 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6665 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6666 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6667 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6668 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6669 : L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6670 : move32();
6671 : L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) );
6672 : L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/
6673 : L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6674 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6675 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6676 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6677 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6678 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6679 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6680 : L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6681 : move32();
6682 : L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) );
6683 : L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/
6684 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6685 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6686 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6687 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6688 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6689 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6690 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6691 : L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/
6692 : move32();
6693 : L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) );
6694 : FOR( i = 4; i < L_FRAME48k; i++ )
6695 : {
6696 : L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/
6697 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6698 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6699 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6700 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6701 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6702 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6703 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6704 : L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6705 : move32();
6706 : L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) );
6707 : }
6708 : #endif
6709 :
6710 :
6711 78171 : Q_temp = norm_l( L_tmpMax );
6712 78171 : Q_temp = sub( Q_temp, 4 );
6713 78171 : Scale_sig32( L_tmp2, 960, Q_temp );
6714 :
6715 78171 : memory_fx2[1][0] = L_tmp[L_FRAME48k - 4];
6716 78171 : memory_fx2[1][1] = L_tmp[L_FRAME48k - 3];
6717 78171 : memory_fx2[1][2] = L_tmp[L_FRAME48k - 2];
6718 78171 : memory_fx2[1][3] = L_tmp[L_FRAME48k - 1];
6719 78171 : move32();
6720 78171 : move32();
6721 78171 : move32();
6722 78171 : move32();
6723 78171 : move32();
6724 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6725 390855 : FOR( j = 0; j < 4; j++ )
6726 : {
6727 312684 : L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) );
6728 312684 : L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) );
6729 312684 : move32();
6730 312684 : move32();
6731 312684 : move32();
6732 : }
6733 : #else
6734 : FOR( j = 0; j < 4; j++ )
6735 : {
6736 : memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) );
6737 : memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) );
6738 : move32();
6739 : move32();
6740 : move32();
6741 : }
6742 : #endif
6743 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6744 78171 : L_tmpMax = L_add( 0, 0 );
6745 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6746 78171 : IF( element_mode )
6747 : {
6748 75122331 : FOR( i = 0; i < L_FRAME48k; i++ )
6749 : {
6750 75044160 : W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] );
6751 75044160 : W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] );
6752 75044160 : W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] );
6753 75044160 : W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] );
6754 75044160 : W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] );
6755 75044160 : W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] );
6756 75044160 : W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] );
6757 75044160 : W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] );
6758 75044160 : W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] );
6759 75044160 : L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) );
6760 75044160 : move32();
6761 75044160 : L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) );
6762 : }
6763 : }
6764 : ELSE
6765 : #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/
6766 : {
6767 0 : FOR( i = 0; i < L_FRAME48k; i++ )
6768 : {
6769 0 : L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */
6770 0 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
6771 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6772 :
6773 0 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6774 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6775 :
6776 0 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
6777 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6778 :
6779 0 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
6780 0 : L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6781 0 : move32();
6782 0 : L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) );
6783 : }
6784 : }
6785 :
6786 : #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/
6787 : L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */
6788 : L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6789 : L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6790 : L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6791 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6792 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */
6793 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */
6794 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */
6795 : L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */
6796 : move32();
6797 : L_tmpMax = L_abs( L_output[0] );
6798 :
6799 : L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */
6800 : L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/
6801 : L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/
6802 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/
6803 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/
6804 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/
6805 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/
6806 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/
6807 : L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/
6808 : move32();
6809 : L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) );
6810 :
6811 : L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */
6812 : L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/
6813 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/
6814 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/
6815 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/
6816 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6817 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6818 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/
6819 : L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6820 : move32();
6821 : L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) );
6822 :
6823 : L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */
6824 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6825 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6826 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6827 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6828 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6829 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6830 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6831 : L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6832 : move32();
6833 : L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) );
6834 :
6835 : FOR( i = 4; i < L_FRAME48k; i++ )
6836 : {
6837 : L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */
6838 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
6839 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6840 :
6841 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6842 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6843 :
6844 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
6845 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6846 :
6847 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
6848 : L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6849 : move32();
6850 : L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) );
6851 : }
6852 : #endif
6853 :
6854 78171 : memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4];
6855 78171 : memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3];
6856 78171 : memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2];
6857 78171 : memory_fx2[2][3] = L_tmp2[L_FRAME48k - 1];
6858 78171 : memory_fx2[3][0] = L_output[L_FRAME48k - 4];
6859 78171 : memory_fx2[3][1] = L_output[L_FRAME48k - 3];
6860 78171 : memory_fx2[3][2] = L_output[L_FRAME48k - 2];
6861 78171 : memory_fx2[3][3] = L_output[L_FRAME48k - 1];
6862 78171 : move32();
6863 78171 : move32();
6864 78171 : move32();
6865 78171 : move32();
6866 78171 : move32();
6867 78171 : move32();
6868 78171 : move32();
6869 78171 : move32();
6870 78171 : move32();
6871 78171 : memory_fx_Q[0] = *Q_input_fx;
6872 78171 : memory_fx_Q[1] = add( *Q_input_fx, 11 );
6873 78171 : memory_fx_Q[2] = add( add( *Q_input_fx, 6 ), Q_temp );
6874 78171 : memory_fx_Q[3] = add( add( *Q_input_fx, 1 ), Q_temp );
6875 78171 : move16();
6876 78171 : move16();
6877 78171 : move16();
6878 78171 : move16();
6879 78171 : Q_temp2 = norm_l( L_tmpMax );
6880 78171 : Scale_sig32( L_output, 960, Q_temp2 );
6881 75122331 : FOR( i = 0; i < 960; i++ )
6882 : {
6883 75044160 : output_fx[i] = extract_h( L_output[i] );
6884 75044160 : move16();
6885 : }
6886 78171 : *Q_input_fx = sub( add( add( *Q_input_fx, Q_temp ), Q_temp2 ), 15 );
6887 78171 : move16(); /* BASOP_NOGLOB */
6888 :
6889 78171 : return;
6890 : }
6891 : /*-------------------------------------------------------------------*
6892 : * synthesise_fb_high_band()
6893 : *
6894 : * Creates the highband output for full band - 14.0 to 20 kHz
6895 : * Using the energy shaped white excitation signal from the SWB BWE.
6896 : * The excitation signal input is sampled at 16kHz and so is upsampled
6897 : * to 48 kHz first.
6898 : * Uses a complementary split filter to code the two regions from
6899 : * 14kHz to 16kHz and 16 kHz to 20 kHz.
6900 : * One of 16 tilt filters is also applied afterwards to further
6901 : * refine the spectral shape of the fullband signal.
6902 : * The tilt is specified in dB per kHz. N.B. Only negative values are
6903 : * accomodated.
6904 : *-------------------------------------------------------------------*/
6905 :
6906 34519 : void synthesise_fb_high_band_fx(
6907 : const Word16 excitation_in[], /* i : full band excitation */
6908 : Word16 Q_fb_exc,
6909 : Word16 output[], /* o : high band speech - 14.0 to 20 kHz */
6910 : const Word32 fb_exc_energy, /* i : full band excitation energy */
6911 : const Word16 ratio, /* i : energy ratio */
6912 : const Word16 L_frame, /* i : ACELP frame length */
6913 : const Word16 bfi, /* i : fec flag */
6914 : Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */
6915 : Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */
6916 : Word16 bpf_memory_Q[],
6917 : Word16 Qout
6918 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6919 : ,
6920 : int16_t element_mode
6921 : #endif
6922 : )
6923 : {
6924 : Word16 i, j;
6925 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6926 : Word16 excitation_in_interp3_buffer[L_FRAME48k + 4];
6927 34519 : Word16 *excitation_in_interp3 = &excitation_in_interp3_buffer[0] + 4;
6928 : #else
6929 : Word16 excitation_in_interp3[L_FRAME48k];
6930 : #endif
6931 : Word16 tmp[L_FRAME48k];
6932 : Word32 temp1;
6933 : Word32 ratio2;
6934 : Word32 L_tmp;
6935 : Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp;
6936 :
6937 : /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */
6938 34519 : j = 0;
6939 : /* white excitation from DC to 8 kHz resampled to produce DC to 24 kHz excitation. */
6940 11080599 : FOR( i = 0; i < L_FRAME48k; i += 3 )
6941 : {
6942 11046080 : excitation_in_interp3[i] = mult( excitation_in[j], 24576 ); /* Q(Q_fb_exc+13-15 = Q_fb_exc-2) */
6943 11046080 : move16();
6944 11046080 : excitation_in_interp3[i + 1] = 0;
6945 11046080 : move16();
6946 11046080 : excitation_in_interp3[i + 2] = 0;
6947 11046080 : move16();
6948 11046080 : j++;
6949 : }
6950 34519 : exp_tmp = sub( Q_fb_exc, 2 );
6951 :
6952 34519 : IF( EQ_16( L_frame, L_FRAME16k ) )
6953 : {
6954 : /* for 16kHz ACELP core */
6955 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6956 26953 : elliptic_bpf_48k_generic_fx(
6957 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6958 : element_mode,
6959 : #endif
6960 : 1, // IsUpsampled3
6961 : excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx
6962 :
6963 : );
6964 : #else
6965 : elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx );
6966 : #endif
6967 : }
6968 : ELSE
6969 : {
6970 : /* for 12.8kHz ACELP core */
6971 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6972 7566 : elliptic_bpf_48k_generic_fx(
6973 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6974 : element_mode,
6975 : #endif
6976 : 1, // IsUpsampled3
6977 : excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx );
6978 : #else
6979 : elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx );
6980 : #endif
6981 : }
6982 34519 : temp1 = sum2_fx_mod( tmp, L_FRAME48k );
6983 :
6984 34519 : L_tmp = L_max( 1, fb_exc_energy ); /*Q(2*Q_fb_exc + 1)*/
6985 34519 : exp = norm_l( L_tmp );
6986 34519 : tmp3 = extract_h( L_shl( L_tmp, exp ) );
6987 34519 : tmp1 = sub( add( Q_fb_exc, Q_fb_exc ), 8 ); /* 1-9*/
6988 34519 : exp = sub( sub( 31, tmp1 ), exp );
6989 :
6990 34519 : exp2 = norm_l( temp1 );
6991 34519 : tmp2 = extract_h( L_shl( temp1, exp2 ) );
6992 34519 : exp2 = sub( sub( 31, sub( shl( exp_tmp, 1 ), 8 ) ), exp2 ); /* in Q15 (temp1 in Q9)*/
6993 :
6994 34519 : exp = sub( exp2, exp ); /* Denormalize and substract */
6995 34519 : IF( GT_16( tmp2, tmp3 ) )
6996 : {
6997 18163 : tmp2 = shr( tmp2, 1 );
6998 18163 : exp = add( exp, 1 );
6999 : }
7000 34519 : IF( 0 != tmp3 )
7001 : {
7002 34519 : tmp3 = div_s( tmp2, tmp3 );
7003 34519 : L_tmp = L_deposit_h( tmp3 );
7004 34519 : L_tmp = Isqrt_lc( L_tmp, &exp ); /*Q(31-exp)*/
7005 34519 : ratio2 = Mult_32_16( L_tmp, ratio ); /*Q(31-exp+0-15 = 16-exp)*/
7006 : }
7007 : ELSE
7008 : {
7009 0 : ratio2 = 0;
7010 : }
7011 :
7012 34519 : IF( !bfi )
7013 : {
7014 33762 : *prev_fbbwe_ratio = ratio;
7015 33762 : move16();
7016 : }
7017 : ELSE
7018 : {
7019 : /**prev_fbbwe_ratio = ratio*0.5f;*/
7020 757 : *prev_fbbwe_ratio = shr( ratio, 1 );
7021 757 : move16();
7022 : }
7023 34519 : tmp3 = add( sub( Qout, add( sub( 1, exp ), exp_tmp ) ), 16 ); /*Qout - (1 -exp +exp_tmp) + 16 */
7024 33172759 : FOR( i = 0; i < L_FRAME48k; i++ )
7025 : {
7026 : #ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx
7027 33138240 : L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */
7028 : Word32 L_tmp32;
7029 : Word16 tmp16;
7030 :
7031 : // if (L_tmp < 0)
7032 33138240 : if ( L_tmp < 0 )
7033 : {
7034 16397681 : L_tmp32 = L_negate( L_tmp );
7035 : }
7036 33138240 : if ( L_tmp < 0 )
7037 : {
7038 16397681 : L_tmp32 = L_shl_sat( L_tmp32, tmp3 );
7039 : }
7040 33138240 : if ( L_tmp < 0 )
7041 : {
7042 16397681 : tmp16 = extract_h( L_tmp32 );
7043 : }
7044 33138240 : if ( L_tmp < 0 )
7045 : {
7046 16397681 : tmp16 = negate( tmp16 );
7047 : }
7048 :
7049 : // if (L_tmp == 0)
7050 33138240 : if ( L_tmp == 0 )
7051 : {
7052 421640 : tmp16 = 0;
7053 421640 : move16();
7054 : }
7055 :
7056 : // if (L_tmp > 0)
7057 33138240 : if ( L_tmp > 0 )
7058 : {
7059 16318919 : L_tmp32 = L_shl_sat( L_tmp, tmp3 );
7060 : }
7061 33138240 : if ( L_tmp > 0 )
7062 : {
7063 16318919 : tmp16 = extract_h( L_tmp32 );
7064 : }
7065 :
7066 33138240 : output[i] = tmp16;
7067 33138240 : move16();
7068 :
7069 : #else
7070 : L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */
7071 : IF( L_tmp < 0 )
7072 : {
7073 : output[i] = negate( extract_h( L_shl_sat( L_negate( L_tmp ), tmp3 ) ) ); /*Qout*/
7074 : move16();
7075 : }
7076 : ELSE
7077 : {
7078 : output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/
7079 : move16();
7080 : }
7081 : #endif
7082 : }
7083 34519 : return;
7084 : }
7085 :
7086 : /*-------------------------------------------------------------------*
7087 : * Estimate_mix_factors_fx() *
7088 : * *
7089 : * Estimate mix factors for SHB excitation generation *
7090 : *-------------------------------------------------------------------*/
7091 25662 : void Estimate_mix_factors_fx(
7092 : const Word16 *shb_res, /* i : SHB LP residual in Q = Q_shb */
7093 : const Word16 Q_shb,
7094 : const Word16 *exc16kWhtnd, /* i : SHB transformed low band excitation Q_bwe_exc */
7095 : const Word16 Q_bwe_exc,
7096 : const Word16 *White_exc16k_frac, /* i : Modulated envelope shaped white noise Q_frac */
7097 : const Word16 Q_frac,
7098 : const Word32 pow1, /* i : SHB exc. power for normalization in Q_pow1 */
7099 : const Word16 Q_pow1,
7100 : const Word32 pow22, /* i : White noise excitation for normalization in Q_pow22 */
7101 : const Word16 Q_pow22,
7102 : Word16 *vf_modified, /* o : Estimated voice factors */
7103 : Word16 *vf_ind /* o : voice factors VQ index */
7104 : )
7105 : {
7106 : Word16 shb_res_local[L_FRAME16k], WN_exc_local[L_FRAME16k];
7107 : Word32 pow3, temp_p1_p2, temp_p1_p3;
7108 : Word16 temp_numer1[L_FRAME16k], temp_numer2[L_FRAME16k];
7109 : Word16 i, length;
7110 : Word16 exp1, exp2, expa, expb, fraca, fracb, scale, num_flag, den_flag;
7111 : Word16 tmp, tmp1, sc1, sc2;
7112 : Word32 L_tmp1, L_tmp2;
7113 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
7114 25662 : Flag Overflow = 0;
7115 25662 : move32();
7116 : #endif
7117 :
7118 25662 : Copy( shb_res, shb_res_local, L_FRAME16k );
7119 25662 : Copy( White_exc16k_frac, WN_exc_local, L_FRAME16k );
7120 : /* WN_exc_local in (Q_frac) */
7121 :
7122 25662 : pow3 = Dot_product( shb_res_local, shb_res_local, L_FRAME16k ); /* (2*Q_shb+1) */
7123 :
7124 25662 : pow3 = L_add( pow3, L_shl( 21475l /*0.00001f in Q31*/, 2 * Q_shb + 1 - 31 ) ); /* (2*Q_shb+1) */
7125 25662 : if ( pow3 == 0 )
7126 : {
7127 0 : pow3 = 1;
7128 0 : move32();
7129 : }
7130 :
7131 : /* temp_p1_p2 = (float)sqrt(pow1/pow2); */
7132 25662 : temp_p1_p2 = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp1 ); /* temp_p1_p3 in (Q31+exp1) */
7133 :
7134 : /* temp_p1_p3 = (float)sqrt(pow1/pow3); */
7135 25662 : temp_p1_p3 = root_a_over_b_fx( pow1, Q_pow1, pow3, ( 2 * Q_shb + 1 ), &exp2 ); /* temp_p1_p3 in (Q31+exp2) */
7136 :
7137 :
7138 25662 : sc1 = sub( Q_bwe_exc, sub( Q_frac, exp1 ) );
7139 25662 : sc2 = sub( Q_bwe_exc, sub( Q_shb, exp2 ) );
7140 8237502 : FOR( i = 0; i < L_FRAME16k; i++ )
7141 : {
7142 8211840 : L_tmp1 = Mult_32_16( temp_p1_p2, WN_exc_local[i] ); /* (Q_frac - exp1) +16 */
7143 8211840 : WN_exc_local[i] = round_fx( L_tmp1 );
7144 8211840 : move16();
7145 8211840 : L_tmp2 = Mult_32_16( temp_p1_p3, shb_res_local[i] ); /* (Q_shb - exp2) +16 */
7146 8211840 : shb_res_local[i] = round_fx( L_tmp2 );
7147 8211840 : move16();
7148 : /* temp_numer1[i] = sub(shb_res_local[i], WN_exc_local[i]); */
7149 8211840 : temp_numer1[i] = round_fx_sat( L_sub_sat( L_shl_sat( L_tmp2, sc2 ), L_shl_sat( L_tmp1, sc1 ) ) );
7150 8211840 : move16();
7151 : /* (Q_bwe_exc) */
7152 :
7153 : /* temp_numer2[i] = sub(exc16kWhtnd[i], WN_exc_local[i]); */
7154 8211840 : temp_numer2[i] = sub_sat( exc16kWhtnd[i], round_fx_sat( L_shl_sat( L_tmp1, sc1 ) ) );
7155 8211840 : move16();
7156 : /* (Q_bwe_exc) */
7157 : }
7158 :
7159 :
7160 25662 : length = L_FRAME16k;
7161 25662 : move16();
7162 25662 : temp_p1_p2 = Dot_product( temp_numer1, temp_numer2, length ); /* 2*(Q_bwe_exc)+1 */
7163 25662 : temp_p1_p3 = Dot_product( temp_numer2, temp_numer2, length ); /* 2*(Q_bwe_exc)+1 */
7164 :
7165 : /* vf_modified[i] = min( max_val( (temp_p1_p2 / temp_p1_p3), 0.1f), 0.99f); */
7166 : /* tmp = (temp_p1_p2 / temp_p1_p3); */
7167 25662 : IF( temp_p1_p3 > 0 )
7168 : {
7169 25662 : expa = norm_l( temp_p1_p3 );
7170 25662 : fraca = extract_h( L_shl( temp_p1_p3, expa ) );
7171 25662 : expa = sub( 30, expa );
7172 :
7173 25662 : expb = norm_l( temp_p1_p2 );
7174 25662 : fracb = round_fx_o( L_shl_o( temp_p1_p2, expb, &Overflow ), &Overflow );
7175 25662 : expb = sub( 30, expb );
7176 :
7177 25662 : num_flag = 0;
7178 25662 : move16();
7179 25662 : IF( fraca < 0 )
7180 : {
7181 0 : num_flag = 1;
7182 0 : move16();
7183 0 : fraca = negate( fraca );
7184 : }
7185 :
7186 25662 : den_flag = 0;
7187 25662 : move16();
7188 25662 : IF( fracb < 0 )
7189 : {
7190 0 : den_flag = 1;
7191 0 : move16();
7192 0 : fracb = negate( fracb );
7193 : }
7194 :
7195 25662 : scale = shr( sub( fraca, fracb ), 15 );
7196 25662 : fracb = shl( fracb, scale );
7197 25662 : expb = sub( expb, scale );
7198 :
7199 25662 : tmp = div_s( fracb, fraca );
7200 25662 : exp1 = sub( expb, expa );
7201 25662 : tmp = shl_sat( tmp, exp1 );
7202 25662 : if ( NE_16( num_flag, den_flag ) )
7203 : {
7204 0 : tmp = negate( tmp );
7205 : }
7206 : }
7207 : ELSE
7208 : {
7209 0 : tmp = 0;
7210 0 : move16();
7211 : }
7212 :
7213 25662 : vf_modified[0] = s_min( s_max( tmp, 3277 /* 0.1f in Q15*/ ), 32440 /* 0.99f in Q15 */ );
7214 25662 : move16();
7215 :
7216 25662 : *vf_ind = usquant_fx( vf_modified[0], &tmp1, 4096 /* 0.125 in Q15 */, 2048 /* 0.125 in Q14 */, shl( 1, NUM_BITS_SHB_VF ) );
7217 25662 : move16();
7218 :
7219 25662 : vf_modified[0] = tmp1;
7220 25662 : move16();
7221 25662 : vf_modified[1] = tmp1;
7222 25662 : move16();
7223 25662 : vf_modified[2] = tmp1;
7224 25662 : move16();
7225 25662 : vf_modified[3] = tmp1;
7226 25662 : move16();
7227 25662 : vf_modified[4] = tmp1;
7228 25662 : move16();
7229 :
7230 : /* vf_modified in Q15 */
7231 :
7232 25662 : return;
7233 : }
7234 :
7235 : /*======================================================================================*/
7236 : /* FUNCTION : prep_tbe_exc_fx() */
7237 : /*--------------------------------------------------------------------------------------*/
7238 : /* PURPOSE : Prepare TBE excitation */
7239 : /*--------------------------------------------------------------------------------------*/
7240 : /* INPUT ARGUMENTS : */
7241 : /* _ (Word16) L_frame_fx : length of the frame */
7242 : /* _ (Word16) i_subfr_fx : subframe index */
7243 : /* _ (Word16) gain_pit_fx : Pitch gain (14) */
7244 : /* _ (Word32) gain_code_fx : algebraic codebook gain (Q(16+Q_exc)) */
7245 : /* _ (Word16*[]) code_fx : algebraic excitation (Q9) */
7246 : /* _ (Word16) voice_fac_fx : voicing factor (Q15) */
7247 : /* _ (Word16) gain_preQ_fx : prequantizer excitation gain */
7248 : /* _ (Word16[]) code_preQ_fx : prequantizer excitation */
7249 : /*--------------------------------------------------------------------------------------*/
7250 : /* OUTPUT ARGUMENTS : */
7251 : /* _ (Word16*[]) voice_factors_fx : TBE voicing factor (Q15) */
7252 : /*--------------------------------------------------------------------------------------*/
7253 : /* INPUT/OUTPUT ARGUMENTS : */
7254 : /* _ (Word16[]) bwe_exc_fx : excitation for TBE (Q_exc) */
7255 : /*--------------------------------------------------------------------------------------*/
7256 :
7257 : /* _ None */
7258 : /*--------------------------------------------------------------------------------------*/
7259 : /* RETURN ARGUMENTS : */
7260 : /* _ None */
7261 : /*======================================================================================*/
7262 :
7263 : #ifndef REMOVE_EVS_DUPLICATES
7264 : void prep_tbe_exc_fx(
7265 : const Word16 L_frame_fx, /* i : length of the frame */
7266 : const Word16 i_subfr_fx, /* i : subframe index */
7267 : const Word16 gain_pit_fx, /* i : Pitch gain Q14*/
7268 : const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/
7269 : const Word16 code_fx[], /* i : algebraic excitation Q9*/
7270 : const Word16 voice_fac_fx, /* i : voicing factor Q15*/
7271 : Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/
7272 : Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/
7273 : const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */
7274 : const Word16 code_preQ_fx[], /* i : prequantizer excitation */
7275 : const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */
7276 : Word16 T0, /* i : integer pitch variables Q0 */
7277 : Word16 T0_frac, /* i : Fractional pitch variables Q0*/
7278 : const Word16 coder_type, /* i : coding type */
7279 : Word32 core_brate )
7280 : {
7281 : Word16 i;
7282 : Word16 tmp_code_fx[2 * L_SUBFR * HIBND_ACB_L_FAC];
7283 : Word16 tmp_code_preInt_fx[L_SUBFR];
7284 : Word16 gain_code16 = 0;
7285 : move16();
7286 : Word16 tmp /*, tmp1, tmp2*/;
7287 : /*Word16 random_code[L_SUBFR * HIBND_ACB_L_FAC];*/
7288 : Word16 pitch;
7289 :
7290 : Word32 L_tmp, Ltemp1, Ltemp2;
7291 : Word32 tempQ31;
7292 : Word16 tempQ15;
7293 : Word16 L_subfr = L_SUBFR;
7294 : move16();
7295 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
7296 : Flag Overflow = 0;
7297 : move32();
7298 : #endif
7299 :
7300 : /**voice_factors = VF_0th_PARAM + VF_1st_PARAM * voice_fac + VF_2nd_PARAM * voice_fac * voice_fac;
7301 : = VF_0th_PARAM + voice_fac * (VF_1st_PARAM + VF_2nd_PARAM * voice_fac )
7302 : *voice_factors = min( max_val(0.0f, *voice_factors), 1.0f); */
7303 : tempQ31 = L_deposit_h( VF_1st_PARAM_FX );
7304 : tempQ15 = mac_r( tempQ31, VF_2nd_PARAM_FX, voice_fac_fx );
7305 : tempQ31 = L_deposit_h( VF_0th_PARAM_FX );
7306 : *voice_factors_fx = mac_r( tempQ31, voice_fac_fx, tempQ15 );
7307 : move16();
7308 : tmp = MAX_16;
7309 : move16();
7310 :
7311 : pitch = shl_o( add( shl_o( T0, 2, &Overflow ), T0_frac ), 5, &Overflow ); /* Q7 */
7312 :
7313 : test();
7314 : test();
7315 : IF( ( ( EQ_16( coder_type, VOICED ) ) || ( GT_16( pitch, 14784 /* 115.5 in Q7 */ ) ) ) && ( GT_32( core_brate, ACELP_8k00 ) ) )
7316 : {
7317 : tmp = MAX_16;
7318 : move16();
7319 : *voice_factors_fx = mult_r( *voice_factors_fx, tmp );
7320 : move16();
7321 : }
7322 :
7323 : *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 );
7324 : move16();
7325 : IF( EQ_16( L_frame_fx, L_FRAME ) )
7326 : {
7327 : interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr ); /* code: Q9, tmp_code: Q9 */
7328 : gain_code16 = round_fx_o( L_shl_o( gain_code_fx, Q_exc, &Overflow ), &Overflow ); /*Q_exc */
7329 : FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ )
7330 : {
7331 : L_tmp = L_mult( gain_code16, tmp_code_fx[i] ); /* Q9 + Q_exc + 1*/
7332 : L_tmp = L_shl_sat( L_tmp, 5 ); /* Q9 + Q_exc + Q6*/
7333 : L_tmp = L_mac_sat( L_tmp, gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] ); /*Q15+Q_exc */
7334 : L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /*16+Q_exc */ /* saturation can occur here */
7335 : bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx_o( L_tmp, &Overflow ); /*Q_exc */
7336 : move16();
7337 : }
7338 : }
7339 : ELSE
7340 : {
7341 : IF( gain_preQ_fx != 0 )
7342 : {
7343 : FOR( i = 0; i < L_subfr; i++ )
7344 : {
7345 : /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */
7346 : Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */
7347 : Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12 */
7348 :
7349 : Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */
7350 : Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, 4 ) /*Q_exc+16-13*/, &Overflow ); /*Q_exc+16 */
7351 :
7352 : tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc */
7353 : move16();
7354 : }
7355 : }
7356 : ELSE
7357 : {
7358 : FOR( i = 0; i < L_subfr; i++ )
7359 : {
7360 : /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */
7361 : Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */
7362 : Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */
7363 : tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow ); /* Q_exc */
7364 : move16();
7365 : }
7366 : }
7367 :
7368 : interp_code_4over2_fx( tmp_code_preInt_fx, tmp_code_fx, L_subfr ); /* o: tmp_code in Q_exc */
7369 : FOR( i = 0; i < L_subfr * 2; i++ )
7370 : {
7371 : L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * 2] ); /*Q14+Q_exc+1 */
7372 : tmp = round_fx_o( L_shl_o( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/, &Overflow ), &Overflow ); /* tmp in Q_exc */
7373 : bwe_exc_fx[i + i_subfr_fx * 2] = add_o( tmp, tmp_code_fx[i], &Overflow ); /*Q_exc */
7374 : move16();
7375 : }
7376 : }
7377 :
7378 : return;
7379 : }
7380 :
7381 : /*======================================================================================*/
7382 : /* FUNCTION : prep_tbe_exc_ivas_fx() */
7383 : /*--------------------------------------------------------------------------------------*/
7384 : /* PURPOSE : Prepare TBE excitation */
7385 : /*--------------------------------------------------------------------------------------*/
7386 : /* INPUT ARGUMENTS : */
7387 : /* _ (Word16) L_frame_fx : length of the frame */
7388 : /* _ (Word16) i_subfr_fx : subframe index */
7389 : /* _ (Word16) gain_pit_fx : Pitch gain (14) */
7390 : /* _ (Word32) gain_code_fx : algebraic codebook gain (Q(16+Q_exc)) */
7391 : /* _ (Word16*[]) code_fx : algebraic excitation (Q9) */
7392 : /* _ (Word16) voice_fac_fx : voicing factor (Q15) */
7393 : /* _ (Word16) gain_preQ_fx : prequantizer excitation gain */
7394 : /* _ (Word16[]) code_preQ_fx : prequantizer excitation */
7395 : /*--------------------------------------------------------------------------------------*/
7396 : /* OUTPUT ARGUMENTS : */
7397 : /* _ (Word16*[]) voice_factors_fx : TBE voicing factor (Q15) */
7398 : /*--------------------------------------------------------------------------------------*/
7399 : /* INPUT/OUTPUT ARGUMENTS : */
7400 : /* _ (Word16[]) bwe_exc_fx : excitation for TBE (Q_exc) */
7401 : /*--------------------------------------------------------------------------------------*/
7402 :
7403 : /* _ None */
7404 : /*--------------------------------------------------------------------------------------*/
7405 : /* RETURN ARGUMENTS : */
7406 : /* _ None */
7407 : /*======================================================================================*/
7408 : #endif
7409 1144883 : void prep_tbe_exc_ivas_fx(
7410 : const Word16 L_frame_fx, /* i : length of the frame */
7411 : const Word16 L_subfr,
7412 : const Word16 i_subfr_fx, /* i : subframe index */
7413 : const Word16 gain_pit_fx, /* i : Pitch gain Q14*/
7414 : const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/
7415 : const Word16 code_fx[], /* i : algebraic excitation Q9*/
7416 : const Word16 voice_fac_fx, /* i : voicing factor Q15*/
7417 : Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/
7418 : Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/
7419 : const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */
7420 : const Word16 code_preQ_fx[], /* i : prequantizer excitation */
7421 : const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */
7422 : Word16 T0, /* i : integer pitch variables Q0 */
7423 : Word16 T0_frac, /* i : Fractional pitch variables Q0*/
7424 : const Word16 coder_type, /* i : coding type */
7425 : Word32 core_brate, /* i : core bitrate */
7426 : const Word16 element_mode, /* i : element mode */
7427 : const Word16 idchan, /* i : channel ID */
7428 : const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */
7429 : const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */
7430 : )
7431 : {
7432 : Word16 i;
7433 : Word16 tmp_code_fx[2 * L_SUBFR * HIBND_ACB_L_FAC];
7434 : Word16 tmp_code_preInt_fx[L_SUBFR];
7435 1144883 : Word16 gain_code16 = 0;
7436 1144883 : move16();
7437 : Word16 tmp /*, tmp1, tmp2*/;
7438 : /*Word16 random_code[L_SUBFR * HIBND_ACB_L_FAC];*/
7439 : Word16 pitch;
7440 :
7441 : Word32 L_tmp, Ltemp1, Ltemp2;
7442 : Word32 tempQ31;
7443 : Word16 tempQ15;
7444 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
7445 1144883 : Flag Overflow = 0;
7446 1144883 : move32();
7447 : #endif
7448 :
7449 : /**voice_factors = VF_0th_PARAM + VF_1st_PARAM * voice_fac + VF_2nd_PARAM * voice_fac * voice_fac;
7450 : = VF_0th_PARAM + voice_fac * (VF_1st_PARAM + VF_2nd_PARAM * voice_fac )
7451 : *voice_factors = min( max_val(0.0f, *voice_factors), 1.0f); */
7452 1144883 : tempQ31 = L_deposit_h( VF_1st_PARAM_FX );
7453 1144883 : tempQ15 = mac_r( tempQ31, VF_2nd_PARAM_FX, voice_fac_fx );
7454 1144883 : tempQ31 = L_deposit_h( VF_0th_PARAM_FX );
7455 1144883 : *voice_factors_fx = mac_r( tempQ31, voice_fac_fx, tempQ15 );
7456 1144883 : move16();
7457 :
7458 1144883 : tmp = MAX_16;
7459 1144883 : move16();
7460 :
7461 1144883 : pitch = shl_o( add( shl_o( T0, 2, &Overflow ), T0_frac ), 5, &Overflow ); /* Q7 */
7462 :
7463 1144883 : test();
7464 1144883 : test();
7465 1144883 : IF( ( ( EQ_16( coder_type, VOICED ) ) || ( GT_16( pitch, 14784 ) ) ) && ( GT_32( core_brate, ACELP_8k00 ) ) )
7466 : {
7467 351547 : tmp = MAX_16;
7468 351547 : move16();
7469 351547 : *voice_factors_fx = mult_r( *voice_factors_fx, tmp );
7470 351547 : move16();
7471 : }
7472 :
7473 1144883 : *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 );
7474 1144883 : move16();
7475 :
7476 1144883 : test();
7477 1144883 : test();
7478 1144883 : IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag )
7479 : {
7480 914 : test();
7481 914 : IF( flag_TD_BWE && i_subfr_fx == 0 )
7482 : {
7483 0 : set16_fx( bwe_exc_fx, 0, L_FRAME32k );
7484 : }
7485 914 : return;
7486 : }
7487 :
7488 1143969 : IF( EQ_16( L_frame_fx, L_FRAME ) )
7489 : {
7490 460424 : interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr ); /* code: Q9, tmp_code: Q9 */
7491 460424 : gain_code16 = round_fx_o( L_shl_o( gain_code_fx, Q_exc, &Overflow ), &Overflow ); /*Q_exc */
7492 74128264 : FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ )
7493 : {
7494 73667840 : L_tmp = L_mult( gain_code16, tmp_code_fx[i] ); /* Q9 + Q_exc + 1*/
7495 73667840 : L_tmp = L_shl( L_tmp, 5 ); /* Q9 + Q_exc + Q6*/
7496 73667840 : L_tmp = L_mac_o( L_tmp, gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC], &Overflow ); /*Q15+Q_exc */
7497 73667840 : L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /*16+Q_exc */ /* saturation can occur here */
7498 73667840 : bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx_o( L_tmp, &Overflow ); /*Q_exc */
7499 73667840 : move16();
7500 : }
7501 : }
7502 : ELSE
7503 : {
7504 683545 : Word16 shift = 4;
7505 683545 : move16();
7506 683545 : IF( gain_preQ_fx != 0 )
7507 : {
7508 8749325 : FOR( i = 0; i < L_subfr; i++ )
7509 : {
7510 : /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */
7511 8614720 : Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */
7512 8614720 : Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12 */
7513 :
7514 8614720 : Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */
7515 8614720 : Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, shift ) /*Q_exc+ 2 + 6 (or) 10 - 13*/, &Overflow ); /*Q_exc+16 */
7516 :
7517 8614720 : tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc */
7518 8614720 : move16();
7519 : }
7520 : }
7521 : ELSE
7522 : {
7523 35681100 : FOR( i = 0; i < L_subfr; i++ )
7524 : {
7525 : /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */
7526 35132160 : Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */
7527 35132160 : Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */
7528 35132160 : tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow ); /* Q_exc */
7529 35132160 : move16();
7530 : }
7531 : }
7532 :
7533 683545 : interp_code_4over2_fx( tmp_code_preInt_fx, tmp_code_fx, L_subfr ); /* o: tmp_code in Q_exc */
7534 88177305 : FOR( i = 0; i < shl( L_subfr, 1 ); i++ )
7535 : {
7536 87493760 : L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + shl( i_subfr_fx, 1 )] ); /*Q14+Q_exc+1 */
7537 87493760 : tmp = round_fx_o( L_shl_o( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/, &Overflow ), &Overflow ); /* tmp in Q_exc */
7538 87493760 : bwe_exc_fx[i + shl( i_subfr_fx, 1 )] = add_o( tmp, tmp_code_fx[i], &Overflow ); /*Q_exc */
7539 87493760 : move16();
7540 : }
7541 : }
7542 :
7543 1143969 : return;
7544 : }
7545 :
7546 : /*=============================================================================*/
7547 : /* FUNCTION : void swb_formant_fac_fx ( ) */
7548 : /*------------------------------------------------------------------------------*/
7549 : /* PURPOSE : * Find strength of adaptive formant postfilter using tilt */
7550 : /* of the high band. The 2nd lpc coefficient is used as a tilt approximation. */
7551 : /*------------------------------------------------------------------------------*/
7552 : /* INPUT ARGUMENTS : */
7553 : /* const Word16 lpc_shb2 : 2nd HB LPC coefficient Q12 */
7554 : /*------------------------------------------------------------------------------*/
7555 : /*INPUT/OUTPUT ARGUMENTS : */
7556 : /* Word16 *tilt_mem Q12 */
7557 : /* OUTPUT ARGUMENTS : */
7558 : /*------------------------------------------------------------------------------*/
7559 : /* RETURN ARGUMENTS : */
7560 : /* formant_fac :Formant filter strength [0,1] Q15 */
7561 : /*------------------------------------------------------------------------------*/
7562 : /* CALLED FROM : */
7563 : /*==============================================================================*/
7564 :
7565 220371 : Word16 swb_formant_fac_fx( /* o : Formant filter strength [0,1] */
7566 : const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient */
7567 : Word16 *tilt_mem /* i/o: Tilt smoothing memory (Q12) */
7568 : )
7569 : {
7570 : Word16 formant_fac;
7571 : Word16 tmp;
7572 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
7573 220371 : Flag Overflow = 0;
7574 : #endif
7575 :
7576 : /* Smoothen tilt value */
7577 : /* tmp = 0.5f * (float)fabs(lpc_shb2) + 0.5f * *tilt_mem; */
7578 220371 : tmp = mult_r( 16384, abs_s( lpc_shb2 ) );
7579 220371 : tmp = add( tmp, mult_r( 16384, *tilt_mem ) ); /* Q12 */
7580 220371 : *tilt_mem = tmp;
7581 220371 : move16(); /*Q12 */
7582 : /* Map to PF strength */
7583 : /* formant_fac = (tmp - SWB_TILT_LOW)*SWB_TILT_DELTA; */
7584 220371 : tmp = sub( tmp, SWB_TILT_LOW_FX ); /* Q12 */
7585 220371 : formant_fac = mult_r( tmp, SWB_TILT_DELTA_FX ); /* Q12 */
7586 :
7587 :
7588 220371 : IF( GT_16( formant_fac, 4096 /* 1 in Q12 */ ) )
7589 : {
7590 146 : formant_fac = 4096; /* 1 in Q12 */
7591 146 : move16();
7592 : }
7593 220225 : ELSE IF( formant_fac < 0 )
7594 : {
7595 194808 : formant_fac = 0;
7596 194808 : move16();
7597 : }
7598 : /* now formant_fac in Q12 */
7599 :
7600 : /* formant_fac = 1.0f - 0.5f*formant_fac */
7601 220371 : tmp = mult_r( 16384, formant_fac ); /* 0.5 in Q15 */
7602 220371 : formant_fac = shl_o( sub( 4096 /* 1 in Q12 */, tmp ), 3, &Overflow );
7603 220371 : return formant_fac; /*Q15 */
7604 : }
7605 :
7606 :
7607 20447 : void wb_tbe_extras_reset_fx(
7608 : Word16 mem_genSHBexc_filt_down_wb2[],
7609 : Word16 mem_genSHBexc_filt_down_wb3[] )
7610 : {
7611 20447 : set16_fx( mem_genSHBexc_filt_down_wb2, 0, 2 * ALLPASSSECTIONS_STEEP + 1 );
7612 20447 : set16_fx( mem_genSHBexc_filt_down_wb3, 0, 2 * ALLPASSSECTIONS_STEEP + 1 );
7613 :
7614 20447 : return;
7615 : }
7616 :
7617 : /*-------------------------------------------------------------------*
7618 : * get_tbe_bits() *
7619 : * *
7620 : * Determine TBE bit consumption per frame from bitrate *
7621 : *-------------------------------------------------------------------*/
7622 :
7623 :
7624 2428 : Word16 get_tbe_bits_fx(
7625 : const Word32 total_brate, /* o : TBE bit consumption per frame */
7626 : const Word16 bwidth, /* i : overall bitrate */
7627 : const Word16 rf_mode /* i : bandwidht mode */
7628 : )
7629 : {
7630 2428 : Word16 i, bits = 0;
7631 :
7632 2428 : IF( EQ_16( rf_mode, 1 ) )
7633 : {
7634 : /* TBE bits for core, primary frame */
7635 0 : test();
7636 0 : test();
7637 0 : IF( ( EQ_16( bwidth, WB ) ) && ( EQ_32( total_brate, ACELP_13k20 ) ) )
7638 : {
7639 : /* Gain frame: 4, Gain shapes: 0, and LSFs: 2 */
7640 0 : bits = NUM_BITS_SHB_FrameGain_LBR_WB + NUM_BITS_LBR_WB_LSF;
7641 0 : move16();
7642 : }
7643 0 : ELSE IF( ( EQ_16( bwidth, SWB ) ) && ( EQ_32( total_brate, ACELP_13k20 ) ) )
7644 : {
7645 : /* Gain frame: 5, Gain shapes: 5, and lowrate LSFs: 8 */
7646 0 : bits = NUM_BITS_SHB_FRAMEGAIN + NUM_BITS_SHB_SUBGAINS + 8;
7647 0 : move16();
7648 : }
7649 : }
7650 : ELSE
7651 : {
7652 2428 : test();
7653 2428 : test();
7654 2428 : IF( ( EQ_16( bwidth, WB ) ) && ( EQ_32( total_brate, ACELP_9k60 ) ) )
7655 : {
7656 0 : bits = NUM_BITS_LBR_WB_LSF + NUM_BITS_SHB_FrameGain_LBR_WB;
7657 0 : move16();
7658 : }
7659 2428 : ELSE IF( ( EQ_16( bwidth, SWB ) ) || ( EQ_16( bwidth, FB ) ) )
7660 : {
7661 2428 : test();
7662 2428 : IF( EQ_32( total_brate, ACELP_9k60 ) )
7663 : {
7664 0 : bits = NUM_BITS_SHB_FRAMEGAIN + NUM_BITS_SHB_SUBGAINS + 8;
7665 0 : move16();
7666 : }
7667 2428 : ELSE IF( ( GE_32( total_brate, ACELP_13k20 ) ) && ( LE_32( total_brate, ACELP_32k ) ) )
7668 : {
7669 2428 : bits = NUM_BITS_SHB_SUBGAINS + NUM_BITS_SHB_FRAMEGAIN + NUM_LSF_GRID_BITS + MIRROR_POINT_BITS;
7670 2428 : move16();
7671 :
7672 14568 : FOR( i = 0; i < NUM_Q_LSF; i++ )
7673 : {
7674 12140 : bits = add( bits, lsf_q_num_bits[i] );
7675 : }
7676 : }
7677 :
7678 2428 : if ( GE_32( total_brate, ACELP_24k40 ) )
7679 : {
7680 2428 : bits = add( bits, NUM_BITS_SHB_ENER_SF + NUM_BITS_SHB_VF + NUM_BITS_SHB_RES_GS * NB_SUBFR16k );
7681 : }
7682 :
7683 2428 : test();
7684 2428 : test();
7685 2428 : if ( EQ_16( bwidth, SWB ) && ( EQ_32( total_brate, ACELP_16k40 ) || EQ_32( total_brate, ACELP_24k40 ) ) )
7686 : {
7687 2428 : bits = add( bits, BITS_TEC + BITS_TFA );
7688 : }
7689 :
7690 2428 : if ( EQ_16( bwidth, FB ) )
7691 : {
7692 : /* full band slope */
7693 0 : bits = add( bits, 4 );
7694 : }
7695 : }
7696 : }
7697 :
7698 2428 : return bits;
7699 : }
|