Line data Source code
1 : /*====================================================================================
2 : EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
3 : ====================================================================================*/
4 : #include <stdint.h>
5 : #include "options.h" /* Compilation switches */
6 : #include "cnst.h" /* Common constants */
7 : //#include "prot_fx.h" /* Function prototypes */
8 : #include "prot_fx.h" /* Function prototypes */
9 : #include "prot_fx_enc.h" /* Function prototypes */
10 : #include "basop_util.h"
11 :
12 : /*-------------------------------------------------------------------*
13 : * find_tilt()
14 : *
15 : * Find LF/HF energy ratio
16 : *-------------------------------------------------------------------*/
17 :
18 3100 : void find_tilt_fx(
19 : const Word32 fr_bands[], /* i : energy in frequency bands Q_new + Q_SCALE*/
20 : const Word32 bckr[], /* i : per band background noise energy estimate Q_new + Q_SCALE*/
21 : Word32 ee[2], /* o : lf/hf E ration for present frame Q6*/
22 : const Word16 pitch[3], /* i : open loop pitch values for 3 half-frames Q0*/
23 : const Word16 voicing[3], /* i : normalized correlation for 3 half-frames Q15*/
24 : const Word32 *lf_E, /* i : per bin energy for low frequencies Q_new + Q_SCALE - 2*/
25 : const Word16 corr_shift, /* i : normalized correlation correction Q15*/
26 : const Word16 bwidth, /* i : input signal bandwidth Q0*/
27 : const Word16 max_band, /* i : maximum critical band Q0*/
28 : Word32 hp_E[], /* o : energy in HF Q_new + Q_SCALE*/
29 : const Word16 codec_mode, /* i : MODE1 or MODE2 Q0*/
30 : const Word16 Q_new, /* i : scaling factor */
31 : Word32 *bckr_tilt_lt /* i/o: lf/hf E ratio of background noise Q16*/
32 : ,
33 : Word16 Opt_vbr_mode /* Q0 */
34 : )
35 : {
36 3100 : Word32 lp_bckr = 0, hp_bckr = 0, lp_E, Ltmp;
37 : const Word32 *pt_E, *pt_bands, *pt_bckr, *hf_bands, *tmp_E;
38 : Word16 tmp, freq, f0, f1, f2, mean_voi, bin;
39 : Word16 i, nb_bands;
40 : Word16 e_tmp, m_tmp;
41 : Word16 m_Fs, e_Fs;
42 : Word16 m_cnt, e_cnt;
43 : Word16 m_hpE, e_hpE;
44 : Word16 scaling;
45 3100 : move32();
46 3100 : move32();
47 : #ifndef ISSUE_1867_replace_overflow_libenc
48 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
49 : Flag Overflow = 0;
50 : move32();
51 : #endif
52 : #endif
53 : /*-----------------------------------------------------------------*
54 : * Initializations
55 : *-----------------------------------------------------------------*/
56 :
57 3100 : scaling = add( Q_new, QSCALE );
58 3100 : IF( NE_16( bwidth, NB ) )
59 : {
60 : /* WB processing */
61 3100 : bin = BIN4_FX;
62 3100 : move16(); /* First useful frequency bin ~ 50 Hz */
63 3100 : pt_bands = fr_bands; /* Q_new + QSCALE */
64 3100 : tmp_E = lf_E; /* Q_new + QSCALE - 2 */
65 3100 : pt_bckr = bckr; /* Q_new + QSCALE */
66 3100 : nb_bands = 10;
67 3100 : move16();
68 : }
69 : ELSE
70 : {
71 : /* NB processing */
72 0 : bin = add( shl( BIN4_FX, 1 ), BIN4_FX ); /* First useful frequency bin ~ 150 Hz */
73 0 : pt_bands = fr_bands + 1; /* Exlcude 1st critical band Q_new + QSCALE*/
74 0 : tmp_E = lf_E + 2; /* Start at the 3rd bin (150 Hz) Q_new + QSCALE - 2*/
75 0 : pt_bckr = bckr + 1; /* Exlcude 1st critical band Q_new + QSCALE*/
76 0 : nb_bands = 9;
77 0 : move16(); /* Nb. of "low" frequency bands taken into account in NB processing */
78 : }
79 :
80 : /*-----------------------------------------------------------------*
81 : * Find spectrum tilt
82 : *-----------------------------------------------------------------*/
83 :
84 3100 : pt_E = tmp_E; /* Point at the 1st useful element of the per-bin energy vector */
85 3100 : hf_bands = fr_bands; /* Q_new + QSCALE */
86 :
87 : /* bckr + voicing */
88 : /*lp_bckr = mean( pt_bckr, nb_bands );*/ /* estimated noise E in first critical bands, up to 1270 Hz */
89 3100 : lp_bckr = Mean32( pt_bckr, nb_bands );
90 : /*hp_bckr = 0.5f * (bckr[max_band-1] + bckr[max_band]);*/ /* estimated noise E in last 2 critical bands */
91 3100 : hp_bckr = L_shr( L_add_sat( bckr[max_band - 1], bckr[max_band] ), 1 ); /* Q_new + QSCALE - 1 */
92 3100 : if ( hp_bckr == 0 ) /* Avoid division by zero. */
93 : {
94 0 : hp_bckr = L_deposit_l( 1 );
95 : }
96 3100 : tmp = BASOP_Util_Divide3232_Scale( lp_bckr, hp_bckr, &e_tmp );
97 :
98 3100 : Ltmp = L_shr_r_sat( L_deposit_h( tmp ), sub( 15, e_tmp ) );
99 :
100 3100 : *bckr_tilt_lt = L_add( Mpy_32_16_r( *bckr_tilt_lt, 29491 ), Mpy_32_16_r( Ltmp, 3277 ) ); /* Q16 */
101 :
102 3100 : test();
103 3100 : IF( EQ_16( codec_mode, MODE2 ) || Opt_vbr_mode == 1 )
104 : {
105 : /*lp_bckr *= FACT;*/
106 : /*hp_bckr *= FACT;*/
107 1050 : lp_bckr = L_add_sat( L_shl_sat( lp_bckr, 1 ), lp_bckr ); /* Q_new + QSCALE */
108 1050 : hp_bckr = L_add_sat( L_shl_sat( hp_bckr, 1 ), hp_bckr );
109 : }
110 : /*mean_voi = 0.5f * (voicing[1] + voicing[2]) + corr_shift;*/
111 3100 : Ltmp = L_mult( voicing[1], 16384 /* 0.5 in Q15 */ ); /* Q31 */
112 3100 : Ltmp = L_mac( Ltmp, voicing[2], 16384 /* 0.5 in Q15 */ ); /* Q31 */
113 : #ifdef ISSUE_1867_replace_overflow_libenc
114 3100 : Ltmp = L_mac_sat( Ltmp, corr_shift, 32767 ); /* Q31 */
115 3100 : mean_voi = round_fx_sat( Ltmp ); /* Q15 */
116 : #else
117 : Ltmp = L_mac_o( Ltmp, corr_shift, 32767, &Overflow ); /* Q31 */
118 : mean_voi = round_fx_o( Ltmp, &Overflow ); /* Q15 */
119 : #endif
120 :
121 : /*f0 = INT_FS_FX / pitch[2];*/
122 3100 : e_tmp = norm_s( pitch[2] );
123 3100 : m_tmp = shl( pitch[2], e_tmp );
124 :
125 3100 : m_Fs = div_s( INT_FS_FX, m_tmp ); /* exp(e_tmp) */
126 3100 : e_Fs = sub( 15, e_tmp );
127 3100 : f0 = shr( m_Fs, sub( e_Fs, 4 ) ); /* Q4 */
128 :
129 9300 : FOR( i = 0; i < 2; i++ )
130 : {
131 : /*hp_E[i] = 0.5f * (hf_bands[max_band-1] + hf_bands[max_band]) - hp_bckr; */ /* averaged E in last 2 critical bands */
132 6200 : Ltmp = L_add( L_shr( hf_bands[max_band - 1], 1 ), L_shr( hf_bands[max_band], 1 ) ); /* Q_new + QSCALE */
133 6200 : hp_E[i] = L_sub( Ltmp, hp_bckr ); /* Q_new + QSCALE */
134 6200 : IF( Opt_vbr_mode == 0 )
135 : {
136 6200 : hp_E[i] = L_max( hp_E[i], L_shl( E_MIN_FX, Q_new ) ); /* Q_new + QSCALE */
137 6200 : move32();
138 : }
139 : ELSE
140 : {
141 0 : hp_E[i] = L_max( hp_E[i], L_shl( 1, scaling ) ); /* Q_new + QSCALE */
142 0 : move32();
143 : }
144 :
145 6200 : test();
146 6200 : IF( GT_16( mean_voi, TH_COR_FX ) && LT_16( pitch[2], TH_PIT_FX ) ) /* High-pitched voiced frames */
147 : {
148 4448 : freq = bin;
149 4448 : move16(); /* 1st useful frequency bin */
150 4448 : m_cnt = 0;
151 4448 : move16();
152 4448 : lp_E = L_deposit_l( 0 );
153 :
154 4448 : f1 = add( shr( f0, 1 ), f0 ); /* Middle between 2 harmonics */
155 4448 : f2 = f0;
156 4448 : move16();
157 30284 : WHILE( LE_16( freq, 20320 ) ) /* End frequency of 10th critical band */
158 : {
159 146622 : FOR( ; freq <= f1; freq += BIN4_FX )
160 : {
161 : /* include only bins sufficiently close to harmonics */
162 120786 : tmp = sub( freq, f2 );
163 120786 : IF( L_mac0( -(Word32) TH_D_FX * TH_D_FX, tmp, tmp ) < 0 )
164 : {
165 : #ifdef ISSUE_1867_replace_overflow_libenc
166 50084 : lp_E = L_add_sat( *pt_E, lp_E ); /* Q_new + QSCALE - 2 */
167 : #else
168 : lp_E = L_add_o( *pt_E, lp_E, &Overflow ); /* Q_new + QSCALE - 2 */
169 : #endif
170 50084 : m_cnt = add( m_cnt, 1 ); /* Q0 */
171 : }
172 120786 : pt_E++;
173 : }
174 : #ifdef ISSUE_1867_replace_overflow_libenc
175 25836 : f1 = add_sat( f1, f0 );
176 25836 : f2 = add_sat( f2, f0 );
177 : #else
178 : f1 = add_o( f1, f0, &Overflow );
179 : f2 = add_o( f2, f0, &Overflow );
180 : #endif
181 : }
182 : /*lp_E = lp_E / (float)cnt - lp_bckr;*/
183 4448 : e_tmp = sub( norm_l( lp_E ), 1 );
184 4448 : m_tmp = extract_h( L_shl( lp_E, e_tmp ) );
185 :
186 4448 : e_tmp = sub( e_tmp, 2 ); /* lf_e divided by 4 in anal_sp */
187 :
188 4448 : e_cnt = norm_s( m_cnt );
189 4448 : m_cnt = shl( m_cnt, e_cnt );
190 :
191 4448 : m_tmp = div_s( m_tmp, m_cnt ); /* exp(e_tmp + e_cnt) */
192 4448 : e_tmp = sub( e_tmp, e_cnt );
193 :
194 : #ifdef ISSUE_1867_replace_overflow_libenc
195 4448 : lp_E = L_sub_sat( L_shr_sat( m_tmp, sub( e_tmp, 1 ) ), lp_bckr ); /* Q_new + QSCALE */
196 : #else
197 : lp_E = L_sub_o( L_shr_sat( m_tmp, sub( e_tmp, 1 ) ), lp_bckr, &Overflow ); /* Q_new + QSCALE */
198 : #endif
199 :
200 4448 : pt_E = tmp_E + VOIC_BINS; /* Update for next half-frame */
201 : }
202 : ELSE /* Other than high-pitched voiced frames */
203 : {
204 : /*lp_E = mean( pt_bands, nb_bands ) - lp_bckr;*/ /* averaged E in first critical bands, up to 1270 Hz */
205 1752 : lp_E = L_sub( Mean32( pt_bands, nb_bands ), lp_bckr ); /* Q_new + QSCALE */
206 : }
207 6200 : IF( Opt_vbr_mode == 0 )
208 : {
209 6200 : lp_E = L_max( lp_E, L_shl( E_MIN_FX, Q_new ) );
210 : }
211 : ELSE
212 : {
213 0 : lp_E = L_max( lp_E, 0 );
214 : }
215 : /*ee[i] = lp_E / hp_E[i];*/ /* LF/HF ratio */
216 6200 : test();
217 6200 : IF( lp_E != 0 && hp_E[i] != 0 )
218 : {
219 6200 : e_tmp = sub( norm_l( lp_E ), 1 );
220 6200 : m_tmp = extract_h( L_shl( lp_E, e_tmp ) );
221 6200 : e_hpE = norm_l( hp_E[i] );
222 6200 : m_hpE = extract_h( L_shl( hp_E[i], e_hpE ) );
223 6200 : m_tmp = div_s( m_tmp, m_hpE ); /* exp(e_tmp + e_hpE) */
224 6200 : e_tmp = sub( e_tmp, e_hpE );
225 :
226 6200 : ee[i] = L_shr_sat( m_tmp, add( e_tmp, 15 - 6 ) ); /* ee in Q6 */
227 : }
228 0 : ELSE IF( lp_E == 0 )
229 : {
230 0 : ee[i] = L_deposit_l( 0 );
231 : }
232 : ELSE
233 : {
234 0 : ee[i] = MAX_32;
235 : }
236 :
237 6200 : IF( EQ_16( bwidth, NB ) ) /* For NB input, compensate for the missing bands */
238 : {
239 : #ifdef ISSUE_1867_replace_overflow_libenc
240 0 : Ltmp = L_shl_sat( ee[i], 3 );
241 : #else
242 : Ltmp = L_shl_o( ee[i], 3, &Overflow );
243 : #endif
244 0 : IF( EQ_32( Ltmp, MAX_32 ) ) /* if Overflow: Compute with less precision */
245 : {
246 0 : Ltmp = Mult_32_16( ee[i], 24576 /* 0.75 in Q15 */ ); /* 6/8 Q6*/
247 0 : ee[i] = L_shl_sat( Ltmp, 3 );
248 0 : move32(); /* x8 */
249 : }
250 : ELSE
251 : {
252 0 : ee[i] = Mult_32_16( Ltmp, 24576 /* 0.75 in Q15 */ ); /* Q6 */
253 0 : move32(); /* 6/8 */
254 : }
255 : }
256 :
257 6200 : pt_bands += NB_BANDS; /* Update for next half-frame */
258 6200 : hf_bands += NB_BANDS;
259 : }
260 :
261 3100 : return;
262 : }
263 :
264 : /*-------------------------------------------------------------------*
265 : * find_tilt()
266 : *
267 : * Find LF/HF energy ratio
268 : *-------------------------------------------------------------------*/
269 1132964 : void find_tilt_ivas_fx(
270 : const Word32 fr_bands[], /* i : energy in frequency bands q_fr_bands*/
271 : const Word16 q_fr_bands, /* i : Q of fr_bands Q0*/
272 : const Word32 bckr[], /* i : per band background noise energy estimate q_bckr*/
273 : const Word16 q_bckr, /* i : Q of bckr Q0*/
274 : Word32 ee[2], /* o : lf/hf E ration for present frame Q6*/
275 : const Word16 pitch[3], /* i : open loop pitch values for 3 half-frames Q0*/
276 : const Word16 voicing[3], /* i : normalized correlation for 3 half-frames Q15*/
277 : const Word32 *lf_E, /* i : per bin energy for low frequencies q_lf_E*/
278 : const Word16 q_lf_E, /* i : Q of lf_E */
279 : const Word16 corr_shift, /* i : normalized correlation correction Q15*/
280 : const Word16 bwidth, /* i : input signal bandwidth */
281 : const Word16 max_band, /* i : maximum critical band */
282 : Word32 hp_E[], /* o : energy in HF Q_new*/
283 : const Word16 codec_mode, /* i : MODE1 or MODE2 */
284 : Word32 *bckr_tilt_lt, /* i/o: lf/hf E ratio of background noise Q16 */
285 : Word16 Opt_vbr_mode )
286 : {
287 1132964 : Word32 lp_bckr = 0, hp_bckr = 0, lp_E, Ltmp;
288 : const Word32 *pt_E, *pt_bands, *pt_bckr, *hf_bands, *tmp_E;
289 : Word16 tmp, freq, f0, f1, f2, mean_voi, bin;
290 : Word16 i, nb_bands;
291 : Word16 e_tmp, m_tmp;
292 : Word16 m_Fs, e_Fs;
293 : Word16 m_cnt, e_cnt;
294 : Word16 m_hpE, e_hpE;
295 : Word64 sum;
296 : Word16 inv_bands, q_lp_E;
297 : Word32 Le_min_scaled, Ltmp2;
298 : #ifndef ISSUE_1867_replace_overflow_libenc
299 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
300 : Flag Overflow = 0;
301 : move32();
302 : #endif
303 : #endif
304 1132964 : move32();
305 1132964 : move32();
306 : /*-----------------------------------------------------------------*
307 : * Initializations
308 : *-----------------------------------------------------------------*/
309 :
310 1132964 : IF( ( bwidth != NB ) )
311 : {
312 : /* WB processing */
313 1128674 : bin = BIN4_FX;
314 1128674 : move16(); /* First useful frequency bin ~ 50 Hz */
315 1128674 : pt_bands = fr_bands; /* Q_new */
316 1128674 : tmp_E = lf_E; /* Q_new - 2 */
317 1128674 : pt_bckr = bckr; /* Q_new */
318 1128674 : nb_bands = 10;
319 1128674 : inv_bands = 3277 /* 1/10 in Q15 */;
320 1128674 : move16();
321 1128674 : move16();
322 : }
323 : ELSE
324 : {
325 : /* NB processing */
326 4290 : bin = 3 * BIN4_FX; /* First useful frequency bin ~ 150 Hz */
327 4290 : pt_bands = fr_bands + 1; /* Exlcude 1st critical band */
328 4290 : tmp_E = lf_E + 2; /* Start at the 3rd bin (150 Hz) */
329 4290 : pt_bckr = bckr + 1; /* Exlcude 1st critical band */
330 4290 : nb_bands = 9;
331 4290 : inv_bands = 3641; /* 1/9 in Q15 */
332 4290 : move16();
333 4290 : move16(); /* Nb. of "low" frequency bands taken into account in NB processing */
334 : }
335 :
336 : /*-----------------------------------------------------------------*
337 : * Find spectrum tilt
338 : *-----------------------------------------------------------------*/
339 :
340 1132964 : pt_E = tmp_E; /* Point at the 1st useful element of the per-bin energy vector */
341 1132964 : hf_bands = fr_bands;
342 :
343 : /* bckr + voicing */
344 : /*lp_bckr = mean( pt_bckr, nb_bands );*/ /* estimated noise E in first critical bands, up to 1270 Hz */
345 1132964 : sum = 0;
346 1132964 : move64();
347 12458314 : FOR( i = 0; i < nb_bands; i++ )
348 : {
349 11325350 : sum = W_mac_32_16( sum, pt_bckr[i], inv_bands ); // q_bckr+16
350 : }
351 1132964 : lp_bckr = W_shl_sat_l( sum, -16 ); // q_bckr
352 : /*hp_bckr = 0.5f * (bckr[max_band-1] + bckr[max_band]);*/ /* estimated noise E in last 2 critical bands */
353 1132964 : hp_bckr = W_extract_h( W_shl( W_add( W_deposit32_l( bckr[max_band - 1] ), W_deposit32_l( bckr[max_band] ) ), 31 ) ); // q_bckr
354 1132964 : if ( hp_bckr == 0 ) /* Avoid division by zero. */
355 : {
356 2548 : hp_bckr = L_deposit_l( 1 );
357 : }
358 1132964 : Ltmp = BASOP_Util_Divide3232_Scale_newton( lp_bckr, hp_bckr, &e_tmp );
359 1132964 : Ltmp = Mpy_32_16_r( Ltmp, 3277 /* 0.1f in Q15 */ );
360 1132964 : Ltmp = L_shr_sat( Ltmp, sub( 15, e_tmp ) );
361 1132964 : *bckr_tilt_lt = L_add_sat( Mpy_32_16_r( *bckr_tilt_lt, 29491 /* 0.9f in Q15 */ ), Ltmp ); // Q16
362 1132964 : move32();
363 :
364 1132964 : test();
365 1132964 : IF( EQ_16( codec_mode, MODE2 ) || EQ_16( Opt_vbr_mode, 1 ) )
366 : {
367 : /*lp_bckr *= FACT;*/
368 : /*hp_bckr *= FACT;*/
369 0 : lp_bckr = L_add_sat( L_shl_sat( lp_bckr, 1 ), lp_bckr ); /* Q_new */
370 0 : hp_bckr = L_add_sat( L_shl_sat( hp_bckr, 1 ), hp_bckr ); /* Q_new */
371 : }
372 : /*mean_voi = 0.5f * (voicing[1] + voicing[2]) + corr_shift;*/
373 1132964 : Ltmp = L_mult( voicing[1], 16384 /* 0.5 in Q15 */ ); // Q31
374 1132964 : Ltmp = L_mac( Ltmp, voicing[2], 16384 /* 0.5 in Q15 */ ); // Q31
375 : #ifdef ISSUE_1867_replace_overflow_libenc
376 1132964 : Ltmp = L_mac_sat( Ltmp, corr_shift, 32767 /* 1.0f in Q15 */ ); // Q31
377 1132964 : mean_voi = round_fx_sat( Ltmp ); // Q15
378 : #else
379 : Ltmp = L_mac_o( Ltmp, corr_shift, 32767 /* 1.0f in Q15 */, &Overflow ); // Q31
380 : mean_voi = round_fx_o( Ltmp, &Overflow ); // Q15
381 : #endif
382 :
383 : /*f0 = INT_FS_FX / pitch[2];*/
384 1132964 : e_tmp = norm_s( pitch[2] );
385 1132964 : m_tmp = shl( pitch[2], e_tmp );
386 :
387 1132964 : m_Fs = div_s( INT_FS_FX, m_tmp ); /* exp(e_tmp) */
388 1132964 : e_Fs = sub( 15, e_tmp );
389 1132964 : f0 = shr( m_Fs, sub( e_Fs, 4 ) ); /* Q4 */
390 :
391 1132964 : Le_min_scaled = L_shl( E_MIN_FXQ31, sub( q_fr_bands, Q31 ) ); // q_fr_bands=q_bckr
392 :
393 3398892 : FOR( i = 0; i < 2; i++ )
394 : {
395 : /*hp_E[i] = 0.5f * (hf_bands[max_band-1] + hf_bands[max_band]) - hp_bckr; */ /* averaged E in last 2 critical bands */
396 2265928 : Ltmp = W_extract_h( W_shl( W_add( W_deposit32_l( hf_bands[max_band - 1] ), W_deposit32_l( hf_bands[max_band] ) ), 31 ) ); // q_fr_bands
397 2265928 : Ltmp = L_sub( Ltmp, hp_bckr ); // q_fr_bands
398 :
399 2265928 : Ltmp2 = L_max( Ltmp, L_shl_sat( 1, q_fr_bands ) ); // q_fr_bands, saturation is added because q_fr_bands is limited to 31
400 2265928 : if ( Opt_vbr_mode == 0 )
401 : {
402 2265928 : Ltmp2 = L_max( Ltmp, Le_min_scaled ); // q_fr_bands
403 : }
404 2265928 : hp_E[i] = L_max( Ltmp2, 1 ); // to prevent division by zero
405 2265928 : move32();
406 :
407 2265928 : test();
408 2265928 : IF( GT_16( mean_voi, TH_COR_FX ) && LT_16( pitch[2], TH_PIT_FX ) ) /* High-pitched voiced frames */
409 : {
410 1238390 : freq = bin; // Q4
411 1238390 : move16(); /* 1st useful frequency bin */
412 1238390 : m_cnt = 0;
413 1238390 : move16();
414 1238390 : sum = 0;
415 1238390 : move64();
416 :
417 1238390 : f1 = add( shr( f0, 1 ), f0 ); /* Middle between 2 harmonics */
418 1238390 : f2 = f0;
419 1238390 : move16();
420 8857270 : WHILE( LE_16( freq, 20320 /* 1270.0f in Q4 */ ) ) /* End frequency of 10th critical band */
421 : {
422 40973580 : FOR( ; freq <= f1; freq += BIN4_FX )
423 : {
424 : /* include only bins sufficiently close to harmonics */
425 33354700 : tmp = sub( freq, f2 );
426 33354700 : IF( L_mac0( -TH_D_FX * TH_D_FX, tmp, tmp ) < 0 )
427 : {
428 14983368 : sum = W_mac_32_16( sum, *pt_E, 1 ); // q_lf_E+1
429 14983368 : m_cnt = add( m_cnt, 1 );
430 : }
431 33354700 : pt_E++;
432 : }
433 : #ifdef ISSUE_1867_replace_overflow_libenc
434 7618880 : f1 = add_sat( f1, f0 );
435 7618880 : f2 = add_sat( f2, f0 );
436 : #else
437 : f1 = add_o( f1, f0, &Overflow );
438 : f2 = add_o( f2, f0, &Overflow );
439 : #endif
440 : }
441 : /*lp_E = lp_E / (float)cnt - lp_bckr;*/
442 1238390 : e_tmp = sub( W_norm( sum ), 1 );
443 1238390 : m_tmp = extract_h( W_extract_h( W_shl( sum, e_tmp ) ) ); // q_lf_E+1+e_tmp-32-16
444 1238390 : e_tmp = sub( add( q_lf_E, e_tmp ), 47 );
445 :
446 1238390 : e_cnt = norm_s( m_cnt );
447 1238390 : m_cnt = shl( m_cnt, e_cnt ); // e_cnt
448 :
449 1238390 : m_tmp = div_s( m_tmp, m_cnt ); // Q15+e_tmp-e_cnt
450 1238390 : e_tmp = add( Q15, sub( e_tmp, e_cnt ) );
451 1238390 : sum = W_shl( m_tmp, sub( add( q_bckr, 1 ), e_tmp ) ); // q_bckr+1
452 1238390 : sum = W_msu_32_16( sum, lp_bckr, 1 ); // q_bckr+1
453 1238390 : q_lp_E = W_norm( sum );
454 1238390 : lp_E = W_extract_h( W_shl( sum, q_lp_E ) ); // q_bckr+1+q_lp_E-32
455 1238390 : q_lp_E = sub( add( q_lp_E, q_bckr ), Q31 );
456 :
457 1238390 : pt_E = tmp_E + VOIC_BINS; /* Update for next half-frame Q_new - 1 */
458 : }
459 : ELSE /* Other than high-pitched voiced frames */
460 : {
461 : /*lp_E = mean( pt_bands, nb_bands ) - lp_bckr;*/ /* averaged E in first critical bands, up to 1270 Hz */
462 1027538 : sum = 0;
463 1027538 : move64();
464 11300478 : FOR( Word16 j = 0; j < nb_bands; j++ )
465 : {
466 10272940 : sum = W_mac_32_16( sum, pt_bands[j], inv_bands ); // q_fr_bands+16
467 : }
468 1027538 : sum = W_mac_32_16( sum, lp_bckr, -ONE_IN_Q15 ); // q_fr_bands+16
469 1027538 : lp_E = W_round48_L( sum ); // q_fr_bands=q_bckr
470 1027538 : q_lp_E = q_bckr; // q_fr_bands=q_bckr
471 1027538 : move16();
472 : }
473 2265928 : test();
474 2265928 : IF( Opt_vbr_mode == 0 && GT_32( L_shl_sat( Le_min_scaled, sub( q_lp_E, q_bckr ) ), lp_E ) )
475 : {
476 296201 : lp_E = E_MIN_FXQ31;
477 296201 : q_lp_E = Q31;
478 296201 : move32();
479 296201 : move16();
480 : }
481 2265928 : if ( Opt_vbr_mode != 0 )
482 : {
483 0 : lp_E = L_max( lp_E, 0 ); // q_lp_E
484 : }
485 : /*ee[i] = lp_E / hp_E[i];*/ /* LF/HF ratio */
486 :
487 2265928 : if ( lp_E == 0 )
488 : {
489 0 : ee[i] = 0;
490 0 : move32();
491 : }
492 2265928 : test();
493 2265928 : IF( lp_E != 0 )
494 : {
495 2265928 : e_tmp = sub( norm_l( lp_E ), 1 );
496 2265928 : m_tmp = extract_h( L_shl( lp_E, e_tmp ) ); // e_tmp+q_lp_E-16
497 2265928 : e_hpE = norm_l( hp_E[i] );
498 2265928 : m_hpE = extract_h( L_shl( hp_E[i], e_hpE ) ); // e_hpE+q_bckr-16
499 2265928 : m_tmp = div_s( m_tmp, m_hpE ); // Q15+(e_tmp+q_lp_E)-(e_hpE+q_bckr)
500 2265928 : e_tmp = sub( add( e_tmp, q_lp_E ), add( e_hpE, q_bckr ) );
501 2265928 : ee[i] = L_shr_sat( m_tmp, add( e_tmp, 15 - 6 ) ); /* ee in Q6 */
502 2265928 : move32();
503 : }
504 :
505 2265928 : IF( bwidth == NB ) /* For NB input, compensate for the missing bands */
506 : {
507 : #ifdef ISSUE_1867_replace_overflow_libenc
508 8580 : Ltmp = L_shl_sat( ee[i], 3 ); /* Q6 */
509 : #else
510 : Ltmp = L_shl_o( ee[i], 3, &Overflow ); /* Q6 */
511 : #endif
512 8580 : IF( EQ_32( Ltmp, MAX_32 ) ) /* if Overflow: Compute with less precision */
513 : {
514 0 : Ltmp = Mult_32_16( ee[i], 24576 /* 0.75 in Q15 */ ); /* 6/8 Q6*/
515 0 : ee[i] = L_shl_sat( Ltmp, 3 ); /* Q6 */
516 0 : move32(); /* x8 */
517 : }
518 : ELSE
519 : {
520 8580 : ee[i] = Mult_32_16( Ltmp, 24576 /* 0.75 in Q15 */ );
521 8580 : move32(); /* 6/8 */
522 : }
523 : }
524 :
525 2265928 : pt_bands += NB_BANDS; /* Update for next half-frame */
526 2265928 : hf_bands += NB_BANDS;
527 : }
528 :
529 1132964 : return;
530 : }
|