Line data Source code
1 : /*====================================================================================
2 : EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
3 : ====================================================================================*/
4 :
5 : #include <stdint.h>
6 : #include "options.h"
7 : #include "basop_util.h"
8 : #include "vad_basop.h"
9 : #include "prot_fx.h" /* Function prototypes */
10 : #include "prot_fx_enc.h" /* Function prototypes */
11 : #include "rom_enc.h"
12 : #include "rom_com.h"
13 :
14 :
15 : /*-------------------------------------------------------------------*
16 : * calc_lf_snr_fx()
17 : *
18 : *
19 : *-------------------------------------------------------------------*/
20 :
21 3100 : void calc_lf_snr_fx(
22 : Word32 *lf_snr_smooth, /* o : smoothed lf_snr Q25*/
23 : Word32 *lf_snr, /* o : long time frequency domain SNR calculated by l_speech_snr and l_silence_snr Q25*/
24 : const Word32 l_speech_snr, /* i : sum of active frames snr Q16*/
25 : const Word32 l_speech_snr_count, /* i : amount of the active frame Q0*/
26 : const Word32 l_silence_snr, /* i : sum of the nonactive frames snr Q16*/
27 : const Word32 l_silence_snr_count, /* i : amount of the nonactive frame Q0*/
28 : const Word16 fg_energy_count, /* i : amount of the foreground energy frame Q0*/
29 : const Word16 bg_energy_count, /* i : amount of the background energy frame Q0*/
30 : const Word16 bw_index /* i : band width index Q0*/
31 : )
32 : {
33 :
34 : Word32 l_snr, div1, div2, tmp;
35 : Word16 q_divout, q_divout1;
36 :
37 :
38 3100 : div1 = VAD_L_div( l_speech_snr, l_speech_snr_count, 16, 0, &q_divout ); /* q_divout */
39 3100 : div2 = VAD_L_div( l_silence_snr, l_silence_snr_count, 16, 0, &q_divout1 ); /* q_divout1 */
40 3100 : l_snr = VAD_L_ADD( div1, q_divout, L_negate( div2 ), q_divout1, &q_divout ); /* q_divout */
41 :
42 3100 : *lf_snr_smooth = MUL_F( *lf_snr_smooth, 29490 /* 0.9 Q15 */ );
43 3100 : move32();
44 3100 : tmp = MUL_F( l_snr, 26214 /* 0.8 in Q15 */ );
45 3100 : *lf_snr_smooth = VAD_L_ADD( *lf_snr_smooth, 25, tmp, add( 3, q_divout ), &q_divout1 ); /* q_divout1 */
46 3100 : move32();
47 3100 : *lf_snr_smooth = L_shr( *lf_snr_smooth, sub( q_divout1, 25 ) ); /* Q25 */
48 3100 : move32();
49 3100 : l_snr = L_shr( l_snr, sub( q_divout, 25 ) ); /* Q25 */
50 :
51 3100 : test();
52 3100 : if ( ( LT_16( bg_energy_count, 56 ) ) || ( LT_16( fg_energy_count, 56 ) ) )
53 : {
54 3100 : l_snr = 161061275 /* 4.8 Q25 */;
55 3100 : move32();
56 : }
57 :
58 3100 : l_snr = MUL_F( l_snr, 3932 /* 0.12 Q15 */ );
59 3100 : l_snr = L_sub( l_snr, 12079595 /* 0.36 Q25 */ );
60 :
61 3100 : l_snr = L_max( 0, l_snr );
62 3100 : l_snr = L_min( l_snr, MAX_LF_SNR_TAB_FX[bw_index] ); /* Q25 */
63 :
64 3100 : *lf_snr = l_snr; /* Q25 */
65 3100 : move32();
66 3100 : return;
67 : }
68 : /*-------------------------------------------------------------------*
69 : * calc_lt_snr_fx()
70 : *
71 : *
72 : *-------------------------------------------------------------------*/
73 3100 : void calc_lt_snr_fx(
74 : VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */
75 : Word32 *lt_snr_org_fp, /* o : original long time SNR Q25*/
76 : Word32 *lt_snr_fp, /* o : long time SNR calculated by fg_energy and bg_energy Q25*/
77 : Word32 fg_energy, /* i : foreground energy sum Qx*/
78 : Word16 fg_energy_count, /* i : amount of the foreground energy frame Q0*/
79 : Word32 bg_energy, /* i : background energy sum Qx*/
80 : Word16 bg_energy_count, /* i : amount of the background energy frame Q0*/
81 : Word16 bw_index, /* i : band width index Q0*/
82 : Word16 lt_noise_sp_center0 /* i : long time noise spectral center by 0 Q10*/
83 : )
84 : {
85 : Word16 tmp_lt_noise_sp_center;
86 : Word16 q_div1, q_div2, q_divout, q_divout1;
87 : Word32 lt_snr_org;
88 : Word32 lt_snr, div1, div2, tmp;
89 :
90 :
91 3100 : tmp_lt_noise_sp_center = sub( lt_noise_sp_center0, 1432 /* 1.4 Q10 */ ); /* Q10 */
92 3100 : if ( GT_16( tmp_lt_noise_sp_center, 818 /* 0.8 Q10 */ ) )
93 : {
94 0 : tmp_lt_noise_sp_center = 818 /* 0.8 Q10 */;
95 0 : move16();
96 : }
97 :
98 3100 : if ( tmp_lt_noise_sp_center < 0 )
99 : {
100 71 : tmp_lt_noise_sp_center = 0;
101 71 : move16();
102 : }
103 :
104 3100 : div1 = MUL_F( fg_energy, bg_energy_count );
105 3100 : div1 = VAD_L_ADD( div1, hVAD_CLDFB->fg_energy_scale, 1, 126, &q_div1 ); /* q_div1 */
106 3100 : div2 = MUL_F( bg_energy, fg_energy_count );
107 3100 : div2 = VAD_L_ADD( div2, hVAD_CLDFB->bg_energy_scale, 1, 126, &q_div2 ); /* q_div2 */
108 3100 : IF( div2 == 0 )
109 : {
110 0 : div2 = 1;
111 0 : move32(); /* div2==0 , may occur for >30000 frames all zero input */
112 0 : if ( div1 != 0 )
113 : {
114 0 : hVAD_CLDFB->bg_energy_scale = add( hVAD_CLDFB->fg_energy_scale, 50 );
115 0 : move16();
116 : }
117 : }
118 3100 : div2 = VAD_L_div( div1, div2, q_div1, q_div2, &q_divout ); /* q_divout */
119 3100 : lt_snr_org = VAD_Log2( div2, q_divout );
120 3100 : lt_snr_org = MUL_F( lt_snr_org, 9864 /* 0.3 in Q15 */ ); /* Q25 */
121 3100 : lt_snr = lt_snr_org; /* Q25 */
122 3100 : move32();
123 3100 : *lt_snr_org_fp = lt_snr; /* Q25 */
124 3100 : move32();
125 :
126 3100 : test();
127 3100 : if ( LT_16( bg_energy_count, 56 ) || LT_16( fg_energy_count, 56 ) )
128 : {
129 3100 : lt_snr = 70464302 /* 2.1 Q25 */;
130 3100 : move32();
131 : }
132 :
133 3100 : IF( EQ_16( bw_index, CLDFBVAD_NB_ID ) )
134 : {
135 0 : lt_snr = L_sub( L_shr( lt_snr, 1 ), 25165823 /* 0.75 Q25 */ ); /* Q25 */
136 : }
137 3100 : ELSE IF( EQ_16( bw_index, CLDFBVAD_WB_ID ) )
138 : {
139 0 : lt_snr = L_sub( L_shr( lt_snr, 1 ), 25165823 /* 0.75 Q25 */ ); /* Q25 */
140 : }
141 : ELSE
142 : {
143 3100 : lt_snr = MUL_F( lt_snr, 15073 /* 0.46 Q15 */ ); /* Q25 */
144 3100 : lt_snr = L_sub( lt_snr, 23152557 /* 0.69 Q25 */ ); /* Q25 */
145 : }
146 :
147 3100 : tmp = MUL_F( lt_snr, 13107 /* 0.4 Q15 */ ); /* Q25 */
148 :
149 3100 : tmp = L_add( L_shr( tmp, 1 ), -26214 /* 0.0007 in Q25 */ );
150 :
151 3100 : tmp = MUL_F( tmp, 13107 /* 0.4 Q15 */ ); /* Q25 */
152 3100 : tmp = MUL_F( tmp, tmp_lt_noise_sp_center );
153 3100 : lt_snr = VAD_L_ADD( lt_snr, 25, tmp, 19, &q_divout1 ); /* q_divout1 */
154 3100 : lt_snr = L_shr( lt_snr, sub( q_divout1, 25 ) ); /* Q25 */
155 :
156 3100 : lt_snr = L_max( 0, lt_snr );
157 :
158 3100 : if ( GT_32( lt_snr, 67108862 /* 2.0 Q25 */ ) )
159 : {
160 0 : lt_snr = 67108862 /* 2.0 Q25 */;
161 0 : move32();
162 : }
163 :
164 3100 : *lt_snr_fp = lt_snr; /* Q25 */
165 3100 : move32();
166 3100 : return;
167 : }
168 :
169 : /*-------------------------------------------------------------------*
170 : * calc_snr_flux_fx()
171 : *
172 : *
173 : *-------------------------------------------------------------------*/
174 3100 : void calc_snr_flux_fx(
175 : Word32 tsnr, /* i : time-domain SNR Q25*/
176 : Word32 *pre_snr, /* i/o: time-domain SNR storage Q25*/
177 : Word32 *snr_flux_fp /* o : average tsnr Q25*/
178 : )
179 : {
180 : Word32 i;
181 : Word32 tmp, snr_flux;
182 : Word16 s16MaxCoefNorm;
183 : /*save a new time-domain SNR to pre_snr[0]*/
184 :
185 :
186 3100 : test();
187 3100 : IF( ( LT_32( L_shr( tsnr, 1 ), 43620759 /* 2.6f/2.0f Q25 */ ) ) && tsnr > 0 )
188 : {
189 64 : pre_snr[0] = tsnr; /* Q25 */
190 64 : move32();
191 : }
192 3036 : ELSE IF( tsnr <= 0 )
193 : {
194 107 : pre_snr[0] = 0;
195 107 : move32();
196 : }
197 : ELSE
198 : {
199 2929 : pre_snr[0] = 87241517 /* 2.6 Q25 */;
200 2929 : move32();
201 : }
202 :
203 : /*calculate snr_flux*/
204 3100 : snr_flux = 0;
205 3100 : move32();
206 3100 : s16MaxCoefNorm = sub( ffr_getSfWord32( pre_snr, 32 ), 5 );
207 102300 : FOR( i = 0; i < 32; i++ )
208 : {
209 99200 : tmp = L_shl( pre_snr[i], s16MaxCoefNorm ); /* Q25 + s16MaxCoefNorm */
210 99200 : snr_flux = L_add( snr_flux, tmp );
211 : }
212 3100 : snr_flux = L_shr( snr_flux, add( s16MaxCoefNorm, 5 ) );
213 3100 : *snr_flux_fp = snr_flux; /* Q25 */
214 3100 : move32();
215 :
216 : /*update the tsnr storage pre_snr*/
217 99200 : FOR( i = PRE_SNR_NUM - 1; i > 0; i-- )
218 : {
219 96100 : pre_snr[i] = pre_snr[i - 1]; /* Q25 */
220 96100 : move32();
221 : }
222 3100 : return;
223 : }
224 :
225 :
226 : /*-------------------------------------------------------------------*
227 : * SNR_calc()
228 : *
229 : *
230 : *-------------------------------------------------------------------*/
231 3100 : void snr_calc(
232 : VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */
233 : const Word16 sacle_sbpower, /* i : the Scaling of sbpower */
234 : Word32 *snr, /* o : frequency domain SNR Q25*/
235 : Word32 *tsnr, /* o : time domain SNR Q25*/
236 : const Word32 frame_energy, /* i : current frame energy sacle_sbpower*/
237 : const Word32 bwidth /* i : audio band width Q0*/
238 : )
239 : {
240 : Word32 i;
241 : Word32 tmpframe_eg, tmpsb_eg, constff, div1, div2;
242 : Word32 snr_tmp, tmp;
243 :
244 : Word32 SNR_sb_num;
245 : Word32 *sb_bg_energy;
246 : Word32 *frame_sb_energy;
247 : Word32 t_bg_energy;
248 : Word16 tmp_addQ1, tmp_addQ2, minscale, minscale1, minscale2, s16MaxCoefNorm, q_divout;
249 : Word32 tmpspec_amp;
250 3100 : Word32 const CONSTfix = 1759218560;
251 3100 : move32();
252 : Word32 snr_tmpidx[12];
253 :
254 3100 : set_zero_fx( snr_tmpidx, 12 );
255 :
256 3100 : SNR_sb_num = SNR_SUB_BAND_NUM[bwidth - CLDFBVAD_NB_ID]; /* Q0 */
257 3100 : move16();
258 3100 : sb_bg_energy = hVAD_CLDFB->sb_bg_energy;
259 3100 : frame_sb_energy = hVAD_CLDFB->frame_sb_energy;
260 3100 : t_bg_energy = hVAD_CLDFB->t_bg_energy;
261 3100 : move32();
262 :
263 3100 : snr_tmp = 0;
264 3100 : move32();
265 40300 : FOR( i = 0; i < SNR_sb_num; i++ )
266 : {
267 37200 : div1 = VAD_L_ADD( frame_sb_energy[i], hVAD_CLDFB->frame_sb_energy_scale, CONSTfix, 44, &tmp_addQ1 ); /* tmp_addQ1 */
268 37200 : div2 = VAD_L_ADD( sb_bg_energy[i], hVAD_CLDFB->sb_bg_energy_scale, CONSTfix, 44, &tmp_addQ2 ); /* tmp_addQ2 */
269 37200 : tmp = VAD_L_div( div1, div2, tmp_addQ1, tmp_addQ2, &q_divout ); /* q_divout */
270 37200 : tmp = VAD_Log2( tmp, q_divout );
271 :
272 37200 : if ( GT_32( tmp, -3355443 /* -0.10 Q25 */ ) )
273 : {
274 29669 : snr_tmpidx[i] = tmp; /* Q25 */
275 29669 : move32();
276 : }
277 : }
278 :
279 3100 : s16MaxCoefNorm = sub( ffr_getSfWord32( snr_tmpidx, (Word16) SNR_sb_num ), 4 );
280 40300 : FOR( i = 0; i < SNR_sb_num; i++ )
281 : {
282 37200 : tmpspec_amp = L_shl( snr_tmpidx[i], s16MaxCoefNorm ); /* Q25 + s16MaxCoefNorm */
283 37200 : snr_tmp = L_add( snr_tmp, tmpspec_amp );
284 : }
285 3100 : snr_tmp = L_max( 0, snr_tmp );
286 3100 : snr_tmp = MUL_F( snr_tmp, BAND_MUL[bwidth - CLDFBVAD_NB_ID] ); /* Q25 + s16MaxCoefNorm */
287 3100 : *snr = L_shr( snr_tmp, s16MaxCoefNorm ); /* Q25 */
288 3100 : move32();
289 :
290 3100 : IF( EQ_32( bwidth, CLDFBVAD_SWB_ID ) )
291 : {
292 3100 : IF( t_bg_energy )
293 : {
294 3100 : minscale = norm_l( t_bg_energy );
295 3100 : minscale2 = sub( s_min( add( minscale, hVAD_CLDFB->scale_t_bg_energy ), 31 ), 1 );
296 3100 : tmpsb_eg = L_shr( t_bg_energy, sub( hVAD_CLDFB->scale_t_bg_energy, minscale2 ) ); /* minscale2 */
297 3100 : constff = L_shr( 1, sub( 31, minscale2 ) );
298 : }
299 : ELSE
300 : {
301 0 : tmpsb_eg = 0;
302 0 : move32();
303 0 : constff = 1;
304 0 : move32();
305 0 : minscale2 = 31;
306 0 : move16();
307 : }
308 3100 : div2 = L_add( tmpsb_eg, constff );
309 3100 : tmp = VAD_L_div( frame_energy, div2, sacle_sbpower, minscale2, &q_divout ); /* q_divout */
310 3100 : IF( tmp )
311 : {
312 3100 : minscale = norm_l( tmp );
313 3100 : minscale2 = sub( s_min( add( minscale, q_divout ), 31 ), 1 );
314 3100 : tmpsb_eg = L_shr( tmp, limitScale32( sub( q_divout, minscale2 ) ) ); /* minscale2 */
315 3100 : constff = L_shr( 1, sub( 31, minscale2 ) );
316 3100 : tmp = L_add( tmpsb_eg, constff );
317 : }
318 : ELSE
319 : {
320 0 : tmp = 1;
321 0 : move32();
322 0 : minscale2 = 31;
323 0 : move16();
324 : }
325 3100 : *tsnr = VAD_Log2( tmp, minscale2 );
326 3100 : move32();
327 3100 : *tsnr = L_add_sat( *tsnr, MUL_F( *tsnr, 6226 ) ); /* *tsnr *= 1.2; Q25*/
328 3100 : move32();
329 : }
330 : ELSE
331 : {
332 0 : IF( frame_energy )
333 : {
334 0 : minscale = norm_l( frame_energy );
335 0 : minscale1 = sub( s_min( add( minscale, sacle_sbpower ), 44 ), 1 );
336 0 : tmpframe_eg = L_shr( frame_energy, sub( sacle_sbpower, minscale1 ) ); /* minscale1 */
337 0 : constff = L_shr( CONSTfix, sub( 44, minscale1 ) );
338 : }
339 : ELSE
340 : {
341 0 : tmpframe_eg = 0;
342 0 : move32();
343 0 : constff = CONSTfix;
344 0 : move32();
345 0 : minscale1 = 44;
346 0 : move16();
347 : }
348 0 : div1 = L_add( tmpframe_eg, constff );
349 0 : IF( t_bg_energy )
350 : {
351 0 : minscale = norm_l( t_bg_energy );
352 0 : minscale2 = sub( s_min( add( minscale, hVAD_CLDFB->scale_t_bg_energy ), 44 ), 1 );
353 0 : tmpsb_eg = L_shr( t_bg_energy, sub( hVAD_CLDFB->scale_t_bg_energy, minscale2 ) ); /* minscale2 */
354 0 : constff = L_shr( CONSTfix, sub( 44, minscale2 ) );
355 : }
356 : ELSE
357 : {
358 0 : tmpsb_eg = 0;
359 0 : move32();
360 0 : constff = CONSTfix;
361 0 : move32();
362 0 : minscale2 = 44;
363 0 : move16();
364 : }
365 0 : div2 = L_add( tmpsb_eg, constff );
366 0 : tmp = VAD_L_div( div1, div2, minscale1, minscale2, &q_divout ); /* q_divout */
367 0 : *tsnr = VAD_Log2( tmp, q_divout ); /* Q25 */
368 0 : move32();
369 : }
370 3100 : return;
371 : }
372 :
373 3100 : Word32 construct_snr_thresh_fx(
374 : Word16 sp_center[], /* i : spectral center Q10*/
375 : Word32 snr_flux, /* i : snr flux Q25*/
376 : Word32 lt_snr, /* i : long time time domain snr Q25*/
377 : Word32 l_snr, /* i : long time frequency domain snr Q25*/
378 : Word32 continuous_speech_num, /* i : amount of continuous speech frames Q0*/
379 : Word16 continuous_noise_num, /* i : amount of continuous noise frames Q0*/
380 : Word32 fg_energy_est_start, /* i : whether if estimated energy Q0*/
381 : Word16 bw_index /* i : band width index Q0*/
382 : )
383 : {
384 :
385 : Word32 bw_snr, tmp_snr, snr_delta, test_l_snr, tmp, div1, div2;
386 :
387 :
388 3100 : snr_delta = COMVAD_INIT_SNR_DELTA_FX[bw_index]; /* Q25 */
389 3100 : move32();
390 3100 : bw_snr = lt_snr;
391 3100 : move32();
392 :
393 :
394 3100 : test_l_snr = lt_snr;
395 3100 : move32();
396 3100 : IF( EQ_16( bw_index, CLDFBVAD_SWB_ID ) )
397 : {
398 3100 : IF( GT_16( sp_center[2], 2660 /* 2.6 Q10 */ ) )
399 : {
400 489 : snr_delta = L_add( snr_delta, 1006633 /* 0.03 Q25 */ ); /* Q25 */
401 : }
402 2611 : ELSE IF( GT_16( sp_center[2], 1637 /* 1.6 Q10 */ ) )
403 : {
404 943 : snr_delta = L_add( snr_delta, 1677722 /* 0.05 Q25 */ ); /* Q25 */
405 : }
406 1668 : ELSE IF( GT_16( sp_center[3], 1432 /* 1.4 Q10 */ ) )
407 : {
408 664 : snr_delta = L_add( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
409 : }
410 : ELSE
411 : {
412 1004 : snr_delta = L_add( snr_delta, 13421773 /* 0.40 Q25 */ ); /* Q25 */
413 : }
414 :
415 3100 : tmp = MUL_F( l_snr, 3277 /* 0.1 Q15 */ ); /* Q25 */
416 3100 : tmp = L_add( tmp, 20132659 /* 0.6 Q25 */ );
417 :
418 3100 : test();
419 3100 : test();
420 3100 : IF( GT_32( continuous_speech_num, 8 ) && EQ_32( fg_energy_est_start, 1 ) )
421 : {
422 3017 : snr_delta = L_sub( snr_delta, 6710886 /* 0.2 Q25 */ ); /* Q25 */
423 : }
424 83 : ELSE IF( GT_16( continuous_noise_num, 12 ) && ( GT_32( snr_flux, tmp ) ) )
425 : {
426 0 : snr_delta = L_add( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
427 : }
428 83 : ELSE IF( GT_16( continuous_noise_num, 24 ) )
429 : {
430 0 : snr_delta = L_add( snr_delta, 6710886 /* 0.2 Q25 */ ); /* Q25 */
431 : }
432 83 : ELSE IF( ( GT_16( continuous_noise_num, 4 ) ) )
433 : {
434 24 : snr_delta = L_add( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
435 : }
436 : }
437 0 : ELSE IF( EQ_16( bw_index, CLDFBVAD_WB_ID ) )
438 : {
439 0 : IF( GT_16( sp_center[2], 2660 /* 2.6 Q10 */ ) )
440 : {
441 0 : snr_delta = L_add( snr_delta, 1006633 /* 0.03 Q25 */ ); /* Q25 */
442 : }
443 0 : ELSE IF( GT_16( sp_center[2], 1637 /* 1.6 Q10 */ ) )
444 : {
445 0 : snr_delta = L_add( snr_delta, 1677722 /* 0.05 Q25 */ ); /* Q25 */
446 : }
447 0 : ELSE IF( GT_16( sp_center[3], 1432 /* 1.4 Q10 */ ) )
448 : {
449 0 : snr_delta = L_add( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
450 : }
451 : ELSE
452 : {
453 0 : snr_delta = L_add( snr_delta, 10066330 /* 0.30 Q25 */ ); /* Q25 */
454 : }
455 :
456 0 : tmp = MUL_F( bw_snr, 3277 /* 0.1 Q15 */ ); /* Q25 */
457 0 : tmp = L_add( tmp, 20132659 /* 0.6 Q25 */ ); /* Q25 */
458 :
459 0 : test();
460 0 : test();
461 0 : IF( GT_32( continuous_speech_num, 8 ) && EQ_32( fg_energy_est_start, 1 ) )
462 : {
463 0 : snr_delta = L_sub( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
464 : }
465 0 : ELSE IF( GT_16( continuous_noise_num, 12 ) && ( GT_32( snr_flux, tmp ) ) )
466 : {
467 0 : snr_delta = L_add( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
468 : }
469 0 : ELSE IF( GT_16( continuous_noise_num, 24 ) )
470 : {
471 0 : snr_delta = L_add( snr_delta, 6710886 /* 0.20 Q25 */ ); /* Q25 */
472 : }
473 0 : ELSE IF( ( GT_16( continuous_noise_num, 4 ) ) )
474 : {
475 0 : snr_delta = L_add( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
476 : }
477 : }
478 0 : ELSE IF( EQ_16( bw_index, CLDFBVAD_NB_ID ) )
479 : {
480 0 : IF( GT_16( sp_center[2], 2660 /* 2.6 Q10 */ ) )
481 : {
482 0 : snr_delta = L_add( snr_delta, 671089 /* 0.02 Q25 */ ); /* Q25 */
483 : }
484 0 : ELSE IF( GT_16( sp_center[2], 1637 /* 1.6 Q10 */ ) )
485 : {
486 0 : snr_delta = L_add( snr_delta, 1342177 /* 0.04 Q25 */ ); /* Q25 */
487 : }
488 0 : ELSE IF( GT_16( sp_center[2], 1494 /* 1.46 Q10 */ ) )
489 : {
490 0 : snr_delta = L_add( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
491 : }
492 : ELSE
493 : {
494 0 : snr_delta = L_add( snr_delta, 6039798 /* 0.18 Q25 */ ); /* Q25 */
495 : }
496 :
497 0 : tmp = MUL_F( l_snr, 3277 /* 0.1 Q15 */ ); /* Q25 */
498 0 : div1 = L_add( tmp, 6710886 /* 0.2 Q25 */ ); /* Q25 */
499 0 : div2 = L_add( tmp, 20132659 /* 0.6 Q25 */ ); /* Q25 */
500 :
501 0 : test();
502 0 : test();
503 0 : test();
504 0 : test();
505 0 : test();
506 0 : IF( GT_32( continuous_speech_num, 80 ) && EQ_32( fg_energy_est_start, 1 ) && ( GT_16( sp_center[0], 1432 /* 1.4 Q10 */ ) ) )
507 : {
508 0 : snr_delta = L_sub( snr_delta, 10737418 /* 0.32 Q25 */ ); /* Q25 */
509 : }
510 0 : ELSE IF( GT_32( continuous_speech_num, 8 ) && EQ_32( fg_energy_est_start, 1 ) && ( GT_32( snr_flux, div1 ) ) )
511 : {
512 0 : snr_delta = L_sub( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
513 : }
514 0 : ELSE IF( GT_16( continuous_noise_num, 12 ) && ( GT_32( snr_flux, div2 ) ) )
515 : {
516 0 : snr_delta = L_add( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
517 : }
518 0 : ELSE IF( GT_16( continuous_noise_num, 24 ) )
519 : {
520 0 : snr_delta = L_add( snr_delta, 6710886 /* 0.2 Q25 */ ); /* Q25 */
521 : }
522 : }
523 : ELSE
524 : {
525 0 : snr_delta = 33554431 /* 1.0 Q25 */;
526 0 : move32();
527 : }
528 3100 : tmp_snr = L_add( snr_delta, test_l_snr ); /* Q25 */
529 :
530 :
531 3100 : return tmp_snr;
532 : }
|