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