Line data Source code
1 : /*====================================================================================
2 : EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.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 4853566 : 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 :
26 4853566 : temp = x[lg - 1]; /* Qx */
27 4853566 : move16();
28 :
29 439613908 : FOR( i = lg - 1; i > 0; i-- )
30 : {
31 434760342 : y[i] = msu_r_sat( L_deposit_h( x[i] ), x[i - 1], mu ); /* Qx */
32 434760342 : move16();
33 : }
34 4853566 : y[0] = msu_r_sat( L_deposit_h( x[0] ), *mem, mu ); /* Qx */
35 4853566 : move16();
36 :
37 4853566 : *mem = temp; /* Qx */
38 4853566 : move16();
39 :
40 4853566 : return;
41 : }
42 : #ifndef FIX_2015_PREMPH_SAT_ALT
43 : void preemph_copy_32fx(
44 : const Word16 x[], /* i : input signal Qx */
45 : Word32 y[], /* o : output signal Qx */
46 : const Word16 mu, /* i : preemphasis coefficient Q15 */
47 : const Word16 lg, /* i : vector size Q0 */
48 : Word16 *mem /* i/o: memory (x[-1]) Qx */
49 : )
50 : {
51 : Word16 i, temp;
52 :
53 : temp = x[lg - 1]; /* Qx */
54 : move16();
55 :
56 : FOR( i = lg - 1; i > 0; i-- )
57 : {
58 : y[i] = L_msu_sat( L_deposit_h( x[i] ), x[i - 1], mu ); /* Qx+16 */
59 : move16();
60 : }
61 : y[0] = L_msu_sat( L_deposit_h( x[0] ), *mem, mu ); /* Qx+16 */
62 : move16();
63 :
64 : *mem = temp; /* Qx */
65 : move16();
66 :
67 : return;
68 : }
69 : #else
70 3380208 : void preemph_copy_32fx2(
71 : const Word16 x[], /* i : input signal Qx */
72 : Word32 y[], /* o : output signal Qx-1*/
73 : const Word16 mu, /* i : preemphasis coefficient Q15 */
74 : const Word16 lg, /* i : vector size Q0 */
75 : Word16 *mem /* i/o: memory (x[-1]) Qx */
76 : )
77 : {
78 : Word16 i, temp;
79 :
80 3380208 : temp = x[lg - 1]; /* Qx */
81 3380208 : move16();
82 :
83 574967382 : FOR( i = lg - 1; i > 0; i-- )
84 : {
85 571587174 : y[i] = L_msu0_sat( L_mult( x[i], 16384 ), x[i - 1], mu ); /* Qx+16 */
86 571587174 : move16();
87 : }
88 3380208 : y[0] = L_msu0_sat( L_mult( x[0], 16384 ), *mem, mu ); /* Qx+16 */
89 3380208 : move16();
90 :
91 3380208 : *mem = temp; /* Qx */
92 3380208 : move16();
93 :
94 3380208 : return;
95 : }
96 : #endif
97 : /*-------------------------------------------------------------*
98 : * preemph_ivas_fx()
99 : *
100 : * Preemphasis: filtering through 1 - mu z^-1
101 : *-------------------------------------------------------------*/
102 :
103 85065 : void preemph_ivas_fx(
104 : Word32 *signal, /* i/o: signal Qx*/
105 : const Word16 mu, /* i : preemphasis factor Q15*/
106 : const Word16 L, /* i : vector size Q0*/
107 : Word32 *mem /* i/o: memory (x[-1]) Qx*/
108 : )
109 : {
110 : Word16 i;
111 : Word32 temp;
112 :
113 85065 : temp = signal[L - 1]; /* Qx */
114 85065 : move32();
115 25347024 : FOR( i = L - 1; i > 0; i-- )
116 : {
117 25261959 : signal[i] = L_sub( signal[i], Mpy_32_16_1( signal[i - 1], mu ) ); /* Qx */
118 25261959 : move32();
119 : }
120 :
121 85065 : signal[0] = L_sub( signal[0], Mpy_32_16_1( *mem, mu ) ); /* Qx */
122 85065 : move32();
123 85065 : *mem = temp; /* Qx */
124 85065 : move32();
125 :
126 85065 : return;
127 : }
128 :
129 : /*
130 : * E_UTIL_f_preemph2
131 : *
132 : * Parameters:
133 : * shift I: scale output
134 : * signal I/O: signal Qx/Qx+shift
135 : * mu I: preemphasis factor Q15
136 : * L I: vector size
137 : * mem I/O: memory (x[-1])
138 : *
139 : * Function:
140 : * Filtering through 1 - mu z^-1
141 : *
142 : * Returns:
143 : * void
144 : */
145 1105694 : void E_UTIL_f_preemph2(
146 : Word16 shift, /* Q0 */
147 : Word16 *signal, /* Qx */
148 : const Word16 mu, /* Q15 */
149 : const Word16 lg, /* Q0 */
150 : Word16 *mem /* Qx */
151 : )
152 : {
153 : Word16 i, temp;
154 : Word32 L_tmp;
155 :
156 1105694 : temp = signal[lg - 1]; /* Qx */
157 1105694 : move16();
158 :
159 592028896 : FOR( i = lg - 1; i > 0; i-- )
160 : {
161 590923202 : L_tmp = L_mult( signal[i], 16384 ); /* Qx + 15 */
162 590923202 : L_tmp = L_msu0_sat( L_tmp, signal[i - 1], mu ); /* Qx + 15 */
163 590923202 : L_tmp = L_shl_sat( L_tmp, add( shift, 1 ) ); /* Qx + shift + 16 */
164 590923202 : signal[i] = round_fx_sat( L_tmp ); /* Qx + shift */
165 590923202 : move16();
166 : }
167 :
168 1105694 : L_tmp = L_mult( signal[0], 16384 ); /* Qx + 15 */
169 1105694 : L_tmp = L_msu0_sat( L_tmp, *mem, mu ); /* Qx + 15 */
170 1105694 : L_tmp = L_shl_sat( L_tmp, add( shift, 1 ) ); /* Qx + shift + 16 */
171 1105694 : signal[0] = round_fx_sat( L_tmp ); /* Qx + shift */
172 1105694 : move16();
173 :
174 1105694 : *mem = temp; /* Qx */
175 1105694 : move16();
176 :
177 1105694 : return;
178 : }
179 :
180 :
181 294030 : Word16 E_UTIL_f_preemph3(
182 : Word16 *signal, /* Qx */
183 : const Word16 mu, /* Q15 */
184 : const Word16 lg, /* Q0 */
185 : Word16 *mem, /* Qx */
186 : Word16 bits /* Q0 */
187 : )
188 : {
189 : Word16 i, QVal, mus, tmp_fixed, Q_new;
190 : Word32 L_tmp, L_maxloc;
191 :
192 :
193 294030 : QVal = shl( 1, sub( 15, bits ) ); /* Q15 - bits */
194 294030 : mus = shr( mu, bits ); /* Q15 - bits */
195 :
196 294030 : L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
197 294030 : L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
198 294030 : L_maxloc = L_abs( L_tmp );
199 :
200 134170852 : FOR( i = 1; i < lg; i++ )
201 : {
202 133876822 : L_tmp = L_mult( signal[i], QVal ); /* Qx + Q16 - bits */
203 133876822 : L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
204 133876822 : L_tmp = L_abs( L_tmp );
205 133876822 : L_maxloc = L_max( L_tmp, L_maxloc );
206 : }
207 :
208 294030 : tmp_fixed = extract_h( L_maxloc ); /* Qx - bits */
209 :
210 294030 : Q_new = Q_MAX;
211 294030 : move16();
212 294030 : IF( tmp_fixed != 0 )
213 : {
214 274894 : Q_new = sub( norm_s( tmp_fixed ), bits );
215 274894 : Q_new = s_max( Q_new, 0 );
216 274894 : Q_new = s_min( Q_new, Q_MAX );
217 : }
218 :
219 294030 : tmp_fixed = signal[lg - 1]; /* Qx */
220 294030 : move16();
221 :
222 134170852 : FOR( i = lg - 1; i > 0; i-- )
223 : {
224 133876822 : L_tmp = L_mult( signal[i], QVal ); /* Qx + Q16 - bits */
225 133876822 : L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
226 133876822 : L_tmp = L_shl( L_tmp, Q_new ); /* Qx + Q16 + Q_new - bits */
227 133876822 : signal[i] = round_fx( L_tmp ); /* Qx + Q_new - bits */
228 133876822 : move16();
229 : }
230 :
231 294030 : L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
232 294030 : L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
233 294030 : L_tmp = L_shl( L_tmp, Q_new ); /* Qx + Q16 + Q_new - bits */
234 294030 : signal[0] = round_fx( L_tmp ); /* Qx + Q_new - bits */
235 294030 : move16();
236 294030 : *mem = tmp_fixed;
237 294030 : move16();
238 :
239 294030 : return Q_new;
240 : }
241 :
242 4168 : Word16 E_UTIL_f_preemph3_ivas_fx(
243 : Word16 *signal, /* Qx */
244 : const Word16 mu, /* Q15 */
245 : const Word16 lg, /* Q0 */
246 : Word16 *mem, /* Qx */
247 : Word16 bits /* Q0 */
248 : )
249 : {
250 : Word16 i, QVal, mus, tmp_fixed, Q_new;
251 : Word32 L_tmp, L_maxloc;
252 :
253 :
254 4168 : QVal = shl( 1, sub( 15, bits ) ); /* Q15 - bits */
255 4168 : mus = shr( mu, bits ); /* Q15 - bits */
256 :
257 4168 : L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
258 4168 : L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
259 4168 : L_maxloc = L_abs( L_tmp );
260 :
261 3557882 : FOR( i = 1; i < lg; i++ )
262 : {
263 3553714 : L_tmp = L_mult( signal[i], QVal ); /* Qx + Q16 - bits */
264 3553714 : L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
265 3553714 : L_tmp = L_abs( L_tmp );
266 3553714 : L_maxloc = L_max( L_tmp, L_maxloc );
267 : }
268 :
269 4168 : tmp_fixed = extract_h( L_maxloc ); /* Qx - bits */
270 :
271 4168 : Q_new = Q_MAX;
272 4168 : move16();
273 4168 : IF( tmp_fixed != 0 )
274 : {
275 3439 : Q_new = sub( norm_s( tmp_fixed ), bits );
276 3439 : Q_new = s_max( Q_new, 0 );
277 3439 : Q_new = sub( s_min( Q_new, Q_MAX ), 1 );
278 : }
279 :
280 4168 : tmp_fixed = signal[lg - 1];
281 4168 : move16();
282 :
283 3557882 : FOR( i = sub( lg, 1 ); i > 0; i-- )
284 : {
285 3553714 : L_tmp = L_mult( signal[i], QVal ); /* Qx + Q16 - bits */
286 3553714 : L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
287 3553714 : L_tmp = L_shl( L_tmp, Q_new ); /* Qx + Q16 + Q_new - bits */
288 3553714 : signal[i] = round_fx( L_tmp ); /* Qx + Q_new - bits */
289 3553714 : move16();
290 : }
291 :
292 4168 : L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
293 4168 : L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
294 4168 : L_tmp = L_shl( L_tmp, Q_new ); /* Qx + Q_new + Q16 - bits */
295 4168 : signal[0] = round_fx( L_tmp ); /* Qx + Q_new - bits */
296 4168 : move16();
297 4168 : *mem = tmp_fixed;
298 4168 : move16();
299 :
300 4168 : return Q_new;
301 : }
|