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 <stdlib.h>
8 : #include <stdio.h>
9 : #include <assert.h>
10 : #include "options.h"
11 : #include "prot_fx.h"
12 : #include "rom_basop_util.h"
13 : #include "basop_util.h"
14 : #include "rom_com.h"
15 :
16 : /*---------------------------------------------------------------
17 : * tcx_decoder_memory_update()
18 : *
19 : *
20 : *--------------------------------------------------------------*/
21 908053 : void tcx_decoder_memory_update(
22 : Word16 *xn_buf, /* i/o: mdct output buffer used also as temporary buffer : Q0 */
23 : Word16 *synthout, /* o: synth : Q0 */
24 : Word16 *A, /* i: Quantized LPC coefficients : Q12*/
25 : Decoder_State *st, /* i/o: decoder memory state */
26 : Word8 fb /* i: fullband flag */
27 : )
28 : {
29 : Word16 tmp;
30 : Word16 *synth;
31 : Word16 buf[1 + M + LFAC + L_FRAME_PLUS];
32 : Word16 L_frame_glob;
33 : Word16 preemph;
34 :
35 908053 : L_frame_glob = st->L_frame;
36 908053 : move16();
37 908053 : preemph = st->preemph_fac; // Q15
38 908053 : move16();
39 :
40 : /* Output synth */
41 908053 : Copy( xn_buf, synthout, L_frame_glob );
42 :
43 : /* Update synth */
44 :
45 908053 : synth = buf + M + 1;
46 908053 : Copy( st->syn, buf, M + 1 );
47 908053 : Copy( xn_buf, synth, L_frame_glob );
48 908053 : Copy( synth + sub( L_frame_glob, M + 1 ), st->syn, M + 1 );
49 :
50 : {
51 908053 : IF( !fb ) /* TV2FhG -> Condition differs from floating point */
52 : {
53 :
54 : /* Emphasis of synth -> synth_pe */
55 908053 : tmp = synth[-M - 1];
56 908053 : move16();
57 908053 : IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) )
58 : {
59 219796 : st->Q_syn = E_UTIL_f_preemph3( synth - M, preemph, add( M, L_frame_glob ), &tmp, 1 );
60 219796 : move16();
61 219796 : st->prev_Q_syn = st->Q_syn = sub( st->Q_syn, 1 );
62 219796 : move16();
63 219796 : move16();
64 : }
65 : ELSE
66 : {
67 688257 : E_UTIL_f_preemph2( 2, synth - M, preemph, add( M, L_frame_glob ), &tmp );
68 688257 : st->prev_Q_syn = st->Q_syn = 0; /* in case of MDCT, Q0 seems to be used*/
69 688257 : move16();
70 688257 : move16();
71 : }
72 908053 : Copy( synth + sub( L_frame_glob, M ), st->mem_syn2_fx, M );
73 908053 : Copy( synth + sub( L_frame_glob, L_SYN_MEM ), st->mem_syn_r, L_SYN_MEM );
74 908053 : IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) )
75 : {
76 219796 : test();
77 219796 : IF( ( st->tcxonly == 0 ) || LE_16( L_frame_glob, L_FRAME16k ) )
78 : {
79 : /* Update excitation */
80 118301 : IF( NE_16( add( st->Q_syn, 1 ), st->Q_exc ) )
81 : {
82 41771 : Scale_sig( st->old_exc_fx, L_EXC_MEM_DEC, sub( add( st->Q_syn, 1 ), st->Q_exc ) );
83 : }
84 118301 : st->Q_exc = add( st->Q_syn, 1 );
85 118301 : move16();
86 118301 : st->Q_subfr[0] = st->Q_subfr[1] = st->Q_subfr[2] = st->Q_subfr[3] = st->Q_subfr[4] = st->Q_exc;
87 118301 : move16();
88 118301 : move16();
89 118301 : move16();
90 118301 : move16();
91 118301 : move16();
92 :
93 118301 : assert( L_frame_glob < L_EXC_MEM_DEC );
94 118301 : Copy( st->old_exc_fx + L_frame_glob, st->old_exc_fx, sub( L_EXC_MEM_DEC, L_frame_glob ) );
95 118301 : Residu3_fx( A, synth, st->old_exc_fx + sub( L_EXC_MEM_DEC, L_frame_glob ), L_frame_glob, 1 );
96 : }
97 : /* Update old_Aq */
98 219796 : Copy( A, st->old_Aq_12_8_fx /*Q12*/, M + 1 );
99 : }
100 : }
101 : }
102 908053 : return;
103 : }
104 :
105 : /* Returns: number of bits used (including "bits") */
106 13882 : Word16 tcx_ari_res_invQ_spec(
107 : Word32 x_Q[], /* i/o: quantized spectrum Q(31-x_Q_e) */
108 : Word16 x_Q_e, /* i: quantized spectrum exponent Q0 */
109 : Word16 L_frame, /* i: number of lines Q0 */
110 : const Word16 prm[], /* i: bitstream Q0 */
111 : Word16 target_bits, /* i: number of bits available Q0 */
112 : Word16 bits, /* i: number of bits used so far Q0 */
113 : Word16 deadzone, /* i: quantizer deadzone Q15 */
114 : const Word16 x_fac[] /* i: spectrum post-quantization factors Q14 */
115 : )
116 : {
117 : Word16 i, j, num_zeros, zeros[L_FRAME_PLUS], fac_p, sign, s;
118 : Word32 L_tmp;
119 :
120 : /* Limit the number of residual bits */
121 13882 : target_bits = s_min( target_bits, NPRM_RESQ );
122 :
123 : /* Requantize the spectrum line-by-line */
124 : /* fac_m = deadzone * 0.5f; */
125 13882 : num_zeros = 0;
126 13882 : move16();
127 :
128 626787 : FOR( i = 0; i < L_frame; i++ )
129 : {
130 625816 : IF( GE_16( bits, target_bits ) ) /* no bits left */
131 : {
132 12911 : BREAK;
133 : }
134 :
135 612905 : IF( x_Q[i] != 0 )
136 : {
137 12537 : sign = x_fac[i];
138 12537 : move16();
139 12537 : if ( x_Q[i] < 0 )
140 6255 : sign = negate( sign );
141 :
142 : /* x_Q[i] += sign*(prm[bits++] * 0.5f - fac_m); */
143 12537 : x_Q[i] = L_sub( x_Q[i], L_shr( L_mult( sign, add( deadzone, lshl( prm[bits], 15 ) ) ), x_Q_e ) ); // x_Q_e
144 12537 : move32();
145 12537 : bits = add( bits, 1 );
146 : }
147 : ELSE
148 : {
149 600368 : zeros[num_zeros] = i;
150 600368 : move16();
151 600368 : num_zeros = add( num_zeros, 1 );
152 : }
153 : }
154 :
155 : /* Requantize zeroed-lines of the spectrum */
156 13882 : fac_p = msu_r( 1417339264l /*0.33f*2.0f Q31*/, deadzone, 21627 /*0.33f*2.0f Q15*/ ); /* Q15 */
157 13882 : target_bits = sub( target_bits, 1 ); /* reserve 1 bit for the check below */
158 :
159 13882 : s = sub( x_Q_e, 1 );
160 47639 : FOR( j = 0; j < num_zeros; j++ )
161 : {
162 35089 : IF( GE_16( bits, target_bits ) ) /* 1 or 0 bits left */
163 : {
164 1332 : BREAK;
165 : }
166 :
167 33757 : i = zeros[j];
168 33757 : move16();
169 :
170 33757 : IF( prm[bits] != 0 )
171 : {
172 7782 : bits = add( bits, 1 );
173 7782 : L_tmp = L_mult( fac_p, x_fac[i] ); /* Q30 */
174 7782 : if ( prm[bits] == 0 )
175 4023 : L_tmp = L_negate( L_tmp );
176 7782 : x_Q[i] = L_shr( L_tmp, s );
177 7782 : move32();
178 : }
179 33757 : bits = add( bits, 1 );
180 : }
181 :
182 13882 : return bits;
183 : }
184 : /*---------------------------------------------------------------
185 : * tcx_res_invQ_gain()
186 : *
187 : *
188 : *--------------------------------------------------------------*/
189 358891 : Word16 tcx_res_invQ_gain(
190 : Word16 *gain_tcx, /* i/o : gain_tcx_e*/
191 : Word16 *gain_tcx_e,
192 : Word16 *prm, /*i : Q0 */
193 : Word16 resQBits /*i : Q0 */
194 : )
195 : {
196 : Word16 bits, gain, tmp1, tmp2;
197 :
198 358891 : gain = *gain_tcx;
199 358891 : move16();
200 :
201 : /* make sure we have a bit of headroom */
202 358891 : IF( GT_16( gain, 0x7000 ) )
203 : {
204 20232 : gain = shr( gain, 1 );
205 20232 : *gain_tcx_e = add( *gain_tcx_e, 1 );
206 20232 : move16();
207 : }
208 :
209 : /*Refine the gain quantization*/
210 358891 : tmp1 = s_min( resQBits, TCX_RES_Q_BITS_GAIN );
211 1273798 : FOR( bits = 0; bits < tmp1; bits++ )
212 : {
213 914907 : tmp2 = gain_corr_fac[bits];
214 914907 : move16();
215 914907 : if ( prm[bits] == 0 )
216 : {
217 463988 : tmp2 = gain_corr_inv_fac[bits];
218 463988 : move16();
219 : }
220 :
221 914907 : gain = mult_r( gain, tmp2 );
222 914907 : if ( prm[bits] != 0 )
223 450919 : gain = shl( gain, 1 );
224 : }
225 :
226 358891 : *gain_tcx = gain;
227 358891 : move16();
228 :
229 :
230 358891 : return bits;
231 : }
232 :
233 : /*---------------------------------------------------------------
234 : * tcx_res_invQ_spec()
235 : *
236 : *
237 : *--------------------------------------------------------------*/
238 358891 : Word16 tcx_res_invQ_spec(
239 : Word32 *x, /*Q(31 - x_e)*/
240 : Word16 x_e,
241 : Word16 L_frame,
242 : Word16 *prm,
243 : Word16 resQBits,
244 : Word16 bits,
245 : Word16 sq_round, /*i : sq deadzone Q15*/
246 : const Word16 lf_deemph_factors[] /*i : LF deemphasis factors Q14*/ )
247 : {
248 : Word16 i;
249 : Word16 fac_m, fac_p;
250 : Word16 lf_deemph_factor, c, s;
251 : Word32 tmp;
252 :
253 :
254 : /* Limit the number of residual bits */
255 358891 : resQBits = s_min( resQBits, NPRM_RESQ );
256 :
257 : /* Requantize the spectrum line-by-line */
258 358891 : fac_m = shr( sq_round, 1 );
259 358891 : fac_p = sub( 0x4000 /*0.5f Q15*/, fac_m ); // Q15
260 :
261 358891 : lf_deemph_factor = 0x4000; /*0.5f Q15*/
262 358891 : move16();
263 358891 : s = sub( x_e, 1 );
264 :
265 13292034 : FOR( i = 0; i < L_frame; i++ )
266 : {
267 13279359 : IF( GE_16( bits, resQBits ) )
268 : {
269 346216 : BREAK;
270 : }
271 :
272 12933143 : test();
273 12933143 : test();
274 12933143 : IF( ( x[i] != 0 ) && ( ( lf_deemph_factors == NULL ) || ( GT_16( lf_deemph_factors[i], 0x2000 /*0.5f in Q14*/ ) ) ) )
275 : {
276 2233351 : if ( lf_deemph_factors != NULL )
277 : {
278 463791 : lf_deemph_factor = lf_deemph_factors[i]; // Q14
279 463791 : move16();
280 : }
281 :
282 2233351 : IF( prm[bits] == 0 )
283 : {
284 :
285 : /* Debug initialization to catch illegal cases of x[i] */
286 1116764 : tmp = 0;
287 1116764 : move32();
288 :
289 1116764 : if ( x[i] > 0 )
290 564649 : tmp = L_mult( fac_m, lf_deemph_factor ); // Q14+Q15-1 = Q28
291 1116764 : if ( x[i] < 0 )
292 552115 : tmp = L_mult( fac_p, lf_deemph_factor ); // Q14+Q15-1 = Q28
293 :
294 1116764 : assert( tmp != 0 );
295 :
296 1116764 : x[i] = L_sub( x[i], L_shr( tmp, s ) ); // Q(31 - x_e)
297 1116764 : move32();
298 : }
299 : ELSE
300 : {
301 :
302 : /* Debug initialization to catch illegal cases of x[i] */
303 1116587 : tmp = 0;
304 1116587 : move32();
305 :
306 1116587 : if ( x[i] > 0 )
307 555927 : tmp = L_mult( fac_p, lf_deemph_factor ); // Q14+Q15-1 = Q28
308 1116587 : if ( x[i] < 0 )
309 560660 : tmp = L_mult( fac_m, lf_deemph_factor ); // Q14+Q15-1 = Q28
310 :
311 1116587 : assert( tmp != 0 );
312 :
313 1116587 : x[i] = L_add( x[i], L_shr( tmp, s ) ); // Q(31 - x_e)
314 1116587 : move32();
315 : }
316 2233351 : bits = add( bits, 1 );
317 : }
318 : }
319 :
320 : /*Quantize zeroed-line of the spectrum*/
321 358891 : resQBits = sub( resQBits, 1 );
322 :
323 358891 : IF( lf_deemph_factors == NULL )
324 : {
325 446825 : FOR( i = 0; i < L_frame; i++ )
326 : {
327 446825 : IF( GE_16( bits, resQBits ) )
328 : {
329 256549 : BREAK;
330 : }
331 :
332 190276 : IF( x[i] == 0 )
333 : {
334 120331 : IF( prm[bits] != 0 )
335 : {
336 54108 : bits = add( bits, 1 );
337 :
338 54108 : tmp = L_mult( 21627 /*1.32f Q14*/, fac_p /*Q15*/ ); // Q28
339 54108 : if ( prm[bits] == 0 )
340 27180 : tmp = L_negate( tmp );
341 :
342 54108 : x[i] = L_shr( tmp, s ); // Q(31 - x_e)
343 54108 : move32();
344 : }
345 120331 : bits = add( bits, 1 );
346 : }
347 : }
348 : }
349 : ELSE
350 : {
351 102342 : c = sub( 21627 /*0.66f Q15*/, mult_r( sq_round, 21627 /*0.66f Q15*/ ) ); // Q15
352 :
353 485111 : FOR( i = 0; i < L_frame; i++ )
354 : {
355 485111 : IF( GE_16( bits, resQBits ) )
356 : {
357 102342 : BREAK;
358 : }
359 :
360 382769 : test();
361 382769 : IF( ( x[i] == 0 ) && ( GT_16( lf_deemph_factors[i], 0x2000 ) ) )
362 : {
363 295455 : IF( prm[bits] != 0 )
364 : {
365 99409 : bits = add( bits, 1 );
366 :
367 99409 : tmp = L_mult( c, lf_deemph_factors[i] ); // Q28
368 99409 : if ( prm[bits] == 0 )
369 49608 : tmp = L_negate( tmp );
370 :
371 99409 : x[i] = L_shr( tmp, s ); // Q(31 - x_e)
372 99409 : move32();
373 : }
374 295455 : bits = add( bits, 1 );
375 : }
376 : }
377 : }
378 :
379 358891 : return bits;
380 : }
|