Line data Source code
1 : /******************************************************************************************************
2 :
3 : (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
4 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
5 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
6 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
7 : contributors to this repository. All Rights Reserved.
8 :
9 : This software is protected by copyright law and by international treaties.
10 : The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
11 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
12 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
13 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
14 : contributors to this repository retain full ownership rights in their respective contributions in
15 : the software. This notice grants no license of any kind, including but not limited to patent
16 : license, nor is any license granted by implication, estoppel or otherwise.
17 :
18 : Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
19 : contributions.
20 :
21 : This software is provided "AS IS", without any express or implied warranties. The software is in the
22 : development stage. It is intended exclusively for experts who have experience with such software and
23 : solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
24 : and fitness for a particular purpose are hereby disclaimed and excluded.
25 :
26 : Any dispute, controversy or claim arising under or in relation to providing this software shall be
27 : submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
28 : accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
29 : the United Nations Convention on Contracts on the International Sales of Goods.
30 :
31 : *******************************************************************************************************/
32 :
33 : #include <stdint.h>
34 : #include "options.h"
35 : #include "prot_fx.h"
36 : #include "oper_32b.h"
37 : #include "move.h"
38 :
39 : /*--------------------------------------------------------------------------*
40 : * hq2_noise_inject()
41 : *
42 : * HQ2 noise injection for WB signals
43 : *--------------------------------------------------------------------------*/
44 34 : void hq2_noise_inject_fx(
45 : Word32 L_y2[], /* Q12 */
46 : const Word16 band_start[], /* Q0 */
47 : const Word16 band_end[], /* Q0 */
48 : const Word16 band_width[], /* Q0 */
49 : Word32 Ep_fx[], /* Q-6 */
50 : Word32 Rk_fx[], /* QRk (Q16) */
51 : const Word16 npulses[], /* Q0 */
52 : Word16 ni_seed, /* Q0 */
53 : const Word16 bands, /* Q0 */
54 : const Word16 ni_start_band, /* Q0 */
55 : const Word16 bw_low, /* Q0 */
56 : const Word16 bw_high, /* Q0 */
57 : const Word32 enerL_fx, /* Q0 */
58 : const Word32 enerH_fx, /* Q0 */
59 : Word32 last_ni_gain_fx[], /* Q17 */
60 : Word16 last_env_fx[], /* Q1 */
61 : Word16 *last_max_pos_pulse, /* Q0 */
62 : Word16 *p2a_flags, /* Q0 */
63 : Word16 p2a_bands, /* Q0 */
64 : const Word16 hqswb_clas, /* Q0 */
65 : const Word16 bwidth, /* Q0 */
66 : const Word32 bwe_br /* Q0 */
67 : )
68 : {
69 : Word32 L_tmp, L_tmp2, L_tmp2x, L_tmp3, L_tmp1;
70 : Word16 exp, exp2, Q_speech;
71 : Word16 pd_fx[BANDS_MAX], rand_fx, peak_fx[BANDS_MAX], fac_fx;
72 :
73 : Word16 tmp, tmpx, tmp1, tmp2, tmp3, tmp4, Q_env_fx[BANDS_MAX], Q_Ep_fx[BANDS_MAX];
74 :
75 34 : Word16 Qs = SWB_BWE_LR_Qs;
76 : Word32 env_fx[BANDS_MAX];
77 : Word16 env_fx2[BANDS_MAX];
78 : Word32 ni_gain_fx[BANDS_MAX];
79 : Word16 y2hat_fx[L_FRAME48k];
80 :
81 : Word16 i, j, k, ni_end_band, satur, count[BANDS_MAX], max_pos_pulse, pos;
82 34 : Word16 sb = bands;
83 : #ifndef ISSUE_1836_replace_overflow_libcom
84 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
85 : Flag Overflow = 0;
86 : move16();
87 : #endif
88 : #endif
89 :
90 34 : satur = 0;
91 34 : move16();
92 :
93 812 : FOR( i = 0; i < bands; i++ )
94 : {
95 : #ifdef ISSUE_1836_replace_overflow_libcom
96 778 : Ep_fx[i] = L_shl_sat( Ep_fx[i], 6 ); /* Q-6 -> Q0 */
97 : #else
98 : Ep_fx[i] = L_shl_o( Ep_fx[i], 6, &Overflow ); /* Q-6 -> Q0 */
99 : #endif
100 778 : move32();
101 : }
102 :
103 34 : tmp = add( band_end[bands - 1], 1 );
104 19346 : FOR( k = 0; k < tmp; k++ )
105 : {
106 19312 : y2hat_fx[k] = (Word16) L_min( L_max( L_shr( L_y2[k], Qs ), -32768 ), 32767 );
107 19312 : move16(); /* Extract_l or something else is missing here */
108 : }
109 :
110 34 : test();
111 34 : test();
112 34 : test();
113 34 : test();
114 34 : IF( ( EQ_16( hqswb_clas, HQ_HARMONIC ) || hqswb_clas == HQ_NORMAL ) && ( EQ_32( bwe_br, HQ_16k40 ) || EQ_32( bwe_br, HQ_13k20 ) ) && EQ_16( bwidth, SWB ) )
115 : {
116 31 : sb = 17;
117 31 : move16();
118 31 : if ( EQ_32( bwe_br, HQ_16k40 ) )
119 : {
120 0 : sb = 19;
121 0 : move16();
122 : }
123 : }
124 :
125 : /* calculate the envelopes/ the decoded peak coeff./number of the decoded coeff./ the last subbands of the bit-allocated/saturation of bit-allocation */
126 34 : ni_end_band = bands;
127 34 : max_pos_pulse = bands;
128 812 : FOR( k = ni_start_band; k < ni_end_band; k++ )
129 : {
130 778 : tmp = div_s( 1, band_width[k] ); /*Q15 */
131 778 : L_tmp = Mult_32_16( Rk_fx[k], tmp ); /*Q(16+15-15=16) */
132 778 : pd_fx[k] = extract_h( L_shl( L_tmp, 10 ) ); /*16+10-16 =Q10 */
133 :
134 778 : L_tmp2 = Ep_fx[k]; /*Q0 */
135 778 : move32();
136 778 : L_tmp = L_max( 1, L_tmp2 );
137 778 : exp = norm_l( L_tmp );
138 778 : tmp = extract_h( L_shl( L_tmp, exp ) );
139 :
140 778 : L_tmp3 = (Word32) band_width[k]; /* Q0 */
141 778 : move32();
142 778 : exp2 = norm_l( L_tmp3 );
143 778 : tmp2 = extract_h( L_shl( L_tmp3, exp2 ) );
144 :
145 778 : exp2 = sub( exp, exp2 ); /* Denormalize and substract */
146 :
147 778 : tmp3 = sub( tmp2, tmp );
148 778 : if ( tmp3 > 0 )
149 : {
150 298 : tmp2 = shr( tmp2, 1 );
151 : }
152 778 : if ( tmp3 > 0 )
153 : {
154 298 : exp2 = add( exp2, 1 );
155 : }
156 778 : tmp = div_s( tmp2, tmp ); /* Q15 */
157 778 : L_tmp = L_deposit_h( tmp ); /* Q31 */
158 778 : L_tmp = Isqrt_lc( L_tmp, &exp2 );
159 778 : env_fx[k] = L_tmp;
160 778 : move32(); /*Q(31-exp2) move32(); */
161 778 : Q_env_fx[k] = sub( 31, exp2 );
162 778 : move16();
163 778 : tmp = sub( 17, Q_env_fx[k] );
164 : #ifdef ISSUE_1836_replace_overflow_libcom
165 778 : env_fx2[k] = extract_h( L_shl_sat( env_fx[k], tmp ) ); /*Q1 */
166 : #else
167 : env_fx2[k] = extract_h( L_shl_o( env_fx[k], tmp, &Overflow ) ); /*Q1 */
168 : #endif
169 778 : peak_fx[k] = 0;
170 778 : move16();
171 778 : count[k] = 0;
172 778 : move16();
173 :
174 778 : IF( npulses[k] != 0 )
175 : {
176 7511 : FOR( i = band_start[k]; i <= band_end[k]; i++ )
177 : {
178 6990 : L_tmp = L_mult0( y2hat_fx[i], y2hat_fx[i] ); /* Q0 */
179 : #ifdef ISSUE_1836_replace_overflow_libcom
180 6990 : Ep_fx[k] = L_sub_sat( Ep_fx[k], L_tmp );
181 : #else
182 : Ep_fx[k] = L_sub_o( Ep_fx[k], L_tmp, &Overflow );
183 : #endif
184 6990 : move32(); /* Q0 */
185 6990 : IF( GT_16( abs_s( y2hat_fx[i] ), peak_fx[k] ) )
186 : {
187 665 : peak_fx[k] = abs_s( y2hat_fx[i] );
188 665 : move16(); /* Q0 */
189 : }
190 :
191 6990 : IF( y2hat_fx[i] != 0 )
192 : {
193 993 : count[k] = add( count[k], 1 ); /* Q0 */
194 993 : move16();
195 : }
196 : }
197 :
198 521 : max_pos_pulse = k; /* Q0 */
199 521 : move16();
200 521 : L_tmp2 = Ep_fx[k]; /* Q0 */
201 521 : move32();
202 521 : L_tmp = L_max( 1, L_tmp2 );
203 521 : exp = norm_l( L_tmp );
204 521 : tmp = extract_h( L_shl( L_tmp, exp ) );
205 :
206 521 : L_tmp3 = (Word32) band_width[k]; /* Q0 */
207 521 : exp2 = norm_l( L_tmp3 );
208 521 : tmp2 = extract_h( L_shl( L_tmp3, exp2 ) );
209 :
210 521 : exp2 = sub( exp, exp2 ); /* Denormalize and substract */
211 :
212 521 : tmp3 = sub( tmp2, tmp );
213 521 : if ( tmp3 > 0 )
214 : {
215 269 : tmp2 = shr( tmp2, 1 );
216 : }
217 521 : if ( tmp3 > 0 )
218 : {
219 269 : exp2 = add( exp2, 1 );
220 : }
221 521 : tmp = div_s( tmp2, tmp ); /* Q15 */
222 521 : L_tmp = L_deposit_h( tmp ); /* Q31 */
223 521 : L_tmp = Isqrt_lc( L_tmp, &exp2 );
224 521 : Ep_fx[k] = L_tmp;
225 521 : move32(); /*Q(31-exp2) */
226 521 : Q_Ep_fx[k] = sub( 31, exp2 );
227 521 : move16();
228 : }
229 : ELSE
230 : {
231 257 : Ep_fx[k] = env_fx[k];
232 257 : move32(); /*Q(Q_env_fx[k]) */
233 257 : Q_Ep_fx[k] = Q_env_fx[k];
234 257 : move16(); /*31-exp2 */
235 : }
236 : }
237 :
238 812 : FOR( k = ni_start_band; k < ni_end_band; k++ )
239 : {
240 : /* calculate the noise gain */
241 778 : satur = 0;
242 778 : move16();
243 778 : if ( GE_16( pd_fx[k], 819 /* 0.8 in Q10 */ ) )
244 : {
245 244 : satur = 1; /* Q0 */
246 244 : move16();
247 : }
248 :
249 778 : test();
250 778 : IF( satur == 0 && Ep_fx[k] > 0 )
251 : {
252 534 : IF( npulses[k] != 0 )
253 : {
254 277 : IF( EQ_16( bwidth, SWB ) )
255 : {
256 277 : IF( NE_16( hqswb_clas, HQ_TRANSIENT ) )
257 : {
258 256 : IF( peak_fx[k] != 0 )
259 : {
260 256 : Q_speech = norm_s( peak_fx[k] );
261 256 : tmp = shl( peak_fx[k], Q_speech ); /*Q(Q_speech) */
262 256 : tmp = div_s( 16384, tmp ); /*Q(15+14-Q_speech) */
263 : }
264 : ELSE
265 : {
266 0 : tmp = 0x7fff; /* 1 in Q15 */
267 0 : move16();
268 0 : Q_speech = 0;
269 0 : move16();
270 : }
271 256 : L_tmp2x = Mult_32_16( Ep_fx[k], tmp ); /* Q(Q_Ep_fx[k]+29-Q_speech-15 = Q_Ep_fx[k]-Q_speech+14) */
272 256 : tmp = sub( Q_Ep_fx[k], Q_speech );
273 256 : tmpx = add( tmp, 1 );
274 256 : tmp2 = extract_l( L_shr( L_tmp2x, s_min( tmpx, 31 ) ) ); /*Q13 Ep[k]/peak[k] */
275 :
276 256 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
277 : {
278 0 : tmp = sub( 1536 /* 1.5 in Q10 */, pd_fx[k] ); /*Q10 */
279 0 : tmp3 = shl( tmp, 4 ); /*Q14 */
280 0 : L_tmp = Mult_32_16( env_fx[k], tmp3 ); /*Q(Q_env_fx[k]+14-15 = Q_env_fx[k]-1) */
281 0 : L_tmp = Mult_32_16( L_tmp, 6144 /* 6.0f in Q10 */ ); /*Q(Q_env_fx[k]-1+10-15 = Q_env_fx[k]-6) */
282 :
283 0 : IF( peak_fx[k] != 0 )
284 : {
285 0 : Q_speech = norm_s( peak_fx[k] );
286 0 : tmp = shl( peak_fx[k], Q_speech ); /*Q(Q_speech) */
287 0 : tmp = div_s( 16384, tmp ); /*Q(15+14-Q_speech) */
288 : }
289 : ELSE
290 : {
291 0 : tmp = 0x7fff; /* 1 in Q15 */
292 0 : move16();
293 0 : Q_speech = 0;
294 0 : move16();
295 : }
296 :
297 0 : L_tmp2 = Mult_32_16( Ep_fx[k], tmp ); /* Q(Q_Ep_fx[k]+29-Q_speech-15=Q_Ep_fx[k]-Q_speech+14) */
298 0 : L_tmp3 = Mult_32_16( L_tmp, tmp ); /* Q(Q_env_fx[k]-6+29-Q_speech-15=Q_env_fx[k]-Q_speech+8) */
299 0 : L_tmp = Mult_32_32( L_tmp2, L_tmp3 ); /*Q(Q_Ep_fx[k]-Q_speech+14+Q_env_fx[k]-Q_speech+8-31=Q_Ep_fx[k]+Q_env_fx[k]-2*Q_speech-9) */
300 :
301 0 : tmp = add( Q_Ep_fx[k], Q_env_fx[k] );
302 0 : tmp = sub( tmp, Q_speech );
303 0 : tmp = sub( tmp, Q_speech );
304 0 : tmp = sub( 37, tmp );
305 0 : tmp1 = extract_h( L_shl( L_tmp, tmp ) ); /*Q12 //6.0f*(1.5f - pd[k])*env[k]*Ep[k]/(peak[k]*peak[k]) */
306 :
307 0 : fac_fx = tmp1;
308 0 : move16(); /*Q12 */
309 0 : if ( GT_16( k, sb ) )
310 : {
311 0 : fac_fx = mult( 24576 /* 1.5 in Q14 */, tmp2 ); /*//Q(14+13-15=12) */
312 : }
313 : }
314 : ELSE
315 : {
316 256 : IF( LE_16( k, sb ) )
317 : {
318 249 : tmp = sub( 1536 /* 1.5 in Q10 */, pd_fx[k] ); /*Q10 */
319 249 : tmp3 = shl( tmp, 4 ); /*Q14 */
320 249 : L_tmp = Mult_32_16( L_tmp2x, tmp3 ); /*Q(Q_Ep_fx[k]-Q_speech+14+14-15 = Q_Ep_fx[k]-Q_speech+13) */
321 249 : L_tmp = Mult_32_16( L_tmp, 20480 /* 5 in Q12 */ ); /*Q(Q_Ep_fx[k]-Q_speech+13+12-15 = Q_Ep_fx[k]-Q_speech+10) */
322 249 : fac_fx = extract_h( L_shl( L_tmp, sub( add( 18, Q_speech ), Q_Ep_fx[k] ) ) ); /*Q_Ep_fx[k]-Q_speech+10 +18+Q_speech-Q_Ep_fx[k] -16 =12 */
323 : }
324 : ELSE
325 : {
326 7 : fac_fx = shl( mult( 32767 /* 4.0f in Q13 */, tmp2 ), 1 ); /*//Q(13+13-15+1=12) */
327 : }
328 : }
329 : }
330 : ELSE
331 : {
332 21 : fac_fx = 4505;
333 21 : move16(); /* 1.1 in Q12 */
334 : }
335 : }
336 : ELSE
337 : {
338 0 : tmp = sub( 1536 /* 1.5 in Q10 */, pd_fx[k] ); /*Q10 */
339 0 : tmp2 = s_min( 1024 /* 1 in Q10 */, tmp ); /*q10 */
340 0 : tmp2 = shl( tmp2, 4 ); /*Q14 */
341 0 : L_tmp = Mult_32_16( env_fx[k], tmp2 ); /*Q(Q_env_fx[k]+14-15 = Q_env_fx[k]-1) */
342 0 : L_tmp = Mult_32_16( L_tmp, 20480 /* 20 in Q10 */ ); /*Q(Q_env_fx[k]-1+10-15 = Q_env_fx[k]-6) */
343 :
344 0 : IF( peak_fx[k] != 0 )
345 : {
346 0 : Q_speech = norm_s( peak_fx[k] );
347 0 : tmp = shl( peak_fx[k], Q_speech ); /*Q(Q_speech) */
348 0 : tmp = div_s( 16384 /* 0.5f in Q15 */, tmp ); /*Q(15+14-Q_speech) */
349 : }
350 : ELSE
351 : {
352 0 : tmp = 0x7fff; /* 1 in Q15 */
353 0 : move16();
354 0 : Q_speech = 0;
355 0 : move16();
356 : }
357 :
358 0 : L_tmp2 = Mult_32_16( Ep_fx[k], tmp ); /* Q(Q_Ep_fx[k]+29-Q_speech-15=Q_Ep_fx[k]-Q_speech+14) */
359 0 : L_tmp3 = Mult_32_16( L_tmp, tmp ); /* Q(Q_env_fx[k]-6+29-Q_speech-15=Q_env_fx[k]-Q_speech+8) */
360 0 : L_tmp = Mult_32_32( L_tmp2, L_tmp3 ); /*Q(Q_Ep_fx[k]-Q_speech+14+Q_env_fx[k]-Q_speech+8-31=Q_Ep_fx[k]+Q_env_fx[k]-2*Q_speech-9) */
361 :
362 0 : tmp = add( Q_Ep_fx[k], Q_env_fx[k] );
363 0 : tmp = sub( tmp, Q_speech );
364 0 : tmp = sub( tmp, Q_speech );
365 0 : tmp = sub( 37, tmp );
366 :
367 0 : fac_fx = extract_h( L_shl( L_tmp, tmp ) ); /*Q12 */
368 :
369 0 : test();
370 0 : IF( GT_16( k, 1 ) && LT_16( k, sub( ni_end_band, 1 ) ) )
371 : {
372 0 : IF( env_fx2[k] != 0 )
373 : {
374 0 : Q_speech = norm_s( env_fx2[k] );
375 0 : tmp = shl( env_fx2[k], Q_speech ); /*Q(Q_speech+1) */
376 0 : tmp = div_s( 16384 /* 0.5 in Q15 */, tmp ); /*Q(15+14-Q_speech-1=28-Q_speech) */
377 0 : Q_speech = sub( 28, Q_speech );
378 : }
379 : ELSE
380 : {
381 0 : tmp = 0x7fff; /* 1/0 in Q15 */
382 0 : move16();
383 0 : Q_speech = 0;
384 0 : move16();
385 : }
386 0 : tmp1 = mult( env_fx2[k + 1], 16384 /* 0.5 in Q15 */ ); /*Q(1+15-15=1) Q1 */
387 0 : tmp2 = sub( env_fx2[k], tmp1 );
388 0 : tmp1 = mult( env_fx2[k], 16384 /* 0.5 in Q15 */ ); /*Q(1+15-15=1) Q1 */
389 0 : tmp3 = sub( tmp1, env_fx2[k - 1] );
390 0 : tmp1 = mult( peak_fx[k], 16384 /* 0.5 in Q15 */ ); /*Q(0+15-15=0) Q0 */
391 0 : tmp4 = sub( tmp1, shr( env_fx2[k], 1 ) );
392 0 : test();
393 0 : test();
394 0 : test();
395 0 : IF( count[k + 1] == 0 && tmp2 > 0 && tmp3 < 0 )
396 : {
397 0 : L_tmp = L_mult( env_fx2[k + 1], tmp ); /* Q(1+Q_speech+1 = Q_speech+2) */
398 0 : L_tmp = Mult_32_16( L_tmp, 24576 /* 1.5 in Q14 */ ); /*Q(Q_speech+2+14-15=Q_speech+1) */
399 0 : fac_fx = extract_h( L_shl( L_tmp, sub( 27, Q_speech ) ) ); /*Q12 */
400 : }
401 0 : ELSE IF( count[k - 1] == 0 && tmp4 > 0 )
402 : {
403 0 : L_tmp = L_mult( env_fx2[k - 1], tmp ); /* Q(1+Q_speech+1 = Q_speech+2) */
404 : #ifdef ISSUE_1836_replace_overflow_libcom
405 0 : fac_fx = extract_h( L_shl_sat( L_tmp, sub( 26, Q_speech ) ) ); /*Q12 */
406 : #else
407 : fac_fx = extract_h( L_shl_o( L_tmp, sub( 26, Q_speech ), &Overflow ) ); /*Q12 */
408 : #endif
409 : }
410 : }
411 :
412 0 : test();
413 0 : IF( GE_16( k, sub( ni_end_band, p2a_bands ) ) && EQ_16( bwidth, WB ) )
414 : {
415 0 : L_tmp = Mult_32_16( enerH_fx, bw_low );
416 0 : L_tmp2 = Mult_32_16( enerL_fx, bw_high );
417 0 : L_tmp = L_sub( L_tmp, L_tmp2 );
418 0 : tmp1 = mult( peak_fx[k], 16384 /* 0.5 in Q15 */ ); /*Q(0+15-15=0) Q0 */
419 0 : tmp4 = sub( tmp1, shr( env_fx2[k], 1 ) );
420 0 : test();
421 0 : IF( L_tmp > 0 && tmp4 < 0 )
422 : {
423 0 : IF( peak_fx[k] != 0 )
424 : {
425 0 : Q_speech = norm_s( peak_fx[k] );
426 0 : tmp = shl( peak_fx[k], Q_speech ); /*Q(Q_speech) */
427 0 : tmp = div_s( 16384 /* 0.5 in Q15 */, tmp ); /*Q(15+14-Q_speech) */
428 : }
429 : ELSE
430 : {
431 0 : tmp = 0x7fff; /* 1.0f in Q15 */
432 0 : move16();
433 0 : Q_speech = 0;
434 0 : move16();
435 : }
436 0 : L_tmp2 = Mult_32_16( Ep_fx[k], tmp ); /* Q(Q_Ep_fx[k]+29-Q_speech-15 = Q_Ep_fx[k]-Q_speech+14) */
437 0 : tmp = sub( Q_Ep_fx[k], Q_speech );
438 0 : tmp = add( tmp, 1 );
439 0 : tmp = extract_l( L_shr( L_tmp2, tmp ) ); /*Q13 */
440 0 : tmp = sub( 16384 /* 2 in Q13 */, tmp ); /*Q13 */
441 0 : fac_fx = extract_h( L_shl( L_mult( fac_fx, tmp ), 2 ) ); /*Q12*/
442 : }
443 :
444 0 : IF( p2a_flags[k] == 0 )
445 : {
446 0 : L_tmp2 = Mult_32_16( Ep_fx[k], fac_fx ); /*Q(Q_Ep_fx[k]+12-15 = Q_Ep_fx[k]-3) */
447 0 : Q_speech = norm_l( L_tmp2 );
448 0 : tmp = extract_h( L_shl( L_tmp2, Q_speech ) ); /*Q(Q_Ep_fx[k]-3+Q_speech-16 = Q_Ep_fx[k]+Q_speech-19) */
449 0 : IF( tmp != 0 )
450 : {
451 0 : tmp = div_s( 16384 /* 0.5 in Q15 */, tmp ); /*Q(15+14-Q_Ep_fx[k]-Q_speech+19 = 48-Q_Ep_fx[k]-Q_speech) */
452 0 : L_tmp2 = Mult_32_16( env_fx[k], tmp ); /*Q(Q_env_fx[k]+48-Q_Ep_fx[k]-Q_speech-15 = Q_env_fx[k]-Q_Ep_fx[k]-Q_speech+33) */
453 0 : L_tmp2 = Mult_32_16( L_tmp2, 20480 /* 1.25 in Q14 */ ); /*Q(Q_env_fx[k]-Q_Ep_fx[k]-Q_speech+33+14-15 = Q_env_fx[k]-Q_Ep_fx[k]-Q_speech+32) */
454 0 : tmp = sub( Q_env_fx[k], Q_Ep_fx[k] );
455 0 : tmp = sub( tmp, Q_speech );
456 0 : tmp = add( tmp, 25 );
457 0 : L_tmp = L_shr_sat( L_tmp2, tmp ); /*Q7 */
458 0 : tmp = extract_l( L_min( L_tmp, 192 /* 1.5 in Q7 */ ) ); /* */
459 0 : fac_fx = extract_h( L_shl( L_mult( fac_fx, tmp ), 8 ) ); /*Q12 */
460 : }
461 : ELSE
462 : {
463 0 : tmp = 0x7fff; /*Q0 */
464 0 : L_tmp2 = Mult_32_16( env_fx[k], tmp ); /*Q(Q_env_fx[k]+0-15 = Q_env_fx[k]-15) */
465 0 : L_tmp2 = Mult_32_16( L_tmp2, 20480 /* 1.25 in Q14 */ ); /*Q(Q_env_fx[k]-15+14-15 = Q_env_fx[k]-16) */
466 0 : tmp = sub( Q_env_fx[k], 23 );
467 0 : L_tmp = L_shr_sat( L_tmp2, tmp ); /*Q7 */
468 0 : tmp = extract_l( ( L_min( L_tmp, 192 /* 1.5 in Q7 */ ) ) ); /* Q7 */
469 0 : fac_fx = extract_h( L_shl( L_mult( fac_fx, tmp ), 8 ) ); /*Q12 */
470 : }
471 : }
472 : }
473 : }
474 : }
475 : ELSE
476 : {
477 257 : fac_fx = 4505; /* 1.1 in Q12 */
478 257 : move16();
479 257 : test();
480 257 : if ( EQ_16( hqswb_clas, HQ_HARMONIC ) && EQ_16( bwidth, SWB ) )
481 : {
482 0 : fac_fx = 3277; /* 0.8 in Q12 */
483 0 : move16();
484 : }
485 : }
486 :
487 534 : L_tmp = Mult_32_16( Ep_fx[k], fac_fx ); /*Q(Q_Ep_fx[k]+12-15 = Q_Ep_fx[k]-3) */
488 : #ifdef ISSUE_1836_replace_overflow_libcom
489 534 : ni_gain_fx[k] = L_shr_sat( L_tmp, sub( Q_Ep_fx[k], 20 ) );
490 : #else
491 : ni_gain_fx[k] = L_shr_o( L_tmp, sub( Q_Ep_fx[k], 20 ), &Overflow );
492 : #endif
493 534 : move32(); /*Q17 */
494 : }
495 : ELSE
496 : {
497 244 : ni_gain_fx[k] = L_deposit_l( 0 );
498 : }
499 :
500 : /* smooth the noise gain between the current frame and the previous frame */
501 778 : pos = s_max( max_pos_pulse, *last_max_pos_pulse ); /* Q0 */
502 778 : move16();
503 778 : if ( EQ_16( bwidth, SWB ) )
504 : {
505 778 : pos = sub( ni_end_band, 1 ); /* Q0 */
506 778 : move16();
507 : }
508 :
509 778 : IF( LE_16( k, pos ) )
510 : {
511 778 : test();
512 778 : IF( k > 0 && LT_16( sub( k, ni_end_band ), -1 ) )
513 : {
514 710 : tmp1 = mult( last_env_fx[k], 16384 /* 0.5 in Q15 */ ); /*Q(1+15-15=1) Q1 */
515 710 : tmp2 = sub( env_fx2[k], tmp1 ); /* Q1 */
516 710 : tmp1 = mult( env_fx2[k], 16384 /* 0.5 in Q15 */ ); /*Q(1+15-15=1) Q1 */
517 710 : tmp3 = sub( tmp1, last_env_fx[k] ); /* Q1 */
518 710 : L_tmp = L_add( (Word32) env_fx2[k], (Word32) env_fx2[k - 1] ); /* Q1 */
519 710 : L_tmp = L_add( L_tmp, (Word32) env_fx2[k + 1] ); /*Q1 */
520 710 : L_tmp1 = L_add( (Word32) last_env_fx[k], (Word32) last_env_fx[k - 1] ); /* Q1 */
521 710 : L_tmp1 = L_add( L_tmp1, (Word32) last_env_fx[k + 1] ); /*Q1 */
522 710 : L_tmp2 = Mult_32_16( L_tmp1, 16384 /* 0.5 in Q15 */ ); /*Q(1+15-15) Q1 */
523 710 : L_tmp2 = L_sub( L_tmp, L_tmp2 ); /*Q1 */
524 710 : L_tmp3 = Mult_32_16( L_tmp, 16384 /* 0.5 in Q15 */ ); /*Q(1+15-15) Q1 */
525 710 : L_tmp3 = L_sub( L_tmp3, L_tmp1 ); /*Q1 */
526 710 : test();
527 710 : test();
528 710 : test();
529 710 : IF( ( tmp2 > 0 && tmp3 < 0 ) || ( L_tmp2 > 0 && L_tmp3 < 0 ) )
530 : {
531 368 : IF( GT_32( ni_gain_fx[k], last_ni_gain_fx[k] ) )
532 : {
533 94 : L_tmp = Mult_32_16( ni_gain_fx[k], 6554 /* 0.2 in Q15 */ ); /*Q(17+15-15 = 17) */
534 94 : L_tmp1 = Mult_32_16( last_ni_gain_fx[k], 26214 /* 0.8 in Q15 */ ); /*Q17 */
535 94 : ni_gain_fx[k] = L_add( L_tmp, L_tmp1 ); /* Q17 */
536 94 : move32();
537 : }
538 : ELSE
539 : {
540 274 : L_tmp = Mult_32_16( ni_gain_fx[k], 19661 /* 0.6 in Q15 */ ); /*Q(17+15-15 = 17) */
541 274 : L_tmp1 = Mult_32_16( last_ni_gain_fx[k], 13107 /* 0.4 in Q15 */ ); /*Q17 */
542 274 : ni_gain_fx[k] = L_add( L_tmp, L_tmp1 ); /* Q17 */
543 274 : move32();
544 : }
545 : }
546 : }
547 68 : ELSE IF( add( sub( k, ni_end_band ), 1 ) == 0 )
548 : {
549 34 : tmp1 = mult( last_env_fx[k], 16384 /* 0.5 in Q15 */ ); /*Q(1+15-15=1) Q1 */
550 34 : tmp2 = sub( env_fx2[k], tmp1 ); /*Q1 */
551 34 : tmp1 = mult( env_fx2[k], 16384 /* 0.5 in Q15 */ ); /*Q(1+15-15=1) Q1 */
552 34 : tmp3 = sub( tmp1, last_env_fx[k] ); /*Q1 */
553 34 : L_tmp = L_add( (Word32) env_fx2[k], (Word32) env_fx2[k - 1] ); /*Q1 */
554 34 : L_tmp1 = L_add( (Word32) last_env_fx[k], (Word32) last_env_fx[k - 1] ); /*Q1 */
555 34 : L_tmp2 = Mult_32_16( L_tmp1, 16384 /* 0.5 in Q15 */ ); /*Q(1+15-15) Q1 */
556 34 : L_tmp2 = L_sub( L_tmp, L_tmp2 ); /*Q1 */
557 34 : L_tmp3 = Mult_32_16( L_tmp, 16384 /* 0.5 in Q15 */ ); /*Q(1+15-15) Q1 */
558 34 : L_tmp3 = L_sub( L_tmp3, L_tmp1 ); /*Q1 */
559 :
560 34 : test();
561 34 : test();
562 34 : test();
563 34 : IF( ( tmp2 > 0 && tmp3 < 0 ) || ( L_tmp2 > 0 && L_tmp3 < 0 ) )
564 : {
565 11 : IF( GT_32( ni_gain_fx[k], last_ni_gain_fx[k] ) )
566 : {
567 4 : L_tmp = Mult_32_16( ni_gain_fx[k], 6554 /* 0.2 in Q15 */ ); /*Q(17+15-15 = 17) */
568 4 : L_tmp1 = Mult_32_16( last_ni_gain_fx[k], 26214 /* 0.8 in Q15 */ ); /*Q17 */
569 4 : ni_gain_fx[k] = L_add( L_tmp, L_tmp1 ); /* Q17 */
570 4 : move32();
571 : }
572 : ELSE
573 : {
574 7 : L_tmp = Mult_32_16( ni_gain_fx[k], 19661 /* 0.6 in Q15 */ ); /*Q(17+15-15 = 17) */
575 7 : L_tmp1 = Mult_32_16( last_ni_gain_fx[k], 13107 /* 0.4 in Q15 */ ); /*Q17 */
576 7 : ni_gain_fx[k] = L_add( L_tmp, L_tmp1 ); /* Q17 */
577 7 : move32();
578 : }
579 : }
580 : }
581 : }
582 :
583 : /* inject noise into the non-decoded coeffs */
584 778 : test();
585 778 : test();
586 778 : IF( add( sub( k, ni_end_band ), p2a_bands ) >= 0 && p2a_flags[k] == 0 && NE_16( bwidth, SWB ) )
587 : {
588 0 : FOR( i = band_start[k]; i <= band_end[k]; i++ )
589 : {
590 0 : IF( L_y2[i] != 0 )
591 : {
592 0 : L_y2[i] = Mult_32_16( L_y2[i], 26215 /* 0.8 in Q15 */ );
593 0 : move32(); /*Q(12+15-15=12) */
594 : }
595 : }
596 : }
597 :
598 778 : test();
599 778 : test();
600 778 : test();
601 778 : IF( EQ_16( k, max_pos_pulse ) && add( sub( k, bands ), p2a_bands ) < 0 && NE_16( satur, 1 ) && NE_16( bwidth, SWB ) )
602 : {
603 0 : j = 0;
604 0 : move16();
605 :
606 0 : Q_speech = norm_l( ni_gain_fx[k] );
607 0 : tmp = extract_h( L_shl( ni_gain_fx[k], Q_speech ) ); /*Q(Q_speech+1) */
608 0 : IF( tmp != 0 )
609 : {
610 0 : tmp = div_s( 16384 /* 0.5 in Q15 */, tmp ); /*Q(15+14-Q_speech-1 = 28-Q_speech) */
611 0 : L_tmp = Mult_32_16( Ep_fx[k], tmp ); /*Q(Q_Ep_fx[k]+28-Q_speech-15 = Q_Ep_fx[k]+13-Q_speech) */
612 0 : tmp = sub( Q_Ep_fx[k], Q_speech );
613 0 : tmp = sub( 15, tmp );
614 : #ifdef ISSUE_1836_replace_overflow_libcom
615 0 : tmp = extract_h( L_shl_sat( L_tmp, tmp ) ); /*Q12 */
616 : #else
617 : tmp = extract_h( L_shl_o( L_tmp, tmp, &Overflow ) ); /*Q12 */
618 : #endif
619 : }
620 : ELSE
621 : {
622 0 : tmp = 0x7fff; /*Q0 */
623 0 : L_tmp = Mult_32_16( Ep_fx[k], tmp ); /*Q(Q_Ep_fx[k]+0-15 = Q_Ep_fx[k]-15) */
624 0 : tmp = sub( 43, Q_Ep_fx[k] );
625 : #ifdef ISSUE_1836_replace_overflow_libcom
626 0 : tmp = extract_h( L_shl_sat( L_tmp, tmp ) ); /*Q12 */
627 : #else
628 : tmp = extract_h( L_shl_o( L_tmp, tmp, &Overflow ) ); /*Q12 */
629 : #endif
630 : }
631 0 : fac_fx = s_max( tmp, 4096 /* 1 in Q12 */ ); /*Q12 */
632 :
633 0 : FOR( i = band_start[k]; i <= band_end[k]; i++ )
634 : {
635 0 : IF( L_y2[i] == 0 )
636 : {
637 0 : rand_fx = Random( &ni_seed ); /*Q15 */
638 0 : IF( band_width[k] != 0 )
639 : {
640 0 : Q_speech = norm_s( band_width[k] );
641 : #ifdef ISSUE_1836_replace_overflow_libcom
642 0 : tmp = shl_sat( band_width[k], Q_speech ); /*Q(Q_speech) */
643 : #else
644 : tmp = shl_o( band_width[k], Q_speech, &Overflow ); /*Q(Q_speech) */
645 : #endif
646 0 : tmp = div_s( 16384 /* 0.5 in Q15 */, tmp ); /*Q(15+14-Q_speech) */
647 : }
648 : ELSE
649 : {
650 0 : tmp = 0x7fff;
651 0 : Q_speech = 0;
652 0 : move16();
653 0 : move16();
654 : }
655 0 : tmp1 = sub( fac_fx, 4096 /* 1 in Q12 */ ); /*Q12 */
656 0 : L_tmp = L_mult( tmp1, j ); /*Q13 */
657 0 : L_tmp = Mult_32_16( L_tmp, tmp ); /*Q(13+29-Q_speech-15 = 27-Q_speech) */
658 : #ifdef ISSUE_1836_replace_overflow_libcom
659 0 : tmp = extract_h( L_shl_sat( L_tmp, add( 1, Q_speech ) ) ); /*Q12 */
660 : #else
661 : tmp = extract_h( L_shl_o( L_tmp, add( 1, Q_speech ), &Overflow ) ); /*Q12 */
662 : #endif
663 0 : tmp = sub( fac_fx, tmp ); /*Q12 */
664 0 : L_tmp = Mult_32_16( ni_gain_fx[k], tmp ); /*Q(17+12-15=14) */
665 0 : L_y2[i] = L_add( L_y2[i], L_shr( Mult_32_16( L_tmp, rand_fx ), 2 ) );
666 0 : move32(); /*Q12 */
667 : }
668 0 : j = add( j, 1 );
669 : }
670 : }
671 : ELSE
672 : {
673 20090 : FOR( i = band_start[k]; i <= band_end[k]; i++ )
674 : {
675 19312 : IF( L_y2[i] == 0 )
676 : {
677 18319 : rand_fx = Random( &ni_seed ); /*Q15 */
678 18319 : L_tmp = Mult_32_16( ni_gain_fx[k], rand_fx ); /*Q(17+15-15=17) */
679 18319 : L_y2[i] = L_add( L_y2[i], L_shr( L_tmp, 5 ) );
680 18319 : move32(); /*Q12 */
681 : }
682 : }
683 : }
684 : }
685 :
686 34 : Copy( env_fx2, last_env_fx, ni_end_band );
687 34 : Copy32( ni_gain_fx, last_ni_gain_fx, ni_end_band ); /* Q17 */
688 34 : *last_max_pos_pulse = max_pos_pulse;
689 34 : move16();
690 34 : return;
691 : }
|