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