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