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 : /*====================================================================================
34 : EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
35 : ====================================================================================*/
36 :
37 : #include <stdint.h>
38 : #include "options.h"
39 : #ifdef DEBUGGING
40 : #include "debug.h"
41 : #endif
42 : #include "cnst.h"
43 : #include "prot.h"
44 : #include "rom_com.h"
45 : #include <assert.h>
46 : #include "wmc_auto.h"
47 : #ifdef DEBUG_PLOT
48 : #include "deb_out.h"
49 : #endif
50 :
51 : /*--------------------------------------------------------------------------*
52 : * mvr2r_inv()
53 : *
54 : *
55 : *--------------------------------------------------------------------------*/
56 :
57 2001231 : static void mvr2r_inv(
58 : const float *in, /* i : input vector */
59 : float *out, /* o : output vector */
60 : const int16_t L, /* i : length */
61 : const int16_t decimate /* i : decimation flag [-1,1] */
62 : )
63 : {
64 : int16_t i;
65 :
66 2001231 : in = in + (int16_t) ( ( decimate - 1 ) / 2 );
67 2001231 : out = out + L - 1;
68 :
69 195703919 : for ( i = 0; i < L; i++ )
70 : {
71 193702688 : *out = *in;
72 193702688 : in += decimate;
73 193702688 : out--;
74 : }
75 :
76 2001231 : return;
77 : }
78 :
79 : /*--------------------------------------------------------------------------*
80 : * mvr2r_dec()
81 : *
82 : *
83 : *--------------------------------------------------------------------------*/
84 :
85 1812944 : static void mvr2r_dec(
86 : const float *in, /* i : input vector */
87 : float *out, /* o : output vector */
88 : int16_t L, /* i : length */
89 : int16_t decimate /* i : decimation flag [-1,1] */
90 : )
91 : {
92 : int16_t i;
93 1812944 : in = in + (int16_t) ( ( decimate - 1 ) / 2 );
94 181120784 : for ( i = 0; i < L; i++ )
95 : {
96 179307840 : *out = *in;
97 179307840 : in += decimate;
98 179307840 : out++;
99 : }
100 :
101 1812944 : return;
102 : }
103 :
104 : /*--------------------------------------------------------------------------*
105 : * copy_win()
106 : *
107 : *
108 : *--------------------------------------------------------------------------*/
109 :
110 3814175 : static void copy_win(
111 : float *out_win, /* o : output window buffer */
112 : const int16_t nb_zero, /* i : length of zero padding */
113 : const float *in_win, /* i : input window */
114 : const int16_t win_lenght, /* i : length */
115 : const int16_t nb_one, /* i : length of flat section (ones) */
116 : const int16_t decimate /* i : input window */
117 : )
118 : {
119 3814175 : if ( decimate < 0 )
120 : {
121 2001231 : set_f( out_win, 1, nb_one );
122 2001231 : mvr2r_inv( in_win, out_win + nb_one, win_lenght, -decimate );
123 2001231 : set_f( out_win + win_lenght + nb_one, 0, nb_zero );
124 : }
125 : else
126 : {
127 1812944 : set_f( out_win, 0, nb_zero );
128 1812944 : mvr2r_dec( in_win, out_win + nb_zero, win_lenght, decimate );
129 1812944 : set_f( out_win + nb_zero + win_lenght, 1, nb_one );
130 : }
131 :
132 3814175 : return;
133 : }
134 :
135 : /*--------------------------------------------------------------------------*
136 : * tcx_get_windows_mode1()
137 : *
138 : *
139 : *--------------------------------------------------------------------------*/
140 :
141 82807300 : void tcx_get_windows_mode1(
142 : const int16_t left_mode, /* i : overlap mode of left window half */
143 : const int16_t right_mode, /* i : overlap mode of right window half */
144 : float *left_win, /* o : left overlap window */
145 : float *right_win, /* o : right overlap window */
146 : float *left_win_int, /* o : left overlap window */
147 : float *right_win_int, /* o : right overlap window */
148 : const int16_t L /* i : length */
149 : )
150 : {
151 : /* Left part */
152 82807300 : if ( left_mode == MIN_OVERLAP || left_mode == TRANSITION_OVERLAP )
153 : {
154 238455 : if ( L == 256 || L == 512 )
155 : {
156 23610 : copy_win( left_win, R1_25 - 4 * R2_25 / 7, small_overlap_25, R2_25 / 7, 3 * R2_25 / 7, 1 );
157 : }
158 : else
159 : {
160 214845 : copy_win( left_win, R1_48 - 4 * R2_48 / 7, small_overlap_48, R2_48 / 7, 3 * R2_48 / 7, 1 );
161 214845 : copy_win( left_win_int, R1_16 - 4 * R2_16 / 7, small_overlap_int, R2_16 / 7, 3 * R2_16 / 7, 1 );
162 : }
163 : }
164 82568845 : else if ( left_mode == HALF_OVERLAP )
165 : {
166 717167 : if ( L == 256 || L == 512 )
167 : {
168 74690 : copy_win( left_win, R1_25 - 5 * R2_25 / 7, half_overlap_25, 3 * R2_25 / 7, 2 * R2_25 / 7, 1 );
169 : }
170 : else
171 : {
172 642477 : copy_win( left_win, R1_48 - 5 * R2_48 / 7, half_overlap_48, 3 * R2_48 / 7, 2 * R2_48 / 7, 1 );
173 642477 : copy_win( left_win_int, R1_16 - 5 * R2_16 / 7, half_overlap_int, 3 * R2_16 / 7, 2 * R2_16 / 7, 1 );
174 : }
175 : }
176 81851678 : else if ( left_mode == ALDO_WINDOW )
177 : {
178 : /* ALDO */
179 81851678 : if ( L == 256 || L == 512 )
180 : {
181 9876303 : mvr2r( window_256kHz, left_win, R1_25 );
182 : }
183 : else
184 : {
185 71975375 : mvr2r( window_48kHz, left_win, R1_48 );
186 71975375 : mvr2r( window_8_16_32kHz, left_win_int, R1_16 );
187 : }
188 : }
189 : else
190 : {
191 0 : assert( !"Window not supported" );
192 : }
193 :
194 : /* Right part */
195 82807300 : if ( right_mode == MIN_OVERLAP || right_mode == TRANSITION_OVERLAP )
196 : {
197 :
198 295642 : if ( L == 256 || L == 512 )
199 : {
200 43461 : copy_win( right_win, 3 * R2_25 / 7, small_overlap_25, R2_25 / 7, 3 * R2_25 / 7, -1 );
201 : }
202 : else
203 : {
204 252181 : copy_win( right_win, 3 * R2_48 / 7, small_overlap_48, R2_48 / 7, 3 * R2_48 / 7, -1 );
205 252181 : copy_win( right_win_int, 3 * R2_16 / 7, small_overlap_int, R2_16 / 7, 3 * R2_16 / 7, -1 );
206 : }
207 : }
208 82511658 : else if ( right_mode == HALF_OVERLAP )
209 : {
210 :
211 774027 : if ( L == 256 || L == 512 )
212 : {
213 94646 : copy_win( right_win, 2 * R2_25 / 7, half_overlap_25, 3 * R2_25 / 7, 2 * R2_25 / 7, -1 );
214 : }
215 : else
216 : {
217 679381 : copy_win( right_win, 2 * R2_48 / 7, half_overlap_48, 3 * R2_48 / 7, 2 * R2_48 / 7, -1 );
218 679381 : copy_win( right_win_int, 2 * R2_16 / 7, half_overlap_int, 3 * R2_16 / 7, 2 * R2_16 / 7, -1 );
219 : }
220 : }
221 81737631 : else if ( right_mode == ALDO_WINDOW )
222 : {
223 81737631 : if ( L == 256 || L == 512 )
224 : {
225 9836496 : mvr2r( window_256kHz + R1_25, right_win, R2_25 );
226 : }
227 : else
228 : {
229 71901135 : mvr2r( window_48kHz + R1_48, right_win, R2_48 );
230 71901135 : mvr2r( window_8_16_32kHz + R1_16, right_win_int, R2_16 );
231 : }
232 : }
233 : else
234 : {
235 0 : assert( !"Window not supported" );
236 : }
237 :
238 82807300 : return;
239 : }
240 :
241 :
242 : /*--------------------------------------------------------------------------*
243 : * wtda()
244 : *
245 : * Windowing and time-domain aliasing
246 : *--------------------------------------------------------------------------*/
247 :
248 13285345 : void wtda(
249 : const float *new_audio, /* i : input audio */
250 : float *wtda_audio, /* o : windowed audio */
251 : float *old_wtda, /* i/o: windowed audio from previous frame */
252 : const int16_t left_mode, /* i : window overlap of previous frame (0: full, 2: none, or 3: half) */
253 : const int16_t right_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */
254 : const int16_t L /* i : length */
255 : )
256 : {
257 : int16_t i, decimate, decay;
258 : int16_t n, windecay48, windecay16;
259 : const float *allsig_l, *allsig_r;
260 : float win_right[R2_48];
261 : float win_int_left[R1_16];
262 : float win_left[R1_48];
263 : float win_int_right[R2_16];
264 :
265 13285345 : tcx_get_windows_mode1( left_mode, right_mode, win_left, win_right, win_int_left, win_int_right, L );
266 :
267 13285345 : decimate = 1; /* L_FRAME 48k */
268 13285345 : decay = 0;
269 13285345 : windecay48 = (int16_t) ( 2 * ( (float) L_FRAME48k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_48;
270 :
271 13285345 : if ( L == L_FRAME32k || L == L_FRAME16k )
272 : {
273 3873438 : decimate = 3;
274 3873438 : decay = 1;
275 : }
276 9411907 : else if ( L == L_FRAME8k )
277 : {
278 1027 : decimate = 6;
279 1027 : decay = 2;
280 : }
281 :
282 13285345 : n = (int16_t) ( (float) L * N_ZERO_MDCT_NS / FRAME_SIZE_NS );
283 :
284 13285345 : windecay16 = (int16_t) ( 2 * ( (float) L_FRAME16k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_16;
285 :
286 : /* algorithmic delay reduction */
287 13285345 : i = 0;
288 :
289 13285345 : if ( old_wtda == NULL )
290 : {
291 12630932 : allsig_r = new_audio + n;
292 12630932 : allsig_l = new_audio + n - L;
293 : #ifdef DEBUG_PLOT
294 : sendDebout( "tcx_mdct", 2 * L, 1, "mdct_sig", MTV_FLOAT, allsig_l );
295 : #endif
296 : }
297 : else
298 : {
299 654413 : allsig_r = new_audio + n;
300 654413 : allsig_l = old_wtda + n;
301 : }
302 :
303 13285345 : if ( L == L_FRAME32k )
304 : {
305 193131431 : for ( i = 0; i < L / 2 - n; i += 2 )
306 : {
307 190411270 : wtda_audio[i] = -allsig_r[L / 2 - i - 1] * win_int_right[3 * L_FRAME16k / 2 - i / 2 - 1 - windecay16] - allsig_r[L / 2 + i] * win_int_right[3 * L_FRAME16k / 2 + i / 2 - windecay16];
308 190411270 : wtda_audio[i + 1] = -allsig_r[L / 2 - ( i + 1 ) - 1] * win_right[( 3 * L_FRAME16k / 2 - i / 2 - 1 ) * decimate + decay - windecay48] - allsig_r[L / 2 + i + 1] * win_right[( 3 * L_FRAME16k / 2 + 1 + i / 2 ) * decimate - decay - 1 - windecay48];
309 : }
310 :
311 247534651 : for ( i = L / 2 - n; i < L / 2; i += 2 )
312 : {
313 244814490 : wtda_audio[i] = -allsig_r[L / 2 - i - 1];
314 244814490 : wtda_audio[i + 1] = -allsig_r[L / 2 - ( i + 1 ) - 1];
315 : }
316 247534651 : for ( i = 0; i < n; i += 2 )
317 : {
318 244814490 : wtda_audio[i + L / 2] = allsig_l[i] * win_left[( i / 2 ) * decimate + decay] - new_audio[n - i - 1];
319 244814490 : wtda_audio[i + L / 2 + 1] = allsig_l[i + 1] * win_int_left[i / 2] - new_audio[n - ( i + 1 ) - 1];
320 : }
321 :
322 193131431 : for ( i = n; i < L / 2; i += 2 )
323 : {
324 190411270 : wtda_audio[i + L / 2] = allsig_l[i] * win_left[( i / 2 ) * decimate + decay] - allsig_l[L - i - 1] * win_left[( L / 2 - i / 2 ) * decimate - 1 - decay];
325 190411270 : wtda_audio[i + L / 2 + 1] = allsig_l[i + 1] * win_int_left[i / 2] - allsig_l[L - ( i + 1 ) - 1] * win_int_left[L / 2 - i / 2 - 1];
326 : }
327 : }
328 : else
329 : {
330 2067615319 : for ( i = 0; i < L / 2 - n; i++ )
331 : {
332 2057050135 : wtda_audio[i] = -allsig_r[L / 2 - i - 1] * win_right[3 * L / 2 * decimate - ( i + 1 ) * decimate + decay - windecay48] - allsig_r[L / 2 + i] * win_right[3 * L / 2 * decimate - 1 + ( i + 1 ) * decimate - decay - windecay48];
333 : }
334 :
335 2655343929 : for ( i = L / 2 - n; i < L / 2; i++ )
336 : {
337 2644778745 : wtda_audio[i] = -allsig_r[L / 2 - i - 1];
338 : }
339 :
340 2655343929 : for ( i = 0; i < n; i++ )
341 : {
342 2644778745 : wtda_audio[i + L / 2] = allsig_l[i] * win_left[i * decimate + decay] - new_audio[n - i - 1];
343 : }
344 :
345 2067615319 : for ( i = n; i < L / 2; i++ )
346 : {
347 2057050135 : wtda_audio[i + L / 2] = allsig_l[i] * win_left[i * decimate + decay] - allsig_l[L - i - 1] * win_left[L * decimate - i * decimate - 1 - decay];
348 : }
349 : }
350 :
351 13285345 : if ( old_wtda != NULL )
352 : {
353 654413 : mvr2r( new_audio, old_wtda, L );
354 : }
355 :
356 13285345 : return;
357 : }
358 :
359 9895360 : void wtda_ext(
360 : const float *new_audio, /* i : input audio */
361 : float *wtda_audio, /* o : windowed audio */
362 : const int16_t left_mode, /* i : window overlap of previous frame (0: full, 2: none, or 3: half) */
363 : const int16_t right_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */
364 : const int16_t L, /* i : length */
365 : const uint16_t kernel_type /* i : transform kernel type (0 - 3) */
366 : )
367 : {
368 9895360 : const float sign_left = ( kernel_type >= 2 ? -1.f : 1.f );
369 9895360 : const float sign_right = ( kernel_type & 1 ? 1.f : -1.f );
370 : int16_t i, decimate, decay;
371 : int16_t n, windecay48, windecay16;
372 : const float *allsig_l, *allsig_r;
373 : float win_right[R2_48];
374 : float win_int_left[R1_16];
375 : float win_left[R1_48];
376 : float win_int_right[R2_16];
377 :
378 9895360 : tcx_get_windows_mode1( left_mode, right_mode, win_left, win_right, win_int_left, win_int_right, L );
379 :
380 9895360 : decimate = 1; /* L_FRAME 48k */
381 9895360 : decay = 0;
382 9895360 : windecay48 = (int16_t) ( 2 * ( (float) L_FRAME48k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_48;
383 :
384 9895360 : if ( L == L_FRAME32k || L == L_FRAME16k )
385 : {
386 3015952 : decimate = 3;
387 3015952 : decay = 1;
388 : }
389 6879408 : else if ( L == L_FRAME8k )
390 : {
391 0 : decimate = 6;
392 0 : decay = 2;
393 : }
394 :
395 9895360 : n = (int16_t) ( (float) L * N_ZERO_MDCT_NS / FRAME_SIZE_NS );
396 :
397 9895360 : windecay16 = (int16_t) ( 2 * ( (float) L_FRAME16k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_16;
398 :
399 9895360 : allsig_r = new_audio + n;
400 9895360 : allsig_l = new_audio + n - L;
401 :
402 9895360 : if ( L == L_FRAME32k )
403 : {
404 153669773 : for ( i = 0; i < L / 2 - n; i += 2 )
405 : {
406 151505410 : wtda_audio[i] = -allsig_r[L / 2 - i - 1] * win_int_right[3 * L_FRAME16k / 2 - i / 2 - 1 - windecay16] + sign_right * allsig_r[L / 2 + i] * win_int_right[3 * L_FRAME16k / 2 + i / 2 - windecay16];
407 151505410 : wtda_audio[i + 1] = -allsig_r[L / 2 - ( i + 1 ) - 1] * win_right[( 3 * L_FRAME16k / 2 - i / 2 - 1 ) * decimate + decay - windecay48] + sign_right * allsig_r[L / 2 + i + 1] * win_right[( 3 * L_FRAME16k / 2 + 1 + i / 2 ) * decimate - decay - 1 - windecay48];
408 : }
409 :
410 196957033 : for ( i = L / 2 - n; i < L / 2; i += 2 )
411 : {
412 194792670 : wtda_audio[i] = -allsig_r[L / 2 - i - 1];
413 194792670 : wtda_audio[i + 1] = -allsig_r[L / 2 - ( i + 1 ) - 1];
414 : }
415 196957033 : for ( i = 0; i < n; i += 2 )
416 : {
417 194792670 : wtda_audio[i + L / 2] = sign_left * allsig_l[i] * win_left[( i / 2 ) * decimate + decay] - new_audio[n - i - 1];
418 194792670 : wtda_audio[i + L / 2 + 1] = sign_left * allsig_l[i + 1] * win_int_left[i / 2] - new_audio[n - ( i + 1 ) - 1];
419 : }
420 :
421 153669773 : for ( i = n; i < L / 2; i += 2 )
422 : {
423 151505410 : wtda_audio[i + L / 2] = sign_left * allsig_l[i] * win_left[( i / 2 ) * decimate + decay] - allsig_l[L - i - 1] * win_left[( L / 2 - i / 2 ) * decimate - 1 - decay];
424 151505410 : wtda_audio[i + L / 2 + 1] = sign_left * allsig_l[i + 1] * win_int_left[i / 2] - allsig_l[L - ( i + 1 ) - 1] * win_int_left[L / 2 - i / 2 - 1];
425 : }
426 : }
427 : else
428 : {
429 1512017907 : for ( i = 0; i < L / 2 - n; i++ )
430 : {
431 1504286910 : wtda_audio[i] = -allsig_r[L / 2 - i - 1] * win_right[3 * L / 2 * decimate - ( i + 1 ) * decimate + decay - windecay48] + sign_right * allsig_r[L / 2 + i] * win_right[3 * L / 2 * decimate - 1 + ( i + 1 ) * decimate - decay - windecay48];
432 : }
433 :
434 1941814167 : for ( i = L / 2 - n; i < L / 2; i++ )
435 : {
436 1934083170 : wtda_audio[i] = -allsig_r[L / 2 - i - 1];
437 : }
438 :
439 1941814167 : for ( i = 0; i < n; i++ )
440 : {
441 1934083170 : wtda_audio[i + L / 2] = sign_left * allsig_l[i] * win_left[i * decimate + decay] - new_audio[n - i - 1];
442 : }
443 :
444 1512017907 : for ( i = n; i < L / 2; i++ )
445 : {
446 1504286910 : wtda_audio[i + L / 2] = sign_left * allsig_l[i] * win_left[i * decimate + decay] - allsig_l[L - i - 1] * win_left[L * decimate - i * decimate - 1 - decay];
447 : }
448 : }
449 :
450 9895360 : return;
451 : }
|