Line data Source code
1 : /*====================================================================================
2 : EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
3 : ====================================================================================*/
4 :
5 :
6 : #include <stdint.h>
7 : #include "options.h"
8 : #include "basop_util.h"
9 : #include "rom_enc.h"
10 : #include "vad_basop.h"
11 : //#include "prot_fx.h"
12 : #include "prot_fx.h" /* Function prototypes */
13 : #include "prot_fx_enc.h" /* Function prototypes */
14 : /*-------------------------------------------------------------------*
15 : * est_energy_fx()
16 : *
17 : *
18 : *-------------------------------------------------------------------*/
19 3100 : void est_energy_fx(
20 : Word32 enerBuffer[CLDFB_NO_CHANNELS_MAX], /* i : energy vector per band enerBuffer_exp*/
21 : Word16 enerBuffer_exp, /* i : exponent of energy vector */
22 : Word32 *frame_sb_energy, /* o : energy of sub-band divided non-uniformly frame_sb_energy_scale*/
23 : Word32 *frame_energy2_p, /* o : frame energy 2 frame_energy2_Q*/
24 : Word32 *HB_Power_p, /* o : high frequency energy HB_Power_Q*/
25 : Word32 *frame_energy_p, /* o : frame energy 1 frame_energy_Q*/
26 : Word16 *sb_power_Q, /* o : the scaling of sb_power */
27 : Word16 *frame_energy2_Q, /* o : the scaling of frame_energy */
28 : Word16 *HB_Power_Q, /* o : the scaling of HB_Power */
29 : Word16 *frame_energy_Q, /* o : the Scaling of frame_energy */
30 : Word16 *frame_sb_energy_scale, /* o : the Scaling of frame_sb_energy[] */
31 : const Word32 bandwidth /* i : band width Q0*/
32 : )
33 : {
34 : Word32 i, j;
35 : Word32 frame_energy2, HB_Power, tmpspec_amp;
36 : Word32 sb_power_tmp;
37 : Word32 frame_energy, s32CopyPower;
38 : Word32 SNR_sb_num;
39 : Word16 shr_tmp;
40 : Word32 BandNum;
41 : Word16 widthsb, s16MaxCoefNorm;
42 : const Word16 *Nregion_index;
43 3100 : Word32 *sb_power = enerBuffer;
44 3100 : Word32 Ltmp32 = 0;
45 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
46 3100 : Flag Overflow = 0;
47 : #endif
48 3100 : move32();
49 3100 : SNR_sb_num = SNR_SUB_BAND_NUM[bandwidth - CLDFBVAD_NB_ID];
50 3100 : move16();
51 3100 : Nregion_index = REGION_INDEX[bandwidth - CLDFBVAD_NB_ID];
52 3100 : move16();
53 :
54 3100 : shr_tmp = BAND_SCALE_AJ[bandwidth];
55 3100 : move16();
56 3100 : BandNum = BAND_NUM_TAB[bandwidth];
57 3100 : move16();
58 :
59 3100 : frame_energy2 = L_shr( sb_power[1], shr_tmp ); /* 31 - enerBuffer_exp - shr_tmp */
60 3100 : HB_Power = L_shr( sb_power[6], shr_tmp ); /* 31 - enerBuffer_exp - shr_tmp */
61 120900 : FOR( i = 2; i < BandNum; i++ )
62 : {
63 117800 : Ltmp32 = L_shr( sb_power[i], shr_tmp ); /* 31 - enerBuffer_exp - shr_tmp */
64 117800 : frame_energy2 = L_add_sat( frame_energy2, Ltmp32 ); /* 31 - enerBuffer_exp - shr_tmp */
65 117800 : if ( i > 6 )
66 102300 : HB_Power = L_add_sat( HB_Power, Ltmp32 );
67 : }
68 3100 : frame_energy2 = L_sub( frame_energy2, Ltmp32 ); /* 31 - enerBuffer_exp - shr_tmp */
69 :
70 3100 : sb_power_tmp = L_shr( sb_power[0], shr_tmp ); /* 31 - enerBuffer_exp - shr_tmp */
71 :
72 3100 : IF( EQ_32( bandwidth, 1 ) )
73 : {
74 0 : frame_energy = L_add( frame_energy2, MUL_F( sb_power_tmp, 0x147a /* 0.16 in Q15 */ ) );
75 : }
76 3100 : ELSE IF( EQ_32( bandwidth, 2 ) )
77 : {
78 0 : frame_energy = L_add( frame_energy2, MUL_F( sb_power_tmp, 0x1eb8 /* 0.24 in Q15 */ ) );
79 : }
80 3100 : ELSE IF( EQ_32( bandwidth, 3 ) )
81 : {
82 3100 : frame_energy = L_add( frame_energy2, MUL_F( sb_power_tmp, 0x23d7 /* 0.28 in Q15 */ ) );
83 : }
84 0 : ELSE IF( EQ_32( bandwidth, 4 ) )
85 : {
86 0 : frame_energy = L_add( frame_energy2, MUL_F( sb_power_tmp, 0x23d7 /* 0.28 in Q15 */ ) );
87 : }
88 : ELSE
89 : {
90 0 : frame_energy = L_add( frame_energy2, MUL_F( sb_power_tmp, 0x23d7 /* 0.28 in Q15 */ ) );
91 : }
92 :
93 3100 : *frame_energy2_p = frame_energy2;
94 3100 : move32();
95 3100 : *HB_Power_p = HB_Power;
96 3100 : move32();
97 3100 : *frame_energy_p = frame_energy;
98 3100 : move32();
99 : /* enerBuffer(float) = enerBuffer(fixed) * 2^(-(31-enerBuffer_exp)) */
100 : /* +30 is to keep original precision */
101 3100 : *sb_power_Q = sub( 31 + 30, enerBuffer_exp );
102 3100 : move16();
103 3100 : *frame_energy2_Q = sub( *sb_power_Q, shr_tmp );
104 3100 : move16();
105 3100 : *HB_Power_Q = sub( *sb_power_Q, shr_tmp );
106 3100 : move16();
107 3100 : *frame_energy_Q = sub( *sb_power_Q, shr_tmp );
108 3100 : move16();
109 :
110 21700 : FOR( i = 0; i < 6; i++ )
111 : {
112 18600 : frame_sb_energy[i] = sb_power[i]; /* sb_power_Q */
113 18600 : move32();
114 : }
115 :
116 21700 : FOR( i = 6; i < SNR_sb_num; i++ )
117 : {
118 18600 : s32CopyPower = 0;
119 18600 : move32();
120 18600 : widthsb = sub( Nregion_index[i + 1], Nregion_index[i] ); /* Q0 */
121 18600 : s16MaxCoefNorm = sub( ffr_getSfWord32( ( sb_power + Nregion_index[i] ), widthsb ), NREGION_PREOFF[i] );
122 :
123 111600 : FOR( j = Nregion_index[i]; j < Nregion_index[i + 1]; j++ )
124 : {
125 93000 : tmpspec_amp = L_shl( sb_power[j], s16MaxCoefNorm ); /* sb_power_Q + s16MaxCoefNorm */
126 93000 : s32CopyPower = L_add( s32CopyPower, tmpspec_amp );
127 : }
128 18600 : frame_sb_energy[i] = L_shr_o( s32CopyPower, s16MaxCoefNorm, &Overflow ); /* sb_power_Q */
129 18600 : move32();
130 : }
131 :
132 3100 : *frame_sb_energy_scale = *sb_power_Q;
133 3100 : move16();
134 3100 : return;
135 : }
136 : /*-------------------------------------------------------------------*
137 : * NormEnergyWord32()
138 : *
139 : *
140 : *-------------------------------------------------------------------*/
141 3100 : static void NormEnergyWord32(
142 : Word32 *vector,
143 : const Word32 len,
144 : const Word16 *pi_scale,
145 : Word16 *normscale )
146 : {
147 : Word16 minVal;
148 : Word16 i;
149 :
150 :
151 3100 : minVal = pi_scale[0];
152 3100 : move16();
153 :
154 37200 : FOR( i = 1; i < len; i++ )
155 : {
156 34100 : minVal = s_min( minVal, pi_scale[i] );
157 : }
158 :
159 40300 : FOR( i = 0; i < len; i++ )
160 : {
161 37200 : vector[i] = L_shr( vector[i], sub( pi_scale[i], minVal ) );
162 37200 : move32();
163 : }
164 3100 : *normscale = minVal;
165 3100 : move16();
166 3100 : }
167 : /*-------------------------------------------------------------------*
168 : * update_sb_bg_energy()
169 : *
170 : *
171 : *-------------------------------------------------------------------*/
172 39 : static void update_sb_bg_energy(
173 : Word32 *sb_bg_energy, /* p_scale_sb_energy */
174 : Word16 *tbg_energy_count, /* Q0 */
175 : Word16 *p_scale_sb_energy,
176 : const Word32 SNR_sb_num, /* Q0 */
177 : const Word32 *frame_sb_energy, /* frame_sb_energy_scale */
178 : const Word16 frame_sb_energy_scale,
179 : const Word16 FAC_16Q15_a, /* Q15 */
180 : const Word16 tmp_Q_add,
181 : const Word16 FAC_16Q19_b /* Q19 */
182 : )
183 : {
184 : Word32 sb_bg_energy_ti, tmp;
185 : Word16 tmpQ, i;
186 :
187 39 : *tbg_energy_count = add_sat( *tbg_energy_count, 1 ); /* Q0 */
188 39 : move16();
189 39 : tmpQ = add( tmp_Q_add, frame_sb_energy_scale );
190 :
191 507 : FOR( i = 0; i < SNR_sb_num; i++ )
192 : {
193 468 : sb_bg_energy_ti = MUL_F( sb_bg_energy[i], FAC_16Q15_a ); /* p_scale_sb_energy */
194 468 : tmp = MUL_F( frame_sb_energy[i], FAC_16Q19_b );
195 468 : sb_bg_energy[i] = VAD_L_ADD( sb_bg_energy_ti, p_scale_sb_energy[i], tmp, tmpQ, &p_scale_sb_energy[i] ); /* p_scale_sb_energy */
196 468 : move32();
197 : }
198 39 : }
199 :
200 : /*-------------------------------------------------------------------*
201 : * update_sb_bg_energy()
202 : *
203 : *
204 : *-------------------------------------------------------------------*/
205 3100 : void background_update_fx(
206 : VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */
207 : Word16 scale, /* i : the scaling of frame energy */
208 : Word32 frame_energy, /* i : current frame energy scale*/
209 : Word32 update_flag, /* i : update flag Q0*/
210 : Word16 music_backgound_f, /* i : background music flag Q0*/
211 : Word32 snr /* Q25 */
212 : )
213 : {
214 : Word32 tmp;
215 : Word16 i, tmpQ, cmp_lt_frame, cmp_pre_frame;
216 : Word32 SNR_sb_num;
217 : Word16 normscal, scale_sb_energy;
218 : Word32 *sb_bg_energy;
219 : Word32 *frame_sb_energy;
220 : Word32 t_bg_energy;
221 : Word32 sb_bg_energy_ti;
222 : Word16 q_divout;
223 : T_VAD_EXP exp_frame_energy, CONST32fix;
224 : T_VAD_EXP t_bg_energy_sum;
225 : Word16 p_scale_sb_energy[12];
226 3100 : Word16 *f_tonality_rate = hVAD_CLDFB->f_tonality_rate;
227 3100 : Word16 *ltd_stable_rate = hVAD_CLDFB->ltd_stable_rate;
228 3100 : Word32 bandwith = hVAD_CLDFB->bw_index;
229 : Word16 cmp_tmp;
230 : T_VAD_EXP exp_frame_energy_amendment;
231 :
232 3100 : move32();
233 3100 : move16();
234 3100 : move16();
235 :
236 :
237 3100 : tmp = L_deposit_l( -1 );
238 :
239 3100 : CONST32fix.s16Exp = 44;
240 3100 : move16();
241 3100 : CONST32fix.s32Mantissa = 1759218560;
242 3100 : move32();
243 3100 : SNR_sb_num = SNR_SUB_BAND_NUM[bandwith - CLDFBVAD_NB_ID];
244 3100 : move16();
245 3100 : scale_sb_energy = hVAD_CLDFB->sb_bg_energy_scale;
246 3100 : move16();
247 :
248 3100 : sb_bg_energy = hVAD_CLDFB->sb_bg_energy;
249 3100 : move32();
250 3100 : frame_sb_energy = hVAD_CLDFB->frame_sb_energy;
251 3100 : move32();
252 3100 : t_bg_energy = hVAD_CLDFB->t_bg_energy;
253 3100 : move32();
254 :
255 3100 : t_bg_energy_sum = hVAD_CLDFB->t_bg_energy_sum;
256 3100 : move32();
257 3100 : normscal = norm_l( frame_energy );
258 3100 : exp_frame_energy.s16Exp = add( scale, normscal );
259 3100 : exp_frame_energy.s32Mantissa = L_shl( frame_energy, normscal );
260 3100 : exp_frame_energy = VAD_AddExp( exp_frame_energy, CONST32fix );
261 3100 : cmp_lt_frame = VAD_L_CMP( exp_frame_energy.s32Mantissa, exp_frame_energy.s16Exp, 46, 0 );
262 :
263 40300 : FOR( i = 0; i < SNR_sb_num; i++ )
264 : {
265 37200 : p_scale_sb_energy[i] = scale_sb_energy;
266 37200 : move16();
267 : }
268 :
269 3100 : test();
270 3100 : test();
271 3100 : test();
272 3100 : test();
273 3100 : test();
274 3100 : IF( ( LT_16( hVAD_CLDFB->frameloop, 60 ) ) && ( GT_16( hVAD_CLDFB->frameloop, 5 ) ) && ( LT_16( f_tonality_rate[0], 9174 /* 0.56 Q14 */ ) ) && ( LT_16( f_tonality_rate[1], 8192 /* 0.5 Q14 */ ) ) && ( LT_16( ltd_stable_rate[1], 1966 /* 0.06 Q15 */ ) ) && LT_32( snr, 83886080 /* 2.5f in Q25 */ ) )
275 : {
276 15 : IF( LT_16( hVAD_CLDFB->frameloop, 50 ) )
277 : {
278 15 : exp_frame_energy_amendment.s32Mantissa = VAD_L_div( exp_frame_energy.s32Mantissa, 10, exp_frame_energy.s16Exp, 0, &q_divout ); /* exp(divout) */
279 15 : exp_frame_energy_amendment.s16Exp = q_divout;
280 15 : move16();
281 15 : t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy_amendment );
282 : }
283 : ELSE
284 : {
285 0 : t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy );
286 : }
287 15 : update_sb_bg_energy( sb_bg_energy, &hVAD_CLDFB->tbg_energy_count, p_scale_sb_energy, SNR_sb_num, frame_sb_energy, hVAD_CLDFB->frame_sb_energy_scale,
288 : 29490 /* 0.90 Q15 */, 3, 5242 /* 0.01 Q19 */ ); // 5243
289 : }
290 :
291 3100 : test();
292 3100 : test();
293 3100 : IF( ( EQ_32( update_flag, 1 ) ) && ( GT_16( hVAD_CLDFB->frameloop, 2 ) ) && music_backgound_f == 0 )
294 : {
295 24 : IF( LT_16( hVAD_CLDFB->bg_update_count, 16 ) )
296 : {
297 24 : IF( LT_16( hVAD_CLDFB->frameloop, 50 ) )
298 : {
299 24 : exp_frame_energy_amendment.s32Mantissa = VAD_L_div( exp_frame_energy.s32Mantissa, 10, exp_frame_energy.s16Exp, 0, &q_divout ); /* exp(q_divout) */
300 24 : exp_frame_energy_amendment.s16Exp = q_divout;
301 24 : move16();
302 24 : t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy_amendment );
303 : }
304 : ELSE
305 : {
306 0 : t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy );
307 : }
308 24 : update_sb_bg_energy( sb_bg_energy, &hVAD_CLDFB->tbg_energy_count, p_scale_sb_energy, SNR_sb_num, frame_sb_energy, hVAD_CLDFB->frame_sb_energy_scale,
309 : 31456 /* 0.96 Q15 */, 4, 20971 /* 0.04 Q19 */ );
310 :
311 24 : hVAD_CLDFB->bg_update_count = add( hVAD_CLDFB->bg_update_count, 1 ); /* Q0 */
312 24 : move16();
313 : }
314 : ELSE
315 : {
316 :
317 0 : cmp_lt_frame = VAD_L_CMP( t_bg_energy, hVAD_CLDFB->scale_t_bg_energy, exp_frame_energy.s32Mantissa, exp_frame_energy.s16Exp );
318 0 : cmp_pre_frame = VAD_L_CMP( MUL_F( hVAD_CLDFB->frame_energy_smooth, 24576 ), sub( hVAD_CLDFB->frame_energy_smooth_scale, 5 ), exp_frame_energy.s32Mantissa, exp_frame_energy.s16Exp );
319 0 : cmp_tmp = VAD_L_CMP( MUL_F( t_bg_energy, 24576 ), sub( hVAD_CLDFB->scale_t_bg_energy, 4 ), exp_frame_energy.s32Mantissa, exp_frame_energy.s16Exp );
320 :
321 0 : test();
322 0 : IF( ( cmp_lt_frame < 0 ) && ( cmp_pre_frame < 0 ) )
323 : {
324 0 : tmpQ = add( 9, hVAD_CLDFB->frame_sb_energy_scale );
325 0 : FOR( i = 0; i < SNR_sb_num; i++ )
326 : {
327 0 : sb_bg_energy_ti = MUL_F( sb_bg_energy[i], 32734 /* 0.999 Q15 */ ); /* p_scale_sb_energy */
328 0 : tmp = MUL_F( frame_sb_energy[i], 16777 /* 0.001 Q24 */ );
329 0 : sb_bg_energy[i] = VAD_L_ADD( sb_bg_energy_ti, p_scale_sb_energy[i], tmp, tmpQ, &p_scale_sb_energy[i] ); /* p_scale_sb_energy */
330 0 : move32();
331 : }
332 : }
333 : /*ELSE IF(L_sub(tmp, -1) == 0) fixed bug*/
334 0 : ELSE IF( cmp_tmp < 0 )
335 : {
336 0 : IF( LT_16( hVAD_CLDFB->frameloop, 50 ) )
337 : {
338 0 : exp_frame_energy_amendment.s32Mantissa = VAD_L_div( exp_frame_energy.s32Mantissa, 10, exp_frame_energy.s16Exp, 0, &q_divout ); /* exp(q_divout) */
339 0 : exp_frame_energy_amendment.s16Exp = q_divout;
340 0 : move16();
341 0 : t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy_amendment );
342 : }
343 : ELSE
344 : {
345 0 : t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy );
346 : }
347 0 : update_sb_bg_energy( sb_bg_energy, &hVAD_CLDFB->tbg_energy_count, p_scale_sb_energy, SNR_sb_num, frame_sb_energy, hVAD_CLDFB->frame_sb_energy_scale,
348 : 31456 /* 0.96 Q15 */, 4, 20971 /* 0.04 Q19 */ );
349 : }
350 : ELSE
351 : {
352 0 : cmp_pre_frame = VAD_L_CMP( t_bg_energy, hVAD_CLDFB->scale_t_bg_energy, exp_frame_energy.s32Mantissa, exp_frame_energy.s16Exp );
353 0 : IF( cmp_pre_frame > 0 )
354 : {
355 0 : IF( LT_16( hVAD_CLDFB->frameloop, 50 ) )
356 : {
357 0 : exp_frame_energy_amendment.s32Mantissa = VAD_L_div( exp_frame_energy.s32Mantissa, 10, exp_frame_energy.s16Exp, 0, &q_divout ); /* exp(q_divout) */
358 0 : exp_frame_energy_amendment.s16Exp = q_divout;
359 0 : move16();
360 0 : t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy_amendment );
361 : }
362 : ELSE
363 : {
364 0 : t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy );
365 : }
366 0 : update_sb_bg_energy( sb_bg_energy, &hVAD_CLDFB->tbg_energy_count, p_scale_sb_energy, SNR_sb_num, frame_sb_energy, hVAD_CLDFB->frame_sb_energy_scale,
367 : 31129 /* 0.95 Q15 */, 4, 26214 /* 0.05 Q19 */ );
368 : }
369 : ELSE
370 : {
371 0 : IF( LT_16( hVAD_CLDFB->frameloop, 50 ) )
372 : {
373 0 : exp_frame_energy_amendment.s32Mantissa = VAD_L_div( exp_frame_energy.s32Mantissa, 10, exp_frame_energy.s16Exp, 0, &q_divout ); /* exp(q_divout) */
374 0 : exp_frame_energy_amendment.s16Exp = q_divout;
375 0 : t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy_amendment );
376 : }
377 : ELSE
378 : {
379 0 : t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy );
380 : }
381 0 : update_sb_bg_energy( sb_bg_energy, &hVAD_CLDFB->tbg_energy_count, p_scale_sb_energy, SNR_sb_num, frame_sb_energy, hVAD_CLDFB->frame_sb_energy_scale,
382 : 31456 /* 0.96 Q15 */, 4, 20971 /* 0.04 Q19 */ );
383 : }
384 : }
385 : }
386 : }
387 : ELSE
388 : {
389 3076 : cmp_pre_frame = VAD_L_CMP( t_bg_energy, hVAD_CLDFB->scale_t_bg_energy, MUL_F( exp_frame_energy.s32Mantissa, 32000 ), sub( exp_frame_energy.s16Exp, 9 ) );
390 3076 : cmp_lt_frame = VAD_L_CMP( sb_bg_energy[0], scale_sb_energy, MUL_F( frame_sb_energy[0], 20480 /* 10 in Q11 */ ), sub( hVAD_CLDFB->frame_sb_energy_scale, 4 ) );
391 :
392 3076 : test();
393 3076 : IF( ( cmp_pre_frame > 0 ) && ( cmp_lt_frame > 0 ) )
394 : {
395 0 : tmpQ = add( 3, hVAD_CLDFB->frame_sb_energy_scale );
396 0 : FOR( i = 0; i < SNR_sb_num; i++ )
397 : {
398 0 : sb_bg_energy_ti = MUL_F( sb_bg_energy[i], 29490 /* 0.90 Q15 */ ); /* p_scale_sb_energy */
399 0 : tmp = MUL_F( frame_sb_energy[i], 26214 /* 0.10 Q18 */ );
400 0 : sb_bg_energy[i] = VAD_L_ADD( sb_bg_energy_ti, p_scale_sb_energy[i], tmp, tmpQ, &p_scale_sb_energy[i] ); /* p_scale_sb_energy */
401 0 : move32();
402 : }
403 : }
404 : ELSE
405 : {
406 3076 : cmp_pre_frame = VAD_L_CMP( t_bg_energy, hVAD_CLDFB->scale_t_bg_energy, MUL_F( exp_frame_energy.s32Mantissa, 20480 ), sub( exp_frame_energy.s16Exp, 4 ) );
407 3076 : IF( cmp_pre_frame > 0 )
408 : {
409 11 : tmpQ = add( 9, hVAD_CLDFB->frame_sb_energy_scale );
410 143 : FOR( i = 0; i < SNR_sb_num; i++ )
411 : {
412 132 : sb_bg_energy_ti = MUL_F( sb_bg_energy[i], 32734 /* 0.999 Q15 */ ); /* exp(p_scale_sb_energy) */
413 132 : tmp = MUL_F( frame_sb_energy[i], 16777 /* 0.001 Q24 */ );
414 132 : sb_bg_energy[i] = VAD_L_ADD( sb_bg_energy_ti, p_scale_sb_energy[i], tmp, tmpQ, &p_scale_sb_energy[i] ); /* exp(p_scale_sb_energy) */
415 132 : move32();
416 : }
417 : }
418 : }
419 : }
420 :
421 3100 : tmp = L_mult0( 160, (Word16) hVAD_CLDFB->tbg_energy_count ); /* Q31 */
422 3100 : cmp_pre_frame = VAD_L_CMP( t_bg_energy_sum.s32Mantissa, t_bg_energy_sum.s16Exp, tmp, 0 );
423 3100 : IF( cmp_pre_frame > 0 )
424 : {
425 0 : i = norm_l( tmp );
426 0 : t_bg_energy_sum.s32Mantissa = L_shl( tmp, i );
427 0 : t_bg_energy_sum.s16Exp = i;
428 0 : move16();
429 : }
430 3100 : NormEnergyWord32( sb_bg_energy, SNR_sb_num, p_scale_sb_energy, &scale_sb_energy );
431 3100 : cmp_pre_frame = VAD_L_CMP( t_bg_energy, hVAD_CLDFB->scale_t_bg_energy, 1, 0 );
432 :
433 3100 : test();
434 3100 : test();
435 3100 : test();
436 3100 : IF( ( EQ_16( music_backgound_f, 1 ) ) && ( LT_32( hVAD_CLDFB->lt_snr_org, 107374179 /* 3.2 Q25 */ ) ) && ( cmp_pre_frame > 0 ) && update_flag == 0 )
437 : {
438 0 : tmp = L_shr( 2147 /* 0.000001 Q31 */, sub( 31, scale_sb_energy ) ); /* scale_sb_energy */
439 0 : FOR( i = 0; i < SNR_sb_num; i++ )
440 : {
441 0 : sb_bg_energy[i] = L_add( MUL_F( sb_bg_energy[i], 32112 /* 0.98 Q15 */ ), tmp ); /* scale_sb_energy */
442 0 : move32();
443 : }
444 : }
445 :
446 3100 : IF( EQ_16( music_backgound_f, 1 ) )
447 : {
448 0 : cmp_pre_frame = VAD_L_CMP( exp_frame_energy.s32Mantissa, exp_frame_energy.s16Exp, MUL_F( t_bg_energy, 5000 ), sub( hVAD_CLDFB->scale_t_bg_energy, 15 ) );
449 0 : IF( cmp_pre_frame < 0 )
450 : {
451 0 : tmp = L_shr( 2147 /* 0.000001 Q31 */, sub( 31, scale_sb_energy ) ); /* scale_sb_energy */
452 0 : FOR( i = 0; i < SNR_sb_num; i++ )
453 : {
454 0 : sb_bg_energy[i] = L_add_sat( MUL_F( sb_bg_energy[i], 32112 /* 0.98 Q15 */ ), tmp ); /* scale_sb_energy */
455 0 : move32();
456 : }
457 : }
458 : }
459 :
460 3100 : IF( ( EQ_32( hVAD_CLDFB->tbg_energy_count, 64 ) ) )
461 : {
462 0 : hVAD_CLDFB->tbg_energy_count = 48;
463 0 : move16();
464 0 : t_bg_energy_sum.s32Mantissa = MUL_F( t_bg_energy_sum.s32Mantissa, 24575 /* 0.75 Q15 */ );
465 : }
466 :
467 3100 : t_bg_energy = VAD_L_div( t_bg_energy_sum.s32Mantissa, hVAD_CLDFB->tbg_energy_count, t_bg_energy_sum.s16Exp, 0, &q_divout ); /* exp(q_divout) */
468 3100 : hVAD_CLDFB->scale_t_bg_energy = q_divout;
469 3100 : move16();
470 3100 : hVAD_CLDFB->t_bg_energy = t_bg_energy;
471 3100 : move32();
472 3100 : hVAD_CLDFB->sb_bg_energy_scale = scale_sb_energy;
473 3100 : move16();
474 3100 : hVAD_CLDFB->t_bg_energy_sum = t_bg_energy_sum;
475 3100 : move16();
476 3100 : move32();
477 :
478 3100 : return;
479 : }
|