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 3807241 : 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 3807241 : temp = x[lg - 1]; /* Qx */
32 3807241 : move16();
33 : #ifdef ISSUE_1836_replace_overflow_libcom
34 348435019 : FOR( i = lg - 1; i > 0; i-- )
35 : {
36 344627778 : y[i] = msu_r_sat( L_deposit_h( x[i] ), x[i - 1], mu ); /* Qx */
37 344627778 : move16();
38 : }
39 3807241 : y[0] = msu_r_sat( L_deposit_h( x[0] ), *mem, mu ); /* Qx */
40 3807241 : 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 3807241 : *mem = temp; /* Qx */
53 3807241 : move16();
54 3807241 : }
55 :
56 2885064 : 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 2885064 : temp = x[lg - 1]; /* Qx */
72 2885064 : move16();
73 : #ifdef ISSUE_1836_replace_overflow_libcom
74 490766125 : FOR( i = lg - 1; i > 0; i-- )
75 : {
76 487881061 : y[i] = L_msu_sat( L_deposit_h( x[i] ), x[i - 1], mu ); /* Qx+16 */
77 487881061 : move16();
78 : }
79 2885064 : y[0] = L_msu_sat( L_deposit_h( x[0] ), *mem, mu ); /* Qx+16 */
80 2885064 : 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 2885064 : *mem = temp; /* Qx */
92 2885064 : move16();
93 2885064 : }
94 :
95 : /*-------------------------------------------------------------*
96 : * preemph_ivas_fx()
97 : *
98 : * Preemphasis: filtering through 1 - mu z^-1
99 : *-------------------------------------------------------------*/
100 :
101 63791 : 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 63791 : temp = signal[L - 1]; /* Qx */
112 63791 : move32();
113 19273392 : FOR( i = L - 1; i > 0; i-- )
114 : {
115 19209601 : signal[i] = L_sub( signal[i], Mpy_32_16_1( signal[i - 1], mu ) ); /* Qx */
116 19209601 : move32();
117 : }
118 :
119 63791 : signal[0] = L_sub( signal[0], Mpy_32_16_1( *mem, mu ) ); /* Qx */
120 63791 : move32();
121 63791 : *mem = temp; /* Qx */
122 63791 : move32();
123 :
124 63791 : 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 949164 : 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 949164 : temp = signal[lg - 1]; /* Qx */
160 949164 : move16();
161 :
162 : #ifdef ISSUE_1836_replace_overflow_libcom
163 510527680 : FOR( i = lg - 1; i > 0; i-- )
164 : {
165 509578516 : L_tmp = L_mult( signal[i], 16384 ); /* Qx + 15 */
166 509578516 : L_tmp = L_msu0_sat( L_tmp, signal[i - 1], mu ); /* Qx + 15 */
167 509578516 : L_tmp = L_shl_sat( L_tmp, add( shift, 1 ) ); /* Qx + shift + 16 */
168 509578516 : signal[i] = round_fx_sat( L_tmp ); /* Qx + shift */
169 509578516 : move16();
170 : }
171 :
172 949164 : L_tmp = L_mult( signal[0], 16384 ); /* Qx + 15 */
173 949164 : L_tmp = L_msu0_sat( L_tmp, *mem, mu ); /* Qx + 15 */
174 949164 : L_tmp = L_shl_sat( L_tmp, add( shift, 1 ) ); /* Qx + shift + 16 */
175 949164 : signal[0] = round_fx_sat( L_tmp ); /* Qx + shift */
176 949164 : 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 949164 : *mem = temp; /* Qx */
195 949164 : move16();
196 :
197 949164 : return;
198 : }
199 :
200 :
201 221167 : 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 221167 : QVal = shl( 1, sub( 15, bits ) ); /* Q15 - bits */
214 221167 : mus = shr( mu, bits ); /* Q15 - bits */
215 :
216 221167 : L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
217 221167 : L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
218 221167 : L_maxloc = L_abs( L_tmp );
219 :
220 103696387 : FOR( i = 1; i < lg; i++ )
221 : {
222 103475220 : L_tmp = L_mult( signal[i], QVal ); /* Qx + Q16 - bits */
223 103475220 : L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
224 103475220 : L_tmp = L_abs( L_tmp );
225 103475220 : L_maxloc = L_max( L_tmp, L_maxloc );
226 : }
227 :
228 221167 : tmp_fixed = extract_h( L_maxloc ); /* Qx - bits */
229 :
230 221167 : Q_new = Q_MAX;
231 221167 : move16();
232 221167 : IF( tmp_fixed != 0 )
233 : {
234 211899 : Q_new = sub( norm_s( tmp_fixed ), bits );
235 211899 : Q_new = s_max( Q_new, 0 );
236 211899 : Q_new = s_min( Q_new, Q_MAX );
237 : }
238 :
239 221167 : tmp_fixed = signal[lg - 1]; /* Qx */
240 221167 : move16();
241 :
242 103696387 : FOR( i = lg - 1; i > 0; i-- )
243 : {
244 103475220 : L_tmp = L_mult( signal[i], QVal ); /* Qx + Q16 - bits */
245 103475220 : L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
246 103475220 : L_tmp = L_shl( L_tmp, Q_new ); /* Qx + Q16 + Q_new - bits */
247 103475220 : signal[i] = round_fx( L_tmp ); /* Qx + Q_new - bits */
248 103475220 : move16();
249 : }
250 :
251 221167 : L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
252 221167 : L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
253 221167 : L_tmp = L_shl( L_tmp, Q_new ); /* Qx + Q16 + Q_new - bits */
254 221167 : signal[0] = round_fx( L_tmp ); /* Qx + Q_new - bits */
255 221167 : move16();
256 221167 : *mem = tmp_fixed;
257 221167 : move16();
258 :
259 221167 : return Q_new;
260 : }
261 :
262 3551 : 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 3551 : QVal = shl( 1, sub( 15, bits ) ); /* Q15 - bits */
275 3551 : mus = shr( mu, bits ); /* Q15 - bits */
276 :
277 3551 : L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
278 3551 : L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
279 3551 : L_maxloc = L_abs( L_tmp );
280 :
281 2903979 : FOR( i = 1; i < lg; i++ )
282 : {
283 2900428 : L_tmp = L_mult( signal[i], QVal ); /* Qx + Q16 - bits */
284 2900428 : L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
285 2900428 : L_tmp = L_abs( L_tmp );
286 2900428 : L_maxloc = L_max( L_tmp, L_maxloc );
287 : }
288 :
289 3551 : tmp_fixed = extract_h( L_maxloc ); /* Qx - bits */
290 :
291 3551 : Q_new = Q_MAX;
292 3551 : move16();
293 3551 : IF( tmp_fixed != 0 )
294 : {
295 2886 : Q_new = sub( norm_s( tmp_fixed ), bits );
296 2886 : Q_new = s_max( Q_new, 0 );
297 2886 : Q_new = sub( s_min( Q_new, Q_MAX ), 1 );
298 : }
299 :
300 3551 : tmp_fixed = signal[lg - 1];
301 3551 : move16();
302 :
303 2903979 : FOR( i = sub( lg, 1 ); i > 0; i-- )
304 : {
305 2900428 : L_tmp = L_mult( signal[i], QVal ); /* Qx + Q16 - bits */
306 2900428 : L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
307 2900428 : L_tmp = L_shl( L_tmp, Q_new ); /* Qx + Q16 + Q_new - bits */
308 2900428 : signal[i] = round_fx( L_tmp ); /* Qx + Q_new - bits */
309 2900428 : move16();
310 : }
311 :
312 3551 : L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
313 3551 : L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
314 3551 : L_tmp = L_shl( L_tmp, Q_new ); /* Qx + Q_new + Q16 - bits */
315 3551 : signal[0] = round_fx( L_tmp ); /* Qx + Q_new - bits */
316 3551 : move16();
317 3551 : *mem = tmp_fixed;
318 3551 : move16();
319 :
320 3551 : return Q_new;
321 : }
|