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