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 0 : SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR;
358 0 : BSTR_ENC_HANDLE hBstr = st_fx->hBstr;
359 0 : RF_ENC_HANDLE hRF = st_fx->hRF;
360 :
361 0 : rf_flag = st_fx->rf_mode;
362 0 : move16();
363 0 : if ( EQ_16( hSC_VBR->last_nelp_mode, 1 ) && NE_16( st_fx->bwidth, st_fx->last_bwidth ) )
364 : {
365 0 : hSC_VBR->last_nelp_mode = 0;
366 0 : move16();
367 : }
368 :
369 0 : qIn = *qIn1;
370 0 : move16();
371 0 : test();
372 0 : IF( EQ_16( st_fx->bwidth, NB ) )
373 : {
374 0 : IF( hSC_VBR->last_nelp_mode != 1 )
375 : {
376 0 : BP1_ORDER = 7;
377 0 : move16();
378 0 : set32_fx( hSC_VBR->bp1_filt_mem_nb_fx, 0, BP1_ORDER * 2 );
379 0 : hSC_VBR->qprevGain_fx = 0;
380 0 : move16();
381 : }
382 : }
383 0 : ELSE IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
384 : {
385 0 : IF( hSC_VBR->last_nelp_mode != 1 )
386 : {
387 0 : BP1_ORDER = 4;
388 0 : move16();
389 0 : set16_fx( hSC_VBR->bp1_filt_mem_wb_fx, 0, BP1_ORDER * 2 );
390 : }
391 : }
392 :
393 0 : IF( hSC_VBR->last_nelp_mode != 1 )
394 : {
395 0 : test();
396 0 : IF( st_fx->bwidth == WB || EQ_16( st_fx->bwidth, SWB ) )
397 : {
398 0 : set16_fx( hSC_VBR->shape1_filt_mem_fx, 0, 10 );
399 0 : set16_fx( hSC_VBR->shape2_filt_mem_fx, 0, 10 );
400 0 : set16_fx( hSC_VBR->shape3_filt_mem_fx, 0, 10 );
401 0 : set16_fx( hSC_VBR->txlpf1_filt1_mem_fx, 0, 10 );
402 0 : set16_fx( hSC_VBR->txlpf1_filt2_mem_fx, 0, 10 );
403 0 : set16_fx( hSC_VBR->txhpf1_filt1_mem_fx, 0, 10 );
404 0 : set16_fx( hSC_VBR->txhpf1_filt2_mem_fx, 0, 10 );
405 0 : hSC_VBR->qprevIn_fx = 0;
406 0 : move16();
407 0 : hSC_VBR->qprevGain_fx = 0;
408 0 : move16();
409 : }
410 : }
411 :
412 : /* Start Unvoiced/NELP Processing */
413 0 : test();
414 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
415 : {
416 0 : qE1 = qIn;
417 0 : move16();
418 0 : E1_fx = L_deposit_l( 0 );
419 0 : FOR( i = 0; i < L_FRAME; i++ )
420 : {
421 0 : E1_fx = L_mac0_sat( E1_fx, in_fx[i], in_fx[i] ); /*Q(qE1+qE1) */
422 : }
423 :
424 0 : qE1 = shl( qE1, 1 );
425 :
426 0 : qf = qIn;
427 0 : move16();
428 0 : Scale_sig( hSC_VBR->txlpf1_filt1_mem_fx, 10, ( qf - hSC_VBR->qprevIn_fx ) );
429 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) */
430 :
431 0 : qEL1 = qf;
432 0 : move16();
433 0 : EL1_fx = L_deposit_l( 0 );
434 0 : FOR( i = 0; i < L_FRAME; i++ )
435 : {
436 0 : EL1_fx = L_mac0_sat( EL1_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qIn) */
437 : }
438 0 : qEL1 = shl( qEL1, 1 );
439 :
440 0 : qf = qIn;
441 0 : move16();
442 0 : Scale_sig( hSC_VBR->txhpf1_filt1_mem_fx, 10, qf - hSC_VBR->qprevIn_fx );
443 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) */
444 0 : hSC_VBR->qprevIn_fx = qf;
445 0 : move16();
446 :
447 0 : qEH1 = qf;
448 0 : move16();
449 0 : EH1_fx = L_deposit_l( 0 );
450 0 : FOR( i = 0; i < L_FRAME; i++ )
451 : {
452 0 : EH1_fx = L_mac0_sat( EH1_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qEH1) */
453 : }
454 0 : qEH1 = 2 * qEH1;
455 0 : move16();
456 : }
457 :
458 0 : qGain = qIn;
459 0 : move16();
460 0 : qGain = 2 * qGain;
461 0 : move16();
462 :
463 0 : FOR( i = 0; i < 9; i++ )
464 : {
465 0 : Ltemp = L_deposit_l( 0 );
466 0 : FOR( j = (Word16) ( i * lag ); j < (Word16) ( ( i + 1 ) * lag ); j++ )
467 : {
468 0 : Ltemp = L_mac0_sat( Ltemp, in_fx[j], in_fx[j] ); /*Q(2*qGain) */
469 : }
470 :
471 : /*Gains[i] = (float) sqrt(Gains[i]/lag); */
472 0 : IF( Ltemp != 0 )
473 : {
474 0 : exp1 = norm_l( Ltemp );
475 0 : tmp1 = extract_h( L_shl( Ltemp, exp1 ) ); /*2*qGain+exp1-16 */
476 0 : exp1 = sub( exp1, 30 - qGain ); /* */
477 :
478 0 : tmp1 = div_s( 16384, tmp1 ); /*14-2*qGain-exp1+16 */
479 0 : L_tmp = L_deposit_h( tmp1 );
480 0 : L_tmp = Isqrt_lc( L_tmp, &exp1 );
481 0 : L_tmp = Mult_32_16( L_tmp, sqrt_inv_lag );
482 0 : Ltemp = L_shl_sat( L_tmp, sub( exp1, 12 ) ); /*Q3 */
483 : }
484 0 : Gains_fx[i] = round_fx_sat( Ltemp );
485 0 : move16();
486 : }
487 :
488 :
489 0 : Ltemp = L_deposit_l( 0 );
490 0 : FOR( j = (Word16) ( i * lag ); j < L_FRAME; j++ )
491 : {
492 0 : Ltemp = L_mac0_sat( Ltemp, in_fx[j], in_fx[j] ); /*Q(2*qGain) */
493 : }
494 :
495 : /*Gains[i] = (float) sqrt(Gains[i]/(L_FRAME-(lag*i))); */
496 0 : IF( Ltemp != 0 )
497 : {
498 0 : exp1 = norm_l( Ltemp );
499 0 : tmp1 = extract_h( L_shl( Ltemp, exp1 ) );
500 0 : exp1 = sub( exp1, 30 - qGain ); /* */
501 :
502 0 : tmp1 = div_s( 16384, tmp1 );
503 0 : L_tmp = L_deposit_h( tmp1 );
504 0 : L_tmp = Isqrt_lc( L_tmp, &exp1 );
505 0 : L_tmp = Mult_32_16( L_tmp, sqrt_inv_lframe_lag );
506 0 : Ltemp = L_shl_sat( L_tmp, sub( exp1, 12 ) );
507 : }
508 :
509 0 : Gains_fx[i] = round_fx_sat( Ltemp );
510 0 : move16();
511 0 : IF( EQ_16( reduce_gains, 1 ) )
512 : {
513 0 : FOR( i = 0; i < 10; i++ )
514 : {
515 0 : Gains_fx[i] = mult( Gains_fx[i], 19661 );
516 0 : move16();
517 : }
518 : }
519 :
520 :
521 0 : qGain = 3;
522 0 : move16();
523 0 : IF( hSC_VBR->last_nelp_mode != 1 ) /* if prev frame was not NELP then init mem*/
524 : {
525 0 : hSC_VBR->nelp_gain_mem_fx = Gains_fx[0];
526 0 : move16();
527 0 : qNelpGain = qGain;
528 0 : move16();
529 : }
530 :
531 : /* tmp = (float) (20.0 * (log10 (Gains[0]) - log10 (st->nelp_gain_mem) ) ); */
532 : /* var_dB = tmp * tmp; */
533 0 : L_tmp = L_deposit_l( Gains_fx[0] );
534 0 : L_tmp = L_max( L_tmp, 1 );
535 0 : exp2 = norm_l( L_tmp );
536 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
537 0 : exp2 = 30 - exp2 - qGain;
538 0 : move16();
539 0 : tmp1 = Log2_norm_lc( L_tmp );
540 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*log(2) in Q13 format = Q0 format */
541 : /*tmp1 = round_fx(L_shl(Ltemp,12)); Q12 */
542 :
543 0 : L_tmp = L_deposit_l( hSC_VBR->nelp_gain_mem_fx ); /*Q0 */
544 0 : L_tmp = L_max( L_tmp, 1 );
545 0 : exp2 = norm_l( L_tmp );
546 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
547 0 : exp2 = sub( 30, add( exp2, qNelpGain ) );
548 0 : tmp2 = Log2_norm_lc( L_tmp );
549 0 : Ltemp1 = Mpy_32_16( exp2, tmp2, 9864 ); /*log(2) in Q13 format = Q0 format */
550 0 : Ltemp1 = L_sub( Ltemp, Ltemp1 ); /*Q16 */
551 0 : Ltemp = Mult_32_16( Ltemp1, 20480 ); /*Q11 (20 in Q10) */
552 0 : L_tmp = L_shl( Ltemp, 12 ); /*Q23 */
553 0 : var_dB_fx = Mult_32_32( L_tmp, L_tmp ); /*Q15 */
554 :
555 0 : FOR( i = 1; i < 10; i++ )
556 : {
557 0 : L_tmp = L_deposit_l( Gains_fx[i] );
558 0 : L_tmp = L_max( L_tmp, 1 );
559 0 : exp2 = norm_l( L_tmp );
560 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
561 0 : exp2 = 30 - exp2 - qGain;
562 0 : move16();
563 0 : tmp1 = Log2_norm_lc( L_tmp );
564 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*log(2) in Q13 format = Q0 format */
565 :
566 0 : L_tmp = L_deposit_l( Gains_fx[i - 1] ); /*Q0 */
567 0 : L_tmp = L_max( L_tmp, 1 );
568 0 : exp2 = norm_l( L_tmp );
569 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
570 0 : exp2 = sub( 30, add( exp2, qGain ) );
571 0 : tmp2 = Log2_norm_lc( L_tmp );
572 0 : Ltemp1 = Mpy_32_16( exp2, tmp2, 9864 ); /*log(2) in Q13 format = Q0 format */
573 0 : Ltemp1 = L_sub( Ltemp, Ltemp1 ); /*Q16 */
574 0 : Ltemp = Mult_32_16( Ltemp1, 20480 ); /*Q11 (20 in Q10) */
575 0 : L_tmp = L_shl( Ltemp, 12 ); /*Q23 */
576 0 : L_tmp = Mult_32_32( L_tmp, L_tmp ); /*Q15 */
577 0 : var_dB_fx = L_add( L_tmp, var_dB_fx ); /*Q15 */
578 : }
579 :
580 0 : IF( hSC_VBR->last_nelp_mode != 1 )
581 : {
582 : /*var_dB *= 0.111f; */
583 0 : var_dB_fx = Mult_32_16( var_dB_fx, 3637 ); /*0.111 in Q15 */
584 : }
585 : ELSE
586 : {
587 : /*var_dB *= 0.1f; */
588 0 : var_dB_fx = Mult_32_16( var_dB_fx, 3277 ); /*0.1 in Q15 */
589 : }
590 :
591 0 : max1 = 0;
592 0 : move16();
593 0 : FOR( i = 0; i < 10; i++ )
594 : {
595 0 : max1 = s_max( max1, abs_s( Gains_fx[i] ) );
596 : }
597 :
598 0 : qf = norm_s( (Word16) max1 );
599 0 : test();
600 0 : IF( ( qf == 0 ) && ( ( (Word16) max1 ) == 0 ) )
601 : {
602 0 : qf = 15;
603 0 : move16();
604 : }
605 0 : qf = sub( qf, 1 );
606 0 : qGain = add( qGain, qf );
607 :
608 0 : Scale_sig( Gains_fx, 10, qf );
609 :
610 0 : L_tmp = L_sub( var_dB_fx, 655360 ); /* 20 in Q15 */
611 0 : Ltemp = L_shr_r( L_tmp, 2 ); /*Q15 */
612 : {
613 : /*exp = pow(2, x*log2(e)) */
614 0 : L_tmp = Mult_32_16( Ltemp, 23637 ); /*15 + 14 -15 ->Q14 */
615 0 : L_tmp = L_shl( L_tmp, 2 ); /*Q16 */
616 0 : f_Noise = L_Extract_lc( L_tmp, &e_Noise ); /*Q16 */
617 0 : etmp = extract_l( Pow2( 14, f_Noise ) ); /* Put 14 as exponent */
618 0 : e_Noise = sub( e_Noise, 14 ); /* Retreive exponent of etmp */
619 :
620 :
621 0 : IF( e_Noise > 0 )
622 : {
623 0 : L_tmp = L_shl_sat( etmp, e_Noise ); /* Result in Q30 */
624 0 : L_tmp = L_add_sat( 1, L_tmp );
625 :
626 :
627 0 : exp1 = norm_l( L_tmp );
628 0 : tmp1 = extract_h( L_shl( L_tmp, exp1 ) ); /*exp1-16 */
629 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(exp1-16)-> 30+15-exp1 */
630 0 : fdbck_fx = mult( 26870, tmp1 ); /*45-exp1+15-15=>45-exp1 */
631 0 : fdbck_fx = shr_r( fdbck_fx, 14 );
632 0 : exp1 = sub( 31, exp1 );
633 : }
634 : ELSE
635 : {
636 0 : L_tmp = L_shl( etmp, add( e_Noise, 14 ) ); /* Result in Q30 */
637 0 : L_tmp = L_add( 16384, L_tmp );
638 :
639 0 : exp1 = norm_l( L_tmp );
640 0 : tmp1 = extract_h( L_shl( L_tmp, exp1 ) ); /*14+exp1-16 */
641 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(14+exp1-16)-> 16+15-exp1 */
642 0 : fdbck_fx = mult( 26870, tmp1 ); /*31-exp1+15-15=>31-exp1 */
643 0 : exp1 = sub( 31, exp1 );
644 : }
645 : }
646 :
647 0 : IF( EQ_16( exp1, 31 ) )
648 : {
649 0 : L_const_1 = 0x7fffffff;
650 0 : move32();
651 : }
652 : ELSE
653 : {
654 0 : L_const_1 = L_shl( 1, exp1 );
655 : }
656 :
657 0 : l_nelp_gain_mem = L_deposit_l( hSC_VBR->nelp_gain_mem_fx );
658 0 : IF( NE_16( qNelpGain, qGain ) )
659 : {
660 0 : l_nelp_gain_mem = L_shl( l_nelp_gain_mem, sub( qGain, qNelpGain ) );
661 : }
662 :
663 0 : FOR( i = 0; i < 10; i++ )
664 : {
665 : /*Gains[i] = (float)((1.0f - fdbck) * Gains[i] + fdbck * st->nelp_gain_mem); */
666 0 : L_tmp = L_sub( L_const_1, L_deposit_l( fdbck_fx ) ); /*31-exp1 */
667 0 : L_tmp = Mult_32_16( L_tmp, Gains_fx[i] ); /*exp1+qGain-15=>exp1-15+qGain */
668 0 : Ltemp1 = Mult_32_16( l_nelp_gain_mem, fdbck_fx ); /*exp1+qGain-15 */
669 0 : L_tmp = L_add( L_tmp, Ltemp1 );
670 0 : L_tmp = L_shr_r( L_tmp, ( exp1 - 15 ) );
671 0 : Gains_fx[i] = round_fx_sat( L_shl_sat( L_tmp, 16 ) );
672 0 : move16();
673 0 : l_nelp_gain_mem = L_tmp;
674 : }
675 :
676 0 : hSC_VBR->nelp_gain_mem_fx = round_fx( L_shl( l_nelp_gain_mem, 16 ) );
677 0 : move16();
678 0 : Scale_sig( &hSC_VBR->nelp_gain_mem_fx, 1, -qGain );
679 0 : Scale_sig( Gains_fx, 10, -qGain );
680 0 : qGain = 0;
681 0 : move16();
682 :
683 0 : quantize_uvg_fx( Gains_fx, &iG1_fx, iG2_fx, Gains_fx, st_fx->bwidth );
684 :
685 0 : IF( EQ_16( rf_flag, 1 ) )
686 : {
687 0 : hRF->rf_indx_nelp_iG1[0] = iG1_fx;
688 0 : move16();
689 0 : hRF->rf_indx_nelp_iG2[0][0] = iG2_fx[0];
690 0 : move16();
691 0 : hRF->rf_indx_nelp_iG2[0][1] = iG2_fx[1];
692 0 : move16();
693 : }
694 : ELSE
695 : {
696 0 : push_indice( hBstr, IND_IG1, iG1_fx, 5 );
697 0 : push_indice( hBstr, IND_IG2A, iG2_fx[0], 6 );
698 0 : push_indice( hBstr, IND_IG2B, iG2_fx[1], 6 );
699 : }
700 :
701 0 : test();
702 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
703 : {
704 0 : gain_fac_fx = 19005;
705 0 : move16(); /* 1.16f in Q14 */
706 : }
707 : ELSE
708 : {
709 0 : gain_fac_fx = 22446;
710 0 : move16(); /* 1.37f in Q14 */
711 : }
712 :
713 : /* Normalize Gains_fx[10] with headroom 4 */
714 : /* This fills up qGain with some new value */
715 0 : normalize_arr( Gains_fx, &qGain, 10, 4 );
716 :
717 0 : generate_nelp_excitation_fx( &( hSC_VBR->nelp_enc_seed ), Gains_fx, ptr_fx, gain_fac_fx );
718 0 : test();
719 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
720 : {
721 0 : BP1_ORDER = 4;
722 0 : move16();
723 0 : Scale_sig( hSC_VBR->bp1_filt_mem_wb_fx, BP1_ORDER * 2, qGain - hSC_VBR->qprevGain_fx ); /*qf-qAdj */
724 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 );
725 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
726 : }
727 0 : ELSE IF( EQ_16( st_fx->bwidth, NB ) )
728 : {
729 0 : BP1_ORDER = 7;
730 0 : move16();
731 0 : Scale_sig32( hSC_VBR->bp1_filt_mem_nb_fx, BP1_ORDER * 2, ( qGain - hSC_VBR->qprevGain_fx ) );
732 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 ) ) );
733 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
734 :
735 0 : Scale_sig( ptr_fx, L_FRAME, -1 ); /* bring exc to qgain-1 */
736 0 : *qIn1 = qGain - 1; /* use this temp only in the parent */
737 0 : move16();
738 : }
739 :
740 0 : E3_fx = L_deposit_l( 0 );
741 0 : FOR( i = 0; i < L_FRAME; i++ )
742 : {
743 0 : E3_fx = L_mac_sat( E3_fx, ptr_fx[i], ptr_fx[i] ); /*Q1 */
744 : }
745 0 : qE3 = 2 * qGain + 1;
746 0 : move16();
747 0 : test();
748 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
749 : {
750 0 : Scale_sig( hSC_VBR->shape1_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
751 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) */
752 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
753 :
754 0 : qf = qGain;
755 0 : move16();
756 0 : E2_fx = L_deposit_l( 0 );
757 0 : FOR( i = 0; i < L_FRAME; i++ )
758 : {
759 0 : Ltemp = L_mult0( ptr_fx[i], ptr_fx[i] ); /*Q(2*qE2+1) */
760 0 : Ltemp = L_shr_r( Ltemp, 4 );
761 0 : E2_fx = L_add( E2_fx, Ltemp );
762 : }
763 0 : qE2 = 2 * qf - 4;
764 0 : move16();
765 :
766 0 : test();
767 0 : IF( E1_fx == 0 )
768 : {
769 0 : R_fx = 0;
770 0 : move16();
771 : }
772 0 : ELSE IF( ( E2_fx == 0 ) && ( E1_fx != 0 ) )
773 : {
774 0 : exp1 = norm_l( E1_fx );
775 0 : tmp1 = extract_h( L_shl( E1_fx, exp1 ) ); /*qE1+exp1-16 */
776 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qE1+exp1-16)-> 30-qE1-exp1 */
777 0 : exp1 = sub( exp1, 30 - qE1 );
778 :
779 0 : L_tmp = L_deposit_h( tmp1 );
780 0 : L_tmp = Isqrt_lc( L_tmp, &exp1 );
781 0 : Ltemp = L_shl( L_tmp, sub( exp1, 12 ) );
782 0 : R_fx = round_fx( Ltemp );
783 : }
784 : ELSE
785 : {
786 0 : exp1 = norm_l( E1_fx );
787 0 : tmp1 = extract_h( L_shl( E1_fx, exp1 ) ); /*qE1+exp1-16 */
788 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qE1+exp1-16)-> 30-qE1-exp1 */
789 0 : L_tmp = Mult_32_16( E2_fx, tmp1 ); /*qE2+30-qE1-exp1-15=>15+qE2-qE1-exp1 */
790 :
791 0 : exp2 = norm_l( L_tmp );
792 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qE2-qE1-exp1+exp2 */
793 0 : exp2 = 30 - ( 15 + qE2 - qE1 - exp1 + exp2 );
794 0 : move16();
795 0 : L_tmp = Isqrt_lc( L_tmp, &exp2 ); /*Q(31+exp2) */
796 0 : R_fx = round_fx( L_tmp );
797 0 : exp1 = 31 - exp2 - 16 - 7;
798 0 : move16();
799 : }
800 :
801 0 : FOR( i = 0; i < L_FRAME; i++ )
802 : {
803 0 : Ltemp = L_mult0( R_fx, ptr_fx[i] );
804 0 : Ltemp = L_shr_r( Ltemp, exp1 );
805 0 : filtRes_fx[i] = round_fx_sat( L_shl_sat( Ltemp, 16 ) );
806 0 : move16();
807 : }
808 :
809 0 : qf1 = qGain;
810 0 : move16();
811 0 : Scale_sig( hSC_VBR->txlpf1_filt2_mem_fx, 10, ( qf1 - hSC_VBR->qprevGain_fx ) );
812 :
813 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) */
814 0 : Copy( ptr_tmp_fx, filtRes_fx, L_FRAME );
815 :
816 0 : qEL2 = qf1;
817 0 : move16();
818 0 : EL2_fx = L_deposit_l( 0 );
819 0 : FOR( i = 0; i < L_FRAME; i++ )
820 : {
821 0 : EL2_fx = L_mac0_sat( EL2_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qEL2) */
822 : }
823 0 : qEL2 = 2 * qEL2;
824 0 : move16();
825 :
826 0 : FOR( i = 0; i < L_FRAME; i++ )
827 : {
828 0 : Ltemp = L_mult0( R_fx, ptr_fx[i] );
829 0 : Ltemp = L_shr_r( Ltemp, exp1 );
830 0 : filtRes_fx[i] = round_fx_sat( L_shl_sat( Ltemp, 16 ) );
831 0 : move16();
832 : }
833 :
834 0 : qf = qGain;
835 0 : move16();
836 0 : Scale_sig( hSC_VBR->txhpf1_filt2_mem_fx, 10, ( qf - hSC_VBR->qprevGain_fx ) );
837 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) */
838 :
839 0 : Copy( ptr_tmp_fx, filtRes_fx, L_FRAME );
840 :
841 0 : qEH2 = qf;
842 0 : move16();
843 0 : EH2_fx = L_deposit_l( 0 );
844 0 : FOR( i = 0; i < L_FRAME; i++ )
845 : {
846 0 : EH2_fx = L_mac0_sat( EH2_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qEH2) */
847 : }
848 0 : qEH2 = 2 * qEH2;
849 0 : move16();
850 0 : IF( EL2_fx == 0 )
851 : {
852 0 : exp2 = norm_l( EL1_fx );
853 0 : L_tmp = L_shl( EL1_fx, exp2 );
854 0 : exp2 = sub( 30, add( exp2, qEL1 ) );
855 0 : tmp1 = Log2_norm_lc( L_tmp );
856 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*10*log(2) in Q15 format = Q0 format */
857 0 : tmp1 = round_fx_sat( L_shl_sat( Ltemp, 12 ) ); /* Q12 */
858 0 : RL_fx = L_mult0( tmp1, 10 );
859 : }
860 : ELSE
861 : {
862 0 : exp1 = norm_l( EL2_fx );
863 0 : tmp1 = extract_h( L_shl( EL2_fx, exp1 ) ); /*qEL2+exp1-16 */
864 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qEL2+exp1-16)-> 30-qEL2-exp1 */
865 0 : L_tmp = Mult_32_16( EL1_fx, tmp1 ); /*qEL1+30-qEL2-exp1-15=>15+qE1-qEL2-exp1 */
866 :
867 0 : exp2 = norm_l( L_tmp );
868 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
869 0 : exp2 = sub( add( qEL2, exp1 ), add( qEL1, exp2 ) ); /*30 - ( 30 + qEL1 - qEL2 - exp1 + exp2 )*/
870 0 : tmp1 = Log2_norm_lc( L_tmp );
871 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*10*log(2) in Q15 format = Q0 format */
872 0 : tmp1 = round_fx_sat( L_shl_sat( Ltemp, 12 ) ); /* Q12 */
873 0 : RL_fx = L_mult0( tmp1, 10 );
874 : }
875 :
876 0 : IF( EH2_fx == 0 )
877 : {
878 0 : exp2 = norm_l( EH2_fx );
879 0 : L_tmp = L_shl( EH2_fx, exp2 );
880 0 : exp2 = sub( 30, add( exp2, qEH2 ) );
881 0 : tmp1 = Log2_norm_lc( L_tmp );
882 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*10*log(2) in Q13 format = Q0 format */
883 0 : tmp1 = round_fx_sat( L_shl_sat( Ltemp, 12 ) ); /* Q12 */
884 0 : RH_fx = L_mult0( tmp1, 10 );
885 : }
886 : ELSE
887 : {
888 0 : exp1 = norm_l( EH2_fx );
889 0 : tmp1 = extract_h( L_shl( EH2_fx, exp1 ) ); /*qEH2+exp1-16 */
890 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qEH2+exp1-16)-> 30-qEH2-exp1 */
891 0 : L_tmp = Mult_32_16( EH1_fx, tmp1 ); /*15+qEH1-qEH2-exp1 */
892 :
893 0 : exp2 = norm_l( L_tmp );
894 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEH1-qEH2-exp1+exp2 */
895 0 : exp2 = sub( add( qEH2, exp1 ), add( qEH1, exp2 ) ); /*30 - ( 30 + qEH1 - qEH2 - exp1 + exp2 )*/
896 0 : tmp1 = Log2_norm_lc( L_tmp );
897 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*10*log(2) in Q13 format = Q0 format */
898 0 : tmp1 = round_fx_sat( L_shl_sat( Ltemp, 12 ) ); /* Q12 */
899 0 : RH_fx = L_mult0( tmp1, 10 );
900 : }
901 :
902 0 : fid = 0;
903 0 : move16();
904 0 : IF( LT_32( RL_fx, -12288 ) ) /* -3 in Q12 */
905 : {
906 0 : fid = 1;
907 0 : move16();
908 : }
909 0 : ELSE IF( LT_32( RH_fx, -12288 ) ) /* -3 in Q12 */
910 : {
911 0 : fid = 2;
912 0 : move16();
913 : }
914 :
915 0 : IF( rf_flag == 0 )
916 : {
917 :
918 0 : SWITCH( fid )
919 : {
920 0 : case 1:
921 : /* Update other filter memory */
922 0 : Scale_sig( hSC_VBR->shape3_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
923 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) */
924 :
925 : /* filter the residual to desired shape */
926 0 : Scale_sig( hSC_VBR->shape2_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
927 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) */
928 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
929 :
930 0 : BREAK;
931 0 : case 2:
932 : /* Update other filter memory */
933 0 : Scale_sig( hSC_VBR->shape2_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
934 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) */
935 :
936 : /* filter the residual to desired shape */
937 0 : Scale_sig( hSC_VBR->shape3_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
938 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) */
939 :
940 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
941 :
942 0 : BREAK;
943 0 : default:
944 0 : Scale_sig( hSC_VBR->shape2_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
945 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) */
946 :
947 0 : Scale_sig( hSC_VBR->shape3_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
948 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) */
949 :
950 0 : BREAK;
951 : }
952 :
953 0 : qE2 = qGain;
954 0 : move16();
955 :
956 0 : E2_fx = L_deposit_l( 0 );
957 0 : FOR( i = 0; i < L_FRAME; i++ )
958 : {
959 0 : Ltemp = L_mult0( ptr_fx[i], ptr_fx[i] ); /*Q(2*qE2+1) */
960 0 : Ltemp = L_shr_r( Ltemp, 4 );
961 0 : E2_fx = L_add( E2_fx, Ltemp );
962 : }
963 0 : qE2 = ( 2 * qE2 ) - 4;
964 0 : move16();
965 0 : test();
966 0 : IF( E3_fx == 0 )
967 : {
968 0 : R_fx = 0;
969 0 : move16();
970 : }
971 0 : ELSE IF( ( E2_fx == 0 ) && ( E3_fx != 0 ) )
972 : {
973 0 : exp1 = norm_l( E3_fx );
974 0 : tmp1 = extract_h( L_shl( E3_fx, exp1 ) ); /*qE3+exp1-16 */
975 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qE3+exp1-16)-> 30-qE3-exp1 */
976 0 : exp1 = sub( exp1, 30 - qE3 );
977 :
978 0 : L_tmp = L_deposit_h( tmp1 );
979 0 : L_tmp = Isqrt_lc( L_tmp, &exp1 );
980 0 : Ltemp = L_shl( L_tmp, sub( exp1, 12 ) );
981 0 : R_fx = round_fx( Ltemp );
982 : }
983 : ELSE
984 : {
985 0 : exp1 = norm_l( E3_fx );
986 0 : tmp1 = extract_h( L_shl( E3_fx, exp1 ) ); /*qE3+exp1-16 */
987 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qE3+exp1-16)-> 30-qE3-exp1 */
988 0 : L_tmp = Mult_32_16( E2_fx, tmp1 ); /*qE2+30-qE3-exp1-15=>15+qE2-qE3-exp1 */
989 :
990 0 : exp2 = norm_l( L_tmp );
991 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qE2-qE3-exp1+exp2 */
992 0 : exp2 = add( 15, sub( add( qE3, exp1 ), add( qE2, exp2 ) ) ); /*30 - ( 15 + qE2 - qE3 - exp1 + exp2 )*/
993 0 : L_tmp = Isqrt_lc( L_tmp, &exp2 ); /*Q(31+exp2) */
994 0 : R_fx = round_fx( L_tmp );
995 0 : exp1 = sub( 8, exp2 ); /*31 - exp2 - 16 - 7*/
996 0 : move16();
997 : }
998 :
999 0 : FOR( i = 0; i < L_FRAME; i++ )
1000 : {
1001 0 : L_tmp = L_mult0( R_fx, ptr_fx[i] );
1002 0 : L_tmp = L_shr_r( L_tmp, exp1 + 1 );
1003 0 : ptr_fx[i] = round_fx( L_shl( L_tmp, 16 ) );
1004 0 : move16();
1005 : }
1006 0 : *qIn1 = qGain - 1;
1007 0 : move16();
1008 : }
1009 :
1010 0 : IF( EQ_16( rf_flag, 1 ) )
1011 : {
1012 0 : hRF->rf_indx_nelp_fid[0] = fid;
1013 0 : move16();
1014 : }
1015 : ELSE
1016 : {
1017 0 : push_indice( hBstr, IND_NELP_FID, fid, 2 );
1018 : }
1019 : }
1020 :
1021 0 : hSC_VBR->qprevGain_fx = qGain;
1022 0 : move16();
1023 :
1024 0 : IF( rf_flag == 0 )
1025 : {
1026 0 : FOR( i = 0; i < L_FRAME; i++ )
1027 : {
1028 0 : exc_fx[i] = ptr_fx[i];
1029 0 : move16();
1030 : }
1031 : }
1032 :
1033 0 : return;
1034 : }
1035 :
1036 0 : void nelp_encoder_ivas_fx(
1037 : Encoder_State *st_fx, /* i/o: encoder state */
1038 : Word16 *in_fx, /* i : residual signal */
1039 : Word16 *exc_fx, /* o : NELP quantized excitation signal */
1040 : Word16 *qIn1,
1041 : Word16 reduce_gains )
1042 : {
1043 : Word16 i, j;
1044 0 : Word16 *ptr_fx = exc_fx;
1045 0 : Word16 lag = 25; /* to cover 25*9 + 31 */
1046 0 : move16();
1047 0 : Word16 sqrt_inv_lag = 6554; /* sqrt(1/lag) in Q15 */
1048 0 : move16();
1049 0 : Word16 sqrt_inv_lframe_lag = 5885; /* sqrt(1/(L_FRAME-lag*9)) */
1050 0 : move16();
1051 : Word16 Gains_fx[10], gain_fac_fx;
1052 : Word16 iG1_fx, iG2_fx[2];
1053 : Word16 fid;
1054 : Word16 fdbck_fx;
1055 : Word32 var_dB_fx;
1056 0 : Word32 E1_fx = 0, EL1_fx = 0, EH1_fx = 0, E2_fx = 0, E3_fx = 0, EL2_fx = 0, EH2_fx = 0;
1057 0 : move32();
1058 0 : move32();
1059 0 : move32();
1060 0 : move32();
1061 0 : move32();
1062 0 : move32();
1063 0 : move32();
1064 0 : Word32 RL_fx = 0, RH_fx = 0;
1065 0 : move32();
1066 0 : move32();
1067 0 : Word16 R_fx = 0;
1068 0 : move16();
1069 : Word16 filtRes_fx[L_FRAME];
1070 : Word16 ptr_tmp_fx[L_FRAME];
1071 :
1072 0 : Word16 qE1 = 0, qE2 = 0, qE3 = 0, qEL1 = 0, qEL2 = 0, qEH1 = 0, qEH2 = 0;
1073 0 : move16();
1074 0 : move16();
1075 0 : move16();
1076 0 : move16();
1077 0 : move16();
1078 0 : move16();
1079 0 : move16();
1080 0 : Word16 qIn = 0, qGain = 0, qf = 0, qf1 = 0, qNelpGain = 0;
1081 0 : move16();
1082 0 : move16();
1083 0 : move16();
1084 0 : move16();
1085 0 : move16();
1086 : Word16 exp1, exp2, tmp1, tmp2;
1087 : Word16 f_Noise, etmp, e_Noise;
1088 0 : Word16 max1 = 0;
1089 0 : move16();
1090 : Word32 l_nelp_gain_mem;
1091 0 : Word32 Ltemp = 0, Ltemp1 = 0, L_tmp = 0, L_const_1;
1092 0 : move32();
1093 0 : move32();
1094 0 : move32();
1095 : Word16 BP1_ORDER;
1096 : Word16 rf_flag;
1097 0 : SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR;
1098 0 : BSTR_ENC_HANDLE hBstr = st_fx->hBstr;
1099 0 : RF_ENC_HANDLE hRF = st_fx->hRF;
1100 :
1101 0 : rf_flag = st_fx->rf_mode;
1102 0 : move16();
1103 :
1104 0 : test();
1105 0 : if ( EQ_16( hSC_VBR->last_nelp_mode, 1 ) && NE_16( st_fx->bwidth, st_fx->last_bwidth ) )
1106 : {
1107 0 : hSC_VBR->last_nelp_mode = 0;
1108 0 : move16();
1109 : }
1110 :
1111 0 : qIn = *qIn1;
1112 0 : move16();
1113 0 : test();
1114 0 : IF( EQ_16( st_fx->bwidth, NB ) )
1115 : {
1116 0 : IF( hSC_VBR->last_nelp_mode != 1 )
1117 : {
1118 0 : BP1_ORDER = 7;
1119 0 : move16();
1120 0 : set32_fx( hSC_VBR->bp1_filt_mem_nb_fx, 0, BP1_ORDER * 2 );
1121 0 : hSC_VBR->qprevGain_fx = 0;
1122 0 : move16();
1123 : }
1124 : }
1125 0 : ELSE IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
1126 : {
1127 0 : IF( hSC_VBR->last_nelp_mode != 1 )
1128 : {
1129 0 : BP1_ORDER = 4;
1130 0 : move16();
1131 0 : set16_fx( hSC_VBR->bp1_filt_mem_wb_fx, 0, i_mult( BP1_ORDER, 2 ) );
1132 : }
1133 : }
1134 :
1135 0 : IF( NE_16( hSC_VBR->last_nelp_mode, 1 ) )
1136 : {
1137 0 : test();
1138 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
1139 : {
1140 0 : set16_fx( hSC_VBR->shape1_filt_mem_fx, 0, 10 );
1141 0 : set16_fx( hSC_VBR->shape2_filt_mem_fx, 0, 10 );
1142 0 : set16_fx( hSC_VBR->shape3_filt_mem_fx, 0, 10 );
1143 0 : set16_fx( hSC_VBR->txlpf1_filt1_mem_fx, 0, 10 );
1144 0 : set16_fx( hSC_VBR->txlpf1_filt2_mem_fx, 0, 10 );
1145 0 : set16_fx( hSC_VBR->txhpf1_filt1_mem_fx, 0, 10 );
1146 0 : set16_fx( hSC_VBR->txhpf1_filt2_mem_fx, 0, 10 );
1147 0 : hSC_VBR->qprevIn_fx = 0;
1148 0 : move16();
1149 0 : hSC_VBR->qprevGain_fx = 0;
1150 0 : move16();
1151 : }
1152 : }
1153 :
1154 : /* Start Unvoiced/NELP Processing */
1155 0 : test();
1156 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
1157 : {
1158 0 : qE1 = qIn;
1159 0 : move16();
1160 0 : E1_fx = L_deposit_l( 0 );
1161 0 : FOR( i = 0; i < L_FRAME; i++ )
1162 : {
1163 0 : E1_fx = L_mac0_sat( E1_fx, in_fx[i], in_fx[i] ); /*Q(qE1+qE1) */
1164 : }
1165 :
1166 0 : qE1 = shl( qE1, 1 );
1167 :
1168 0 : qf = qIn;
1169 0 : move16();
1170 0 : Scale_sig( hSC_VBR->txlpf1_filt1_mem_fx, 10, ( qf - hSC_VBR->qprevIn_fx ) );
1171 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) */
1172 :
1173 0 : qEL1 = qf;
1174 0 : move16();
1175 0 : EL1_fx = L_deposit_l( 0 );
1176 0 : FOR( i = 0; i < L_FRAME; i++ )
1177 : {
1178 0 : EL1_fx = L_mac0_sat( EL1_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qIn) */
1179 : }
1180 0 : qEL1 = shl( qEL1, 1 );
1181 :
1182 0 : qf = qIn;
1183 0 : move16();
1184 0 : Scale_sig( hSC_VBR->txhpf1_filt1_mem_fx, 10, qf - hSC_VBR->qprevIn_fx );
1185 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) */
1186 0 : hSC_VBR->qprevIn_fx = qf;
1187 0 : move16();
1188 :
1189 0 : qEH1 = qf;
1190 0 : move16();
1191 0 : EH1_fx = L_deposit_l( 0 );
1192 0 : FOR( i = 0; i < L_FRAME; i++ )
1193 : {
1194 0 : EH1_fx = L_mac0_sat( EH1_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qEH1) */
1195 : }
1196 0 : qEH1 = shl( qEH1, 1 );
1197 0 : move16();
1198 : }
1199 :
1200 0 : qGain = qIn;
1201 0 : move16();
1202 0 : qGain = shl( qGain, 1 );
1203 :
1204 0 : FOR( i = 0; i < 9; i++ )
1205 : {
1206 0 : Ltemp = L_deposit_l( 0 );
1207 0 : FOR( j = (Word16) ( i * lag ); j < (Word16) ( ( i + 1 ) * lag ); j++ )
1208 : {
1209 0 : Ltemp = L_mac0_sat( Ltemp, in_fx[j], in_fx[j] ); /*Q(2*qGain) */
1210 : }
1211 :
1212 : /*Gains[i] = (float) sqrt(Gains[i]/lag); */
1213 0 : IF( Ltemp != 0 )
1214 : {
1215 0 : exp1 = norm_l( Ltemp );
1216 0 : tmp1 = extract_h( L_shl( Ltemp, exp1 ) ); /*2*qGain+exp1-16 */
1217 0 : exp1 = sub( exp1, 30 - qGain ); /* */
1218 :
1219 0 : tmp1 = div_s( 16384, tmp1 ); /*14-2*qGain-exp1+16 */
1220 0 : L_tmp = L_deposit_h( tmp1 );
1221 0 : L_tmp = Isqrt_lc( L_tmp, &exp1 );
1222 0 : L_tmp = Mult_32_16( L_tmp, sqrt_inv_lag );
1223 0 : Ltemp = L_shl_sat( L_tmp, sub( exp1, 12 ) ); /*Q3 */
1224 : }
1225 0 : Gains_fx[i] = round_fx_sat( Ltemp );
1226 0 : move16();
1227 : }
1228 :
1229 :
1230 0 : Ltemp = L_deposit_l( 0 );
1231 0 : FOR( j = i_mult( i, lag ); j < L_FRAME; j++ )
1232 : {
1233 0 : Ltemp = L_mac0_sat( Ltemp, in_fx[j], in_fx[j] ); /*Q(2*qGain) */
1234 : }
1235 :
1236 : /*Gains[i] = (float) sqrt(Gains[i]/(L_FRAME-(lag*i))); */
1237 0 : IF( Ltemp != 0 )
1238 : {
1239 0 : exp1 = norm_l( Ltemp );
1240 0 : tmp1 = extract_h( L_shl( Ltemp, exp1 ) );
1241 0 : exp1 = sub( exp1, 30 - qGain ); /* */
1242 :
1243 0 : tmp1 = div_s( 16384, tmp1 );
1244 0 : L_tmp = L_deposit_h( tmp1 );
1245 0 : L_tmp = Isqrt_lc( L_tmp, &exp1 );
1246 0 : L_tmp = Mult_32_16( L_tmp, sqrt_inv_lframe_lag );
1247 0 : Ltemp = L_shl_sat( L_tmp, sub( exp1, 12 ) );
1248 : }
1249 :
1250 0 : Gains_fx[i] = round_fx_sat( Ltemp );
1251 0 : move16();
1252 :
1253 0 : IF( EQ_16( reduce_gains, 1 ) )
1254 : {
1255 0 : FOR( i = 0; i < 10; i++ )
1256 : {
1257 0 : Gains_fx[i] = mult( Gains_fx[i], 19661 );
1258 0 : move16();
1259 : }
1260 : }
1261 :
1262 :
1263 0 : qGain = 3;
1264 0 : move16();
1265 0 : IF( NE_16( hSC_VBR->last_nelp_mode, 1 ) ) /* if prev frame was not NELP then init mem*/
1266 : {
1267 0 : hSC_VBR->nelp_gain_mem_fx = Gains_fx[0];
1268 0 : move16();
1269 0 : qNelpGain = qGain;
1270 0 : move16();
1271 : }
1272 :
1273 : /* tmp = (float) (20.0 * (log10 (Gains[0]) - log10 (st->nelp_gain_mem) ) ); */
1274 : /* var_dB = tmp * tmp; */
1275 0 : L_tmp = L_deposit_l( Gains_fx[0] );
1276 0 : L_tmp = L_max( L_tmp, 1 );
1277 0 : exp2 = norm_l( L_tmp );
1278 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
1279 0 : exp2 = sub( sub( 30, exp2 ), qGain );
1280 0 : tmp1 = Log2_norm_lc( L_tmp );
1281 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*log(2) in Q13 format = Q0 format */
1282 : /*tmp1 = round_fx(L_shl(Ltemp,12)); Q12 */
1283 :
1284 0 : L_tmp = L_deposit_l( hSC_VBR->nelp_gain_mem_fx ); /*Q0 */
1285 0 : L_tmp = L_max( L_tmp, 1 );
1286 0 : exp2 = norm_l( L_tmp );
1287 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
1288 0 : exp2 = sub( sub( 30, exp2 ), qNelpGain );
1289 0 : tmp2 = Log2_norm_lc( L_tmp );
1290 0 : Ltemp1 = Mpy_32_16( exp2, tmp2, 9864 ); /*log(2) in Q13 format = Q0 format */
1291 0 : Ltemp1 = L_sub( Ltemp, Ltemp1 ); /*Q16 */
1292 0 : Ltemp = Mult_32_16( Ltemp1, 20480 ); /*Q11 (20 in Q10) */
1293 0 : L_tmp = L_shl( Ltemp, 12 ); /*Q23 */
1294 0 : var_dB_fx = Mult_32_32( L_tmp, L_tmp ); /*Q15 */
1295 :
1296 0 : FOR( i = 1; i < 10; i++ )
1297 : {
1298 0 : L_tmp = L_deposit_l( Gains_fx[i] );
1299 0 : L_tmp = L_max( L_tmp, 1 );
1300 0 : exp2 = norm_l( L_tmp );
1301 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
1302 0 : exp2 = sub( sub( 30, exp2 ), qGain );
1303 0 : tmp1 = Log2_norm_lc( L_tmp );
1304 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*log(2) in Q13 format = Q0 format */
1305 :
1306 0 : L_tmp = L_deposit_l( Gains_fx[i - 1] ); /*Q0 */
1307 0 : L_tmp = L_max( L_tmp, 1 );
1308 0 : exp2 = norm_l( L_tmp );
1309 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
1310 0 : exp2 = sub( sub( 30, exp2 ), qGain );
1311 0 : tmp2 = Log2_norm_lc( L_tmp );
1312 0 : Ltemp1 = Mpy_32_16( exp2, tmp2, 9864 ); /*log(2) in Q13 format = Q0 format */
1313 0 : Ltemp1 = L_sub( Ltemp, Ltemp1 ); /*Q16 */
1314 0 : Ltemp = Mult_32_16( Ltemp1, 20480 ); /*Q11 (20 in Q10) */
1315 0 : L_tmp = L_shl( Ltemp, 12 ); /*Q23 */
1316 0 : L_tmp = Mult_32_32( L_tmp, L_tmp ); /*Q15 */
1317 0 : var_dB_fx = L_add( L_tmp, var_dB_fx ); /*Q15 */
1318 : }
1319 :
1320 0 : IF( NE_16( hSC_VBR->last_nelp_mode, 1 ) )
1321 : {
1322 : /*var_dB *= 0.111f; */
1323 0 : var_dB_fx = Mult_32_16( var_dB_fx, 3637 ); /*0.111 in Q15 */
1324 : }
1325 : ELSE
1326 : {
1327 : /*var_dB *= 0.1f; */
1328 0 : var_dB_fx = Mult_32_16( var_dB_fx, 3277 ); /*0.1 in Q15 */
1329 : }
1330 :
1331 0 : max1 = 0;
1332 0 : move16();
1333 0 : FOR( i = 0; i < 10; i++ )
1334 : {
1335 0 : max1 = s_max( max1, abs_s( Gains_fx[i] ) );
1336 : }
1337 :
1338 0 : qf = norm_s( max1 );
1339 0 : test();
1340 0 : IF( ( qf == 0 ) && ( max1 == 0 ) )
1341 : {
1342 0 : qf = 15;
1343 0 : move16();
1344 : }
1345 0 : qf = sub( qf, 1 );
1346 0 : qGain = add( qGain, qf );
1347 :
1348 0 : Scale_sig( Gains_fx, 10, qf );
1349 :
1350 0 : L_tmp = L_sub( var_dB_fx, 655360 ); /* 20 in Q15 */
1351 0 : Ltemp = L_shr_r( L_tmp, 2 ); /*Q15 */
1352 : {
1353 : /*exp = pow(2, x*log2(e)) */
1354 0 : L_tmp = Mult_32_16( Ltemp, 23637 ); /*15 + 14 -15 ->Q14 */
1355 0 : L_tmp = L_shl( L_tmp, 2 ); /*Q16 */
1356 0 : f_Noise = L_Extract_lc( L_tmp, &e_Noise ); /*Q16 */
1357 0 : etmp = extract_l( Pow2( 14, f_Noise ) ); /* Put 14 as exponent */
1358 0 : e_Noise = sub( e_Noise, 14 ); /* Retreive exponent of etmp */
1359 :
1360 :
1361 0 : IF( e_Noise > 0 )
1362 : {
1363 0 : L_tmp = L_shl_sat( etmp, e_Noise ); /* Result in Q30 */
1364 0 : L_tmp = L_add_sat( 1, L_tmp );
1365 :
1366 :
1367 0 : exp1 = norm_l( L_tmp );
1368 0 : tmp1 = extract_h( L_shl( L_tmp, exp1 ) ); /*exp1-16 */
1369 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(exp1-16)-> 30+15-exp1 */
1370 0 : fdbck_fx = mult( 26870, tmp1 ); /*45-exp1+15-15=>45-exp1 */
1371 0 : fdbck_fx = shr_r( fdbck_fx, 14 );
1372 0 : exp1 = sub( 31, exp1 );
1373 : }
1374 : ELSE
1375 : {
1376 0 : L_tmp = L_shl( etmp, add( e_Noise, 14 ) ); /* Result in Q30 */
1377 0 : L_tmp = L_add( 16384, L_tmp );
1378 :
1379 0 : exp1 = norm_l( L_tmp );
1380 0 : tmp1 = extract_h( L_shl( L_tmp, exp1 ) ); /*14+exp1-16 */
1381 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(14+exp1-16)-> 16+15-exp1 */
1382 0 : fdbck_fx = mult( 26870, tmp1 ); /*31-exp1+15-15=>31-exp1 */
1383 0 : exp1 = sub( 31, exp1 );
1384 : }
1385 : }
1386 :
1387 0 : IF( EQ_16( exp1, 31 ) )
1388 : {
1389 0 : L_const_1 = 0x7fffffff;
1390 0 : move32();
1391 : }
1392 : ELSE
1393 : {
1394 0 : L_const_1 = L_shl( 1, exp1 );
1395 : }
1396 :
1397 0 : l_nelp_gain_mem = L_deposit_l( hSC_VBR->nelp_gain_mem_fx );
1398 0 : IF( NE_16( qNelpGain, qGain ) )
1399 : {
1400 0 : l_nelp_gain_mem = L_shl( l_nelp_gain_mem, sub( qGain, qNelpGain ) );
1401 : }
1402 :
1403 0 : FOR( i = 0; i < 10; i++ )
1404 : {
1405 : /*Gains[i] = (float)((1.0f - fdbck) * Gains[i] + fdbck * st->nelp_gain_mem); */
1406 0 : L_tmp = L_sub( L_const_1, L_deposit_l( fdbck_fx ) ); /*31-exp1 */
1407 0 : L_tmp = Mult_32_16( L_tmp, Gains_fx[i] ); /*exp1+qGain-15=>exp1-15+qGain */
1408 0 : Ltemp1 = Mult_32_16( l_nelp_gain_mem, fdbck_fx ); /*exp1+qGain-15 */
1409 0 : L_tmp = L_add( L_tmp, Ltemp1 );
1410 0 : L_tmp = L_shr_r( L_tmp, ( exp1 - 15 ) );
1411 0 : Gains_fx[i] = round_fx_sat( L_shl_sat( L_tmp, 16 ) );
1412 0 : move16();
1413 0 : l_nelp_gain_mem = L_tmp;
1414 : }
1415 :
1416 0 : hSC_VBR->nelp_gain_mem_fx = round_fx( L_shl( l_nelp_gain_mem, 16 ) );
1417 0 : move16();
1418 :
1419 0 : Scale_sig( &hSC_VBR->nelp_gain_mem_fx, 1, -qGain );
1420 0 : Scale_sig( Gains_fx, 10, -qGain );
1421 0 : qGain = 0;
1422 0 : move16();
1423 :
1424 0 : quantize_uvg_fx( Gains_fx, &iG1_fx, iG2_fx, Gains_fx, st_fx->bwidth );
1425 :
1426 0 : IF( EQ_16( rf_flag, 1 ) )
1427 : {
1428 0 : hRF->rf_indx_nelp_iG1[0] = iG1_fx;
1429 0 : move16();
1430 0 : hRF->rf_indx_nelp_iG2[0][0] = iG2_fx[0];
1431 0 : move16();
1432 0 : hRF->rf_indx_nelp_iG2[0][1] = iG2_fx[1];
1433 0 : move16();
1434 : }
1435 : ELSE
1436 : {
1437 0 : push_indice( hBstr, IND_IG1, iG1_fx, 5 );
1438 0 : push_indice( hBstr, IND_IG2A, iG2_fx[0], 6 );
1439 0 : push_indice( hBstr, IND_IG2B, iG2_fx[1], 6 );
1440 : }
1441 :
1442 0 : test();
1443 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
1444 : {
1445 0 : gain_fac_fx = 19005;
1446 0 : move16(); /* 1.16f in Q14 */
1447 : }
1448 : ELSE
1449 : {
1450 0 : gain_fac_fx = 22446;
1451 0 : move16(); /* 1.37f in Q14 */
1452 : }
1453 :
1454 : /* Normalize Gains_fx[10] with headroom 4 */
1455 : /* This fills up qGain with some new value */
1456 0 : normalize_arr( Gains_fx, &qGain, 10, 4 );
1457 :
1458 0 : generate_nelp_excitation_fx( &( hSC_VBR->nelp_enc_seed ), Gains_fx, ptr_fx, gain_fac_fx );
1459 0 : test();
1460 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
1461 : {
1462 0 : BP1_ORDER = 4;
1463 0 : move16();
1464 0 : Scale_sig( hSC_VBR->bp1_filt_mem_wb_fx, BP1_ORDER * 2, qGain - hSC_VBR->qprevGain_fx ); /*qf-qAdj */
1465 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 );
1466 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
1467 : }
1468 0 : ELSE IF( EQ_16( st_fx->bwidth, NB ) )
1469 : {
1470 0 : BP1_ORDER = 7;
1471 0 : move16();
1472 0 : Scale_sig32( hSC_VBR->bp1_filt_mem_nb_fx, BP1_ORDER * 2, ( qGain - hSC_VBR->qprevGain_fx ) );
1473 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 ) ) );
1474 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
1475 :
1476 0 : Scale_sig( ptr_fx, L_FRAME, -1 ); /* bring exc to qgain-1 */
1477 0 : *qIn1 = sub( qGain, 1 ); /* use this temp only in the parent */
1478 : }
1479 :
1480 0 : E3_fx = L_deposit_l( 0 );
1481 0 : FOR( i = 0; i < L_FRAME; i++ )
1482 : {
1483 0 : E3_fx = L_mac_sat( E3_fx, ptr_fx[i], ptr_fx[i] ); /*Q1 */
1484 : }
1485 0 : qE3 = add( shl( qGain, 1 ), 1 );
1486 :
1487 0 : test();
1488 0 : IF( EQ_16( st_fx->bwidth, WB ) || EQ_16( st_fx->bwidth, SWB ) )
1489 : {
1490 0 : Scale_sig( hSC_VBR->shape1_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
1491 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) */
1492 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
1493 :
1494 0 : qf = qGain;
1495 0 : move16();
1496 0 : E2_fx = L_deposit_l( 0 );
1497 0 : FOR( i = 0; i < L_FRAME; i++ )
1498 : {
1499 0 : Ltemp = L_mult0( ptr_fx[i], ptr_fx[i] ); /*Q(2*qE2+1) */
1500 0 : Ltemp = L_shr_r( Ltemp, 4 );
1501 0 : E2_fx = L_add( E2_fx, Ltemp );
1502 : }
1503 0 : qE2 = sub( shl( qf, 1 ), 4 );
1504 :
1505 0 : test();
1506 0 : IF( E1_fx == 0 )
1507 : {
1508 0 : R_fx = 0;
1509 0 : move16();
1510 : }
1511 0 : ELSE IF( ( E2_fx == 0 ) && ( E1_fx != 0 ) )
1512 : {
1513 0 : exp1 = norm_l( E1_fx );
1514 0 : tmp1 = extract_h( L_shl( E1_fx, exp1 ) ); /*qE1+exp1-16 */
1515 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qE1+exp1-16)-> 30-qE1-exp1 */
1516 0 : exp1 = sub( exp1, 30 - qE1 );
1517 :
1518 0 : L_tmp = L_deposit_h( tmp1 );
1519 0 : L_tmp = Isqrt_lc( L_tmp, &exp1 );
1520 0 : Ltemp = L_shl( L_tmp, sub( exp1, 12 ) );
1521 0 : R_fx = round_fx( Ltemp );
1522 : }
1523 : ELSE
1524 : {
1525 0 : exp1 = norm_l( E1_fx );
1526 0 : tmp1 = extract_h( L_shl( E1_fx, exp1 ) ); /*qE1+exp1-16 */
1527 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qE1+exp1-16)-> 30-qE1-exp1 */
1528 0 : L_tmp = Mult_32_16( E2_fx, tmp1 ); /*qE2+30-qE1-exp1-15=>15+qE2-qE1-exp1 */
1529 :
1530 0 : exp2 = norm_l( L_tmp );
1531 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qE2-qE1-exp1+exp2 */
1532 0 : exp2 = add( 15, add( sub( sub( qE2, qE1 ), exp1 ), exp2 ) );
1533 0 : L_tmp = Isqrt_lc( L_tmp, &exp2 ); /*Q(31+exp2) */
1534 0 : R_fx = round_fx( L_tmp );
1535 0 : exp1 = sub( 8, exp2 );
1536 : }
1537 :
1538 0 : FOR( i = 0; i < L_FRAME; i++ )
1539 : {
1540 0 : Ltemp = L_mult0( R_fx, ptr_fx[i] );
1541 0 : Ltemp = L_shr_r( Ltemp, exp1 );
1542 0 : filtRes_fx[i] = round_fx_sat( L_shl_sat( Ltemp, 16 ) );
1543 0 : move16();
1544 : }
1545 :
1546 0 : qf1 = qGain;
1547 0 : move16();
1548 0 : Scale_sig( hSC_VBR->txlpf1_filt2_mem_fx, 10, ( qf1 - hSC_VBR->qprevGain_fx ) );
1549 :
1550 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) */
1551 0 : Copy( ptr_tmp_fx, filtRes_fx, L_FRAME );
1552 :
1553 0 : qEL2 = qf1;
1554 0 : move16();
1555 0 : EL2_fx = L_deposit_l( 0 );
1556 0 : FOR( i = 0; i < L_FRAME; i++ )
1557 : {
1558 0 : EL2_fx = L_mac0_sat( EL2_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qEL2) */
1559 : }
1560 0 : qEL2 = shl( qEL2, 1 );
1561 :
1562 0 : FOR( i = 0; i < L_FRAME; i++ )
1563 : {
1564 0 : Ltemp = L_mult0( R_fx, ptr_fx[i] );
1565 0 : Ltemp = L_shr_r( Ltemp, exp1 );
1566 0 : filtRes_fx[i] = round_fx_sat( L_shl_sat( Ltemp, 16 ) );
1567 0 : move16();
1568 : }
1569 :
1570 0 : qf = qGain;
1571 0 : move16();
1572 0 : Scale_sig( hSC_VBR->txhpf1_filt2_mem_fx, 10, ( qf - hSC_VBR->qprevGain_fx ) );
1573 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) */
1574 :
1575 0 : Copy( ptr_tmp_fx, filtRes_fx, L_FRAME );
1576 :
1577 0 : qEH2 = qf;
1578 0 : move16();
1579 0 : EH2_fx = L_deposit_l( 0 );
1580 0 : FOR( i = 0; i < L_FRAME; i++ )
1581 : {
1582 0 : EH2_fx = L_mac0_sat( EH2_fx, filtRes_fx[i], filtRes_fx[i] ); /*Q(2*qEH2) */
1583 : }
1584 0 : qEH2 = shl( qEH2, 1 );
1585 0 : IF( EL2_fx == 0 )
1586 : {
1587 0 : exp2 = norm_l( EL1_fx );
1588 0 : L_tmp = L_shl( EL1_fx, exp2 );
1589 0 : exp2 = sub( sub( 30, exp2 ), qEL1 );
1590 0 : tmp1 = Log2_norm_lc( L_tmp );
1591 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*10*log(2) in Q15 format = Q0 format */
1592 0 : tmp1 = round_fx_sat( L_shl_sat( Ltemp, 12 ) ); /* Q12 */
1593 0 : RL_fx = L_mult0( tmp1, 10 );
1594 : }
1595 : ELSE
1596 : {
1597 0 : exp1 = norm_l( EL2_fx );
1598 0 : tmp1 = extract_h( L_shl( EL2_fx, exp1 ) ); /*qEL2+exp1-16 */
1599 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qEL2+exp1-16)-> 30-qEL2-exp1 */
1600 0 : L_tmp = Mult_32_16( EL1_fx, tmp1 ); /*qEL1+30-qEL2-exp1-15=>15+qE1-qEL2-exp1 */
1601 :
1602 0 : exp2 = norm_l( L_tmp );
1603 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEL1-qEL2-exp1+exp2 */
1604 0 : exp2 = sub( 30, add( sub( sub( add( 30, qEL1 ), qEL2 ), exp1 ), exp2 ) );
1605 0 : tmp1 = Log2_norm_lc( L_tmp );
1606 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*10*log(2) in Q15 format = Q0 format */
1607 0 : tmp1 = round_fx_sat( L_shl_sat( Ltemp, 12 ) ); /* Q12 */
1608 0 : RL_fx = L_mult0( tmp1, 10 );
1609 : }
1610 :
1611 0 : IF( EH2_fx == 0 )
1612 : {
1613 0 : exp2 = norm_l( EH2_fx );
1614 0 : L_tmp = L_shl( EH2_fx, exp2 );
1615 0 : exp2 = sub( sub( 30, exp2 ), qEH2 );
1616 0 : tmp1 = Log2_norm_lc( L_tmp );
1617 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*10*log(2) in Q13 format = Q0 format */
1618 0 : tmp1 = round_fx_sat( L_shl_sat( Ltemp, 12 ) ); /* Q12 */
1619 0 : RH_fx = L_mult0( tmp1, 10 );
1620 : }
1621 : ELSE
1622 : {
1623 0 : exp1 = norm_l( EH2_fx );
1624 0 : tmp1 = extract_h( L_shl( EH2_fx, exp1 ) ); /*qEH2+exp1-16 */
1625 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qEH2+exp1-16)-> 30-qEH2-exp1 */
1626 0 : L_tmp = Mult_32_16( EH1_fx, tmp1 ); /*15+qEH1-qEH2-exp1 */
1627 :
1628 0 : exp2 = norm_l( L_tmp );
1629 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qEH1-qEH2-exp1+exp2 */
1630 0 : exp2 = sub( 30, add( 30, add( sub( sub( qEH1, qEH2 ), exp1 ), exp2 ) ) );
1631 0 : tmp1 = Log2_norm_lc( L_tmp );
1632 0 : Ltemp = Mpy_32_16( exp2, tmp1, 9864 ); /*10*log(2) in Q13 format = Q0 format */
1633 0 : tmp1 = round_fx_sat( L_shl_sat( Ltemp, 12 ) ); /* Q12 */
1634 0 : RH_fx = L_mult0( tmp1, 10 );
1635 : }
1636 :
1637 0 : fid = 0;
1638 0 : move16();
1639 0 : IF( LT_32( RL_fx, -12288 ) ) /* -3 in Q12 */
1640 : {
1641 0 : fid = 1;
1642 0 : move16();
1643 : }
1644 0 : ELSE IF( LT_32( RH_fx, -12288 ) ) /* -3 in Q12 */
1645 : {
1646 0 : fid = 2;
1647 0 : move16();
1648 : }
1649 :
1650 0 : IF( rf_flag == 0 )
1651 : {
1652 :
1653 0 : SWITCH( fid )
1654 : {
1655 0 : case 1:
1656 : /* Update other filter memory */
1657 0 : Scale_sig( hSC_VBR->shape3_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
1658 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) */
1659 :
1660 : /* filter the residual to desired shape */
1661 0 : Scale_sig( hSC_VBR->shape2_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
1662 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) */
1663 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
1664 :
1665 0 : BREAK;
1666 0 : case 2:
1667 : /* Update other filter memory */
1668 0 : Scale_sig( hSC_VBR->shape2_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
1669 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) */
1670 :
1671 : /* filter the residual to desired shape */
1672 0 : Scale_sig( hSC_VBR->shape3_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
1673 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) */
1674 :
1675 0 : Copy( ptr_tmp_fx, ptr_fx, L_FRAME );
1676 :
1677 0 : BREAK;
1678 0 : default:
1679 0 : Scale_sig( hSC_VBR->shape2_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
1680 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) */
1681 :
1682 0 : Scale_sig( hSC_VBR->shape3_filt_mem_fx, 10, ( qGain - hSC_VBR->qprevGain_fx ) );
1683 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) */
1684 :
1685 0 : BREAK;
1686 : }
1687 :
1688 0 : qE2 = qGain;
1689 0 : move16();
1690 :
1691 0 : E2_fx = L_deposit_l( 0 );
1692 0 : FOR( i = 0; i < L_FRAME; i++ )
1693 : {
1694 0 : Ltemp = L_mult0( ptr_fx[i], ptr_fx[i] ); /*Q(2*qE2+1) */
1695 0 : Ltemp = L_shr_r( Ltemp, 4 );
1696 0 : E2_fx = L_add( E2_fx, Ltemp );
1697 : }
1698 0 : qE2 = sub( shl( qE2, 1 ), 4 );
1699 :
1700 0 : test();
1701 0 : IF( E3_fx == 0 )
1702 : {
1703 0 : R_fx = 0;
1704 0 : move16();
1705 : }
1706 0 : ELSE IF( ( E2_fx == 0 ) && ( E3_fx != 0 ) )
1707 : {
1708 0 : exp1 = norm_l( E3_fx );
1709 0 : tmp1 = extract_h( L_shl( E3_fx, exp1 ) ); /*qE3+exp1-16 */
1710 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qE3+exp1-16)-> 30-qE3-exp1 */
1711 0 : exp1 = sub( exp1, 30 - qE3 );
1712 :
1713 0 : L_tmp = L_deposit_h( tmp1 );
1714 0 : L_tmp = Isqrt_lc( L_tmp, &exp1 );
1715 0 : Ltemp = L_shl( L_tmp, sub( exp1, 12 ) );
1716 0 : R_fx = round_fx( Ltemp );
1717 : }
1718 : ELSE
1719 : {
1720 0 : exp1 = norm_l( E3_fx );
1721 0 : tmp1 = extract_h( L_shl( E3_fx, exp1 ) ); /*qE3+exp1-16 */
1722 0 : tmp1 = div_s( 16384, tmp1 ); /*14-(qE3+exp1-16)-> 30-qE3-exp1 */
1723 0 : L_tmp = Mult_32_16( E2_fx, tmp1 ); /*qE2+30-qE3-exp1-15=>15+qE2-qE3-exp1 */
1724 :
1725 0 : exp2 = norm_l( L_tmp );
1726 0 : L_tmp = L_shl( L_tmp, exp2 ); /*15+qE2-qE3-exp1+exp2 */
1727 0 : exp2 = sub( 30, add( sub( sub( add( 15, qE2 ), qE3 ), exp1 ), exp2 ) );
1728 0 : L_tmp = Isqrt_lc( L_tmp, &exp2 ); /*Q(31+exp2) */
1729 0 : R_fx = round_fx( L_tmp );
1730 0 : exp1 = sub( sub( sub( 31, exp2 ), 16 ), 7 );
1731 : }
1732 :
1733 0 : FOR( i = 0; i < L_FRAME; i++ )
1734 : {
1735 0 : L_tmp = L_mult0( R_fx, ptr_fx[i] );
1736 0 : L_tmp = L_shr_r( L_tmp, exp1 + 1 );
1737 0 : ptr_fx[i] = round_fx( L_shl( L_tmp, 16 ) );
1738 0 : move16();
1739 : }
1740 0 : *qIn1 = sub( qGain, 1 );
1741 0 : move16();
1742 : }
1743 :
1744 0 : IF( EQ_16( rf_flag, 1 ) )
1745 : {
1746 0 : hRF->rf_indx_nelp_fid[0] = fid;
1747 0 : move16();
1748 : }
1749 : ELSE
1750 : {
1751 0 : push_indice( hBstr, IND_NELP_FID, fid, 2 );
1752 : }
1753 : }
1754 :
1755 0 : hSC_VBR->qprevGain_fx = qGain;
1756 0 : move16();
1757 :
1758 0 : IF( rf_flag == 0 )
1759 : {
1760 0 : FOR( i = 0; i < L_FRAME; i++ )
1761 : {
1762 0 : exc_fx[i] = ptr_fx[i];
1763 0 : move16();
1764 : }
1765 : }
1766 :
1767 0 : return;
1768 : }
|