Line data Source code
1 : /*====================================================================================
2 : EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
3 : ====================================================================================*/
4 :
5 : #include <stdint.h>
6 : #include "options.h" /* Compilation switches */
7 : #include "prot_fx.h"
8 : #include "wmc_auto.h"
9 :
10 : /*-------------------------------------------------------------*
11 : * preemph_copy_fx()
12 : *
13 : * Preemphasis: filtering through 1 - mu z^-1
14 : *-------------------------------------------------------------*/
15 :
16 1171874 : void preemph_copy_fx(
17 : const Word16 x[], /* i : input signal Qx */
18 : Word16 y[], /* o : output signal Qx */
19 : const Word16 mu, /* i : preemphasis coefficient Q15 */
20 : const Word16 lg, /* i : vector size Q0 */
21 : Word16 *mem /* i/o: memory (x[-1]) Qx */
22 : )
23 : {
24 : Word16 i, temp;
25 : #ifndef ISSUE_1836_replace_overflow_libcom
26 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
27 : Flag Overflow = 0;
28 : move32();
29 : #endif
30 : #endif
31 1171874 : temp = x[lg - 1]; /* Qx */
32 1171874 : move16();
33 : #ifdef ISSUE_1836_replace_overflow_libcom
34 114187561 : FOR( i = lg - 1; i > 0; i-- )
35 : {
36 113015687 : y[i] = msu_r_sat( L_deposit_h( x[i] ), x[i - 1], mu ); /* Qx */
37 113015687 : move16();
38 : }
39 1171874 : y[0] = msu_r_sat( L_deposit_h( x[0] ), *mem, mu ); /* Qx */
40 1171874 : move16();
41 : #else
42 : FOR( i = lg - 1; i > 0; i-- )
43 : {
44 : y[i] = msu_ro( L_deposit_h( x[i] ), x[i - 1], mu, &Overflow ); /* Qx */
45 : move16();
46 : }
47 : y[0] = msu_ro( L_deposit_h( x[0] ), *mem, mu, &Overflow ); /* Qx */
48 : move16();
49 : #endif
50 :
51 :
52 1171874 : *mem = temp; /* Qx */
53 1171874 : move16();
54 1171874 : }
55 :
56 0 : void preemph_copy_32fx(
57 : const Word16 x[], /* i : input signal Qx */
58 : Word32 y[], /* o : output signal Qx */
59 : const Word16 mu, /* i : preemphasis coefficient Q15 */
60 : const Word16 lg, /* i : vector size Q0 */
61 : Word16 *mem /* i/o: memory (x[-1]) Qx */
62 : )
63 : {
64 : Word16 i, temp;
65 : #ifndef ISSUE_1836_replace_overflow_libcom
66 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
67 : Flag Overflow = 0;
68 : move32();
69 : #endif
70 : #endif
71 0 : temp = x[lg - 1]; /* Qx */
72 0 : move16();
73 : #ifdef ISSUE_1836_replace_overflow_libcom
74 0 : FOR( i = lg - 1; i > 0; i-- )
75 : {
76 0 : y[i] = L_msu_sat( L_deposit_h( x[i] ), x[i - 1], mu ); /* Qx+16 */
77 0 : move16();
78 : }
79 0 : y[0] = L_msu_sat( L_deposit_h( x[0] ), *mem, mu ); /* Qx+16 */
80 0 : move16();
81 : #else
82 : FOR( i = lg - 1; i > 0; i-- )
83 : {
84 : y[i] = L_msu_o( L_deposit_h( x[i] ), x[i - 1], mu, &Overflow ); /* Qx+16 */
85 : move16();
86 : }
87 : y[0] = L_msu_o( L_deposit_h( x[0] ), *mem, mu, &Overflow ); /* Qx+16 */
88 : move16();
89 : #endif
90 :
91 0 : *mem = temp; /* Qx */
92 0 : move16();
93 0 : }
94 :
95 : /*-------------------------------------------------------------*
96 : * preemph_ivas_fx()
97 : *
98 : * Preemphasis: filtering through 1 - mu z^-1
99 : *-------------------------------------------------------------*/
100 :
101 63660 : void preemph_ivas_fx(
102 : Word32 *signal, /* i/o: signal Qx*/
103 : const Word16 mu, /* i : preemphasis factor Q15*/
104 : const Word16 L, /* i : vector size Q0*/
105 : Word32 *mem /* i/o: memory (x[-1]) Qx*/
106 : )
107 : {
108 : Word16 i;
109 : Word32 temp;
110 :
111 63660 : temp = signal[L - 1]; /* Qx */
112 63660 : move32();
113 19237440 : FOR( i = L - 1; i > 0; i-- )
114 : {
115 19173780 : signal[i] = L_sub( signal[i], Mpy_32_16_1( signal[i - 1], mu ) ); /* Qx */
116 19173780 : move32();
117 : }
118 :
119 63660 : signal[0] = L_sub( signal[0], Mpy_32_16_1( *mem, mu ) ); /* Qx */
120 63660 : move32();
121 63660 : *mem = temp; /* Qx */
122 63660 : move32();
123 :
124 63660 : return;
125 : }
126 :
127 : /*
128 : * E_UTIL_f_preemph2
129 : *
130 : * Parameters:
131 : * shift I: scale output
132 : * signal I/O: signal Qx/Qx+shift
133 : * mu I: preemphasis factor Q15
134 : * L I: vector size
135 : * mem I/O: memory (x[-1])
136 : *
137 : * Function:
138 : * Filtering through 1 - mu z^-1
139 : *
140 : * Returns:
141 : * void
142 : */
143 701170 : void E_UTIL_f_preemph2(
144 : Word16 shift, /* Q0 */
145 : Word16 *signal, /* Qx */
146 : const Word16 mu, /* Q15 */
147 : const Word16 lg, /* Q0 */
148 : Word16 *mem /* Qx */
149 : )
150 : {
151 : Word16 i, temp;
152 : Word32 L_tmp;
153 : #ifndef ISSUE_1836_replace_overflow_libcom
154 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
155 : Flag Overflow = 0;
156 : move32();
157 : #endif
158 : #endif
159 701170 : temp = signal[lg - 1]; /* Qx */
160 701170 : move16();
161 :
162 : #ifdef ISSUE_1836_replace_overflow_libcom
163 397602592 : FOR( i = lg - 1; i > 0; i-- )
164 : {
165 396901422 : L_tmp = L_mult( signal[i], 16384 ); /* Qx + 15 */
166 396901422 : L_tmp = L_msu0_sat( L_tmp, signal[i - 1], mu ); /* Qx + 15 */
167 396901422 : L_tmp = L_shl_sat( L_tmp, add( shift, 1 ) ); /* Qx + shift + 16 */
168 396901422 : signal[i] = round_fx_sat( L_tmp ); /* Qx + shift */
169 396901422 : move16();
170 : }
171 :
172 701170 : L_tmp = L_mult( signal[0], 16384 ); /* Qx + 15 */
173 701170 : L_tmp = L_msu0_sat( L_tmp, *mem, mu ); /* Qx + 15 */
174 701170 : L_tmp = L_shl_sat( L_tmp, add( shift, 1 ) ); /* Qx + shift + 16 */
175 701170 : signal[0] = round_fx_sat( L_tmp ); /* Qx + shift */
176 701170 : move16();
177 : #else
178 : FOR( i = lg - 1; i > 0; i-- )
179 : {
180 : L_tmp = L_mult( signal[i], 16384 ); /* Qx + 15 */
181 : L_tmp = L_msu0_o( L_tmp, signal[i - 1], mu, &Overflow ); /* Qx + 15 */
182 : L_tmp = L_shl_o( L_tmp, add( shift, 1 ), &Overflow ); /* Qx + shift + 16 */
183 : signal[i] = round_fx_o( L_tmp, &Overflow ); /* Qx + shift */
184 : move16();
185 : }
186 :
187 : L_tmp = L_mult( signal[0], 16384 ); /* Qx + 15 */
188 : L_tmp = L_msu0_o( L_tmp, *mem, mu, &Overflow ); /* Qx + 15 */
189 : L_tmp = L_shl_o( L_tmp, add( shift, 1 ), &Overflow ); /* Qx + shift + 16 */
190 : signal[0] = round_fx_o( L_tmp, &Overflow ); /* Qx + shift */
191 : move16();
192 : #endif
193 :
194 701170 : *mem = temp; /* Qx */
195 701170 : move16();
196 :
197 701170 : return;
198 : }
199 :
200 :
201 220195 : Word16 E_UTIL_f_preemph3(
202 : Word16 *signal, /* Qx */
203 : const Word16 mu, /* Q15 */
204 : const Word16 lg, /* Q0 */
205 : Word16 *mem, /* Qx */
206 : Word16 bits /* Q0 */
207 : )
208 : {
209 : Word16 i, QVal, mus, tmp_fixed, Q_new;
210 : Word32 L_tmp, L_maxloc;
211 :
212 :
213 220195 : QVal = shl( 1, sub( 15, bits ) ); /* Q15 - bits */
214 220195 : mus = shr( mu, bits ); /* Q15 - bits */
215 :
216 220195 : L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
217 220195 : L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
218 220195 : L_maxloc = L_abs( L_tmp );
219 :
220 103308850 : FOR( i = 1; i < lg; i++ )
221 : {
222 103088655 : L_tmp = L_mult( signal[i], QVal ); /* Qx + Q16 - bits */
223 103088655 : L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
224 103088655 : L_tmp = L_abs( L_tmp );
225 103088655 : L_maxloc = L_max( L_tmp, L_maxloc );
226 : }
227 :
228 220195 : tmp_fixed = extract_h( L_maxloc ); /* Qx - bits */
229 :
230 220195 : Q_new = Q_MAX;
231 220195 : move16();
232 220195 : IF( tmp_fixed != 0 )
233 : {
234 210642 : Q_new = sub( norm_s( tmp_fixed ), bits );
235 210642 : Q_new = s_max( Q_new, 0 );
236 210642 : Q_new = s_min( Q_new, Q_MAX );
237 : }
238 :
239 220195 : tmp_fixed = signal[lg - 1]; /* Qx */
240 220195 : move16();
241 :
242 103308850 : FOR( i = lg - 1; i > 0; i-- )
243 : {
244 103088655 : L_tmp = L_mult( signal[i], QVal ); /* Qx + Q16 - bits */
245 103088655 : L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
246 103088655 : L_tmp = L_shl( L_tmp, Q_new ); /* Qx + Q16 + Q_new - bits */
247 103088655 : signal[i] = round_fx( L_tmp ); /* Qx + Q_new - bits */
248 103088655 : move16();
249 : }
250 :
251 220195 : L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
252 220195 : L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
253 220195 : L_tmp = L_shl( L_tmp, Q_new ); /* Qx + Q16 + Q_new - bits */
254 220195 : signal[0] = round_fx( L_tmp ); /* Qx + Q_new - bits */
255 220195 : move16();
256 220195 : *mem = tmp_fixed;
257 220195 : move16();
258 :
259 220195 : return Q_new;
260 : }
261 :
262 3555 : Word16 E_UTIL_f_preemph3_ivas_fx(
263 : Word16 *signal, /* Qx */
264 : const Word16 mu, /* Q15 */
265 : const Word16 lg, /* Q0 */
266 : Word16 *mem, /* Qx */
267 : Word16 bits /* Q0 */
268 : )
269 : {
270 : Word16 i, QVal, mus, tmp_fixed, Q_new;
271 : Word32 L_tmp, L_maxloc;
272 :
273 :
274 3555 : QVal = shl( 1, sub( 15, bits ) ); /* Q15 - bits */
275 3555 : mus = shr( mu, bits ); /* Q15 - bits */
276 :
277 3555 : L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
278 3555 : L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
279 3555 : L_maxloc = L_abs( L_tmp );
280 :
281 2908593 : FOR( i = 1; i < lg; i++ )
282 : {
283 2905038 : L_tmp = L_mult( signal[i], QVal ); /* Qx + Q16 - bits */
284 2905038 : L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
285 2905038 : L_tmp = L_abs( L_tmp );
286 2905038 : L_maxloc = L_max( L_tmp, L_maxloc );
287 : }
288 :
289 3555 : tmp_fixed = extract_h( L_maxloc ); /* Qx - bits */
290 :
291 3555 : Q_new = Q_MAX;
292 3555 : move16();
293 3555 : IF( tmp_fixed != 0 )
294 : {
295 2883 : Q_new = sub( norm_s( tmp_fixed ), bits );
296 2883 : Q_new = s_max( Q_new, 0 );
297 2883 : Q_new = sub( s_min( Q_new, Q_MAX ), 1 );
298 : }
299 :
300 3555 : tmp_fixed = signal[lg - 1];
301 3555 : move16();
302 :
303 2908593 : FOR( i = sub( lg, 1 ); i > 0; i-- )
304 : {
305 2905038 : L_tmp = L_mult( signal[i], QVal ); /* Qx + Q16 - bits */
306 2905038 : L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
307 2905038 : L_tmp = L_shl( L_tmp, Q_new ); /* Qx + Q16 + Q_new - bits */
308 2905038 : signal[i] = round_fx( L_tmp ); /* Qx + Q_new - bits */
309 2905038 : move16();
310 : }
311 :
312 3555 : L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
313 3555 : L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
314 3555 : L_tmp = L_shl( L_tmp, Q_new ); /* Qx + Q_new + Q16 - bits */
315 3555 : signal[0] = round_fx( L_tmp ); /* Qx + Q_new - bits */
316 3555 : move16();
317 3555 : *mem = tmp_fixed;
318 3555 : move16();
319 :
320 3555 : return Q_new;
321 : }
|