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