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 232715 : 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 232715 : set32_fx( mem_csfilt, 0, 2 );
51 232715 : set16_fx( mem_genSHBexc_filt_down_shb, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) );
52 232715 : set16_fx( state_lpc_syn, 0, LPC_SHB_ORDER );
53 :
54 232715 : set16_fx( syn_overlap, 0, L_SHB_LAHEAD );
55 232715 : set16_fx( state_syn_shbexc, 0, L_SHB_LAHEAD );
56 :
57 232715 : *tbe_demph = 0;
58 232715 : move16();
59 232715 : *tbe_premph = 0;
60 232715 : move16();
61 :
62 232715 : set16_fx( mem_stp_swb, 0, LPC_SHB_ORDER );
63 232715 : *gain_prec_swb = 16384;
64 232715 : move16(); /*Q14 = 1 */
65 :
66 232715 : 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 508959 : 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 508959 : tmp_fac = 320;
131 508959 : move16(); /*2.5 in Q7*/
132 508959 : if ( EQ_16( L_frame, L_FRAME16k ) )
133 : {
134 307638 : tmp_fac = 256;
135 307638 : move16(); /*2.0 in Q7*/
136 : }
137 508959 : tmp_fx = extract_l( L_mult( T0_frac_fx, 32 ) ); /*Q8, 0.25 in Q7*/
138 508959 : tmp_fx = add( 512, tmp_fx ); /*Q8; 2 in Q8*/
139 508959 : tmp_fx = mult_r( tmp_fx, tmp_fac ); /*Q16->Q0; 2.5 in Q7 or 2.0 in Q7 */
140 :
141 508959 : tmp1_fx = sub( T0_fx, 2 ); /*Q0*/
142 :
143 508959 : tmp2_fx = shl( tmp1_fx, 1 ); /*Q0 */
144 :
145 508959 : IF( EQ_16( L_frame, L_FRAME ) )
146 : {
147 201321 : tmp2_fx = add( shl( tmp1_fx, 1 ), shr( tmp1_fx, 1 ) ); /*Q0; (5/2 = 2 + 1/2)*/
148 : }
149 :
150 508959 : offset_fx = add( tmp_fx, tmp2_fx ); /*Q0*/
151 :
152 508959 : return offset_fx;
153 : }
154 :
155 : /*-------------------------------------------------------------------*
156 : * swb_tbe_celp_exc()
157 : *
158 : * Compute tbe bwe celp excitation
159 : *-------------------------------------------------------------------*/
160 3050 : 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 3050 : IF( EQ_16( L_frame_fx, L_FRAME ) )
171 : {
172 : /*offset = T0 * HIBND_ACB_L_FAC + (int) ((float) T0_frac * 0.25f * HIBND_ACB_L_FAC + 2 * HIBND_ACB_L_FAC + 0.5f) - 2 * HIBND_ACB_L_FAC;
173 : for (i=0; i<L_SUBFR * HIBND_ACB_L_FAC; i++)
174 : {
175 : bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset + (int) error];
176 : }
177 : error += (float) offset - (float) T0 * HIBND_ACB_L_FAC - 0.25f * HIBND_ACB_L_FAC * (float) T0_frac;*/
178 :
179 0 : offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx );
180 0 : IF( *error_fx > 0 )
181 : {
182 0 : tmp_fx = shr( *error_fx, 5 ); /*Q0*/
183 : }
184 : ELSE
185 : {
186 0 : tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/
187 : }
188 :
189 0 : FOR( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ )
190 : {
191 0 : bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC - offset_fx + tmp_fx]; // Qx
192 0 : move16();
193 : }
194 0 : tmp_fx = extract_l( L_mult( T0_frac_fx, 1 ) ); /*Q3; 0.25 in Q2*/
195 0 : tmp_fx = add( shl( T0_fx, 3 ), tmp_fx ); /*Q3*/
196 0 : tmp_fx = extract_l( L_mult( tmp_fx, 5 ) ); /*Q5, 2.5 in Q1*/
197 0 : tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*Q5*/
198 0 : *error_fx = add( *error_fx, tmp_fx ); /*Q5*/
199 0 : move16();
200 : }
201 : ELSE
202 : {
203 : /* offset = T0*2.5 + (int) ((float) T0_frac * 0.25f*2.5 + 2*2.5 + 0.5f) - 2*2.5; - case above*/
204 : /* offset = T0*2 + (int) ((float) T0_frac * 0.25f*2 + 2*2 + 0.5f) - 2*2; - case here*/
205 :
206 : /*(int) ((float) T0_frac * 0.25f*2 + 2*2 + 0.5f)*/
207 3050 : offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx );
208 3050 : IF( *error_fx > 0 )
209 : {
210 1186 : tmp_fx = shr( *error_fx, 5 ); /*Q0*/
211 : }
212 : ELSE
213 : {
214 1864 : tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/
215 : }
216 :
217 393450 : FOR( i = 0; i < L_SUBFR * 2; i++ )
218 : {
219 390400 : bwe_exc_fx[i + i_subfr_fx * 2] = bwe_exc_fx[i + i_subfr_fx * 2 - offset_fx + tmp_fx]; // Qx
220 390400 : move16();
221 : }
222 :
223 : /* error += (float) offset - (float) T0 * 2 - 0.5f * (float) T0_frac;*/
224 3050 : tmp_fx = extract_l( L_mult( T0_frac_fx, 2 ) ); /*Q3; 0.5 in Q2*/
225 3050 : tmp_fx = add( shl( T0_fx, 4 ), tmp_fx ); /* now tmp_fx = "T0_fx*2+ 0.5f*T0_frac_fx" in Q3*/
226 3050 : tmp_fx = shl( tmp_fx, 2 ); /*now above tmp_fx in Q5*/
227 3050 : tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*move offset_fx to Q5, tmp_fx in Q5, ans tmp_fx in Q5*/
228 3050 : *error_fx = add( *error_fx, tmp_fx ); /*error_fx in Q5*/
229 3050 : move16();
230 : }
231 3050 : }
232 :
233 : /*-------------------------------------------------------------------*
234 : * swb_tbe_celp_exc_ivas()
235 : *
236 : * Compute tbe bwe celp excitation
237 : *-------------------------------------------------------------------*/
238 480184 : 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 480184 : test();
254 480184 : test();
255 480184 : IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag )
256 : {
257 440 : return;
258 : }
259 :
260 479744 : 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 189304 : offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx );
270 189304 : IF( *error_fx > 0 )
271 : {
272 26279 : tmp_fx = shr( *error_fx, 5 ); /*Q0*/
273 : }
274 : ELSE
275 : {
276 163025 : tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/
277 : }
278 :
279 30477944 : FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ )
280 : {
281 30288640 : 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 30288640 : move16();
283 : }
284 189304 : tmp_fx = extract_l( L_mult( T0_frac_fx, 1 ) ); /*Q3; 0.25 in Q2*/
285 189304 : tmp_fx = add( shl( T0_fx, 3 ), tmp_fx ); /*Q3*/
286 189304 : tmp_fx = extract_l( L_mult( tmp_fx, 5 ) ); /*Q5, 2.5 in Q1*/
287 189304 : tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*Q5*/
288 189304 : *error_fx = add( *error_fx, tmp_fx ); /*Q5*/
289 189304 : 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 290440 : offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx );
298 290440 : IF( *error_fx > 0 )
299 : {
300 175917 : tmp_fx = shr( *error_fx, 5 ); /*Q0*/
301 : }
302 : ELSE
303 : {
304 114523 : tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/
305 : }
306 :
307 37466760 : FOR( i = 0; i < L_subfr * 2; i++ )
308 : {
309 37176320 : bwe_exc_fx[i + i_subfr_fx * 2] = bwe_exc_fx[i + i_subfr_fx * 2 - offset_fx + tmp_fx];
310 37176320 : move16();
311 : }
312 :
313 : /* error += (float) offset - (float) T0 * 2 - 0.5f * (float) T0_frac;*/
314 290440 : tmp_fx = extract_l( L_mult( T0_frac_fx, 2 ) ); /*Q3; 0.5 in Q2*/
315 290440 : tmp_fx = add( shl( T0_fx, 4 ), tmp_fx ); /* now tmp_fx = "T0_fx*2+ 0.5f*T0_frac_fx" in Q3*/
316 290440 : tmp_fx = shl( tmp_fx, 2 ); /*now above tmp_fx in Q5*/
317 290440 : tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*move offset_fx to Q5, tmp_fx in Q5, ans tmp_fx in Q5*/
318 290440 : *error_fx = add( *error_fx, tmp_fx ); /*error_fx in Q5*/
319 290440 : 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 46860 : 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 7544460 : FOR( i = 0; i < length; i = i + 2 )
735 : {
736 7497600 : output[i] = negate( input[i] );
737 7497600 : move16();
738 7497600 : output[i + 1] = input[i + 1];
739 7497600 : move16();
740 : }
741 :
742 46860 : return;
743 : }
744 :
745 :
746 : /*----------------------------------------------------------------------------
747 : * calc_rc0_h
748 : *
749 : * computes 1st parcor from composed filter impulse response
750 : *---------------------------------------------------------------------------*/
751 1072064 : 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 1072064 : L_acc = L_mult( h[0], h[0] );
764 21441280 : FOR( i = 1; i < LONG_H_ST; i++ )
765 : {
766 20369216 : L_acc = L_mac( L_acc, h[i], h[i] );
767 : }
768 1072064 : sh_acf = norm_l( L_acc );
769 1072064 : L_acc = L_shl( L_acc, sh_acf );
770 1072064 : acf0 = extract_h( L_acc );
771 :
772 1072064 : ptrs = h;
773 :
774 1072064 : temp = *ptrs++;
775 1072064 : move16();
776 1072064 : L_acc = L_mult( temp, *ptrs );
777 20369216 : FOR( i = 1; i < LONG_H_ST - 1; i++ )
778 : {
779 19297152 : temp = *ptrs++;
780 19297152 : move16();
781 19297152 : L_acc = L_mac( L_acc, temp, *ptrs );
782 : }
783 1072064 : L_acc = L_shl( L_acc, sh_acf );
784 1072064 : acf1 = extract_h( L_acc );
785 :
786 : /* Compute 1st parcor */
787 1072064 : IF( acf0 == 0 )
788 : {
789 0 : *rc0 = 0;
790 0 : move16();
791 0 : return;
792 : }
793 :
794 1072064 : IF( LT_16( acf0, abs_s( acf1 ) ) )
795 : {
796 0 : *rc0 = 0;
797 0 : move16();
798 0 : return;
799 : }
800 1072064 : *rc0 = div_s( abs_s( acf1 ), acf0 );
801 1072064 : move16();
802 1072064 : IF( acf1 > 0 )
803 : {
804 337311 : *rc0 = negate( *rc0 );
805 337311 : move16();
806 : }
807 : }
808 :
809 0 : void Calc_rc0_h_ivas_enc_fx(
810 : Word16 *h, /* i : impulse response of composed filter */
811 : Word16 *rc0 /* o : 1st parcor */
812 : )
813 : {
814 : Word32 L_acc;
815 : Word16 *ptrs;
816 : Word16 acf0, acf1;
817 : Word16 temp, sh_acf, tmp2;
818 : Word16 i;
819 :
820 : /* computation of the autocorrelation function acf */
821 0 : L_acc = L_mult( h[0], h[0] );
822 0 : FOR( i = 1; i < LONG_H_ST; i++ )
823 : {
824 0 : tmp2 = shr( h[i], 2 );
825 0 : L_acc = L_mac( L_acc, tmp2, tmp2 );
826 : }
827 0 : sh_acf = norm_l( L_acc );
828 0 : L_acc = L_shl( L_acc, sh_acf );
829 0 : acf0 = extract_h( L_acc );
830 :
831 0 : ptrs = h;
832 :
833 0 : temp = *ptrs++;
834 0 : move16();
835 0 : L_acc = L_mult( temp, *ptrs );
836 0 : FOR( i = 1; i < LONG_H_ST - 1; i++ )
837 : {
838 0 : temp = shr( *ptrs++, 2 );
839 0 : move16();
840 0 : L_acc = L_mac( L_acc, temp, shr( *ptrs, 2 ) );
841 : }
842 0 : L_acc = L_shl( L_acc, sh_acf );
843 0 : acf1 = extract_h( L_acc );
844 :
845 : /* Compute 1st parcor */
846 0 : IF( acf0 == 0 )
847 : {
848 0 : *rc0 = 0;
849 0 : move16();
850 0 : return;
851 : }
852 :
853 0 : IF( LT_16( acf0, abs_s( acf1 ) ) )
854 : {
855 0 : *rc0 = 0;
856 0 : move16();
857 0 : return;
858 : }
859 0 : *rc0 = div_s( abs_s( acf1 ), acf0 );
860 0 : move16();
861 0 : IF( acf1 > 0 )
862 : {
863 0 : *rc0 = negate( *rc0 );
864 0 : move16();
865 : }
866 : }
867 :
868 5432 : 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 5432 : temp = sub( 2, norm_s( apond2[0] ) );
883 : /* compute i.r. of composed filter apond2 / apond1 */
884 5432 : Syn_filt_s( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 );
885 : /* compute 1st parcor */
886 5432 : Calc_rc0_h( h, parcor0 );
887 :
888 : /* compute g0 */
889 5432 : L_g0 = L_mult0( 1, abs_s( h[0] ) );
890 108640 : FOR( i = 1; i < LONG_H_ST; i++ )
891 : {
892 103208 : L_g0 = L_mac0( L_g0, 1, abs_s( h[i] ) );
893 : }
894 5432 : g0 = extract_h( L_shl( L_g0, 14 ) );
895 :
896 : /* Scale signal i of 1/A(gamma1) */
897 5432 : IF( GT_16( g0, 1024 ) )
898 : {
899 5432 : temp = div_s( 1024, g0 ); /* temp = 2**15 / gain0 */
900 439992 : FOR( i = 0; i < L_SUBFR16k; i++ )
901 : {
902 434560 : sig_ltp_ptr[i] = mult_r( sig_ltp_ptr[i], temp );
903 434560 : move16();
904 : }
905 : }
906 5432 : }
907 :
908 0 : static void Calc_st_filt_tbe_ivas_enc_fx(
909 : Word16 *apond2, /* i : coefficients of numerator */
910 : Word16 *apond1, /* i : coefficients of denominator */
911 : Word16 *parcor0, /* o : 1st parcor calcul. on composed filter */
912 : Word16 *sig_ltp_ptr, /* i/o: i of 1/A(gamma1) : scaled by 1/g0 */
913 : Word16 *mem_zero /* i : All zero memory */
914 : )
915 : {
916 : Word32 L_g0;
917 :
918 : Word16 h[LONG_H_ST];
919 :
920 : Word16 g0, temp;
921 : Word16 i;
922 0 : temp = sub( 2, norm_s( apond2[0] ) );
923 : /* compute i.r. of composed filter apond2 / apond1 */
924 0 : syn_filt_fx( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 );
925 : /* compute 1st parcor */
926 0 : Calc_rc0_h_ivas_enc_fx( h, parcor0 );
927 :
928 : /* compute g0 */
929 0 : L_g0 = L_mult0( 1, abs_s( h[0] ) );
930 0 : FOR( i = 1; i < LONG_H_ST; i++ )
931 : {
932 0 : L_g0 = L_mac0( L_g0, 1, abs_s( h[i] ) );
933 : }
934 0 : g0 = extract_h( L_shl( L_g0, 14 ) );
935 :
936 : /* Scale signal i of 1/A(gamma1) */
937 0 : IF( GT_16( g0, 1024 ) )
938 : {
939 0 : temp = div_s( 1024, g0 ); /* temp = 2**15 / gain0 */
940 0 : FOR( i = 0; i < L_SUBFR16k; i++ )
941 : {
942 0 : sig_ltp_ptr[i] = mult_r( sig_ltp_ptr[i], temp );
943 0 : move16();
944 : }
945 : }
946 0 : }
947 :
948 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 399224 : 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 399224 : Flag Overflow = 0;
1000 399224 : move32();
1001 :
1002 :
1003 399224 : 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 399224 : IF( parcor0 > 0 )
1017 : {
1018 335560 : mu = mult_r( parcor0, GAMMA3_PLUS_WB_FX );
1019 : }
1020 : ELSE
1021 : {
1022 63664 : mu = mult_r( parcor0, GAMMA3_MINUS_WB_FX );
1023 : }
1024 : }
1025 :
1026 399224 : tmp = abs_s( mu );
1027 399224 : tmp = sub( 32767, tmp );
1028 399224 : exp = norm_s( tmp );
1029 399224 : tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /*(14 - exp) */
1030 399224 : ga = shl_sat( tmp, exp ); /*Q14 */
1031 :
1032 :
1033 : /* ga = (float) 1. / ((float) 1. - (float) fabs (mu)); */
1034 :
1035 399224 : ptrs = sig_in; /* points on sig_in(-1) */
1036 :
1037 32337144 : FOR( n = 0; n < SubFrameLength; n++ )
1038 : {
1039 31937920 : temp = mult_r( mu, ( *ptrs++ ) );
1040 31937920 : temp = add_sat( temp, *ptrs ); /*Q12 */
1041 31937920 : sig_out[n] = shl_o( mult_r( ga, temp ), 1, &Overflow );
1042 31937920 : move16(); /*Q12 */
1043 : }
1044 :
1045 399224 : return;
1046 : }
1047 :
1048 399224 : 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 399224 : 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 399224 : agc_fac1_para_fx = AGC_FAC1_WB_FX;
1073 399224 : move16();
1074 399224 : agc_fac_para_fx = AGC_FAC_WB_FX;
1075 399224 : move16();
1076 : }
1077 :
1078 : /* compute input gain */
1079 399224 : L_acc = L_mult0( 1, abs_s( sig_in_fx[0] ) ); /*0 +Q_bwe_exc-1 */
1080 31937920 : FOR( i = 1; i < SubFrameLength; i++ )
1081 : {
1082 31538696 : L_acc = L_mac0( L_acc, 1, abs_s( sig_in_fx[i] ) ); /*Q_bwe_exc-1 */
1083 : }
1084 :
1085 399224 : g0_fx = 0;
1086 399224 : move16();
1087 399224 : IF( L_acc != 0L )
1088 : {
1089 398725 : scal_in = norm_l( L_acc );
1090 398725 : L_acc = L_shl( L_acc, scal_in );
1091 398725 : s_g_in = extract_h( L_acc ); /* normalized */
1092 :
1093 : /* Compute o gain */
1094 398725 : L_acc = L_mult0( 1, abs_s( sig_out_fx[0] ) );
1095 31898000 : FOR( i = 1; i < SubFrameLength; i++ )
1096 : {
1097 31499275 : L_acc = L_mac0( L_acc, 1, abs_s( sig_out_fx[i] ) );
1098 : }
1099 398725 : IF( L_acc == 0L )
1100 : {
1101 0 : *gain_prec_fx = 0;
1102 0 : move16();
1103 :
1104 0 : return;
1105 : }
1106 :
1107 398725 : scal_out = norm_l( L_acc );
1108 398725 : L_acc = L_shl( L_acc, scal_out );
1109 398725 : s_g_out = extract_h( L_acc ); /* normalized */
1110 :
1111 :
1112 398725 : sh_g0 = add( scal_in, 1 );
1113 398725 : sh_g0 = sub( sh_g0, scal_out ); /* scal_in - scal_out + 1 */
1114 398725 : IF( LT_16( s_g_in, s_g_out ) )
1115 : {
1116 75272 : g0_fx = div_s( s_g_in, s_g_out ); /* s_g_in/s_g_out in Q15 */
1117 : }
1118 : ELSE
1119 : {
1120 323453 : temp = sub( s_g_in, s_g_out ); /* sufficient since normalized */
1121 323453 : g0_fx = shr( div_s( temp, s_g_out ), 1 );
1122 323453 : g0_fx = add( g0_fx, (Word16) 0x4000 ); /* s_g_in/s_g_out in Q14 */
1123 323453 : 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 398725 : g0_fx = shr_sat( g0_fx, sh_g0 ); /* sh_g0 may be >0, <0, or =0 */ // Need to verify?
1128 :
1129 398725 : 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 399224 : gain_fx = *gain_prec_fx;
1134 399224 : move16(); /*14 */
1135 32337144 : FOR( i = 0; i < SubFrameLength; i++ )
1136 : {
1137 31937920 : temp = mult_r( agc_fac_para_fx, gain_fx ); /*15 +14 -15 =14 */
1138 31937920 : gain_fx = add( temp, g0_fx ); /* in Q14 */
1139 31937920 : L_temp = L_mult( gain_fx, sig_out_fx[i] ); /*14 + Q_bwe_exc-1 +1 = 14 + Q_bwe_exc */
1140 31937920 : L_temp = L_shl_sat( L_temp, 1 ); /*14 + Q_bwe_exc +1 */
1141 31937920 : sig_out_fx[i] = round_fx_sat( L_temp ); /*Q_bwe_exc +15 -16 = Q_bwe_exc-1 */
1142 31937920 : move16();
1143 : }
1144 399224 : *gain_prec_fx = gain_fx;
1145 399224 : move16();
1146 :
1147 399224 : return;
1148 : }
1149 :
1150 5432 : 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 5432 : parcor0_fx = 0;
1169 5432 : move16();
1170 5432 : set16_fx( apond1_fx, 0, LPC_SHB_ORDER + 1 );
1171 5432 : set16_fx( apond2_fx, 0, LONG_H_ST );
1172 5432 : set16_fx( sig_ltp_fx, 0, L_SUBFR16k + 1 );
1173 :
1174 : /* Obtain post-filter weights */
1175 5432 : tmp = extract_h( L_mult( GAMMA_SHARP_FX, formant_fac_fx ) ); /*Q15 */
1176 5432 : g1_fx = add( GAMMA0_FX, tmp ); /*Q15 */
1177 5432 : g2_fx = sub( GAMMA0_FX, tmp ); /*Q15 */
1178 :
1179 : /* Compute weighted LPC coefficients */
1180 5432 : weight_a_fx( lpccoeff, apond1_fx, g1_fx, LPC_SHB_ORDER );
1181 5432 : 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 5432 : 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 5432 : sig_ltp_fx[0] = *ptr_mem_stp;
1190 5432 : move16();
1191 :
1192 : /* Control short term pst filter gain and compute parcor0 */
1193 5432 : 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 5432 : 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 5432 : 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 5432 : scale_st_swb( sig_in, sig_out, ptr_gain_prec, L_SUBFR16k );
1206 :
1207 5432 : return;
1208 : }
1209 :
1210 0 : 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 0 : parcor0_fx = 0;
1229 0 : move16();
1230 0 : set16_fx( apond1_fx, 0, LPC_SHB_ORDER + 1 );
1231 0 : set16_fx( apond2_fx, 0, LONG_H_ST );
1232 0 : set16_fx( sig_ltp_fx, 0, L_SUBFR16k + 1 );
1233 :
1234 : /* Obtain post-filter weights */
1235 0 : tmp = extract_h( L_mult( GAMMA_SHARP_FX, formant_fac_fx ) ); /*Q15 */
1236 0 : g1_fx = add( GAMMA0_FX, tmp ); /*Q15 */
1237 0 : g2_fx = sub( GAMMA0_FX, tmp ); /*Q15 */
1238 :
1239 : /* Compute weighted LPC coefficients */
1240 0 : weight_a_fx( lpccoeff, apond1_fx, g1_fx, LPC_SHB_ORDER );
1241 0 : 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 0 : 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 0 : sig_ltp_fx[0] = *ptr_mem_stp;
1250 0 : move16();
1251 :
1252 : /* Control short term pst filter gain and compute parcor0 */
1253 0 : 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 0 : 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 0 : 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 0 : scale_st_swb( sig_in, sig_out, ptr_gain_prec, L_SUBFR16k );
1266 :
1267 0 : 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 6870 : 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 6870 : IF( ramp_flag )
1345 : {
1346 0 : factor = div_s( 4, length ); /* Q15 */
1347 0 : FOR( i = 0; i < length / 4; i += 2 )
1348 : {
1349 0 : tmp1 = extract_l( L_mult0( i, factor ) ); /* Q15 */
1350 0 : tmp2 = extract_l( L_mult0( add( i, 1 ), factor ) ); /*Q15 */
1351 0 : input_change[i] = negate( mult_r( input[i], tmp1 ) );
1352 0 : move16();
1353 0 : input_change[i + 1] = mult_r( input[i + 1], tmp2 );
1354 0 : move16();
1355 : }
1356 : }
1357 : ELSE
1358 : {
1359 6870 : i = 0;
1360 6870 : move16();
1361 : }
1362 :
1363 1106070 : FOR( ; i < length; i = i + 2 )
1364 : {
1365 1099200 : input_change[i] = negate( input[i] );
1366 1099200 : move16();
1367 1099200 : input_change[i + 1] = input[i + 1];
1368 1099200 : move16();
1369 : }
1370 :
1371 6870 : Decimate_allpass_steep_fx( input_change, mem1, length, tmp );
1372 6870 : Decimate_allpass_steep_fx( tmp, mem2, shr( length, 1 ), output );
1373 :
1374 6870 : 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 6870 : 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 6870 : Word16 csfilt_num2[1] = { 1638 }; /* Q15*/
1440 6870 : 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 6870 : Flag Overflow = 0;
1450 6870 : move16();
1451 : #endif
1452 :
1453 : /*0.25f*sum_f(voice_factors, NB_SUBFR)*/
1454 6870 : L_tmp = L_mult( voice_factors[0], 8192 /* 0.25 in Q15 */ );
1455 27480 : FOR( i = 1; i < NB_SUBFR; i++ )
1456 : {
1457 20610 : L_tmp = L_mac( L_tmp, voice_factors[i], 8192 /* 0.25 in Q15 */ );
1458 : }
1459 6870 : avg_voice_fac = round_fx( L_tmp );
1460 :
1461 6870 : test();
1462 6870 : test();
1463 6870 : test();
1464 6870 : test();
1465 6870 : 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 6870 : 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 6870 : set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER_WB );
1480 6870 : Decimate_allpass_steep_fx( bwe_exc_extended, mem_genSHBexc_filt_down1, L_FRAME32k, excTmp );
1481 6870 : flip_spectrum_and_decimby4_fx( excTmp, exc4k, L_FRAME16k, mem_genSHBexc_filt_down2, mem_genSHBexc_filt_down3, 0 );
1482 :
1483 6870 : IF( uv_flag )
1484 : {
1485 419 : create_random_vector_fx( exc4kWhtnd, L_FRAME16k / 4, bwe_seed );
1486 419 : IF( LT_16( Q_bwe_exc, 5 ) )
1487 : {
1488 :
1489 33939 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1490 : {
1491 33520 : exc4kWhtnd[i] = shl_r( exc4kWhtnd[i], sub( Q_bwe_exc, 5 ) ); /*Q(Q_bwe_exc)/Q5(if Q_bwe_exc > 5) */
1492 33520 : move16();
1493 : }
1494 : }
1495 : }
1496 : ELSE
1497 : {
1498 6451 : 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 6451 : R_l[0] = s_max( R_l[0], 1 );
1503 6451 : move16();
1504 19353 : FOR( i = 1; i <= LPC_WHTN_ORDER_WB; i++ )
1505 : {
1506 12902 : L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
1507 12902 : L_Extract( L_tmp, &R_h[i], &R_l[i] );
1508 : }
1509 :
1510 6451 : E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER_WB, NULL );
1511 :
1512 6451 : Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER_WB + 1, sub( norm_s( lpc_whtn[0] ), 2 ) );
1513 :
1514 6451 : 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 6451 : max_val = 0;
1519 6451 : move16();
1520 522531 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1521 : {
1522 516080 : excTmp2[i] = abs_s( exc4kWhtnd[i] );
1523 516080 : move16(); /* Q_bwe_exc */
1524 516080 : max_val = s_max( max_val, excTmp2[i] );
1525 516080 : move16();
1526 : }
1527 :
1528 6451 : IF( max_val == 0 )
1529 : {
1530 0 : pow1 = 1;
1531 0 : move16();
1532 0 : n1 = 0;
1533 0 : move16();
1534 : }
1535 : ELSE
1536 : {
1537 6451 : n1 = norm_s( max_val );
1538 522531 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1539 : {
1540 516080 : excTmp2_frac[i] = shl_o( excTmp2[i], n1, &Overflow ); // Q_bwe_exc + n1
1541 516080 : move16(); /* Q14 */
1542 : }
1543 6451 : n1 = sub( sub( 14, n1 ), Q_bwe_exc );
1544 6451 : pow1 = 1;
1545 6451 : move32();
1546 522531 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1547 : {
1548 516080 : L_tmp = L_mult_o( excTmp2_frac[i], excTmp2_frac[i], &Overflow ); /* Q29 */
1549 516080 : pow1 = L_add_o( pow1, L_shr( L_tmp, 10 ), &Overflow ); /* Q22 */
1550 : }
1551 : }
1552 :
1553 522531 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1554 : {
1555 516080 : excNoisyEnv[i] = L_add_o( *mem_csfilt, L_mult_o( csfilt_num2[0], excTmp2[i], &Overflow ), &Overflow );
1556 516080 : move32(); /* Q_bwe_exc+16 */
1557 516080 : *mem_csfilt = Mult_32_16( excNoisyEnv[i], neg_csfilt_den2[1] );
1558 516080 : move32(); /* Q_bwe_exc+16 */
1559 : }
1560 :
1561 6451 : create_random_vector_fx( exc4k, L_FRAME16k / 4, bwe_seed );
1562 :
1563 : /* Ensure pow22 is greater than zero when computing normalization */
1564 6451 : Lmax = 0;
1565 522531 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1566 : {
1567 516080 : exc4k_32[i] = Mult_32_16( excNoisyEnv[i], exc4k[i] );
1568 516080 : move32(); /* Q_bwe_exc+6 */
1569 516080 : Lmax = L_max( Lmax, L_abs( exc4k_32[i] ) );
1570 : }
1571 :
1572 6451 : 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 6451 : n2 = norm_l( Lmax );
1583 522531 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1584 : {
1585 516080 : exc4k_frac[i] = extract_h( L_shl_o( exc4k_32[i], n2, &Overflow ) ); /* Q(14-n2) */
1586 516080 : move16();
1587 : }
1588 6451 : n2 = 30 - n2 - ( Q_bwe_exc + 6 );
1589 6451 : pow22 = 1;
1590 6451 : move32();
1591 522531 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1592 : {
1593 516080 : L_tmp = L_mult_o( exc4k_frac[i], exc4k_frac[i], &Overflow ); /* Q29 */
1594 516080 : pow22 = L_add_o( pow22, L_shr( L_tmp, 10 ), &Overflow ); /* Q22 */
1595 : }
1596 : }
1597 :
1598 6451 : test();
1599 6451 : test();
1600 6451 : IF( EQ_16( coder_type, UNVOICED ) || ( igf_flag != 0 && LT_16( avg_voice_fac, 6654 /* 0.2 in Q15 */ ) ) )
1601 : {
1602 197 : L_tmp = root_a_over_b_fx( pow1, sub( 19, shl( n1, 1 ) ), pow22, sub( 19, shl( n2, 1 ) ), &exp );
1603 197 : scale = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /*Q15 */
1604 197 : sc = sub( add( n2, Q_bwe_exc ), 14 );
1605 15957 : FOR( i = 0; i < L_FRAME16k / 4; i++ )
1606 : {
1607 15760 : 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 15760 : move16();
1609 : }
1610 : }
1611 : ELSE
1612 : {
1613 6254 : sc = sub( add( n2, Q_bwe_exc ), 14 ); /* Q_bwe_exc+n2-14*/
1614 :
1615 6254 : k = 0;
1616 31270 : FOR( i = 0; i < 4; i++ )
1617 : {
1618 25016 : test();
1619 25016 : 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 25016 : tmp_vfac = voice_factors[i];
1628 25016 : move16();
1629 : }
1630 :
1631 25016 : Ltemp1 = root_a_fx( L_deposit_h( tmp_vfac ), 31, &exp );
1632 25016 : temp1 = round_fx_o( L_shl_o( Ltemp1, exp, &Overflow ), &Overflow ); /* Q15 */
1633 25016 : L_tmp = Mult_32_16( pow1, sub( 32767, tmp_vfac ) ); /* Q22*/
1634 25016 : Ltemp2 = root_a_over_b_fx( L_tmp, sub( 19, shl( n1, 1 ) ), pow22, sub( 19, shl( n2, 1 ) ), &exp );
1635 25016 : temp2 = round_fx_o( L_shl_o( Ltemp2, exp, &Overflow ), &Overflow ); /* Q15 */
1636 525336 : FOR( j = 0; j < L_FRAME16k / 16; j++ )
1637 : {
1638 500320 : L_tmp = L_mult_o( temp1, exc4kWhtnd[k], &Overflow ); /* Q(16+Q_bwe_exc) */
1639 500320 : 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 500320 : exc4kWhtnd[k] = round_fx_o( L_tmp, &Overflow ); /* Q_bwe_exc */
1641 500320 : move16();
1642 500320 : k++;
1643 : }
1644 : }
1645 : }
1646 : }
1647 :
1648 6870 : Scale_sig( state_lpc_syn, LPC_SHB_ORDER, -Q2 ); /* Q(Q_bwe_exc) -> Q(Q_bwe_exc - 2) */
1649 :
1650 6870 : Syn_filt_s( Q2, lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 );
1651 :
1652 6870 : Scale_sig( state_lpc_syn, LPC_SHB_ORDER, Q2 ); /* Q(Q_bwe_exc - 2) -> Q(Q_bwe_exc) */
1653 6870 : Scale_sig( excSHB, L_FRAME16k / 4, Q2 ); /* Q(Q_bwe_exc - 2) -> Q(Q_bwe_exc) */
1654 :
1655 6870 : 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 0 : 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 0 : assert( len > 0 && len <= L_FRAME16k );
1973 :
1974 : // len_h is 20 at all calling locations
1975 0 : K = 10; /* length of FIR filter memory = half of the total filter length */
1976 0 : move16();
1977 0 : w = 1639; /* 1 / 20 in Q15 */ /* MA filtering coefficient */
1978 0 : move16();
1979 :
1980 : /* copy filter memory to the input buffer */
1981 0 : IF( mem_h != NULL )
1982 : {
1983 0 : Copy( mem_h, buf_in, K );
1984 : }
1985 : ELSE
1986 : {
1987 : /* no memory available, use the first len_h/2 samples as memory */
1988 0 : p_in = buf_in;
1989 0 : FOR( k = 0; k < K; k++ )
1990 : {
1991 0 : *p_in++ = mult_r( abs_s( inp[k] ), w ); /* Qx */
1992 0 : 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 0 : p_in = &buf_in[K];
1999 0 : FOR( k = 0; k < len; k++ )
2000 : {
2001 0 : *p_in++ = mult_r( abs_s( inp[k] ), w ); /* Qx */
2002 0 : move16();
2003 : }
2004 :
2005 : /* update filter memory from the end of the input buffer */
2006 0 : IF( mem_h != NULL )
2007 : {
2008 0 : Copy( &buf_in[len], mem_h, K );
2009 : }
2010 :
2011 : /* do MA filtering */
2012 0 : out[0] = sum16_fx( buf_in, len_h );
2013 0 : move16();
2014 0 : p_out = &buf_in[0]; /* pointer to leaving sample */
2015 0 : p_in = &buf_in[len_h]; /* pointer to entering sample*/
2016 0 : FOR( k = 1; k < len - K; k++ )
2017 : {
2018 0 : tmp1 = *p_out++;
2019 0 : move16();
2020 0 : tmp2 = *p_in++;
2021 0 : move16();
2022 0 : out[k] = add( sub( out[k - 1], tmp1 ), tmp2 ); /* Qx */
2023 0 : move16();
2024 : }
2025 :
2026 : /* use IIR filtering to extrapolate the last K samples */
2027 0 : p_in = &buf_in[len - K];
2028 0 : p_out = &out[len - K];
2029 0 : p_prev = p_out - 1;
2030 0 : FOR( k = 0; k < K; k++ )
2031 : {
2032 0 : tmp1 = *p_in++;
2033 0 : move16();
2034 0 : tmp2 = *p_prev++;
2035 0 : move16();
2036 0 : *p_out++ = add( mult_r( 1638 /* 0.05f in Q15 */, ( tmp1 ) ), mult_r( 31130 /* 0.95f in Q15 */, ( tmp2 ) ) );
2037 0 : move16();
2038 : }
2039 :
2040 0 : 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 1358 : 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 1358 : Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */
2122 1358 : move16();
2123 1358 : Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */
2124 1358 : move16();
2125 1358 : move16();
2126 : Word16 varEnvShape;
2127 1358 : Word16 fb_deemph_fac = 15729; /*0.48f in Q15 */
2128 1358 : 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 1358 : set16_fx( zero_mem, 0, LPC_SHB_ORDER );
2149 1358 : set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER );
2150 :
2151 435918 : FOR( i = 0; i < L_FRAME32k; i = i + 2 )
2152 : {
2153 434560 : exc32k[i] = negate( bwe_exc_extended[i] );
2154 434560 : move16();
2155 434560 : exc32k[i + 1] = bwe_exc_extended[i + 1];
2156 434560 : move16();
2157 : }
2158 :
2159 : /* Decimate by 2 */
2160 1358 : 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 1358 : 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 1358 : R_l[0] = s_max( R_l[0], 1 );
2167 1358 : move16();
2168 6790 : FOR( i = 1; i <= LPC_WHTN_ORDER; i++ )
2169 : {
2170 5432 : L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
2171 5432 : L_Extract( L_tmp, &R_h[i], &R_l[i] );
2172 : }
2173 1358 : E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL );
2174 1358 : Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) );
2175 1358 : 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 1358 : IF( GE_32( bitrate, ACELP_24k40 ) )
2180 : {
2181 610 : temp2 = 0;
2182 610 : move16();
2183 3050 : FOR( j = 0; j < 4; j++ )
2184 : {
2185 2440 : temp1 = shb_res_gshape[j];
2186 2440 : move16();
2187 197640 : FOR( i = 0; i < 80; i++ )
2188 : {
2189 195200 : exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) );
2190 195200 : move16();
2191 : /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */
2192 : }
2193 2440 : temp2 = add( temp2, 80 );
2194 : }
2195 : }
2196 :
2197 : /* Estimate pow1 associated with Low band nonlinear extended excitation */
2198 : /* pow1=0.00001f */
2199 1358 : tmp = sub( shl( *Q_bwe_exc, 1 ), 31 );
2200 1358 : pow1 = L_shl_sat( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */
2201 435918 : FOR( k = 0; k < L_FRAME16k; k++ )
2202 : {
2203 : /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/
2204 434560 : excTmp2[k] = abs_s( exc16kWhtnd[k] );
2205 434560 : move16();
2206 :
2207 : /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */
2208 434560 : pow1 = L_mac0_sat( pow1, exc16kWhtnd[k], exc16kWhtnd[k] ); /* 2*Q_bwe_exc */
2209 : }
2210 1358 : Q_pow1 = shl( *Q_bwe_exc, 1 );
2211 :
2212 1358 : test();
2213 1358 : IF( ( LE_32( bitrate, ACELP_13k20 ) ) && ( GE_32( bitrate, ACELP_7k20 ) ) )
2214 : {
2215 : /* varEnvShape = mean_fx(voice_factors, 4); */
2216 : /* unroll the loop */
2217 748 : L_tmp = L_mult( voice_factors[0], 8192 );
2218 748 : L_tmp = L_mac( L_tmp, voice_factors[1], 8192 );
2219 748 : L_tmp = L_mac( L_tmp, voice_factors[2], 8192 );
2220 748 : 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 610 : L_tmp = L_mult( voice_factors[0], 6554 );
2227 610 : L_tmp = L_mac( L_tmp, voice_factors[1], 6554 );
2228 610 : L_tmp = L_mac( L_tmp, voice_factors[2], 6554 );
2229 610 : L_tmp = L_mac( L_tmp, voice_factors[3], 6554 );
2230 610 : varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 ); /* varEnvShape in Q15 */
2231 : }
2232 :
2233 1358 : 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 1358 : varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape );
2246 :
2247 : /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */
2248 1358 : varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ );
2249 1358 : varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ );
2250 1358 : varEnvShape = shl( varEnvShape, 1 );
2251 1358 : csfilt_num2[0] = sub( MAX_16, varEnvShape );
2252 1358 : move16();
2253 1358 : neg_csfilt_den2[1] = varEnvShape;
2254 1358 : move16();
2255 :
2256 1358 : test();
2257 1358 : test();
2258 1358 : test();
2259 1358 : 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 30 : L_tmp = L_mult( excTmp2[0], 1638 );
2263 600 : FOR( i = 1; i < L_SUBFR16k / 4; i++ )
2264 : {
2265 570 : 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 30 : test();
2272 30 : 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 30 : varEnvShape = 26214 /*0.8f Q15*/;
2276 30 : move16();
2277 30 : csfilt_num2[0] = sub( MAX_16, varEnvShape );
2278 30 : move16();
2279 30 : neg_csfilt_den2[1] = varEnvShape;
2280 30 : move16();
2281 : }
2282 :
2283 30 : *mem_csfilt = Mult_32_16( L_tmp, varEnvShape );
2284 30 : move32();
2285 : }
2286 : {
2287 : /* Track the low band envelope */
2288 1358 : L_tmp = *mem_csfilt;
2289 1358 : move32();
2290 435918 : FOR( i = 0; i < L_FRAME16k; i++ )
2291 : {
2292 434560 : excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], excTmp2[i] );
2293 434560 : move16();
2294 : /* excNoisyEnv : Q_bwe_exc,
2295 : *mem_csfilt: Q_bwe_exc+16, excTmp2: Q_bwe_exc, csfilt_num2[0] Q15 */
2296 434560 : L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_bwe_exc+16 */
2297 : }
2298 1358 : *mem_csfilt = L_tmp;
2299 1358 : move32();
2300 : }
2301 : {
2302 : /* create a random excitation - Reuse exc16k memory */
2303 1358 : White_exc16k = exc16k;
2304 1358 : create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed );
2305 1358 : create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed );
2306 :
2307 1358 : L_tmp = L_deposit_l( 0 );
2308 1358 : tmp = add( *Q_bwe_exc, 1 );
2309 435918 : FOR( k = 0; k < L_FRAME16k; k++ )
2310 : {
2311 434560 : L_tmp4 = L_shl_sat( L_deposit_l( White_exc16k[k] ), tmp );
2312 434560 : if ( excNoisyEnv[k] != 0 )
2313 : {
2314 433545 : L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_bwe_exc) +5 +1*/
2315 : }
2316 434560 : White_exc16k_32[k] = L_tmp4;
2317 434560 : move32();
2318 434560 : L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
2319 : }
2320 1358 : Q_temp = norm_l( L_tmp );
2321 1358 : 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 1358 : tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 );
2332 1358 : pow22 = L_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc-NOISE_QADJ) */
2333 1358 : tmp = sub( NOISE_QFAC, 5 );
2334 435918 : FOR( k = 0; k < L_FRAME16k; k++ )
2335 : {
2336 : /* White_exc16k[k] *= excNoisyEnv[k]; */
2337 434560 : White_exc16k[k] = mult_r( excNoisyEnv[k], shl( White_exc16k[k], tmp ) );
2338 434560 : 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 434560 : 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 1358 : Q_pow22 = shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 );
2347 : }
2348 :
2349 1358 : IF( GE_32( bitrate, ACELP_24k40 ) )
2350 : {
2351 610 : IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */
2352 : {
2353 : {
2354 0 : Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k,
2355 0 : ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind );
2356 0 : tmp = voiceFacEst[0];
2357 0 : move16();
2358 0 : tmp2 = MAX_16;
2359 0 : move16();
2360 0 : if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
2361 : {
2362 0 : tmp2 = 26214 /*0.8f Q15*/;
2363 0 : 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 610 : voice_factors[0] = mult_r( voice_factors[0], tmp2 );
2382 610 : move16();
2383 610 : voice_factors[1] = mult_r( voice_factors[1], tmp2 );
2384 610 : move16();
2385 610 : voice_factors[2] = mult_r( voice_factors[2], tmp2 );
2386 610 : move16();
2387 610 : voice_factors[3] = mult_r( voice_factors[3], tmp2 );
2388 610 : move16();
2389 610 : voice_factors[4] = mult_r( voice_factors[4], tmp2 );
2390 610 : move16();
2391 : }
2392 : }
2393 :
2394 1358 : tmp = sub( Q_temp, 3 );
2395 435918 : FOR( k = 0; k < L_FRAME16k; k++ )
2396 : {
2397 434560 : White_exc16k_FB[k] = round_fx( L_shl( White_exc16k_32[k], tmp ) ); /* Q_bwe_exc +5 +1 +Q_temp -16 -3 */
2398 : }
2399 1358 : prev_Q_bwe_exc_fb = *Q_bwe_exc_fb;
2400 1358 : move16();
2401 1358 : *Q_bwe_exc_fb = sub( add( *Q_bwe_exc, Q_temp ), 13 );
2402 1358 : move16();
2403 1358 : 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 1358 : IF( EQ_16( coder_type, UNVOICED ) )
2408 : {
2409 26 : L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
2410 26 : scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */
2411 8346 : FOR( k = 0; k < L_FRAME16k; k++ )
2412 : {
2413 : /* White_exc16k: (Q_bwe_exc-NOISE_QADJ), scale: Q15 */
2414 8320 : L_tmp = L_mult( White_exc16k[k], scale );
2415 : /* L_tmp: (Q_bwe_exc-NOISE_QADJ) + 15 + 1 */
2416 8320 : exc16kWhtnd[k] = round_fx( L_shl( L_tmp, NOISE_QADJ ) );
2417 8320 : move16();
2418 : /* exc16kWhtnd: Q_bwe_exc */
2419 : }
2420 26 : 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 1332 : nbSubFr = NB_SUBFR16k;
2431 1332 : lSubFr = ( L_FRAME16k / NB_SUBFR16k );
2432 1332 : IF( LT_32( bitrate, ACELP_24k40 ) )
2433 : {
2434 748 : nbSubFr = NB_SUBFR;
2435 748 : move16();
2436 748 : lSubFr = ( L_FRAME16k / NB_SUBFR );
2437 748 : move16();
2438 : }
2439 1332 : k = 0;
2440 7244 : FOR( i = 0; i < nbSubFr; i++ )
2441 : {
2442 5912 : test();
2443 5912 : IF( EQ_16( coder_type, VOICED ) && ( LT_32( bitrate, ACELP_24k40 ) ) )
2444 : {
2445 868 : exp = 0;
2446 868 : move16();
2447 868 : tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */
2448 868 : temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
2449 868 : exp = 0;
2450 868 : move16();
2451 868 : tempQ15 = Sqrt16( temp, &exp ); /* Q15 */
2452 868 : temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
2453 :
2454 : /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */
2455 868 : temp = sub( MAX_16, temp );
2456 868 : tempQ31 = Mult_32_16( pow1, temp );
2457 868 : L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
2458 868 : 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 5044 : tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac );
2464 : /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */
2465 5044 : vf_tmp = sub( MAX_16, tempQ15 );
2466 5044 : vf_tmp = mult_r( voice_factors[i], vf_tmp );
2467 :
2468 5044 : exp = 0;
2469 5044 : move16();
2470 5044 : tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */
2471 5044 : temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
2472 :
2473 : /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */
2474 5044 : temp = sub( MAX_16, vf_tmp );
2475 5044 : tempQ31 = Mult_32_16( pow1, temp );
2476 5044 : L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
2477 5044 : temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
2478 : }
2479 :
2480 432152 : FOR( j = 0; j < lSubFr; j++ )
2481 : {
2482 : /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */
2483 426240 : L_tmp = L_mult( temp2, White_exc16k[k + j] ); /* 16+(Q_bwe_exc-NOISE_QADJ)*/
2484 426240 : L_tmp = L_shl_sat( L_tmp, NOISE_QADJ ); /* 16+(Q_bwe_exc) */
2485 426240 : exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] );
2486 426240 : move16();
2487 : /* Q_bwe_exc */
2488 : }
2489 5912 : k = add( k, lSubFr );
2490 :
2491 : /* estimate the pre-emph factor */
2492 5912 : tempQ15 = sub( MAX_16, voice_factors[i] );
2493 5912 : exp = 0;
2494 5912 : move16();
2495 5912 : temp = Sqrt16( tempQ15, &exp );
2496 5912 : temp = shl( temp, exp - 1 );
2497 :
2498 5912 : temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */
2499 5912 : temp = div_s( temp, temp2 ); /* Q15 */
2500 5912 : temp = mult_r( PREEMPH_FAC, temp );
2501 :
2502 5912 : 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 1358 : IF( LT_32( bitrate, ACELP_24k40 ) )
2510 : {
2511 748 : 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 610 : set16_fx( zero_mem, 0, LPC_SHB_ORDER );
2518 :
2519 610 : Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 );
2520 610 : syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
2521 610 : move32();
2522 :
2523 610 : Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 );
2524 610 : syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
2525 610 : move32();
2526 :
2527 610 : Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 );
2528 610 : syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
2529 610 : move32();
2530 :
2531 610 : Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 );
2532 610 : syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
2533 610 : 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 610 : IF( LE_32( bitrate, ACELP_32k ) )
2539 : {
2540 610 : 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 610 : tmp = shl( Q_shb, 1 );
2544 610 : tmp2 = add( shl( *Q_bwe_exc, 1 ), 1 );
2545 610 : L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */
2546 :
2547 610 : *Q_bwe_exc = sub( *Q_bwe_exc, exp );
2548 610 : move16(); /* compensate for the exp shift */
2549 610 : tmp2 = add( prev_Q_bwe_syn, n_mem2 );
2550 610 : 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 195810 : FOR( i = 0; i < L_FRAME16k; i++ )
2557 : {
2558 195200 : L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */
2559 195200 : exc16kWhtnd[i] = round_fx( L_tmp3 ); /* *Q_bwe_exc - exp */
2560 195200 : 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 610 : tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn );
2569 6710 : FOR( i = 0; i < LPC_SHB_ORDER; i++ )
2570 : {
2571 6100 : state_lpc_syn[i] = shl( state_lpc_syn[i], tmp );
2572 6100 : move16();
2573 : }
2574 12810 : FOR( i = -L_SHB_LAHEAD; i < 0; i++ )
2575 : {
2576 12200 : excSHB[i] = shl( excSHB[i], tmp );
2577 12200 : move16();
2578 : }
2579 : /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */
2580 :
2581 610 : Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 );
2582 610 : Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 );
2583 610 : 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 610 : 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 1358 : 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 1358 : set16_fx( White_exc16k_FB, 0, L_FRAME16k );
2616 : }
2617 :
2618 1358 : return;
2619 : }
2620 :
2621 0 : 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 0 : Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */
2682 0 : move16();
2683 0 : Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */
2684 0 : move16();
2685 0 : move16();
2686 : Word16 varEnvShape;
2687 0 : Word16 fb_deemph_fac = 15729; /*0.48f in Q15 */
2688 : Word16 exc16kWhtnd[L_FRAME16k];
2689 :
2690 : Word32 L_tmp;
2691 : Word16 vf_tmp;
2692 0 : Word16 tmp, exp, tmp2 = 0;
2693 0 : 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 0 : 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 0 : mix_factor = 0; /* Q15 */
2722 0 : move16();
2723 :
2724 0 : set16_fx( zero_mem, 0, LPC_SHB_ORDER );
2725 0 : set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER );
2726 0 : FOR( i = 0; i < L_FRAME32k; i = i + 2 )
2727 : {
2728 0 : exc32k[i] = negate( bwe_exc_extended[i] ); // Q_bwe_exc
2729 0 : move16();
2730 0 : exc32k[i + 1] = bwe_exc_extended[i + 1]; // Q_bwe_exc
2731 0 : move16();
2732 : }
2733 :
2734 : /* Decimate by 2 */
2735 0 : 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 0 : 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 0 : R_l[0] = s_max( R_l[0], 1 );
2742 0 : move16();
2743 0 : FOR( i = 1; i <= LPC_WHTN_ORDER; i++ )
2744 : {
2745 0 : L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
2746 0 : L_Extract( L_tmp, &R_h[i], &R_l[i] ); // Q_R
2747 : }
2748 0 : E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL );
2749 0 : Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); // Q12
2750 0 : 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 0 : IF( GE_32( extl_brate, SWB_TBE_2k8 ) )
2756 : {
2757 0 : temp2 = 0;
2758 0 : move16();
2759 0 : FOR( j = 0; j < 4; j++ )
2760 : {
2761 0 : temp1 = shb_res_gshape[j];
2762 0 : move16();
2763 0 : FOR( i = 0; i < 80; i++ )
2764 : {
2765 0 : exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); // Q_bwe_exc
2766 0 : move16();
2767 : /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */
2768 : }
2769 0 : temp2 = add( temp2, 80 );
2770 : }
2771 : }
2772 :
2773 : /* Estimate pow1 associated with Low band nonlinear extended excitation */
2774 : /* pow1=0.00001f */
2775 0 : tmp = sub( shl( *Q_bwe_exc, 1 ), 31 );
2776 0 : W_tmp = W_shl( 21475 /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */
2777 0 : FOR( k = 0; k < L_FRAME16k; k++ )
2778 : {
2779 : /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/
2780 0 : excTmp2[k] = abs_s( exc16kWhtnd[k] );
2781 0 : move16();
2782 :
2783 : /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */
2784 0 : W_tmp = W_mac_16_16( W_tmp, exc16kWhtnd[k], exc16kWhtnd[k] ); // 2*Q_bwe_exc+1
2785 : }
2786 0 : exp = W_norm( W_tmp );
2787 0 : pow1 = W_extract_h( W_shl( W_tmp, exp ) ); // 2*Q_bwe_exc+1+exp-32 = // tmp+exp
2788 0 : Q_pow1 = add( tmp, exp );
2789 :
2790 0 : IF( flag_ACELP16k == 0 )
2791 : {
2792 : /* varEnvShape = mean_fx(voice_factors, 4); */
2793 : /* unroll the loop */
2794 0 : L_tmp = L_mult( voice_factors[0], 8192 /*0.25 in Q15 */ );
2795 0 : L_tmp = L_mac( L_tmp, voice_factors[1], 8192 /*0.25 in Q15 */ );
2796 0 : L_tmp = L_mac( L_tmp, voice_factors[2], 8192 /*0.25 in Q15 */ );
2797 0 : 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 0 : L_tmp = L_mult( voice_factors[0], 6554 /*0.2 in Q15 */ );
2804 0 : L_tmp = L_mac( L_tmp, voice_factors[1], 6554 /*0.2 in Q15 */ );
2805 0 : L_tmp = L_mac( L_tmp, voice_factors[2], 6554 /*0.2 in Q15 */ );
2806 0 : L_tmp = L_mac( L_tmp, voice_factors[3], 6554 /*0.2 in Q15 */ );
2807 0 : varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 /*0.2 in Q15 */ ); /* varEnvShape in Q15 */
2808 : }
2809 :
2810 0 : IF( EQ_16( extl, FB_TBE ) )
2811 : {
2812 : /*pow(varEnvShape,3) */
2813 0 : tmp = mult_r( varEnvShape, varEnvShape );
2814 0 : tmp = mult_r( tmp, varEnvShape );
2815 :
2816 : /* max_val((0.68f - (float)pow(varEnvShape, 3)), 0.48f); */
2817 0 : fb_deemph_fac = sub( 22282 /*0.68f Q15*/, tmp );
2818 0 : fb_deemph_fac = s_max( fb_deemph_fac, 15729 /*0.48f Q15*/ );
2819 : }
2820 :
2821 : /*varEnvShape = 1.09875f - 0.49875f * varEnvShape; */
2822 0 : varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape );
2823 :
2824 : /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */
2825 0 : varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ );
2826 0 : varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ );
2827 0 : varEnvShape = shl( varEnvShape, 1 );
2828 0 : csfilt_num2[0] = sub( MAX_16, varEnvShape ); // Q15
2829 0 : move16();
2830 0 : neg_csfilt_den2[1] = varEnvShape; // Q15
2831 0 : move16();
2832 :
2833 0 : test();
2834 0 : test();
2835 0 : test();
2836 0 : test();
2837 0 : IF( EQ_16( element_mode, EVS_MONO ) && *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) )
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 0 : IF( MSFlag > 0 )
2866 : {
2867 : // varEnvShape = 0.995f;
2868 0 : varEnvShape = 32604;
2869 0 : move16();
2870 0 : csfilt_num2[0] = 32768 - varEnvShape;
2871 : // csfilt_num2[0] = sub( 32767, varEnvShape );
2872 0 : move16();
2873 0 : neg_csfilt_den2[1] = varEnvShape;
2874 0 : move16();
2875 : }
2876 :
2877 0 : White_exc16k = exc16k;
2878 0 : Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc );
2879 0 : IF( *mem_csfilt )
2880 : {
2881 0 : Q_excTmp2 = s_min( Q_excTmp2, sub( add( norm_l( *mem_csfilt ), *Q_bwe_exc ), 1 ) );
2882 : }
2883 0 : test();
2884 : /* Track the low band envelope */
2885 0 : IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) )
2886 : {
2887 0 : test();
2888 0 : IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) )
2889 : {
2890 0 : mem_csfilt_left = 0;
2891 0 : mem_csfilt_right = 0;
2892 0 : move16();
2893 0 : move16();
2894 0 : FOR( k = 0; k < L_FRAME16k; k++ )
2895 : {
2896 : // excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k];
2897 0 : excNoisyEnvLeft[k] = add( mem_csfilt_left, mult_r( csfilt_num2[0], shl( excTmp2[k], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2
2898 0 : move16();
2899 : // mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k];
2900 0 : 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 0 : excNoisyEnvRight[L_FRAME16k - k - 1] = add( mem_csfilt_right, mult_r( csfilt_num2[0], shl( excTmp2[L_FRAME16k - k - 1], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2
2903 0 : move16();
2904 : // mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1];
2905 0 : mem_csfilt_right = mult_r( neg_csfilt_den2[1], excNoisyEnvRight[L_FRAME16k - k - 1] ); // Q_excTmp2
2906 : }
2907 :
2908 0 : alpha = 0;
2909 0 : move16();
2910 : // step = 1.0f / L_FRAME16k;
2911 0 : step = 102; // Q15
2912 0 : move16();
2913 0 : FOR( k = 0; k < L_FRAME16k; k++ )
2914 : {
2915 : // excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + (1 - alpha) * excNoisyEnvRight[k];
2916 0 : excNoisyEnv[k] = add( mult_r( alpha, excNoisyEnvLeft[k] ), mult_r( sub( 32767, alpha ), excNoisyEnvRight[k] ) ); // Q_excTmp2
2917 0 : move16();
2918 0 : alpha = add( alpha, step );
2919 : }
2920 : }
2921 : }
2922 : ELSE
2923 : {
2924 : /* Track the low band envelope */
2925 0 : L_tmp = L_shl( *mem_csfilt, sub( Q_excTmp2, *Q_bwe_exc ) );
2926 0 : move32();
2927 0 : FOR( i = 0; i < L_FRAME16k; i++ )
2928 : {
2929 0 : excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], shl( excTmp2[i], sub( Q_excTmp2, *Q_bwe_exc ) ) );
2930 0 : move16();
2931 : /* Work-around to avoid 0s for very small value*/
2932 0 : test();
2933 0 : test();
2934 0 : test();
2935 0 : test();
2936 0 : if ( excNoisyEnv[i] == 0 && ( L_tmp != 0 || ( csfilt_num2[0] != 0 && excTmp2[i] != 0 ) ) )
2937 : {
2938 0 : excNoisyEnv[i] = 1;
2939 0 : move16();
2940 : }
2941 : /* excNoisyEnv : Q_excTmp2,
2942 : *mem_csfilt: Q_excTmp2+16, excTmp2: Q_excTmp2, csfilt_num2[0] Q_excTmp2 */
2943 0 : L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_excTmp2 + 16 */
2944 : }
2945 0 : *mem_csfilt = L_shr( L_tmp, sub( Q_excTmp2, *Q_bwe_exc ) );
2946 0 : move32();
2947 : }
2948 :
2949 0 : test();
2950 0 : IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
2951 0 : {
2952 : /* generate gaussian (white) excitation */
2953 0 : FOR( k = 0; k < L_FRAME16k; k++ )
2954 : {
2955 0 : White_exc16k[k] = own_random( &bwe_seed[0] ); // Q0
2956 0 : move16();
2957 : }
2958 :
2959 : /* normalize the amplitude of the gaussian excitation to that of the LB exc. */
2960 0 : Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT; // Q31
2961 0 : move32();
2962 0 : move32();
2963 0 : pow22 = POW_EXC16k_WHTND_FX;
2964 0 : Q_pow22 = -6;
2965 0 : move16();
2966 : // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), White_exc16k, L_FRAME16k);
2967 0 : Word16 pow1_exp = sub( Q31, Q_pow1 );
2968 0 : Word32 temp_pow = Sqrt32( pow1, &pow1_exp );
2969 0 : 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 0 : L_tmp = 0;
2975 0 : move32();
2976 0 : Q_White_exc16k = add( getScaleFactor16( White_exc16k, L_FRAME16k ), norm_l( temp_pow ) );
2977 0 : FOR( k = 0; k < L_FRAME16k; k++ )
2978 : {
2979 0 : White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] ); // Q31 + Q0 - Q15 = Q16
2980 0 : move32();
2981 0 : White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); // Q16 + Q_White_exc16k - Q16 = Q_White_exc16k
2982 0 : move16();
2983 0 : 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 0 : create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed ); // Q5
2990 0 : create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); // Q5
2991 :
2992 0 : L_tmp = L_deposit_l( 0 );
2993 0 : tmp = add( *Q_bwe_exc, 1 );
2994 0 : FOR( k = 0; k < L_FRAME16k; k++ )
2995 : {
2996 0 : L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_excTmp2) +5 +1*/
2997 0 : White_exc16k_32[k] = L_tmp4; /* (Q_excTmp2) +5 +1*/
2998 0 : move32();
2999 0 : 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 0 : tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 );
3007 0 : W_tmp = W_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(*Q_bwe_exc-NOISE_QADJ) */
3008 0 : Q_White_exc16k = getScaleFactor32( White_exc16k_32, L_FRAME16k );
3009 0 : FOR( k = 0; k < L_FRAME16k; k++ )
3010 : {
3011 : /* White_exc16k[k] *= excNoisyEnv[k]; */
3012 0 : White_exc16k[k] = extract_h( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); // Q_excTmp2 + 6 + Q_White_exc16k - 16 ==> Q_excTmp2 + Q_White_exc16k - 10
3013 0 : 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 0 : W_tmp = W_mac0_16_16( W_tmp, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2 + Q_White_exc16k - 10)*/
3020 : }
3021 0 : Q_pow22 = W_norm( W_tmp );
3022 0 : pow22 = W_extract_h( W_shl( W_tmp, Q_pow22 ) ); // 2*(Q_excTmp2 + Q_White_exc16k - 10)+Q_pow22-32
3023 0 : Q_pow22 = sub( add( Q_pow22, shl( sub( add( Q_White_exc16k, Q_excTmp2 ), 10 ), 1 ) ), 32 );
3024 0 : Q_White_exc16k = add( Q_White_exc16k, sub( Q_excTmp2, 10 ) );
3025 : }
3026 :
3027 0 : flag_plosive = 0;
3028 0 : move16();
3029 0 : test();
3030 0 : test();
3031 0 : test();
3032 0 : IF( GE_32( extl_brate, SWB_TBE_2k8 ) || EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
3033 : {
3034 0 : IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */
3035 : {
3036 0 : test();
3037 0 : IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
3038 : {
3039 0 : FOR( k = 0; k < L_FRAME16k; k++ )
3040 : {
3041 0 : White_exc16k_tmp[k] = shl( White_exc16k[k], sub( *Q_bwe_exc, Q_White_exc16k ) );
3042 0 : move16();
3043 : }
3044 :
3045 : /* calculate TD envelopes of exc16kWhtnd and White_exc16k */
3046 0 : find_td_envelope_fx( White_exc16k_tmp, L_FRAME16k, 20, NULL, EnvWhiteExc16k ); /* Q_bwe_exc */
3047 0 : find_td_envelope_fx( exc16kWhtnd, L_FRAME16k, 20, NULL, EnvExc16kWhtnd ); /* Q_bwe_exc */
3048 :
3049 0 : FOR( k = 0; k < L_FRAME4k; k++ )
3050 : {
3051 0 : EnvWhiteExc16k_4k[k] = EnvWhiteExc16k[4 * k]; /* Q_bwe_exc */
3052 0 : move16();
3053 0 : EnvExc16kWhtnd_4k[k] = EnvExc16kWhtnd[4 * k]; /* Q_bwe_exc */
3054 0 : move16();
3055 : }
3056 :
3057 : /* calculate the optimal mix factor */
3058 0 : c0 = c1 = c2 = c3 = c4 = c5 = 0; /* Q0 */
3059 0 : move32();
3060 0 : move32();
3061 0 : move32();
3062 0 : move32();
3063 0 : move32();
3064 0 : move32();
3065 :
3066 0 : temp1 = add( shl( *Q_bwe_exc, 1 ), 1 );
3067 0 : temp2 = add( add( Q_EnvSHBres_4k, *Q_bwe_exc ), 1 );
3068 0 : temp3 = add( shl( Q_EnvSHBres_4k, 1 ), 1 );
3069 0 : 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 0 : c0_part[i] = L_shr( sum2_fx( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */
3073 0 : 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 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 */
3076 0 : move32();
3077 : // c2_part[i] = sum2_f( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
3078 0 : c2_part[i] = L_shr( sum2_fx( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */
3079 0 : 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 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 */
3082 0 : 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 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 */
3085 0 : move32();
3086 : // c5_part[i] = sum2_f( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
3087 0 : c5_part[i] = L_shr( sum2_fx( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp3 ); /* Q0 */
3088 0 : move32();
3089 :
3090 0 : c0 = L_add( c0, c0_part[i] );
3091 0 : c1 = L_add( c1, c1_part[i] );
3092 0 : c2 = L_add( c2, c2_part[i] );
3093 0 : c3 = L_add( c3, c3_part[i] );
3094 0 : c4 = L_add( c4, c4_part[i] );
3095 0 : c5 = L_add( c5, c5_part[i] );
3096 : }
3097 :
3098 : // den = 4.0f * c0 * c2 - c4 * c4;
3099 0 : W_tmp = W_sub( W_shl( W_mult0_32_32( c0, c2 ), 2 ), W_mult0_32_32( c4, c4 ) );
3100 0 : den_e = 63;
3101 0 : move16();
3102 0 : shift = W_norm( W_tmp );
3103 0 : den = W_extract_h( W_shl( W_tmp, shift ) );
3104 0 : den_e = sub( den_e, shift );
3105 :
3106 0 : IF( den == 0 )
3107 : {
3108 0 : den = 1;
3109 0 : move32();
3110 0 : den_e = 31;
3111 0 : move16();
3112 : }
3113 :
3114 : // g1 = ( c3 * c4 - 2 * c1 * c2 ) / den;
3115 0 : W_tmp = W_sub( W_mult0_32_32( c3, c4 ), W_shl( W_mult0_32_32( c1, c2 ), 1 ) );
3116 0 : g1_e = 63;
3117 0 : move16();
3118 0 : shift = W_norm( W_tmp );
3119 0 : L_tmp = W_extract_h( W_shl( W_tmp, shift ) );
3120 0 : g1_e = sub( g1_e, shift );
3121 :
3122 0 : g1 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e );
3123 0 : g1_e = sub( add( tmp_e, g1_e ), den_e );
3124 :
3125 : // g2 = ( c1 * c4 - 2 * c0 * c3 ) / den;
3126 0 : W_tmp = W_sub( W_mult0_32_32( c1, c4 ), W_shl( W_mult0_32_32( c0, c3 ), 1 ) );
3127 0 : g2_e = 63;
3128 0 : move16();
3129 0 : shift = W_norm( W_tmp );
3130 0 : L_tmp = W_extract_h( W_shl( W_tmp, shift ) );
3131 0 : g2_e = sub( g2_e, shift );
3132 :
3133 0 : g2 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e );
3134 0 : g2_e = sub( add( tmp_e, g2_e ), den_e );
3135 :
3136 : // *Env_error = 0.0f;
3137 0 : *Env_error = 0;
3138 0 : move16();
3139 0 : flag_plosive = 0;
3140 0 : move16();
3141 0 : 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 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 );
3145 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 );
3146 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 );
3147 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 );
3148 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 );
3149 :
3150 : // Env_error_part[i] = L_shr( L_tmp, 31 - tmp_e ); // Check Exponent
3151 0 : Env_error_part[i] = extract_h( L_shr_sat( L_tmp, sub( Q15, tmp_e ) ) ); /* Q0 */
3152 0 : move16();
3153 :
3154 : // *Env_error += Env_error_part[i];
3155 0 : *Env_error = add_sat( *Env_error, Env_error_part[i] ); /* Q0 */
3156 0 : move16();
3157 :
3158 0 : 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 0 : flag_plosive = 1;
3162 0 : move16();
3163 : }
3164 : }
3165 :
3166 0 : IF( flag_plosive )
3167 : {
3168 : /* plosive detected -> set the mixing factor to 0 */
3169 0 : *vf_ind = 0;
3170 0 : move16();
3171 0 : mix_factor = 0;
3172 0 : move16();
3173 : }
3174 : ELSE
3175 : {
3176 : /* normalize gain */
3177 : // g = g2 / ( g1 + g2 );
3178 0 : tmp1_e = BASOP_Util_Add_MantExp( g1, g1_e, g2, g2_e, &tmp );
3179 0 : IF( tmp == 0 )
3180 : {
3181 0 : tmp = 1;
3182 0 : move16();
3183 0 : tmp1_e = 15;
3184 0 : move16();
3185 : }
3186 0 : g = BASOP_Util_Divide1616_Scale( g2, tmp, &tmp_e );
3187 0 : g_e = sub( add( tmp_e, g2_e ), tmp1_e );
3188 :
3189 : /* quantization of the mixing factor */
3190 0 : cbsize = 1 << NUM_BITS_SHB_VF;
3191 0 : move16();
3192 : // delta = 1.0f / ( cbsize - 1 );
3193 0 : delta = 2341; /* Q14 */
3194 0 : move16();
3195 : // if ( g > 1.0f )
3196 0 : IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), ONE_IN_Q31, 0 ) > 0 )
3197 : {
3198 : // g = 1.0f;
3199 0 : g = MAX16B; /* Q15 */
3200 0 : move16();
3201 0 : g_e = 0;
3202 0 : move16();
3203 : }
3204 : // else if ( g < shl( delta, ( 15 - g_e ) - 14 ) )
3205 0 : 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 0 : g = shl( delta, 1 ); /* Q15 */
3210 0 : g_e = 0;
3211 0 : move16();
3212 : }
3213 :
3214 0 : g = shl_sat( g, g_e ); /* Q15 */
3215 :
3216 0 : *vf_ind = usquant_fx( g, &mix_factor, 0, delta, cbsize );
3217 0 : move16();
3218 : }
3219 : }
3220 : ELSE
3221 : {
3222 0 : 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 0 : tmp = voiceFacEst[0];
3225 0 : tmp2 = MAX_16;
3226 0 : move16();
3227 0 : move16();
3228 0 : if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
3229 : {
3230 0 : tmp2 = 26214 /*0.8f Q15*/;
3231 0 : 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 0 : test();
3269 0 : IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) )
3270 : {
3271 0 : voice_factors[0] = mult_r( voice_factors[0], tmp2 );
3272 0 : move16();
3273 0 : voice_factors[1] = mult_r( voice_factors[1], tmp2 );
3274 0 : move16();
3275 0 : voice_factors[2] = mult_r( voice_factors[2], tmp2 );
3276 0 : move16();
3277 0 : voice_factors[3] = mult_r( voice_factors[3], tmp2 );
3278 0 : move16();
3279 0 : voice_factors[4] = mult_r( voice_factors[4], tmp2 );
3280 0 : move16();
3281 : }
3282 : }
3283 :
3284 0 : test();
3285 0 : IF( GE_16( element_mode, IVAS_CPE_DFT ) && nlExc16k != NULL )
3286 : {
3287 : /* save buffers for IC-BWE */
3288 : // mvr2r(exc16kWhtnd, nlExc16k, L_FRAME16k);
3289 0 : Copy( exc16kWhtnd, nlExc16k, L_FRAME16k ); // Q_bwe_exc
3290 0 : *nlExc16k_e = sub( 15, *Q_bwe_exc );
3291 0 : move16();
3292 :
3293 : // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), mixExc16k, L_FRAME16k);
3294 0 : L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
3295 0 : Word16 temp_fac = round_fx_sat( L_tmp ); // Q15-exp
3296 :
3297 0 : FOR( k = 0; k < L_FRAME16k; k++ )
3298 : {
3299 0 : mixExc16k[k] = mult_r( White_exc16k[k], temp_fac ); // Q_White_exc16k+15-exp-15 = Q_White_exc16k-exp
3300 0 : move16();
3301 : }
3302 0 : *mixExc16k_e = sub( 15, sub( Q_White_exc16k, exp ) );
3303 0 : move16();
3304 : }
3305 :
3306 0 : Copy( White_exc16k, White_exc16k_FB, L_FRAME16k ); // Q_White_exc16k
3307 0 : prev_Q_bwe_exc_fb = *Q_bwe_exc_fb;
3308 0 : *Q_bwe_exc_fb = Q_White_exc16k;
3309 0 : move16();
3310 0 : move16();
3311 :
3312 0 : Word16 tbe_demph_fx = shl_sat( *tbe_demph, sub( Q_White_exc16k, *Q_bwe_exc ) ); // Q_White_exc16k
3313 :
3314 0 : deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, &tbe_demph_fx );
3315 : /* i/o: White_exc16k (Q_White_exc16k) */
3316 : /* i: tbe_demph_fx (Q_White_exc16k) */
3317 0 : *tbe_demph = shr_sat( tbe_demph_fx, sub( Q_White_exc16k, *Q_bwe_exc ) );
3318 0 : move16();
3319 :
3320 0 : test();
3321 0 : IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
3322 : {
3323 0 : IF( !flag_plosive ) /* use only LB excitation in case of plosives */
3324 : {
3325 : /* re-scale gaussian excitation at the beginning to gradually move from old energy to new energy */
3326 : /* old_scale = (float) sqrt( *prev_pow_exc16kWhtnd / pow1 ); */
3327 0 : old_scale = round_fx_sat( root_a_over_b_fx( *prev_pow_exc16kWhtnd, 0, pow1, Q_pow1, &exp ) ); // exp
3328 0 : old_scale = shl( old_scale, s_min( 0, exp ) ); // limit Q factor to 15
3329 0 : exp = s_max( 0, exp );
3330 :
3331 : // new_scale = 1.0f;
3332 0 : new_scale = shr( 32767, exp ); // exp
3333 :
3334 : // step_scale = (new_scale - old_scale) / (L_FRAME16k / 2);
3335 0 : step_scale = mult_r( sub( new_scale, old_scale ), 205 ); // exp
3336 0 : scale = old_scale; // exp
3337 0 : move16();
3338 :
3339 : /* interpolate between the old and the new value of the mixing factor */
3340 0 : old_fact = *prev_mix_factor; // Q15
3341 0 : new_fact = mix_factor; // Q15
3342 0 : move16();
3343 0 : move16();
3344 :
3345 : // step = (new_fact - old_fact) / (L_FRAME16k / 2);
3346 0 : step = mult_r( sub( new_fact, old_fact ), 205 ); // Q15
3347 0 : fact = old_fact; // Q15
3348 0 : move16();
3349 :
3350 0 : shift = add( exp, sub( *Q_bwe_exc, Q_White_exc16k ) );
3351 :
3352 : /* mixing of LB and gaussian excitation in the first half of the frame */
3353 0 : FOR( k = 0; k < L_FRAME16k / 2; k++ )
3354 : {
3355 : /* exc16kWhtnd[k] = (float)fact * (White_exc16k[k] * scale) + (float)(1 - fact) * exc16kWhtnd[k]; */
3356 0 : L_tmp = L_shl_sat( L_mult( fact, mult_r( White_exc16k[k], scale ) ), shift ); // Q_bwe_exc+16
3357 0 : exc16kWhtnd[k] = mac_r_sat( L_tmp, sub( 32767, fact ), exc16kWhtnd[k] ); // Q_bwe_exc
3358 0 : move16();
3359 :
3360 0 : fact = add_sat( fact, step ); // Q15
3361 0 : scale = add_sat( scale, step_scale ); // exp
3362 : }
3363 :
3364 0 : shift = sub( *Q_bwe_exc, Q_White_exc16k );
3365 : /* mixing of LB and gaussian excitation in the second half of the frame */
3366 0 : FOR( ; k < L_FRAME16k; k++ )
3367 : {
3368 : // exc16kWhtnd[k] = (float)new_fact * White_exc16k[k] + (float)(1 - new_fact) * exc16kWhtnd[k];
3369 0 : L_tmp = L_shl_sat( L_mult( new_fact, White_exc16k[k] ), shift ); // Q_bwe_exc+16
3370 0 : exc16kWhtnd[k] = mac_r( L_tmp, sub( 32767, new_fact ), exc16kWhtnd[k] ); // Q_bwe_exc
3371 0 : move16();
3372 : }
3373 : }
3374 : // preemph(exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph);
3375 0 : PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); // Q_bwe_exc
3376 : }
3377 : ELSE
3378 : {
3379 0 : test();
3380 0 : IF( EQ_16( coder_type, UNVOICED ) || EQ_16( MSFlag, 1 ) )
3381 : {
3382 0 : scale = 0;
3383 0 : move16();
3384 :
3385 0 : test();
3386 0 : IF( pow1 != 0 && pow22 != 0 )
3387 : {
3388 0 : L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
3389 0 : scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */
3390 : }
3391 :
3392 0 : FOR( k = 0; k < L_FRAME16k; k++ )
3393 : {
3394 0 : exc16kWhtnd[k] = mult_r_sat( White_exc16k[k], scale ); // Q_White_exc16k
3395 0 : move16();
3396 : }
3397 :
3398 0 : Scale_sig( exc16kWhtnd, L_FRAME16k, sub( *Q_bwe_exc, Q_White_exc16k ) ); // Q_bwe_exc
3399 :
3400 0 : PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); // Q_bwe_exc
3401 : /* i/o: exc16kWhtnd (Q_bwe_exc) */
3402 : /* i/o: tbe_premph (Q_bwe_exc) */
3403 : }
3404 : ELSE
3405 : {
3406 : Word16 nbSubFr, lSubFr;
3407 : Word16 tempQ15;
3408 : Word32 tempQ31;
3409 0 : nbSubFr = NB_SUBFR16k;
3410 0 : lSubFr = ( L_FRAME16k / NB_SUBFR16k );
3411 0 : move16();
3412 0 : move16();
3413 0 : IF( LT_32( extl_brate, SWB_TBE_2k8 ) )
3414 : {
3415 0 : nbSubFr = NB_SUBFR;
3416 0 : move16();
3417 0 : lSubFr = ( L_FRAME16k / NB_SUBFR );
3418 0 : move16();
3419 : }
3420 0 : k = 0;
3421 0 : move16();
3422 0 : FOR( i = 0; i < nbSubFr; i++ )
3423 : {
3424 0 : test();
3425 0 : IF( EQ_16( coder_type, VOICED ) && ( LT_32( extl_brate, SWB_TBE_2k8 ) ) )
3426 : {
3427 0 : exp = 0;
3428 0 : move16();
3429 0 : tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */
3430 0 : temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
3431 0 : exp = 0;
3432 0 : move16();
3433 0 : tempQ15 = Sqrt16( temp, &exp ); /* Q15 */
3434 0 : temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
3435 :
3436 : /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */
3437 0 : temp = sub( MAX_16, temp );
3438 0 : tempQ31 = Mult_32_16( pow1, temp );
3439 0 : L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
3440 0 : temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
3441 : }
3442 : ELSE
3443 : {
3444 : /* Adjust noise mixing for formant sharpening filter */
3445 0 : tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac );
3446 : /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */
3447 0 : vf_tmp = sub( MAX_16, tempQ15 );
3448 0 : vf_tmp = mult( voice_factors[i], vf_tmp );
3449 :
3450 0 : exp = 0;
3451 0 : move16();
3452 0 : tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */
3453 0 : temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
3454 :
3455 : /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */
3456 0 : temp = sub( MAX_16, vf_tmp );
3457 0 : tempQ31 = Mult_32_16( pow1, temp );
3458 0 : L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
3459 0 : temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
3460 : }
3461 :
3462 0 : shift = sub( *Q_bwe_exc, Q_White_exc16k );
3463 0 : FOR( j = 0; j < lSubFr; j++ )
3464 : {
3465 : /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */
3466 0 : L_tmp = L_shl_sat( L_mult( temp2, White_exc16k[k + j] ), shift ); // 16+(Q_bwe_exc)
3467 0 : exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] ); // Q_bwe_exc
3468 0 : move16();
3469 : }
3470 0 : k = add( k, lSubFr );
3471 :
3472 : /* estimate the pre-emph factor */
3473 0 : tempQ15 = sub( MAX_16, voice_factors[i] );
3474 0 : exp = 0;
3475 0 : move16();
3476 0 : temp = Sqrt16( tempQ15, &exp );
3477 0 : temp = shl( temp, sub( exp, 1 ) );
3478 :
3479 0 : temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */
3480 0 : temp = div_s( temp, temp2 ); /* Q15 */
3481 0 : temp = mult_r( PREEMPH_FAC, temp );
3482 :
3483 0 : PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph ); // Q_bwe_exc
3484 : /* exc16kWhtnd: Q_bwe_exc;
3485 : tbe_premph: Q_bwe_exc*/
3486 : }
3487 : }
3488 : }
3489 :
3490 0 : IF( LT_32( extl_brate, SWB_TBE_2k8 ) )
3491 : {
3492 0 : syn_filt_fx( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 );
3493 : /* i: exc16kWhtnd in Q_bwe_exc */
3494 : /* o: excSHB in Q_bwe_exc */
3495 : }
3496 : ELSE
3497 : {
3498 0 : set16_fx( zero_mem, 0, LPC_SHB_ORDER );
3499 :
3500 0 : syn_filt_fx( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 );
3501 0 : tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
3502 0 : Scale_sig( tempSHB, 80, tmp );
3503 0 : syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
3504 0 : move32();
3505 0 : syn_shb_ener_sf_q[0] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
3506 0 : move16();
3507 :
3508 0 : syn_filt_fx( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 );
3509 0 : tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
3510 0 : Scale_sig( tempSHB, 80, tmp );
3511 0 : syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
3512 0 : move32();
3513 0 : syn_shb_ener_sf_q[1] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
3514 0 : move16();
3515 :
3516 0 : syn_filt_fx( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 );
3517 0 : tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
3518 0 : Scale_sig( tempSHB, 80, tmp );
3519 0 : syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
3520 0 : move32();
3521 0 : syn_shb_ener_sf_q[2] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
3522 0 : move16();
3523 :
3524 0 : syn_filt_fx( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 );
3525 0 : tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
3526 0 : Scale_sig( tempSHB, 80, tmp );
3527 0 : syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
3528 0 : move32();
3529 0 : syn_shb_ener_sf_q[3] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
3530 0 : move16();
3531 :
3532 0 : tmp2 = s_min( s_min( syn_shb_ener_sf_q[0], syn_shb_ener_sf_q[1] ), s_min( syn_shb_ener_sf_q[3], syn_shb_ener_sf_q[2] ) );
3533 0 : syn_shb_ener_sf[0] = L_shl( syn_shb_ener_sf[0], sub( tmp2, syn_shb_ener_sf_q[0] ) );
3534 0 : move32();
3535 0 : syn_shb_ener_sf[1] = L_shl( syn_shb_ener_sf[1], sub( tmp2, syn_shb_ener_sf_q[1] ) );
3536 0 : move32();
3537 0 : syn_shb_ener_sf[2] = L_shl( syn_shb_ener_sf[2], sub( tmp2, syn_shb_ener_sf_q[2] ) );
3538 0 : move32();
3539 0 : syn_shb_ener_sf[3] = L_shl( syn_shb_ener_sf[3], sub( tmp2, syn_shb_ener_sf_q[3] ) );
3540 0 : move32();
3541 :
3542 : /* i: exc16kWhtnd in Q_bwe_exc */
3543 : /* o: tempSHB in Q_bwe_exc */
3544 : /* o: syn_shb_ener_sf in tmp2 */
3545 0 : IF( LE_32( bitrate, MAX_ACELP_BRATE ) )
3546 : {
3547 0 : L_tmp = sum32_fx( syn_shb_ener_sf, 4 );
3548 :
3549 : /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */
3550 0 : tmp = shl( Q_shb, 1 );
3551 0 : L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */
3552 :
3553 0 : *Q_bwe_exc = sub( *Q_bwe_exc, exp );
3554 0 : move16(); /* compensate for the exp shift */
3555 0 : tmp2 = add( prev_Q_bwe_syn, n_mem2 );
3556 0 : IF( GT_16( *Q_bwe_exc, tmp2 ) )
3557 : {
3558 0 : L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) );
3559 0 : *Q_bwe_exc = tmp2;
3560 0 : move16();
3561 : }
3562 0 : FOR( i = 0; i < L_FRAME16k; i++ )
3563 : {
3564 0 : L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */
3565 0 : exc16kWhtnd[i] = round_fx( L_tmp3 ); /* *Q_bwe_exc - exp */
3566 0 : move16();
3567 : }
3568 : }
3569 : /* i: L_tmp2 in (Q31-exp) */
3570 : /* i: exc16kWhtnd in Q_bwe_exc */
3571 : /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp) */
3572 :
3573 : /* Rescale the past memories: LP synth and SHB look ahead buffers */
3574 0 : tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn );
3575 0 : FOR( i = 0; i < LPC_SHB_ORDER; i++ )
3576 : {
3577 0 : state_lpc_syn[i] = shl_sat( state_lpc_syn[i], tmp );
3578 0 : move16();
3579 : }
3580 0 : FOR( i = -L_SHB_LAHEAD; i < 0; i++ )
3581 : {
3582 0 : excSHB[i] = shl_sat( excSHB[i], tmp );
3583 0 : move16();
3584 : }
3585 : /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */
3586 :
3587 0 : syn_filt_fx( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 );
3588 0 : syn_filt_fx( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 );
3589 0 : syn_filt_fx( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 );
3590 0 : syn_filt_fx( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 );
3591 : /* i: exc16kWhtnd in (Q_bwe_exc) */
3592 : /* o: excSHB in (Q_bwe_exc) */
3593 : }
3594 :
3595 0 : IF( EQ_16( extl, FB_TBE ) )
3596 : {
3597 0 : tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb );
3598 0 : Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp );
3599 0 : Scale_sig( fb_tbe_demph, 1, tmp );
3600 0 : syn_filt_fx( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 );
3601 : /* i: White_exc16k_FB in (Q_bwe_exc_fb) */
3602 : /* o: White_exc16k_FB_temp in (Q_bwe_exc_fb) */
3603 :
3604 0 : FOR( i = 0; i < 10; i++ )
3605 : {
3606 0 : FOR( j = 0; j < 32; ++j )
3607 : {
3608 0 : White_exc16k_FB_temp[i * 32 + j] = mult_r_sat( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] );
3609 0 : move16();
3610 : }
3611 : }
3612 :
3613 0 : *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 );
3614 0 : move16(); /**Q_bwe_exc_fb +35 +1 -16*/
3615 0 : flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k );
3616 :
3617 0 : deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph );
3618 : }
3619 : ELSE
3620 : {
3621 0 : set16_fx( White_exc16k_FB, 0, L_FRAME16k );
3622 : }
3623 :
3624 0 : *prev_pow_exc16kWhtnd = L_shr_sat( pow1, Q_pow1 ); // power goes above MAX_32
3625 0 : *prev_mix_factor = mix_factor;
3626 0 : move32();
3627 0 : move16();
3628 :
3629 0 : return;
3630 : }
3631 :
3632 102554 : void GenShapedSHBExcitation_ivas_dec_fx(
3633 : Word16 *excSHB, /* o : synthesized shaped shb excitation Q_bwe_exc*/
3634 : const Word16 *lpc_shb, /* i : lpc coefficients Q12*/
3635 : Word16 *White_exc16k_FB, /* o : white excitation for the Fullband extension Q_bwe_exc */
3636 : Word32 *mem_csfilt, /* i/o: memory */
3637 : Word16 *mem_genSHBexc_filt_down_shb, /* i/o: memory */
3638 : Word16 *state_lpc_syn, /* i/o: memory */
3639 : const Word16 coder_type, /* i : coding type */
3640 : const Word16 *bwe_exc_extended, /* i : bwidth extended excitation */
3641 : Word16 bwe_seed[], /* i/o: random number generator seed */
3642 : Word16 voice_factors[], /* i : voicing factor*/
3643 : const Word16 extl, /* i : extension layer */
3644 : Word16 *tbe_demph, /* i/o: de-emphasis memory */
3645 : Word16 *tbe_premph, /* i/o: pre-emphasis memory */
3646 : Word16 *lpc_shb_sf, /* i: LP coefficients */
3647 : const Word32 shb_ener_sf_32, /* i: input shb ener, Q31 */
3648 : Word16 *shb_res_gshape, /* i: input res gain shape, Q14 */
3649 : Word16 *shb_res,
3650 : Word16 *vf_ind,
3651 : const Word16 formant_fac, /* i : Formant sharpening factor [0..1] */
3652 : Word16 fb_state_lpc_syn[], /* i/o: memory */
3653 : Word16 *fb_tbe_demph, /* i/o: fb de-emphasis memory */
3654 : Word16 *Q_bwe_exc,
3655 : Word16 *Q_bwe_exc_fb,
3656 : const Word16 Q_shb,
3657 : Word16 n_mem2, /* i : n_mem2 scale factor to adjust 24.4/32kbps memories */
3658 : Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */
3659 : const Word32 bitrate, /* i : bitrate */
3660 : const Word16 prev_bfi, /* i : previous frame was concealed */
3661 : const Word16 element_mode, /* i : element mode */
3662 : const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */
3663 : Word16 *nlExc16k, /* i/o: NL exc for IC-BWE */
3664 : Word16 *mixExc16k, /* i/o: exc spreading for IC-BWE */
3665 : const Word32 extl_brate, /* i : extension layer bitarte */
3666 : const Word16 MSFlag, /* i : Multi Source flag */
3667 : Word16 EnvSHBres_4k[], /* i/o: TD envelope of the SHB residual signal */
3668 : Word32 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */
3669 : Word16 *prev_mix_factor, /* i/o: mixing factor in the previous frame */
3670 : Word16 *Env_error, /* o : error in SHB residual envelope modelling Q0 */
3671 : Word16 Env_error_part[] /* o : per-segment error in SHB residual envelope modelling Q0 */
3672 : )
3673 : {
3674 : Word16 i, j, k;
3675 : Word16 wht_fil_mem[LPC_WHTN_ORDER];
3676 : Word16 lpc_whtn[LPC_WHTN_ORDER + 1];
3677 : Word16 R_h[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech MSB */
3678 : Word16 R_l[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech LSB */
3679 : Word16 Q_R;
3680 : Word32 LepsP[LPC_WHTN_ORDER + 1];
3681 : Word16 exc32k[L_FRAME32k], exc16k[L_FRAME16k];
3682 : Word32 pow1, pow22;
3683 : Word16 scale, temp1, temp2, temp3;
3684 : Word16 Q_White_exc16k;
3685 : Word16 excTmp2[L_FRAME16k];
3686 : Word16 *White_exc16k;
3687 : Word16 excNoisyEnv[L_FRAME16k];
3688 102554 : Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */
3689 102554 : move16();
3690 102554 : Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */
3691 102554 : move16();
3692 102554 : move16();
3693 : Word16 varEnvShape;
3694 102554 : Word16 fb_deemph_fac = 15729; /*0.48f in Q15 */
3695 : Word16 exc16kWhtnd[L_FRAME16k];
3696 :
3697 : Word32 L_tmp;
3698 : Word16 vf_tmp;
3699 102554 : Word16 tmp, exp, tmp2 = 0;
3700 102554 : move16();
3701 : Word16 voiceFacEst[NB_SUBFR16k];
3702 : Word16 zero_mem[LPC_SHB_ORDER];
3703 : Word32 syn_shb_ener_sf[4];
3704 : Word16 syn_shb_ener_sf_q[4];
3705 : Word16 tempSHB[80];
3706 : Word16 Q_pow1, Q_pow22;
3707 :
3708 : Word32 L_tmp2, L_tmp3, L_tmp4;
3709 : Word16 temp;
3710 :
3711 : Word16 White_exc16k_FB_temp[L_FRAME16k];
3712 : Word32 White_exc16k_32[L_FRAME16k];
3713 : Word16 White_exc16k_tmp[L_FRAME16k];
3714 : Word16 Q_temp;
3715 : Word16 prev_Q_bwe_exc_fb, Q_exc16kWhtnd;
3716 : Word16 chk1;
3717 : Word32 chk2;
3718 102554 : chk1 = 0;
3719 102554 : chk2 = 0;
3720 102554 : move16();
3721 102554 : move32();
3722 :
3723 : Word16 alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k];
3724 : Word16 cbsize;
3725 : Word16 mix_factor, old_fact, new_fact, fact, old_scale, new_scale, step_scale;
3726 : Word32 c0, c1, c2, c3, c4, c5, den;
3727 : Word16 g1, g2, g, g1_e, g2_e, g_e, den_e, shift, tmp_e, tmp1_e;
3728 : Word16 EnvWhiteExc16k[L_FRAME16k], EnvExc16kWhtnd[L_FRAME16k];
3729 102554 : Word16 EnvWhiteExc16k_4k[L_FRAME4k] = { 0 }, EnvExc16kWhtnd_4k[L_FRAME4k] = { 0 };
3730 : Word16 flag_plosive;
3731 : Word16 delta;
3732 : Word32 c0_part[NUM_SHB_SUBGAINS], c1_part[NUM_SHB_SUBGAINS], c2_part[NUM_SHB_SUBGAINS], c3_part[NUM_SHB_SUBGAINS], c4_part[NUM_SHB_SUBGAINS], c5_part[NUM_SHB_SUBGAINS];
3733 : Word64 W_tmp;
3734 :
3735 102554 : mix_factor = 0; /* Q15 */
3736 102554 : move16();
3737 :
3738 102554 : set16_fx( zero_mem, 0, LPC_SHB_ORDER );
3739 102554 : set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER );
3740 32919834 : FOR( i = 0; i < L_FRAME32k; i = i + 2 )
3741 : {
3742 32817280 : exc32k[i] = negate( bwe_exc_extended[i] ); // Q_bwe_exc
3743 32817280 : move16();
3744 32817280 : exc32k[i + 1] = bwe_exc_extended[i + 1]; // Q_bwe_exc
3745 32817280 : move16();
3746 : }
3747 :
3748 : /* Decimate by 2 */
3749 102554 : Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k ); // Q_bwe_exc
3750 : /* i: exc32k in Q_bwe_exc */
3751 : /* o: exc16k in Q_bwe_exc */
3752 :
3753 102554 : autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 ); // Q_R
3754 : /* Ensure R[0] isn't zero when entering Levinson Durbin */
3755 102554 : R_l[0] = s_max( R_l[0], 1 );
3756 102554 : move16();
3757 512770 : FOR( i = 1; i <= LPC_WHTN_ORDER; i++ )
3758 : {
3759 410216 : L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
3760 410216 : L_Extract( L_tmp, &R_h[i], &R_l[i] ); // Q_R
3761 : }
3762 102554 : E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL );
3763 102554 : Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); // Q12
3764 102554 : fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 ); // Q_bwe_exc
3765 :
3766 : /* i: exc16k in Q_bwe_exc */
3767 : /* o: exc16kWhtnd in Q_bwe_exc */
3768 :
3769 102554 : IF( GE_32( extl_brate, SWB_TBE_2k8 ) )
3770 : {
3771 21546 : temp2 = 0;
3772 21546 : move16();
3773 107730 : FOR( j = 0; j < 4; j++ )
3774 : {
3775 86184 : temp1 = shb_res_gshape[j];
3776 86184 : move16();
3777 6980904 : FOR( i = 0; i < 80; i++ )
3778 : {
3779 6894720 : exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); // Q_bwe_exc
3780 6894720 : move16();
3781 : /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */
3782 : }
3783 86184 : temp2 = add( temp2, 80 );
3784 : }
3785 : }
3786 :
3787 : /* Estimate pow1 associated with Low band nonlinear extended excitation */
3788 : /* pow1=0.00001f */
3789 102554 : tmp = sub( shl( *Q_bwe_exc, 1 ), 31 );
3790 102554 : pow1 = L_shl_sat( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */
3791 32919834 : FOR( k = 0; k < L_FRAME16k; k++ )
3792 : {
3793 : /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/
3794 32817280 : excTmp2[k] = abs_s( exc16kWhtnd[k] );
3795 32817280 : move16();
3796 32817280 : chk1 = s_or( chk1, exc16kWhtnd[k] );
3797 :
3798 : /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */
3799 32817280 : pow1 = L_mac0_sat( pow1, exc16kWhtnd[k], exc16kWhtnd[k] ); /* 2*Q_bwe_exc */
3800 : }
3801 102554 : Q_pow1 = shl( *Q_bwe_exc, 1 );
3802 :
3803 102554 : test();
3804 :
3805 102554 : IF( flag_ACELP16k == 0 )
3806 : {
3807 : /* varEnvShape = mean_fx(voice_factors, 4); */
3808 : /* unroll the loop */
3809 48570 : L_tmp = L_mult( voice_factors[0], 8192 /*0.25 in Q15 */ );
3810 48570 : L_tmp = L_mac( L_tmp, voice_factors[1], 8192 /*0.25 in Q15 */ );
3811 48570 : L_tmp = L_mac( L_tmp, voice_factors[2], 8192 /*0.25 in Q15 */ );
3812 48570 : varEnvShape = mac_r( L_tmp, voice_factors[3], 8192 /*0.25 in Q15 */ ); /* varEnvShape in Q15 */
3813 : }
3814 : ELSE /* 16k core */
3815 : {
3816 : /* varEnvShape = mean_fx(voice_factors, 5); */
3817 : /* unroll the loop */
3818 53984 : L_tmp = L_mult( voice_factors[0], 6554 /*0.2 in Q15 */ );
3819 53984 : L_tmp = L_mac( L_tmp, voice_factors[1], 6554 /*0.2 in Q15 */ );
3820 53984 : L_tmp = L_mac( L_tmp, voice_factors[2], 6554 /*0.2 in Q15 */ );
3821 53984 : L_tmp = L_mac( L_tmp, voice_factors[3], 6554 /*0.2 in Q15 */ );
3822 53984 : varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 /*0.2 in Q15 */ ); /* varEnvShape in Q15 */
3823 : }
3824 :
3825 102554 : IF( EQ_16( extl, FB_TBE ) )
3826 : {
3827 : /*pow(varEnvShape,3) */
3828 39990 : tmp = mult_r( varEnvShape, varEnvShape );
3829 39990 : tmp = mult_r( tmp, varEnvShape );
3830 :
3831 : /* max_val((0.68f - (float)pow(varEnvShape, 3)), 0.48f); */
3832 39990 : fb_deemph_fac = sub( 22282 /*0.68f Q15*/, tmp );
3833 39990 : fb_deemph_fac = s_max( fb_deemph_fac, 15729 /*0.48f Q15*/ );
3834 : }
3835 :
3836 : /*varEnvShape = 1.09875f - 0.49875f * varEnvShape; */
3837 102554 : varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape );
3838 :
3839 : /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */
3840 102554 : varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ );
3841 102554 : varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ );
3842 102554 : varEnvShape = shl( varEnvShape, 1 );
3843 102554 : csfilt_num2[0] = sub( MAX_16, varEnvShape ); // Q15
3844 102554 : move16();
3845 102554 : neg_csfilt_den2[1] = varEnvShape; // Q15
3846 102554 : move16();
3847 :
3848 102554 : test();
3849 102554 : test();
3850 102554 : test();
3851 :
3852 102554 : IF( EQ_16( element_mode, EVS_MONO ) && *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) )
3853 : {
3854 : /* pre-init smoothing filter to avoid energy drop outs */
3855 0 : L_tmp = L_mult( excTmp2[0], 1638 );
3856 0 : FOR( i = 1; i < L_SUBFR16k / 4; i++ )
3857 : {
3858 0 : L_tmp = L_mac( L_tmp, excTmp2[i], 1638 ); /*1638 = 1/20 in Q15*/
3859 : }
3860 : /*L_tmp = sum(excTmp2, L_SUBFR16k/4)*(1/20) where L_SUBFR16k/4 =20 */
3861 :
3862 : /* don't apply for FB in case the FB start-frame was potentially lost - White_exc16k is very sensitive to enery mismatch between enc - dec */
3863 : /* rather stick to the more conservative approach, to avoid potential clippings */
3864 0 : test();
3865 0 : IF( !( prev_bfi && EQ_16( extl, FB_TBE ) ) )
3866 : {
3867 : /* use weak smoothing for 1st frame after switching to make filter recover more quickly */
3868 0 : varEnvShape = 26214 /*0.8f Q15*/;
3869 0 : move16();
3870 0 : csfilt_num2[0] = sub( MAX_16, varEnvShape );
3871 0 : move16();
3872 0 : neg_csfilt_den2[1] = varEnvShape;
3873 0 : move16();
3874 : }
3875 :
3876 0 : *mem_csfilt = Mult_32_16( L_tmp, varEnvShape );
3877 0 : move32();
3878 : }
3879 :
3880 102554 : IF( MSFlag > 0 )
3881 : {
3882 : // varEnvShape = 0.995f;
3883 5025 : varEnvShape = 32604;
3884 5025 : move16();
3885 5025 : csfilt_num2[0] = 32768 - varEnvShape;
3886 : // csfilt_num2[0] = sub( 32767, varEnvShape );
3887 5025 : move16();
3888 5025 : neg_csfilt_den2[1] = varEnvShape;
3889 5025 : move16();
3890 : }
3891 :
3892 102554 : White_exc16k = exc16k;
3893 102554 : move16();
3894 102554 : Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc );
3895 102554 : IF( *mem_csfilt )
3896 : {
3897 67708 : Q_excTmp2 = s_min( Q_excTmp2, sub( add( norm_l( *mem_csfilt ), *Q_bwe_exc ), 1 ) );
3898 : }
3899 102554 : test();
3900 : /* Track the low band envelope */
3901 102554 : IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) )
3902 : {
3903 27918 : test();
3904 27918 : IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) )
3905 : {
3906 23812 : mem_csfilt_left = 0;
3907 23812 : mem_csfilt_right = 0;
3908 23812 : move16();
3909 23812 : move16();
3910 7643652 : FOR( k = 0; k < L_FRAME16k; k++ )
3911 : {
3912 : // excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k];
3913 7619840 : excNoisyEnvLeft[k] = add( mem_csfilt_left, mult_r( csfilt_num2[0], shl( excTmp2[k], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2
3914 7619840 : move16();
3915 : // mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k];
3916 7619840 : mem_csfilt_left = mult_r( neg_csfilt_den2[1], excNoisyEnvLeft[k] ); // Q_excTmp2
3917 : // excNoisyEnvRight[L_FRAME16k - k - 1] = mem_csfilt_right + csfilt_num2[0] * excTmp2[L_FRAME16k - k - 1];
3918 7619840 : excNoisyEnvRight[L_FRAME16k - k - 1] = add( mem_csfilt_right, mult_r( csfilt_num2[0], shl( excTmp2[L_FRAME16k - k - 1], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2
3919 7619840 : move16();
3920 : // mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1];
3921 7619840 : mem_csfilt_right = mult_r( neg_csfilt_den2[1], excNoisyEnvRight[L_FRAME16k - k - 1] ); // Q_excTmp2
3922 : }
3923 :
3924 23812 : alpha = 0;
3925 23812 : move16();
3926 : // step = 1.0f / L_FRAME16k;
3927 23812 : step = 102; // Q15
3928 23812 : move16();
3929 7643652 : FOR( k = 0; k < L_FRAME16k; k++ )
3930 : {
3931 : // excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + (1 - alpha) * excNoisyEnvRight[k];
3932 7619840 : excNoisyEnv[k] = add( mult_r( alpha, excNoisyEnvLeft[k] ), mult_r( sub( 32767, alpha ), excNoisyEnvRight[k] ) ); // Q_excTmp2
3933 7619840 : move16();
3934 7619840 : alpha = add( alpha, step );
3935 : }
3936 : }
3937 : }
3938 : ELSE
3939 :
3940 : {
3941 : /* Track the low band envelope */
3942 74636 : L_tmp = L_shl( *mem_csfilt, sub( Q_excTmp2, *Q_bwe_exc ) );
3943 74636 : move32();
3944 23958156 : FOR( i = 0; i < L_FRAME16k; i++ )
3945 : {
3946 23883520 : excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], shl( excTmp2[i], sub( Q_excTmp2, *Q_bwe_exc ) ) );
3947 23883520 : move16();
3948 : /* Work-around to avoid 0s for very small value*/
3949 23883520 : test();
3950 23883520 : test();
3951 23883520 : test();
3952 23883520 : test();
3953 23883520 : if ( excNoisyEnv[i] == 0 && ( L_tmp != 0 || ( csfilt_num2[0] != 0 && excTmp2[i] != 0 ) ) )
3954 : {
3955 5133 : excNoisyEnv[i] = 1;
3956 5133 : move16();
3957 : }
3958 : /* excNoisyEnv : Q_excTmp2,
3959 : *mem_csfilt: Q_excTmp2+16, excTmp2: Q_excTmp2, csfilt_num2[0] Q_excTmp2 */
3960 23883520 : L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_excTmp2 + 16 */
3961 : }
3962 74636 : *mem_csfilt = L_shr( L_tmp, sub( Q_excTmp2, *Q_bwe_exc ) );
3963 74636 : move32();
3964 : }
3965 102554 : test();
3966 102554 : IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
3967 4106 : {
3968 : /* generate gaussian (white) excitation */
3969 1318026 : FOR( k = 0; k < L_FRAME16k; k++ )
3970 : {
3971 1313920 : White_exc16k[k] = own_random( &bwe_seed[0] );
3972 1313920 : move16();
3973 : }
3974 :
3975 : /* normalize the amplitude of the gaussian excitation to that of the LB exc. */
3976 4106 : Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT_IN_Q49;
3977 4106 : move32();
3978 4106 : move32();
3979 4106 : pow22 = POW_EXC16k_WHTND_FX;
3980 4106 : Q_pow22 = -6;
3981 4106 : move16();
3982 : // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), White_exc16k, L_FRAME16k);
3983 4106 : Word16 pow1_exp = sub( Q31, Q_pow1 );
3984 4106 : Word32 temp_pow = Sqrt32( pow1, &pow1_exp );
3985 4106 : temp_pow = Mpy_32_32( temp_pow, pow22_inv );
3986 : /*Word16 out_exp;
3987 : Word32 temp_pow1 = root_a_over_b_fx(pow1, Q_pow1, pow22, Q_pow22, &out_exp);
3988 : temp_pow1 = L_shl(temp_pow1, out_exp);*/
3989 : // v_multc_fixed_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k);
3990 4106 : L_tmp = 0;
3991 4106 : move32();
3992 4106 : shift = getScaleFactor16( White_exc16k, L_FRAME16k );
3993 1318026 : FOR( k = 0; k < L_FRAME16k; k++ )
3994 : {
3995 1313920 : White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] );
3996 1313920 : move32();
3997 1313920 : White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], shift ) ); // Q_White_exc16k
3998 1313920 : move16();
3999 1313920 : L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
4000 : }
4001 4106 : Q_White_exc16k = add( shift, sub( 49 - 31, pow1_exp ) );
4002 4106 : Q_temp = norm_l( L_tmp );
4003 4106 : IF( L_tmp == 0 )
4004 : {
4005 0 : Q_temp = 31;
4006 0 : move16();
4007 : }
4008 : }
4009 : ELSE
4010 : {
4011 : /* create a random excitation - Reuse exc16k memory */
4012 98448 : White_exc16k = exc16k;
4013 98448 : move16();
4014 98448 : create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed ); // Q5
4015 98448 : create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); // Q5
4016 :
4017 98448 : L_tmp = L_deposit_l( 0 );
4018 98448 : tmp = add( *Q_bwe_exc, 1 );
4019 31601808 : FOR( k = 0; k < L_FRAME16k; k++ )
4020 : {
4021 31503360 : L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_excTmp2) +5 +1*/
4022 31503360 : White_exc16k_32[k] = L_tmp4; /* (Q_excTmp2) +5 +1*/
4023 31503360 : move32();
4024 31503360 : L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
4025 : }
4026 98448 : Q_temp = norm_l( L_tmp );
4027 98448 : IF( L_tmp == 0 )
4028 : {
4029 23 : Q_temp = 31;
4030 23 : move16();
4031 : }
4032 : /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/
4033 : /* White_exc16k in Q6 */
4034 :
4035 : /* calculate pow22 */
4036 : /* pow22=0.00001f */
4037 98448 : tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 );
4038 98448 : Word64 sum = W_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(*Q_bwe_exc-NOISE_QADJ) */
4039 98448 : Q_White_exc16k = getScaleFactor32( White_exc16k_32, L_FRAME16k );
4040 31601808 : FOR( k = 0; k < L_FRAME16k; k++ )
4041 : {
4042 :
4043 31503360 : White_exc16k[k] = extract_h( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); // Q_excTmp2 + 6 + Q_White_exc16k - 16 ==> Q_excTmp2 + Q_White_exc16k - 10
4044 31503360 : chk2 = L_or( chk2, White_exc16k_32[k] );
4045 : /* i: excNoisyEnv in (Q_excTmp2) */
4046 : /* i: White_exc16k in Q6 */
4047 : /* o: White_exc16k in (Q_White_exc16k) */
4048 : /* pow22 += White_exc16k[k] * White_exc16k[k]; */
4049 31503360 : sum = W_mac0_16_16( sum, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2 + Q_White_exc16k - 10)*/
4050 31503360 : move16();
4051 : }
4052 98448 : Q_pow22 = W_norm( sum );
4053 98448 : pow22 = W_extract_h( W_shl( sum, Q_pow22 ) ); // 2*(Q_excTmp2 + Q_White_exc16k - 10)+Q_pow22-32
4054 98448 : Q_pow22 = sub( add( Q_pow22, shl( sub( add( Q_White_exc16k, Q_excTmp2 ), 10 ), 1 ) ), 32 );
4055 98448 : Q_White_exc16k = add( Q_White_exc16k, sub( Q_excTmp2, 10 ) );
4056 : }
4057 :
4058 102554 : flag_plosive = 0;
4059 102554 : move16();
4060 102554 : test();
4061 102554 : test();
4062 102554 : test();
4063 102554 : IF( GE_32( extl_brate, SWB_TBE_2k8 ) || EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
4064 : {
4065 25652 : IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */
4066 : {
4067 0 : test();
4068 0 : IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
4069 : {
4070 0 : FOR( k = 0; k < L_FRAME16k; k++ )
4071 : {
4072 0 : White_exc16k_tmp[k] = round_fx( L_shl( White_exc16k_32[k], *Q_bwe_exc ) );
4073 0 : move16();
4074 : }
4075 :
4076 : /* calculate TD envelopes of exc16kWhtnd and White_exc16k */
4077 0 : find_td_envelope_fx( White_exc16k_tmp, L_FRAME16k, 20, NULL, EnvWhiteExc16k ); /* Q_bwe_exc */
4078 0 : find_td_envelope_fx( exc16kWhtnd, L_FRAME16k, 20, NULL, EnvExc16kWhtnd ); /* Q_bwe_exc */
4079 :
4080 0 : FOR( k = 0; k < L_FRAME4k; k++ )
4081 : {
4082 0 : EnvWhiteExc16k_4k[k] = EnvWhiteExc16k[4 * k]; /* Q_bwe_exc */
4083 0 : move16();
4084 0 : EnvExc16kWhtnd_4k[k] = EnvExc16kWhtnd[4 * k]; /* Q_bwe_exc */
4085 0 : move16();
4086 : }
4087 :
4088 : /* calculate the optimal mix factor */
4089 0 : c0 = c1 = c2 = c3 = c4 = c5 = 0; /* Q0 */
4090 0 : move32();
4091 0 : move32();
4092 0 : move32();
4093 0 : move32();
4094 0 : move32();
4095 0 : move32();
4096 :
4097 0 : temp1 = add( shl( *Q_bwe_exc, 1 ), 1 );
4098 0 : temp2 = add( add( Q_shb, *Q_bwe_exc ), 1 );
4099 0 : temp3 = add( shl( Q_shb, 1 ), 1 );
4100 0 : FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ )
4101 : {
4102 : // c0_part[i] = sum2_f( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
4103 0 : c0_part[i] = L_shr( sum2_fx( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */
4104 0 : move32();
4105 : // c1_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
4106 0 : c1_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */
4107 0 : move32();
4108 : // c2_part[i] = sum2_f( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
4109 0 : c2_part[i] = L_shr( sum2_fx( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */
4110 0 : move32();
4111 : // c3_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
4112 0 : c3_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */
4113 0 : move32();
4114 : // c4_part[i] = 2.0f * dotp( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
4115 0 : c4_part[i] = L_shr( Dot_product( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), sub( temp1, 1 ) ); /* Q0 */
4116 0 : move32();
4117 : // c5_part[i] = sum2_f( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
4118 0 : c5_part[i] = L_shr( sum2_fx( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp3 ); /* Q0 */
4119 0 : move32();
4120 :
4121 0 : c0 = L_add( c0, c0_part[i] );
4122 0 : c1 = L_add( c1, c1_part[i] );
4123 0 : c2 = L_add( c2, c2_part[i] );
4124 0 : c3 = L_add( c3, c3_part[i] );
4125 0 : c4 = L_add( c4, c4_part[i] );
4126 0 : c5 = L_add( c5, c5_part[i] );
4127 : }
4128 :
4129 : // den = 4.0f * c0 * c2 - c4 * c4;
4130 0 : W_tmp = W_sub( W_shl( W_mult0_32_32( c0, c2 ), 2 ), W_mult0_32_32( c4, c4 ) );
4131 0 : den_e = 63;
4132 0 : move16();
4133 0 : shift = W_norm( W_tmp );
4134 0 : den = W_extract_h( W_shl( W_tmp, shift ) );
4135 0 : den_e = sub( den_e, shift );
4136 :
4137 0 : IF( den == 0 )
4138 : {
4139 0 : den = 1;
4140 0 : move32();
4141 0 : den_e = 31;
4142 0 : move16();
4143 : }
4144 :
4145 : // g1 = ( c3 * c4 - 2 * c1 * c2 ) / den;
4146 0 : W_tmp = W_sub( W_mult0_32_32( c3, c4 ), W_shl( W_mult0_32_32( c1, c2 ), 1 ) );
4147 0 : g1_e = 63;
4148 0 : move16();
4149 0 : shift = W_norm( W_tmp );
4150 0 : L_tmp = W_extract_h( W_shl( W_tmp, shift ) );
4151 0 : g1_e = sub( g1_e, shift );
4152 :
4153 0 : g1 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e );
4154 0 : g1_e = sub( add( tmp_e, g1_e ), den_e );
4155 :
4156 : // g2 = ( c1 * c4 - 2 * c0 * c3 ) / den;
4157 0 : W_tmp = W_sub( W_mult0_32_32( c1, c4 ), W_shl( W_mult0_32_32( c0, c3 ), 1 ) );
4158 0 : g2_e = 63;
4159 0 : move16();
4160 0 : shift = W_norm( W_tmp );
4161 0 : L_tmp = W_extract_h( W_shl( W_tmp, shift ) );
4162 0 : g2_e = sub( g2_e, shift );
4163 :
4164 0 : g2 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e );
4165 0 : g2_e = sub( add( tmp_e, g2_e ), den_e );
4166 :
4167 : // *Env_error = 0.0f;
4168 0 : *Env_error = 0;
4169 0 : move16();
4170 0 : flag_plosive = 0;
4171 0 : move16();
4172 0 : FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ )
4173 : {
4174 : // Env_error_part[i] = c5_part[i] + g1 * g1 * c0_part[i] + g1 * c1_part[i] + g2 * g2 * c2_part[i] + g2 * c3_part[i] + g1 * g2 * c4_part[i];
4175 0 : L_tmp = BASOP_Util_Add_Mant32Exp( c5_part[i], 31, Mpy_32_32( L_mult( g1, g1 ), c0_part[i] ), add( shl( g1_e, 1 ), 31 ), &tmp_e );
4176 0 : L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c1_part[i], g1 ), add( 31, g1_e ), &tmp_e );
4177 0 : L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g2, g2 ), c2_part[i] ), add( shl( g2_e, 1 ), 31 ), &tmp_e );
4178 0 : L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c3_part[i], g2 ), add( 31, g2_e ), &tmp_e );
4179 0 : L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g1, g2 ), c4_part[i] ), add( add( g1_e, g2_e ), 31 ), &tmp_e );
4180 :
4181 : // Env_error_part[i] = L_shr( L_tmp, 31 - tmp_e ); // Check Exponent
4182 0 : Env_error_part[i] = extract_h( L_shr_sat( L_tmp, sub( Q15, tmp_e ) ) ); /* Q0 */
4183 0 : move16();
4184 :
4185 : // *Env_error += Env_error_part[i];
4186 0 : *Env_error = add_sat( *Env_error, Env_error_part[i] ); /* Q0 */
4187 0 : move16();
4188 :
4189 0 : if ( GT_16( Env_error_part[i], THR_ENV_ERROR_PLOSIVE_FX ) ) // Check which Q
4190 : {
4191 : /* envelope error is too high -> likely a plosive */
4192 0 : flag_plosive = 1;
4193 0 : move16();
4194 : }
4195 : }
4196 :
4197 0 : IF( flag_plosive )
4198 : {
4199 : /* plosive detected -> set the mixing factor to 0 */
4200 0 : *vf_ind = 0;
4201 0 : move16();
4202 0 : mix_factor = 0;
4203 0 : move16();
4204 : }
4205 : ELSE
4206 : {
4207 : /* normalize gain */
4208 : // g = g2 / ( g1 + g2 );
4209 0 : tmp1_e = BASOP_Util_Add_MantExp( g1, g1_e, g2, g2_e, &tmp );
4210 0 : IF( tmp == 0 )
4211 : {
4212 0 : tmp = 1;
4213 0 : move16();
4214 0 : tmp1_e = 15;
4215 0 : move16();
4216 : }
4217 0 : g = BASOP_Util_Divide1616_Scale( g2, tmp, &tmp_e );
4218 0 : g_e = sub( add( tmp_e, g2_e ), tmp1_e );
4219 :
4220 : /* quantization of the mixing factor */
4221 0 : cbsize = 1 << NUM_BITS_SHB_VF;
4222 0 : move16();
4223 : // delta = 1.0f / ( cbsize - 1 );
4224 0 : delta = 2341; /* Q14 */
4225 0 : move16();
4226 : // if ( g > 1.0f )
4227 0 : IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), ONE_IN_Q31, 0 ) > 0 )
4228 : {
4229 : // g = 1.0f;
4230 0 : g = MAX16B; /* Q15 */
4231 : }
4232 : // else if ( g < shl( delta, ( 15 - g_e ) - 14 ) )
4233 0 : ELSE IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), delta, 17 ) < 0 )
4234 : {
4235 : /* prevent low gains to be quantized to 0 as this is reserved for plosives */
4236 : // g = delta;
4237 0 : g = shl( delta, 1 ); /* Q15 */
4238 : }
4239 :
4240 0 : *vf_ind = usquant_fx( g, &mix_factor, 0, delta, cbsize );
4241 0 : move16();
4242 : }
4243 : }
4244 : ELSE
4245 : {
4246 0 : Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k,
4247 0 : ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind );
4248 0 : tmp = voiceFacEst[0];
4249 0 : tmp2 = MAX_16;
4250 0 : move16();
4251 0 : move16();
4252 0 : if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
4253 : {
4254 0 : tmp2 = 26214 /*0.8f Q15*/;
4255 0 : move16();
4256 : }
4257 : }
4258 : }
4259 : ELSE /* decoder side */
4260 : {
4261 25652 : test();
4262 25652 : IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
4263 : {
4264 4106 : IF( *vf_ind == 0 )
4265 : {
4266 : // mix_factor = 0.0f;
4267 21 : mix_factor = 0;
4268 21 : move16();
4269 21 : flag_plosive = 1;
4270 21 : move16();
4271 : }
4272 : ELSE
4273 : {
4274 : // mix_factor = usdequant(*vf_ind, 0.0f, 1.0f / ((1 << NUM_BITS_SHB_VF) - 1));
4275 4085 : mix_factor = usdequant_fx( *vf_ind, 0, 2341 );
4276 : }
4277 : }
4278 : ELSE
4279 : {
4280 : /* *vf_ind is an integer scale by 0.125f*/
4281 21546 : tmp = shl( *vf_ind, ( 15 - 3 ) );
4282 21546 : tmp2 = MAX_16;
4283 21546 : move16();
4284 21546 : IF( LE_16( tmp, 22938 /*0.7f Q15*/ ) )
4285 : {
4286 21536 : tmp2 = 26214 /*0.8f Q15*/;
4287 21536 : move16();
4288 : }
4289 : }
4290 : }
4291 25652 : test();
4292 25652 : IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) )
4293 : {
4294 21546 : voice_factors[0] = mult_r( voice_factors[0], tmp2 );
4295 21546 : move16();
4296 21546 : voice_factors[1] = mult_r( voice_factors[1], tmp2 );
4297 21546 : move16();
4298 21546 : voice_factors[2] = mult_r( voice_factors[2], tmp2 );
4299 21546 : move16();
4300 21546 : voice_factors[3] = mult_r( voice_factors[3], tmp2 );
4301 21546 : move16();
4302 21546 : voice_factors[4] = mult_r( voice_factors[4], tmp2 );
4303 21546 : move16();
4304 : }
4305 : }
4306 102554 : test();
4307 102554 : IF( GE_16( element_mode, IVAS_CPE_DFT ) && nlExc16k != NULL )
4308 : {
4309 : /* save buffers for IC-BWE */
4310 : // mvr2r(exc16kWhtnd, nlExc16k, L_FRAME16k);
4311 16066 : Copy( exc16kWhtnd, nlExc16k, L_FRAME16k );
4312 : // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), mixExc16k, L_FRAME16k);
4313 : /*Word16 temp_fac = divide3232(L_shr(pow1, Q_pow1), pow22);
4314 : Word16 temp_fac_exp = 0;
4315 : temp_fac = Sqrt16(temp_fac, &temp_fac_exp);*/
4316 16066 : L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
4317 16066 : Word16 temp_fac = round_fx_sat( L_shl_sat( L_tmp, exp ) ); // Q15
4318 16066 : shift = sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k );
4319 : // v_multc_fixed_16_16(White_exc16k,shr(temp_fac, temp_fac_exp) , mixExc16k, L_FRAME16k);
4320 5157186 : FOR( k = 0; k < L_FRAME16k; k++ )
4321 : {
4322 5141120 : mixExc16k[k] = mult_r( shl_sat( White_exc16k[k], shift ), temp_fac );
4323 5141120 : move16();
4324 : }
4325 : }
4326 :
4327 102554 : tmp = sub( Q_temp, 3 );
4328 32919834 : FOR( k = 0; k < L_FRAME16k; k++ )
4329 : {
4330 32817280 : White_exc16k_FB[k] = White_exc16k[k]; /* Q_White_exc16k */
4331 : }
4332 102554 : prev_Q_bwe_exc_fb = *Q_bwe_exc_fb;
4333 102554 : move16();
4334 102554 : *Q_bwe_exc_fb = Q_White_exc16k;
4335 102554 : move16();
4336 102554 : *tbe_demph = shl_sat( *tbe_demph, sub( Q_White_exc16k, sub( *Q_bwe_exc, NOISE_QADJ ) ) );
4337 102554 : deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph );
4338 102554 : *tbe_demph = shl_sat( *tbe_demph, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) );
4339 :
4340 102554 : Q_exc16kWhtnd = getScaleFactor16( exc16kWhtnd, L_FRAME16k );
4341 102554 : Q_exc16kWhtnd = add( Q_exc16kWhtnd, *Q_bwe_exc );
4342 :
4343 102554 : shift = getScaleFactor16( White_exc16k, L_FRAME16k );
4344 :
4345 102554 : shift = s_min( Q_exc16kWhtnd, add( shift, Q_White_exc16k ) );
4346 102554 : scale_sig( exc16kWhtnd, L_FRAME16k, sub( shift, *Q_bwe_exc ) );
4347 102554 : scale_sig( White_exc16k, L_FRAME16k, sub( shift, Q_White_exc16k ) );
4348 :
4349 102554 : Q_exc16kWhtnd = Q_White_exc16k = shift;
4350 102554 : move16();
4351 102554 : move16();
4352 102554 : *tbe_premph = shl_sat( *tbe_premph, sub( Q_White_exc16k, sub( *Q_bwe_exc, NOISE_QADJ ) ) );
4353 102554 : move16();
4354 102554 : test();
4355 102554 : IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
4356 : {
4357 4106 : IF( !flag_plosive ) /* use only LB excitation in case of plosives */
4358 : {
4359 : /* re-scale gaussian excitation at the beginning to gradually move from old energy to new energy */
4360 : // old_scale = (float)sqrt(*prev_pow_exc16kWhtnd / pow1);
4361 : // old_scale = divide3232(*prev_pow_exc16kWhtnd, pow1); // exp = Q15 - (Q_pow1)
4362 : // Word16 old_scale_exp = Q15 - (Q_pow1);
4363 : // old_scale = Sqrt16(old_scale, &old_scale_exp);
4364 : // old_scale = shl(old_scale, old_scale_exp); //Q15
4365 4085 : L_tmp = root_a_over_b_fx( *prev_pow_exc16kWhtnd, 0, pow1, Q_pow1, &exp );
4366 4085 : old_scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); // Q15
4367 : // new_scale = 1.0f;
4368 4085 : new_scale = 32767;
4369 4085 : move16();
4370 : // step_scale = (new_scale - old_scale) / (L_FRAME16k / 2);
4371 4085 : step_scale = mult_r( sub( new_scale, old_scale ), 205 );
4372 4085 : scale = old_scale;
4373 4085 : move16();
4374 : /* interpolate between the old and the new value of the mixing factor */
4375 4085 : old_fact = *prev_mix_factor;
4376 4085 : move16();
4377 4085 : new_fact = mix_factor;
4378 4085 : move16();
4379 : // step = (new_fact - old_fact) / (L_FRAME16k / 2);
4380 4085 : step = mult_r( sub( new_fact, old_fact ), 205 );
4381 4085 : fact = old_fact;
4382 4085 : move16();
4383 : /* mixing of LB and gaussian excitation in the first half of the frame */
4384 657685 : FOR( k = 0; k < L_FRAME16k / 2; k++ )
4385 : {
4386 653600 : exc16kWhtnd[k] = mac_r( L_mult( fact, mult_r( White_exc16k[k], scale ) ),
4387 653600 : sub( 32767, fact ), exc16kWhtnd[k] ); // Q_exc16kWhtnd
4388 653600 : move16();
4389 653600 : fact = add_sat( fact, step );
4390 653600 : scale = add_sat( scale, step_scale );
4391 : }
4392 :
4393 : /* mixing of LB and gaussian excitation in the second half of the frame */
4394 657685 : FOR( ; k < L_FRAME16k; k++ )
4395 : {
4396 653600 : exc16kWhtnd[k] = mac_r( L_mult( new_fact, White_exc16k[k] ),
4397 653600 : sub( 32767, new_fact ), exc16kWhtnd[k] ); // Q_exc16kWhtnd
4398 653600 : move16();
4399 : }
4400 : }
4401 : // preemph(exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph);
4402 4106 : PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph );
4403 : }
4404 : ELSE
4405 : {
4406 98448 : test();
4407 98448 : IF( EQ_16( coder_type, UNVOICED ) || EQ_16( MSFlag, 1 ) )
4408 : {
4409 6027 : L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
4410 6027 : test();
4411 6027 : if ( chk1 == 0 && chk2 == 0 )
4412 : {
4413 0 : L_tmp = 0;
4414 0 : move32();
4415 : }
4416 6027 : scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */
4417 1934667 : FOR( k = 0; k < L_FRAME16k; k++ )
4418 : {
4419 1928640 : exc16kWhtnd[k] = mult_r_sat( White_exc16k[k], scale );
4420 1928640 : move16();
4421 : }
4422 6027 : PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph );
4423 : /* i/o: exc16kWhtnd (Q_exc16kWhtnd) */
4424 : /* i/o: tbe_premph (Q_exc16kWhtnd) */
4425 : }
4426 : ELSE
4427 : {
4428 : Word16 nbSubFr, lSubFr;
4429 : Word16 tempQ15;
4430 : Word32 tempQ31;
4431 92421 : nbSubFr = NB_SUBFR16k;
4432 92421 : lSubFr = ( L_FRAME16k / NB_SUBFR16k );
4433 92421 : move16();
4434 92421 : move16();
4435 92421 : IF( LT_32( extl_brate, SWB_TBE_2k8 ) )
4436 : {
4437 70883 : nbSubFr = NB_SUBFR;
4438 70883 : move16();
4439 70883 : lSubFr = ( L_FRAME16k / NB_SUBFR );
4440 70883 : move16();
4441 : }
4442 92421 : k = 0;
4443 92421 : move16();
4444 483643 : FOR( i = 0; i < nbSubFr; i++ )
4445 : {
4446 391222 : test();
4447 391222 : IF( EQ_16( coder_type, VOICED ) && ( LT_32( extl_brate, SWB_TBE_2k8 ) ) )
4448 : {
4449 23092 : exp = 0;
4450 23092 : move16();
4451 23092 : tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */
4452 23092 : temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
4453 23092 : exp = 0;
4454 23092 : move16();
4455 23092 : tempQ15 = Sqrt16( temp, &exp ); /* Q15 */
4456 23092 : temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
4457 :
4458 : /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */
4459 23092 : temp = sub( MAX_16, temp );
4460 23092 : tempQ31 = Mult_32_16( pow1, temp );
4461 23092 : L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
4462 23092 : temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
4463 : }
4464 : ELSE
4465 : {
4466 : /* Adjust noise mixing for formant sharpening filter */
4467 368130 : tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac );
4468 : /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */
4469 368130 : vf_tmp = sub( MAX_16, tempQ15 );
4470 368130 : vf_tmp = mult( voice_factors[i], vf_tmp );
4471 :
4472 368130 : exp = 0;
4473 368130 : move16();
4474 368130 : tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */
4475 368130 : temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */
4476 :
4477 : /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */
4478 368130 : temp = sub( MAX_16, vf_tmp );
4479 368130 : tempQ31 = Mult_32_16( pow1, temp );
4480 368130 : L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp );
4481 368130 : temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */
4482 : }
4483 :
4484 29965942 : FOR( j = 0; j < lSubFr; j++ )
4485 : {
4486 : /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */
4487 29574720 : L_tmp = L_mult( temp2, White_exc16k[k + j] );
4488 29574720 : exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] );
4489 29574720 : move16();
4490 : /* Q_exc16kWhtnd */
4491 : }
4492 391222 : k = add( k, lSubFr );
4493 :
4494 : /* estimate the pre-emph factor */
4495 391222 : tempQ15 = sub( MAX_16, voice_factors[i] );
4496 391222 : exp = 0;
4497 391222 : move16();
4498 391222 : temp = Sqrt16( tempQ15, &exp );
4499 391222 : temp = shl( temp, sub( exp, 1 ) );
4500 :
4501 391222 : temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */
4502 391222 : temp = div_s( temp, temp2 ); /* Q15 */
4503 391222 : temp = mult_r( PREEMPH_FAC, temp );
4504 391222 : PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph );
4505 : /* exc16kWhtnd: Q_exc16kWhtnd;
4506 : tbe_premph: Q_exc16kWhtnd*/
4507 : }
4508 : }
4509 : }
4510 102554 : *tbe_premph = shl_sat( *tbe_premph, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) );
4511 102554 : move16();
4512 102554 : Scale_sig( White_exc16k, L_FRAME16k, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) );
4513 102554 : Scale_sig( exc16kWhtnd, L_FRAME16k, sub( *Q_bwe_exc, Q_White_exc16k ) );
4514 :
4515 102554 : IF( LT_32( extl_brate, SWB_TBE_2k8 ) )
4516 : {
4517 81008 : Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 );
4518 : /* i: exc16kWhtnd in Q_bwe_exc */
4519 : /* o: excSHB in Q_bwe_exc */
4520 : }
4521 : ELSE
4522 : {
4523 21546 : set16_fx( zero_mem, 0, LPC_SHB_ORDER );
4524 :
4525 21546 : Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 );
4526 21546 : tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
4527 21546 : Scale_sig( tempSHB, 80, tmp );
4528 21546 : syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
4529 21546 : move32();
4530 21546 : syn_shb_ener_sf_q[0] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
4531 21546 : move16();
4532 :
4533 21546 : Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 );
4534 21546 : tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
4535 21546 : Scale_sig( tempSHB, 80, tmp );
4536 21546 : syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
4537 21546 : move32();
4538 21546 : syn_shb_ener_sf_q[1] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
4539 21546 : move16();
4540 :
4541 21546 : Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 );
4542 21546 : tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
4543 21546 : Scale_sig( tempSHB, 80, tmp );
4544 21546 : syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
4545 21546 : move32();
4546 21546 : syn_shb_ener_sf_q[2] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
4547 21546 : move16();
4548 :
4549 21546 : Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 );
4550 21546 : tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 );
4551 21546 : Scale_sig( tempSHB, 80, tmp );
4552 21546 : syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 );
4553 21546 : move32();
4554 21546 : syn_shb_ener_sf_q[3] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 );
4555 21546 : move16();
4556 :
4557 21546 : tmp2 = s_min( s_min( syn_shb_ener_sf_q[0], syn_shb_ener_sf_q[1] ), s_min( syn_shb_ener_sf_q[3], syn_shb_ener_sf_q[2] ) );
4558 21546 : syn_shb_ener_sf[0] = L_shl( syn_shb_ener_sf[0], sub( tmp2, syn_shb_ener_sf_q[0] ) );
4559 21546 : move32();
4560 21546 : syn_shb_ener_sf[1] = L_shl( syn_shb_ener_sf[1], sub( tmp2, syn_shb_ener_sf_q[1] ) );
4561 21546 : move32();
4562 21546 : syn_shb_ener_sf[2] = L_shl( syn_shb_ener_sf[2], sub( tmp2, syn_shb_ener_sf_q[2] ) );
4563 21546 : move32();
4564 21546 : syn_shb_ener_sf[3] = L_shl( syn_shb_ener_sf[3], sub( tmp2, syn_shb_ener_sf_q[3] ) );
4565 21546 : move32();
4566 :
4567 : /* i: exc16kWhtnd in Q_bwe_exc */
4568 : /* o: tempSHB in Q_bwe_exc */
4569 : /* o: syn_shb_ener_sf in tmp2 */
4570 21546 : IF( LE_32( bitrate, MAX_ACELP_BRATE ) )
4571 : {
4572 21546 : L_tmp = sum32_fx( syn_shb_ener_sf, 4 );
4573 :
4574 : /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */
4575 21546 : tmp = shl( Q_shb, 1 );
4576 21546 : L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */
4577 :
4578 21546 : *Q_bwe_exc = sub( *Q_bwe_exc, exp );
4579 21546 : move16(); /* compensate for the exp shift */
4580 21546 : tmp2 = add( prev_Q_bwe_syn, n_mem2 );
4581 21546 : IF( GT_16( *Q_bwe_exc, tmp2 ) )
4582 : {
4583 2 : L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) );
4584 2 : *Q_bwe_exc = tmp2;
4585 2 : move16();
4586 : }
4587 6916266 : FOR( i = 0; i < L_FRAME16k; i++ )
4588 : {
4589 6894720 : L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */
4590 6894720 : exc16kWhtnd[i] = round_fx( L_tmp3 ); /* *Q_bwe_exc - exp */
4591 6894720 : move16();
4592 : }
4593 : }
4594 : /* i: L_tmp2 in (Q31-exp) */
4595 : /* i: exc16kWhtnd in Q_bwe_exc */
4596 : /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp) */
4597 :
4598 : /* Rescale the past memories: LP synth and SHB look ahead buffers */
4599 21546 : tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn );
4600 237006 : FOR( i = 0; i < LPC_SHB_ORDER; i++ )
4601 : {
4602 215460 : state_lpc_syn[i] = shl_sat( state_lpc_syn[i], tmp );
4603 215460 : move16();
4604 : }
4605 452466 : FOR( i = -L_SHB_LAHEAD; i < 0; i++ )
4606 : {
4607 430920 : excSHB[i] = shl_sat( excSHB[i], tmp );
4608 430920 : move16();
4609 : }
4610 : /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */
4611 :
4612 21546 : Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 );
4613 21546 : Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 );
4614 21546 : Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 );
4615 21546 : Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 );
4616 : /* i: exc16kWhtnd in (Q_bwe_exc) */
4617 : /* o: excSHB in (Q_bwe_exc) */
4618 : }
4619 :
4620 102554 : IF( EQ_16( extl, FB_TBE ) )
4621 : {
4622 39990 : tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb );
4623 39990 : Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp );
4624 39990 : Scale_sig( fb_tbe_demph, 1, tmp );
4625 39990 : Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 );
4626 : /* i: White_exc16k_FB in (14-n2) */
4627 : /* o: White_exc16k_FB_temp in (14-n2) */
4628 :
4629 439890 : FOR( i = 0; i < 10; i++ )
4630 : {
4631 13196700 : FOR( j = 0; j < 32; ++j )
4632 : {
4633 12796800 : White_exc16k_FB_temp[i * 32 + j] = mult_r_sat( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] );
4634 12796800 : move16();
4635 : }
4636 : }
4637 :
4638 39990 : *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 );
4639 39990 : move16(); /**Q_bwe_exc_fb +35 +1 -16*/
4640 39990 : flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k );
4641 :
4642 39990 : deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph );
4643 : }
4644 : ELSE
4645 : {
4646 62564 : set16_fx( White_exc16k_FB, 0, L_FRAME16k );
4647 : }
4648 :
4649 102554 : *prev_pow_exc16kWhtnd = L_shr_sat( pow1, Q_pow1 ); // power goes above MAX_32
4650 102554 : *prev_mix_factor = mix_factor;
4651 102554 : return;
4652 : }
4653 :
4654 : /*====================================================================================*/
4655 : /* FUNCTION : void GenSHBSynth_fx() */
4656 : /*------------------------------------------------------------------------------------*/
4657 : /* PURPOSE :Generate 32 KHz sampled highband component from synthesized highband*/
4658 : /*------------------------------------------------------------------------------------*/
4659 : /* INPUT ARGUMENTS */
4660 : /* _(Word16*)input_synspeech :input synthesized speech */
4661 : /* _(Word16) L_frame :ACELP frame length */
4662 : /*------------------------------------------------------------------------------------*/
4663 : /* OUTPUT ARGUMENTS : */
4664 : /* _(Word16*)shb_syn_speech_32k : output highband component */
4665 : /*------------------------------------------------------------------------------------*/
4666 : /* INPUT/OUTPUT ARGUMENTS : */
4667 : /* _(Word16[]) allpass_mem : memory */
4668 : /* _(Word32[]) Hilbert_Mem : memory */
4669 : /*------------------------------------------------------------------------------------*/
4670 : /* RETURN ARGUMENTS : */
4671 : /* _ None */
4672 : /*------------------------------------------------------------------------------------*/
4673 :
4674 3146 : void GenSHBSynth_fx(
4675 : const Word16 *input_synspeech, /* i : input synthesized speech */
4676 : Word16 *shb_syn_speech_32k, /* o : output highband component */
4677 : Word32 Hilbert_Mem[], /* i/o: memory */
4678 : Word16 allpass_mem[], /* i/o: memory */
4679 : const Word16 L_frame, /* i : ACELP frame length */
4680 : Word16 *syn_dm_phase )
4681 : {
4682 : Word16 i, speech_buf_32k[L_FRAME32k];
4683 : Word16 maxm, nor, nor32, shift;
4684 : Word16 input_synspeech_temp[L_FRAME16k];
4685 : Word32 maxm32;
4686 :
4687 :
4688 3146 : maxm = 0;
4689 3146 : move16();
4690 3146 : maxm32 = L_deposit_l( 0 );
4691 1009866 : FOR( i = 0; i < L_FRAME16k; i++ )
4692 1006720 : maxm = s_max( maxm, abs_s( input_synspeech[i] ) );
4693 22022 : FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
4694 18876 : maxm = s_max( maxm, abs_s( allpass_mem[i] ) );
4695 69212 : FOR( i = 0; i < HILBERT_MEM_SIZE; i++ )
4696 66066 : maxm32 = L_max( maxm32, L_abs( Hilbert_Mem[i] ) );
4697 3146 : nor = sub( norm_s( maxm ), 3 );
4698 3146 : nor32 = sub( norm_l( maxm32 ), 3 );
4699 3146 : if ( maxm == 0 )
4700 : {
4701 0 : nor = 15;
4702 0 : move16();
4703 : }
4704 3146 : if ( maxm32 == 0 )
4705 : {
4706 2417 : nor32 = 31;
4707 2417 : move16();
4708 : }
4709 3146 : shift = s_min( nor, nor32 );
4710 :
4711 3146 : Copy_Scale_sig( input_synspeech, input_synspeech_temp, L_FRAME16k, shift );
4712 3146 : Scale_sig( allpass_mem, 2 * ALLPASSSECTIONS_STEEP, shift );
4713 3146 : Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, shift );
4714 3146 : Interpolate_allpass_steep_fx( input_synspeech_temp, allpass_mem, L_FRAME16k, speech_buf_32k );
4715 : /*modify_Fs_fx( input_synspeech, L_FRAME16k, 16000, speech_buf_32k, 32000, allpass_mem, 0);*/
4716 3146 : IF( EQ_16( L_frame, L_FRAME ) )
4717 : {
4718 : /* 12.8 k core flipping and downmixing */
4719 1594 : flip_and_downmix_generic_fx( speech_buf_32k, shb_syn_speech_32k, L_FRAME32k,
4720 : Hilbert_Mem,
4721 : Hilbert_Mem + HILBERT_ORDER1,
4722 : Hilbert_Mem + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ),
4723 : syn_dm_phase );
4724 : }
4725 : ELSE
4726 : {
4727 : /* 16 k core flipping and no downmixing */
4728 498192 : FOR( i = 0; i < L_FRAME32k; i = i + 2 )
4729 : {
4730 496640 : shb_syn_speech_32k[i] = negate( speech_buf_32k[i] );
4731 496640 : move16();
4732 496640 : shb_syn_speech_32k[i + 1] = speech_buf_32k[i + 1];
4733 496640 : move16();
4734 : }
4735 : }
4736 :
4737 3146 : Scale_sig( shb_syn_speech_32k, L_FRAME32k, negate( shift ) );
4738 3146 : Scale_sig( allpass_mem, 2 * ALLPASSSECTIONS_STEEP, negate( shift ) );
4739 3146 : Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, negate( shift ) );
4740 :
4741 3146 : return;
4742 : }
4743 :
4744 :
4745 : /* IVAS 32-bit variant */
4746 111110 : void GenSHBSynth_fx32(
4747 : const Word32 *input_synspeech, /* i : input synthesized speech Qx*/
4748 : Word32 *shb_syn_speech_32k, /* o : output highband component Qx*/
4749 : Word32 Hilbert_Mem[], /* i/o: memory Qx*/
4750 : Word32 state_lsyn_filt_shb_local[], /* i/o: memory Qx*/
4751 : const Word16 L_frame, /* i : ACELP frame length */
4752 : Word16 *syn_dm_phase )
4753 : {
4754 : Word32 speech_buf_32k[L_FRAME32k];
4755 : Word16 i;
4756 :
4757 111110 : Word16 shift = 0;
4758 : Word32 maxm32, input_synspeech_temp[L_FRAME16k];
4759 111110 : move16();
4760 :
4761 : /* find the maximum value and derive the shift to improve precision of the Hilber filter */
4762 111110 : maxm32 = L_deposit_l( 0 );
4763 35666310 : FOR( i = 0; i < L_FRAME16k; i++ )
4764 : {
4765 35555200 : maxm32 = L_max( maxm32, L_abs( input_synspeech[i] ) );
4766 : }
4767 :
4768 777770 : FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ )
4769 : {
4770 666660 : maxm32 = L_max( maxm32, L_abs( state_lsyn_filt_shb_local[i] ) );
4771 : }
4772 :
4773 2444420 : FOR( i = 0; i < HILBERT_MEM_SIZE; i++ )
4774 : {
4775 2333310 : maxm32 = L_max( maxm32, L_abs( Hilbert_Mem[i] ) );
4776 : }
4777 :
4778 111110 : IF( maxm32 != 0 )
4779 : {
4780 110970 : shift = sub( norm_l( maxm32 ), 3 );
4781 :
4782 110970 : Copy_Scale_sig32( input_synspeech, input_synspeech_temp, L_FRAME16k, shift );
4783 110970 : Scale_sig32( state_lsyn_filt_shb_local, 2 * ALLPASSSECTIONS_STEEP, shift );
4784 110970 : Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, shift );
4785 : }
4786 : ELSE
4787 : {
4788 140 : Copy32( input_synspeech, input_synspeech_temp, L_FRAME16k );
4789 : }
4790 :
4791 111110 : Interpolate_allpass_steep_fx32( input_synspeech_temp, state_lsyn_filt_shb_local, L_FRAME16k, speech_buf_32k );
4792 :
4793 111110 : IF( EQ_16( L_frame, L_FRAME ) )
4794 : {
4795 48570 : flip_and_downmix_generic_fx32( speech_buf_32k, shb_syn_speech_32k, L_FRAME32k, Hilbert_Mem, Hilbert_Mem + HILBERT_ORDER1, Hilbert_Mem + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ), syn_dm_phase );
4796 : }
4797 : ELSE
4798 : {
4799 40088140 : FOR( i = 0; i < L_FRAME32k; i++ )
4800 : {
4801 : // shb_syn_speech_32k[i] = ( ( i % 2 ) == 0 ) ? ( -speech_buf_32k[i] ) : ( speech_buf_32k[i] );
4802 40025600 : IF( i % 2 == 0 )
4803 : {
4804 20012800 : shb_syn_speech_32k[i] = L_negate( speech_buf_32k[i] ); // Qx
4805 : }
4806 : ELSE
4807 : {
4808 20012800 : shb_syn_speech_32k[i] = speech_buf_32k[i]; // Qx
4809 : }
4810 40025600 : move32();
4811 : }
4812 : }
4813 :
4814 111110 : IF( maxm32 != 0 )
4815 : {
4816 110970 : Scale_sig32( shb_syn_speech_32k, L_FRAME32k, negate( shift ) );
4817 110970 : Scale_sig32( state_lsyn_filt_shb_local, 2 * ALLPASSSECTIONS_STEEP, negate( shift ) );
4818 110970 : Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, negate( shift ) );
4819 : }
4820 :
4821 111110 : return;
4822 : }
4823 :
4824 :
4825 : /*==============================================================================*/
4826 : /* FUNCTION : void ScaleShapedSHB_fx() */
4827 : /*------------------------------------------------------------------------------*/
4828 : /* PURPOSE : */
4829 : /*------------------------------------------------------------------------------*/
4830 : /* INPUT ARGUMENTS : */
4831 : /* _(Word16) length : SHB overlap length */
4832 : /* _(Word16*) subgain : subframe gain Q15 */
4833 : /* _(Word32) frame_gain : frame gain Q18 */
4834 : /* _(Word16*) win : window Q15 */
4835 : /* _(Word16*) subwin : subframes window Q15 */
4836 : /* _(Word16) Q_bwe_exc : Q format */
4837 : /*------------------------------------------------------------------------------*/
4838 : /* OUTPUT ARGUMENTS : */
4839 : /* _(Word16) Qx : Q factor of output */
4840 : /*------------------------------------------------------------------------------*/
4841 : /* INPUT/OUTPUT ARGUMENTS : */
4842 : /* _(Word16*) synSHB : synthesized shb signal input Q_bwe_exc / output Qx */
4843 : /* _(Word16*) overlap : buffer for overlap-add Q_bwe_exc /output Qx */
4844 : /*------------------------------------------------------------------------------*/
4845 : /* RETURN ARGUMENTS : */
4846 : /* _ None */
4847 : /*------------------------------------------------------------------------------*/
4848 : /* CALLED FROM : RX */
4849 : /*==============================================================================*/
4850 :
4851 103912 : void ScaleShapedSHB_fx(
4852 : const Word16 length, /* i : SHB overlap length */
4853 : Word16 *synSHB, /* i/o : synthesized shb signal Q(Q_bwe_exc)/Q(Qx) */
4854 : Word16 *overlap, /* i/o : buffer for overlap-add Q(Q_bwe_exc)/Q(Qx) */
4855 : const Word16 *subgain, /* i : subframe gain Q15 */
4856 : const Word32 frame_gain, /* i : frame gain Q18 */
4857 : const Word16 *win, /* i : window Q15 */
4858 : const Word16 *subwin, /* i : subframes window Q15 */
4859 : Word16 *Q_bwe_exc,
4860 : Word16 *Qx, /* o : newly computed Q factor for synSHB */
4861 : Word16 n_mem3,
4862 : Word16 prev_Q_bwe_syn2 )
4863 : {
4864 : const Word16 *skip;
4865 : Word16 i, j, k, l_shb_lahead, l_frame, l_frame_tmp;
4866 : Word16 join_length, num_join;
4867 : Word32 mod_syn[L_FRAME16k + L_SHB_LAHEAD];
4868 : Word16 sum_gain;
4869 : Word32 L_tmp;
4870 : Word16 tmpQ15;
4871 : Word16 Q_gFr_norm, gain_frame_Q16;
4872 : Word32 L_tmp2;
4873 : Word16 temp1, temp2;
4874 :
4875 : /* Init */
4876 103912 : set32_fx( mod_syn, 0, L_FRAME16k + L_SHB_LAHEAD );
4877 :
4878 : /* apply gain for each subframe, and store noise output signal using overlap-add */
4879 103912 : IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
4880 : {
4881 : /* WB Gain shape and gain frame application with overlap */
4882 0 : skip = skip_bands_WB_TBE;
4883 0 : l_frame = L_FRAME16k / 4;
4884 0 : move16();
4885 0 : l_shb_lahead = L_SHB_LAHEAD / 4;
4886 0 : move16();
4887 :
4888 0 : sum_gain = 0;
4889 0 : move16();
4890 0 : FOR( k = 0; k < length / 2; k++ )
4891 : {
4892 0 : sum_gain = mult_r( subwin[2 * k + 2], subgain[0] ); /* Q15 */
4893 0 : mod_syn[skip[0] + k] = L_mult( sum_gain, synSHB[skip[0] + k] ); /* Q_bwe_exc + 16 */
4894 0 : move32();
4895 0 : mod_syn[skip[0] + k + length / 2] = L_mult( subgain[0], synSHB[skip[0] + k + length / 2] ); /* Q_bwe_exc + 16 */
4896 0 : move32();
4897 : }
4898 0 : FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ )
4899 : {
4900 0 : FOR( k = 0; k < length; k++ )
4901 : {
4902 : /* one bit headroom here, otherwise messes up the gain shape application */
4903 : /* keep it as L_mult0 */
4904 0 : L_tmp = L_mult0( subwin[k + 1], subgain[i] ); /* Q30 */
4905 0 : sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i - 1] ) ); /* Q14 */
4906 0 : mod_syn[skip[i] + k] = L_shl( L_mult( sum_gain, synSHB[skip[i] + k] ), 1 ); /* Q_bwe_exc + 16 */
4907 0 : move32();
4908 : }
4909 : }
4910 0 : FOR( k = 0; k < length / 2; k++ )
4911 : {
4912 0 : sum_gain = mult_r( subwin[length - 2 * k - 2], subgain[i - 1] ); /* Q15 */
4913 0 : mod_syn[skip[i] + k] = L_mult( sum_gain, synSHB[skip[i] + k] ); /* Q_bwe_exc + 16 */
4914 0 : move32();
4915 : }
4916 : }
4917 : ELSE
4918 : {
4919 : /* SWB Gain shape and gain frame application with overlap */
4920 103912 : l_frame = L_FRAME16k;
4921 103912 : move16();
4922 103912 : l_shb_lahead = L_SHB_LAHEAD;
4923 103912 : move16();
4924 103912 : skip = skip_bands_SWB_TBE;
4925 :
4926 103912 : num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS;
4927 103912 : move16();
4928 103912 : join_length = i_mult2( num_join, length );
4929 103912 : j = 0;
4930 103912 : move16();
4931 2182152 : FOR( k = 0; k < length; k++ )
4932 : {
4933 2078240 : sum_gain = mult_r( subwin[k + 1], subgain[0] ); /* Q15 */
4934 2078240 : mod_syn[j] = L_mult( synSHB[j], sum_gain );
4935 2078240 : move32(); /* Q_bwe_exc + 16 */
4936 2078240 : j = add( j, 1 );
4937 : }
4938 :
4939 415648 : FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ )
4940 : {
4941 19015896 : FOR( k = 0; k < join_length - length; k++ )
4942 : {
4943 18704160 : mod_syn[j] = L_mult( synSHB[j], subgain[i * num_join] );
4944 18704160 : move32(); /* Q_bwe_exc + 16 */
4945 18704160 : j = add( j, 1 );
4946 : }
4947 :
4948 6546456 : FOR( k = 0; k < length; k++ )
4949 : {
4950 : /* one bit headroom here, otherwise messes up the gain shape application */
4951 : /* keep it as L_mult0 */
4952 6234720 : L_tmp = L_mult0( subwin[k + 1], subgain[( i + 1 ) * num_join] ); /* Q30 */
4953 6234720 : sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i * num_join] ) ); /*Q14 */
4954 6234720 : mod_syn[j] = L_shl( L_mult( sum_gain, synSHB[j] ), 1 );
4955 6234720 : move32(); /* Q_bwe_exc + 16 */
4956 6234720 : j = add( j, 1 );
4957 : }
4958 : }
4959 6338632 : FOR( k = 0; k < join_length - length; k++ )
4960 : {
4961 6234720 : mod_syn[j] = L_mult( synSHB[j], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] );
4962 6234720 : move32(); /* Q_bwe_exc + 16 */
4963 6234720 : j = add( j, 1 );
4964 : }
4965 2182152 : FOR( k = 0; k < length; k++ )
4966 : {
4967 2078240 : sum_gain = mult_r( subwin[length - k - 1], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); /* Q15 */
4968 2078240 : mod_syn[j] = L_mult( synSHB[j], sum_gain );
4969 2078240 : move32(); /* Q_bwe_exc + 16 */
4970 2078240 : j = add( j, 1 );
4971 : }
4972 : }
4973 :
4974 :
4975 103912 : Q_gFr_norm = norm_l( frame_gain );
4976 103912 : if ( frame_gain == 0 )
4977 : {
4978 2 : Q_gFr_norm = 31;
4979 2 : move16();
4980 : }
4981 103912 : Q_gFr_norm = sub( Q_gFr_norm, 1 ); /* give some headroom */
4982 :
4983 103912 : gain_frame_Q16 = round_fx( L_shl( frame_gain, Q_gFr_norm ) ); /* Q = 18 + Q_gFr_norm - 16
4984 : = (Q_gFr_norm + 2) */
4985 :
4986 103912 : *Q_bwe_exc = add( *Q_bwe_exc, Q_gFr_norm ); /* compensate for the exp shift */
4987 103912 : move16();
4988 103912 : *Q_bwe_exc = sub( *Q_bwe_exc, 13 ); /* Keep Q-fac at => (Q_bwe_exc + Q_gFr_norm - 13) */
4989 103912 : move16();
4990 :
4991 : /* check for headroom of previous buff memories: overlap, Hilbert, and interp all-pass mem */
4992 103912 : tmpQ15 = add( prev_Q_bwe_syn2, n_mem3 );
4993 103912 : if ( GT_16( *Q_bwe_exc, tmpQ15 ) )
4994 : {
4995 17 : *Q_bwe_exc = tmpQ15;
4996 17 : move16();
4997 : }
4998 :
4999 103912 : *Qx = *Q_bwe_exc;
5000 103912 : move16();
5001 : /* rescale the overlap memory */
5002 2182152 : FOR( i = 0; i < L_SHB_LAHEAD; i++ )
5003 : {
5004 2078240 : temp2 = 1;
5005 2078240 : move16();
5006 2078240 : if ( overlap[i] < 0 )
5007 : {
5008 795542 : temp2 = -1;
5009 795542 : move16();
5010 : }
5011 2078240 : temp1 = abs_s( overlap[i] );
5012 2078240 : temp1 = shl( temp1, sub( *Q_bwe_exc, prev_Q_bwe_syn2 ) );
5013 2078240 : overlap[i] = i_mult( temp1, temp2 );
5014 2078240 : move16(); /* Q_bwe_exc + Q_gFr_norm - 13 */
5015 : }
5016 :
5017 2182152 : FOR( i = 0; i < l_shb_lahead; i++ )
5018 : {
5019 2078240 : L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 ); /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */
5020 2078240 : L_tmp2 = Mpy_32_16_1( L_tmp, win[i] ); /* (Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15) + 15 + (1-16) */
5021 2078240 : synSHB[i] = mac_r( L_tmp2, overlap[i], MAX_16 );
5022 2078240 : move16(); /* Q_bwe_exc + Q_gFr_norm - 13 */
5023 2078240 : synSHB[i + l_shb_lahead] = round_fx( L_tmp ); /* Q_bwe_exc + Q_gFr_norm - 13 */
5024 2078240 : move16();
5025 : }
5026 :
5027 31277512 : FOR( ; i < l_frame; i++ )
5028 : {
5029 31173600 : L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 ); /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */
5030 31173600 : synSHB[i] = round_fx( L_tmp ); /* Q_bwe_exc + Q_gFr_norm - 13 */
5031 31173600 : move16();
5032 : }
5033 :
5034 103912 : l_frame_tmp = add( l_frame, l_shb_lahead );
5035 2182152 : FOR( ; i < l_frame_tmp; i++ )
5036 : {
5037 2078240 : L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 ); /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */
5038 2078240 : L_tmp = Mpy_32_16_1( L_tmp, win[l_frame + l_shb_lahead - 1 - i] ); /* (Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15) + 15 + (1-16) */
5039 2078240 : overlap[i - l_frame] = round_fx( L_tmp ); /* Q_bwe_exc + Q_gFr_norm - 13 */
5040 2078240 : move16();
5041 : }
5042 :
5043 103912 : return;
5044 : }
5045 :
5046 :
5047 : /* IVAS 32-bit variant */
5048 8556 : void ScaleShapedSHB_fx32(
5049 : const Word16 length, /* i : SHB overlap length */
5050 : Word32 *synSHB_fx, /* i/o: synthesized shb signal Q_inp/Q_new */
5051 : Word32 *overlap_fx, /* i/o: buffer for overlap-add Q_inp/Q_new */
5052 : const Word16 *subgain_fx, /* i : subframe gain Q15 */
5053 : const Word32 frame_gain_fx, /* i : frame gain Q18*/
5054 : const Word16 *win_fx, /* i : window Q15 */
5055 : const Word16 *subwin_fx, /* i : subframes window Q15 */
5056 : Word16 *Q_inp,
5057 : Word16 *Q_new )
5058 : {
5059 : const Word16 *skip;
5060 : Word16 i, j, k, l_shb_lahead, l_frame;
5061 : Word16 join_length, num_join;
5062 : Word32 mod_syn_fx[L_FRAME16k + L_SHB_LAHEAD], L_tmp;
5063 : Word16 sum_gain_fx;
5064 :
5065 : /* initilaization */
5066 8556 : l_frame = L_FRAME16k;
5067 8556 : l_shb_lahead = L_SHB_LAHEAD;
5068 8556 : move16();
5069 8556 : move16();
5070 8556 : skip = skip_bands_SWB_TBE;
5071 :
5072 8556 : IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
5073 : {
5074 0 : skip = skip_bands_WB_TBE;
5075 0 : l_frame = L_FRAME16k / 4;
5076 0 : l_shb_lahead = L_SHB_LAHEAD / 4;
5077 0 : move16();
5078 0 : move16();
5079 : }
5080 :
5081 : /* apply gain for each subframe, and store noise output signal using overlap-add */
5082 8556 : set32_fx( mod_syn_fx, 0, l_frame + l_shb_lahead );
5083 :
5084 8556 : IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
5085 : {
5086 0 : sum_gain_fx = 0;
5087 0 : move16();
5088 0 : FOR( k = 0; k < shr( length, 1 ); k++ )
5089 : {
5090 0 : sum_gain_fx = mult_r( subwin_fx[2 * k + 2], subgain_fx[0] );
5091 0 : mod_syn_fx[skip[0] + k] = Mpy_32_16_1( synSHB_fx[skip[0] + k], sum_gain_fx );
5092 0 : move32(); // Qx
5093 0 : mod_syn_fx[skip[0] + k + length / 2] = Mpy_32_16_1( synSHB_fx[skip[0] + k + length / 2], subgain_fx[0] ); // Qx
5094 0 : move32();
5095 : }
5096 0 : FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ )
5097 : {
5098 0 : FOR( k = 0; k < length; k++ )
5099 : {
5100 0 : L_tmp = L_mult0( subwin_fx[k + 1], subgain_fx[i] );
5101 0 : sum_gain_fx = round_fx( L_mac0( L_tmp, subwin_fx[length - k - 1], subgain_fx[i - 1] ) );
5102 0 : mod_syn_fx[skip[i] + k] = L_shl( Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ), 1 ); // Qx
5103 0 : move32();
5104 : }
5105 : }
5106 0 : FOR( k = 0; k < shr( length, 1 ); k++ )
5107 : {
5108 0 : sum_gain_fx = mult_r( subwin_fx[length - k * 2 - 2], subgain_fx[i - 1] );
5109 0 : mod_syn_fx[skip[i] + k] = Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ); // Qx
5110 0 : move32();
5111 : }
5112 : }
5113 : ELSE
5114 : {
5115 8556 : num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS;
5116 8556 : join_length = i_mult( num_join, length );
5117 8556 : j = 0;
5118 8556 : move16();
5119 8556 : move16();
5120 179676 : FOR( k = 0; k < length; k++ )
5121 : {
5122 171120 : mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[k + 1], subgain_fx[0] ) ); // Qx
5123 171120 : move32();
5124 171120 : j = add( j, 1 );
5125 : }
5126 34224 : FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ )
5127 : {
5128 1565748 : FOR( k = 0; k < join_length - length; k++ )
5129 : {
5130 1540080 : mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[i * num_join] ); // Qx
5131 1540080 : move32();
5132 1540080 : j = add( j, 1 );
5133 : }
5134 :
5135 539028 : FOR( k = 0; k < length; k++ )
5136 : {
5137 513360 : L_tmp = L_mult0( subwin_fx[length - k - 1], subgain_fx[i * num_join] );
5138 513360 : mod_syn_fx[j] = L_shl( Mpy_32_16_1( synSHB_fx[j], round_fx( L_mac0( L_tmp, subwin_fx[k + 1], subgain_fx[( i + 1 ) * num_join] ) ) ), 1 ); // Qx
5139 513360 : move32();
5140 513360 : j = add( j, 1 );
5141 : }
5142 : }
5143 521916 : FOR( k = 0; k < join_length - length; k++ )
5144 : {
5145 513360 : mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); // Qx
5146 513360 : move32();
5147 513360 : j = add( j, 1 );
5148 : }
5149 179676 : FOR( k = 0; k < length; k++ )
5150 : {
5151 171120 : mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[length - k - 1], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ) ); // Qx
5152 171120 : move32();
5153 171120 : j = add( j, 1 );
5154 : }
5155 : }
5156 :
5157 8556 : Word16 norm_shift = norm_l( frame_gain_fx );
5158 8556 : if ( frame_gain_fx == 0 )
5159 : {
5160 0 : norm_shift = 31;
5161 0 : move16();
5162 : }
5163 :
5164 8556 : norm_shift = s_min( norm_shift, 14 );
5165 8556 : norm_shift = sub( norm_shift, 1 );
5166 :
5167 8556 : *Q_new = add( *Q_inp, sub( norm_shift, 13 ) ); // Q_new = Q_inp + min(norm_shift,14) - 14;
5168 8556 : move16();
5169 179676 : FOR( i = 0; i < L_SHB_LAHEAD; i++ )
5170 : {
5171 171120 : overlap_fx[i] = L_shl( overlap_fx[i], sub( *Q_new, *Q_inp ) );
5172 171120 : move32();
5173 : }
5174 :
5175 179676 : FOR( i = 0; i < l_shb_lahead; i++ )
5176 : {
5177 171120 : synSHB_fx[i] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[i] ) ); // Q_new
5178 171120 : synSHB_fx[i] = L_add( synSHB_fx[i], overlap_fx[i] );
5179 171120 : synSHB_fx[i + l_shb_lahead] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new
5180 171120 : move32();
5181 171120 : move32();
5182 171120 : move32();
5183 : }
5184 :
5185 2575356 : FOR( ; i < l_frame; i++ )
5186 : {
5187 2566800 : synSHB_fx[i] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new
5188 2566800 : move32();
5189 : }
5190 :
5191 179676 : FOR( ; i < l_frame + l_shb_lahead; i++ )
5192 : {
5193 171120 : synSHB_fx[i] = L_shl( synSHB_fx[i], sub( *Q_new, *Q_inp ) );
5194 171120 : overlap_fx[i - l_frame] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[l_frame + l_shb_lahead - 1 - i] ) ); // Q_new
5195 171120 : move32();
5196 171120 : move32();
5197 : }
5198 :
5199 8556 : *Q_inp = *Q_new;
5200 8556 : move16();
5201 8556 : return;
5202 : }
5203 :
5204 :
5205 : /*-------------------------------------------------------------------*
5206 : * ScaleShapedWB()
5207 : *
5208 : *
5209 : *-------------------------------------------------------------------*/
5210 :
5211 6870 : void ScaleShapedWB_fx(
5212 : const Word16 length, /* i : SHB overlap length */
5213 : Word16 *synSHB, /* i/o : synthesized shb signal Q_bwe_exc/Qx */
5214 : Word16 *overlap, /* i/o : buffer for overlap-add Q_bwe_exc/Qx */
5215 : const Word16 *subgain, /* i : subframe gain Q15*/
5216 : const Word32 frame_gain, /* i : frame gain Q18 */
5217 : const Word16 *win, /* i : window Q15*/
5218 : const Word16 *subwin, /* i : subframes window Q15*/
5219 : const Word16 Q_bwe_exc,
5220 : Word16 L_frame, /* i : Frame length - determines whether 12.8 or 16kHz core in-use */
5221 : Word16 dynQ, /* i : indicate whether output is dynamic Q, or Q0 */
5222 : Word16 *Qx, /* o : newly computed Q factor for synSHB */
5223 : Word16 prev_Qx, /* i : prev_Qx for memory scaling */
5224 : Word32 *Hilbert_Mem /* i : Hilbert memory used for computing Qx */
5225 : )
5226 : {
5227 : const Word16 *skip;
5228 : Word16 i, j, k, l_shb_lahead, l_frame, l_frame_tmp;
5229 : Word16 join_length, num_join;
5230 : Word32 mod_syn[L_FRAME16k + L_SHB_LAHEAD];
5231 : Word16 sum_gain;
5232 : Word32 L_tmp;
5233 : Word16 max_val, abs_sig, sc1, sc2, shift, max_headroom, min_shift, max_shift, max_shift2;
5234 : /* Init */
5235 6870 : set32_fx( mod_syn, 0, L_FRAME16k + L_SHB_LAHEAD );
5236 :
5237 : /* apply gain for each subframe, and store noise output signal using overlap-add */
5238 6870 : IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) )
5239 : {
5240 : /* WB Gain shape and gain frame application with overlap */
5241 6870 : skip = skip_bands_WB_TBE;
5242 6870 : move16();
5243 6870 : l_frame = L_FRAME16k / 4;
5244 6870 : move16();
5245 6870 : l_shb_lahead = L_SHB_LAHEAD / 4;
5246 6870 : move16();
5247 :
5248 6870 : sum_gain = 0;
5249 6870 : move16();
5250 41220 : FOR( k = 0; k < length / 2; k++ )
5251 : {
5252 34350 : sum_gain = mult_r( subwin[2 * k + 2], subgain[0] ); /* Q15 */
5253 34350 : mod_syn[skip[0] + k] = L_mult( sum_gain, synSHB[skip[0] + k] );
5254 34350 : move32(); /* Q_bwe_exc + 16 */
5255 34350 : mod_syn[skip[0] + k + length / 2] = L_mult( subgain[0], synSHB[skip[0] + k + length / 2] );
5256 34350 : move32(); /* Q_bwe_exc + 16 */
5257 : }
5258 54960 : FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ )
5259 : {
5260 528990 : FOR( k = 0; k < length; k++ )
5261 : {
5262 480900 : L_tmp = L_mult0( subwin[k + 1], subgain[i] ); /* Q30 */
5263 480900 : sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i - 1] ) ); /* Q14 */
5264 480900 : mod_syn[skip[i] + k] = L_shl( L_mult( sum_gain, synSHB[skip[i] + k] ), 1 );
5265 480900 : move32(); /* Q_bwe_exc + 16 */
5266 : }
5267 : }
5268 41220 : FOR( k = 0; k < length / 2; k++ )
5269 : {
5270 34350 : sum_gain = mult_r( subwin[length - 2 * k - 2], subgain[i - 1] ); /* Q15 */
5271 34350 : mod_syn[skip[i] + k] = L_mult( sum_gain, synSHB[skip[i] + k] );
5272 34350 : move32(); /* Q_bwe_exc + 16 */
5273 : }
5274 : }
5275 : ELSE
5276 : {
5277 : /* SWB Gain shape and gain frame application with overlap */
5278 0 : l_frame = L_FRAME16k;
5279 0 : move16();
5280 0 : l_shb_lahead = L_SHB_LAHEAD;
5281 0 : move16();
5282 0 : skip = skip_bands_SWB_TBE;
5283 0 : move16();
5284 :
5285 0 : num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS;
5286 0 : move16();
5287 0 : join_length = i_mult2( num_join, length );
5288 0 : j = 0; /* ptr*/
5289 0 : move16();
5290 0 : FOR( k = 0; k < length; k++ )
5291 : {
5292 0 : sum_gain = mult_r( subwin[k + 1], subgain[0] ); /* Q15 */
5293 0 : mod_syn[j] = L_mult( synSHB[j], sum_gain );
5294 0 : move32(); /* Q_bwe_exc + 16 */
5295 0 : j++;
5296 : }
5297 :
5298 0 : FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ )
5299 : {
5300 0 : FOR( k = 0; k < join_length - length; k++ )
5301 : {
5302 0 : mod_syn[j] = L_mult( synSHB[j], subgain[i * num_join] );
5303 0 : move32(); /* Q_bwe_exc + 16 */
5304 0 : j++;
5305 : }
5306 :
5307 0 : FOR( k = 0; k < length; k++ )
5308 : {
5309 0 : L_tmp = L_mult0( subwin[k + 1], subgain[i_mult2( ( i + 1 ), num_join )] ); /* Q30 */
5310 0 : sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i * num_join] ) ); /*Q14 */
5311 0 : mod_syn[j] = L_shl( L_mult( sum_gain, synSHB[j] ), 1 );
5312 0 : move32(); /* Q_bwe_exc + 16 */
5313 0 : j++;
5314 : }
5315 : }
5316 0 : FOR( k = 0; k < join_length - length; k++ )
5317 : {
5318 0 : mod_syn[j] = L_mult( synSHB[j], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] );
5319 0 : move32(); /* Q_bwe_exc + 16 */
5320 0 : j++;
5321 : }
5322 0 : FOR( k = 0; k < length; k++ )
5323 : {
5324 0 : sum_gain = mult_r( subwin[length - k - 1], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); /* Q15 */
5325 0 : mod_syn[j] = L_mult( synSHB[j], sum_gain );
5326 0 : move32(); /* Q_bwe_exc + 16 */
5327 0 : j++;
5328 : }
5329 : }
5330 :
5331 :
5332 6870 : max_val = 0;
5333 6870 : move16();
5334 590820 : FOR( i = 0; i < l_frame + l_shb_lahead; i++ )
5335 : {
5336 583950 : abs_sig = abs_s( round_fx( mod_syn[i] ) );
5337 583950 : if ( GT_16( abs_sig, max_val ) )
5338 : {
5339 49877 : max_val = abs_sig;
5340 49877 : move16();
5341 : }
5342 : }
5343 :
5344 151140 : FOR( i = 0; i < HILBERT_MEM_SIZE; i++ )
5345 : {
5346 144270 : abs_sig = abs_s( round_fx( Hilbert_Mem[i] ) );
5347 144270 : if ( GT_16( abs_sig, max_val ) )
5348 : {
5349 0 : max_val = abs_sig;
5350 0 : move16();
5351 : }
5352 : }
5353 :
5354 6870 : sc1 = norm_s( max_val ); /* max_val headroom in mod_syn[] */
5355 6870 : sc2 = norm_s( round_fx( frame_gain ) ); /* headroom in GainFrame */
5356 :
5357 6870 : IF( dynQ == 0 )
5358 : {
5359 6870 : shift = sub( 13, Q_bwe_exc ); /* earlier = (10 - Q_bwe_exc) but we changed GainFrame Q21 to Q18 */
5360 6870 : *Qx = 0;
5361 6870 : move16();
5362 : }
5363 0 : ELSE IF( EQ_16( L_frame, L_FRAME ) ) /* 12.8k core */
5364 : {
5365 0 : max_headroom = sub( add( sc1, sc2 ), 4 ); /* Max headroom after multiplying = sc1 + sc2 -3 (keep 3 bit extra headroom) */
5366 : /* 12.8k core needs extra headroom than 16k core */
5367 : /* otherwise Hilbert transform inside flip_and_downmix have saturation, causes ringing in output */
5368 :
5369 : /* Qx = (Q_bwe_exc+3) + shift - 16 */
5370 : /* make sure 14 > Qx > 2 */
5371 0 : min_shift = sub( 2, sub( add( Q_bwe_exc, 3 ), 16 ) );
5372 0 : max_shift = sub( 13, sub( add( Q_bwe_exc, 3 ), 16 ) );
5373 0 : max_shift2 = s_min( max_shift, max_headroom ); /* avoid shifting more than the available max_val headroom to avoid overflow */
5374 :
5375 0 : shift = s_min( min_shift, max_shift2 );
5376 0 : *Qx = sub( add( add( Q_bwe_exc, 3 ), shift ), 16 );
5377 0 : move16();
5378 : }
5379 : ELSE /* 16k core */
5380 : {
5381 0 : max_headroom = sub( add( sc1, sc2 ), 1 ); /* Max headroom after multiplying = sc1 + sc2 -1 (keep 1 bit extra headroom) */
5382 :
5383 : /* Qx = (Q_bwe_exc+3) + shift - 16 */
5384 : /* make sure 14 > Qx > 3 */
5385 0 : min_shift = sub( 3, sub( add( Q_bwe_exc, 3 ), 16 ) );
5386 0 : move16();
5387 0 : max_shift = sub( 13, sub( add( Q_bwe_exc, 3 ), 16 ) );
5388 0 : move16();
5389 0 : max_shift2 = s_min( max_shift, max_headroom ); /* avoid shifting more than the available max_val headroom to avoid overflow */
5390 :
5391 0 : shift = s_min( min_shift, max_shift2 );
5392 0 : *Qx = sub( add( add( Q_bwe_exc, 3 ), shift ), 16 );
5393 0 : move16();
5394 : }
5395 :
5396 : /* bring memory st_fx->syn_overlap_fx[] = overlap[i] to new Q = Qx to prepare for addition */
5397 41220 : FOR( i = 0; i < l_shb_lahead; i++ )
5398 : {
5399 34350 : overlap[i] = shl( overlap[i], sub( *Qx, prev_Qx ) );
5400 34350 : move16();
5401 : }
5402 :
5403 41220 : FOR( i = 0; i < l_shb_lahead; i++ )
5404 : {
5405 : /* mod_syn in (16+Q_bwe_exc), frame_gain in Q18 */
5406 34350 : L_tmp = Mult_32_32( mod_syn[i], frame_gain ); /* L_tmp in (Q_bwe_exc+3) */
5407 34350 : synSHB[i] = round_fx_sat( L_shl_sat( Mult_32_16( L_tmp, win[i] ), shift ) ); /* Qx */
5408 34350 : move16();
5409 34350 : synSHB[i] = add_sat( synSHB[i], overlap[i] );
5410 34350 : move16(); /* Qx */
5411 34350 : synSHB[i + l_shb_lahead] = round_fx_sat( L_shl_sat( L_tmp, shift ) ); /* Qx */
5412 34350 : move16();
5413 : }
5414 :
5415 522120 : FOR( ; i < l_frame; i++ )
5416 : {
5417 515250 : L_tmp = Mult_32_32( mod_syn[i], frame_gain ); /* L_tmp in (Q_bwe_exc+3) */
5418 515250 : synSHB[i] = round_fx_sat( L_shl_sat( L_tmp, shift ) ); /* Qx; */
5419 515250 : move16();
5420 : }
5421 :
5422 6870 : l_frame_tmp = add( l_frame, l_shb_lahead );
5423 41220 : FOR( ; i < l_frame_tmp; i++ )
5424 : {
5425 34350 : L_tmp = Mult_32_32( mod_syn[i], frame_gain ); /* (Q_bwe_exc+3) */
5426 34350 : overlap[i - l_frame] = round_fx_sat( L_shl_sat( Mult_32_16( L_tmp, win[l_frame + l_shb_lahead - 1 - i] ), shift ) ); /* Qx */
5427 34350 : move16();
5428 : }
5429 :
5430 6870 : return;
5431 : }
5432 :
5433 : /*-------------------------------------------------------------------*
5434 : * non_linearity()
5435 : *
5436 : * Apply a non linearity to the SHB excitation
5437 : * -------------------------------------------------------------------*/
5438 :
5439 4066 : static Word32 non_linearity_scaled_copy(
5440 : const Word16 input[],
5441 : Word16 j,
5442 : const Word16 length,
5443 : Word32 output[],
5444 : Word32 prev_scale,
5445 : const Word16 scale_step,
5446 : const Word16 en_abs )
5447 : {
5448 : Word16 i;
5449 : Word32 L_tmp;
5450 :
5451 :
5452 4066 : IF( en_abs )
5453 : {
5454 0 : FOR( i = 0; i < j; i++ )
5455 : {
5456 0 : L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
5457 0 : L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
5458 0 : output[i] = L_tmp;
5459 0 : move32();
5460 :
5461 0 : L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */
5462 0 : prev_scale = L_shl( L_tmp, 1 ); /* Q30 */
5463 : }
5464 0 : FOR( ; i < length; i++ )
5465 : {
5466 0 : L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
5467 0 : L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
5468 0 : output[i] = L_tmp;
5469 0 : move32();
5470 : }
5471 : }
5472 : ELSE
5473 : {
5474 621195 : FOR( i = 0; i < j; i++ )
5475 : {
5476 617129 : L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
5477 617129 : L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
5478 :
5479 617129 : if ( input[i] < 0 )
5480 : {
5481 310563 : L_tmp = L_negate( L_tmp );
5482 : }
5483 617129 : output[i] = L_tmp;
5484 617129 : move32();
5485 :
5486 617129 : L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */
5487 617129 : prev_scale = L_shl( L_tmp, 1 ); /* Q30 */
5488 : }
5489 :
5490 688057 : FOR( ; i < length; i++ )
5491 : {
5492 683991 : L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
5493 683991 : L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
5494 :
5495 683991 : if ( input[i] < 0 )
5496 : {
5497 333268 : L_tmp = L_negate( L_tmp );
5498 : }
5499 683991 : output[i] = L_tmp;
5500 683991 : move32();
5501 : }
5502 : }
5503 4066 : return prev_scale;
5504 : }
5505 :
5506 :
5507 : /*-------------------------------------------------------------------*
5508 : * non_linearity()
5509 : *
5510 : * Apply a non linearity to the SHB excitation
5511 : * -------------------------------------------------------------------*/
5512 :
5513 307630 : static Word32 non_linearity_scaled_copy_ivas(
5514 : const Word16 input[],
5515 : Word16 j,
5516 : const Word16 length,
5517 : Word32 output[],
5518 : Word32 prev_scale,
5519 : const Word16 scale_step,
5520 : const Word16 en_abs )
5521 : {
5522 : Word16 i;
5523 : Word32 L_tmp;
5524 :
5525 :
5526 307630 : IF( en_abs )
5527 : {
5528 1672 : FOR( i = 0; i < j; i++ )
5529 : {
5530 1664 : L_tmp = L_mult( input[i], input[i] ); /* 2*Q_inp+1 */
5531 1664 : L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
5532 :
5533 1664 : test();
5534 1664 : test();
5535 1664 : if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 )
5536 : {
5537 : /* NOTE: this is done to avoid the product to become zero for small non-zero input */
5538 139 : L_tmp = 1;
5539 139 : move16();
5540 : }
5541 :
5542 1664 : output[i] = L_tmp;
5543 1664 : move32();
5544 :
5545 1664 : L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */
5546 1664 : prev_scale = L_shl( L_tmp, 1 ); /* Q30 */
5547 : }
5548 904 : FOR( ; i < length; i++ )
5549 : {
5550 : /* L_tmp = (input[i] * input[i]) * prev_scale;*/
5551 896 : L_tmp = Mpy_32_16_1( Mpy_32_16_1( prev_scale, input[i] ), input[i] ); /* 2*Q_inp */
5552 :
5553 896 : test();
5554 896 : test();
5555 896 : if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 )
5556 : {
5557 : /* NOTE: this is done to avoid the product to become zero for small non-zero input */
5558 71 : L_tmp = 1;
5559 71 : move16();
5560 : }
5561 896 : output[i] = L_tmp;
5562 896 : move32();
5563 : }
5564 : }
5565 : ELSE
5566 : {
5567 44659114 : FOR( i = 0; i < j; i++ )
5568 : {
5569 44351492 : L_tmp = L_mult( input[i], input[i] ); /* 2*Q_inp+1 */
5570 44351492 : L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
5571 :
5572 44351492 : test();
5573 44351492 : test();
5574 44351492 : if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 )
5575 : {
5576 : /* NOTE: this is done to avoid the product to become zero for small non-zero input */
5577 5122453 : L_tmp = 1;
5578 5122453 : move16();
5579 : }
5580 :
5581 44351492 : if ( input[i] < 0 )
5582 : {
5583 21913687 : L_tmp = L_negate( L_tmp );
5584 : }
5585 44351492 : output[i] = L_tmp;
5586 44351492 : move32();
5587 :
5588 44351492 : L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */
5589 44351492 : prev_scale = L_shl( L_tmp, 1 ); /* Q30 */
5590 : }
5591 :
5592 54395170 : FOR( ; i < length; i++ )
5593 : {
5594 54087548 : L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */
5595 54087548 : L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */
5596 54087548 : test();
5597 54087548 : test();
5598 54087548 : if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 )
5599 : {
5600 : /* NOTE: this is done to avoid the product to become zero for small non-zero input */
5601 5337435 : L_tmp = 1;
5602 5337435 : move16();
5603 : }
5604 :
5605 54087548 : if ( input[i] < 0 )
5606 : {
5607 23577727 : L_tmp = L_negate( L_tmp );
5608 : }
5609 54087548 : output[i] = L_tmp;
5610 54087548 : move32();
5611 : }
5612 : }
5613 307630 : return prev_scale;
5614 : }
5615 :
5616 :
5617 : /*==========================================================================*/
5618 : /* FUNCTION : void non_linearity() */
5619 : /*--------------------------------------------------------------------------*/
5620 : /* PURPOSE : Apply a non linearity to the SHB excitation */
5621 : /*--------------------------------------------------------------------------*/
5622 : /* INPUT ARGUMENTS : */
5623 : /* Word16 input[] i : input signal Q_inp */
5624 : /* Word16 length i : input length */
5625 : /*--------------------------------------------------------------------------*/
5626 : /* OUTPUT ARGUMENTS : */
5627 : /* Word32 output[] o : output signal 2*Q_inp */
5628 : /*--------------------------------------------------------------------------*/
5629 : /* INPUT/OUTPUT ARGUMENTS : */
5630 : /* Word32 *prev_scale i/o: memory Q30 */
5631 : /*--------------------------------------------------------------------------*/
5632 : /* RETURN ARGUMENTS : */
5633 : /* _ None */
5634 : /*--------------------------------------------------------------------------*/
5635 : /* CALLED FROM : */
5636 : /*==========================================================================*/
5637 :
5638 2033 : void non_linearity_fx(
5639 : const Word16 input[], /* i : input signal Q_inp */
5640 : Word32 output[], /* o : output signal 2*Q_inp */
5641 : const Word16 length, /* i : input length */
5642 : Word32 *pPrevScale, /* i/o: memory Q30 */
5643 : Word16 Q_inp,
5644 : Word16 coder_type, /* i : Coder Type */
5645 : Word16 *voice_factors, /* i : Voice Factors */
5646 : const Word16 L_frame /* i : ACELP frame length */
5647 :
5648 : )
5649 : {
5650 : Word16 i, j;
5651 2033 : Word16 max_val = 0;
5652 2033 : move16();
5653 : Word32 scale;
5654 : Word16 scale_step;
5655 : Word16 exp, tmp;
5656 : Word16 e_tmp, f_tmp;
5657 : Word16 frac;
5658 : Word32 L_tmp;
5659 : Word32 L_tmp1;
5660 :
5661 2033 : Word16 en_abs = 0;
5662 2033 : Word16 v_fac = 0;
5663 2033 : move16();
5664 2033 : move16();
5665 : Word16 ths;
5666 : Word16 nframes;
5667 : Word32 prev_scale;
5668 : Word16 length_half;
5669 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
5670 2033 : Flag Overflow = 0;
5671 2033 : move32();
5672 : #endif
5673 :
5674 :
5675 2033 : IF( EQ_16( L_frame, L_FRAME16k ) )
5676 : {
5677 1279 : nframes = 5;
5678 1279 : move16();
5679 1279 : ths = 17817;
5680 1279 : move16(); /* 0.87*5 in Q12 */
5681 : }
5682 : ELSE
5683 : {
5684 754 : nframes = 4;
5685 754 : move16();
5686 754 : ths = 15400;
5687 754 : move16(); /* 0.94*4 in Q12 */
5688 : }
5689 :
5690 :
5691 11444 : FOR( i = 0; i < nframes; i++ )
5692 : {
5693 9411 : v_fac = add( v_fac, shr( voice_factors[i], 3 ) ); /* Q12 */
5694 : }
5695 :
5696 2033 : test();
5697 2033 : if ( EQ_16( coder_type, VOICED ) && GT_16( v_fac, ths ) )
5698 : {
5699 0 : en_abs = 1;
5700 0 : move16();
5701 : }
5702 :
5703 2033 : length_half = shr( length, 1 );
5704 2033 : prev_scale = *pPrevScale;
5705 2033 : move32();
5706 :
5707 :
5708 : /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */
5709 :
5710 652593 : FOR( i = j = 0; i < length_half; i++ )
5711 : {
5712 650560 : tmp = abs_s( input[i] );
5713 650560 : if ( GT_16( tmp, max_val ) )
5714 : {
5715 14461 : j = i;
5716 14461 : move16();
5717 : }
5718 650560 : max_val = s_max( max_val, tmp );
5719 : }
5720 :
5721 :
5722 2033 : IF( GT_16( max_val, shl( 1, Q_inp ) ) )
5723 : {
5724 2030 : exp = norm_s( max_val );
5725 2030 : tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */
5726 2030 : scale = L_shl( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ) ); /* Q31 */
5727 : }
5728 : ELSE
5729 : {
5730 3 : scale = 1438814044;
5731 3 : move32(); /* Q31; 0.67 in Q31 */
5732 : }
5733 :
5734 2033 : test();
5735 2033 : IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 32 ), scale ) )
5736 : {
5737 63 : scale_step = 16384;
5738 63 : move16(); /* Q14 */
5739 63 : prev_scale = L_shr( scale, 1 ); /* Q30 */
5740 : }
5741 : ELSE
5742 : {
5743 :
5744 : /* Computing log2(scale) */
5745 1970 : IF( j == 0 )
5746 : {
5747 16 : scale_step = 32767;
5748 16 : move16();
5749 : }
5750 : ELSE
5751 : {
5752 1954 : e_tmp = norm_l( scale );
5753 1954 : f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) );
5754 1954 : e_tmp = sub( -1, e_tmp );
5755 1954 : L_tmp = Mpy_32_16( e_tmp, f_tmp, MAX_16 ); /* Q16 */
5756 :
5757 : /* Computing log2(prev_scale) */
5758 1954 : e_tmp = norm_l( prev_scale );
5759 1954 : f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) );
5760 1954 : e_tmp = negate( e_tmp );
5761 1954 : L_tmp1 = Mpy_32_16( e_tmp, f_tmp, MAX_16 ); /* Q16 */
5762 :
5763 : /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */
5764 1954 : L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */
5765 :
5766 : /* Computing 1/j */
5767 1954 : exp = norm_s( j );
5768 1954 : tmp = div_s( shl( 1, sub( 14, exp ) ), j ); /* Q(29-exp) */
5769 :
5770 : /* (log2(scale / prev_scale))/length */
5771 1954 : L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /* Q(16+29-exp+1-16+exp-14)->Q16 */
5772 :
5773 1954 : frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
5774 :
5775 1954 : tmp = extract_l( Pow2( 14, frac ) );
5776 1954 : scale_step = shl_o( tmp, exp, &Overflow ); /* Q14 */
5777 : }
5778 : }
5779 :
5780 2033 : prev_scale = non_linearity_scaled_copy( input, j, length_half, output, prev_scale, scale_step, en_abs );
5781 :
5782 2033 : max_val = 0;
5783 2033 : move16();
5784 2033 : j = shr( length, 1 );
5785 652593 : FOR( i = length_half; i < length; i++ )
5786 : {
5787 650560 : tmp = abs_s( input[i] );
5788 650560 : if ( GT_16( tmp, max_val ) )
5789 : {
5790 14563 : j = i;
5791 14563 : move16();
5792 : }
5793 650560 : max_val = s_max( max_val, tmp );
5794 : }
5795 :
5796 2033 : IF( GT_16( max_val, shl( 1, Q_inp ) ) )
5797 : {
5798 2029 : exp = norm_s( max_val );
5799 2029 : tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */
5800 2029 : scale = L_shl_o( L_mult( 21955 /* 0.67 in Q15 */, tmp ), add( exp, sub( Q_inp, 14 ) ), &Overflow ); /* Q31 */
5801 : }
5802 : ELSE
5803 : {
5804 4 : scale = 1438814044;
5805 4 : move32(); /* Q31; 0.67 in Q31 */
5806 : }
5807 :
5808 2033 : test();
5809 2033 : IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 32 ), scale ) )
5810 : {
5811 0 : scale_step = 16384;
5812 0 : move16(); /*Q14 */
5813 0 : prev_scale = L_shr( scale, 1 ); /*Q30 */
5814 : }
5815 : ELSE
5816 : {
5817 : /*scale_step = (float) exp(1.0f / (float) (j - length/2) * (float) log(scale / prev_scale)); */
5818 : /* Computing log2(scale) */
5819 2033 : IF( EQ_16( j, length_half ) )
5820 : {
5821 24 : scale_step = 32767;
5822 24 : move16(); /*Q14 */
5823 : }
5824 : ELSE
5825 : {
5826 2009 : e_tmp = norm_l( scale );
5827 2009 : f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) );
5828 2009 : e_tmp = sub( -e_tmp, 1 );
5829 2009 : L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
5830 :
5831 : /* Computing log2(prev_scale) */
5832 2009 : e_tmp = norm_l( prev_scale );
5833 2009 : f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) );
5834 2009 : e_tmp = negate( e_tmp );
5835 2009 : L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
5836 :
5837 : /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */
5838 2009 : L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */
5839 :
5840 : /* Computing 1/(j - length/2) */
5841 :
5842 2009 : tmp = sub( j, length_half );
5843 2009 : exp = norm_s( tmp );
5844 :
5845 :
5846 2009 : tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /* Q(29-exp) */
5847 :
5848 : /* (log2(scale / prev_scale))/length */
5849 2009 : L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /*Q(16+29-exp+1-16+exp-14)->Q16 */
5850 :
5851 2009 : frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
5852 :
5853 2009 : tmp = extract_l( Pow2( 14, frac ) );
5854 2009 : scale_step = shl_o( tmp, exp, &Overflow ); /*Q14 */
5855 : }
5856 : }
5857 :
5858 2033 : prev_scale = non_linearity_scaled_copy( input + length_half, sub( j, length_half ), sub( length, length_half ), output + length_half, prev_scale, scale_step, en_abs );
5859 :
5860 2033 : *pPrevScale = prev_scale;
5861 2033 : move32();
5862 :
5863 : /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */
5864 :
5865 2033 : return;
5866 : }
5867 :
5868 :
5869 : /*==========================================================================*/
5870 : /* FUNCTION : void non_linearity_ivas_fx() */
5871 : /*--------------------------------------------------------------------------*/
5872 : /* PURPOSE : Apply a non linearity to the SHB excitation */
5873 : /*--------------------------------------------------------------------------*/
5874 : /* INPUT ARGUMENTS : */
5875 : /* Word16 input[] i : input signal Q_inp */
5876 : /* Word16 length i : input length */
5877 : /*--------------------------------------------------------------------------*/
5878 : /* OUTPUT ARGUMENTS : */
5879 : /* Word32 output[] o : output signal 2*Q_inp */
5880 : /*--------------------------------------------------------------------------*/
5881 : /* INPUT/OUTPUT ARGUMENTS : */
5882 : /* Word32 *prev_scale i/o: memory Q30 */
5883 : /*--------------------------------------------------------------------------*/
5884 : /* RETURN ARGUMENTS : */
5885 : /* _ None */
5886 : /*--------------------------------------------------------------------------*/
5887 : /* CALLED FROM : */
5888 : /*==========================================================================*/
5889 :
5890 153815 : void non_linearity_ivas_fx(
5891 : const Word16 input[], /* i : input signal Q_inp */
5892 : Word32 output[], /* o : output signal 2*Q_inp */
5893 : const Word16 length, /* i : input length */
5894 : Word32 *pPrevScale, /* i/o: memory Q30 */
5895 : Word16 Q_inp,
5896 : Word16 coder_type, /* i : Coder Type */
5897 : Word16 *voice_factors, /* i : Voice Factors */
5898 : const Word16 L_frame /* i : ACELP frame length */
5899 :
5900 : )
5901 : {
5902 : Word16 i, j;
5903 153815 : Word16 max_val = 0;
5904 153815 : move16();
5905 : Word32 scale;
5906 : Word16 scale_step;
5907 : Word16 exp, tmp;
5908 : Word16 e_tmp, f_tmp;
5909 : Word16 frac;
5910 : Word32 L_tmp;
5911 : Word32 L_tmp1;
5912 :
5913 153815 : Word16 en_abs = 0;
5914 153815 : Word16 v_fac = 0;
5915 153815 : move16();
5916 153815 : move16();
5917 : Word16 ths;
5918 : Word16 nframes;
5919 : Word32 prev_scale;
5920 : Word16 length_half;
5921 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
5922 153815 : Flag Overflow = 0;
5923 153815 : move32();
5924 : #endif
5925 :
5926 :
5927 153815 : IF( EQ_16( L_frame, L_FRAME16k ) )
5928 : {
5929 73340 : nframes = 5;
5930 73340 : move16();
5931 73340 : ths = 17817;
5932 73340 : move16(); /* 0.87*5 in Q12 */
5933 : }
5934 : ELSE
5935 : {
5936 80475 : nframes = 4;
5937 80475 : move16();
5938 80475 : ths = 15400;
5939 80475 : move16(); /* 0.94*4 in Q12 */
5940 : }
5941 :
5942 :
5943 842415 : FOR( i = 0; i < nframes; i++ )
5944 : {
5945 688600 : v_fac = add( v_fac, shr( voice_factors[i], 3 ) ); /* Q12 */
5946 : }
5947 :
5948 153815 : test();
5949 153815 : if ( EQ_16( coder_type, VOICED ) && GT_16( v_fac, ths ) )
5950 : {
5951 4 : en_abs = 1;
5952 4 : move16();
5953 : }
5954 :
5955 153815 : length_half = shr( length, 1 );
5956 153815 : prev_scale = *pPrevScale;
5957 153815 : move32();
5958 :
5959 :
5960 : /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */
5961 :
5962 49374615 : FOR( i = j = 0; i < length_half; i++ )
5963 : {
5964 49220800 : tmp = abs_s( input[i] );
5965 49220800 : if ( GT_16( tmp, max_val ) )
5966 : {
5967 1078747 : j = i;
5968 1078747 : move16();
5969 : }
5970 49220800 : max_val = s_max( max_val, tmp );
5971 : }
5972 :
5973 :
5974 153815 : IF( GT_16( max_val, shl( 1, Q_inp ) ) )
5975 : {
5976 143401 : exp = norm_s( max_val );
5977 143401 : tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */
5978 143401 : scale = L_shl( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ) ); /* Q31 */
5979 : }
5980 : ELSE
5981 : {
5982 10414 : scale = 1438814044;
5983 10414 : move32(); /* Q31; 0.67 in Q31 */
5984 : }
5985 :
5986 153815 : test();
5987 153815 : IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 64 ) /*Q30 -> Q31*/, scale /*Q31*/ ) )
5988 : {
5989 23853 : scale_step = 16384;
5990 23853 : move16(); /* Q14 */
5991 23853 : prev_scale = L_shr( scale, 1 ); /* Q30 */
5992 : }
5993 : ELSE
5994 : {
5995 :
5996 : /* Computing log2(scale) */
5997 129962 : IF( j == 0 )
5998 : {
5999 8769 : scale_step = 32767;
6000 8769 : move16();
6001 : }
6002 : ELSE
6003 : {
6004 121193 : e_tmp = norm_l( scale );
6005 121193 : f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) );
6006 121193 : e_tmp = sub( -1, e_tmp );
6007 121193 : L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
6008 :
6009 : /* Computing log2(prev_scale) */
6010 121193 : e_tmp = norm_l( prev_scale );
6011 121193 : f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) );
6012 121193 : e_tmp = negate( e_tmp );
6013 121193 : L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
6014 :
6015 : /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */
6016 121193 : L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */
6017 :
6018 : /* Computing 1/j */
6019 121193 : exp = norm_s( j );
6020 121193 : tmp = div_s( shl( 1, sub( 14, exp ) ), j ); /* Q(29-exp) */
6021 :
6022 : /* (log2(scale / prev_scale))/length */
6023 121193 : L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /* Q(16+29-exp+1-16+exp-14)->Q16 */
6024 :
6025 121193 : frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
6026 :
6027 121193 : tmp = extract_l( Pow2( 14, frac ) );
6028 121193 : scale_step = shl_o( tmp, exp, &Overflow ); /* Q14 */
6029 : }
6030 : }
6031 :
6032 153815 : prev_scale = non_linearity_scaled_copy_ivas( input, j, length_half, output, prev_scale, scale_step, en_abs );
6033 :
6034 153815 : max_val = 0;
6035 153815 : move16();
6036 153815 : j = shr( length, 1 );
6037 49374615 : FOR( i = length_half; i < length; i++ )
6038 : {
6039 49220800 : tmp = abs_s( input[i] );
6040 49220800 : if ( GT_16( tmp, max_val ) )
6041 : {
6042 1085948 : j = i;
6043 1085948 : move16();
6044 : }
6045 49220800 : max_val = s_max( max_val, tmp );
6046 : }
6047 :
6048 153815 : IF( GT_16( max_val, shl( 1, Q_inp ) ) )
6049 : {
6050 143220 : exp = norm_s( max_val );
6051 143220 : tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */
6052 143220 : scale = L_shl_o( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ), &Overflow ); /* Q31 */
6053 : }
6054 : ELSE
6055 : {
6056 10595 : scale = 1438814044;
6057 10595 : move32(); /* Q31; 0.67 in Q31 */
6058 : }
6059 :
6060 153815 : test();
6061 153815 : IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 64 ), scale ) )
6062 : {
6063 0 : scale_step = 16384;
6064 0 : move16(); /*Q14 */
6065 0 : prev_scale = L_shr( scale, 1 ); /*Q30 */
6066 : }
6067 : ELSE
6068 : {
6069 : /*scale_step = (float) exp(1.0f / (float) (j - length/2) * (float) log(scale / prev_scale)); */
6070 : /* Computing log2(scale) */
6071 153815 : IF( EQ_16( j, length_half ) )
6072 : {
6073 11451 : scale_step = 32767;
6074 11451 : move16(); /*Q14 */
6075 : }
6076 : ELSE
6077 : {
6078 142364 : e_tmp = norm_l( scale );
6079 142364 : f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) );
6080 142364 : e_tmp = sub( -e_tmp, 1 );
6081 142364 : L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
6082 :
6083 : /* Computing log2(prev_scale) */
6084 142364 : e_tmp = norm_l( prev_scale );
6085 142364 : f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) );
6086 142364 : e_tmp = negate( e_tmp );
6087 142364 : L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */
6088 :
6089 : /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */
6090 142364 : L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */
6091 :
6092 : /* Computing 1/(j - length/2) */
6093 :
6094 142364 : tmp = sub( j, length_half );
6095 142364 : exp = norm_s( tmp );
6096 :
6097 :
6098 142364 : tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /* Q(29-exp) */
6099 :
6100 : /* (log2(scale / prev_scale))/length */
6101 142364 : L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /*Q(16+29-exp+1-16+exp-14)->Q16 */
6102 :
6103 142364 : frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
6104 :
6105 142364 : tmp = extract_l( Pow2( 14, frac ) );
6106 142364 : scale_step = shl_o( tmp, exp, &Overflow ); /*Q14 */
6107 : }
6108 : }
6109 :
6110 153815 : prev_scale = non_linearity_scaled_copy_ivas( input + length_half, sub( j, length_half ), sub( length, length_half ), output + length_half, prev_scale, scale_step, en_abs );
6111 :
6112 153815 : *pPrevScale = prev_scale;
6113 153815 : move32();
6114 :
6115 : /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */
6116 :
6117 153815 : return;
6118 : }
6119 :
6120 :
6121 : /*-------------------------------------------------------------------*
6122 : * create_random_vector()
6123 : *
6124 : * creates random number vector
6125 : * Note: the abs(max_val) value coming out of create_random_vector should
6126 : * fit into the precision of Q6.
6127 : * -------------------------------------------------------------------*/
6128 :
6129 206482 : void create_random_vector_fx(
6130 : Word16 output[], /* o : output random vector Q5*/
6131 : const Word16 length, /* i : length of random vector */
6132 : Word16 seed[] /* i/o: start seed */
6133 : )
6134 : {
6135 : Word16 i, j, k;
6136 : Word16 scale1, scale2;
6137 : Word32 L_tmp;
6138 :
6139 206482 : L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[0] ) ) ); /*Q23 */
6140 206482 : j = extract_l( L_shr( L_tmp, 23 ) );
6141 206482 : j = s_and( j, 0xff );
6142 :
6143 206482 : L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[1] ) ) ); /*Q23 */
6144 206482 : k = extract_l( L_shr( L_tmp, 23 ) );
6145 206482 : k = s_and( k, 0xff );
6146 :
6147 207198 : WHILE( EQ_16( k, j ) )
6148 : {
6149 716 : L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[1] ) ) ); /*Q23 */
6150 716 : k = extract_l( L_shr( L_tmp, 23 ) );
6151 716 : k = s_and( k, 0xff );
6152 : }
6153 :
6154 206482 : scale1 = 18021;
6155 206482 : move16(); /* 200.00f * 0.35f/0.1243f; */
6156 206482 : if ( Random( &seed[0] ) < 0 )
6157 : {
6158 102689 : scale1 = -18021;
6159 102689 : move16(); /*Q5 */ /* -200.00f * 0.35f/0.1243f; */
6160 : }
6161 :
6162 206482 : scale2 = 7208;
6163 206482 : move16(); /* 80.00f * 0.35f/0.1243f; */
6164 206482 : if ( Random( &seed[1] ) < 0 )
6165 : {
6166 106426 : scale2 = -7208;
6167 106426 : move16(); /*Q5 */ /* -80.00f * 0.35f/0.1243f; */
6168 : }
6169 :
6170 32694002 : FOR( i = 0; i < length; i++ )
6171 : {
6172 32487520 : j = s_and( j, 0xff );
6173 32487520 : k = s_and( k, 0xff );
6174 32487520 : output[i] = round_fx( L_add( L_mult( scale1, gaus_dico_swb_fx[j] ), L_mult( scale2, gaus_dico_swb_fx[k] ) ) ); /*Q5 */
6175 32487520 : move16();
6176 32487520 : j++;
6177 32487520 : k++;
6178 : }
6179 :
6180 206482 : return;
6181 : }
6182 :
6183 :
6184 : /*======================================================================================*/
6185 : /* FUNCTION : interp_code_5over2_fx() */
6186 : /*--------------------------------------------------------------------------------------*/
6187 : /* PURPOSE : Used to interpolate the excitation from the core sample rate */
6188 : /* of 12.8 kHz to 32 kHz. */
6189 : /* Simple linear interpolator - No need FOR precision here. */
6190 : /*--------------------------------------------------------------------------------------*/
6191 : /* INPUT ARGUMENTS : */
6192 : /* _ (Word16[]) inp_code_fx : input vector (Q12) */
6193 : /* _ (Word16) inp_length : length of input vector */
6194 : /*--------------------------------------------------------------------------------------*/
6195 : /* OUTPUT ARGUMENTS : */
6196 : /* _ (Word16[]) interp_code_fx : output vector (Q12) */
6197 : /*--------------------------------------------------------------------------------------*/
6198 : /* INPUT/OUTPUT ARGUMENTS : */
6199 : /* _ None */
6200 : /*--------------------------------------------------------------------------------------*/
6201 :
6202 : /* _ None */
6203 : /*--------------------------------------------------------------------------------------*/
6204 : /* RETURN ARGUMENTS : */
6205 : /* _ None */
6206 : /*======================================================================================*/
6207 :
6208 247136 : void interp_code_5over2_fx(
6209 : const Word16 inp_code_fx[], /* i : input vector Qx*/
6210 : Word16 interp_code_fx[], /* o : output vector Qx*/
6211 : const Word16 inp_length /* i : length of input vector */
6212 : )
6213 : {
6214 : Word16 i, kk, kkp1, i_len2;
6215 : Word32 Ltemp;
6216 247136 : Word16 factor_i_fx[5] = { 6554, 19661, 32767, 19661, 6554 };
6217 247136 : move16();
6218 247136 : move16();
6219 247136 : move16();
6220 247136 : move16();
6221 247136 : move16();
6222 247136 : move16();
6223 247136 : Word16 factor_j_fx[5] = { 26214, 13107, 0, 13107, 26214 };
6224 247136 : move16();
6225 247136 : move16();
6226 247136 : move16();
6227 247136 : move16();
6228 247136 : move16();
6229 247136 : interp_code_fx[0] = inp_code_fx[0];
6230 247136 : move16(); /* Qx */
6231 :
6232 247136 : Ltemp = L_mult( inp_code_fx[0], factor_i_fx[3] ); /* Q(16+x) */
6233 247136 : Ltemp = L_mac( Ltemp, inp_code_fx[1], factor_j_fx[3] ); /* Q(16+x) */
6234 247136 : interp_code_fx[1] = round_fx( Ltemp ); /*Qx */
6235 247136 : move16();
6236 247136 : Ltemp = L_mult( inp_code_fx[0], factor_i_fx[4] ); /*Q(16+x) */
6237 247136 : Ltemp = L_mac( Ltemp, inp_code_fx[1], factor_j_fx[4] ); /*Q(16+x) */
6238 247136 : interp_code_fx[2] = round_fx( Ltemp ); /* Qx */
6239 247136 : move16();
6240 247136 : kk = 1;
6241 247136 : move16();
6242 247136 : kkp1 = 2;
6243 247136 : move16();
6244 247136 : i = 3;
6245 247136 : move16();
6246 : /*i_len2 = ( inp_length - 2 ) * HIBND_ACB_L_FAC; */ /*HIBND_ACB_L_FAC == 5/2 */
6247 247136 : i_len2 = sub( inp_length, 2 );
6248 247136 : i_len2 = shr( add( shl( i_len2, 2 ), i_len2 ), 1 ); /* rounding below during shr makes it non BE*/
6249 :
6250 9822688 : FOR( ; i < i_len2; i += 5 )
6251 : {
6252 9575552 : Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[0] ); /*Q(16+x) */
6253 9575552 : Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_i_fx[0] ); /*Q(16+x) */
6254 9575552 : interp_code_fx[i] = round_fx( Ltemp ); /*Qx */
6255 9575552 : move16();
6256 9575552 : Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[1] ); /*Q(16+x) */
6257 9575552 : Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_i_fx[1] ); /*Q(16+x) */
6258 9575552 : interp_code_fx[i + 1] = round_fx( Ltemp ); /*Qx */
6259 9575552 : move16();
6260 9575552 : Ltemp = L_mult( inp_code_fx[kkp1], factor_i_fx[2] ); /*Q(16+x) */
6261 9575552 : interp_code_fx[i + 2] = round_fx( Ltemp ); /*Qx */
6262 9575552 : move16();
6263 9575552 : kk++;
6264 9575552 : kkp1++;
6265 :
6266 9575552 : Ltemp = L_mult( inp_code_fx[kk], factor_i_fx[3] ); /*Q(16+x) */
6267 9575552 : Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_j_fx[3] ); /*Q(16+x) */
6268 9575552 : interp_code_fx[i + 3] = round_fx( Ltemp ); /*Qx */
6269 9575552 : move16();
6270 9575552 : Ltemp = L_mult( inp_code_fx[kk], factor_i_fx[4] ); /*Q(16+x) */
6271 9575552 : Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_j_fx[4] ); /*Q(16+x) */
6272 9575552 : interp_code_fx[i + 4] = round_fx( Ltemp ); /*Qx */
6273 9575552 : move16();
6274 9575552 : kk++;
6275 9575552 : kkp1++;
6276 : }
6277 :
6278 247136 : Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[0] ); /*Q(16+x) */
6279 247136 : interp_code_fx[i] = round_fx( Ltemp ); /*Qx */
6280 247136 : move16();
6281 247136 : Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[1] ); /*Q(16+x) */
6282 247136 : interp_code_fx[i + 1] = round_fx( Ltemp ); /*Qx */
6283 247136 : move16();
6284 247136 : return;
6285 : }
6286 :
6287 :
6288 : /*======================================================================================*/
6289 : /* FUNCTION : interp_code_4over2_fx() */
6290 : /*--------------------------------------------------------------------------------------*/
6291 : /* PURPOSE : Used to interpolate the excitation from the core sample rate */
6292 : /* of 16 kHz to 32 kHz. */
6293 : /* Simple linear interpolator - No need for precision here. */
6294 : /*--------------------------------------------------------------------------------------*/
6295 : /* INPUT ARGUMENTS : */
6296 : /* _ (Word16[]) inp_code_fx : input vector (Qx) */
6297 : /* _ (Word16) inp_length : length of input vector */
6298 : /*--------------------------------------------------------------------------------------*/
6299 : /* OUTPUT ARGUMENTS : */
6300 : /* _ (Word16[]) interp_code_fx : output vector (Qx) */
6301 : /*--------------------------------------------------------------------------------------*/
6302 : /* INPUT/OUTPUT ARGUMENTS : */
6303 : /* _ None */
6304 : /*--------------------------------------------------------------------------------------*/
6305 :
6306 : /* _ None */
6307 : /*--------------------------------------------------------------------------------------*/
6308 : /* RETURN ARGUMENTS : */
6309 : /* _ None */
6310 : /*======================================================================================*/
6311 :
6312 342612 : void interp_code_4over2_fx(
6313 : const Word16 inp_code_fx[], /* i : input vector Qx*/
6314 : Word16 interp_code_fx[], /* o : output vector Qx*/
6315 : const Word16 inp_length /* i : length of input vector */
6316 : )
6317 : {
6318 : Word16 i, j;
6319 342612 : j = 0;
6320 342612 : move16();
6321 24996096 : FOR( i = 0; i < inp_length - 1; i++ )
6322 : {
6323 24653484 : interp_code_fx[j] = inp_code_fx[i];
6324 24653484 : move16(); /*Qx */
6325 24653484 : interp_code_fx[j + 1] = add( shr( inp_code_fx[i], 1 ), shr( inp_code_fx[i + 1], 1 ) );
6326 24653484 : move16();
6327 24653484 : move16(); /*Qx */
6328 24653484 : j = add( j, 2 );
6329 : }
6330 :
6331 342612 : interp_code_fx[j] = inp_code_fx[i];
6332 342612 : move16();
6333 342612 : interp_code_fx[j + 1] = shr( inp_code_fx[i], 1 );
6334 342612 : move16(); /*Qx */
6335 :
6336 342612 : return;
6337 : }
6338 :
6339 :
6340 : /*-------------------------------------------------------------------*
6341 : * wb_tbe_extras_reset_synth()
6342 : *
6343 : * Reset the extra parameters only required for WB TBE synthesis
6344 : *-------------------------------------------------------------------*/
6345 :
6346 9902 : void wb_tbe_extras_reset_synth_fx(
6347 : Word16 state_lsyn_filt_shb[],
6348 : Word16 state_lsyn_filt_dwn_shb[],
6349 : Word16 state_32and48k_WB_upsample[],
6350 : Word16 state_resamp_HB[] )
6351 : {
6352 9902 : set16_fx( state_lsyn_filt_shb, 0, 2 * ALLPASSSECTIONS_STEEP );
6353 9902 : set16_fx( state_lsyn_filt_dwn_shb, 0, 2 * ALLPASSSECTIONS_STEEP );
6354 9902 : set16_fx( state_32and48k_WB_upsample, 0, 2 * ALLPASSSECTIONS_STEEP );
6355 9902 : set16_fx( state_resamp_HB, 0, INTERP_3_1_MEM_LEN );
6356 :
6357 9902 : return;
6358 : }
6359 :
6360 : /*-------------------------------------------------------------------*
6361 : * elliptic_bpf_48k_generic()
6362 : *
6363 : * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz
6364 : * Implemented as 3 fourth order sections cascaded.
6365 : *-------------------------------------------------------------------*/
6366 :
6367 34519 : void elliptic_bpf_48k_generic_fx(
6368 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6369 : const int16_t element_mode,
6370 : #endif
6371 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6372 : Word16 IsUpsampled3,
6373 : Word16 input_fx[], /* i : input signal Q_input_fx*/
6374 : #else
6375 : const Word16 input_fx[], /* i : input signal Q_input_fx*/
6376 : #endif
6377 : Word16 *Q_input_fx,
6378 : Word16 output_fx[], /* o : output signal memory_fx_Q */
6379 : Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */
6380 : Word16 memory_fx_Q[],
6381 : const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */
6382 : )
6383 : {
6384 : Word16 i, j;
6385 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6386 : Word16 memory_fx0, Q_temp, Q_temp2;
6387 : Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX;
6388 : Word32 L_tmpMax;
6389 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6390 : Word64 W_tmpX;
6391 : Word64 W_tmpY;
6392 : #endif
6393 :
6394 34519 : Word32 *L_tmp = &L_tmp_buffer[4];
6395 34519 : Word32 *L_tmp2 = &L_tmp2_buffer[4];
6396 34519 : Word32 *L_output = &L_output_buffer[4];
6397 : #else
6398 : Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2;
6399 : Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax;
6400 : Word32 memory2_fx_2[4], memory2_fx_3[4];
6401 : #endif
6402 :
6403 172595 : FOR( i = 0; i < 4; i++ )
6404 : {
6405 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6406 138076 : memory_fx0 = extract_l( memory_fx2[0][i] );
6407 138076 : input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) );
6408 138076 : L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) );
6409 138076 : L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) );
6410 : // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) );
6411 138076 : move32();
6412 138076 : move32();
6413 138076 : move32();
6414 138076 : move32();
6415 138076 : move32();
6416 : #else
6417 : memory_fx0[0][i] = extract_l( memory_fx2[0][i] );
6418 : memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) );
6419 : memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) );
6420 : memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) );
6421 : move32();
6422 : move32();
6423 : move32();
6424 : move32();
6425 : move32();
6426 : #endif
6427 : }
6428 :
6429 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6430 34519 : L_tmpMax = L_add( 0, 0 );
6431 34519 : IF( !IsUpsampled3 )
6432 : {
6433 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6434 0 : IF( element_mode )
6435 : {
6436 0 : FOR( i = 0; i < L_FRAME48k; i++ )
6437 : {
6438 : /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/
6439 0 : W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] );
6440 0 : W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] );
6441 0 : W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] );
6442 0 : W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] );
6443 0 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] );
6444 0 : W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] );
6445 0 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] );
6446 0 : W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] );
6447 0 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] );
6448 0 : L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/
6449 0 : move32();
6450 : }
6451 : }
6452 : ELSE
6453 : #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/
6454 : {
6455 0 : FOR( i = 0; i < L_FRAME48k; i++ )
6456 : {
6457 0 : L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/
6458 0 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6459 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6460 0 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6461 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6462 0 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6463 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6464 0 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6465 0 : L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6466 0 : move32();
6467 : }
6468 : }
6469 : } /*IsUpsampled3*/
6470 : ELSE
6471 : {
6472 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6473 34519 : IF( element_mode )
6474 : {
6475 11080599 : FOR( i = 0; i < L_FRAME48k; )
6476 : {
6477 11046080 : W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] );
6478 11046080 : W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] );
6479 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] );
6480 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] );
6481 11046080 : W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] );
6482 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] );
6483 11046080 : L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/
6484 11046080 : move32();
6485 11046080 : i++;
6486 :
6487 11046080 : W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] );
6488 11046080 : W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] );
6489 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] );
6490 11046080 : W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] );
6491 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] );
6492 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] );
6493 11046080 : L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/
6494 11046080 : move32();
6495 11046080 : i++;
6496 :
6497 11046080 : W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] );
6498 11046080 : W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] );
6499 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] );
6500 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] );
6501 11046080 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] );
6502 11046080 : L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/
6503 11046080 : move32();
6504 11046080 : i++;
6505 : }
6506 : }
6507 : ELSE
6508 : #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/
6509 : {
6510 0 : FOR( i = 0; i < L_FRAME48k; )
6511 : {
6512 0 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/
6513 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6514 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6515 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6516 0 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6517 0 : L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6518 0 : move32();
6519 0 : i++;
6520 :
6521 0 : L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/
6522 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6523 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6524 0 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6525 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6526 0 : L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6527 0 : move32();
6528 0 : i++;
6529 :
6530 0 : L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6531 0 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6532 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6533 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6534 0 : L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6535 0 : move32();
6536 0 : i++;
6537 : }
6538 : }
6539 :
6540 : } /*IsUpsampled3*/
6541 :
6542 : #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/
6543 : L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/
6544 : L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6545 : L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6546 : L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6547 : L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6548 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6549 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6550 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6551 : L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6552 : move32();
6553 :
6554 : L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/
6555 : L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6556 : L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6557 : L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6558 : L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6559 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6560 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6561 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6562 : L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6563 : move32();
6564 :
6565 : L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/
6566 : L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6567 : L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6568 : L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6569 : L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6570 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6571 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6572 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6573 : L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6574 : move32();
6575 : L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/
6576 : L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6577 : L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6578 : L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6579 : L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6580 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6581 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6582 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6583 : L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6584 : move32();
6585 : FOR( i = 4; i < L_FRAME48k; i++ )
6586 : {
6587 : L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/
6588 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6589 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6590 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6591 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6592 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6593 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6594 : L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/
6595 : L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/
6596 : move32();
6597 : }
6598 : #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/
6599 :
6600 34519 : memory_fx2[0][0] = input_fx[L_FRAME48k - 4];
6601 34519 : memory_fx2[0][1] = input_fx[L_FRAME48k - 3];
6602 34519 : memory_fx2[0][2] = input_fx[L_FRAME48k - 2];
6603 34519 : memory_fx2[0][3] = input_fx[L_FRAME48k - 1];
6604 34519 : move32();
6605 34519 : move32();
6606 34519 : move32();
6607 34519 : move32();
6608 34519 : move32();
6609 :
6610 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6611 34519 : L_tmpMax = L_add( 0, 0 );
6612 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6613 34519 : IF( element_mode )
6614 : {
6615 33172759 : FOR( i = 0; i < L_FRAME48k; i++ )
6616 : {
6617 33138240 : W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] );
6618 33138240 : W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] );
6619 33138240 : W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] );
6620 33138240 : W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] );
6621 33138240 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] );
6622 33138240 : W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] );
6623 33138240 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] );
6624 33138240 : W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] );
6625 33138240 : W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] );
6626 33138240 : L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) );
6627 33138240 : move32();
6628 33138240 : L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) );
6629 : }
6630 : }
6631 : ELSE
6632 : #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/
6633 : {
6634 0 : FOR( i = 0; i < L_FRAME48k; i++ )
6635 : {
6636 0 : L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/
6637 0 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6638 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6639 0 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6640 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6641 0 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6642 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6643 0 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6644 0 : L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6645 0 : move32();
6646 0 : L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) );
6647 : }
6648 : }
6649 : #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/
6650 : L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/
6651 : L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6652 : L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6653 : L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6654 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6655 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6656 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/
6657 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/
6658 : L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/
6659 : move32();
6660 : L_tmpMax = L_abs( L_tmp2[0] );
6661 : L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/
6662 : L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6663 : L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6664 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6665 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6666 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6667 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6668 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6669 : L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6670 : move32();
6671 : L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) );
6672 : L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/
6673 : L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6674 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6675 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6676 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6677 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6678 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6679 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6680 : L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6681 : move32();
6682 : L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) );
6683 : L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/
6684 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6685 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6686 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6687 : L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6688 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6689 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6690 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6691 : L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/
6692 : move32();
6693 : L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) );
6694 : FOR( i = 4; i < L_FRAME48k; i++ )
6695 : {
6696 : L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/
6697 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6698 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6699 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6700 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6701 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6702 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6703 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/
6704 : L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */
6705 : move32();
6706 : L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) );
6707 : }
6708 : #endif
6709 :
6710 :
6711 34519 : Q_temp = norm_l( L_tmpMax );
6712 34519 : Q_temp = sub( Q_temp, 4 );
6713 34519 : Scale_sig32( L_tmp2, 960, Q_temp );
6714 :
6715 34519 : memory_fx2[1][0] = L_tmp[L_FRAME48k - 4];
6716 34519 : memory_fx2[1][1] = L_tmp[L_FRAME48k - 3];
6717 34519 : memory_fx2[1][2] = L_tmp[L_FRAME48k - 2];
6718 34519 : memory_fx2[1][3] = L_tmp[L_FRAME48k - 1];
6719 34519 : move32();
6720 34519 : move32();
6721 34519 : move32();
6722 34519 : move32();
6723 34519 : move32();
6724 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6725 172595 : FOR( j = 0; j < 4; j++ )
6726 : {
6727 138076 : L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) );
6728 138076 : L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) );
6729 138076 : move32();
6730 138076 : move32();
6731 138076 : move32();
6732 : }
6733 : #else
6734 : FOR( j = 0; j < 4; j++ )
6735 : {
6736 : memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) );
6737 : memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) );
6738 : move32();
6739 : move32();
6740 : move32();
6741 : }
6742 : #endif
6743 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6744 34519 : L_tmpMax = L_add( 0, 0 );
6745 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6746 34519 : IF( element_mode )
6747 : {
6748 33172759 : FOR( i = 0; i < L_FRAME48k; i++ )
6749 : {
6750 33138240 : W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] );
6751 33138240 : W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] );
6752 33138240 : W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] );
6753 33138240 : W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] );
6754 33138240 : W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] );
6755 33138240 : W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] );
6756 33138240 : W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] );
6757 33138240 : W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] );
6758 33138240 : W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] );
6759 33138240 : L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) );
6760 33138240 : move32();
6761 33138240 : L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) );
6762 : }
6763 : }
6764 : ELSE
6765 : #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/
6766 : {
6767 0 : FOR( i = 0; i < L_FRAME48k; i++ )
6768 : {
6769 0 : L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */
6770 0 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
6771 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6772 :
6773 0 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6774 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6775 :
6776 0 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
6777 0 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6778 :
6779 0 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
6780 0 : L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6781 0 : move32();
6782 0 : L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) );
6783 : }
6784 : }
6785 :
6786 : #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/
6787 : L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */
6788 : L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6789 : L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6790 : L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6791 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6792 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */
6793 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */
6794 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */
6795 : L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */
6796 : move32();
6797 : L_tmpMax = L_abs( L_output[0] );
6798 :
6799 : L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */
6800 : L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/
6801 : L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/
6802 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/
6803 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/
6804 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/
6805 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/
6806 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/
6807 : L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/
6808 : move32();
6809 : L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) );
6810 :
6811 : L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */
6812 : L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/
6813 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/
6814 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/
6815 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/
6816 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6817 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6818 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/
6819 : L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6820 : move32();
6821 : L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) );
6822 :
6823 : L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */
6824 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6825 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6826 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6827 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6828 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6829 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6830 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6831 : L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6832 : move32();
6833 : L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) );
6834 :
6835 : FOR( i = 4; i < L_FRAME48k; i++ )
6836 : {
6837 : L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */
6838 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
6839 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6840 :
6841 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/
6842 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6843 :
6844 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
6845 : L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6846 :
6847 : L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/
6848 : L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/
6849 : move32();
6850 : L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) );
6851 : }
6852 : #endif
6853 :
6854 34519 : memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4];
6855 34519 : memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3];
6856 34519 : memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2];
6857 34519 : memory_fx2[2][3] = L_tmp2[L_FRAME48k - 1];
6858 34519 : memory_fx2[3][0] = L_output[L_FRAME48k - 4];
6859 34519 : memory_fx2[3][1] = L_output[L_FRAME48k - 3];
6860 34519 : memory_fx2[3][2] = L_output[L_FRAME48k - 2];
6861 34519 : memory_fx2[3][3] = L_output[L_FRAME48k - 1];
6862 34519 : move32();
6863 34519 : move32();
6864 34519 : move32();
6865 34519 : move32();
6866 34519 : move32();
6867 34519 : move32();
6868 34519 : move32();
6869 34519 : move32();
6870 34519 : move32();
6871 34519 : memory_fx_Q[0] = *Q_input_fx;
6872 34519 : memory_fx_Q[1] = add( *Q_input_fx, 11 );
6873 34519 : memory_fx_Q[2] = add( add( *Q_input_fx, 6 ), Q_temp );
6874 34519 : memory_fx_Q[3] = add( add( *Q_input_fx, 1 ), Q_temp );
6875 34519 : move16();
6876 34519 : move16();
6877 34519 : move16();
6878 34519 : move16();
6879 34519 : Q_temp2 = norm_l( L_tmpMax );
6880 34519 : Scale_sig32( L_output, 960, Q_temp2 );
6881 33172759 : FOR( i = 0; i < 960; i++ )
6882 : {
6883 33138240 : output_fx[i] = extract_h( L_output[i] );
6884 33138240 : move16();
6885 : }
6886 34519 : *Q_input_fx = sub( add( add( *Q_input_fx, Q_temp ), Q_temp2 ), 15 );
6887 34519 : move16(); /* BASOP_NOGLOB */
6888 :
6889 34519 : return;
6890 : }
6891 : /*-------------------------------------------------------------------*
6892 : * synthesise_fb_high_band()
6893 : *
6894 : * Creates the highband output for full band - 14.0 to 20 kHz
6895 : * Using the energy shaped white excitation signal from the SWB BWE.
6896 : * The excitation signal input is sampled at 16kHz and so is upsampled
6897 : * to 48 kHz first.
6898 : * Uses a complementary split filter to code the two regions from
6899 : * 14kHz to 16kHz and 16 kHz to 20 kHz.
6900 : * One of 16 tilt filters is also applied afterwards to further
6901 : * refine the spectral shape of the fullband signal.
6902 : * The tilt is specified in dB per kHz. N.B. Only negative values are
6903 : * accomodated.
6904 : *-------------------------------------------------------------------*/
6905 :
6906 34519 : void synthesise_fb_high_band_fx(
6907 : const Word16 excitation_in[], /* i : full band excitation */
6908 : Word16 Q_fb_exc,
6909 : Word16 output[], /* o : high band speech - 14.0 to 20 kHz */
6910 : const Word32 fb_exc_energy, /* i : full band excitation energy */
6911 : const Word16 ratio, /* i : energy ratio */
6912 : const Word16 L_frame, /* i : ACELP frame length */
6913 : const Word16 bfi, /* i : fec flag */
6914 : Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */
6915 : Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */
6916 : Word16 bpf_memory_Q[],
6917 : Word16 Qout
6918 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6919 : ,
6920 : int16_t element_mode
6921 : #endif
6922 : )
6923 : {
6924 : Word16 i, j;
6925 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6926 : Word16 excitation_in_interp3_buffer[L_FRAME48k + 4];
6927 34519 : Word16 *excitation_in_interp3 = &excitation_in_interp3_buffer[0] + 4;
6928 : #else
6929 : Word16 excitation_in_interp3[L_FRAME48k];
6930 : #endif
6931 : Word16 tmp[L_FRAME48k];
6932 : Word32 temp1;
6933 : Word32 ratio2;
6934 : Word32 L_tmp;
6935 : Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp;
6936 :
6937 : /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */
6938 34519 : j = 0;
6939 : /* white excitation from DC to 8 kHz resampled to produce DC to 24 kHz excitation. */
6940 11080599 : FOR( i = 0; i < L_FRAME48k; i += 3 )
6941 : {
6942 11046080 : excitation_in_interp3[i] = mult( excitation_in[j], 24576 ); /* Q(Q_fb_exc+13-15 = Q_fb_exc-2) */
6943 11046080 : move16();
6944 11046080 : excitation_in_interp3[i + 1] = 0;
6945 11046080 : move16();
6946 11046080 : excitation_in_interp3[i + 2] = 0;
6947 11046080 : move16();
6948 11046080 : j++;
6949 : }
6950 34519 : exp_tmp = sub( Q_fb_exc, 2 );
6951 :
6952 34519 : IF( EQ_16( L_frame, L_FRAME16k ) )
6953 : {
6954 : /* for 16kHz ACELP core */
6955 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6956 26953 : elliptic_bpf_48k_generic_fx(
6957 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6958 : element_mode,
6959 : #endif
6960 : 1, // IsUpsampled3
6961 : excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx
6962 :
6963 : );
6964 : #else
6965 : elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx );
6966 : #endif
6967 : }
6968 : ELSE
6969 : {
6970 : /* for 12.8kHz ACELP core */
6971 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic
6972 7566 : elliptic_bpf_48k_generic_fx(
6973 : #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2
6974 : element_mode,
6975 : #endif
6976 : 1, // IsUpsampled3
6977 : excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx );
6978 : #else
6979 : elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx );
6980 : #endif
6981 : }
6982 34519 : temp1 = sum2_fx_mod( tmp, L_FRAME48k );
6983 :
6984 34519 : L_tmp = L_max( 1, fb_exc_energy ); /*Q(2*Q_fb_exc + 1)*/
6985 34519 : exp = norm_l( L_tmp );
6986 34519 : tmp3 = extract_h( L_shl( L_tmp, exp ) );
6987 34519 : tmp1 = sub( add( Q_fb_exc, Q_fb_exc ), 8 ); /* 1-9*/
6988 34519 : exp = sub( sub( 31, tmp1 ), exp );
6989 :
6990 34519 : exp2 = norm_l( temp1 );
6991 34519 : tmp2 = extract_h( L_shl( temp1, exp2 ) );
6992 34519 : exp2 = sub( sub( 31, sub( shl( exp_tmp, 1 ), 8 ) ), exp2 ); /* in Q15 (temp1 in Q9)*/
6993 :
6994 34519 : exp = sub( exp2, exp ); /* Denormalize and substract */
6995 34519 : IF( GT_16( tmp2, tmp3 ) )
6996 : {
6997 18163 : tmp2 = shr( tmp2, 1 );
6998 18163 : exp = add( exp, 1 );
6999 : }
7000 34519 : IF( 0 != tmp3 )
7001 : {
7002 34519 : tmp3 = div_s( tmp2, tmp3 );
7003 34519 : L_tmp = L_deposit_h( tmp3 );
7004 34519 : L_tmp = Isqrt_lc( L_tmp, &exp ); /*Q(31-exp)*/
7005 34519 : ratio2 = Mult_32_16( L_tmp, ratio ); /*Q(31-exp+0-15 = 16-exp)*/
7006 : }
7007 : ELSE
7008 : {
7009 0 : ratio2 = 0;
7010 : }
7011 :
7012 34519 : IF( !bfi )
7013 : {
7014 33762 : *prev_fbbwe_ratio = ratio;
7015 33762 : move16();
7016 : }
7017 : ELSE
7018 : {
7019 : /**prev_fbbwe_ratio = ratio*0.5f;*/
7020 757 : *prev_fbbwe_ratio = shr( ratio, 1 );
7021 757 : move16();
7022 : }
7023 34519 : tmp3 = add( sub( Qout, add( sub( 1, exp ), exp_tmp ) ), 16 ); /*Qout - (1 -exp +exp_tmp) + 16 */
7024 33172759 : FOR( i = 0; i < L_FRAME48k; i++ )
7025 : {
7026 33138240 : L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */
7027 33138240 : IF( L_tmp < 0 )
7028 : {
7029 16397681 : output[i] = negate( extract_h( L_shl_sat( L_negate( L_tmp ), tmp3 ) ) ); /*Qout*/
7030 16397681 : move16();
7031 : }
7032 : ELSE
7033 : {
7034 16740559 : output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/
7035 16740559 : move16();
7036 : }
7037 : }
7038 34519 : return;
7039 : }
7040 :
7041 : /*-------------------------------------------------------------------*
7042 : * Estimate_mix_factors_fx() *
7043 : * *
7044 : * Estimate mix factors for SHB excitation generation *
7045 : *-------------------------------------------------------------------*/
7046 0 : void Estimate_mix_factors_fx(
7047 : const Word16 *shb_res, /* i : SHB LP residual in Q = Q_shb */
7048 : const Word16 Q_shb,
7049 : const Word16 *exc16kWhtnd, /* i : SHB transformed low band excitation Q_bwe_exc */
7050 : const Word16 Q_bwe_exc,
7051 : const Word16 *White_exc16k_frac, /* i : Modulated envelope shaped white noise Q_frac */
7052 : const Word16 Q_frac,
7053 : const Word32 pow1, /* i : SHB exc. power for normalization in Q_pow1 */
7054 : const Word16 Q_pow1,
7055 : const Word32 pow22, /* i : White noise excitation for normalization in Q_pow22 */
7056 : const Word16 Q_pow22,
7057 : Word16 *vf_modified, /* o : Estimated voice factors */
7058 : Word16 *vf_ind /* o : voice factors VQ index */
7059 : )
7060 : {
7061 : Word16 shb_res_local[L_FRAME16k], WN_exc_local[L_FRAME16k];
7062 : Word32 pow3, temp_p1_p2, temp_p1_p3;
7063 : Word16 temp_numer1[L_FRAME16k], temp_numer2[L_FRAME16k];
7064 : Word16 i, length;
7065 : Word16 exp1, exp2, expa, expb, fraca, fracb, scale, num_flag, den_flag;
7066 : Word16 tmp, tmp1, sc1, sc2;
7067 : Word32 L_tmp1, L_tmp2;
7068 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
7069 0 : Flag Overflow = 0;
7070 0 : move32();
7071 : #endif
7072 :
7073 0 : Copy( shb_res, shb_res_local, L_FRAME16k );
7074 0 : Copy( White_exc16k_frac, WN_exc_local, L_FRAME16k );
7075 : /* WN_exc_local in (Q_frac) */
7076 :
7077 0 : pow3 = Dot_product( shb_res_local, shb_res_local, L_FRAME16k ); /* (2*Q_shb+1) */
7078 :
7079 0 : pow3 = L_add( pow3, L_shl( 21475l /*0.00001f in Q31*/, 2 * Q_shb + 1 - 31 ) ); /* (2*Q_shb+1) */
7080 0 : if ( pow3 == 0 )
7081 : {
7082 0 : pow3 = 1;
7083 0 : move32();
7084 : }
7085 :
7086 : /* temp_p1_p2 = (float)sqrt(pow1/pow2); */
7087 0 : temp_p1_p2 = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp1 ); /* temp_p1_p3 in (Q31+exp1) */
7088 :
7089 : /* temp_p1_p3 = (float)sqrt(pow1/pow3); */
7090 0 : temp_p1_p3 = root_a_over_b_fx( pow1, Q_pow1, pow3, ( 2 * Q_shb + 1 ), &exp2 ); /* temp_p1_p3 in (Q31+exp2) */
7091 :
7092 :
7093 0 : sc1 = sub( Q_bwe_exc, sub( Q_frac, exp1 ) );
7094 0 : sc2 = sub( Q_bwe_exc, sub( Q_shb, exp2 ) );
7095 0 : FOR( i = 0; i < L_FRAME16k; i++ )
7096 : {
7097 0 : L_tmp1 = Mult_32_16( temp_p1_p2, WN_exc_local[i] ); /* (Q_frac - exp1) +16 */
7098 0 : WN_exc_local[i] = round_fx( L_tmp1 );
7099 0 : move16();
7100 0 : L_tmp2 = Mult_32_16( temp_p1_p3, shb_res_local[i] ); /* (Q_shb - exp2) +16 */
7101 0 : shb_res_local[i] = round_fx( L_tmp2 );
7102 0 : move16();
7103 : /* temp_numer1[i] = sub(shb_res_local[i], WN_exc_local[i]); */
7104 0 : temp_numer1[i] = round_fx_sat( L_sub_sat( L_shl_sat( L_tmp2, sc2 ), L_shl_sat( L_tmp1, sc1 ) ) );
7105 0 : move16();
7106 : /* (Q_bwe_exc) */
7107 :
7108 : /* temp_numer2[i] = sub(exc16kWhtnd[i], WN_exc_local[i]); */
7109 0 : temp_numer2[i] = sub_sat( exc16kWhtnd[i], round_fx_sat( L_shl_sat( L_tmp1, sc1 ) ) );
7110 0 : move16();
7111 : /* (Q_bwe_exc) */
7112 : }
7113 :
7114 :
7115 0 : length = L_FRAME16k;
7116 0 : move16();
7117 0 : temp_p1_p2 = Dot_product( temp_numer1, temp_numer2, length ); /* 2*(Q_bwe_exc)+1 */
7118 0 : temp_p1_p3 = Dot_product( temp_numer2, temp_numer2, length ); /* 2*(Q_bwe_exc)+1 */
7119 :
7120 : /* vf_modified[i] = min( max_val( (temp_p1_p2 / temp_p1_p3), 0.1f), 0.99f); */
7121 : /* tmp = (temp_p1_p2 / temp_p1_p3); */
7122 0 : IF( temp_p1_p3 > 0 )
7123 : {
7124 0 : expa = norm_l( temp_p1_p3 );
7125 0 : fraca = extract_h( L_shl( temp_p1_p3, expa ) );
7126 0 : expa = sub( 30, expa );
7127 :
7128 0 : expb = norm_l( temp_p1_p2 );
7129 0 : fracb = round_fx_o( L_shl_o( temp_p1_p2, expb, &Overflow ), &Overflow );
7130 0 : expb = sub( 30, expb );
7131 :
7132 0 : num_flag = 0;
7133 0 : move16();
7134 0 : IF( fraca < 0 )
7135 : {
7136 0 : num_flag = 1;
7137 0 : move16();
7138 0 : fraca = negate( fraca );
7139 : }
7140 :
7141 0 : den_flag = 0;
7142 0 : move16();
7143 0 : IF( fracb < 0 )
7144 : {
7145 0 : den_flag = 1;
7146 0 : move16();
7147 0 : fracb = negate( fracb );
7148 : }
7149 :
7150 0 : scale = shr( sub( fraca, fracb ), 15 );
7151 0 : fracb = shl( fracb, scale );
7152 0 : expb = sub( expb, scale );
7153 :
7154 0 : tmp = div_s( fracb, fraca );
7155 0 : exp1 = sub( expb, expa );
7156 0 : tmp = shl_sat( tmp, exp1 );
7157 0 : if ( NE_16( num_flag, den_flag ) )
7158 : {
7159 0 : tmp = negate( tmp );
7160 : }
7161 : }
7162 : ELSE
7163 : {
7164 0 : tmp = 0;
7165 0 : move16();
7166 : }
7167 :
7168 0 : vf_modified[0] = s_min( s_max( tmp, 3277 /* 0.1f in Q15*/ ), 32440 /* 0.99f in Q15 */ );
7169 0 : move16();
7170 :
7171 0 : *vf_ind = usquant_fx( vf_modified[0], &tmp1, 4096 /* 0.125 in Q15 */, 2048 /* 0.125 in Q14 */, shl( 1, NUM_BITS_SHB_VF ) );
7172 0 : move16();
7173 :
7174 0 : vf_modified[0] = tmp1;
7175 0 : move16();
7176 0 : vf_modified[1] = tmp1;
7177 0 : move16();
7178 0 : vf_modified[2] = tmp1;
7179 0 : move16();
7180 0 : vf_modified[3] = tmp1;
7181 0 : move16();
7182 0 : vf_modified[4] = tmp1;
7183 0 : move16();
7184 :
7185 : /* vf_modified in Q15 */
7186 :
7187 0 : return;
7188 : }
7189 :
7190 : /*======================================================================================*/
7191 : /* FUNCTION : prep_tbe_exc_fx() */
7192 : /*--------------------------------------------------------------------------------------*/
7193 : /* PURPOSE : Prepare TBE excitation */
7194 : /*--------------------------------------------------------------------------------------*/
7195 : /* INPUT ARGUMENTS : */
7196 : /* _ (Word16) L_frame_fx : length of the frame */
7197 : /* _ (Word16) i_subfr_fx : subframe index */
7198 : /* _ (Word16) gain_pit_fx : Pitch gain (14) */
7199 : /* _ (Word32) gain_code_fx : algebraic codebook gain (Q(16+Q_exc)) */
7200 : /* _ (Word16*[]) code_fx : algebraic excitation (Q9) */
7201 : /* _ (Word16) voice_fac_fx : voicing factor (Q15) */
7202 : /* _ (Word16) gain_preQ_fx : prequantizer excitation gain */
7203 : /* _ (Word16[]) code_preQ_fx : prequantizer excitation */
7204 : /*--------------------------------------------------------------------------------------*/
7205 : /* OUTPUT ARGUMENTS : */
7206 : /* _ (Word16*[]) voice_factors_fx : TBE voicing factor (Q15) */
7207 : /*--------------------------------------------------------------------------------------*/
7208 : /* INPUT/OUTPUT ARGUMENTS : */
7209 : /* _ (Word16[]) bwe_exc_fx : excitation for TBE (Q_exc) */
7210 : /*--------------------------------------------------------------------------------------*/
7211 : /* _ None */
7212 : /*--------------------------------------------------------------------------------------*/
7213 : /* RETURN ARGUMENTS : */
7214 : /* _ None */
7215 : /*======================================================================================*/
7216 :
7217 540095 : void prep_tbe_exc_fx(
7218 : const Word16 L_frame_fx, /* i : length of the frame */
7219 : const Word16 L_subfr, /* i : subframe length */
7220 : const Word16 i_subfr_fx, /* i : subframe index */
7221 : const Word16 gain_pit_fx, /* i : Pitch gain Q14*/
7222 : const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/
7223 : const Word16 code_fx[], /* i : algebraic excitation Q9*/
7224 : const Word16 voice_fac_fx, /* i : voicing factor Q15*/
7225 : Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/
7226 : Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/
7227 : const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */
7228 : const Word16 code_preQ_fx[], /* i : prequantizer excitation */
7229 : const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */
7230 : const Word16 T0, /* i : integer pitch variables Q0 */
7231 : const Word16 T0_frac, /* i : Fractional pitch variables Q0*/
7232 : const Word16 coder_type, /* i : coding type */
7233 : const Word32 core_brate, /* i : core bitrate */
7234 : const Word16 element_mode, /* i : element mode */
7235 : const Word16 idchan, /* i : channel ID */
7236 : const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */
7237 : const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */
7238 :
7239 : )
7240 : {
7241 : Word16 i;
7242 : Word16 tmp_code_fx[2 * L_SUBFR * HIBND_ACB_L_FAC];
7243 : Word16 tmp_code_preInt_fx[L_SUBFR];
7244 540095 : Word16 gain_code16 = 0;
7245 540095 : move16();
7246 : Word16 tmp /*, tmp1, tmp2*/;
7247 : /*Word16 random_code[L_SUBFR * HIBND_ACB_L_FAC];*/
7248 : Word16 pitch;
7249 :
7250 : Word32 L_tmp, Ltemp1, Ltemp2;
7251 : Word32 tempQ31;
7252 : Word16 tempQ15;
7253 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
7254 540095 : Flag Overflow = 0;
7255 540095 : move32();
7256 : #endif
7257 :
7258 : /**voice_factors = VF_0th_PARAM + VF_1st_PARAM * voice_fac + VF_2nd_PARAM * voice_fac * voice_fac;
7259 : = VF_0th_PARAM + voice_fac * (VF_1st_PARAM + VF_2nd_PARAM * voice_fac )
7260 : *voice_factors = min( max_val(0.0f, *voice_factors), 1.0f); */
7261 540095 : tempQ31 = L_deposit_h( VF_1st_PARAM_FX );
7262 540095 : tempQ15 = mac_r( tempQ31, VF_2nd_PARAM_FX, voice_fac_fx );
7263 540095 : tempQ31 = L_deposit_h( VF_0th_PARAM_FX );
7264 540095 : *voice_factors_fx = mac_r( tempQ31, voice_fac_fx, tempQ15 );
7265 540095 : move16();
7266 :
7267 540095 : tmp = MAX_16;
7268 540095 : move16();
7269 :
7270 540095 : pitch = shl_o( add( shl_o( T0, 2, &Overflow ), T0_frac ), 5, &Overflow ); /* Q7 */
7271 :
7272 540095 : test();
7273 540095 : test();
7274 540095 : IF( ( ( EQ_16( coder_type, VOICED ) ) || ( GT_16( pitch, 14784 ) ) ) && ( GT_32( core_brate, ACELP_8k00 ) ) )
7275 : {
7276 165809 : tmp = MAX_16;
7277 165809 : move16();
7278 165809 : *voice_factors_fx = mult_r( *voice_factors_fx, tmp );
7279 165809 : move16();
7280 : }
7281 :
7282 540095 : *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 );
7283 540095 : move16();
7284 :
7285 540095 : test();
7286 540095 : test();
7287 540095 : IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag )
7288 : {
7289 440 : test();
7290 440 : IF( flag_TD_BWE && i_subfr_fx == 0 )
7291 : {
7292 0 : set16_fx( bwe_exc_fx, 0, L_FRAME32k );
7293 : }
7294 440 : return;
7295 : }
7296 :
7297 539655 : IF( EQ_16( L_frame_fx, L_FRAME ) )
7298 : {
7299 215220 : interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr ); /* code: Q9, tmp_code: Q9 */
7300 215220 : gain_code16 = round_fx_o( L_shl_o( gain_code_fx, Q_exc, &Overflow ), &Overflow ); /*Q_exc */
7301 34650420 : FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ )
7302 : {
7303 34435200 : L_tmp = L_mult( gain_code16, tmp_code_fx[i] ); /* Q9 + Q_exc + 1*/
7304 34435200 : L_tmp = L_shl( L_tmp, 5 ); /* Q9 + Q_exc + Q6*/
7305 34435200 : 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 */
7306 34435200 : L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /*16+Q_exc */ /* saturation can occur here */
7307 34435200 : bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx_o( L_tmp, &Overflow ); /*Q_exc */
7308 34435200 : move16();
7309 : }
7310 : }
7311 : ELSE
7312 : {
7313 324435 : Word16 shift = 4;
7314 324435 : move16();
7315 324435 : IF( gain_preQ_fx != 0 )
7316 : {
7317 3932045 : FOR( i = 0; i < L_subfr; i++ )
7318 : {
7319 : /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */
7320 3871552 : Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */
7321 3871552 : Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12 */
7322 :
7323 3871552 : Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */
7324 3871552 : Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, shift ) /*Q_exc+ 2 + 6 (or) 10 - 13*/, &Overflow ); /*Q_exc+16 */
7325 :
7326 3871552 : tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc */
7327 3871552 : move16();
7328 : }
7329 : }
7330 : ELSE
7331 : {
7332 17156230 : FOR( i = 0; i < L_subfr; i++ )
7333 : {
7334 : /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */
7335 16892288 : Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */
7336 16892288 : Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */
7337 16892288 : tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow ); /* Q_exc */
7338 16892288 : move16();
7339 : }
7340 : }
7341 :
7342 324435 : interp_code_4over2_fx( tmp_code_preInt_fx, tmp_code_fx, L_subfr ); /* o: tmp_code in Q_exc */
7343 41852115 : FOR( i = 0; i < shl( L_subfr, 1 ); i++ )
7344 : {
7345 41527680 : L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + shl( i_subfr_fx, 1 )] ); /*Q14+Q_exc+1 */
7346 41527680 : tmp = round_fx_o( L_shl_o( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/, &Overflow ), &Overflow ); /* tmp in Q_exc */
7347 41527680 : bwe_exc_fx[i + shl( i_subfr_fx, 1 )] = add_o( tmp, tmp_code_fx[i], &Overflow ); /*Q_exc */
7348 41527680 : move16();
7349 : }
7350 : }
7351 :
7352 539655 : return;
7353 : }
7354 :
7355 :
7356 : /*=============================================================================*/
7357 : /* FUNCTION : void swb_formant_fac_fx ( ) */
7358 : /*------------------------------------------------------------------------------*/
7359 : /* PURPOSE : * Find strength of adaptive formant postfilter using tilt */
7360 : /* of the high band. The 2nd lpc coefficient is used as a tilt approximation. */
7361 : /*------------------------------------------------------------------------------*/
7362 : /* INPUT ARGUMENTS : */
7363 : /* const Word16 lpc_shb2 : 2nd HB LPC coefficient Q12 */
7364 : /*------------------------------------------------------------------------------*/
7365 : /*INPUT/OUTPUT ARGUMENTS : */
7366 : /* Word16 *tilt_mem Q12 */
7367 : /* OUTPUT ARGUMENTS : */
7368 : /*------------------------------------------------------------------------------*/
7369 : /* RETURN ARGUMENTS : */
7370 : /* formant_fac :Formant filter strength [0,1] Q15 */
7371 : /*------------------------------------------------------------------------------*/
7372 : /* CALLED FROM : */
7373 : /*==============================================================================*/
7374 :
7375 : /*! r: Formant filter strength [0,1] */
7376 103912 : Word16 swb_formant_fac_fx(
7377 : const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient */
7378 : Word16 *tilt_mem /* i/o: Tilt smoothing memory (Q12) */
7379 : )
7380 : {
7381 : Word16 formant_fac;
7382 : Word16 tmp;
7383 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
7384 103912 : Flag Overflow = 0;
7385 : #endif
7386 :
7387 : /* Smoothen tilt value */
7388 : /* tmp = 0.5f * (float)fabs(lpc_shb2) + 0.5f * *tilt_mem; */
7389 103912 : tmp = mult_r( 16384, abs_s( lpc_shb2 ) );
7390 103912 : tmp = add( tmp, mult_r( 16384, *tilt_mem ) ); /* Q12 */
7391 103912 : *tilt_mem = tmp;
7392 103912 : move16(); /*Q12 */
7393 : /* Map to PF strength */
7394 : /* formant_fac = (tmp - SWB_TILT_LOW)*SWB_TILT_DELTA; */
7395 103912 : tmp = sub( tmp, SWB_TILT_LOW_FX ); /* Q12 */
7396 103912 : formant_fac = mult_r( tmp, SWB_TILT_DELTA_FX ); /* Q12 */
7397 :
7398 103912 : IF( GT_16( formant_fac, 4096 /* 1 in Q12 */ ) )
7399 : {
7400 78 : formant_fac = 4096; /* 1 in Q12 */
7401 78 : move16();
7402 : }
7403 103834 : ELSE IF( formant_fac < 0 )
7404 : {
7405 91305 : formant_fac = 0;
7406 91305 : move16();
7407 : }
7408 : /* now formant_fac in Q12 */
7409 :
7410 : /* formant_fac = 1.0f - 0.5f*formant_fac */
7411 103912 : tmp = mult_r( 16384, formant_fac ); /* 0.5 in Q15 */
7412 103912 : formant_fac = shl_o( sub( 4096 /* 1 in Q12 */, tmp ), 3, &Overflow );
7413 103912 : return formant_fac; /*Q15 */
7414 : }
7415 :
7416 :
7417 : /*-------------------------------------------------------------------*
7418 : * wb_tbe_extras_reset_fx()
7419 : *
7420 : *
7421 : *-------------------------------------------------------------------*/
7422 :
7423 9902 : void wb_tbe_extras_reset_fx(
7424 : Word16 mem_genSHBexc_filt_down_wb2[],
7425 : Word16 mem_genSHBexc_filt_down_wb3[] )
7426 : {
7427 9902 : set16_fx( mem_genSHBexc_filt_down_wb2, 0, 2 * ALLPASSSECTIONS_STEEP + 1 );
7428 9902 : set16_fx( mem_genSHBexc_filt_down_wb3, 0, 2 * ALLPASSSECTIONS_STEEP + 1 );
7429 :
7430 9902 : return;
7431 : }
7432 :
7433 : /*-------------------------------------------------------------------*
7434 : * get_tbe_bits() *
7435 : * *
7436 : * Determine TBE bit consumption per frame from bitrate *
7437 : *-------------------------------------------------------------------*/
7438 :
7439 1220 : Word16 get_tbe_bits_fx(
7440 : const Word32 total_brate, /* o : TBE bit consumption per frame */
7441 : const Word16 bwidth, /* i : overall bitrate */
7442 : const Word16 rf_mode /* i : bandwidht mode */
7443 : )
7444 : {
7445 1220 : Word16 i, bits = 0;
7446 :
7447 1220 : IF( EQ_16( rf_mode, 1 ) )
7448 : {
7449 : /* TBE bits for core, primary frame */
7450 0 : test();
7451 0 : test();
7452 0 : IF( ( EQ_16( bwidth, WB ) ) && ( EQ_32( total_brate, ACELP_13k20 ) ) )
7453 : {
7454 : /* Gain frame: 4, Gain shapes: 0, and LSFs: 2 */
7455 0 : bits = NUM_BITS_SHB_FrameGain_LBR_WB + NUM_BITS_LBR_WB_LSF;
7456 0 : move16();
7457 : }
7458 0 : ELSE IF( ( EQ_16( bwidth, SWB ) ) && ( EQ_32( total_brate, ACELP_13k20 ) ) )
7459 : {
7460 : /* Gain frame: 5, Gain shapes: 5, and lowrate LSFs: 8 */
7461 0 : bits = NUM_BITS_SHB_FRAMEGAIN + NUM_BITS_SHB_SUBGAINS + 8;
7462 0 : move16();
7463 : }
7464 : }
7465 : ELSE
7466 : {
7467 1220 : test();
7468 1220 : test();
7469 1220 : IF( ( EQ_16( bwidth, WB ) ) && ( EQ_32( total_brate, ACELP_9k60 ) ) )
7470 : {
7471 0 : bits = NUM_BITS_LBR_WB_LSF + NUM_BITS_SHB_FrameGain_LBR_WB;
7472 0 : move16();
7473 : }
7474 1220 : ELSE IF( ( EQ_16( bwidth, SWB ) ) || ( EQ_16( bwidth, FB ) ) )
7475 : {
7476 1220 : test();
7477 1220 : IF( EQ_32( total_brate, ACELP_9k60 ) )
7478 : {
7479 0 : bits = NUM_BITS_SHB_FRAMEGAIN + NUM_BITS_SHB_SUBGAINS + 8;
7480 0 : move16();
7481 : }
7482 1220 : ELSE IF( ( GE_32( total_brate, ACELP_13k20 ) ) && ( LE_32( total_brate, ACELP_32k ) ) )
7483 : {
7484 1220 : bits = NUM_BITS_SHB_SUBGAINS + NUM_BITS_SHB_FRAMEGAIN + NUM_LSF_GRID_BITS + MIRROR_POINT_BITS;
7485 1220 : move16();
7486 :
7487 7320 : FOR( i = 0; i < NUM_Q_LSF; i++ )
7488 : {
7489 6100 : bits = add( bits, lsf_q_num_bits[i] );
7490 : }
7491 : }
7492 :
7493 1220 : if ( GE_32( total_brate, ACELP_24k40 ) )
7494 : {
7495 1220 : bits = add( bits, NUM_BITS_SHB_ENER_SF + NUM_BITS_SHB_VF + NUM_BITS_SHB_RES_GS * NB_SUBFR16k );
7496 : }
7497 :
7498 1220 : test();
7499 1220 : test();
7500 1220 : if ( EQ_16( bwidth, SWB ) && ( EQ_32( total_brate, ACELP_16k40 ) || EQ_32( total_brate, ACELP_24k40 ) ) )
7501 : {
7502 1220 : bits = add( bits, BITS_TEC + BITS_TFA );
7503 : }
7504 :
7505 1220 : if ( EQ_16( bwidth, FB ) )
7506 : {
7507 : /* full band slope */
7508 0 : bits = add( bits, 4 );
7509 : }
7510 : }
7511 : }
7512 :
7513 1220 : return bits;
7514 : }
|