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