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 "cnst.h"
9 : #include "basop_util.h"
10 : #include "vad_basop.h"
11 : //#include "prot_fx.h"
12 : #include "stat_enc.h"
13 : #include "rom_enc.h"
14 : #include "rom_com.h" /* Common constants */
15 : #include "prot_fx.h" /* Function prototypes */
16 : #include "prot_fx_enc.h" /* Function prototypes */
17 : #include "basop_util.h" /* Function prototypes */
18 : /*-------------------------------------------------------------------*
19 : * vad_init_fx()
20 : *
21 : *
22 : *-------------------------------------------------------------------*/
23 3 : Word16 vad_init_fx(
24 : VAD_CLDFB_HANDLE hVAD_CLDFB /* i/o: CLDFB VAD state */
25 : )
26 : {
27 3 : Word16 i = 0;
28 3 : move16();
29 3 : if ( hVAD_CLDFB == NULL )
30 : {
31 0 : return -1;
32 : }
33 :
34 3 : hVAD_CLDFB->frameloop = 0;
35 3 : move16();
36 3 : hVAD_CLDFB->lt_snr_org = 33554432;
37 3 : move32();
38 3 : hVAD_CLDFB->lf_snr_smooth = 167772155 /* 5.0 Q25 */;
39 3 : move32();
40 3 : hVAD_CLDFB->l_silence_snr = 32768 /* 0.5 Q16 */;
41 3 : move32();
42 3 : hVAD_CLDFB->l_speech_snr = 327675 /* 5.0 Q16 */;
43 3 : move32();
44 3 : hVAD_CLDFB->l_silence_snr_count = L_deposit_l( 1 );
45 3 : move32();
46 3 : hVAD_CLDFB->l_speech_snr_count = L_deposit_l( 1 );
47 3 : move32();
48 3 : hVAD_CLDFB->fg_energy = 1073741824;
49 3 : move32();
50 3 : hVAD_CLDFB->fg_energy_scale = 41;
51 3 : move16();
52 3 : hVAD_CLDFB->bg_energy = 1073741824;
53 3 : move32();
54 3 : hVAD_CLDFB->bg_energy_scale = 57;
55 3 : move16();
56 3 : hVAD_CLDFB->fg_energy_count = 16;
57 3 : move16();
58 3 : hVAD_CLDFB->bg_energy_count = 16;
59 3 : move16();
60 3 : hVAD_CLDFB->tonality_rate3 = 15073 /* 0.46 Q15 */;
61 3 : move16();
62 3 : hVAD_CLDFB->music_background_rate = 15073 /* 0.46 Q15 */;
63 3 : move16();
64 3 : hVAD_CLDFB->lt_noise_sp_center_diff_sum = 409 /* 0.4 Q10 */;
65 3 : move32();
66 3 : hVAD_CLDFB->lt_noise_sp_center_diff_counter = L_deposit_l( 4 );
67 3 : move32();
68 3 : hVAD_CLDFB->lt_noise_sp_center0 = 1841 /* 0.4 Q10 */;
69 3 : move16();
70 3 : hVAD_CLDFB->lt_noise_sp_center3 = 2046 /* 0.4 Q10 */;
71 3 : move16();
72 3 : hVAD_CLDFB->lt_bg_highf_eng = 131070 /* 2.0 Q16 */;
73 3 : move32();
74 3 : hVAD_CLDFB->t_bg_energy = 1374389535;
75 3 : move32();
76 3 : hVAD_CLDFB->scale_t_bg_energy = 37;
77 3 : move16();
78 3 : hVAD_CLDFB->t_bg_energy_sum.s16Exp = 37;
79 3 : move16();
80 3 : hVAD_CLDFB->t_bg_energy_sum.s32Mantissa = 1374389535;
81 3 : move32();
82 3 : hVAD_CLDFB->tbg_energy_count = 1;
83 3 : move16();
84 3 : hVAD_CLDFB->bg_update_count = 0;
85 3 : move16();
86 3 : hVAD_CLDFB->frame_energy_smooth = 1073741824;
87 3 : move32();
88 3 : hVAD_CLDFB->frame_energy_smooth_scale = 30;
89 3 : move16();
90 3 : hVAD_CLDFB->fg_energy_est_start = L_deposit_l( 0 );
91 3 : move32();
92 3 : hVAD_CLDFB->speech_flag = 0;
93 3 : move16();
94 3 : hVAD_CLDFB->continuous_noise_num = 0;
95 3 : move16();
96 3 : hVAD_CLDFB->continuous_speech_num = 0;
97 3 : move16();
98 3 : hVAD_CLDFB->continuous_speech_num2 = 0;
99 3 : move16();
100 3 : hVAD_CLDFB->update_num_with_snr = 0; /* the number of the background update with SNR*/
101 3 : move16();
102 3 : hVAD_CLDFB->update_count = 0;
103 3 : move16();
104 3 : hVAD_CLDFB->warm_hang_num = 0;
105 3 : move16();
106 :
107 3 : hVAD_CLDFB->frame_sb_energy_scale = 0;
108 3 : move16();
109 :
110 99 : FOR( i = 0; i < PRE_SNR_NUM; i++ )
111 : {
112 96 : hVAD_CLDFB->pre_snr[i] = L_deposit_l( 0 );
113 96 : move32();
114 : }
115 :
116 171 : FOR( i = 0; i < 56; i++ )
117 : {
118 168 : hVAD_CLDFB->frames_power_32[i] = L_deposit_l( 0 );
119 168 : move32();
120 : }
121 :
122 3 : hVAD_CLDFB->Q_frames_power_32 = 31;
123 3 : move16();
124 :
125 183 : FOR( i = 0; i < SPEC_AMP_NUM; i++ )
126 : {
127 180 : hVAD_CLDFB->smooth_spec_amp[i] = L_deposit_l( 0 );
128 180 : move32();
129 : }
130 :
131 3 : hVAD_CLDFB->sfm[0] = 28835 /* 0.88 Q15 */;
132 3 : move16();
133 3 : hVAD_CLDFB->sfm[1] = 30146 /* 0.92 Q15 */;
134 3 : move16();
135 3 : hVAD_CLDFB->sfm[2] = 30146 /* 0.92 Q15 */;
136 3 : move16();
137 :
138 15 : FOR( i = 0; i < SP_CENTER_NUM; i++ )
139 : {
140 12 : hVAD_CLDFB->sp_center[i] = 1228 /* 1.2 Q10 */;
141 12 : move16();
142 : }
143 :
144 15 : FOR( i = 0; i < STABLE_NUM; i++ )
145 : {
146 12 : hVAD_CLDFB->ltd_stable_rate[i] = 2294 /* 0.07 Q15 */;
147 12 : move16();
148 : }
149 :
150 39 : FOR( i = 0; i < BG_ENG_NUM; i++ )
151 : {
152 36 : hVAD_CLDFB->sb_bg_energy[i] = 1374389535;
153 36 : move32();
154 36 : hVAD_CLDFB->frame_sb_energy[i] = L_deposit_l( 0 );
155 36 : move32();
156 : }
157 :
158 3 : hVAD_CLDFB->sb_bg_energy_scale = 37;
159 3 : move16();
160 :
161 3 : hVAD_CLDFB->f_tonality_rate[0] = 7864 /* 0.48 Q14 */;
162 3 : move16();
163 3 : hVAD_CLDFB->f_tonality_rate[1] = 7864 /* 0.48 Q14 */;
164 3 : move16();
165 3 : hVAD_CLDFB->f_tonality_rate[2] = 7864 /* 0.48 Q14 */;
166 3 : move16();
167 :
168 171 : FOR( i = 0; i < PRE_SPEC_DIF_NUM; i++ )
169 : {
170 168 : hVAD_CLDFB->pre_spec_low_dif[i] = 4095;
171 168 : move16();
172 : }
173 3 : hVAD_CLDFB->scale_spec_low_dif = 12;
174 3 : move16();
175 :
176 :
177 3 : return 0;
178 : }
179 :
180 3100 : static void UpdateState_fx(
181 : VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */
182 : Word16 vad_flag, /* i : VAD flag */
183 : Word32 frame_energy, /* i : current frame energy */
184 : Word16 sacle_sbpower, /* i : the Scaling of current frame energy */
185 : Word32 update_flag, /* i : current frame update flag */
186 : Word16 music_backgound_f, /* i : background music flag */
187 : Word32 HB_Power, /* i : current frame high frequency energy */
188 : Word16 HB_Power_Q, /* i : the Scaling of current frame high frequency energy*/
189 : Word32 snr )
190 : {
191 : Word16 lt_bg_energy_scal;
192 : Word32 tmp, tmp2;
193 :
194 :
195 3100 : tmp = MUL_F( hVAD_CLDFB->frame_energy_smooth, 31129 /* 0.95 Q15 */ );
196 3100 : tmp2 = MUL_F( frame_energy, 26214 );
197 3100 : hVAD_CLDFB->frame_energy_smooth = VAD_L_ADD( tmp, hVAD_CLDFB->frame_energy_smooth_scale, tmp2, add( 4, sacle_sbpower ), <_bg_energy_scal );
198 3100 : move32();
199 3100 : hVAD_CLDFB->frame_energy_smooth_scale = lt_bg_energy_scal;
200 3100 : move16();
201 :
202 :
203 3100 : IF( vad_flag == 0 )
204 : {
205 90 : hVAD_CLDFB->lt_bg_highf_eng = L_add( MUL_F( hVAD_CLDFB->lt_bg_highf_eng, 31130 ), L_shr( MUL_F( HB_Power, 1638 ), sub( HB_Power_Q, lt_bg_highf_eng_Q ) ) );
206 : }
207 :
208 3100 : IF( LT_16( hVAD_CLDFB->frameloop, 1000 ) )
209 : {
210 3000 : hVAD_CLDFB->frameloop = add( hVAD_CLDFB->frameloop, 1 );
211 3000 : move16();
212 : }
213 :
214 3100 : background_update_fx( hVAD_CLDFB, sacle_sbpower, frame_energy, update_flag, music_backgound_f, snr );
215 :
216 3100 : IF( vad_flag == 0 )
217 : {
218 90 : hVAD_CLDFB->continuous_speech_num2 = 0;
219 90 : move16();
220 90 : IF( GT_16( hVAD_CLDFB->continuous_noise_num, 10 ) )
221 : {
222 6 : hVAD_CLDFB->continuous_speech_num = 0;
223 6 : move16();
224 : }
225 84 : ELSE IF( GT_32( hVAD_CLDFB->continuous_speech_num, 9 ) )
226 : {
227 8 : hVAD_CLDFB->continuous_speech_num = 9;
228 8 : move16();
229 : }
230 90 : hVAD_CLDFB->continuous_noise_num = add( hVAD_CLDFB->continuous_noise_num, 1 );
231 90 : move16();
232 :
233 90 : if ( GT_16( hVAD_CLDFB->continuous_noise_num, 2048 ) )
234 : {
235 0 : hVAD_CLDFB->continuous_noise_num = 2048;
236 0 : move16();
237 : }
238 : }
239 : ELSE
240 : {
241 3010 : hVAD_CLDFB->continuous_noise_num = 0;
242 3010 : move16();
243 :
244 3010 : hVAD_CLDFB->continuous_speech_num2 = add( hVAD_CLDFB->continuous_speech_num2, 1 );
245 3010 : move16();
246 3010 : hVAD_CLDFB->continuous_speech_num = add( hVAD_CLDFB->continuous_speech_num, 1 );
247 3010 : move16();
248 3010 : if ( GT_16( hVAD_CLDFB->continuous_speech_num, 2048 ) )
249 : {
250 0 : hVAD_CLDFB->continuous_speech_num = 2048;
251 0 : move16();
252 : }
253 :
254 3010 : if ( GT_16( hVAD_CLDFB->continuous_speech_num2, 2048 ) )
255 : {
256 0 : hVAD_CLDFB->continuous_speech_num2 = 2048;
257 0 : move16();
258 : }
259 : }
260 3100 : }
261 :
262 :
263 3100 : Word16 vad_proc_fx(
264 : VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */
265 : Word32 realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : real values */
266 : Word32 imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : imag values */
267 : Word16 riBuffer_exp, /* i : exponent of real & imag Buffer */
268 : Word16 *cldfb_addition, /* o : adjust the harmonized hangover */
269 : Word32 enerBuffer[CLDFB_NO_CHANNELS_MAX], /* i : energy vector per band */
270 : Word16 enerBuffer_exp, /* i : exponent of energy vector */
271 : Word16 numBands, /* i : band width 1: NB; 2:WB;3:SWB;4:FB*/
272 : Word16 vada_flag /* i : VAD flag */
273 : )
274 : {
275 : Word16 i;
276 : Word16 bw_index;
277 : Word16 music_backgound_f;
278 : Word16 Q_cldfb;
279 : Word16 frame_energy2_Q, HB_Power_Q;
280 : Word16 sb_power_Q, frame_energy_Q;
281 : Word32 frame_energy, frame_energy2, HB_Power;
282 : Word32 spec_amp[120];
283 : Word32 update_flag, snr_flux, lt_snr_org, lt_snr, lf_snr;
284 : Word32 snr, tsnr;
285 : Word16 vad_flag;
286 : Word32 *cldfbBufferReal[CLDFB_NO_COL_MAX]; /* dynamic scaling; cldfbBufferReal_float[x][y] = cldfbBufferReal[x][y] * 2^(-Q_cldfb) */
287 : Word32 *cldfbBufferImag[CLDFB_NO_COL_MAX]; /* dynamic scaling; cldfbBufferImag_float[x][y] = cldfbBufferReal[x][y] * 2^(-Q_cldfb) */
288 :
289 :
290 3100 : music_backgound_f = 0;
291 3100 : move16();
292 3100 : frame_energy = 0;
293 3100 : move32();
294 :
295 :
296 3100 : IF( LT_16( numBands, 20 ) )
297 : {
298 0 : bw_index = 1;
299 0 : move16();
300 : }
301 3100 : ELSE IF( LT_16( numBands, 40 ) )
302 : {
303 0 : bw_index = 2;
304 0 : move16();
305 : }
306 : ELSE
307 : {
308 3100 : bw_index = 3;
309 3100 : move16();
310 : }
311 :
312 3100 : hVAD_CLDFB->bw_index = bw_index;
313 3100 : move16();
314 52700 : FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ )
315 : {
316 49600 : cldfbBufferReal[i] = realBuffer[i];
317 49600 : move16();
318 49600 : cldfbBufferImag[i] = imagBuffer[i];
319 49600 : move16();
320 : }
321 :
322 :
323 3100 : Q_cldfb = sub( 31, riBuffer_exp );
324 :
325 3100 : Q_cldfb = sub( Q_cldfb, 16 );
326 :
327 :
328 3100 : est_energy_fx( enerBuffer, enerBuffer_exp, hVAD_CLDFB->frame_sb_energy, &frame_energy2, &HB_Power, &frame_energy, &sb_power_Q, &frame_energy2_Q, &HB_Power_Q, &frame_energy_Q,
329 : &hVAD_CLDFB->frame_sb_energy_scale, bw_index );
330 :
331 3100 : subband_FFT_fx( cldfbBufferReal, cldfbBufferImag, spec_amp, 0, &Q_cldfb );
332 :
333 3100 : frame_spec_dif_cor_rate_fx( hVAD_CLDFB, spec_amp, add( Q_cldfb, 8 ), hVAD_CLDFB->f_tonality_rate );
334 :
335 3100 : spec_center_fx( enerBuffer, hVAD_CLDFB->sp_center, bw_index, sb_power_Q );
336 :
337 3100 : ltd_stable_fx( hVAD_CLDFB, hVAD_CLDFB->ltd_stable_rate, frame_energy, hVAD_CLDFB->frameloop, frame_energy_Q );
338 :
339 3100 : spec_flatness_fx( spec_amp, hVAD_CLDFB->smooth_spec_amp, hVAD_CLDFB->sfm );
340 :
341 3100 : bg_music_decision_fx( hVAD_CLDFB, &music_backgound_f, frame_energy, frame_energy_Q );
342 :
343 3100 : snr_calc( hVAD_CLDFB, frame_energy2_Q, &snr, &tsnr, frame_energy2, bw_index );
344 :
345 3100 : calc_snr_flux_fx( tsnr, hVAD_CLDFB->pre_snr, &snr_flux );
346 :
347 3100 : calc_lt_snr_fx( hVAD_CLDFB, <_snr_org, <_snr, hVAD_CLDFB->fg_energy, hVAD_CLDFB->fg_energy_count, hVAD_CLDFB->bg_energy,
348 3100 : hVAD_CLDFB->bg_energy_count, bw_index, hVAD_CLDFB->lt_noise_sp_center0 );
349 :
350 3100 : calc_lf_snr_fx( &hVAD_CLDFB->lf_snr_smooth, &lf_snr, hVAD_CLDFB->l_speech_snr, hVAD_CLDFB->l_speech_snr_count, hVAD_CLDFB->l_silence_snr,
351 3100 : hVAD_CLDFB->l_silence_snr_count, hVAD_CLDFB->fg_energy_count, hVAD_CLDFB->bg_energy_count, bw_index );
352 :
353 :
354 3100 : vad_flag = comvad_decision_fx( hVAD_CLDFB, lf_snr, lt_snr_org, lt_snr, snr_flux, snr, tsnr, frame_energy2, music_backgound_f, frame_energy2_Q,
355 : cldfb_addition, vada_flag );
356 :
357 :
358 6200 : update_flag = update_decision_fx( hVAD_CLDFB, frame_energy, HB_Power, hVAD_CLDFB->frameloop, bw_index, frame_energy_Q,
359 3100 : HB_Power_Q, snr, tsnr, hVAD_CLDFB->vad_flag_for_bk_update, music_backgound_f );
360 :
361 :
362 3100 : UpdateState_fx( hVAD_CLDFB, hVAD_CLDFB->vad_flag_for_bk_update, frame_energy2, frame_energy2_Q, update_flag, music_backgound_f, HB_Power, HB_Power_Q, snr );
363 :
364 :
365 3100 : return vad_flag;
366 : }
|