Line data Source code
1 : /******************************************************************************************************
2 :
3 : (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
4 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
5 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
6 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
7 : contributors to this repository. All Rights Reserved.
8 :
9 : This software is protected by copyright law and by international treaties.
10 : The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
11 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
12 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
13 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
14 : contributors to this repository retain full ownership rights in their respective contributions in
15 : the software. This notice grants no license of any kind, including but not limited to patent
16 : license, nor is any license granted by implication, estoppel or otherwise.
17 :
18 : Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
19 : contributions.
20 :
21 : This software is provided "AS IS", without any express or implied warranties. The software is in the
22 : development stage. It is intended exclusively for experts who have experience with such software and
23 : solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
24 : and fitness for a particular purpose are hereby disclaimed and excluded.
25 :
26 : Any dispute, controversy or claim arising under or in relation to providing this software shall be
27 : submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
28 : accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
29 : the United Nations Convention on Contracts on the International Sales of Goods.
30 :
31 : *******************************************************************************************************/
32 :
33 : #include <stdint.h>
34 : #include "options.h" /* Compilation switches */
35 : #include "cnst.h" /* Common constants */
36 : #include "prot_fx.h" /* Function prototypes */
37 : #include "prot_fx_enc.h" /* Function prototypes */
38 : #include "rom_com.h"
39 :
40 : /*===================================================================*/
41 : /* FUNCTION : quantize_uvg_fx() */
42 : /*-------------------------------------------------------------------*/
43 : /* PURPOSE : This function returns the quantized gain vector */
44 : /* and corresponding table indices, given the
45 : input unquantized gain vector */
46 : /*-------------------------------------------------------------------*/
47 : /* INPUT ARGUMENTS : */
48 : /* _ (Word16*) G : Un-quantized gain vector (Q0) */
49 : /*-------------------------------------------------------------------*/
50 : /* OUTPUT ARGUMENTS : */
51 : /* _ (Word16) iG1 : UVG1CB_fx table index (Q0) */
52 : /* _ (Word16*) iG2 : UVG2CB_fx table indices (Q0) */
53 : /* _ (Word16*) quantG : Output quantized gain vector */
54 : /*-------------------------------------------------------------------*/
55 : /* INPUT/OUTPUT ARGUMENTS : */
56 : /* _ None. */
57 : /*-------------------------------------------------------------------*/
58 : /* RETURN ARGUMENTS : */
59 : /* _ None. */
60 : /*===================================================================*/
61 :
62 0 : void quantize_uvg_fx( Word16 *G, Word16 *iG1, Word16 *iG2, Word16 *quantG, Word16 bwidth_fx )
63 : {
64 : Word16 G1[2], G2[10], L16, L16_1;
65 : Word16 i, j, k, ind, temp;
66 : Word32 mmse;
67 : Word16 exp, tmp, frac;
68 : Word32 Lacc, Lexp[2], L_tmp;
69 0 : const Word16( *UVG1CB_fx )[2] = NULL;
70 0 : const Word16( *UVG2CB1_fx )[5] = NULL;
71 0 : const Word16( *UVG2CB2_fx )[5] = NULL;
72 0 : test();
73 0 : IF( EQ_16( bwidth_fx, NB ) )
74 : {
75 0 : UVG1CB_fx = UVG1CB_NB_FX;
76 0 : move16(); /*Q13 */
77 0 : UVG2CB1_fx = UVG2CB1_NB_FX;
78 0 : move16(); /*Q12 */
79 0 : UVG2CB2_fx = UVG2CB2_NB_FX;
80 0 : move16(); /*Q12 */
81 : }
82 0 : ELSE IF( EQ_16( bwidth_fx, WB ) || EQ_16( bwidth_fx, SWB ) )
83 : {
84 0 : UVG1CB_fx = UVG1CB_WB_FX;
85 0 : move16(); /*Q13 */
86 0 : UVG2CB1_fx = UVG2CB1_WB_FX;
87 0 : move16(); /*Q12 */
88 0 : UVG2CB2_fx = UVG2CB2_WB_FX;
89 0 : move16(); /*Q12 */
90 : }
91 :
92 :
93 0 : FOR( i = 0; i < 2; i++ )
94 : {
95 0 : Lacc = L_deposit_l( 0 );
96 0 : FOR( j = 0; j < 5; j++ )
97 : {
98 0 : ind = add( shr( extract_l( L_mult( i, 5 ) ), 1 ), j );
99 0 : Lacc = L_mac0( Lacc, G[ind], G[ind] ); /*Q0 */
100 : }
101 :
102 0 : IF( Lacc == 0 )
103 : {
104 0 : Lacc = L_deposit_l( 1 ); /* to avoid log10(0) */
105 : }
106 :
107 : /*G1[i] = (float) log10(sqrt(G1[i]/5)); */
108 0 : L_tmp = Mult_32_16( Lacc, 13108 );
109 0 : IF( L_tmp )
110 : {
111 0 : exp = norm_l( L_tmp );
112 0 : frac = Log2_norm_lc( L_shl( L_tmp, exp ) );
113 0 : exp = ( 30 - exp - 1 );
114 0 : move16(); /*(+1)=/2 in log */
115 0 : L_tmp = Mpy_32_16( exp, frac, 4932 ); /*Q16 ; 0.5*log10(2) in Q15 */
116 0 : G1[i] = round_fx( L_shl( L_tmp, 13 ) ); /*Q13 */
117 0 : move16();
118 : }
119 : ELSE
120 : {
121 0 : G1[i] = 0;
122 0 : move16();
123 : }
124 : }
125 :
126 :
127 0 : mmse = L_add( MAX_32, 0 );
128 0 : *iG1 = 0;
129 0 : move16();
130 0 : FOR( i = 0; i < UVG1_CBSIZE; i++ )
131 : {
132 0 : L16 = shr( sub_sat( G1[0], UVG1CB_fx[i][0] ), 1 ); /* Q12 */
133 0 : L16_1 = shr( sub_sat( G1[1], UVG1CB_fx[i][1] ), 1 ); /* Q12 */
134 0 : Lacc = 0;
135 0 : Lacc = L_mac0( Lacc, L16, L16 ); /*Q24 */
136 0 : Lacc = L_mac0( Lacc, L16_1, L16_1 ); /*Q24 */
137 :
138 0 : IF( LT_32( Lacc, mmse ) )
139 : {
140 0 : *iG1 = i;
141 0 : move16();
142 0 : mmse = Lacc;
143 : }
144 : }
145 :
146 0 : L_tmp = L_mult0( UVG1CB_fx[*iG1][0], 27213 ); /*Q26 */
147 0 : L_tmp = L_shr( L_tmp, 10 ); /* From Q26 to Q16 */
148 0 : frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
149 0 : L_tmp = Pow2( 30, frac );
150 0 : exp = exp - 30;
151 0 : move16();
152 0 : Lexp[0] = L_shl( L_tmp, exp + 15 );
153 0 : move32();
154 :
155 0 : L_tmp = L_mult0( UVG1CB_fx[*iG1][1], 27213 ); /*Q26 */
156 0 : L_tmp = L_shr( L_tmp, 10 ); /* From Q26 to Q16 */
157 0 : frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */
158 0 : L_tmp = Pow2( 30, frac );
159 0 : exp = exp - 30; /*move16(); */
160 0 : Lexp[1] = L_shl( L_tmp, exp + 15 );
161 0 : move32();
162 :
163 0 : FOR( i = 0; i < 2; i++ )
164 : {
165 0 : FOR( j = 0; j < 5; j++ )
166 : {
167 0 : exp = norm_l( Lexp[i] );
168 0 : tmp = extract_h( L_shl( Lexp[i], exp ) );
169 0 : exp = sub( sub( 30, exp ), 15 );
170 0 : tmp = div_s( 16384, tmp ); /*Q(15+exp) */
171 0 : L_tmp = L_shr( L_mult0( G[i * 5 + j], tmp ), exp + 3 ); /*Q12 */
172 0 : G2[i * 5 + j] = extract_l( L_tmp ); /*Q12 */
173 0 : move16();
174 : }
175 : }
176 :
177 :
178 0 : FOR( i = 0; i < 2; i++ )
179 : {
180 0 : mmse = MAX_32;
181 0 : iG2[i] = 0;
182 0 : FOR( j = 0; j < UVG2_CBSIZE; j++ )
183 : {
184 0 : Lacc = L_deposit_l( 0 );
185 0 : FOR( k = 0; k < 5; k++ )
186 : {
187 0 : IF( i == 0 )
188 : {
189 : /*mse += SQR(G2[i*5+k]-UVG2CB1[j][k]); */
190 0 : ind = add( shr( extract_l( L_mult( i, 5 ) ), 1 ), k );
191 0 : temp = sub_sat( G2[ind], UVG2CB1_fx[j][k] );
192 0 : Lacc = L_mac0_sat( Lacc, temp, temp ); /*Q24 */
193 : }
194 0 : ELSE IF( EQ_16( i, 1 ) )
195 : {
196 : /*mse += SQR(G2[i*5+k]-UVG2CB2[j][k]); */
197 0 : ind = add( shr( extract_l( L_mult( i, 5 ) ), 1 ), k );
198 0 : temp = sub_sat( G2[ind], UVG2CB2_fx[j][k] );
199 0 : Lacc = L_mac0_sat( Lacc, temp, temp ); /*Q24 */
200 : }
201 : }
202 :
203 0 : IF( LT_32( Lacc, mmse ) )
204 : {
205 0 : mmse = Lacc;
206 0 : iG2[i] = j;
207 0 : move16();
208 : }
209 : }
210 : }
211 :
212 0 : dequantize_uvg_fx( *iG1, iG2, quantG, bwidth_fx, 0 );
213 0 : }
214 :
215 : /*===================================================================*/
216 : /* FUNCTION : normalize_arr() */
217 : /*-------------------------------------------------------------------*/
218 : /* PURPOSE : Normalize array */
219 : /* */
220 : /*-------------------------------------------------------------------*/
221 : /* GLOBAL INPUT ARGUMENTS : */
222 : /* _ (Word16*) qf */
223 : /* _ (Word16*) size */
224 : /* _ (Word16*) hdr */
225 : /*-------------------------------------------------------------------*/
226 : /* OUTPUT ARGUMENTS : */
227 : /* _ (Word16*) arr : Normalized array */
228 : /*-------------------------------------------------------------------*/
229 :
230 : /* _ None */
231 : /*-------------------------------------------------------------------*/
232 : /* RETURN ARGUMENTS : */
233 : /* _ None */
234 : /*===================================================================*/
235 0 : static void normalize_arr( Word16 *arr, Word16 *qf, Word16 size, Word16 hdr )
236 : {
237 : Word16 i;
238 0 : Word16 max_s = 0;
239 :
240 0 : FOR( i = 0; i < size; i++ )
241 : {
242 0 : max_s = s_max( max_s, abs_s( arr[i] ) );
243 : }
244 :
245 0 : *qf = norm_s( (Word16) max_s );
246 0 : move16();
247 0 : test();
248 0 : IF( ( *qf == 0 ) && ( ( (Word16) max_s ) == 0 ) )
249 : {
250 0 : *qf = 15;
251 0 : move16();
252 : }
253 :
254 0 : *qf = *qf - hdr;
255 0 : move16();
256 0 : FOR( i = 0; i < size; i++ )
257 : {
258 0 : arr[i] = shl( arr[i], *qf );
259 0 : move16(); /* saturation can occur here */
260 : }
261 :
262 0 : return;
263 : }
264 :
265 :
266 : /*===================================================================*/
267 : /* FUNCTION : nelp_encoder_fx() */
268 : /*-------------------------------------------------------------------*/
269 : /* PURPOSE : NELP encoder */
270 : /* */
271 : /*-------------------------------------------------------------------*/
272 : /* GLOBAL INPUT ARGUMENTS : */
273 : /* _ (Struct) st : encoder state */
274 : /* _ (Word16[]) in_fx : residual signal (qIn) */
275 : /*-------------------------------------------------------------------*/
276 : /* OUTPUT ARGUMENTS : */
277 : /* _ (Word16[]) exc_fx : NELP quantized excitation signal (qIn) */
278 : /* _ (Word16) qIn1 : input/output qformat */
279 : /*-------------------------------------------------------------------*/
280 :
281 : /* _ (Word16[]) shape1_filt_mem_fx : filter memory (Q0) */
282 : /* _ (Word16[]) shape2_filt_mem_fx : filter memory (Q0) */
283 : /* _ (Word16[]) shape3_filt_mem_fx : filter memory (Q0) */
284 : /* _ (Word16[]) bp1_filt_mem_wb_fx : filter memory (Q0) */
285 : /* _ (Word16[]) txlpf1_filt1_mem_fx : filter memory (Q0) */
286 : /* _ (Word16[]) txlpf1_filt1_mem_fx : filter memory (Q0) */
287 : /* _ (Word16[]) txhpf1_filt2_mem_fx : filter memory (Q-1) */
288 : /* _ (Word16[]) txlpf1_filt2_mem_fx : filter memory (Q0) */
289 : /* _ (Word16) nelp_gain_mem_fx : gain memory (Q0) */
290 : /* _ (Word16) nelp_enc_seed : */
291 : /*-------------------------------------------------------------------*/
292 : /* RETURN ARGUMENTS : */
293 : /* _ None */
294 : /*===================================================================*/
295 :
296 0 : void nelp_encoder_fx(
297 : Encoder_State *st_fx, /* i/o: encoder state */
298 : Word16 *in_fx, /* i : residual signal */
299 : Word16 *exc_fx, /* o : NELP quantized excitation signal */
300 : Word16 *qIn1,
301 : Word16 reduce_gains )
302 : {
303 : Word16 i, j;
304 0 : Word16 *ptr_fx = exc_fx;
305 0 : Word16 lag = 25; /* to cover 25*9 + 31 */
306 0 : move16();
307 0 : Word16 sqrt_inv_lag = 6554; /* sqrt(1/lag) in Q15 */
308 0 : move16();
309 0 : Word16 sqrt_inv_lframe_lag = 5885; /* sqrt(1/(L_FRAME-lag*9)) */
310 0 : move16();
311 : Word16 Gains_fx[10], gain_fac_fx;
312 : Word16 iG1_fx, iG2_fx[2];
313 : Word16 fid;
314 : Word16 fdbck_fx;
315 : Word32 var_dB_fx;
316 0 : Word32 E1_fx = 0, EL1_fx = 0, EH1_fx = 0, E2_fx = 0, E3_fx = 0, EL2_fx = 0, EH2_fx = 0;
317 0 : move32(); /*E1_fx*/
318 0 : move32(); /*EL1_fx*/
319 0 : move32(); /*EH1_fx*/
320 0 : move32(); /*E2_fx*/
321 0 : move32(); /*E3_fx*/
322 0 : move32(); /*EL2_fx*/
323 0 : move32(); /*EH2_fx*/
324 0 : Word32 RL_fx = 0, RH_fx = 0;
325 0 : move32(); /*RL_fx*/
326 0 : move32(); /*RH_fx*/
327 0 : Word16 R_fx = 0;
328 0 : move16();
329 : Word16 filtRes_fx[L_FRAME];
330 : Word16 ptr_tmp_fx[L_FRAME];
331 :
332 0 : Word16 qE1 = 0, qE2 = 0, qE3 = 0, qEL1 = 0, qEL2 = 0, qEH1 = 0, qEH2 = 0;
333 0 : move16();
334 0 : move16();
335 0 : move16();
336 0 : move16();
337 0 : move16();
338 0 : move16();
339 0 : move16();
340 0 : Word16 qIn = 0, qGain = 0, qf = 0, qf1 = 0, qNelpGain = 0;
341 0 : move16();
342 0 : move16();
343 0 : move16();
344 0 : move16();
345 0 : move16();
346 : Word16 exp1, exp2, tmp1, tmp2;
347 : Word16 f_Noise, etmp, e_Noise;
348 0 : Word16 max1 = 0;
349 0 : move16();
350 : Word32 l_nelp_gain_mem;
351 0 : Word32 Ltemp = 0, Ltemp1 = 0, L_tmp = 0, L_const_1;
352 0 : move32();
353 0 : move32();
354 0 : move32();
355 : Word16 BP1_ORDER;
356 : Word16 rf_flag;
357 : #ifndef ISSUE_1867_replace_overflow_libenc
358 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
359 : Flag Overflow = 0;
360 : move32();
361 : #endif
362 : #endif
363 0 : SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR;
364 0 : BSTR_ENC_HANDLE hBstr = st_fx->hBstr;
365 0 : RF_ENC_HANDLE hRF = st_fx->hRF;
366 :
367 0 : rf_flag = st_fx->rf_mode;
368 0 : move16();
369 0 : if ( EQ_16( hSC_VBR->last_nelp_mode, 1 ) && NE_16( st_fx->bwidth, st_fx->last_bwidth ) )
370 : {
371 0 : hSC_VBR->last_nelp_mode = 0;
372 0 : move16();
373 : }
374 :
375 0 : qIn = *qIn1;
376 0 : move16();
377 0 : test();
378 0 : IF( EQ_16( st_fx->bwidth, NB ) )
379 : {
380 0 : IF( hSC_VBR->last_nelp_mode != 1 )
381 : {
382 0 : BP1_ORDER = 7;
383 0 : move16();
384 0 : set32_fx( hSC_VBR->bp1_filt_mem_nb_fx, 0, BP1_ORDER * 2 );
385 0 : hSC_VBR->qprevGain_fx = 0;
386 0 : move16();
387 : }
388 : }
389 0 : ELSE IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
390 : {
391 0 : IF( hSC_VBR->last_nelp_mode != 1 )
392 : {
393 0 : BP1_ORDER = 4;
394 0 : move16();
395 0 : set16_fx( hSC_VBR->bp1_filt_mem_wb_fx, 0, BP1_ORDER * 2 );
396 : }
397 : }
398 :
399 0 : IF( hSC_VBR->last_nelp_mode != 1 )
400 : {
401 0 : test();
402 0 : IF( st_fx->bwidth == WB || EQ_16( st_fx->bwidth, SWB ) )
403 : {
404 0 : set16_fx( hSC_VBR->shape1_filt_mem_fx, 0, 10 );
405 0 : set16_fx( hSC_VBR->shape2_filt_mem_fx, 0, 10 );
406 0 : set16_fx( hSC_VBR->shape3_filt_mem_fx, 0, 10 );
407 0 : set16_fx( hSC_VBR->txlpf1_filt1_mem_fx, 0, 10 );
408 0 : set16_fx( hSC_VBR->txlpf1_filt2_mem_fx, 0, 10 );
409 0 : set16_fx( hSC_VBR->txhpf1_filt1_mem_fx, 0, 10 );
410 0 : set16_fx( hSC_VBR->txhpf1_filt2_mem_fx, 0, 10 );
411 0 : hSC_VBR->qprevIn_fx = 0;
412 0 : move16();
413 0 : hSC_VBR->qprevGain_fx = 0;
414 0 : move16();
415 : }
416 : }
417 :
418 : /* Start Unvoiced/NELP Processing */
419 0 : test();
420 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
421 : {
422 0 : qE1 = qIn;
423 0 : move16();
424 0 : E1_fx = L_deposit_l( 0 );
425 0 : FOR( i = 0; i < L_FRAME; i++ )
426 : {
427 : #ifdef ISSUE_1867_replace_overflow_libenc
428 0 : E1_fx = L_mac0_sat( E1_fx, in_fx[i], in_fx[i] ); /*Q(qE1+qE1) */
429 : #else
430 : E1_fx = L_mac0_o( E1_fx, in_fx[i], in_fx[i], &Overflow ); /*Q(qE1+qE1) */
431 : #endif
432 : }
433 :
434 0 : qE1 = shl( qE1, 1 );
435 : ;
436 :
437 0 : qf = qIn;
438 0 : move16();
439 0 : Scale_sig( hSC_VBR->txlpf1_filt1_mem_fx, 10, ( qf - hSC_VBR->qprevIn_fx ) );
440 0 : pz_filter_sp_fx( txlpf1_num_coef_fx, txlpf1_den_coef_fx, in_fx, filtRes_fx, hSC_VBR->txlpf1_filt1_mem_fx, 10, 10, L_FRAME, 3 ); /*1 = (16-qformat of shape1 cofficient) */
441 :
442 0 : qEL1 = qf;
443 0 : move16();
444 0 : EL1_fx = L_deposit_l( 0 );
445 0 : FOR( i = 0; i < L_FRAME; i++ )
446 : {
447 : #ifdef ISSUE_1867_replace_overflow_libenc
448 0 : EL1_fx = L_mac0_sat( EL1_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qIn) */
449 : #else
450 : EL1_fx = L_mac0_o( EL1_fx, filtRes_fx[i], filtRes_fx[i], &Overflow ); /*Q(2*qIn) */
451 : #endif
452 : }
453 0 : qEL1 = shl( qEL1, 1 );
454 :
455 0 : qf = qIn;
456 0 : move16();
457 0 : Scale_sig( hSC_VBR->txhpf1_filt1_mem_fx, 10, qf - hSC_VBR->qprevIn_fx );
458 0 : pz_filter_sp_fx( txhpf1_num_coef_fx, txhpf1_den_coef_fx, in_fx, filtRes_fx, hSC_VBR->txhpf1_filt1_mem_fx, 10, 10, L_FRAME, 3 ); /*1 = (16-qformat of shape1 cofficient) */
459 0 : hSC_VBR->qprevIn_fx = qf;
460 0 : move16();
461 :
462 0 : qEH1 = qf;
463 0 : move16();
464 0 : EH1_fx = L_deposit_l( 0 );
465 0 : FOR( i = 0; i < L_FRAME; i++ )
466 : {
467 : #ifdef ISSUE_1867_replace_overflow_libenc
468 0 : EH1_fx = L_mac0_sat( EH1_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qEH1) */
469 : #else
470 : EH1_fx = L_mac0_o( EH1_fx, filtRes_fx[i], filtRes_fx[i], &Overflow ); /*Q(2*qEH1) */
471 : #endif
472 : }
473 0 : qEH1 = 2 * qEH1;
474 0 : move16();
475 : }
476 :
477 0 : qGain = qIn;
478 0 : move16();
479 0 : qGain = 2 * qGain;
480 0 : move16();
481 :
482 0 : FOR( i = 0; i < 9; i++ )
483 : {
484 0 : Ltemp = L_deposit_l( 0 );
485 0 : FOR( j = (Word16) ( i * lag ); j < (Word16) ( ( i + 1 ) * lag ); j++ )
486 : {
487 : #ifdef ISSUE_1867_replace_overflow_libenc
488 0 : Ltemp = L_mac0_sat( Ltemp, in_fx[j], in_fx[j] ); /*Q(2*qGain) */
489 : #else
490 : Ltemp = L_mac0_o( Ltemp, in_fx[j], in_fx[j], &Overflow ); /*Q(2*qGain) */
491 : #endif
492 : }
493 :
494 : /*Gains[i] = (float) sqrt(Gains[i]/lag); */
495 0 : IF( Ltemp != 0 )
496 : {
497 0 : exp1 = norm_l( Ltemp );
498 0 : tmp1 = extract_h( L_shl( Ltemp, exp1 ) ); /*2*qGain+exp1-16 */
499 0 : exp1 = sub( exp1, 30 - qGain ); /* */
500 :
501 0 : tmp1 = div_s( 16384, tmp1 ); /*14-2*qGain-exp1+16 */
502 0 : L_tmp = L_deposit_h( tmp1 );
503 0 : L_tmp = Isqrt_lc( L_tmp, &exp1 );
504 0 : L_tmp = Mult_32_16( L_tmp, sqrt_inv_lag );
505 0 : Ltemp = L_shl_sat( L_tmp, sub( exp1, 12 ) ); /*Q3 */
506 : }
507 0 : Gains_fx[i] = round_fx_sat( Ltemp );
508 0 : move16();
509 : }
510 :
511 :
512 0 : Ltemp = L_deposit_l( 0 );
513 0 : FOR( j = (Word16) ( i * lag ); j < L_FRAME; j++ )
514 : {
515 : #ifdef ISSUE_1867_replace_overflow_libenc
516 0 : Ltemp = L_mac0_sat( Ltemp, in_fx[j], in_fx[j] ); /*Q(2*qGain) */
517 : #else
518 : Ltemp = L_mac0_o( Ltemp, in_fx[j], in_fx[j], &Overflow ); /*Q(2*qGain) */
519 : #endif
520 : }
521 :
522 : /*Gains[i] = (float) sqrt(Gains[i]/(L_FRAME-(lag*i))); */
523 0 : IF( Ltemp != 0 )
524 : {
525 0 : exp1 = norm_l( Ltemp );
526 0 : tmp1 = extract_h( L_shl( Ltemp, exp1 ) );
527 0 : exp1 = sub( exp1, 30 - qGain ); /* */
528 :
529 0 : tmp1 = div_s( 16384, tmp1 );
530 0 : L_tmp = L_deposit_h( tmp1 );
531 0 : L_tmp = Isqrt_lc( L_tmp, &exp1 );
532 0 : L_tmp = Mult_32_16( L_tmp, sqrt_inv_lframe_lag );
533 0 : Ltemp = L_shl_sat( L_tmp, sub( exp1, 12 ) );
534 : }
535 :
536 0 : Gains_fx[i] = round_fx_sat( Ltemp );
537 0 : move16();
538 0 : IF( EQ_16( reduce_gains, 1 ) )
539 : {
540 0 : FOR( i = 0; i < 10; i++ )
541 : {
542 0 : Gains_fx[i] = mult( Gains_fx[i], 19661 );
543 0 : move16();
544 : }
545 : }
546 :
547 :
548 0 : qGain = 3;
549 0 : move16();
550 0 : IF( hSC_VBR->last_nelp_mode != 1 ) /* if prev frame was not NELP then init mem*/
551 : {
552 0 : hSC_VBR->nelp_gain_mem_fx = Gains_fx[0];
553 0 : move16();
554 0 : qNelpGain = qGain;
555 0 : move16();
556 : }
557 :
558 : /* tmp = (float) (20.0 * (log10 (Gains[0]) - log10 (st->nelp_gain_mem) ) ); */
559 : /* var_dB = tmp * tmp; */
560 0 : L_tmp = L_deposit_l( Gains_fx[0] );
561 0 : L_tmp = L_max( L_tmp, 1 );
562 0 : exp2 = norm_l( L_tmp );
563 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
564 0 : exp2 = 30 - exp2 - qGain;
565 0 : move16();
566 0 : tmp1 = Log2_norm_lc( L_tmp );
567 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*log(2) in Q13 format = Q0 format */
568 : /*tmp1 = round_fx(L_shl(Ltemp,12)); Q12 */
569 :
570 0 : L_tmp = L_deposit_l( hSC_VBR->nelp_gain_mem_fx ); /*Q0 */
571 0 : L_tmp = L_max( L_tmp, 1 );
572 0 : exp2 = norm_l( L_tmp );
573 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
574 0 : exp2 = sub( 30, add( exp2, qNelpGain ) );
575 0 : tmp2 = Log2_norm_lc( L_tmp );
576 0 : Ltemp1 = Mpy_32_16( exp2, tmp2, 9864 ); /*log(2) in Q13 format = Q0 format */
577 0 : Ltemp1 = L_sub( Ltemp, Ltemp1 ); /*Q16 */
578 0 : Ltemp = Mult_32_16( Ltemp1, 20480 ); /*Q11 (20 in Q10) */
579 0 : L_tmp = L_shl( Ltemp, 12 ); /*Q23 */
580 0 : var_dB_fx = Mult_32_32( L_tmp, L_tmp ); /*Q15 */
581 :
582 0 : FOR( i = 1; i < 10; i++ )
583 : {
584 0 : L_tmp = L_deposit_l( Gains_fx[i] );
585 0 : L_tmp = L_max( L_tmp, 1 );
586 0 : exp2 = norm_l( L_tmp );
587 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
588 0 : exp2 = 30 - exp2 - qGain;
589 0 : move16();
590 0 : tmp1 = Log2_norm_lc( L_tmp );
591 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*log(2) in Q13 format = Q0 format */
592 :
593 0 : L_tmp = L_deposit_l( Gains_fx[i - 1] ); /*Q0 */
594 0 : L_tmp = L_max( L_tmp, 1 );
595 0 : exp2 = norm_l( L_tmp );
596 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
597 0 : exp2 = sub( 30, add( exp2, qGain ) );
598 0 : tmp2 = Log2_norm_lc( L_tmp );
599 0 : Ltemp1 = Mpy_32_16( exp2, tmp2, 9864 ); /*log(2) in Q13 format = Q0 format */
600 0 : Ltemp1 = L_sub( Ltemp, Ltemp1 ); /*Q16 */
601 0 : Ltemp = Mult_32_16( Ltemp1, 20480 ); /*Q11 (20 in Q10) */
602 0 : L_tmp = L_shl( Ltemp, 12 ); /*Q23 */
603 0 : L_tmp = Mult_32_32( L_tmp, L_tmp ); /*Q15 */
604 0 : var_dB_fx = L_add( L_tmp, var_dB_fx ); /*Q15 */
605 : }
606 :
607 0 : IF( hSC_VBR->last_nelp_mode != 1 )
608 : {
609 : /*var_dB *= 0.111f; */
610 0 : var_dB_fx = Mult_32_16( var_dB_fx, 3637 ); /*0.111 in Q15 */
611 : }
612 : ELSE
613 : {
614 : /*var_dB *= 0.1f; */
615 0 : var_dB_fx = Mult_32_16( var_dB_fx, 3277 ); /*0.1 in Q15 */
616 : }
617 :
618 0 : max1 = 0;
619 0 : move16();
620 0 : FOR( i = 0; i < 10; i++ )
621 : {
622 0 : max1 = s_max( max1, abs_s( Gains_fx[i] ) );
623 : }
624 :
625 0 : qf = norm_s( (Word16) max1 );
626 0 : test();
627 0 : IF( ( qf == 0 ) && ( ( (Word16) max1 ) == 0 ) )
628 : {
629 0 : qf = 15;
630 0 : move16();
631 : }
632 0 : qf = sub( qf, 1 );
633 0 : qGain = add( qGain, qf );
634 :
635 0 : Scale_sig( Gains_fx, 10, qf );
636 :
637 0 : L_tmp = L_sub( var_dB_fx, 655360 ); /* 20 in Q15 */
638 0 : Ltemp = L_shr_r( L_tmp, 2 ); /*Q15 */
639 : {
640 : /*exp = pow(2, x*log2(e)) */
641 0 : L_tmp = Mult_32_16( Ltemp, 23637 ); /*15 + 14 -15 ->Q14 */
642 0 : L_tmp = L_shl( L_tmp, 2 ); /*Q16 */
643 0 : f_Noise = L_Extract_lc( L_tmp, &e_Noise ); /*Q16 */
644 0 : etmp = extract_l( Pow2( 14, f_Noise ) ); /* Put 14 as exponent */
645 0 : e_Noise = sub( e_Noise, 14 ); /* Retreive exponent of etmp */
646 :
647 :
648 0 : IF( e_Noise > 0 )
649 : {
650 0 : L_tmp = L_shl_sat( etmp, e_Noise ); /* Result in Q30 */
651 0 : L_tmp = L_add_sat( 1, L_tmp );
652 :
653 :
654 0 : exp1 = norm_l( L_tmp );
655 0 : tmp1 = extract_h( L_shl( L_tmp, exp1 ) ); /*exp1-16 */
656 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(exp1-16)-> 30+15-exp1 */
657 0 : fdbck_fx = mult( 26870, tmp1 ); /*45-exp1+15-15=>45-exp1 */
658 0 : fdbck_fx = shr_r( fdbck_fx, 14 );
659 0 : exp1 = sub( 31, exp1 );
660 : }
661 : ELSE
662 : {
663 0 : L_tmp = L_shl( etmp, add( e_Noise, 14 ) ); /* Result in Q30 */
664 0 : L_tmp = L_add( 16384, L_tmp );
665 :
666 0 : exp1 = norm_l( L_tmp );
667 0 : tmp1 = extract_h( L_shl( L_tmp, exp1 ) ); /*14+exp1-16 */
668 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(14+exp1-16)-> 16+15-exp1 */
669 0 : fdbck_fx = mult( 26870, tmp1 ); /*31-exp1+15-15=>31-exp1 */
670 0 : exp1 = sub( 31, exp1 );
671 : }
672 : }
673 :
674 0 : IF( EQ_16( exp1, 31 ) )
675 : {
676 0 : L_const_1 = 0x7fffffff;
677 0 : move32();
678 : }
679 : ELSE
680 : {
681 0 : L_const_1 = L_shl( 1, exp1 );
682 : }
683 :
684 0 : l_nelp_gain_mem = L_deposit_l( hSC_VBR->nelp_gain_mem_fx );
685 0 : IF( NE_16( qNelpGain, qGain ) )
686 : {
687 0 : l_nelp_gain_mem = L_shl( l_nelp_gain_mem, sub( qGain, qNelpGain ) );
688 : }
689 :
690 0 : FOR( i = 0; i < 10; i++ )
691 : {
692 : /*Gains[i] = (float)((1.0f - fdbck) * Gains[i] + fdbck * st->nelp_gain_mem); */
693 0 : L_tmp = L_sub( L_const_1, L_deposit_l( fdbck_fx ) ); /*31-exp1 */
694 0 : L_tmp = Mult_32_16( L_tmp, Gains_fx[i] ); /*exp1+qGain-15=>exp1-15+qGain */
695 0 : Ltemp1 = Mult_32_16( l_nelp_gain_mem, fdbck_fx ); /*exp1+qGain-15 */
696 0 : L_tmp = L_add( L_tmp, Ltemp1 );
697 0 : L_tmp = L_shr_r( L_tmp, ( exp1 - 15 ) );
698 0 : Gains_fx[i] = round_fx_sat( L_shl_sat( L_tmp, 16 ) );
699 0 : move16();
700 0 : l_nelp_gain_mem = L_tmp;
701 : }
702 :
703 0 : hSC_VBR->nelp_gain_mem_fx = round_fx( L_shl( l_nelp_gain_mem, 16 ) );
704 0 : move16();
705 0 : Scale_sig( &hSC_VBR->nelp_gain_mem_fx, 1, -qGain );
706 0 : Scale_sig( Gains_fx, 10, -qGain );
707 0 : qGain = 0;
708 0 : move16();
709 :
710 0 : quantize_uvg_fx( Gains_fx, &iG1_fx, iG2_fx, Gains_fx, st_fx->bwidth );
711 :
712 0 : IF( EQ_16( rf_flag, 1 ) )
713 : {
714 0 : hRF->rf_indx_nelp_iG1[0] = iG1_fx;
715 0 : move16();
716 0 : hRF->rf_indx_nelp_iG2[0][0] = iG2_fx[0];
717 0 : move16();
718 0 : hRF->rf_indx_nelp_iG2[0][1] = iG2_fx[1];
719 0 : move16();
720 : }
721 : ELSE
722 : {
723 0 : push_indice( hBstr, IND_IG1, iG1_fx, 5 );
724 0 : push_indice( hBstr, IND_IG2A, iG2_fx[0], 6 );
725 0 : push_indice( hBstr, IND_IG2B, iG2_fx[1], 6 );
726 : }
727 :
728 0 : test();
729 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
730 : {
731 0 : gain_fac_fx = 19005;
732 0 : move16(); /* 1.16f in Q14 */
733 : }
734 : ELSE
735 : {
736 0 : gain_fac_fx = 22446;
737 0 : move16(); /* 1.37f in Q14 */
738 : }
739 :
740 : /* Normalize Gains_fx[10] with headroom 4 */
741 : /* This fills up qGain with some new value */
742 0 : normalize_arr( Gains_fx, &qGain, 10, 4 );
743 :
744 0 : generate_nelp_excitation_fx( &( hSC_VBR->nelp_enc_seed ), Gains_fx, ptr_fx, gain_fac_fx );
745 0 : test();
746 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
747 : {
748 0 : BP1_ORDER = 4;
749 0 : move16();
750 0 : Scale_sig( hSC_VBR->bp1_filt_mem_wb_fx, BP1_ORDER * 2, qGain - hSC_VBR->qprevGain_fx ); /*qf-qAdj */
751 0 : pz_filter_sp_fx( bp1_num_coef_wb_fx, bp1_den_coef_wb_fx, ptr_fx, ptr_tmp_fx, hSC_VBR->bp1_filt_mem_wb_fx, BP1_ORDER, BP1_ORDER, L_FRAME, 2 );
752 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
753 : }
754 0 : ELSE IF( EQ_16( st_fx->bwidth, NB ) )
755 : {
756 0 : BP1_ORDER = 7;
757 0 : move16();
758 0 : Scale_sig32( hSC_VBR->bp1_filt_mem_nb_fx, BP1_ORDER * 2, ( qGain - hSC_VBR->qprevGain_fx ) );
759 0 : pz_filter_dp_fx( bp1_num_coef_nb_fx_order7, bp1_den_coef_nb_fx_order7, ptr_fx, ptr_tmp_fx, hSC_VBR->bp1_filt_mem_nb_fx, BP1_ORDER, BP1_ORDER, L_FRAME, ( sub( 16, BP1_COEF_NB_QF_ORDER7 ) ) );
760 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
761 :
762 0 : Scale_sig( ptr_fx, L_FRAME, -1 ); /* bring exc to qgain-1 */
763 0 : *qIn1 = qGain - 1; /* use this temp only in the parent */
764 0 : move16();
765 : }
766 :
767 0 : E3_fx = L_deposit_l( 0 );
768 0 : FOR( i = 0; i < L_FRAME; i++ )
769 : {
770 0 : E3_fx = L_mac_sat( E3_fx, ptr_fx[i], ptr_fx[i] ); /*Q1 */
771 : }
772 0 : qE3 = 2 * qGain + 1;
773 0 : move16();
774 0 : test();
775 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
776 : {
777 0 : Scale_sig( hSC_VBR->shape1_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
778 0 : pz_filter_sp_fx( shape1_num_coef_fx, shape1_den_coef_fx, ptr_fx, ptr_tmp_fx, hSC_VBR->shape1_filt_mem_fx, 10, 10, L_FRAME, 1 ); /*1 = (16-qformat of shape1 cofficient) */
779 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
780 :
781 0 : qf = qGain;
782 0 : move16();
783 0 : E2_fx = L_deposit_l( 0 );
784 0 : FOR( i = 0; i < L_FRAME; i++ )
785 : {
786 0 : Ltemp = L_mult0( ptr_fx[i], ptr_fx[i] ); /*Q(2*qE2+1) */
787 0 : Ltemp = L_shr_r( Ltemp, 4 );
788 0 : E2_fx = L_add( E2_fx, Ltemp );
789 : }
790 0 : qE2 = 2 * qf - 4;
791 0 : move16();
792 :
793 0 : test();
794 0 : IF( E1_fx == 0 )
795 : {
796 0 : R_fx = 0;
797 0 : move16();
798 : }
799 0 : ELSE IF( ( E2_fx == 0 ) && ( E1_fx != 0 ) )
800 : {
801 0 : exp1 = norm_l( E1_fx );
802 0 : tmp1 = extract_h( L_shl( E1_fx, exp1 ) ); /*qE1+exp1-16 */
803 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qE1+exp1-16)-> 30-qE1-exp1 */
804 0 : exp1 = sub( exp1, 30 - qE1 );
805 :
806 0 : L_tmp = L_deposit_h( tmp1 );
807 0 : L_tmp = Isqrt_lc( L_tmp, &exp1 );
808 0 : Ltemp = L_shl( L_tmp, sub( exp1, 12 ) );
809 0 : R_fx = round_fx( Ltemp );
810 : }
811 : ELSE
812 : {
813 0 : exp1 = norm_l( E1_fx );
814 0 : tmp1 = extract_h( L_shl( E1_fx, exp1 ) ); /*qE1+exp1-16 */
815 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qE1+exp1-16)-> 30-qE1-exp1 */
816 0 : L_tmp = Mult_32_16( E2_fx, tmp1 ); /*qE2+30-qE1-exp1-15=>15+qE2-qE1-exp1 */
817 :
818 0 : exp2 = norm_l( L_tmp );
819 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qE2-qE1-exp1+exp2 */
820 0 : exp2 = 30 - ( 15 + qE2 - qE1 - exp1 + exp2 );
821 0 : move16();
822 0 : L_tmp = Isqrt_lc( L_tmp, &exp2 ); /*Q(31+exp2) */
823 0 : R_fx = round_fx( L_tmp );
824 0 : exp1 = 31 - exp2 - 16 - 7;
825 0 : move16();
826 : }
827 :
828 0 : FOR( i = 0; i < L_FRAME; i++ )
829 : {
830 0 : Ltemp = L_mult0( R_fx, ptr_fx[i] );
831 0 : Ltemp = L_shr_r( Ltemp, exp1 );
832 0 : filtRes_fx[i] = round_fx_sat( L_shl_sat( Ltemp, 16 ) );
833 0 : move16();
834 : }
835 :
836 0 : qf1 = qGain;
837 0 : move16();
838 0 : Scale_sig( hSC_VBR->txlpf1_filt2_mem_fx, 10, ( qf1 - hSC_VBR->qprevGain_fx ) );
839 :
840 0 : pz_filter_sp_fx( txlpf1_num_coef_fx, txlpf1_den_coef_fx, filtRes_fx, ptr_tmp_fx, hSC_VBR->txlpf1_filt2_mem_fx, 10, 10, L_FRAME, 3 ); /*1 = (16-qformat of shape1 cofficient) */
841 0 : Copy( ptr_tmp_fx, filtRes_fx, L_FRAME );
842 :
843 0 : qEL2 = qf1;
844 0 : move16();
845 0 : EL2_fx = L_deposit_l( 0 );
846 0 : FOR( i = 0; i < L_FRAME; i++ )
847 : {
848 0 : EL2_fx = L_mac0_sat( EL2_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qEL2) */
849 : }
850 0 : qEL2 = 2 * qEL2;
851 0 : move16();
852 :
853 0 : FOR( i = 0; i < L_FRAME; i++ )
854 : {
855 0 : Ltemp = L_mult0( R_fx, ptr_fx[i] );
856 0 : Ltemp = L_shr_r( Ltemp, exp1 );
857 0 : filtRes_fx[i] = round_fx_sat( L_shl_sat( Ltemp, 16 ) );
858 0 : move16();
859 : }
860 :
861 0 : qf = qGain;
862 0 : move16();
863 0 : Scale_sig( hSC_VBR->txhpf1_filt2_mem_fx, 10, ( qf - hSC_VBR->qprevGain_fx ) );
864 0 : pz_filter_sp_fx( txhpf1_num_coef_fx, txhpf1_den_coef_fx, filtRes_fx, ptr_tmp_fx, hSC_VBR->txhpf1_filt2_mem_fx, 10, 10, L_FRAME, 3 ); /*1 = (16-qformat of shape1 cofficient) */
865 :
866 0 : Copy( ptr_tmp_fx, filtRes_fx, L_FRAME );
867 :
868 0 : qEH2 = qf;
869 0 : move16();
870 0 : EH2_fx = L_deposit_l( 0 );
871 0 : FOR( i = 0; i < L_FRAME; i++ )
872 : {
873 0 : EH2_fx = L_mac0_sat( EH2_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qEH2) */
874 : }
875 0 : qEH2 = 2 * qEH2;
876 0 : move16();
877 0 : IF( EL2_fx == 0 )
878 : {
879 0 : exp2 = norm_l( EL1_fx );
880 0 : L_tmp = L_shl( EL1_fx, exp2 );
881 0 : exp2 = sub( 30, add( exp2, qEL1 ) );
882 0 : tmp1 = Log2_norm_lc( L_tmp );
883 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*10*log(2) in Q15 format = Q0 format */
884 0 : tmp1 = round_fx_sat( L_shl_sat( Ltemp, 12 ) ); /* Q12 */
885 0 : RL_fx = L_mult0( tmp1, 10 );
886 : }
887 : ELSE
888 : {
889 0 : exp1 = norm_l( EL2_fx );
890 0 : tmp1 = extract_h( L_shl( EL2_fx, exp1 ) ); /*qEL2+exp1-16 */
891 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qEL2+exp1-16)-> 30-qEL2-exp1 */
892 0 : L_tmp = Mult_32_16( EL1_fx, tmp1 ); /*qEL1+30-qEL2-exp1-15=>15+qE1-qEL2-exp1 */
893 :
894 0 : exp2 = norm_l( L_tmp );
895 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
896 0 : exp2 = sub( add( qEL2, exp1 ), add( qEL1, exp2 ) ); /*30 - ( 30 + qEL1 - qEL2 - exp1 + exp2 )*/
897 0 : tmp1 = Log2_norm_lc( L_tmp );
898 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*10*log(2) in Q15 format = Q0 format */
899 0 : tmp1 = round_fx_sat( L_shl_sat( Ltemp, 12 ) ); /* Q12 */
900 0 : RL_fx = L_mult0( tmp1, 10 );
901 : }
902 :
903 0 : IF( EH2_fx == 0 )
904 : {
905 0 : exp2 = norm_l( EH2_fx );
906 0 : L_tmp = L_shl( EH2_fx, exp2 );
907 0 : exp2 = sub( 30, add( exp2, qEH2 ) );
908 0 : tmp1 = Log2_norm_lc( L_tmp );
909 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*10*log(2) in Q13 format = Q0 format */
910 0 : tmp1 = round_fx_sat( L_shl_sat( Ltemp, 12 ) ); /* Q12 */
911 0 : RH_fx = L_mult0( tmp1, 10 );
912 : }
913 : ELSE
914 : {
915 0 : exp1 = norm_l( EH2_fx );
916 0 : tmp1 = extract_h( L_shl( EH2_fx, exp1 ) ); /*qEH2+exp1-16 */
917 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qEH2+exp1-16)-> 30-qEH2-exp1 */
918 0 : L_tmp = Mult_32_16( EH1_fx, tmp1 ); /*15+qEH1-qEH2-exp1 */
919 :
920 0 : exp2 = norm_l( L_tmp );
921 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEH1-qEH2-exp1+exp2 */
922 0 : exp2 = sub( add( qEH2, exp1 ), add( qEH1, exp2 ) ); /*30 - ( 30 + qEH1 - qEH2 - exp1 + exp2 )*/
923 0 : tmp1 = Log2_norm_lc( L_tmp );
924 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*10*log(2) in Q13 format = Q0 format */
925 0 : tmp1 = round_fx_sat( L_shl_sat( Ltemp, 12 ) ); /* Q12 */
926 0 : RH_fx = L_mult0( tmp1, 10 );
927 : }
928 :
929 0 : fid = 0;
930 0 : move16();
931 0 : IF( LT_32( RL_fx, -12288 ) ) /* -3 in Q12 */
932 : {
933 0 : fid = 1;
934 0 : move16();
935 : }
936 0 : ELSE IF( LT_32( RH_fx, -12288 ) ) /* -3 in Q12 */
937 : {
938 0 : fid = 2;
939 0 : move16();
940 : }
941 :
942 0 : IF( rf_flag == 0 )
943 : {
944 :
945 0 : SWITCH( fid )
946 : {
947 0 : case 1:
948 : /* Update other filter memory */
949 0 : Scale_sig( hSC_VBR->shape3_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
950 0 : pz_filter_sp_fx( shape3_num_coef_fx, shape3_den_coef_fx, ptr_fx, filtRes_fx, hSC_VBR->shape3_filt_mem_fx, 10, 10, L_FRAME, 1 ); /*1 = (16-qformat of shape1 cofficient) */
951 :
952 : /* filter the residual to desired shape */
953 0 : Scale_sig( hSC_VBR->shape2_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
954 0 : pz_filter_sp_fx( shape2_num_coef_fx, shape2_den_coef_fx, ptr_fx, ptr_tmp_fx, hSC_VBR->shape2_filt_mem_fx, 10, 10, L_FRAME, 1 ); /*1 = (16-qformat of shape1 cofficient) */
955 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
956 :
957 0 : BREAK;
958 0 : case 2:
959 : /* Update other filter memory */
960 0 : Scale_sig( hSC_VBR->shape2_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
961 0 : pz_filter_sp_fx( shape2_num_coef_fx, shape2_den_coef_fx, ptr_fx, filtRes_fx, hSC_VBR->shape2_filt_mem_fx, 10, 10, L_FRAME, 1 ); /*1 = (16-qformat of shape1 cofficient) */
962 :
963 : /* filter the residual to desired shape */
964 0 : Scale_sig( hSC_VBR->shape3_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
965 0 : pz_filter_sp_fx( shape3_num_coef_fx, shape3_den_coef_fx, ptr_fx, ptr_tmp_fx, hSC_VBR->shape3_filt_mem_fx, 10, 10, L_FRAME, 1 ); /*1 = (16-qformat of shape1 cofficient) */
966 :
967 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
968 :
969 0 : BREAK;
970 0 : default:
971 0 : Scale_sig( hSC_VBR->shape2_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
972 0 : pz_filter_sp_fx( shape2_num_coef_fx, shape2_den_coef_fx, ptr_fx, filtRes_fx, hSC_VBR->shape2_filt_mem_fx, 10, 10, L_FRAME, 1 ); /*1 = (16-qformat of shape1 cofficient) */
973 :
974 0 : Scale_sig( hSC_VBR->shape3_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
975 0 : pz_filter_sp_fx( shape3_num_coef_fx, shape3_den_coef_fx, ptr_fx, filtRes_fx, hSC_VBR->shape3_filt_mem_fx, 10, 10, L_FRAME, 1 ); /*1 = (16-qformat of shape1 cofficient) */
976 :
977 0 : BREAK;
978 : }
979 :
980 0 : qE2 = qGain;
981 0 : move16();
982 :
983 0 : E2_fx = L_deposit_l( 0 );
984 0 : FOR( i = 0; i < L_FRAME; i++ )
985 : {
986 0 : Ltemp = L_mult0( ptr_fx[i], ptr_fx[i] ); /*Q(2*qE2+1) */
987 0 : Ltemp = L_shr_r( Ltemp, 4 );
988 0 : E2_fx = L_add( E2_fx, Ltemp );
989 : }
990 0 : qE2 = ( 2 * qE2 ) - 4;
991 0 : move16();
992 0 : test();
993 0 : IF( E3_fx == 0 )
994 : {
995 0 : R_fx = 0;
996 0 : move16();
997 : }
998 0 : ELSE IF( ( E2_fx == 0 ) && ( E3_fx != 0 ) )
999 : {
1000 0 : exp1 = norm_l( E3_fx );
1001 0 : tmp1 = extract_h( L_shl( E3_fx, exp1 ) ); /*qE3+exp1-16 */
1002 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qE3+exp1-16)-> 30-qE3-exp1 */
1003 0 : exp1 = sub( exp1, 30 - qE3 );
1004 :
1005 0 : L_tmp = L_deposit_h( tmp1 );
1006 0 : L_tmp = Isqrt_lc( L_tmp, &exp1 );
1007 0 : Ltemp = L_shl( L_tmp, sub( exp1, 12 ) );
1008 0 : R_fx = round_fx( Ltemp );
1009 : }
1010 : ELSE
1011 : {
1012 0 : exp1 = norm_l( E3_fx );
1013 0 : tmp1 = extract_h( L_shl( E3_fx, exp1 ) ); /*qE3+exp1-16 */
1014 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qE3+exp1-16)-> 30-qE3-exp1 */
1015 0 : L_tmp = Mult_32_16( E2_fx, tmp1 ); /*qE2+30-qE3-exp1-15=>15+qE2-qE3-exp1 */
1016 :
1017 0 : exp2 = norm_l( L_tmp );
1018 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qE2-qE3-exp1+exp2 */
1019 0 : exp2 = add( 15, sub( add( qE3, exp1 ), add( qE2, exp2 ) ) ); /*30 - ( 15 + qE2 - qE3 - exp1 + exp2 )*/
1020 0 : L_tmp = Isqrt_lc( L_tmp, &exp2 ); /*Q(31+exp2) */
1021 0 : R_fx = round_fx( L_tmp );
1022 0 : exp1 = sub( 8, exp2 ); /*31 - exp2 - 16 - 7*/
1023 0 : move16();
1024 : }
1025 :
1026 0 : FOR( i = 0; i < L_FRAME; i++ )
1027 : {
1028 0 : L_tmp = L_mult0( R_fx, ptr_fx[i] );
1029 0 : L_tmp = L_shr_r( L_tmp, exp1 + 1 );
1030 0 : ptr_fx[i] = round_fx( L_shl( L_tmp, 16 ) );
1031 0 : move16();
1032 : }
1033 0 : *qIn1 = qGain - 1;
1034 0 : move16();
1035 : }
1036 :
1037 0 : IF( EQ_16( rf_flag, 1 ) )
1038 : {
1039 0 : hRF->rf_indx_nelp_fid[0] = fid;
1040 0 : move16();
1041 : }
1042 : ELSE
1043 : {
1044 0 : push_indice( hBstr, IND_NELP_FID, fid, 2 );
1045 : }
1046 : }
1047 :
1048 0 : hSC_VBR->qprevGain_fx = qGain;
1049 0 : move16();
1050 :
1051 0 : IF( rf_flag == 0 )
1052 : {
1053 0 : FOR( i = 0; i < L_FRAME; i++ )
1054 : {
1055 0 : exc_fx[i] = ptr_fx[i];
1056 0 : move16();
1057 : }
1058 : }
1059 :
1060 0 : return;
1061 : }
1062 :
1063 0 : void nelp_encoder_ivas_fx(
1064 : Encoder_State *st_fx, /* i/o: encoder state */
1065 : Word16 *in_fx, /* i : residual signal */
1066 : Word16 *exc_fx, /* o : NELP quantized excitation signal */
1067 : Word16 *qIn1,
1068 : Word16 reduce_gains )
1069 : {
1070 : Word16 i, j;
1071 0 : Word16 *ptr_fx = exc_fx;
1072 0 : Word16 lag = 25; /* to cover 25*9 + 31 */
1073 0 : move16();
1074 0 : Word16 sqrt_inv_lag = 6554; /* sqrt(1/lag) in Q15 */
1075 0 : move16();
1076 0 : Word16 sqrt_inv_lframe_lag = 5885; /* sqrt(1/(L_FRAME-lag*9)) */
1077 0 : move16();
1078 : Word16 Gains_fx[10], gain_fac_fx;
1079 : Word16 iG1_fx, iG2_fx[2];
1080 : Word16 fid;
1081 : Word16 fdbck_fx;
1082 : Word32 var_dB_fx;
1083 0 : Word32 E1_fx = 0, EL1_fx = 0, EH1_fx = 0, E2_fx = 0, E3_fx = 0, EL2_fx = 0, EH2_fx = 0;
1084 0 : move32();
1085 0 : move32();
1086 0 : move32();
1087 0 : move32();
1088 0 : move32();
1089 0 : move32();
1090 0 : move32();
1091 0 : Word32 RL_fx = 0, RH_fx = 0;
1092 0 : move32();
1093 0 : move32();
1094 0 : Word16 R_fx = 0;
1095 0 : move16();
1096 : Word16 filtRes_fx[L_FRAME];
1097 : Word16 ptr_tmp_fx[L_FRAME];
1098 :
1099 0 : Word16 qE1 = 0, qE2 = 0, qE3 = 0, qEL1 = 0, qEL2 = 0, qEH1 = 0, qEH2 = 0;
1100 0 : move16();
1101 0 : move16();
1102 0 : move16();
1103 0 : move16();
1104 0 : move16();
1105 0 : move16();
1106 0 : move16();
1107 0 : Word16 qIn = 0, qGain = 0, qf = 0, qf1 = 0, qNelpGain = 0;
1108 0 : move16();
1109 0 : move16();
1110 0 : move16();
1111 0 : move16();
1112 0 : move16();
1113 : Word16 exp1, exp2, tmp1, tmp2;
1114 : Word16 f_Noise, etmp, e_Noise;
1115 0 : Word16 max1 = 0;
1116 0 : move16();
1117 : Word32 l_nelp_gain_mem;
1118 0 : Word32 Ltemp = 0, Ltemp1 = 0, L_tmp = 0, L_const_1;
1119 0 : move32();
1120 0 : move32();
1121 0 : move32();
1122 : Word16 BP1_ORDER;
1123 : Word16 rf_flag;
1124 : #ifndef ISSUE_1867_replace_overflow_libenc
1125 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
1126 : Flag Overflow = 0;
1127 : move32();
1128 : #endif
1129 : #endif
1130 0 : SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR;
1131 0 : BSTR_ENC_HANDLE hBstr = st_fx->hBstr;
1132 0 : RF_ENC_HANDLE hRF = st_fx->hRF;
1133 :
1134 0 : rf_flag = st_fx->rf_mode;
1135 0 : move16();
1136 :
1137 0 : test();
1138 0 : if ( EQ_16( hSC_VBR->last_nelp_mode, 1 ) && NE_16( st_fx->bwidth, st_fx->last_bwidth ) )
1139 : {
1140 0 : hSC_VBR->last_nelp_mode = 0;
1141 0 : move16();
1142 : }
1143 :
1144 0 : qIn = *qIn1;
1145 0 : move16();
1146 0 : test();
1147 0 : IF( EQ_16( st_fx->bwidth, NB ) )
1148 : {
1149 0 : IF( hSC_VBR->last_nelp_mode != 1 )
1150 : {
1151 0 : BP1_ORDER = 7;
1152 0 : move16();
1153 0 : set32_fx( hSC_VBR->bp1_filt_mem_nb_fx, 0, BP1_ORDER * 2 );
1154 0 : hSC_VBR->qprevGain_fx = 0;
1155 0 : move16();
1156 : }
1157 : }
1158 0 : ELSE IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
1159 : {
1160 0 : IF( hSC_VBR->last_nelp_mode != 1 )
1161 : {
1162 0 : BP1_ORDER = 4;
1163 0 : move16();
1164 0 : set16_fx( hSC_VBR->bp1_filt_mem_wb_fx, 0, i_mult( BP1_ORDER, 2 ) );
1165 : }
1166 : }
1167 :
1168 0 : IF( NE_16( hSC_VBR->last_nelp_mode, 1 ) )
1169 : {
1170 0 : test();
1171 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
1172 : {
1173 0 : set16_fx( hSC_VBR->shape1_filt_mem_fx, 0, 10 );
1174 0 : set16_fx( hSC_VBR->shape2_filt_mem_fx, 0, 10 );
1175 0 : set16_fx( hSC_VBR->shape3_filt_mem_fx, 0, 10 );
1176 0 : set16_fx( hSC_VBR->txlpf1_filt1_mem_fx, 0, 10 );
1177 0 : set16_fx( hSC_VBR->txlpf1_filt2_mem_fx, 0, 10 );
1178 0 : set16_fx( hSC_VBR->txhpf1_filt1_mem_fx, 0, 10 );
1179 0 : set16_fx( hSC_VBR->txhpf1_filt2_mem_fx, 0, 10 );
1180 0 : hSC_VBR->qprevIn_fx = 0;
1181 0 : move16();
1182 0 : hSC_VBR->qprevGain_fx = 0;
1183 0 : move16();
1184 : }
1185 : }
1186 :
1187 : /* Start Unvoiced/NELP Processing */
1188 0 : test();
1189 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
1190 : {
1191 0 : qE1 = qIn;
1192 0 : move16();
1193 0 : E1_fx = L_deposit_l( 0 );
1194 0 : FOR( i = 0; i < L_FRAME; i++ )
1195 : {
1196 : #ifdef ISSUE_1867_replace_overflow_libenc
1197 0 : E1_fx = L_mac0_sat( E1_fx, in_fx[i], in_fx[i] ); /*Q(qE1+qE1) */
1198 : #else
1199 : E1_fx = L_mac0_o( E1_fx, in_fx[i], in_fx[i], &Overflow ); /*Q(qE1+qE1) */
1200 : #endif
1201 : }
1202 :
1203 0 : qE1 = shl( qE1, 1 );
1204 :
1205 0 : qf = qIn;
1206 0 : move16();
1207 0 : Scale_sig( hSC_VBR->txlpf1_filt1_mem_fx, 10, ( qf - hSC_VBR->qprevIn_fx ) );
1208 0 : pz_filter_sp_fx( txlpf1_num_coef_fx, txlpf1_den_coef_fx, in_fx, filtRes_fx, hSC_VBR->txlpf1_filt1_mem_fx, 10, 10, L_FRAME, 3 ); /*1 = (16-qformat of shape1 cofficient) */
1209 :
1210 0 : qEL1 = qf;
1211 0 : move16();
1212 0 : EL1_fx = L_deposit_l( 0 );
1213 0 : FOR( i = 0; i < L_FRAME; i++ )
1214 : {
1215 : #ifdef ISSUE_1867_replace_overflow_libenc
1216 0 : EL1_fx = L_mac0_sat( EL1_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qIn) */
1217 : #else
1218 : EL1_fx = L_mac0_o( EL1_fx, filtRes_fx[i], filtRes_fx[i], &Overflow ); /*Q(2*qIn) */
1219 : #endif
1220 : }
1221 0 : qEL1 = shl( qEL1, 1 );
1222 :
1223 0 : qf = qIn;
1224 0 : move16();
1225 0 : Scale_sig( hSC_VBR->txhpf1_filt1_mem_fx, 10, qf - hSC_VBR->qprevIn_fx );
1226 0 : pz_filter_sp_fx( txhpf1_num_coef_fx, txhpf1_den_coef_fx, in_fx, filtRes_fx, hSC_VBR->txhpf1_filt1_mem_fx, 10, 10, L_FRAME, 3 ); /*1 = (16-qformat of shape1 cofficient) */
1227 0 : hSC_VBR->qprevIn_fx = qf;
1228 0 : move16();
1229 :
1230 0 : qEH1 = qf;
1231 0 : move16();
1232 0 : EH1_fx = L_deposit_l( 0 );
1233 0 : FOR( i = 0; i < L_FRAME; i++ )
1234 : {
1235 : #ifdef ISSUE_1867_replace_overflow_libenc
1236 0 : EH1_fx = L_mac0_sat( EH1_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qEH1) */
1237 : #else
1238 : EH1_fx = L_mac0_o( EH1_fx, filtRes_fx[i], filtRes_fx[i], &Overflow ); /*Q(2*qEH1) */
1239 : #endif
1240 : }
1241 0 : qEH1 = shl( qEH1, 1 );
1242 0 : move16();
1243 : }
1244 :
1245 0 : qGain = qIn;
1246 0 : move16();
1247 0 : qGain = shl( qGain, 1 );
1248 :
1249 0 : FOR( i = 0; i < 9; i++ )
1250 : {
1251 0 : Ltemp = L_deposit_l( 0 );
1252 0 : FOR( j = (Word16) ( i * lag ); j < (Word16) ( ( i + 1 ) * lag ); j++ )
1253 : {
1254 : #ifdef ISSUE_1867_replace_overflow_libenc
1255 0 : Ltemp = L_mac0_sat( Ltemp, in_fx[j], in_fx[j] ); /*Q(2*qGain) */
1256 : #else
1257 : Ltemp = L_mac0_o( Ltemp, in_fx[j], in_fx[j], &Overflow ); /*Q(2*qGain) */
1258 : #endif
1259 : }
1260 :
1261 : /*Gains[i] = (float) sqrt(Gains[i]/lag); */
1262 0 : IF( Ltemp != 0 )
1263 : {
1264 0 : exp1 = norm_l( Ltemp );
1265 0 : tmp1 = extract_h( L_shl( Ltemp, exp1 ) ); /*2*qGain+exp1-16 */
1266 0 : exp1 = sub( exp1, 30 - qGain ); /* */
1267 :
1268 0 : tmp1 = div_s( 16384, tmp1 ); /*14-2*qGain-exp1+16 */
1269 0 : L_tmp = L_deposit_h( tmp1 );
1270 0 : L_tmp = Isqrt_lc( L_tmp, &exp1 );
1271 0 : L_tmp = Mult_32_16( L_tmp, sqrt_inv_lag );
1272 0 : Ltemp = L_shl_sat( L_tmp, sub( exp1, 12 ) ); /*Q3 */
1273 : }
1274 0 : Gains_fx[i] = round_fx_sat( Ltemp );
1275 0 : move16();
1276 : }
1277 :
1278 :
1279 0 : Ltemp = L_deposit_l( 0 );
1280 0 : FOR( j = i_mult( i, lag ); j < L_FRAME; j++ )
1281 : {
1282 : #ifdef ISSUE_1867_replace_overflow_libenc
1283 0 : Ltemp = L_mac0_sat( Ltemp, in_fx[j], in_fx[j] ); /*Q(2*qGain) */
1284 : #else
1285 : Ltemp = L_mac0_o( Ltemp, in_fx[j], in_fx[j], &Overflow ); /*Q(2*qGain) */
1286 : #endif
1287 : }
1288 :
1289 : /*Gains[i] = (float) sqrt(Gains[i]/(L_FRAME-(lag*i))); */
1290 0 : IF( Ltemp != 0 )
1291 : {
1292 0 : exp1 = norm_l( Ltemp );
1293 0 : tmp1 = extract_h( L_shl( Ltemp, exp1 ) );
1294 0 : exp1 = sub( exp1, 30 - qGain ); /* */
1295 :
1296 0 : tmp1 = div_s( 16384, tmp1 );
1297 0 : L_tmp = L_deposit_h( tmp1 );
1298 0 : L_tmp = Isqrt_lc( L_tmp, &exp1 );
1299 0 : L_tmp = Mult_32_16( L_tmp, sqrt_inv_lframe_lag );
1300 0 : Ltemp = L_shl_sat( L_tmp, sub( exp1, 12 ) );
1301 : }
1302 :
1303 0 : Gains_fx[i] = round_fx_sat( Ltemp );
1304 0 : move16();
1305 :
1306 0 : IF( EQ_16( reduce_gains, 1 ) )
1307 : {
1308 0 : FOR( i = 0; i < 10; i++ )
1309 : {
1310 0 : Gains_fx[i] = mult( Gains_fx[i], 19661 );
1311 0 : move16();
1312 : }
1313 : }
1314 :
1315 :
1316 0 : qGain = 3;
1317 0 : move16();
1318 0 : IF( NE_16( hSC_VBR->last_nelp_mode, 1 ) ) /* if prev frame was not NELP then init mem*/
1319 : {
1320 0 : hSC_VBR->nelp_gain_mem_fx = Gains_fx[0];
1321 0 : move16();
1322 0 : qNelpGain = qGain;
1323 0 : move16();
1324 : }
1325 :
1326 : /* tmp = (float) (20.0 * (log10 (Gains[0]) - log10 (st->nelp_gain_mem) ) ); */
1327 : /* var_dB = tmp * tmp; */
1328 0 : L_tmp = L_deposit_l( Gains_fx[0] );
1329 0 : L_tmp = L_max( L_tmp, 1 );
1330 0 : exp2 = norm_l( L_tmp );
1331 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
1332 0 : exp2 = sub( sub( 30, exp2 ), qGain );
1333 0 : tmp1 = Log2_norm_lc( L_tmp );
1334 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*log(2) in Q13 format = Q0 format */
1335 : /*tmp1 = round_fx(L_shl(Ltemp,12)); Q12 */
1336 :
1337 0 : L_tmp = L_deposit_l( hSC_VBR->nelp_gain_mem_fx ); /*Q0 */
1338 0 : L_tmp = L_max( L_tmp, 1 );
1339 0 : exp2 = norm_l( L_tmp );
1340 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
1341 0 : exp2 = sub( sub( 30, exp2 ), qNelpGain );
1342 0 : tmp2 = Log2_norm_lc( L_tmp );
1343 0 : Ltemp1 = Mpy_32_16( exp2, tmp2, 9864 ); /*log(2) in Q13 format = Q0 format */
1344 0 : Ltemp1 = L_sub( Ltemp, Ltemp1 ); /*Q16 */
1345 0 : Ltemp = Mult_32_16( Ltemp1, 20480 ); /*Q11 (20 in Q10) */
1346 0 : L_tmp = L_shl( Ltemp, 12 ); /*Q23 */
1347 0 : var_dB_fx = Mult_32_32( L_tmp, L_tmp ); /*Q15 */
1348 :
1349 0 : FOR( i = 1; i < 10; i++ )
1350 : {
1351 0 : L_tmp = L_deposit_l( Gains_fx[i] );
1352 0 : L_tmp = L_max( L_tmp, 1 );
1353 0 : exp2 = norm_l( L_tmp );
1354 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
1355 0 : exp2 = sub( sub( 30, exp2 ), qGain );
1356 0 : tmp1 = Log2_norm_lc( L_tmp );
1357 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*log(2) in Q13 format = Q0 format */
1358 :
1359 0 : L_tmp = L_deposit_l( Gains_fx[i - 1] ); /*Q0 */
1360 0 : L_tmp = L_max( L_tmp, 1 );
1361 0 : exp2 = norm_l( L_tmp );
1362 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
1363 0 : exp2 = sub( sub( 30, exp2 ), qGain );
1364 0 : tmp2 = Log2_norm_lc( L_tmp );
1365 0 : Ltemp1 = Mpy_32_16( exp2, tmp2, 9864 ); /*log(2) in Q13 format = Q0 format */
1366 0 : Ltemp1 = L_sub( Ltemp, Ltemp1 ); /*Q16 */
1367 0 : Ltemp = Mult_32_16( Ltemp1, 20480 ); /*Q11 (20 in Q10) */
1368 0 : L_tmp = L_shl( Ltemp, 12 ); /*Q23 */
1369 0 : L_tmp = Mult_32_32( L_tmp, L_tmp ); /*Q15 */
1370 0 : var_dB_fx = L_add( L_tmp, var_dB_fx ); /*Q15 */
1371 : }
1372 :
1373 0 : IF( NE_16( hSC_VBR->last_nelp_mode, 1 ) )
1374 : {
1375 : /*var_dB *= 0.111f; */
1376 0 : var_dB_fx = Mult_32_16( var_dB_fx, 3637 ); /*0.111 in Q15 */
1377 : }
1378 : ELSE
1379 : {
1380 : /*var_dB *= 0.1f; */
1381 0 : var_dB_fx = Mult_32_16( var_dB_fx, 3277 ); /*0.1 in Q15 */
1382 : }
1383 :
1384 0 : max1 = 0;
1385 0 : move16();
1386 0 : FOR( i = 0; i < 10; i++ )
1387 : {
1388 0 : max1 = s_max( max1, abs_s( Gains_fx[i] ) );
1389 : }
1390 :
1391 0 : qf = norm_s( max1 );
1392 0 : test();
1393 0 : IF( ( qf == 0 ) && ( max1 == 0 ) )
1394 : {
1395 0 : qf = 15;
1396 0 : move16();
1397 : }
1398 0 : qf = sub( qf, 1 );
1399 0 : qGain = add( qGain, qf );
1400 :
1401 0 : Scale_sig( Gains_fx, 10, qf );
1402 :
1403 0 : L_tmp = L_sub( var_dB_fx, 655360 ); /* 20 in Q15 */
1404 0 : Ltemp = L_shr_r( L_tmp, 2 ); /*Q15 */
1405 : {
1406 : /*exp = pow(2, x*log2(e)) */
1407 0 : L_tmp = Mult_32_16( Ltemp, 23637 ); /*15 + 14 -15 ->Q14 */
1408 0 : L_tmp = L_shl( L_tmp, 2 ); /*Q16 */
1409 0 : f_Noise = L_Extract_lc( L_tmp, &e_Noise ); /*Q16 */
1410 0 : etmp = extract_l( Pow2( 14, f_Noise ) ); /* Put 14 as exponent */
1411 0 : e_Noise = sub( e_Noise, 14 ); /* Retreive exponent of etmp */
1412 :
1413 :
1414 0 : IF( e_Noise > 0 )
1415 : {
1416 0 : L_tmp = L_shl_sat( etmp, e_Noise ); /* Result in Q30 */
1417 0 : L_tmp = L_add_sat( 1, L_tmp );
1418 :
1419 :
1420 0 : exp1 = norm_l( L_tmp );
1421 0 : tmp1 = extract_h( L_shl( L_tmp, exp1 ) ); /*exp1-16 */
1422 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(exp1-16)-> 30+15-exp1 */
1423 0 : fdbck_fx = mult( 26870, tmp1 ); /*45-exp1+15-15=>45-exp1 */
1424 0 : fdbck_fx = shr_r( fdbck_fx, 14 );
1425 0 : exp1 = sub( 31, exp1 );
1426 : }
1427 : ELSE
1428 : {
1429 0 : L_tmp = L_shl( etmp, add( e_Noise, 14 ) ); /* Result in Q30 */
1430 0 : L_tmp = L_add( 16384, L_tmp );
1431 :
1432 0 : exp1 = norm_l( L_tmp );
1433 0 : tmp1 = extract_h( L_shl( L_tmp, exp1 ) ); /*14+exp1-16 */
1434 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(14+exp1-16)-> 16+15-exp1 */
1435 0 : fdbck_fx = mult( 26870, tmp1 ); /*31-exp1+15-15=>31-exp1 */
1436 0 : exp1 = sub( 31, exp1 );
1437 : }
1438 : }
1439 :
1440 0 : IF( EQ_16( exp1, 31 ) )
1441 : {
1442 0 : L_const_1 = 0x7fffffff;
1443 0 : move32();
1444 : }
1445 : ELSE
1446 : {
1447 0 : L_const_1 = L_shl( 1, exp1 );
1448 : }
1449 :
1450 0 : l_nelp_gain_mem = L_deposit_l( hSC_VBR->nelp_gain_mem_fx );
1451 0 : IF( NE_16( qNelpGain, qGain ) )
1452 : {
1453 0 : l_nelp_gain_mem = L_shl( l_nelp_gain_mem, sub( qGain, qNelpGain ) );
1454 : }
1455 :
1456 0 : FOR( i = 0; i < 10; i++ )
1457 : {
1458 : /*Gains[i] = (float)((1.0f - fdbck) * Gains[i] + fdbck * st->nelp_gain_mem); */
1459 0 : L_tmp = L_sub( L_const_1, L_deposit_l( fdbck_fx ) ); /*31-exp1 */
1460 0 : L_tmp = Mult_32_16( L_tmp, Gains_fx[i] ); /*exp1+qGain-15=>exp1-15+qGain */
1461 0 : Ltemp1 = Mult_32_16( l_nelp_gain_mem, fdbck_fx ); /*exp1+qGain-15 */
1462 0 : L_tmp = L_add( L_tmp, Ltemp1 );
1463 0 : L_tmp = L_shr_r( L_tmp, ( exp1 - 15 ) );
1464 0 : Gains_fx[i] = round_fx_sat( L_shl_sat( L_tmp, 16 ) );
1465 0 : move16();
1466 0 : l_nelp_gain_mem = L_tmp;
1467 : }
1468 :
1469 0 : hSC_VBR->nelp_gain_mem_fx = round_fx( L_shl( l_nelp_gain_mem, 16 ) );
1470 0 : move16();
1471 :
1472 0 : Scale_sig( &hSC_VBR->nelp_gain_mem_fx, 1, -qGain );
1473 0 : Scale_sig( Gains_fx, 10, -qGain );
1474 0 : qGain = 0;
1475 0 : move16();
1476 :
1477 0 : quantize_uvg_fx( Gains_fx, &iG1_fx, iG2_fx, Gains_fx, st_fx->bwidth );
1478 :
1479 0 : IF( EQ_16( rf_flag, 1 ) )
1480 : {
1481 0 : hRF->rf_indx_nelp_iG1[0] = iG1_fx;
1482 0 : move16();
1483 0 : hRF->rf_indx_nelp_iG2[0][0] = iG2_fx[0];
1484 0 : move16();
1485 0 : hRF->rf_indx_nelp_iG2[0][1] = iG2_fx[1];
1486 0 : move16();
1487 : }
1488 : ELSE
1489 : {
1490 0 : push_indice( hBstr, IND_IG1, iG1_fx, 5 );
1491 0 : push_indice( hBstr, IND_IG2A, iG2_fx[0], 6 );
1492 0 : push_indice( hBstr, IND_IG2B, iG2_fx[1], 6 );
1493 : }
1494 :
1495 0 : test();
1496 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
1497 : {
1498 0 : gain_fac_fx = 19005;
1499 0 : move16(); /* 1.16f in Q14 */
1500 : }
1501 : ELSE
1502 : {
1503 0 : gain_fac_fx = 22446;
1504 0 : move16(); /* 1.37f in Q14 */
1505 : }
1506 :
1507 : /* Normalize Gains_fx[10] with headroom 4 */
1508 : /* This fills up qGain with some new value */
1509 0 : normalize_arr( Gains_fx, &qGain, 10, 4 );
1510 :
1511 0 : generate_nelp_excitation_fx( &( hSC_VBR->nelp_enc_seed ), Gains_fx, ptr_fx, gain_fac_fx );
1512 0 : test();
1513 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
1514 : {
1515 0 : BP1_ORDER = 4;
1516 0 : move16();
1517 0 : Scale_sig( hSC_VBR->bp1_filt_mem_wb_fx, BP1_ORDER * 2, qGain - hSC_VBR->qprevGain_fx ); /*qf-qAdj */
1518 0 : pz_filter_sp_fx( bp1_num_coef_wb_fx, bp1_den_coef_wb_fx, ptr_fx, ptr_tmp_fx, hSC_VBR->bp1_filt_mem_wb_fx, BP1_ORDER, BP1_ORDER, L_FRAME, 2 );
1519 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
1520 : }
1521 0 : ELSE IF( EQ_16( st_fx->bwidth, NB ) )
1522 : {
1523 0 : BP1_ORDER = 7;
1524 0 : move16();
1525 0 : Scale_sig32( hSC_VBR->bp1_filt_mem_nb_fx, BP1_ORDER * 2, ( qGain - hSC_VBR->qprevGain_fx ) );
1526 0 : pz_filter_dp_fx( bp1_num_coef_nb_fx_order7, bp1_den_coef_nb_fx_order7, ptr_fx, ptr_tmp_fx, hSC_VBR->bp1_filt_mem_nb_fx, BP1_ORDER, BP1_ORDER, L_FRAME, ( sub( 16, BP1_COEF_NB_QF_ORDER7 ) ) );
1527 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
1528 :
1529 0 : Scale_sig( ptr_fx, L_FRAME, -1 ); /* bring exc to qgain-1 */
1530 0 : *qIn1 = sub( qGain, 1 ); /* use this temp only in the parent */
1531 : }
1532 :
1533 0 : E3_fx = L_deposit_l( 0 );
1534 0 : FOR( i = 0; i < L_FRAME; i++ )
1535 : {
1536 0 : E3_fx = L_mac_sat( E3_fx, ptr_fx[i], ptr_fx[i] ); /*Q1 */
1537 : }
1538 0 : qE3 = add( shl( qGain, 1 ), 1 );
1539 :
1540 0 : test();
1541 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
1542 : {
1543 0 : Scale_sig( hSC_VBR->shape1_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
1544 0 : pz_filter_sp_fx( shape1_num_coef_fx, shape1_den_coef_fx, ptr_fx, ptr_tmp_fx, hSC_VBR->shape1_filt_mem_fx, 10, 10, L_FRAME, 1 ); /*1 = (16-qformat of shape1 cofficient) */
1545 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
1546 :
1547 0 : qf = qGain;
1548 0 : move16();
1549 0 : E2_fx = L_deposit_l( 0 );
1550 0 : FOR( i = 0; i < L_FRAME; i++ )
1551 : {
1552 0 : Ltemp = L_mult0( ptr_fx[i], ptr_fx[i] ); /*Q(2*qE2+1) */
1553 0 : Ltemp = L_shr_r( Ltemp, 4 );
1554 0 : E2_fx = L_add( E2_fx, Ltemp );
1555 : }
1556 0 : qE2 = sub( shl( qf, 1 ), 4 );
1557 :
1558 0 : test();
1559 0 : IF( E1_fx == 0 )
1560 : {
1561 0 : R_fx = 0;
1562 0 : move16();
1563 : }
1564 0 : ELSE IF( ( E2_fx == 0 ) && ( E1_fx != 0 ) )
1565 : {
1566 0 : exp1 = norm_l( E1_fx );
1567 0 : tmp1 = extract_h( L_shl( E1_fx, exp1 ) ); /*qE1+exp1-16 */
1568 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qE1+exp1-16)-> 30-qE1-exp1 */
1569 0 : exp1 = sub( exp1, 30 - qE1 );
1570 :
1571 0 : L_tmp = L_deposit_h( tmp1 );
1572 0 : L_tmp = Isqrt_lc( L_tmp, &exp1 );
1573 0 : Ltemp = L_shl( L_tmp, sub( exp1, 12 ) );
1574 0 : R_fx = round_fx( Ltemp );
1575 : }
1576 : ELSE
1577 : {
1578 0 : exp1 = norm_l( E1_fx );
1579 0 : tmp1 = extract_h( L_shl( E1_fx, exp1 ) ); /*qE1+exp1-16 */
1580 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qE1+exp1-16)-> 30-qE1-exp1 */
1581 0 : L_tmp = Mult_32_16( E2_fx, tmp1 ); /*qE2+30-qE1-exp1-15=>15+qE2-qE1-exp1 */
1582 :
1583 0 : exp2 = norm_l( L_tmp );
1584 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qE2-qE1-exp1+exp2 */
1585 0 : exp2 = add( 15, add( sub( sub( qE2, qE1 ), exp1 ), exp2 ) );
1586 0 : L_tmp = Isqrt_lc( L_tmp, &exp2 ); /*Q(31+exp2) */
1587 0 : R_fx = round_fx( L_tmp );
1588 0 : exp1 = sub( 8, exp2 );
1589 : }
1590 :
1591 0 : FOR( i = 0; i < L_FRAME; i++ )
1592 : {
1593 0 : Ltemp = L_mult0( R_fx, ptr_fx[i] );
1594 0 : Ltemp = L_shr_r( Ltemp, exp1 );
1595 0 : filtRes_fx[i] = round_fx_sat( L_shl_sat( Ltemp, 16 ) );
1596 0 : move16();
1597 : }
1598 :
1599 0 : qf1 = qGain;
1600 0 : move16();
1601 0 : Scale_sig( hSC_VBR->txlpf1_filt2_mem_fx, 10, ( qf1 - hSC_VBR->qprevGain_fx ) );
1602 :
1603 0 : pz_filter_sp_fx( txlpf1_num_coef_fx, txlpf1_den_coef_fx, filtRes_fx, ptr_tmp_fx, hSC_VBR->txlpf1_filt2_mem_fx, 10, 10, L_FRAME, 3 ); /*1 = (16-qformat of shape1 cofficient) */
1604 0 : Copy( ptr_tmp_fx, filtRes_fx, L_FRAME );
1605 :
1606 0 : qEL2 = qf1;
1607 0 : move16();
1608 0 : EL2_fx = L_deposit_l( 0 );
1609 0 : FOR( i = 0; i < L_FRAME; i++ )
1610 : {
1611 0 : EL2_fx = L_mac0_sat( EL2_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qEL2) */
1612 : }
1613 0 : qEL2 = shl( qEL2, 1 );
1614 :
1615 0 : FOR( i = 0; i < L_FRAME; i++ )
1616 : {
1617 0 : Ltemp = L_mult0( R_fx, ptr_fx[i] );
1618 0 : Ltemp = L_shr_r( Ltemp, exp1 );
1619 0 : filtRes_fx[i] = round_fx_sat( L_shl_sat( Ltemp, 16 ) );
1620 0 : move16();
1621 : }
1622 :
1623 0 : qf = qGain;
1624 0 : move16();
1625 0 : Scale_sig( hSC_VBR->txhpf1_filt2_mem_fx, 10, ( qf - hSC_VBR->qprevGain_fx ) );
1626 0 : pz_filter_sp_fx( txhpf1_num_coef_fx, txhpf1_den_coef_fx, filtRes_fx, ptr_tmp_fx, hSC_VBR->txhpf1_filt2_mem_fx, 10, 10, L_FRAME, 3 ); /*1 = (16-qformat of shape1 cofficient) */
1627 :
1628 0 : Copy( ptr_tmp_fx, filtRes_fx, L_FRAME );
1629 :
1630 0 : qEH2 = qf;
1631 0 : move16();
1632 0 : EH2_fx = L_deposit_l( 0 );
1633 0 : FOR( i = 0; i < L_FRAME; i++ )
1634 : {
1635 0 : EH2_fx = L_mac0_sat( EH2_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qEH2) */
1636 : }
1637 0 : qEH2 = shl( qEH2, 1 );
1638 0 : IF( EL2_fx == 0 )
1639 : {
1640 0 : exp2 = norm_l( EL1_fx );
1641 0 : L_tmp = L_shl( EL1_fx, exp2 );
1642 0 : exp2 = sub( sub( 30, exp2 ), qEL1 );
1643 0 : tmp1 = Log2_norm_lc( L_tmp );
1644 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*10*log(2) in Q15 format = Q0 format */
1645 0 : tmp1 = round_fx_sat( L_shl_sat( Ltemp, 12 ) ); /* Q12 */
1646 0 : RL_fx = L_mult0( tmp1, 10 );
1647 : }
1648 : ELSE
1649 : {
1650 0 : exp1 = norm_l( EL2_fx );
1651 0 : tmp1 = extract_h( L_shl( EL2_fx, exp1 ) ); /*qEL2+exp1-16 */
1652 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qEL2+exp1-16)-> 30-qEL2-exp1 */
1653 0 : L_tmp = Mult_32_16( EL1_fx, tmp1 ); /*qEL1+30-qEL2-exp1-15=>15+qE1-qEL2-exp1 */
1654 :
1655 0 : exp2 = norm_l( L_tmp );
1656 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
1657 0 : exp2 = sub( 30, add( sub( sub( add( 30, qEL1 ), qEL2 ), exp1 ), exp2 ) );
1658 0 : tmp1 = Log2_norm_lc( L_tmp );
1659 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*10*log(2) in Q15 format = Q0 format */
1660 0 : tmp1 = round_fx_sat( L_shl_sat( Ltemp, 12 ) ); /* Q12 */
1661 0 : RL_fx = L_mult0( tmp1, 10 );
1662 : }
1663 :
1664 0 : IF( EH2_fx == 0 )
1665 : {
1666 0 : exp2 = norm_l( EH2_fx );
1667 0 : L_tmp = L_shl( EH2_fx, exp2 );
1668 0 : exp2 = sub( sub( 30, exp2 ), qEH2 );
1669 0 : tmp1 = Log2_norm_lc( L_tmp );
1670 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*10*log(2) in Q13 format = Q0 format */
1671 0 : tmp1 = round_fx_sat( L_shl_sat( Ltemp, 12 ) ); /* Q12 */
1672 0 : RH_fx = L_mult0( tmp1, 10 );
1673 : }
1674 : ELSE
1675 : {
1676 0 : exp1 = norm_l( EH2_fx );
1677 0 : tmp1 = extract_h( L_shl( EH2_fx, exp1 ) ); /*qEH2+exp1-16 */
1678 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qEH2+exp1-16)-> 30-qEH2-exp1 */
1679 0 : L_tmp = Mult_32_16( EH1_fx, tmp1 ); /*15+qEH1-qEH2-exp1 */
1680 :
1681 0 : exp2 = norm_l( L_tmp );
1682 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEH1-qEH2-exp1+exp2 */
1683 0 : exp2 = sub( 30, add( 30, add( sub( sub( qEH1, qEH2 ), exp1 ), exp2 ) ) );
1684 0 : tmp1 = Log2_norm_lc( L_tmp );
1685 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*10*log(2) in Q13 format = Q0 format */
1686 0 : tmp1 = round_fx_sat( L_shl_sat( Ltemp, 12 ) ); /* Q12 */
1687 0 : RH_fx = L_mult0( tmp1, 10 );
1688 : }
1689 :
1690 0 : fid = 0;
1691 0 : move16();
1692 0 : IF( LT_32( RL_fx, -12288 ) ) /* -3 in Q12 */
1693 : {
1694 0 : fid = 1;
1695 0 : move16();
1696 : }
1697 0 : ELSE IF( LT_32( RH_fx, -12288 ) ) /* -3 in Q12 */
1698 : {
1699 0 : fid = 2;
1700 0 : move16();
1701 : }
1702 :
1703 0 : IF( rf_flag == 0 )
1704 : {
1705 :
1706 0 : SWITCH( fid )
1707 : {
1708 0 : case 1:
1709 : /* Update other filter memory */
1710 0 : Scale_sig( hSC_VBR->shape3_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
1711 0 : pz_filter_sp_fx( shape3_num_coef_fx, shape3_den_coef_fx, ptr_fx, filtRes_fx, hSC_VBR->shape3_filt_mem_fx, 10, 10, L_FRAME, 1 ); /*1 = (16-qformat of shape1 cofficient) */
1712 :
1713 : /* filter the residual to desired shape */
1714 0 : Scale_sig( hSC_VBR->shape2_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
1715 0 : pz_filter_sp_fx( shape2_num_coef_fx, shape2_den_coef_fx, ptr_fx, ptr_tmp_fx, hSC_VBR->shape2_filt_mem_fx, 10, 10, L_FRAME, 1 ); /*1 = (16-qformat of shape1 cofficient) */
1716 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
1717 :
1718 0 : BREAK;
1719 0 : case 2:
1720 : /* Update other filter memory */
1721 0 : Scale_sig( hSC_VBR->shape2_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
1722 0 : pz_filter_sp_fx( shape2_num_coef_fx, shape2_den_coef_fx, ptr_fx, filtRes_fx, hSC_VBR->shape2_filt_mem_fx, 10, 10, L_FRAME, 1 ); /*1 = (16-qformat of shape1 cofficient) */
1723 :
1724 : /* filter the residual to desired shape */
1725 0 : Scale_sig( hSC_VBR->shape3_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
1726 0 : pz_filter_sp_fx( shape3_num_coef_fx, shape3_den_coef_fx, ptr_fx, ptr_tmp_fx, hSC_VBR->shape3_filt_mem_fx, 10, 10, L_FRAME, 1 ); /*1 = (16-qformat of shape1 cofficient) */
1727 :
1728 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
1729 :
1730 0 : BREAK;
1731 0 : default:
1732 0 : Scale_sig( hSC_VBR->shape2_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
1733 0 : pz_filter_sp_fx( shape2_num_coef_fx, shape2_den_coef_fx, ptr_fx, filtRes_fx, hSC_VBR->shape2_filt_mem_fx, 10, 10, L_FRAME, 1 ); /*1 = (16-qformat of shape1 cofficient) */
1734 :
1735 0 : Scale_sig( hSC_VBR->shape3_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
1736 0 : pz_filter_sp_fx( shape3_num_coef_fx, shape3_den_coef_fx, ptr_fx, filtRes_fx, hSC_VBR->shape3_filt_mem_fx, 10, 10, L_FRAME, 1 ); /*1 = (16-qformat of shape1 cofficient) */
1737 :
1738 0 : BREAK;
1739 : }
1740 :
1741 0 : qE2 = qGain;
1742 0 : move16();
1743 :
1744 0 : E2_fx = L_deposit_l( 0 );
1745 0 : FOR( i = 0; i < L_FRAME; i++ )
1746 : {
1747 0 : Ltemp = L_mult0( ptr_fx[i], ptr_fx[i] ); /*Q(2*qE2+1) */
1748 0 : Ltemp = L_shr_r( Ltemp, 4 );
1749 0 : E2_fx = L_add( E2_fx, Ltemp );
1750 : }
1751 0 : qE2 = sub( shl( qE2, 1 ), 4 );
1752 :
1753 0 : test();
1754 0 : IF( E3_fx == 0 )
1755 : {
1756 0 : R_fx = 0;
1757 0 : move16();
1758 : }
1759 0 : ELSE IF( ( E2_fx == 0 ) && ( E3_fx != 0 ) )
1760 : {
1761 0 : exp1 = norm_l( E3_fx );
1762 0 : tmp1 = extract_h( L_shl( E3_fx, exp1 ) ); /*qE3+exp1-16 */
1763 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qE3+exp1-16)-> 30-qE3-exp1 */
1764 0 : exp1 = sub( exp1, 30 - qE3 );
1765 :
1766 0 : L_tmp = L_deposit_h( tmp1 );
1767 0 : L_tmp = Isqrt_lc( L_tmp, &exp1 );
1768 0 : Ltemp = L_shl( L_tmp, sub( exp1, 12 ) );
1769 0 : R_fx = round_fx( Ltemp );
1770 : }
1771 : ELSE
1772 : {
1773 0 : exp1 = norm_l( E3_fx );
1774 0 : tmp1 = extract_h( L_shl( E3_fx, exp1 ) ); /*qE3+exp1-16 */
1775 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qE3+exp1-16)-> 30-qE3-exp1 */
1776 0 : L_tmp = Mult_32_16( E2_fx, tmp1 ); /*qE2+30-qE3-exp1-15=>15+qE2-qE3-exp1 */
1777 :
1778 0 : exp2 = norm_l( L_tmp );
1779 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qE2-qE3-exp1+exp2 */
1780 0 : exp2 = sub( 30, add( sub( sub( add( 15, qE2 ), qE3 ), exp1 ), exp2 ) );
1781 0 : L_tmp = Isqrt_lc( L_tmp, &exp2 ); /*Q(31+exp2) */
1782 0 : R_fx = round_fx( L_tmp );
1783 0 : exp1 = sub( sub( sub( 31, exp2 ), 16 ), 7 );
1784 : }
1785 :
1786 0 : FOR( i = 0; i < L_FRAME; i++ )
1787 : {
1788 0 : L_tmp = L_mult0( R_fx, ptr_fx[i] );
1789 0 : L_tmp = L_shr_r( L_tmp, exp1 + 1 );
1790 0 : ptr_fx[i] = round_fx( L_shl( L_tmp, 16 ) );
1791 0 : move16();
1792 : }
1793 0 : *qIn1 = sub( qGain, 1 );
1794 0 : move16();
1795 : }
1796 :
1797 0 : IF( EQ_16( rf_flag, 1 ) )
1798 : {
1799 0 : hRF->rf_indx_nelp_fid[0] = fid;
1800 0 : move16();
1801 : }
1802 : ELSE
1803 : {
1804 0 : push_indice( hBstr, IND_NELP_FID, fid, 2 );
1805 : }
1806 : }
1807 :
1808 0 : hSC_VBR->qprevGain_fx = qGain;
1809 0 : move16();
1810 :
1811 0 : IF( rf_flag == 0 )
1812 : {
1813 0 : FOR( i = 0; i < L_FRAME; i++ )
1814 : {
1815 0 : exc_fx[i] = ptr_fx[i];
1816 0 : move16();
1817 : }
1818 : }
1819 :
1820 0 : return;
1821 : }
|