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