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