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 : #include <assert.h>
34 : #include <stdint.h>
35 : #include "options.h"
36 : #include <math.h>
37 : #include "cnst.h"
38 : #include "rom_com.h"
39 : #include "rom_dec.h"
40 : #include "prot.h"
41 : #include "ivas_prot.h"
42 : #include "ivas_cnst.h"
43 : #include "ivas_rom_com.h"
44 : #include "ivas_rom_dec.h"
45 : #ifdef DEBUGGING
46 : #include "debug.h"
47 : #endif
48 : #include "wmc_auto.h"
49 :
50 :
51 : /*-------------------------------------------------------------------*
52 : * Local constants
53 : *-------------------------------------------------------------------*/
54 :
55 : #define STEFI_DELAY_IND( d, buf_ind ) ( ( buf_ind ) + STEREO_DFT_PAST_MAX - ( d ) + 1 ) % STEREO_DFT_PAST_MAX
56 :
57 : #define STEREO_DFT_RES_RATIO_LIMIT 0.18f
58 : #define STEREO_DFT_LT_PREDGAIN_UPD 0.1f
59 : #define STEREO_DFT_VR_PREDGAIN_UPD 0.1f
60 : #define STEREO_DFT_STEFFI_PG_THRESHOLD 0.6f
61 : #define STEREO_DFT_STEFFI_RATIO_UP_HIGH 0.03f
62 : #define STEREO_DFT_STEFFI_RATIO_DOWN_HIGH 0.05f
63 : #define STEREO_DFT_STEFFI_RATIO_UP_LOW 0.1f
64 : #define STEREO_DFT_STEFFI_RATIO_DOWN_LOW 0.001f
65 : #define STEREO_DFT_STEFFI_DELAY_SHORT 2
66 : #define STEREO_DFT_STEFFI_DELAY_LONG 4
67 : #define STEREO_DFT_STEFFI_DELAY_OFFSET 2
68 : #define STEREO_DFT_STEFFI_GAIN_REST_AMT 0.6f
69 : #define STEREO_DFT_STEFFI_GAIN_AMP 1.0f
70 :
71 :
72 : #define STEREO_DFT_BPF_SIZE 40 /* BPF: Number of weights for BPF in DFT: 40*40Hz=1.6kHz*/
73 :
74 :
75 : /*-------------------------------------------------------------------------
76 : * Local function prototypes
77 : *-------------------------------------------------------------------------*/
78 :
79 : static void stereo_dft_dec_open( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, const int32_t output_Fs, const int16_t nchan_transport );
80 :
81 : static void stereo_dft_compute_td_stefi_params( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, const float samp_ratio );
82 :
83 : static void stereo_dft_adapt_sf_delay( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, float *pPredGain );
84 :
85 :
86 : /*-------------------------------------------------------------------------
87 : * stereo_dft_dequantize_res_gains()
88 : *
89 : * joint dequantizer for side channel prediction gain and residual energy
90 : *-------------------------------------------------------------------------*/
91 :
92 19994022 : static void stereo_dft_dequantize_res_gains(
93 : int16_t *ind1,
94 : int16_t *ind2,
95 : float *gout,
96 : float *rout,
97 : const int16_t N )
98 : {
99 : int16_t i, index;
100 :
101 39988044 : for ( i = 0; i < N; i++ )
102 : {
103 : /* Ensure the indices are within range -- may go out of range due to frame loss */
104 19994022 : ind1[i] = check_bounds_s( ind1[i], 0, 30 );
105 19994022 : ind2[i] = check_bounds_s( ind2[i], 0, 7 );
106 19994022 : index = ( ( ind1[i] < 15 ? 15 - ind1[i] : ind1[i] - 15 ) << 3 ) + ind2[i];
107 19994022 : gout[i] = ind1[i] < 15 ? -dft_res_gains_q[index][0] : dft_res_gains_q[index][0];
108 19994022 : rout[i] = dft_res_gains_q[index][1];
109 : }
110 :
111 19994022 : return;
112 : }
113 :
114 : /*---------------------------------------------------------------------------
115 : * stereo_dft_dequantize_res_gains_f()
116 : *
117 : * returns interepolated values for non-integer indices
118 : *---------------------------------------------------------------------------*/
119 :
120 13466273 : static void stereo_dft_dequantize_res_gains_f(
121 : float *ind1,
122 : float *ind2,
123 : float *gout,
124 : float *rout,
125 : const int16_t N )
126 : {
127 : int16_t i, i1, j1, sign, ji, ij;
128 : float fi, fj;
129 :
130 26932546 : for ( i = 0; i < N; i++ )
131 : {
132 : /* Ensure the indices are within range -- may go out of range due to frame loss */
133 13466273 : ind1[i] = check_bounds( ind1[i], 0, 31 );
134 13466273 : ind2[i] = check_bounds( ind2[i], 0, 7 );
135 :
136 : /* compensate for the offset and extract/remove sign of first index */
137 13466273 : sign = ind1[i] < 15 ? -1 : 1;
138 13466273 : i1 = (int16_t) floorf( ind1[i] < 15 ? 15 - ind1[i] : ind1[i] - 15 );
139 13466273 : fi = ( ind1[i] < 15 ? 15 - ind1[i] : ind1[i] - 15 ) - i1;
140 :
141 13466273 : j1 = (int16_t) floorf( ind2[i] );
142 13466273 : fj = ind2[i] - j1;
143 :
144 : /* choose base indices for interpolation */
145 13466273 : ji = min( fj < .5 ? j1 : j1 + 1, 7 );
146 13466273 : ij = min( fi < .5 ? i1 : i1 + 1, 15 );
147 :
148 : /* interpolate values from table */
149 13466273 : if ( i1 < 15 )
150 : {
151 13145493 : gout[i] = sign * ( ( 1 - fi ) * dft_res_gains_q[( i1 << 3 ) + ji][0] + fi * dft_res_gains_q[( ( i1 + 1 ) << 3 ) + ji][0] );
152 : }
153 : else
154 : {
155 320780 : gout[i] = sign * dft_res_gains_q[120 + ji][0];
156 : }
157 :
158 13466273 : if ( j1 < 7 )
159 : {
160 13462368 : rout[i] = ( 1 - fj ) * dft_res_gains_q[( ij << 3 ) + j1][1] + fj * dft_res_gains_q[( ij << 3 ) + j1 + 1][1];
161 : }
162 : else
163 : {
164 3905 : rout[i] = dft_res_gains_q[( ij << 3 ) + 7][1];
165 : }
166 : }
167 :
168 13466273 : return;
169 : }
170 :
171 :
172 : /*-------------------------------------------------------------------------
173 : * stereo_dft_dequantize_ipd()
174 : *
175 : * Dequantize IPDs
176 : *-------------------------------------------------------------------------*/
177 :
178 67631 : static void stereo_dft_dequantize_ipd(
179 : int16_t *ind,
180 : float *out,
181 : const int16_t N,
182 : const int16_t bits )
183 : {
184 : int16_t i;
185 : float delta;
186 :
187 67631 : if ( bits == 2 ) /* 2-bit phase quantization for the highest frequency band only */
188 : {
189 2346 : delta = EVS_PI / 2.f;
190 : }
191 65285 : else if ( bits == 3 )
192 : {
193 0 : delta = EVS_PI / 4.f;
194 : }
195 65285 : else if ( bits == 4 )
196 : {
197 65285 : delta = EVS_PI / 8.f;
198 : }
199 : else
200 : {
201 0 : delta = EVS_PI / 4.f;
202 0 : assert( 0 );
203 : }
204 :
205 135262 : for ( i = 0; i < N; i++ )
206 : {
207 67631 : out[i] = ind[i] * delta - EVS_PI;
208 : }
209 :
210 67631 : return;
211 : }
212 :
213 :
214 : /*-------------------------------------------------------------------------
215 : * stereo_dft_dequantize_itd()
216 : *
217 : * Dequantize ITDs
218 : *-------------------------------------------------------------------------*/
219 :
220 718550 : void stereo_dft_dequantize_itd(
221 : int16_t *ind,
222 : float *out,
223 : const int32_t output_Fs )
224 : {
225 : int16_t itd;
226 : int16_t mask;
227 :
228 718550 : mask = ( 1 << ( STEREO_DFT_ITD_NBITS - 1 ) ) - 1;
229 718550 : itd = ( ind[0] & mask ) + STEREO_DFT_ITD_MIN;
230 :
231 718550 : if ( ( ind[0] >> ( STEREO_DFT_ITD_NBITS - 1 ) ) )
232 : {
233 347550 : itd *= -1;
234 : }
235 718550 : assert( ( ABSVAL( itd ) <= STEREO_DFT_ITD_MAX ) && ( ABSVAL( itd ) >= STEREO_DFT_ITD_MIN ) );
236 :
237 : /*Convert back @ fs*/
238 718550 : *out = (float) ( itd * output_Fs ) / ( (float) ( STEREO_DFT_ITD_FS ) );
239 :
240 718550 : return;
241 : }
242 :
243 :
244 : /*-------------------------------------------------------------------------
245 : * stereo_dft_dec_create()
246 : *
247 : * Create DFT stereo handle
248 : *------------------------------------------------------------------------*/
249 :
250 67722 : ivas_error stereo_dft_dec_create(
251 : STEREO_DFT_DEC_DATA_HANDLE *hStereoDft, /* i/o: decoder DFT stereo handle */
252 : const int32_t element_brate, /* i : element bitrate */
253 : const int32_t output_Fs, /* i : output sampling rate */
254 : const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */
255 : const int16_t nchan_transport /* i : number of transport channels */
256 : )
257 : {
258 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft_loc;
259 : int16_t tmpS;
260 :
261 67722 : if ( *hStereoDft != NULL )
262 : {
263 0 : return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: DFT Stereo memory already allocated\n" );
264 : }
265 :
266 67722 : if ( ( hStereoDft_loc = (STEREO_DFT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_DFT_DEC_DATA ) ) ) == NULL )
267 : {
268 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo\n" ) );
269 : }
270 :
271 67722 : if ( ( hStereoDft_loc->hConfig = (STEREO_DFT_CONFIG_DATA_HANDLE) malloc( sizeof( STEREO_DFT_CONFIG_DATA ) ) ) == NULL )
272 : {
273 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo Config\n" ) );
274 : }
275 :
276 67722 : if ( ( hStereoDft_loc->hBpf = (BPF_DEC_HANDLE) malloc( sizeof( BPF_DEC_DATA ) ) ) == NULL )
277 : {
278 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for BPF handle\n" ) );
279 : }
280 :
281 67722 : if ( ( hStereoDft_loc->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL )
282 : {
283 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TCX-LTP handle\n" ) );
284 : }
285 :
286 67722 : hStereoDft_loc->hConfig->force_mono_transmission = 0;
287 :
288 67722 : if ( sba_dirac_stereo_flag )
289 : {
290 5650 : ivas_sba_dirac_stereo_config( hStereoDft_loc->hConfig );
291 : }
292 : else
293 : {
294 62072 : stereo_dft_config( hStereoDft_loc->hConfig, element_brate, &tmpS, &tmpS );
295 : }
296 :
297 67722 : stereo_dft_dec_open( hStereoDft_loc, output_Fs, nchan_transport );
298 :
299 67722 : *hStereoDft = hStereoDft_loc;
300 :
301 67722 : return IVAS_ERR_OK;
302 : }
303 :
304 :
305 : /*-------------------------------------------------------------------------
306 : * stereo_dft_dec_open()
307 : *
308 : * Open DFT decoder stereo handle
309 : *-------------------------------------------------------------------------*/
310 :
311 67722 : static void stereo_dft_dec_open(
312 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */
313 : const int32_t output_Fs, /* i : output sampling rate */
314 : const int16_t nchan_transport /* i : number of transport channels */
315 : )
316 : {
317 : /*Sizes*/
318 67722 : hStereoDft->N = (int16_t) ( STEREO_DFT_HOP_MAX * output_Fs / 48000 );
319 :
320 : /*Init. DFT sizes*/
321 67722 : hStereoDft->NFFT = (int16_t) ( STEREO_DFT32MS_N_MAX * output_Fs / 48000 );
322 :
323 67722 : hStereoDft->dft_trigo_8k = dft_trigo_32k;
324 67722 : hStereoDft->dft_trigo_12k8 = dft_trigo_12k8;
325 67722 : hStereoDft->dft_trigo_16k = dft_trigo_32k;
326 :
327 67722 : hStereoDft->dft32ms_ovl = (int16_t) ( ( STEREO_DFT32MS_OVL_MAX * output_Fs ) / 48000 );
328 67722 : hStereoDft->win232ms_8k = dft_win232ms_8k;
329 67722 : hStereoDft->win232ms_12k8 = dft_win232ms_12k8;
330 67722 : hStereoDft->win232ms_16k = dft_win232ms_16k;
331 :
332 67722 : hStereoDft->dft32ms_ovl2 = (int16_t) ( ( STEREO_DFT32MS_OVL2_MAX * output_Fs ) / 48000 );
333 67722 : hStereoDft->win32ms_8k = dft_win232ms_8k + 1;
334 67722 : hStereoDft->win32ms_12k8 = dft_win232ms_12k8 + 1;
335 67722 : hStereoDft->win32ms_16k = dft_win232ms_16k + 1;
336 :
337 67722 : if ( output_Fs == 16000 )
338 : {
339 7555 : hStereoDft->dft_trigo = dft_trigo_32k;
340 7555 : hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP;
341 7555 : hStereoDft->win232ms = dft_win232ms_16k;
342 7555 : hStereoDft->win32ms = dft_win232ms_16k + 1;
343 : }
344 60167 : else if ( output_Fs == 32000 )
345 : {
346 12239 : hStereoDft->dft_trigo = dft_trigo_32k;
347 12239 : hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP;
348 12239 : hStereoDft->win232ms = dft_win232ms_32k;
349 12239 : hStereoDft->win32ms = dft_win232ms_32k + 1;
350 : }
351 : else
352 : {
353 47928 : assert( output_Fs == 48000 );
354 47928 : hStereoDft->dft_trigo = dft_trigo_48k;
355 47928 : hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP;
356 47928 : hStereoDft->win232ms = dft_win232ms_48k;
357 47928 : hStereoDft->win32ms = dft_win232ms_48k + 1;
358 : }
359 :
360 67722 : hStereoDft->win_8k = dft_win_8k;
361 :
362 : /*Bands: find the number of bands, Nyquist freq. is not taken into account*/
363 67722 : set_s( hStereoDft->band_res, hStereoDft->hConfig->band_res, STEREO_DFT_DEC_DFT_NB );
364 :
365 67722 : hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[0], hStereoDft->NFFT, DEC );
366 67722 : hStereoDft->hb_stefi_delay = NS2SA( output_Fs, STEREO_DFT_TD_STEFI_DELAY_NS );
367 :
368 67722 : if ( nchan_transport > 2 )
369 : {
370 2228 : hStereoDft->min_smooth_gains = min_smooth_gains2;
371 2228 : hStereoDft->max_smooth_gains = max_smooth_gains2;
372 : }
373 : else
374 : {
375 65494 : hStereoDft->min_smooth_gains = min_smooth_gains1;
376 65494 : hStereoDft->max_smooth_gains = max_smooth_gains1;
377 : }
378 :
379 : /* reset DFT stereo memories */
380 67722 : stereo_dft_dec_reset( hStereoDft );
381 :
382 67722 : return;
383 : }
384 :
385 :
386 : /*-------------------------------------------------------------------------
387 : * stereo_dft_dec_reset()
388 : *
389 : * Reset DFT stereo memories
390 : *------------------------------------------------------------------------*/
391 :
392 67722 : void stereo_dft_dec_reset(
393 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i/o: decoder DFT stereo handle */
394 : )
395 : {
396 : int16_t i;
397 : int16_t j, b;
398 :
399 : /*Configuration*/
400 67722 : set_s( hStereoDft->prm_res, hStereoDft->hConfig->prm_res, STEREO_DFT_DEC_DFT_NB );
401 :
402 : /* SIDE_GAIN */
403 67722 : set_s( hStereoDft->side_gain_index, 15, STEREO_DFT_BAND_MAX );
404 67722 : set_s( hStereoDft->side_gain_index_previous, 15, STEREO_DFT_BAND_MAX );
405 :
406 : /*residual prediction*/
407 67722 : set_s( hStereoDft->res_pred_mode, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_DEC_DFT_NB );
408 338610 : for ( i = 0; i < STEREO_DFT_PAST_MAX; i++ )
409 : {
410 270888 : set_zero( hStereoDft->DFT_past_DMX[i], STEREO_DFT32MS_N_32k );
411 270888 : set_zero( hStereoDft->past_res_pred_gain[i], STEREO_DFT_BAND_MAX );
412 : }
413 :
414 67722 : hStereoDft->past_DMX_pos = 0;
415 :
416 67722 : set_s( hStereoDft->res_pred_index_previous, 0, STEREO_DFT_BAND_MAX );
417 :
418 948108 : for ( i = 0; i < STEREO_DFT_BAND_MAX; i++ )
419 : {
420 880386 : hStereoDft->res_gains_ind[0][i] = 15.f;
421 : }
422 :
423 67722 : set_zero( hStereoDft->res_gains_ind[1], STEREO_DFT_BAND_MAX );
424 :
425 : /*residual coding*/
426 67722 : set_s( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_DEC_DFT_NB );
427 67722 : hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->hConfig->res_cod_mode];
428 67722 : set_zero( hStereoDft->res_cod_mem, STEREO_DFT_OVL_8k );
429 :
430 67722 : hStereoDft->res_pred_band_min = max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
431 :
432 67722 : hStereoDft->stab_fac_smooth_res = 0.f;
433 67722 : bass_psfilter_init( hStereoDft->hBpf );
434 :
435 67722 : tcxltp_dec_init( hStereoDft->hTcxLtpDec, 0, MODE1, IVAS_CPE_DFT, PIT_MAX, 12800 );
436 :
437 67722 : hStereoDft->reverb_flag = 0;
438 :
439 67722 : hStereoDft->bpf_error_signal_last = 0.0f;
440 67722 : hStereoDft->bpf_error_ratio_mem = 1.0f;
441 67722 : hStereoDft->res_hb_nrg_mem = 0.0f;
442 :
443 : /*reset parameters*/
444 67722 : set_zero( hStereoDft->side_gain, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX );
445 67722 : set_zero( hStereoDft->gipd, STEREO_DFT_DEC_DFT_NB );
446 67722 : set_zero( hStereoDft->itd, STEREO_DFT_DEC_DFT_NB );
447 67722 : set_zero( hStereoDft->res_pred_gain, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX );
448 :
449 67722 : hStereoDft->wasTransient = 0;
450 67722 : hStereoDft->attackPresent = 0;
451 :
452 67722 : hStereoDft->lt_pred_gain = 0.0f;
453 67722 : hStereoDft->lt_pred_gain_variation = 0.0f;
454 67722 : hStereoDft->lt_var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT;
455 67722 : hStereoDft->stefi_short_gain = 1.0f;
456 67722 : hStereoDft->stefi_long_gain = 0.0f;
457 :
458 67722 : set_zero( hStereoDft->g_state, STEREO_DFT_BAND_MAX );
459 :
460 67722 : init_basic_allpass( &hStereoDft->ap1, dft_ap_gains[0], dft_ap_delays[0] );
461 67722 : init_basic_allpass( &hStereoDft->ap2, dft_ap_gains[1], dft_ap_delays[1] );
462 67722 : init_basic_allpass( &hStereoDft->ap3, dft_ap_gains[2], dft_ap_delays[2] );
463 :
464 67722 : set_zero( hStereoDft->ap_delay_mem, NS2SA( 16000, DELAY_BWE_TOTAL_NS ) );
465 67722 : set_zero( hStereoDft->ap_fade_mem, STEREO_DFT_ALLPASS_FADELEN_16k );
466 67722 : hStereoDft->ap_wasTransient = 0;
467 67722 : set_zero( hStereoDft->smooth_dmx_nrg, STEREO_DFT_BAND_MAX );
468 67722 : set_zero( hStereoDft->smooth_res_nrg, STEREO_DFT_BAND_MAX );
469 :
470 67722 : set_s( hStereoDft->core_hist, ACELP_CORE, STEREO_DFT_CORE_HIST_MAX );
471 :
472 67722 : set_zero( hStereoDft->hb_stefi_sig, L_FRAME48k + NS2SA( 48000, STEREO_DFT_TD_STEFI_DELAY_NS ) );
473 67722 : set_zero( hStereoDft->hb_nrg, STEREO_DFT_CORE_HIST_MAX );
474 67722 : set_zero( hStereoDft->td_gain, STEREO_DFT_CORE_HIST_MAX );
475 :
476 : /* PLC parameters */
477 67722 : set_zero( hStereoDft->res_mem, STEREO_DFT_RES_BW_MAX );
478 67722 : hStereoDft->time_offs = 0;
479 67722 : hStereoDft->past_dmx_nrg = 0;
480 67722 : hStereoDft->sg_mean = 0.0f;
481 67722 : hStereoDft->sg_mem_corrupt = 0;
482 67722 : hStereoDft->recovery_flg = 0;
483 :
484 880386 : for ( i = 0; i < SBA_DIRAC_STEREO_NUM_BANDS; i++ )
485 : {
486 812664 : set_zero( hStereoDft->smooth_buf[i], SBA_DIRAC_NRG_SMOOTH_LONG + 1 );
487 : }
488 67722 : set_zero( hStereoDft->smooth_fac[0], SBA_DIRAC_STEREO_NUM_BANDS );
489 67722 : set_zero( hStereoDft->smooth_fac[1], SBA_DIRAC_STEREO_NUM_BANDS );
490 :
491 67722 : hStereoDft->itd_xfade_target = 0.0f;
492 67722 : hStereoDft->itd_xfade_step = 0.0f;
493 67722 : hStereoDft->itd_xfade_counter = 0;
494 67722 : hStereoDft->itd_xfade_prev = 0.0f;
495 67722 : hStereoDft->last_active_element_brate = 0;
496 67722 : hStereoDft->ipd_xfade_target = 0.0f;
497 67722 : hStereoDft->ipd_xfade_step = 0.0f;
498 67722 : hStereoDft->ipd_xfade_counter = 0;
499 67722 : hStereoDft->ipd_xfade_prev = 0.0f;
500 :
501 764853 : for ( b = 0; b < hStereoDft->nbands; b++ )
502 : {
503 2091393 : for ( i = 0; i < 2; i++ )
504 : {
505 6971310 : for ( j = 0; j < 4; j++ )
506 : {
507 5577048 : hStereoDft->mixer_mat_smooth[i][j][b] = 0.0f;
508 : }
509 : }
510 : }
511 67722 : hStereoDft->first_frame = 1;
512 67722 : hStereoDft->g_L_prev = 0.f;
513 67722 : hStereoDft->g_R_prev = 0.f;
514 :
515 67722 : return;
516 : }
517 :
518 :
519 : /*-------------------------------------------------------------------------
520 : * stereo_dft_dec_update()
521 : *
522 : * Update DFT memories for new frame
523 : *-------------------------------------------------------------------------*/
524 :
525 3176412 : void stereo_dft_dec_update(
526 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */
527 : const int16_t output_frame, /* i : output frame length */
528 : const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */
529 : )
530 : {
531 : int16_t b, i, k_offset;
532 :
533 : /* Initialization */
534 3176412 : k_offset = STEREO_DFT_OFFSET; /*Add an offset*/
535 :
536 : /* Update parameters */
537 44469768 : for ( i = 0; i < k_offset * STEREO_DFT_BAND_MAX; i++ )
538 : {
539 41293356 : hStereoDft->side_gain[i] = hStereoDft->side_gain[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i];
540 41293356 : hStereoDft->res_pred_gain[i] = hStereoDft->res_pred_gain[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i];
541 : }
542 :
543 6352824 : for ( i = 0; i < k_offset; i++ )
544 : {
545 3176412 : hStereoDft->gipd[i] = hStereoDft->gipd[STEREO_DFT_NBDIV + i];
546 : }
547 :
548 : /* Update configuration memories */
549 6352824 : for ( i = 0; i < k_offset; i++ )
550 : {
551 3176412 : hStereoDft->band_res[i] = hStereoDft->band_res[i + STEREO_DFT_NBDIV];
552 3176412 : hStereoDft->prm_res[i] = hStereoDft->prm_res[i + STEREO_DFT_NBDIV];
553 3176412 : hStereoDft->itd[i] = hStereoDft->itd[STEREO_DFT_NBDIV + i];
554 3176412 : hStereoDft->res_cod_mode[i] = hStereoDft->res_cod_mode[i + STEREO_DFT_NBDIV];
555 3176412 : hStereoDft->res_pred_mode[i] = hStereoDft->res_pred_mode[i + STEREO_DFT_NBDIV];
556 : }
557 :
558 : /* Load new configurations */
559 3176412 : set_s( hStereoDft->band_res + k_offset, hStereoDft->hConfig->band_res, STEREO_DFT_NBDIV );
560 3176412 : set_s( hStereoDft->prm_res + k_offset, hStereoDft->hConfig->prm_res, STEREO_DFT_NBDIV );
561 3176412 : set_s( hStereoDft->res_pred_mode + k_offset, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_NBDIV );
562 3176412 : set_s( hStereoDft->res_cod_mode + k_offset, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_NBDIV );
563 :
564 : /*Update attack info*/
565 3176412 : if ( hStereoDft->attackPresent )
566 : {
567 59282 : hStereoDft->wasTransient = 1;
568 : }
569 3117130 : else if ( hStereoDft->wasTransient )
570 : {
571 52000 : hStereoDft->wasTransient = 0;
572 : }
573 :
574 9529236 : for ( i = STEREO_DFT_CORE_HIST_MAX - 1; i > 0; i-- )
575 : {
576 6352824 : hStereoDft->core_hist[i] = hStereoDft->core_hist[i - 1];
577 : }
578 :
579 3176412 : mvr2r( hStereoDft->hb_stefi_sig + output_frame, hStereoDft->hb_stefi_sig, hStereoDft->hb_stefi_delay );
580 3176412 : mvr2r( hStereoDft->hb_nrg, hStereoDft->hb_nrg + 1, STEREO_DFT_CORE_HIST_MAX - 1 );
581 3176412 : mvr2r( hStereoDft->td_gain, hStereoDft->td_gain + 1, STEREO_DFT_CORE_HIST_MAX - 1 );
582 :
583 3176412 : if ( sba_dirac_stereo_flag )
584 : {
585 : /* buffer update, push back by 2 because of 2 subframes */
586 5697714 : for ( b = 0; b < hStereoDft->nbands; b++ )
587 : {
588 52009420 : for ( i = SBA_DIRAC_NRG_SMOOTH_LONG; i > 1; i-- )
589 : {
590 46808478 : hStereoDft->smooth_buf[b][i] = hStereoDft->smooth_buf[b][i - 2];
591 : }
592 : }
593 : }
594 :
595 3176412 : return;
596 : }
597 :
598 :
599 : /*-------------------------------------------------------------------------
600 : * stereo_dft_dec_destroy()
601 : *
602 : * destroy DFT stereo handle
603 : *-------------------------------------------------------------------------*/
604 :
605 67722 : void stereo_dft_dec_destroy(
606 : STEREO_DFT_DEC_DATA_HANDLE *hStereoDft_glob /* i/o: decoder DFT stereo handle */
607 : )
608 : {
609 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft;
610 :
611 67722 : hStereoDft = *hStereoDft_glob;
612 :
613 67722 : if ( hStereoDft->hConfig != NULL )
614 : {
615 67722 : free( hStereoDft->hConfig );
616 67722 : hStereoDft->hConfig = NULL;
617 : }
618 :
619 67722 : if ( hStereoDft->hBpf != NULL )
620 : {
621 67722 : free( hStereoDft->hBpf );
622 67722 : hStereoDft->hBpf = NULL;
623 : }
624 :
625 67722 : if ( hStereoDft->hTcxLtpDec != NULL )
626 : {
627 67722 : free( hStereoDft->hTcxLtpDec );
628 67722 : hStereoDft->hTcxLtpDec = NULL;
629 : }
630 :
631 67722 : free( hStereoDft );
632 67722 : hStereoDft = NULL;
633 :
634 67722 : return;
635 : }
636 :
637 :
638 : /*-------------------------------------------------------------------------
639 : * stereo_dft_dec_analyze()
640 : *
641 : * DFT analysis on a 20ms frame
642 : *-------------------------------------------------------------------------*/
643 :
644 9809639 : void stereo_dft_dec_analyze(
645 : CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */
646 : const float *input, /* i : input signal */
647 : float out_DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */
648 : const int16_t chan, /* i : channel number */
649 : const int16_t input_frame, /* i : input frame size */
650 : const int16_t output_frame, /* i : output frame size */
651 : const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : type of signal to analyse */
652 : const int16_t k_offset, /* i : offset of DFT */
653 : const int16_t delay /* i : delay in samples for input signal */
654 : )
655 : {
656 : int16_t i, k;
657 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft;
658 : float *pInput, *pInput_buff;
659 : float *mem, input_buff[STEREO_DFT32MS_OVL_MAX + L_FRAME48k];
660 : float DFT[STEREO_DFT32MS_N_MAX], *pDFT_out;
661 : int16_t NFFT, NFFT_core, ovl, zp;
662 : #if defined( DEBUG_MODE_DFT ) || defined( DEBUG_STEREO_DFT_NOCORE )
663 : int16_t N;
664 : #endif
665 : int16_t offset;
666 : float fac;
667 : const float *trigo, *win_left, *win_right, *win2;
668 : float trigo_dec[STEREO_DFT32MS_N_MAX / 2 + 1];
669 : int16_t trigo_step;
670 : int32_t inputFs;
671 : int16_t delay_dec;
672 : int16_t mem_size;
673 : int16_t ovl2;
674 :
675 9809639 : push_wmops( "DFT_analysis" );
676 :
677 9809639 : hStereoDft = hCPE->hStereoDft;
678 :
679 9809639 : assert( output_frame == STEREO_DFT_NBDIV * hStereoDft->N );
680 :
681 : /*-----------------------------------------------------------------*
682 : * Initialization
683 : *-----------------------------------------------------------------*/
684 :
685 9809639 : if ( input_frame == output_frame )
686 : {
687 3811752 : trigo = hStereoDft->dft_trigo;
688 3811752 : trigo_step = hStereoDft->dft_trigo_step * STEREO_DFT_TRIGO_DEC_STEP;
689 3811752 : win_right = hStereoDft->win32ms;
690 3811752 : win_left = hStereoDft->win32ms;
691 3811752 : win2 = hStereoDft->win232ms;
692 :
693 3811752 : if ( ana_type == DFT_STEREO_DEC_ANA_BPF )
694 : {
695 272731 : assert( ( chan == 0 ) && "DFT stereo: BPF memory only for M channel" );
696 272731 : mem = hCPE->input_mem_BPF[chan];
697 : }
698 3539021 : else if ( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD )
699 : {
700 135997 : mem = hCPE->input_mem_LB[chan];
701 : }
702 : else
703 : {
704 3403024 : mem = hCPE->input_mem[chan];
705 : }
706 : }
707 5997887 : else if ( input_frame == L_FRAME )
708 : {
709 2910854 : trigo = hStereoDft->dft_trigo_12k8;
710 2910854 : trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP * STEREO_DFT_TRIGO_DEC_STEP;
711 2910854 : win_right = hStereoDft->win32ms_12k8;
712 2910854 : win_left = hStereoDft->win32ms_12k8;
713 2910854 : win2 = hStereoDft->win232ms_12k8;
714 :
715 2910854 : if ( ana_type == DFT_STEREO_DEC_ANA_BPF )
716 : {
717 1185312 : assert( ( chan == 0 ) && "DFT stereo: BPF memory only for M channel" );
718 1185312 : mem = hCPE->input_mem_BPF[chan];
719 : }
720 1725542 : else if ( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD )
721 : {
722 901792 : mem = hCPE->input_mem_LB[chan];
723 : }
724 : else
725 : {
726 823750 : assert( ( chan == 1 ) && "12.8kHz sampling rate only for second channel, i.e. residual coding or allpass signal" );
727 823750 : mem = hCPE->input_mem[chan];
728 : }
729 : }
730 3087033 : else if ( input_frame == L_FRAME16k )
731 : {
732 2332506 : trigo = hStereoDft->dft_trigo_16k;
733 2332506 : trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP;
734 2332506 : win_right = hStereoDft->win32ms_16k;
735 2332506 : win_left = hStereoDft->win32ms_16k;
736 2332506 : win2 = hStereoDft->win232ms_16k;
737 :
738 2332506 : if ( ana_type == DFT_STEREO_DEC_ANA_BPF )
739 : {
740 1162469 : assert( ( chan == 0 ) && "DFT stereo: BPF memory only for M channel" );
741 1162469 : mem = hCPE->input_mem_BPF[chan];
742 : }
743 1170037 : else if ( ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_LB_ADD )
744 : {
745 556271 : mem = hCPE->input_mem_LB[chan];
746 : }
747 : else
748 : {
749 613766 : assert( ( chan == 1 ) && hCPE->hStereoDft->hConfig->res_pred_mode == STEREO_DFT_RESPRED_ESF && "16kHz sampling rate only for second channel with allpass signal" );
750 613766 : mem = hCPE->input_mem[chan];
751 : }
752 : }
753 754527 : else if ( input_frame == L_FRAME8k )
754 : {
755 754527 : assert( ( chan == 1 ) && "DFT stereo: 8kHz analysis only for residual coding" );
756 754527 : trigo = hStereoDft->dft_trigo_8k;
757 754527 : trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP * STEREO_DFT_TRIGO_DEC_STEP;
758 754527 : win_right = hStereoDft->win32ms_8k;
759 754527 : win_left = hStereoDft->win32ms_8k;
760 754527 : win2 = hStereoDft->win232ms_8k;
761 754527 : mem = hCPE->input_mem[chan];
762 : }
763 : else
764 : {
765 0 : IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error in DFT stereo: sampling rate not supported" );
766 0 : mem = NULL; /* to avoid compilation warning */
767 0 : trigo = NULL; /* to avoid compilation warning */
768 0 : trigo_step = -1; /* to avoid compilation warning */
769 0 : win_right = NULL; /* to avoid compilation warning */
770 0 : win_left = NULL; /* to avoid compilation warning */
771 0 : win2 = NULL; /* to avoid compilation warning */
772 : }
773 :
774 9809639 : inputFs = input_frame * FRAMES_PER_SEC;
775 9809639 : delay_dec = NS2SA( inputFs, STEREO_DFT32MS_OVL_NS );
776 9809639 : zp = NS2SA( inputFs, STEREO_DFT32MS_ZP_NS );
777 9809639 : ovl = NS2SA( inputFs, STEREO_DFT32MS_OVL_NS );
778 : #ifdef DEBUG_MODE_DFT
779 : N = NS2SA( inputFs, STEREO_DFT32MS_HOP_NS );
780 : #endif
781 9809639 : NFFT = NS2SA( inputFs, STEREO_DFT32MS_N_NS );
782 9809639 : fac = (float) ( hStereoDft->NFFT ) / (float) ( NFFT );
783 9809639 : ovl2 = NS2SA( inputFs, STEREO_DFT32MS_OVL2_NS );
784 :
785 : /* Offset for the time buffers */
786 9809639 : assert( ( delay >= -NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_DELAY_DEC_BWE_NS + STEREO_DFT_OVL_NS / 2 ) ) && ( delay <= NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_OVL_NS ) ) );
787 9809639 : mem_size = delay_dec + delay;
788 :
789 : /* Update buffers */
790 9809639 : mvr2r( mem, input_buff, mem_size );
791 9809639 : mvr2r( input, input_buff + mem_size, input_frame );
792 9809639 : mvr2r( input_buff + input_frame, mem, mem_size );
793 9809639 : pInput_buff = input_buff;
794 :
795 9809639 : if ( hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF )
796 : {
797 2585049 : pop_wmops();
798 2585049 : return;
799 : }
800 :
801 : #ifdef DEBUG_MODE_DFT
802 : {
803 : int16_t tmp[L_FRAME48k];
804 : char file_name[50] = { 0 };
805 : #ifdef DEBUG_STEREO_DFT_NOCORE
806 : if ( ana_type == DFT_STEREO_DEC_ANA_NOCORE && delay == 0 )
807 : {
808 : sprintf( file_name, "./res/stereo_dft_enc_M_S_%d_c%d_b0.pcm", input_frame * FRAMES_PER_SEC, chan );
809 : dbgread( tmp, sizeof( int16_t ), 2 * N, file_name );
810 : for ( i = 0; i < input_frame; i++ )
811 : {
812 : pInput_buff[mem_size + i] = (float) ( tmp[i] );
813 : }
814 : mvr2r( input_buff + input_frame, mem, mem_size );
815 : }
816 : #endif
817 : offset = 0;
818 : pInput = pInput_buff + offset;
819 : for ( i = 0; i < 2 * N; i++ )
820 : {
821 : tmp[i] = (int16_t) ( pInput[i] + 0.5f );
822 : }
823 : if ( ana_type != DFT_STEREO_DEC_ANA_BPF )
824 : {
825 : sprintf( file_name, "./res/stereo_dft_dec_M_S_c%d_%d.pcm", input_frame * FRAMES_PER_SEC, chan );
826 : }
827 : else
828 : {
829 : sprintf( file_name, "./res/stereo_dft_dec_BPF_c%d_%d.pcm", input_frame * FRAMES_PER_SEC, chan );
830 : }
831 : dbgwrite( tmp, sizeof( int16_t ), 2 * N, 1, file_name );
832 : }
833 : #endif
834 :
835 : /*-----------------------------------------------------------------*
836 : * DFT Analysis: loop over frame
837 : *-----------------------------------------------------------------*/
838 :
839 7224590 : assert( k_offset <= STEREO_DFT_NBDIV );
840 :
841 770120486 : for ( i = 0; i < NFFT / 4; i++ )
842 : {
843 762895896 : trigo_dec[i] = trigo[i * trigo_step];
844 762895896 : trigo_dec[NFFT / 2 - i] = trigo[i * trigo_step];
845 : }
846 7224590 : trigo_dec[NFFT / 4] = trigo[NFFT / 4 * trigo_step];
847 :
848 18160318 : for ( k = 0; k < STEREO_DFT_NBDIV - k_offset; k++ )
849 : {
850 10935728 : set_f( DFT, 0, STEREO_DFT32MS_N_MAX );
851 10935728 : if ( k == 0 )
852 : {
853 5507770 : offset = 0;
854 : }
855 : else
856 : {
857 : /* If OVL2 = OVL offset = 10ms */
858 5427958 : offset = NS2SA( inputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 );
859 : }
860 :
861 10935728 : pInput = pInput_buff + offset;
862 10935728 : pDFT_out = out_DFT[chan] + k * STEREO_DFT32MS_N_MAX;
863 :
864 : /*Forwards FFT: L and R*/
865 : /* Zero Padding & Flat Portion */
866 10935728 : mvr2r( pInput, DFT + zp, NFFT - 2 * zp );
867 :
868 : /* Overlapping portions */
869 10935728 : if ( k == 0 )
870 : {
871 353293515 : for ( i = 0; i < ovl; i++ )
872 : {
873 347785745 : DFT[i + zp] *= win_left[STEREO_DFT32MS_STEP * i];
874 : }
875 1048865005 : for ( i = 0; i < ovl2; i++ )
876 : {
877 1043357235 : DFT[NFFT - zp - 1 - i] *= win2[i];
878 : }
879 : }
880 : else
881 : {
882 1029277603 : for ( i = 0; i < ovl2; i++ )
883 : {
884 1023849645 : DFT[i + zp] *= win2[i];
885 : }
886 346711173 : for ( i = 0; i < ovl; i++ )
887 : {
888 341283215 : DFT[NFFT - zp - i - 1] *= win_right[STEREO_DFT32MS_STEP * i];
889 : }
890 : }
891 :
892 10935728 : rfft( DFT, trigo_dec, NFFT, -1 );
893 :
894 : /*Resampling: filtering+scaling*/
895 10935728 : if ( ana_type == DFT_STEREO_DEC_ANA_FB || ana_type == DFT_STEREO_DEC_ANA_LB || ana_type == DFT_STEREO_DEC_ANA_NOCORE )
896 : {
897 9020908 : pDFT_out[0] = DFT[0] * fac; /*DC*/
898 9020908 : if ( NFFT == hStereoDft->NFFT ) /*Nyquist*/
899 : {
900 3591040 : pDFT_out[1] = DFT[1] * fac;
901 : }
902 : else
903 : {
904 5429868 : pDFT_out[1] = 0.f;
905 : }
906 3815202644 : for ( i = 2; i < NFFT; i++ )
907 : {
908 3806181736 : pDFT_out[i] = DFT[i] * fac;
909 : }
910 2513318956 : for ( i = NFFT; i < hStereoDft->NFFT; i++ )
911 : {
912 2504298048 : pDFT_out[i] = 0.f;
913 : }
914 : }
915 1914820 : else if ( ana_type == DFT_STEREO_DEC_ANA_BPF )
916 : {
917 1833494 : pDFT_out[0] -= DFT[0] * fac * dft_bpf_weights[0];
918 :
919 73339760 : for ( i = 1; i < STEREO_DFT_BPF_SIZE; i++ )
920 : {
921 71506266 : pDFT_out[2 * i] -= DFT[2 * i] * fac * dft_bpf_weights[i];
922 71506266 : pDFT_out[2 * i + 1] -= DFT[2 * i + 1] * fac * dft_bpf_weights[i];
923 : }
924 : }
925 81326 : else if ( ana_type == DFT_STEREO_DEC_ANA_HB_ADD )
926 : {
927 6226 : NFFT_core = NS2SA( hCPE->hCoreCoder[0]->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_N_NS );
928 :
929 3398674 : for ( i = NFFT_core; i < NFFT; i++ )
930 : {
931 3392448 : pDFT_out[i] += DFT[i] * fac;
932 : }
933 : }
934 : else
935 : {
936 75100 : pDFT_out[0] += DFT[0] * fac; /*DC*/
937 75100 : if ( NFFT == hStereoDft->NFFT ) /*Nyquist*/
938 : {
939 39708 : pDFT_out[1] += DFT[1] * fac;
940 : }
941 37670372 : for ( i = 2; i < NFFT; i++ )
942 : {
943 37595272 : pDFT_out[i] += DFT[i] * fac;
944 : }
945 : }
946 : }
947 :
948 7224590 : pop_wmops();
949 7224590 : return;
950 : }
951 :
952 : /*-------------------------------------------------------------------------
953 : * stereo_dft_dec_synthesize()
954 : *
955 : * Inverse DFT on a 20ms frame
956 : *-------------------------------------------------------------------------*/
957 :
958 4408555 : void stereo_dft_dec_synthesize(
959 : CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */
960 : float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i : DFT buffers */
961 : const int16_t chan, /* i : channel number */
962 : float output[L_FRAME48k], /* o : output synthesis signal */
963 : const int16_t output_frame /* i : output frame length */
964 : )
965 : {
966 : int16_t i, k;
967 : int16_t offset;
968 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft;
969 : float *p_DFT;
970 : const float *win, *win2;
971 : float trigo_dec[STEREO_DFT32MS_N_MAX / 2 + 1];
972 : int16_t trigo_step;
973 : int16_t ovl, zp, NFFT;
974 : int32_t outputFs;
975 : int16_t ovl2, flat_portion_end;
976 : float ola_buff[STEREO_DFT32MS_OVL2_MAX];
977 : int16_t moffset;
978 4408555 : push_wmops( "DFT_synthesis" );
979 :
980 : /*-----------------------------------------------------------------*
981 : * Initialization
982 : *-----------------------------------------------------------------*/
983 :
984 4408555 : hStereoDft = hCPE->hStereoDft;
985 :
986 4408555 : outputFs = output_frame * FRAMES_PER_SEC;
987 :
988 4408555 : zp = NS2SA( outputFs, STEREO_DFT32MS_ZP_NS );
989 4408555 : ovl = NS2SA( outputFs, STEREO_DFT32MS_OVL_NS );
990 4408555 : win = hStereoDft->win32ms;
991 4408555 : NFFT = NS2SA( outputFs, STEREO_DFT32MS_N_NS );
992 4408555 : ovl2 = NS2SA( outputFs, STEREO_DFT32MS_OVL2_NS );
993 4408555 : flat_portion_end = NS2SA( outputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 );
994 4408555 : win2 = hStereoDft->win232ms;
995 :
996 4408555 : p_DFT = DFT[chan];
997 4408555 : set_f( output, 0, NS2SA( outputFs, FRAME_SIZE_NS ) );
998 :
999 : /* deactivating the spectrum scrambling on active speech */
1000 4408555 : if ( ( chan == 0 && hCPE->hCoreCoder[0]->last_coder_type > UNVOICED ) || hCPE->last_element_mode == IVAS_CPE_MDCT || hCPE->last_element_mode < IVAS_CPE_DFT )
1001 : {
1002 2593089 : hCPE->stereo_switching_counter = 10;
1003 : }
1004 :
1005 4408555 : if ( hCPE->stereo_switching_counter == 0 )
1006 : {
1007 : /* Set the level of dispersion */
1008 111 : hCPE->NbFrameMod = (int16_t) ( 12.0f * max( -0.1f, min( 0.4, hCPE->lt_es_em ) ) + 1.2f + 0.5f ); /* -0.1: -0.4 ; -0.1 -> 0, 0.4 -> 6*/
1009 : }
1010 4408555 : moffset = max( 0, 6 - hCPE->NbFrameMod );
1011 :
1012 : /*-----------------------------------------------------------------*
1013 : * Synthesis
1014 : *-----------------------------------------------------------------*/
1015 :
1016 4408555 : trigo_step = hStereoDft->dft_trigo_step * STEREO_DFT_TRIGO_DEC_STEP;
1017 772672875 : for ( i = 0; i < NFFT / 4; i++ )
1018 : {
1019 768264320 : trigo_dec[i] = hStereoDft->dft_trigo[i * trigo_step];
1020 768264320 : trigo_dec[NFFT / 2 - i] = hStereoDft->dft_trigo[i * trigo_step];
1021 : }
1022 4408555 : trigo_dec[NFFT / 4] = hStereoDft->dft_trigo[NFFT / 4 * trigo_step];
1023 :
1024 13225665 : for ( k = 0; k < STEREO_DFT_NBDIV; k++ )
1025 : {
1026 : /* scrambling the spectrum */
1027 8817110 : if ( hCPE->stereo_switching_counter <= 6 && chan == 1 && ( hCPE->lt_es_em > -0.4f || hCPE->NbFrameMod > 4 ) )
1028 : {
1029 3188082 : for ( i = 3; i < NFFT - moffset - 1; i++ )
1030 : {
1031 3184572 : p_DFT[i] = -p_DFT[i + moffset + 1];
1032 : }
1033 : }
1034 8813600 : else if ( hCPE->stereo_switching_counter < 7 && ( hCPE->lt_es_em > 0.2f || hCPE->NbFrameMod > 4 ) )
1035 : {
1036 3157692 : for ( i = 16 - hCPE->NbFrameMod; i < NFFT - moffset - 1; i++ )
1037 : {
1038 3154200 : p_DFT[i - 2] = -p_DFT[i + moffset + 1];
1039 : }
1040 : }
1041 :
1042 : /*IFFT*/
1043 8817110 : rfft( p_DFT, trigo_dec, NFFT, +1 );
1044 :
1045 8817110 : if ( k == 0 )
1046 : {
1047 4408555 : offset = 0;
1048 :
1049 : /* Left OLA - 3.125ms */
1050 484573755 : for ( i = 0; i < ovl; i++ )
1051 : {
1052 480165200 : output[offset + i] = hCPE->output_mem[chan][i] + p_DFT[zp + i] * win[STEREO_DFT32MS_STEP * i];
1053 : }
1054 : /* Flat Portion */
1055 580606795 : for ( i = ovl; i < flat_portion_end; i++ )
1056 : {
1057 576198240 : output[offset + i] = p_DFT[zp + i];
1058 : }
1059 : /* Right OLA */
1060 1444904155 : for ( i = 0; i < ovl2; i++ )
1061 : {
1062 1440495600 : ola_buff[i] = win2[ovl2 - 1 - i] * p_DFT[NFFT - zp - ovl2 + i];
1063 : }
1064 : }
1065 : else
1066 : {
1067 : /* If OVL2 = OVL offset = 10ms */
1068 4408555 : offset = flat_portion_end;
1069 :
1070 : /* Left OLA */
1071 1444904155 : for ( i = 0; i < ovl2; i++ )
1072 : {
1073 1440495600 : output[offset + i] = ola_buff[i] + p_DFT[zp + i] * win2[i];
1074 : }
1075 : /* Flat Portion */
1076 580606795 : for ( i = ovl2; i < NFFT - 2 * zp - ovl; i++ )
1077 : {
1078 576198240 : output[offset + i] = p_DFT[zp + i];
1079 : }
1080 : /* Right OLA - 3.125ms */
1081 484573755 : for ( i = 0; i < ovl; i++ )
1082 : {
1083 480165200 : hCPE->output_mem[chan][i] = win[STEREO_DFT32MS_STEP * ( ovl - 1 - i )] * p_DFT[NFFT - zp - ovl + i];
1084 : }
1085 : }
1086 :
1087 8817110 : p_DFT += STEREO_DFT32MS_N_MAX;
1088 : }
1089 :
1090 : #ifdef DEBUG_MODE_DFT
1091 : {
1092 : int16_t tmp[1024];
1093 : char file_name[50] = { 0 };
1094 :
1095 : for ( i = 0; i < output_frame; i++ )
1096 : {
1097 : tmp[i] = (int16_t) ( output[i] + 0.5f );
1098 : }
1099 : sprintf( file_name, "./res/stereo_dft_ch%d_output.pcm", chan );
1100 : dbgwrite( tmp, sizeof( int16_t ), output_frame, 1, file_name );
1101 : }
1102 : #endif
1103 :
1104 4408555 : pop_wmops();
1105 4408555 : return;
1106 : }
1107 :
1108 :
1109 : /*-------------------------------------------------------------------------
1110 : * stereo_dft_dec()
1111 : *
1112 : * DFT-based stereo main processing function
1113 : *-------------------------------------------------------------------------*/
1114 :
1115 2114593 : void stereo_dft_dec(
1116 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */
1117 : Decoder_State *st0, /* i/o: decoder state structure */
1118 : float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */
1119 : float *input_mem, /* i/o: mem of buffer DFT analysis */
1120 : STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */
1121 : const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */
1122 : const int16_t sba_mono_flag, /* i : signal mono output for SBA DirAC */
1123 : ivas_spar_md_dec_state_t *hMdDec, /* i : SPAR MD handle for upmixing */
1124 : const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */
1125 : const int32_t output_Fs, /* i : Fs for delay calculation */
1126 : const int16_t nchan_transport, /* i : number of transpor channels */
1127 : const int16_t num_md_sub_frames /* i : number of MD subframes */
1128 : )
1129 : {
1130 : int16_t i, k, b, N_div, stop;
1131 : float DFT_L[STEREO_DFT32MS_N_MAX];
1132 : float DFT_R[STEREO_DFT32MS_N_MAX];
1133 : float DFT_PRED_RES[STEREO_DFT32MS_N_32k];
1134 : float *pDFT_DMX;
1135 : float *pDFT_DMX1;
1136 : float *pDFT_RES;
1137 : float g, tmp;
1138 : float *pPredGain;
1139 : float *pSideGain;
1140 : float c0, s0;
1141 : int16_t k_offset;
1142 : float *pgIpd;
1143 : int16_t NFFT_inner;
1144 : float gamma;
1145 : float samp_ratio;
1146 : int16_t prev_bfi;
1147 : float dmx_nrg;
1148 : int16_t idx_k0, idx_k1;
1149 : int16_t output_frame;
1150 : int16_t plocs[STEREO_DFT_RES_N_PEAKS_MAX];
1151 : int16_t num_plocs;
1152 : float plocsi[STEREO_DFT_RES_N_PEAKS_MAX];
1153 : float ftmp, N1, N2, coh;
1154 : float lev1, lev2, cna_level, scale_fact0, scale_fact, *ptr_per;
1155 2114593 : HANDLE_FD_CNG_DEC hFdCngDec = st0->hFdCngDec;
1156 2114593 : HANDLE_FD_CNG_COM hFdCngCom = hFdCngDec->hFdCngCom;
1157 2114593 : int16_t *cna_seed = &( hFdCngCom->seed );
1158 : float DFT_W, DFT_Y;
1159 :
1160 2114593 : output_frame = (int16_t) ( st0->output_Fs / FRAMES_PER_SEC );
1161 :
1162 : /*------------------------------------------------------------------*
1163 : * Initialization
1164 : *-----------------------------------------------------------------*/
1165 :
1166 2114593 : samp_ratio = (float) st0->sr_core / (float) st0->output_Fs;
1167 :
1168 2114593 : stop = STEREO_DFT32MS_N_32k / 2;
1169 :
1170 : /* Analyze nature of current frame */
1171 1986977 : hStereoDft->trans = ( ( ( st0->clas_dec == ONSET ) || ( st0->clas_dec == SIN_ONSET ) || ( st0->clas_dec == UNVOICED_CLAS ) || ( st0->clas_dec == UNVOICED_TRANSITION ) ) || ( st0->stab_fac <= 0.25f ) ) ||
1172 4101570 : ( st0->core == TCX_20_CORE && ( ( st0->hTcxCfg->tcx_last_overlap_mode == MIN_OVERLAP ) || ( st0->hTcxCfg->tcx_last_overlap_mode == HALF_OVERLAP ) ) ) || ( st0->core == TCX_10_CORE );
1173 :
1174 : #ifdef DEBUG_MODE_DFT
1175 : {
1176 : int16_t tmps;
1177 : int16_t tmp_output_frame = (int16_t) ( st0->output_Fs / FRAMES_PER_SEC );
1178 : dbgwrite( &( hStereoDft->attackPresent ), sizeof( int16_t ), 1, tmp_output_frame, "res/stereo_attack.pcm" );
1179 : dbgwrite( &( hStereoDft->trans ), sizeof( int16_t ), 1, tmp_output_frame, "res/stereo_trans.pcm" );
1180 : tmps = (int16_t) ( 100.f * ( st0->stab_fac ) + 0.5f );
1181 : dbgwrite( &tmps, sizeof( int16_t ), 1, tmp_output_frame, "res/stereo_stab.pcm" );
1182 : }
1183 : #endif
1184 :
1185 : /* Initialization */
1186 2114593 : k_offset = 1;
1187 2114593 : N_div = STEREO_DFT_NBDIV;
1188 2114593 : prev_bfi = st0->prev_old_bfi; /* The core decoding is already completed here and the prev_bfi has been updated for the next frame.
1189 : The prev_old_bfi still holds the prev_bfi for the current frame. */
1190 : /* make sure number of bands corresponds to output bwidth in case it is lower than parameter bwidth */
1191 2114593 : if ( output_frame < inner_frame_tbl[st0->bwidth] && !sba_dirac_stereo_flag )
1192 : {
1193 234550 : hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC );
1194 : }
1195 :
1196 2114593 : if ( !st0->bfi )
1197 : {
1198 : /* Smoothing for the current frame */
1199 2048545 : if ( sba_dirac_stereo_flag )
1200 : {
1201 475773 : ivas_sba_dirac_stereo_smooth_parameters( hStereoDft, hMdDec, cross_fade_start_offset, output_Fs, num_md_sub_frames );
1202 : }
1203 : else
1204 : {
1205 1572772 : stereo_dft_dec_smooth_parameters( hStereoDft, hStereoCng->prev_sid_nodata, hStereoCng->active_frame_counter, st0->element_brate );
1206 : }
1207 : }
1208 :
1209 2114593 : dmx_nrg = 0.0f;
1210 2114593 : if ( prev_bfi )
1211 : {
1212 65798 : dmx_nrg = stereo_dft_dmx_swb_nrg( DFT[0], DFT[0] + STEREO_DFT32MS_N_MAX, min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) );
1213 : }
1214 :
1215 : #ifdef DEBUG_MODE_DFT
1216 : dbgwrite( hStereoDft->res_pred_gain + STEREO_DFT_BAND_MAX, sizeof( float ), hStereoDft->nbands, 1, "./res/stereo_dft_dec_gainPred.pcm" );
1217 : #endif
1218 :
1219 : #ifdef DEBUG_PRINT
1220 : printf( "\nframe: %d\n", frame );
1221 : #endif
1222 6343779 : for ( k = 0; k < N_div; k++ )
1223 : {
1224 4229186 : pDFT_DMX = DFT[0] + k * STEREO_DFT32MS_N_MAX;
1225 4229186 : pDFT_RES = DFT[1] + k * STEREO_DFT32MS_N_MAX;
1226 4229186 : pDFT_DMX1 = 0;
1227 4229186 : if ( nchan_transport > 1 )
1228 : {
1229 546492 : pDFT_DMX1 = DFT[1] + k * STEREO_DFT32MS_N_MAX;
1230 : }
1231 :
1232 : /*Apply Stereo*/
1233 4229186 : if ( hStereoDft->hConfig->dmx_active )
1234 : {
1235 4229186 : g = 1.f;
1236 4229186 : c0 = 1.f;
1237 4229186 : s0 = 0.f;
1238 :
1239 : /* since delay is just 3.125ms, the parameters received are used for the second window */
1240 4229186 : pSideGain = hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX;
1241 4229186 : pgIpd = hStereoDft->gipd + ( k + k_offset );
1242 4229186 : pPredGain = hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX;
1243 :
1244 : #ifdef DEBUG_PRINT
1245 : if ( k == 0 )
1246 : {
1247 : printf( "Window0\n" );
1248 : }
1249 : else
1250 : {
1251 : printf( "Window1\n" );
1252 : }
1253 : for ( b = 0; b < hStereoDft->nbands; b++ )
1254 : printf( "%.6f ", pSideGain[b] );
1255 : printf( "\n" );
1256 : for ( b = 0; b < hStereoDft->nbands; b++ )
1257 : printf( "%.6f ", pPredGain[b] );
1258 : printf( "\n" );
1259 : #endif
1260 :
1261 : /* Use coarse band partition in inactive frames */
1262 4229186 : if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
1263 : {
1264 131490 : NFFT_inner = STEREO_DFT32MS_N_MAX * inner_frame_tbl[st0->bwidth] / L_FRAME48k;
1265 131490 : hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, 2, NFFT_inner, DEC );
1266 : }
1267 :
1268 :
1269 4229186 : if ( st0->bfi )
1270 : {
1271 132096 : hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX;
1272 : }
1273 :
1274 4229186 : if ( !( sba_dirac_stereo_flag && nchan_transport >= 2 ) )
1275 : {
1276 3682694 : stereo_dft_generate_res_pred( hStereoDft, samp_ratio, pDFT_DMX, DFT_PRED_RES, pPredGain, k, DFT[1] + k * STEREO_DFT32MS_N_MAX, &stop, st0->bfi );
1277 : }
1278 :
1279 4229186 : if ( hStereoDft->res_cod_band_max > 0 )
1280 : {
1281 1123668 : if ( !st0->bfi )
1282 : {
1283 1086612 : if ( k == 1 )
1284 : {
1285 543306 : mvr2r( pDFT_RES, hStereoDft->res_mem, 2 * hStereoDft->band_limits[hStereoDft->res_cod_band_max] );
1286 543306 : hStereoDft->time_offs = 0;
1287 : }
1288 : }
1289 : else
1290 : {
1291 37056 : stereo_dft_res_ecu( hStereoDft, pDFT_RES, DFT_PRED_RES, k, output_frame, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem );
1292 : }
1293 : }
1294 :
1295 : #ifdef DEBUGGING
1296 : if ( dbgflag( "write_res" ) )
1297 : {
1298 : dbgwrite( pDFT_RES, sizeof( float ), 2 * hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1, "dec_res.float" );
1299 : }
1300 :
1301 : if ( dbgflag( "read_res" ) )
1302 : {
1303 : dbgread( pDFT_RES, sizeof( float ), 2 * hStereoDft->band_limits[hStereoDft->res_cod_band_max], "dec_res.float" );
1304 : }
1305 : #endif
1306 : /* Apply active DMX */
1307 : /* pDFT_RES is used for the second channel in inactive frames */
1308 4229186 : if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
1309 : {
1310 131490 : DFT_L[0] = pDFT_DMX[0];
1311 131490 : DFT_R[0] = pDFT_RES[0];
1312 : }
1313 : else
1314 : {
1315 4097696 : DFT_L[0] = pDFT_DMX[0];
1316 4097696 : DFT_R[0] = pDFT_DMX[0];
1317 : }
1318 :
1319 4229186 : if ( hStereoDft->frame_sid_nodata || st0->VAD == 0 )
1320 : {
1321 750436 : hFdCngDec->cna_nbands = 0;
1322 : }
1323 :
1324 45977820 : for ( b = 0; b < hStereoDft->nbands; b++ )
1325 : {
1326 41748634 : g = pSideGain[b];
1327 41748634 : if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
1328 : {
1329 771448 : g = hStereoDft->g_state[b];
1330 : }
1331 :
1332 : /* store side gains from inactive frames for later use by the stereo CNA */
1333 41748634 : if ( hStereoDft->band_limits[b] < L_FRAME16k && ( hStereoDft->frame_sid_nodata || st0->VAD == 0 ) )
1334 : {
1335 7253046 : hFdCngDec->cna_nbands = b + 1;
1336 7253046 : hFdCngDec->cna_band_limits[b] = hStereoDft->band_limits[b];
1337 7253046 : hFdCngDec->cna_g_state[b] = g;
1338 : }
1339 :
1340 : #ifdef DEBUG_MODE_DFT
1341 : if ( b < hStereoDft->res_cod_band_max )
1342 : {
1343 : dbgwrite( &g, sizeof( float ), 1, 1, "./res/stereo_dft_dec_g.pcm" );
1344 : }
1345 : #endif
1346 : /* No residual coding in inactive frames, instead pDFT_RES is used for the second channel */
1347 41748634 : if ( b >= hStereoDft->res_cod_band_max && !hStereoDft->frame_sid_nodata && !( sba_dirac_stereo_flag && hMdDec ) )
1348 : {
1349 : /*filter non-coded frequencies. It removes some MDCT frequency aliasing*/
1350 995686626 : for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
1351 : {
1352 970103694 : pDFT_RES[2 * i] = 0.f;
1353 970103694 : pDFT_RES[2 * i + 1] = 0.f;
1354 : }
1355 : }
1356 :
1357 41748634 : if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
1358 : {
1359 : /* Low pass filter coherence */
1360 : /* store coherence from inactive frames for later use by the stereo CNA */
1361 771448 : hFdCngDec->cna_cm[b] = hStereoCng->cm[b];
1362 :
1363 : /* Calculate gamma */
1364 771448 : if ( hStereoCng->cm[b] < 0.9f )
1365 : {
1366 771292 : gamma = hStereoCng->cm[b];
1367 771292 : gamma = gamma / ( 1 - gamma );
1368 771292 : gamma = sqrtf( gamma + 1 - g * g ) - sqrtf( gamma );
1369 : }
1370 : else
1371 : {
1372 156 : gamma = 0;
1373 : }
1374 :
1375 39918038 : for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
1376 : {
1377 : /* Create L and R signals with the correct coherence by mixing channel 0 (pDFT_DMX) and channel 1 (pDFT_RES) */
1378 39146590 : DFT_L[2 * i] = ( 1 + g ) * pDFT_DMX[2 * i] + gamma * pDFT_RES[2 * i];
1379 39146590 : DFT_R[2 * i] = ( 1 - g ) * pDFT_DMX[2 * i] - gamma * pDFT_RES[2 * i];
1380 :
1381 39146590 : DFT_L[2 * i + 1] = ( 1 + g ) * pDFT_DMX[2 * i + 1] + gamma * pDFT_RES[2 * i + 1];
1382 39146590 : DFT_R[2 * i + 1] = ( 1 - g ) * pDFT_DMX[2 * i + 1] - gamma * pDFT_RES[2 * i + 1];
1383 : }
1384 :
1385 771448 : if ( pgIpd[0] != 0.f )
1386 : {
1387 : #ifdef NONBE_FIX_NONBE_BETWEEN_OPTIMIZATION_LEVELS_2
1388 : volatile float pgIpd_tmp;
1389 :
1390 214544 : pgIpd_tmp = pgIpd[0];
1391 214544 : c0 = cosf( pgIpd_tmp );
1392 214544 : s0 = sinf( pgIpd_tmp );
1393 : #else
1394 : c0 = cosf( pgIpd[0] );
1395 : s0 = sinf( pgIpd[0] );
1396 : #endif
1397 10456650 : for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
1398 : {
1399 : /*rotate L*/
1400 10242106 : tmp = DFT_L[2 * i] * c0 - DFT_L[2 * i + 1] * s0;
1401 10242106 : DFT_L[2 * i + 1] = DFT_L[2 * i] * s0 + DFT_L[2 * i + 1] * c0;
1402 10242106 : DFT_L[2 * i] = tmp;
1403 : }
1404 : }
1405 : }
1406 40977186 : else if ( sba_dirac_stereo_flag && hMdDec )
1407 : {
1408 :
1409 9775914 : if ( nchan_transport == 1 )
1410 : {
1411 3611976 : if ( sba_mono_flag )
1412 : {
1413 1052592 : if ( b == 0 )
1414 : {
1415 90206 : i = 0;
1416 :
1417 90206 : DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i];
1418 90206 : DFT_L[2 * i] = DFT_W;
1419 90206 : DFT_R[2 * i] = 0.f;
1420 :
1421 90206 : DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1];
1422 90206 : DFT_L[2 * i + 1] = DFT_W;
1423 90206 : DFT_R[2 * i + 1] = 0.f;
1424 : }
1425 21888722 : for ( i = hStereoDft->band_limits[b]; i < min( stop, hStereoDft->band_limits[b + 1] ); i++ )
1426 : {
1427 20836130 : DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i] + ( hStereoDft->mixer_mat_smooth[0][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i];
1428 20836130 : DFT_L[2 * i] = DFT_W;
1429 20836130 : DFT_R[2 * i] = 0.f;
1430 :
1431 20836130 : DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1] + ( hStereoDft->mixer_mat_smooth[0][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i + 1];
1432 20836130 : DFT_L[2 * i + 1] = DFT_W;
1433 20836130 : DFT_R[2 * i + 1] = 0.f;
1434 : }
1435 18644336 : for ( ; i < hStereoDft->band_limits[b + 1]; i++ )
1436 : {
1437 17591744 : DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i];
1438 17591744 : DFT_L[2 * i] = DFT_W;
1439 17591744 : DFT_R[2 * i] = 0.f;
1440 :
1441 17591744 : DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1];
1442 17591744 : DFT_L[2 * i + 1] = DFT_W;
1443 17591744 : DFT_R[2 * i + 1] = 0.f;
1444 : }
1445 : }
1446 : else
1447 : {
1448 2559384 : if ( b == 0 )
1449 : {
1450 231652 : i = 0;
1451 :
1452 231652 : DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i];
1453 231652 : DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i];
1454 :
1455 231652 : DFT_L[2 * i] = DFT_W + DFT_Y;
1456 231652 : DFT_R[2 * i] = DFT_W - DFT_Y;
1457 :
1458 231652 : DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1];
1459 231652 : DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1];
1460 :
1461 231652 : DFT_L[2 * i + 1] = DFT_W + DFT_Y;
1462 231652 : DFT_R[2 * i + 1] = DFT_W - DFT_Y;
1463 : }
1464 55609780 : for ( i = hStereoDft->band_limits[b]; i < min( stop, hStereoDft->band_limits[b + 1] ); i++ )
1465 : {
1466 53050396 : DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i] + ( hStereoDft->mixer_mat_smooth[0][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i];
1467 53050396 : DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i] + ( hStereoDft->mixer_mat_smooth[1][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i];
1468 :
1469 53050396 : DFT_L[2 * i] = DFT_W + DFT_Y;
1470 53050396 : DFT_R[2 * i] = DFT_W - DFT_Y;
1471 :
1472 53050396 : DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1] + ( hStereoDft->mixer_mat_smooth[0][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[0][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i + 1];
1473 53050396 : DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1] + ( hStereoDft->mixer_mat_smooth[1][1][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][2][b + k * IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][3][b + k * IVAS_MAX_NUM_BANDS] ) * DFT_PRED_RES[2 * i + 1];
1474 :
1475 53050396 : DFT_L[2 * i + 1] = DFT_W + DFT_Y;
1476 53050396 : DFT_R[2 * i + 1] = DFT_W - DFT_Y;
1477 : }
1478 25199896 : for ( ; i < hStereoDft->band_limits[b + 1]; i++ )
1479 : {
1480 22640512 : DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i];
1481 22640512 : DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i];
1482 :
1483 22640512 : DFT_L[2 * i] = DFT_W + DFT_Y;
1484 22640512 : DFT_R[2 * i] = DFT_W - DFT_Y;
1485 :
1486 22640512 : DFT_W = hStereoDft->mixer_mat_smooth[0][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1];
1487 22640512 : DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1];
1488 :
1489 22640512 : DFT_L[2 * i + 1] = DFT_W + DFT_Y;
1490 22640512 : DFT_R[2 * i + 1] = DFT_W - DFT_Y;
1491 : }
1492 : }
1493 : }
1494 6163938 : else if ( nchan_transport >= 2 )
1495 : {
1496 6163938 : if ( b == 0 )
1497 : {
1498 546492 : i = 0;
1499 :
1500 546492 : DFT_W = pDFT_DMX[2 * i];
1501 546492 : DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i] + pDFT_DMX1[2 * i];
1502 :
1503 546492 : DFT_L[2 * i] = DFT_W + DFT_Y;
1504 546492 : DFT_R[2 * i] = DFT_W - DFT_Y;
1505 :
1506 546492 : DFT_W = pDFT_DMX[2 * i + 1];
1507 546492 : DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1] + pDFT_DMX1[2 * i + 1];
1508 :
1509 546492 : DFT_L[2 * i + 1] = DFT_W + DFT_Y;
1510 546492 : DFT_R[2 * i + 1] = DFT_W - DFT_Y;
1511 : }
1512 204899046 : for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
1513 : {
1514 198735108 : DFT_W = pDFT_DMX[2 * i];
1515 198735108 : DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i] + pDFT_DMX1[2 * i];
1516 :
1517 198735108 : DFT_L[2 * i] = DFT_W + DFT_Y;
1518 198735108 : DFT_R[2 * i] = DFT_W - DFT_Y;
1519 :
1520 198735108 : DFT_W = pDFT_DMX[2 * i + 1];
1521 198735108 : DFT_Y = hStereoDft->mixer_mat_smooth[1][0][b + k * IVAS_MAX_NUM_BANDS] * pDFT_DMX[2 * i + 1] + pDFT_DMX1[2 * i + 1];
1522 :
1523 198735108 : DFT_L[2 * i + 1] = DFT_W + DFT_Y;
1524 198735108 : DFT_R[2 * i + 1] = DFT_W - DFT_Y;
1525 : }
1526 : }
1527 : else
1528 : {
1529 : assert( "nhcan_transport must be 1 or 1!" );
1530 : }
1531 : }
1532 : else
1533 : {
1534 706968470 : for ( i = hStereoDft->band_limits[b]; i < min( stop, hStereoDft->band_limits[b + 1] ); i++ )
1535 : {
1536 675767198 : tmp = g * pDFT_DMX[2 * i] + pDFT_RES[2 * i] + DFT_PRED_RES[2 * i];
1537 :
1538 675767198 : DFT_L[2 * i] = pDFT_DMX[2 * i] + tmp;
1539 675767198 : DFT_R[2 * i] = pDFT_DMX[2 * i] - tmp;
1540 :
1541 675767198 : tmp = g * pDFT_DMX[2 * i + 1] + pDFT_RES[2 * i + 1] + DFT_PRED_RES[2 * i + 1];
1542 :
1543 675767198 : DFT_L[2 * i + 1] = pDFT_DMX[2 * i + 1] + tmp;
1544 675767198 : DFT_R[2 * i + 1] = pDFT_DMX[2 * i + 1] - tmp;
1545 :
1546 : #ifdef DEBUG_STEREO_DFT_OUTRESPRED
1547 : DFT_L[2 * i] = DFT_PRED_RES[2 * i];
1548 : DFT_R[2 * i] = -DFT_PRED_RES[2 * i];
1549 : DFT_L[2 * i + 1] = DFT_PRED_RES[2 * i + 1];
1550 : DFT_R[2 * i + 1] = -DFT_PRED_RES[2 * i + 1];
1551 : #endif /* DEBUG_STEREO_DFT_OUTRESPRED */
1552 : }
1553 :
1554 348011128 : for ( ; i < hStereoDft->band_limits[b + 1]; i++ )
1555 : {
1556 316809856 : tmp = g * pDFT_DMX[2 * i] + pDFT_RES[2 * i];
1557 :
1558 316809856 : DFT_L[2 * i] = pDFT_DMX[2 * i] + tmp;
1559 316809856 : DFT_R[2 * i] = pDFT_DMX[2 * i] - tmp;
1560 :
1561 316809856 : tmp = g * pDFT_DMX[2 * i + 1] + pDFT_RES[2 * i + 1];
1562 :
1563 316809856 : DFT_L[2 * i + 1] = pDFT_DMX[2 * i + 1] + tmp;
1564 316809856 : DFT_R[2 * i + 1] = pDFT_DMX[2 * i + 1] - tmp;
1565 :
1566 : #ifdef DEBUG_STEREO_DFT_OUTRESPRED
1567 : DFT_L[2 * i] = 0.f;
1568 : DFT_R[2 * i] = 0.f;
1569 : DFT_L[2 * i + 1] = 0.f;
1570 : DFT_R[2 * i + 1] = 0.f;
1571 : #endif /* DEBUG_STEREO_DFT_OUTRESPRED */
1572 : }
1573 :
1574 : /* Active Upmix */
1575 31201272 : if ( pgIpd[0] != 0.f )
1576 : {
1577 : #ifdef NONBE_FIX_NONBE_BETWEEN_OPTIMIZATION_LEVELS_2
1578 : volatile float pgIpd_tmp;
1579 :
1580 4259224 : pgIpd_tmp = pgIpd[0];
1581 4259224 : c0 = cosf( pgIpd_tmp );
1582 4259224 : s0 = sinf( pgIpd_tmp );
1583 : #else
1584 : c0 = cosf( pgIpd[0] );
1585 : s0 = sinf( pgIpd[0] );
1586 : #endif
1587 136134240 : for ( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
1588 : {
1589 : /*rotate L*/
1590 131875016 : tmp = DFT_L[2 * i] * c0 - DFT_L[2 * i + 1] * s0;
1591 131875016 : DFT_L[2 * i + 1] = DFT_L[2 * i] * s0 + DFT_L[2 * i + 1] * c0;
1592 131875016 : DFT_L[2 * i] = tmp;
1593 : }
1594 : }
1595 : }
1596 : }
1597 :
1598 4229186 : if ( hStereoDft->frame_sid_nodata || st0->VAD == 0 )
1599 : {
1600 750436 : hFdCngDec->cna_band_limits[hFdCngDec->cna_nbands] = hStereoDft->band_limits[hFdCngDec->cna_nbands];
1601 : }
1602 :
1603 4229186 : if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
1604 : {
1605 131490 : hStereoCng->first_SID = 0;
1606 131490 : hStereoCng->first_SID_after_TD = 0;
1607 : }
1608 :
1609 138445506 : for ( i = hStereoDft->band_limits[b]; i < hStereoDft->NFFT / 2; i++ )
1610 : {
1611 134216320 : DFT_L[2 * i] = 0.f;
1612 134216320 : DFT_L[2 * i + 1] = 0.f;
1613 134216320 : DFT_R[2 * i] = 0.f;
1614 134216320 : DFT_R[2 * i + 1] = 0.f;
1615 : }
1616 :
1617 : /*Nyquist Freq.*/
1618 4229186 : if ( hStereoDft->band_limits[b] == hStereoDft->NFFT / 2 )
1619 : {
1620 3437418 : DFT_L[1] = pDFT_DMX[1] + g * pDFT_DMX[1];
1621 3437418 : DFT_R[1] = pDFT_DMX[1] - g * pDFT_DMX[1];
1622 3437418 : DFT_L[1] *= INV_SQRT_2;
1623 3437418 : DFT_R[1] *= INV_SQRT_2;
1624 : }
1625 : else
1626 : {
1627 791768 : DFT_L[1] = 0.f;
1628 791768 : DFT_R[1] = 0.f;
1629 : }
1630 : }
1631 : else
1632 : {
1633 0 : pPredGain = NULL; /* to avoid compilation warnings */
1634 0 : pSideGain = NULL;
1635 :
1636 : #ifndef DEBUG_STEREO_DFT_NOSTEREO
1637 : /* Dummy upmix-> mono binauralization */
1638 0 : for ( i = 0; i < hStereoDft->NFFT; i++ )
1639 : {
1640 0 : DFT_L[i] = ( pDFT_DMX[i] + pDFT_RES[i] );
1641 0 : DFT_R[i] = ( pDFT_DMX[i] - pDFT_RES[i] );
1642 : }
1643 : #else
1644 : /*Copy DMX to Left channel and reset Right channel*/
1645 : mvr2r( pDFT_DMX, DFT_L, hStereoDft->NFFT );
1646 : mvr2r( pDFT_DMX, DFT_R, hStereoDft->NFFT );
1647 : #endif
1648 : }
1649 :
1650 : /* Comfort Noise Addition */
1651 4229186 : if ( st0->flag_cna )
1652 : {
1653 3416624 : ptr_per = &hFdCngDec->smoothed_psd[hFdCngCom->startBand];
1654 :
1655 3416624 : scale_fact0 = 0.0f;
1656 3416624 : if ( hFdCngDec->cna_rescale_fact > 0 )
1657 : {
1658 2465178 : scale_fact0 = output_frame / 2 * sqrtf( hFdCngDec->cna_rescale_fact * 0.5f );
1659 : }
1660 :
1661 32203066 : for ( b = 0; b < hFdCngDec->cna_nbands; b++ )
1662 : {
1663 : /* calculate gamma factor reflecting inter-channel correlation and side gain (ILD) */
1664 28786442 : coh = hFdCngDec->cna_cm[b];
1665 28786442 : g = hFdCngDec->cna_g_state[b];
1666 :
1667 28786442 : if ( coh < 0.9f )
1668 : {
1669 23678330 : gamma = coh;
1670 23678330 : gamma = gamma / ( 1 - gamma );
1671 23678330 : gamma = sqrtf( gamma + 1 - g * g ) - sqrtf( gamma );
1672 : }
1673 : else
1674 : {
1675 5108112 : gamma = 0;
1676 : }
1677 :
1678 572029658 : for ( i = max( hFdCngDec->cna_band_limits[b], hFdCngCom->startBand / 2 ); i < min( hFdCngDec->cna_band_limits[b + 1], L_FRAME16k / 2 ); i++ )
1679 : {
1680 543243216 : lev1 = *ptr_per++;
1681 543243216 : lev2 = *ptr_per++;
1682 :
1683 543243216 : if ( lev1 > 0 && lev2 > 0 && max( lev1, lev2 ) / min( lev1, lev2 ) > 1.2f )
1684 : {
1685 : /* take the minimum of two adjacent frequency bins */
1686 31455344 : cna_level = min( lev1, lev2 );
1687 : }
1688 : else
1689 : {
1690 : /* take the average of two adjacent frequency bins */
1691 511787872 : cna_level = 0.5f * ( lev1 + lev2 );
1692 : }
1693 :
1694 543243216 : scale_fact = scale_fact0 * sqrtf( cna_level );
1695 :
1696 : /* generate comfort noise from gaussian noise and add to the decoded DFT spectrum */
1697 543243216 : N1 = scale_fact * rand_gauss( &ftmp, cna_seed );
1698 543243216 : N2 = scale_fact * rand_gauss( &ftmp, cna_seed );
1699 543243216 : DFT_L[2 * i] += ( 1 + g ) * N1 + gamma * N2;
1700 543243216 : DFT_R[2 * i] += ( 1 - g ) * N1 - gamma * N2;
1701 :
1702 543243216 : N1 = scale_fact * rand_gauss( &ftmp, cna_seed );
1703 543243216 : N2 = scale_fact * rand_gauss( &ftmp, cna_seed );
1704 543243216 : DFT_L[2 * i + 1] += ( 1 + g ) * N1 + gamma * N2;
1705 543243216 : DFT_R[2 * i + 1] += ( 1 - g ) * N1 - gamma * N2;
1706 : }
1707 : }
1708 :
1709 : /* update CNA re-scaling factor */
1710 3416624 : hFdCngDec->cna_rescale_fact = 0.8f * hFdCngDec->cna_act_fact;
1711 3416624 : if ( !hFdCngDec->first_cna_noise_updated )
1712 : {
1713 922412 : hFdCngDec->cna_rescale_fact = 0;
1714 : }
1715 : }
1716 :
1717 : /* Update memories */
1718 4229186 : hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX;
1719 4229186 : mvr2r( pDFT_DMX, hStereoDft->DFT_past_DMX[hStereoDft->past_DMX_pos], min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) );
1720 : #ifndef DEBUG_STEREO_DFT_NOSTEREO
1721 4229186 : if ( pPredGain )
1722 : {
1723 4229186 : stereo_dft_adapt_sf_delay( hStereoDft, pPredGain );
1724 : }
1725 : #endif
1726 :
1727 4229186 : mvr2r( DFT_L, DFT[0] + k * STEREO_DFT32MS_N_MAX, hStereoDft->NFFT );
1728 4229186 : mvr2r( DFT_R, DFT[1] + k * STEREO_DFT32MS_N_MAX, hStereoDft->NFFT );
1729 : }
1730 :
1731 2114593 : if ( st0->bfi && !prev_bfi )
1732 : {
1733 38789 : idx_k0 = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX;
1734 38789 : idx_k1 = ( idx_k0 + 1 ) % STEREO_DFT_PAST_MAX;
1735 : /*dmx energy memory*/
1736 38789 : hStereoDft->past_dmx_nrg = stereo_dft_dmx_swb_nrg( hStereoDft->DFT_past_DMX[idx_k0], hStereoDft->DFT_past_DMX[idx_k1], min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) );
1737 : }
1738 :
1739 2114593 : stereo_dft_compute_td_stefi_params( hStereoDft, samp_ratio );
1740 :
1741 2114593 : return;
1742 : }
1743 :
1744 :
1745 : /*-------------------------------------------------------------------------
1746 : * stereo_dft_dec_res()
1747 : *
1748 : * Decode the residual signal
1749 : *-------------------------------------------------------------------------*/
1750 :
1751 754527 : void stereo_dft_dec_res(
1752 : CPE_DEC_HANDLE hCPE, /* i/o: decoder CPE handle */
1753 : float res_buf[STEREO_DFT_N_8k], /* i : residual buffer */
1754 : float *output /* o : output */
1755 : )
1756 : {
1757 : int16_t i;
1758 : float win[L_FRAME8k + STEREO_DFT_OVL_8k];
1759 : float bpf_error_signal_8k[L_FRAME8k];
1760 : int16_t prev_bfi;
1761 : float fac, step;
1762 : int16_t res_bpf_flag;
1763 :
1764 754527 : prev_bfi = hCPE->hCoreCoder[0]->prev_old_bfi; /* The core decoding is already completed here and the prev_bfi has been updated for the next frame.
1765 : The prev_old_bfi still holds the prev_bfi for the current frame. */
1766 :
1767 : /* flush memories when switching residual coding on */
1768 754527 : if ( hCPE->hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1] == STEREO_DFT_RES_COD_OFF )
1769 : {
1770 4302 : set_zero( hCPE->hStereoDft->res_cod_mem, STEREO_DFT_OVL_8k );
1771 4302 : set_zero( hCPE->input_mem[1], NS2SA( 8000, STEREO_DFT32MS_OVL_NS ) );
1772 4302 : set_zero( hCPE->hStereoDft->hBpf->pst_old_syn, STEREO_DFT_NBPSF_PIT_MAX_8k );
1773 4302 : hCPE->hStereoDft->hBpf->pst_mem_deemp_err = 0.f;
1774 : }
1775 :
1776 : /*Inverse MDCT*/
1777 754527 : TCX_MDCT_Inverse( res_buf, win, STEREO_DFT_OVL_8k, L_FRAME8k - STEREO_DFT_OVL_8k, STEREO_DFT_OVL_8k, IVAS_CPE_DFT );
1778 :
1779 754527 : if ( !prev_bfi )
1780 : {
1781 : /*OLA*/
1782 : /*overlapping parts*/
1783 52147228 : for ( i = 0; i < STEREO_DFT_OVL_8k; i++ )
1784 : {
1785 51412760 : win[i] = hCPE->hStereoDft->res_cod_mem[i] + win[i] * hCPE->hStereoDft->win_8k[i];
1786 51412760 : hCPE->hStereoDft->res_cod_mem[i] = win[L_FRAME8k + i] * hCPE->hStereoDft->win_8k[STEREO_DFT_OVL_8k - 1 - i];
1787 : }
1788 : }
1789 : else
1790 : {
1791 : /* For first good frame, ola memory contains extended ECU buffer -- need to crossfade instead of OLA */
1792 20059 : step = (float) ( 1.0f / STEREO_DFT_OVL_8k );
1793 20059 : fac = 0;
1794 1424189 : for ( i = 0; i < STEREO_DFT_OVL_8k; i++ )
1795 : {
1796 1404130 : win[i] = ( 1.0f - fac * fac ) * hCPE->hStereoDft->res_cod_mem[i] + ( 1.0f - ( 1.0f - fac ) * ( 1.0f - fac ) ) * win[i] * hCPE->hStereoDft->win_8k[i];
1797 1404130 : hCPE->hStereoDft->res_cod_mem[i] = win[L_FRAME8k + i] * hCPE->hStereoDft->win_8k[STEREO_DFT_OVL_8k - 1 - i];
1798 1404130 : fac += step;
1799 : }
1800 : }
1801 :
1802 : #ifdef DEBUG_STEREO_DFT_NOQRES
1803 : {
1804 : int16_t tmp[1024];
1805 : dbgread( &tmp, sizeof( int16_t ), L_FRAME8k, "./res/stereo_dft_enc_res_original.pcm" );
1806 : for ( i = 0; i < L_FRAME8k; i++ )
1807 : {
1808 : win[i] = (float) ( tmp[i] );
1809 : }
1810 : }
1811 : #endif
1812 754527 : mvr2r( win, output, L_FRAME8k );
1813 :
1814 : #ifdef DEBUG_MODE_DFT
1815 : {
1816 : int16_t tmp[L_FRAME8k];
1817 :
1818 : for ( i = 0; i < L_FRAME8k; i++ )
1819 : {
1820 : tmp[i] = (int16_t) ( win[i] );
1821 : }
1822 : dbgwrite( tmp, sizeof( int16_t ), L_FRAME8k, 1, "./res/stereo_dft_dec_res_decoded.pcm" );
1823 : }
1824 : #endif
1825 754527 : if ( hCPE->hCoreCoder[0]->core == ACELP_CORE )
1826 : {
1827 : /* bass post-filter */
1828 356230 : bass_psfilter( hCPE->hStereoDft->hBpf, hCPE->hCoreCoder[0]->Opt_AMR_WB, output, L_FRAME8k, hCPE->hCoreCoder[0]->old_pitch_buf + ( L_FRAME8k / STEREO_DFT_L_SUBFR_8k ), hCPE->hCoreCoder[0]->bpf_off,
1829 356230 : hCPE->hCoreCoder[0]->stab_fac, &hCPE->hStereoDft->stab_fac_smooth_res, hCPE->hCoreCoder[0]->last_coder_type, bpf_error_signal_8k );
1830 :
1831 356230 : res_bpf_flag = res_bpf_adapt( hCPE->hStereoDft, bpf_error_signal_8k, res_buf );
1832 356230 : if ( prev_bfi )
1833 : {
1834 : /* Ramp up BPF contribution for the first good frame */
1835 8794 : step = (float) ( 1.0f / L_FRAME8k );
1836 8794 : fac = 0;
1837 1415834 : for ( i = 0; i < L_FRAME8k; i++ )
1838 : {
1839 1407040 : bpf_error_signal_8k[i] *= fac;
1840 1407040 : fac += step;
1841 : }
1842 : }
1843 :
1844 356230 : if ( res_bpf_flag )
1845 : {
1846 335317 : v_sub( output, bpf_error_signal_8k, output, L_FRAME8k );
1847 : }
1848 : }
1849 398297 : else if ( hCPE->hCoreCoder[0]->last_core == ACELP_CORE )
1850 : {
1851 0 : set_zero( hCPE->hStereoDft->hBpf->pst_old_syn, STEREO_DFT_NBPSF_PIT_MAX_8k );
1852 0 : hCPE->hStereoDft->hBpf->pst_mem_deemp_err = 0.f;
1853 : }
1854 : #ifdef DEBUG_MODE_DFT
1855 : {
1856 : int16_t v;
1857 : int16_t out_bpf[L_FRAME8k];
1858 :
1859 : if ( hCPE->hCoreCoder[0]->core == ACELP_CORE )
1860 : {
1861 : for ( v = 0; v < L_FRAME8k; v++ )
1862 : {
1863 : out_bpf[v] = (int16_t) bpf_error_signal_8k[v];
1864 : }
1865 : }
1866 : else
1867 : {
1868 : set_s( out_bpf, 0, L_FRAME8k );
1869 : }
1870 : dbgwrite( out_bpf, sizeof( int16_t ), L_FRAME8k, 1, "res/bpf_res.pcm" );
1871 : }
1872 : #endif
1873 :
1874 754527 : return;
1875 : }
1876 :
1877 :
1878 : /*-------------------------------------------------------------------------
1879 : * stereo_dft_dec_read_BS()
1880 : *
1881 : * Read bitstream
1882 : *-------------------------------------------------------------------------*/
1883 :
1884 2123274 : void stereo_dft_dec_read_BS(
1885 : const int32_t ivas_total_brate, /* i : IVAS total bitrate */
1886 : const int32_t element_brate, /* i : element bitrate */
1887 : int32_t *total_brate, /* o : total bitrate */
1888 : Decoder_State *st, /* i/o: decoder state structure */
1889 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */
1890 : const int16_t bwidth, /* i : bandwidth */
1891 : const int16_t output_frame, /* i : output frame length */
1892 : float res_buf[STEREO_DFT_N_8k], /* o : residual buffer */
1893 : int16_t *nb_bits, /* o : number of bits read */
1894 : float *coh, /* i/o: Coherence */
1895 : const int16_t ivas_format /* i : ivas format */
1896 : )
1897 : {
1898 : int16_t b, N_div, nbands;
1899 : int16_t NFFT_inner;
1900 : int16_t k, k_offset;
1901 : int16_t I;
1902 : int16_t max_bits;
1903 : uint16_t bit_stream_side[800]; /*Max bits per frame for 30kbps*/
1904 : RangeUniDecState range_uni_dec_state;
1905 : ECSQ_instance ecsq_inst;
1906 :
1907 : /* needed for provisorial reordering of indices */
1908 : int16_t ind1[STEREO_DFT_BAND_MAX];
1909 : int16_t n_bits;
1910 : int16_t nb, ind1_ipd[STEREO_DFT_BAND_MAX], ind1_pred[STEREO_DFT_BAND_MAX];
1911 : int16_t sign_flag;
1912 : float sg_tmp[STEREO_DFT_BAND_MAX];
1913 : float res_pred_gain_tmp[STEREO_DFT_BAND_MAX];
1914 : int16_t itd_mode;
1915 :
1916 : #ifdef DEBUG_MODE_DFT
1917 : static FILE *pF = NULL;
1918 : static FILE *ITD_values = NULL, *side_gain_values = NULL, *RPG_values = NULL;
1919 :
1920 : if ( pF == NULL )
1921 : pF = fopen( "./res/stereo_dft_dec_ind.txt", "w" );
1922 : if ( ITD_values == NULL )
1923 : ITD_values = fopen( "./res/itd_indicies_dec.txt", "w" );
1924 : if ( side_gain_values == NULL )
1925 : side_gain_values = fopen( "./res/side_gain_indicies_dec.txt", "w" );
1926 : if ( RPG_values == NULL )
1927 : RPG_values = fopen( "./res/rpg_indicies_dec.txt", "w" );
1928 :
1929 : assert( *nb_bits <= 800 );
1930 : #endif
1931 : /*------------------------------------------------------------------*
1932 : * Initialization
1933 : *-----------------------------------------------------------------*/
1934 :
1935 2123274 : k_offset = STEREO_DFT_OFFSET;
1936 :
1937 2123274 : if ( ivas_total_brate == IVAS_SID_5k2 )
1938 : {
1939 17482 : if ( ivas_format == MASA_FORMAT )
1940 : {
1941 887 : hStereoDft->frame_nodata = 0;
1942 887 : hStereoDft->frame_sid_nodata = 1;
1943 887 : hStereoDft->frame_sid = 1;
1944 887 : *nb_bits = 0;
1945 : }
1946 : else
1947 : {
1948 16595 : hStereoDft->frame_nodata = 0;
1949 16595 : hStereoDft->frame_sid_nodata = 1;
1950 16595 : hStereoDft->frame_sid = 1;
1951 16595 : *nb_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS;
1952 : }
1953 : }
1954 2105792 : else if ( ivas_total_brate == FRAME_NO_DATA )
1955 : {
1956 105299 : hStereoDft->frame_nodata = 1;
1957 105299 : hStereoDft->frame_sid_nodata = 1;
1958 105299 : hStereoDft->frame_sid = 0;
1959 105299 : *nb_bits = 0;
1960 105299 : *total_brate = 0;
1961 105299 : hStereoDft->itd[k = hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->itd_xfade_target;
1962 105299 : hStereoDft->gipd[hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->ipd_xfade_target;
1963 :
1964 105299 : return;
1965 : }
1966 : else
1967 : {
1968 2000493 : hStereoDft->frame_nodata = 0;
1969 2000493 : hStereoDft->frame_sid_nodata = 0;
1970 2000493 : hStereoDft->frame_sid = 0;
1971 :
1972 2000493 : st->total_brate = *nb_bits * FRAMES_PER_SEC;
1973 : }
1974 :
1975 2017975 : hStereoDft->reverb_flag = 0;
1976 :
1977 : /* reverse the bitstream */
1978 389768969 : for ( b = 0; b < *nb_bits; b++ )
1979 : {
1980 387750994 : bit_stream_side[b] = st->bit_stream[-b];
1981 : }
1982 :
1983 : /* make sure the padding bits read ahead by the arithmetic coder (up to 16) or range coder (up to 32) have binary values */
1984 66593175 : for ( ; b < *nb_bits + 32; b++ )
1985 : {
1986 64575200 : bit_stream_side[b] = 0;
1987 : }
1988 2017975 : st->bit_stream = bit_stream_side;
1989 :
1990 : /*init*/
1991 2017975 : max_bits = *nb_bits;
1992 2017975 : *nb_bits = 0;
1993 2017975 : N_div = STEREO_DFT_NBDIV;
1994 :
1995 2017975 : if ( ivas_total_brate > IVAS_SID_5k2 )
1996 : {
1997 2000493 : mvr2r( hStereoDft->side_gain + 2 * STEREO_DFT_BAND_MAX, sg_tmp, STEREO_DFT_BAND_MAX );
1998 2000493 : mvr2r( hStereoDft->res_pred_gain + 2 * STEREO_DFT_BAND_MAX, res_pred_gain_tmp, STEREO_DFT_BAND_MAX );
1999 : }
2000 :
2001 : /* attackPresent always set to 0 in SID frames */
2002 2017975 : if ( hStereoDft->frame_sid )
2003 : {
2004 17482 : hStereoDft->attackPresent = 0;
2005 : }
2006 : else
2007 : {
2008 2000493 : hStereoDft->attackPresent = get_next_indice( st, 1 );
2009 2000493 : ( *nb_bits )++;
2010 : }
2011 :
2012 : /* read res_cod_mode from bitstream */
2013 2017975 : if ( bwidth == WB && hStereoDft->hConfig->ada_wb_res_cod_mode )
2014 : {
2015 154374 : hStereoDft->res_cod_mode[k_offset] = get_next_indice( st, 1 );
2016 154374 : ( *nb_bits )++;
2017 : #ifdef DEBUG_MODE_DFT
2018 : fprintf( pF, "res_cod_mode: %d\n", hStereoDft->res_cod_mode[k_offset] );
2019 : #endif
2020 : }
2021 :
2022 : /* read number of bands in the bitstream - depends on the audio bandwidth and not to output_Fs */
2023 2017975 : if ( hStereoDft->frame_sid )
2024 : {
2025 17482 : NFFT_inner = STEREO_DFT32MS_N_MAX * inner_frame_tbl[bwidth] / L_FRAME48k;
2026 : }
2027 : else
2028 : {
2029 2000493 : NFFT_inner = STEREO_DFT32MS_N_MAX * inner_frame_tbl[st->bwidth] / L_FRAME48k;
2030 : }
2031 :
2032 : /* Use coarse band partition in inactive frames */
2033 2017975 : if ( hStereoDft->frame_sid )
2034 : {
2035 17482 : hStereoDft->band_res[k_offset] = STEREO_DFT_BAND_RES_LOW;
2036 17482 : hStereoDft->res_cod_mode[k_offset] = STEREO_DFT_RES_COD_OFF;
2037 17482 : hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], min( STEREO_DFT32MS_N_MAX, NFFT_inner ), DEC );
2038 :
2039 17482 : if ( hStereoDft->nbands > STEREO_DFT_COH_MAXBAND )
2040 : {
2041 2716 : hStereoDft->band_limits[STEREO_DFT_COH_MAXBAND] = hStereoDft->band_limits[hStereoDft->nbands];
2042 2716 : hStereoDft->nbands = STEREO_DFT_COH_MAXBAND;
2043 : }
2044 : }
2045 : else
2046 : {
2047 2000493 : hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, DEC );
2048 : }
2049 :
2050 2017975 : hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]];
2051 2017975 : hStereoDft->res_cod_line_max = (int16_t) ( 0.5f + ( hStereoDft->band_limits[hStereoDft->res_cod_band_max] - 1 ) * 2.f * output_frame / (float) ( hStereoDft->NFFT ) );
2052 2017975 : hStereoDft->res_cod_line_max = 8 * ( hStereoDft->res_cod_line_max / 8 );
2053 2017975 : hStereoDft->res_pred_band_min = max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
2054 :
2055 : #ifdef DEBUG_MODE_DFT
2056 : fprintf( pF, "stereo Data: %d %d %d %d %d\n", hStereoDft->band_res[k_offset], hStereoDft->prm_res[k_offset], hStereoDft->res_pred_mode[k_offset], hStereoDft->res_cod_mode[k_offset], hStereoDft->res_cod_band_max );
2057 : fprintf( pF, "stereo Bands: %d\n", hStereoDft->nbands );
2058 : #endif
2059 :
2060 : /*Copy config. for all DFT frames*/
2061 2017975 : set_s( hStereoDft->band_res + k_offset + 1, hStereoDft->band_res[k_offset], N_div - 1 );
2062 2017975 : set_s( hStereoDft->prm_res + k_offset + 1, hStereoDft->prm_res[k_offset], N_div - 1 );
2063 2017975 : set_s( hStereoDft->res_pred_mode + k_offset + 1, hStereoDft->res_pred_mode[k_offset], N_div - 1 );
2064 2017975 : set_s( hStereoDft->res_cod_mode + k_offset + 1, hStereoDft->res_cod_mode[k_offset], N_div - 1 );
2065 :
2066 : /*------------------------------------------------------------------*
2067 : * Read DFT stereo parameters
2068 : *-----------------------------------------------------------------*/
2069 :
2070 : /* Sent from the latest to the oldest */
2071 4035950 : for ( k = hStereoDft->prm_res[k_offset] - 1; k < N_div; k += hStereoDft->prm_res[k + k_offset] )
2072 : {
2073 : #ifdef DEBUG_MODE_DFT
2074 : fprintf( pF, "ch[%d]:", k );
2075 : #endif
2076 : /* reset parameters */
2077 2017975 : set_zero( hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX );
2078 2017975 : hStereoDft->gipd[k + k_offset] = 0.f;
2079 2017975 : set_zero( hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX );
2080 :
2081 : #ifdef DEBUG_MODE_DFT
2082 : fprintf( pF, "ITD: %d ", hStereoDft->hConfig->itd_mode );
2083 : #endif
2084 :
2085 2017975 : if ( !( ivas_format == MASA_FORMAT && ivas_total_brate <= IVAS_SID_5k2 ) )
2086 : {
2087 : /*------------------------------------------------------------------*
2088 : * read Side gains
2089 : *-----------------------------------------------------------------*/
2090 :
2091 : /* side gain */
2092 : /* get coding type */
2093 : /* Do not read and decode side gain if a NO_DATA frame */
2094 2017088 : if ( !hStereoDft->frame_nodata )
2095 : {
2096 2017088 : n_bits = 0;
2097 2017088 : nb = st->next_bit_pos;
2098 2017088 : n_bits = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->side_gain_flag_1 );
2099 2017088 : nb += n_bits;
2100 :
2101 2017088 : if ( hStereoDft->side_gain_flag_1 == 0 )
2102 : {
2103 1397064 : b = read_BS_adapt_GR_sg( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2, dft_maps_sg );
2104 1397064 : n_bits += b;
2105 : }
2106 : else
2107 : {
2108 620024 : if ( hStereoDft->side_gain_flag_1 == 2 ) /* differential */
2109 : {
2110 607161 : b = read_BS_GR( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2 );
2111 607161 : n_bits += b;
2112 6681512 : for ( b = 0; b < hStereoDft->nbands; b++ )
2113 : {
2114 6074351 : ind1[b] += hStereoDft->side_gain_index_previous[b];
2115 : }
2116 : }
2117 : else
2118 : {
2119 110212 : for ( b = 0; b < hStereoDft->nbands; b++ )
2120 : {
2121 97349 : ind1[b] = get_value( &st->bit_stream[nb], STEREO_DFT_SIDEGAIN_NBITS );
2122 97349 : nb += STEREO_DFT_SIDEGAIN_NBITS;
2123 97349 : n_bits += STEREO_DFT_SIDEGAIN_NBITS;
2124 : }
2125 : }
2126 : }
2127 :
2128 22011110 : for ( b = 0; b < hStereoDft->nbands; b++ )
2129 : {
2130 19994022 : hStereoDft->side_gain_index_previous[b] = ind1[b];
2131 :
2132 19994022 : hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX] = ind1[b];
2133 : }
2134 :
2135 : #ifdef DEBUG_MODE_DFT
2136 : for ( b = 0; b < hStereoDft->nbands; b++ )
2137 : {
2138 : fprintf( pF, "Side gain: %d ", ind1[b] );
2139 : fprintf( side_gain_values, " %d ", ind1[b] );
2140 : }
2141 : #endif
2142 2017088 : st->next_bit_pos += n_bits;
2143 2017088 : ( *nb_bits ) += n_bits;
2144 : }
2145 :
2146 : /*------------------------------------------------------------------*
2147 : * read ITDs
2148 : *-----------------------------------------------------------------*/
2149 :
2150 2017088 : if ( !hStereoDft->frame_sid_nodata )
2151 : {
2152 2000493 : itd_mode = get_next_indice( st, STEREO_DFT_ITD_MODE_NBITS );
2153 2000493 : ( *nb_bits ) += STEREO_DFT_ITD_MODE_NBITS; /*ITD mode flag: 1bit*/
2154 :
2155 2000493 : hStereoDft->itd[k + k_offset] = 0.f;
2156 2000493 : if ( itd_mode )
2157 : {
2158 616878 : ( *nb_bits ) += read_itd( st, &I );
2159 616878 : stereo_dft_dequantize_itd( &I, hStereoDft->itd + k + k_offset, st->output_Fs );
2160 : #ifdef DEBUG_MODE_DFT
2161 : fprintf( pF, "ITD: %d ", I );
2162 : fprintf( ITD_values, "%d %d ", frame, I );
2163 : #endif
2164 : }
2165 : }
2166 16595 : else if ( *nb_bits <= ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_ITD_MODE_NBITS - STEREO_DFT_SID_ITD_NBITS - 1 - SID_FORMAT_NBITS ) )
2167 : {
2168 16595 : itd_mode = get_next_indice( st, STEREO_DFT_ITD_MODE_NBITS );
2169 16595 : ( *nb_bits ) += STEREO_DFT_ITD_MODE_NBITS; /*ITD mode flag: 1bit*/
2170 :
2171 16595 : hStereoDft->itd[k + k_offset] = 0.f;
2172 16595 : if ( itd_mode )
2173 : {
2174 1016 : sign_flag = get_next_indice( st, 1 );
2175 1016 : I = get_next_indice( st, STEREO_DFT_SID_ITD_NBITS );
2176 1016 : ( *nb_bits ) += STEREO_DFT_SID_ITD_NBITS + 1;
2177 1016 : I = I << STEREO_DFT_SID_ITD_FAC;
2178 1016 : I += 256 * sign_flag;
2179 1016 : stereo_dft_dequantize_itd( &I, hStereoDft->itd + k + k_offset, st->output_Fs );
2180 : #ifdef DEBUG_MODE_DFT
2181 : fprintf( pF, "ITD: %d ", I );
2182 : fprintf( ITD_values, "%d %d ", frame, I );
2183 : #endif
2184 : }
2185 : }
2186 :
2187 : /*------------------------------------------------------------------*
2188 : * read IPDs
2189 : *-----------------------------------------------------------------*/
2190 :
2191 2017088 : n_bits = 0;
2192 2017088 : nb = st->next_bit_pos;
2193 :
2194 2017088 : if ( !hStereoDft->frame_sid_nodata )
2195 : {
2196 : /* Active frame */
2197 2000493 : hStereoDft->no_ipd_flag = st->bit_stream[nb];
2198 2000493 : nb += 1;
2199 2000493 : n_bits += 1;
2200 2000493 : if ( hStereoDft->no_ipd_flag == 0 )
2201 : {
2202 65285 : ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_GIPD_NBITS );
2203 65285 : nb += STEREO_DFT_GIPD_NBITS;
2204 65285 : n_bits += STEREO_DFT_GIPD_NBITS;
2205 65285 : stereo_dft_dequantize_ipd( &ind1_ipd[0], hStereoDft->gipd + ( k + k_offset ), 1, STEREO_DFT_GIPD_NBITS );
2206 : }
2207 : }
2208 16595 : else if ( *nb_bits <= ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_FLAG_BITS - STEREO_DFT_SID_GIPD_NBITS - SID_FORMAT_NBITS ) )
2209 : {
2210 : /* SID frame, only read IPD only if enough bits left in bitstream */
2211 16595 : hStereoDft->no_ipd_flag = st->bit_stream[nb];
2212 16595 : nb += 1;
2213 16595 : n_bits += 1;
2214 16595 : if ( hStereoDft->no_ipd_flag == 0 )
2215 : {
2216 2346 : ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_SID_GIPD_NBITS );
2217 2346 : nb += STEREO_DFT_SID_GIPD_NBITS;
2218 2346 : n_bits += STEREO_DFT_SID_GIPD_NBITS;
2219 2346 : stereo_dft_dequantize_ipd( &ind1_ipd[0], hStereoDft->gipd + ( k + k_offset ), 1, STEREO_DFT_SID_GIPD_NBITS );
2220 : }
2221 : }
2222 : else
2223 : {
2224 0 : hStereoDft->no_ipd_flag = 1;
2225 : }
2226 :
2227 2017088 : st->next_bit_pos += n_bits;
2228 2017088 : ( *nb_bits ) += n_bits;
2229 :
2230 : /*------------------------------------------------------------------*
2231 : * read Residual parameters
2232 : *-----------------------------------------------------------------*/
2233 :
2234 : /* Residual prediction */ /* Switch it off if ITD detected */
2235 2017088 : n_bits = 0;
2236 2017088 : nb = st->next_bit_pos;
2237 :
2238 : /* Not used in inactive frames */
2239 2017088 : if ( !hStereoDft->frame_sid_nodata )
2240 : {
2241 2000493 : if ( hStereoDft->res_pred_mode[k + k_offset] && ( hStereoDft->attackPresent == 0 ) )
2242 : {
2243 1941605 : nbands = min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX );
2244 :
2245 1941605 : hStereoDft->reverb_flag = 0;
2246 1941605 : hStereoDft->nbands_respred = nbands;
2247 :
2248 : /* Read bit for adaptive SF (WB/SWB & FB) */
2249 1941605 : if ( hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF )
2250 : {
2251 1201927 : hStereoDft->reverb_flag = get_next_indice( st, STEREO_DFT_REVERB_MODE_NBITS );
2252 1201927 : ( *nb_bits ) += STEREO_DFT_REVERB_MODE_NBITS;
2253 1201927 : nb += STEREO_DFT_REVERB_MODE_NBITS;
2254 : #ifdef DEBUG_MODE_DFT
2255 : fprintf( RPG_values, " reverb_flag %d ", hStereoDft->reverb_flag );
2256 : #endif
2257 1201927 : if ( hStereoDft->reverb_flag )
2258 : {
2259 446872 : nbands -= STEREO_DFT_RES_PRED_BAND_MIN_CONST;
2260 : }
2261 : }
2262 :
2263 : /* get coding type */
2264 1941605 : b = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->res_pred_flag_0 );
2265 1941605 : nb += b;
2266 1941605 : n_bits += b;
2267 :
2268 1941605 : if ( hStereoDft->res_pred_flag_0 == 0 )
2269 : {
2270 : #ifdef DEBUG_MODE_DFT
2271 : fprintf( RPG_values, "flag: 0" );
2272 : #endif
2273 544517 : b = read_BS_adapt_GR_rpg( st->bit_stream, nb, ind1_pred, hStereoDft->res_pred_band_min, nbands, &hStereoDft->res_pred_flag_1 );
2274 544517 : n_bits += b;
2275 : }
2276 : else
2277 : {
2278 1397088 : if ( hStereoDft->res_pred_flag_0 == 2 )
2279 : {
2280 : #ifdef DEBUG_MODE_DFT
2281 : fprintf( RPG_values, "flag: 2" );
2282 : #endif
2283 1267614 : b = read_BS_GR( st->bit_stream, nb, &ind1_pred[hStereoDft->res_pred_band_min], nbands - hStereoDft->res_pred_band_min, &hStereoDft->res_pred_flag_1 );
2284 :
2285 1267614 : n_bits += b;
2286 10307972 : for ( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
2287 : {
2288 9040358 : ind1_pred[b] += hStereoDft->res_pred_index_previous[b];
2289 : }
2290 : }
2291 : else
2292 : {
2293 : #ifdef DEBUG_MODE_DFT
2294 : fprintf( RPG_values, "flag: 1" );
2295 : #endif
2296 1005388 : for ( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
2297 : {
2298 875914 : ind1_pred[b] = get_value( &st->bit_stream[nb], STEREO_DFT_RES_GAINS_BITS );
2299 875914 : nb += STEREO_DFT_RES_GAINS_BITS;
2300 875914 : n_bits += STEREO_DFT_RES_GAINS_BITS;
2301 : }
2302 : }
2303 : }
2304 :
2305 5608825 : for ( b = 0; b < hStereoDft->res_pred_band_min; b++ )
2306 : {
2307 3667220 : I = 0;
2308 3667220 : stereo_dft_dequantize_res_gains( ind1 + b, &I, hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 );
2309 3667220 : hStereoDft->res_pred_index_previous[b] = I;
2310 3667220 : hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] = 0;
2311 : }
2312 :
2313 15773008 : for ( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
2314 : {
2315 13831403 : I = ind1_pred[b];
2316 13831403 : stereo_dft_dequantize_res_gains( ind1 + b, &I, hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 );
2317 : #ifdef DEBUG_MODE_DFT
2318 : fprintf( pF, "Res pred values: %d ", I );
2319 : if ( hStereoDft->res_pred_flag_0 == 2 )
2320 : fprintf( RPG_values, " %d(%d) ", I, hStereoDft->res_pred_index_previous[b] );
2321 : else
2322 : fprintf( RPG_values, " %d ", I );
2323 : #endif
2324 13831403 : hStereoDft->res_pred_index_previous[b] = I;
2325 13831403 : hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] = I;
2326 : }
2327 :
2328 3744468 : for ( ; b < hStereoDft->nbands; b++ )
2329 : {
2330 1802863 : I = 0;
2331 1802863 : stereo_dft_dequantize_res_gains( ind1 + b, &I, hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 );
2332 1802863 : hStereoDft->res_pred_index_previous[b] = I;
2333 1802863 : hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] = 0;
2334 : }
2335 : }
2336 : else
2337 : {
2338 655567 : for ( b = 0; b < hStereoDft->nbands; b++ )
2339 : {
2340 596679 : I = 0;
2341 596679 : stereo_dft_dequantize_res_gains( ind1 + b, &I, hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 );
2342 596679 : hStereoDft->res_pred_index_previous[b] = I;
2343 596679 : hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] = I;
2344 : }
2345 : }
2346 :
2347 2000493 : st->next_bit_pos += n_bits;
2348 2000493 : ( *nb_bits ) += n_bits;
2349 : }
2350 : else
2351 : {
2352 : /* Dequantize sidegain if SID frame */
2353 16595 : if ( hStereoDft->frame_sid )
2354 : {
2355 112452 : for ( b = 0; b < hStereoDft->nbands; b++ )
2356 : {
2357 95857 : I = 0;
2358 95857 : stereo_dft_dequantize_res_gains( ind1 + b, &I, hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 );
2359 : }
2360 : }
2361 : }
2362 : }
2363 :
2364 : #ifdef DEBUG_MODE_DFT
2365 : /*fprintf(stderr, "\nbres: %d\n", *nb_bits - nb_bits0);*/
2366 : #endif
2367 : }
2368 :
2369 2017975 : if ( !( ivas_format == MASA_FORMAT && ivas_total_brate <= IVAS_SID_5k2 ) )
2370 : {
2371 2017088 : if ( hStereoDft->side_gain_flag_1 != 2 )
2372 : {
2373 1409927 : hStereoDft->sg_mem_corrupt = 0;
2374 : }
2375 : }
2376 :
2377 2017975 : if ( ivas_total_brate > IVAS_SID_5k2 )
2378 : {
2379 2000493 : hStereoDft->recovery_flg = stereo_dft_sg_recovery( hStereoDft );
2380 :
2381 2000493 : if ( hStereoDft->recovery_flg )
2382 : {
2383 6732 : mvr2r( sg_tmp, hStereoDft->side_gain + 2 * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX );
2384 6732 : mvr2r( res_pred_gain_tmp, hStereoDft->res_pred_gain + 2 * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX );
2385 : }
2386 : }
2387 :
2388 : /*----------------------------------------------------------------*
2389 : * Residual decoding: spectral lines
2390 : *----------------------------------------------------------------*/
2391 :
2392 : /* Residual coding not used in inactive frames */
2393 2017975 : if ( hStereoDft->res_cod_band_max > 0 && !hStereoDft->frame_sid_nodata )
2394 : {
2395 : int16_t dec[STEREO_DFT_N_MAX_RES];
2396 :
2397 754527 : I = get_next_indice( st, STEREO_DFT_RES_GLOBAL_GAIN_BITS );
2398 754527 : ( *nb_bits ) += STEREO_DFT_RES_GLOBAL_GAIN_BITS;
2399 :
2400 : #ifdef DEBUG_MODE_DFT
2401 : fprintf( pF, "\nGain: %d ", I );
2402 : #endif
2403 :
2404 754527 : push_wmops( "residual_decode" );
2405 754527 : if ( I != ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO )
2406 : {
2407 692760 : ECSQ_init_instance( &ecsq_inst, 0 /*dummy index*/, &range_uni_dec_state );
2408 :
2409 692760 : rc_uni_dec_init( &range_uni_dec_state, bit_stream_side + *nb_bits, max_bits - *nb_bits );
2410 :
2411 692760 : hStereoDft->res_global_gain = ECSQ_dequantize_gain( I );
2412 :
2413 692760 : ecsq_inst.config_index = 2 * hStereoDft->res_cod_mode[k_offset] - 1;
2414 :
2415 692760 : ECSQ_decode( &ecsq_inst, hStereoDft->res_cod_line_max, dec );
2416 :
2417 692760 : n_bits = rc_uni_dec_finish( &range_uni_dec_state );
2418 :
2419 : #ifdef DEBUGGING
2420 : /* IVAS_fmToDo: the assert has to be changed with proper bitstream error handling */
2421 : assert( range_uni_dec_state.bit_error_detected == 0 );
2422 : #endif
2423 :
2424 692760 : set_zero( res_buf, STEREO_DFT_N_8k );
2425 692760 : ECSQ_dequantize_vector( dec, hStereoDft->res_global_gain, hStereoDft->res_cod_line_max, res_buf );
2426 : }
2427 : else
2428 : {
2429 61767 : set_s( dec, 0, hStereoDft->res_cod_line_max );
2430 61767 : hStereoDft->res_global_gain = 0.0f;
2431 61767 : n_bits = 0;
2432 61767 : set_zero( res_buf, STEREO_DFT_N_8k );
2433 : }
2434 :
2435 754527 : ( *nb_bits ) += n_bits;
2436 754527 : pop_wmops();
2437 :
2438 : #ifdef DEBUG_MODE_DFT
2439 : fprintf( pF, "%d (max: %d)", n_bits + STEREO_DFT_RES_GLOBAL_GAIN_BITS, max_bits );
2440 : /*fprintf(pF, "%d (max: %d)", n_bits, max_bits);*/
2441 : #endif
2442 : }
2443 :
2444 2017975 : if ( hStereoDft->frame_sid && !( ivas_format == MASA_FORMAT && ivas_total_brate <= IVAS_SID_5k2 ) )
2445 : {
2446 16595 : stereo_dft_dec_sid_coh( st, hStereoDft->nbands, coh, nb_bits );
2447 : }
2448 :
2449 2017975 : if ( ivas_total_brate == IVAS_SID_5k2 && ivas_format != MASA_FORMAT )
2450 : {
2451 16595 : *nb_bits = (int16_t) ( ( element_brate - SID_2k40 ) / FRAMES_PER_SEC ); /* => hCPE->hCoreCoder[0]->total_brate = SID_2k40; */
2452 : }
2453 : {
2454 2017975 : *total_brate = element_brate - ( *nb_bits * FRAMES_PER_SEC );
2455 : }
2456 :
2457 : #ifdef DEBUG_MODE_DFT
2458 : /*fprintf(pF, "Total bits: %d", (*nb_bits));*/
2459 : fprintf( pF, "\n" );
2460 : fprintf( ITD_values, "\n" );
2461 : fprintf( side_gain_values, "\n" );
2462 : fprintf( RPG_values, "\n" );
2463 : #endif
2464 :
2465 2017975 : return;
2466 : }
2467 :
2468 :
2469 : /*-------------------------------------------------------------------------
2470 : * stereo_dft_compute_td_stefi_params()
2471 : *
2472 : *
2473 : *-------------------------------------------------------------------------*/
2474 :
2475 2114593 : static void stereo_dft_compute_td_stefi_params(
2476 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */
2477 : const float samp_ratio /* i : sampling ratio */
2478 : )
2479 : {
2480 : int16_t pdmx_ind;
2481 : float g2;
2482 : int16_t bin0;
2483 : int16_t band0;
2484 : int16_t b;
2485 : int16_t nbands;
2486 : int16_t bres;
2487 : float wsum;
2488 : float pred_gain_avg, pred_g;
2489 : float nrg_DMX, nrg_pred_DMX;
2490 :
2491 2114593 : pdmx_ind = hStereoDft->past_DMX_pos;
2492 2114593 : bres = hStereoDft->band_res[1];
2493 :
2494 2114593 : if ( hStereoDft->core_hist[1] != ACELP_CORE || hStereoDft->wasTransient )
2495 : {
2496 1242757 : hStereoDft->td_gain[0] = 0;
2497 :
2498 1242757 : return;
2499 : }
2500 :
2501 871836 : bin0 = (int16_t) ( samp_ratio * hStereoDft->NFFT / 2 + .5 );
2502 871836 : bin0 = min( bin0, hStereoDft->band_limits[hStereoDft->nbands] );
2503 871836 : b = hStereoDft->nbands;
2504 2769726 : while ( hStereoDft->band_limits[b] > bin0 )
2505 : {
2506 1897890 : b--;
2507 : }
2508 871836 : band0 = b;
2509 :
2510 : /* calculate averages over high bands */
2511 871836 : pred_g = pred_gain_avg = 0;
2512 871836 : nbands = 0;
2513 871836 : wsum = 0;
2514 2712254 : for ( b = band0; b < hStereoDft->nbands; b++ )
2515 : {
2516 1862765 : if ( min( hStereoDft->past_res_pred_gain[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 1, pdmx_ind )][b], hStereoDft->past_res_pred_gain[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 2, pdmx_ind )][b] ) < 0 )
2517 : {
2518 22347 : hStereoDft->td_gain[0] = 0;
2519 22347 : return;
2520 : }
2521 1840418 : pred_g += ( hStereoDft->res_pred_gain[b + STEREO_DFT_BAND_MAX] + hStereoDft->res_pred_gain[b + 2 * STEREO_DFT_BAND_MAX] ) / 2 * dft_res_pred_weights[bres][b - band0];
2522 1840418 : pred_gain_avg += ( hStereoDft->past_res_pred_gain[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 2, pdmx_ind )][b] + hStereoDft->past_res_pred_gain[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 1, pdmx_ind )][b] ) / 2 * dft_res_pred_weights[bres][b - band0];
2523 :
2524 1840418 : nbands++;
2525 1840418 : wsum += dft_res_pred_weights[bres][b - band0];
2526 : }
2527 :
2528 849489 : if ( nbands == 0 )
2529 : {
2530 : /* apparently, there is nothing to do here */
2531 105916 : hStereoDft->td_gain[0] = 0;
2532 105916 : return;
2533 : }
2534 :
2535 743573 : pred_g /= wsum;
2536 743573 : pred_gain_avg /= wsum;
2537 :
2538 743573 : nrg_DMX = hStereoDft->hb_nrg[0];
2539 743573 : nrg_pred_DMX = hStereoDft->hb_nrg[1];
2540 :
2541 743573 : g2 = pred_g * sqrtf( ( 0.001f + nrg_DMX ) / ( 0.001f + nrg_pred_DMX ) );
2542 :
2543 743573 : hStereoDft->td_gain[0] = min( pred_gain_avg * STEREO_DFT_STEFFI_GAIN_AMP, pred_gain_avg * ( 1 - STEREO_DFT_STEFFI_GAIN_REST_AMT ) + g2 * STEREO_DFT_STEFFI_GAIN_REST_AMT );
2544 :
2545 743573 : return;
2546 : }
2547 :
2548 :
2549 : /*-------------------------------------------------------------------------
2550 : * stereo_dft_generate_res_pred()
2551 : *
2552 : *
2553 : *-------------------------------------------------------------------------*/
2554 3704726 : void stereo_dft_generate_res_pred(
2555 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */
2556 : const float samp_ratio, /* i : sampling ratio */
2557 : float *pDFT_DMX, /* i : downmix signal */
2558 : float *DFT_PRED_RES, /* o : residual prediction signal */
2559 : float *pPredGain, /* i : residual prediction gains */
2560 : const int16_t k, /* i : subframe index */
2561 : float *ap_filt_DMX, /* i : enhanced stereo filling signal */
2562 : int16_t *stop, /* o : last FD stereo filling bin */
2563 : const int16_t bfi /* i : BFI flag */
2564 : )
2565 : {
2566 : /* general variables */
2567 : int16_t i, b;
2568 : int16_t begin, end;
2569 : int16_t bin0, band0; /* ESF->Stefi crossover bin/band */
2570 : int16_t lb_stefi_start_band;
2571 :
2572 : /* variables for enhanced stereo filling */
2573 : float norm_fac;
2574 : float alpha, gain_limit;
2575 :
2576 : /* variables for stereo filling */
2577 : int16_t d_long, d_short, d_long_ind, d_short_ind;
2578 : float g_short, g_long;
2579 : float dmx_nrg, rev_nrg;
2580 : float past_dmx_nrg;
2581 : float pred_gain_avg;
2582 : float g2;
2583 : int16_t nbands_respred;
2584 :
2585 3704726 : push_wmops( "gen_respred" );
2586 :
2587 : /* smoothing and limiting parameters */
2588 3704726 : alpha = hStereoDft->wasTransient ? 0 : 0.2f; /* no smoothing after transients */
2589 3704726 : gain_limit = 2;
2590 :
2591 : /* residual prediction only used up to 16 kHz (SWB) */
2592 3704726 : nbands_respred = min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX );
2593 :
2594 : /* In ACELP mode the downmix signal is not available in bandwidth extension area. *
2595 : * Therefore, the downmix energy in the corresponding subbands is estimated. */
2596 3704726 : bin0 = (int16_t) ( samp_ratio * hStereoDft->NFFT / 2 + .5 );
2597 3704726 : bin0 = min( bin0, hStereoDft->band_limits[hStereoDft->nbands] );
2598 3704726 : b = hStereoDft->nbands;
2599 12464990 : while ( hStereoDft->band_limits[b] >= bin0 )
2600 : {
2601 8760264 : b--;
2602 : }
2603 3704726 : band0 = b;
2604 :
2605 3704726 : if ( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET] < STEREO_DFT_RESPRED_ESF )
2606 : {
2607 : /* no ESF signal available, use stereo filling over whole spectrum */
2608 1286004 : lb_stefi_start_band = max( hStereoDft->res_pred_band_min, hStereoDft->res_cod_band_max );
2609 : }
2610 : else
2611 : {
2612 : /* ESF signal available, use ESF in lowband, stereo filling in highband */
2613 2418722 : lb_stefi_start_band = max( band0, hStereoDft->res_cod_band_max );
2614 : }
2615 :
2616 3704726 : if ( bfi )
2617 : {
2618 128918 : lb_stefi_start_band = 0;
2619 : }
2620 :
2621 : /* lowband: use ESF if available, else use stereo filling */
2622 3704726 : if ( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET] == STEREO_DFT_RESPRED_ESF )
2623 : {
2624 : /* ESF in lowband */
2625 : /* main loop over core region*/
2626 20965610 : for ( b = hStereoDft->res_cod_band_max; b <= band0; b++ )
2627 : {
2628 18546888 : dmx_nrg = EPSILON;
2629 18546888 : rev_nrg = EPSILON;
2630 :
2631 : /* calculate band energies (low band only in case of ACELP) */
2632 367270182 : for ( i = hStereoDft->band_limits[b]; i < min( hStereoDft->band_limits[b + 1], bin0 ); i++ )
2633 : {
2634 348723294 : dmx_nrg += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1];
2635 348723294 : rev_nrg += ap_filt_DMX[2 * i] * ap_filt_DMX[2 * i] + ap_filt_DMX[2 * i + 1] * ap_filt_DMX[2 * i + 1];
2636 : }
2637 :
2638 : /* smoothing */
2639 18546888 : hStereoDft->smooth_res_nrg[b] = alpha * hStereoDft->smooth_res_nrg[b] + ( 1 - alpha ) * rev_nrg;
2640 18546888 : hStereoDft->smooth_dmx_nrg[b] = alpha * hStereoDft->smooth_dmx_nrg[b] + ( 1 - alpha ) * dmx_nrg;
2641 :
2642 : /* normalization factor */
2643 18546888 : norm_fac = sqrtf( hStereoDft->smooth_dmx_nrg[b] / hStereoDft->smooth_res_nrg[b] );
2644 :
2645 : /* gain compressor */
2646 18546888 : norm_fac *= min( max( 0.8f, 1 / norm_fac ), 1.25f );
2647 :
2648 : /* gain limiter */
2649 18546888 : norm_fac = min( norm_fac, gain_limit );
2650 :
2651 367270182 : for ( i = hStereoDft->band_limits[b]; i < min( hStereoDft->band_limits[b + 1], bin0 ); i++ )
2652 : {
2653 348723294 : DFT_PRED_RES[2 * i] = norm_fac * pPredGain[b] * ap_filt_DMX[2 * i];
2654 348723294 : DFT_PRED_RES[2 * i + 1] = norm_fac * pPredGain[b] * ap_filt_DMX[2 * i + 1];
2655 : }
2656 : }
2657 : }
2658 1286004 : else if ( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET] == STEREO_DFT_RESPRED_STEFI )
2659 : {
2660 : /* stefi in lowband */
2661 1154514 : set_zero( DFT_PRED_RES, 2 * hStereoDft->band_limits[lb_stefi_start_band] );
2662 :
2663 7156434 : for ( b = lb_stefi_start_band; b <= band0; b++ )
2664 : {
2665 6001920 : d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_STEFFI_DELAY_SHORT + b % 2;
2666 6001920 : d_long_ind = max( 4, (int16_t) ( ( STEREO_DFT_PAST_MAX + 4 - 1 ) * ( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f ) ) - 4;
2667 : /* make sure d_short really corresponds to a shorter or equally long delay than d_long (e.g. not always the case for
2668 : * STEREO_DFT_STEFFI_DELAY_SHORT=3 and STEREO_DFT_STEFFI_DELAY_LONG=4)*/
2669 6001920 : d_short_ind = max( d_short_ind, d_long_ind );
2670 :
2671 : /* Even number of window sliding (assymmetric OLA) */
2672 6001920 : d_short_ind = 2 * ( d_short_ind / 2 );
2673 6001920 : d_long_ind = 2 * ( d_long_ind / 2 );
2674 :
2675 6001920 : d_short = STEREO_DFT_PAST_MAX - d_short_ind;
2676 6001920 : d_long = STEREO_DFT_PAST_MAX - d_long_ind;
2677 :
2678 6001920 : d_short_ind = ( d_short_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX;
2679 6001920 : d_long_ind = ( d_long_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX;
2680 :
2681 6001920 : g_short = hStereoDft->stefi_short_gain;
2682 6001920 : g_long = hStereoDft->stefi_long_gain;
2683 :
2684 : /* change mixing ratio if long and short delay are the same */
2685 6001920 : if ( d_short == d_long )
2686 : {
2687 893088 : g_short = 1;
2688 893088 : g_long = 0;
2689 : }
2690 :
2691 : /* Avoid transient components */
2692 6001920 : if ( hStereoDft->past_res_pred_gain[d_short_ind][b] == -1 && hStereoDft->past_res_pred_gain[d_long_ind][b] == -1 )
2693 : {
2694 186778 : g_long = 0.0f;
2695 186778 : g_short = 0.0f;
2696 : }
2697 5815142 : else if ( hStereoDft->past_res_pred_gain[d_short_ind][b] == -1 )
2698 : {
2699 126330 : g_long = 1.0f;
2700 126330 : g_short = 0.0f;
2701 : }
2702 5688812 : else if ( hStereoDft->past_res_pred_gain[d_long_ind][b] == -1 )
2703 : {
2704 126244 : g_long = 0.0f;
2705 126244 : g_short = 1.0f;
2706 : }
2707 :
2708 6001920 : if ( max( g_short, g_long ) > 0 )
2709 : {
2710 5815142 : past_dmx_nrg = EPSILON;
2711 5815142 : dmx_nrg = EPSILON;
2712 158964060 : for ( i = hStereoDft->band_limits[b]; i < min( bin0, hStereoDft->band_limits[b + 1] ); i++ )
2713 : {
2714 153148918 : dmx_nrg += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1];
2715 :
2716 153148918 : DFT_PRED_RES[2 * i] = g_short * ( hStereoDft->DFT_past_DMX[d_short_ind][2 * i] ) + g_long * ( hStereoDft->DFT_past_DMX[d_long_ind][2 * i] );
2717 153148918 : DFT_PRED_RES[2 * i + 1] = g_short * ( hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1] ) + g_long * ( hStereoDft->DFT_past_DMX[d_long_ind][2 * i + 1] );
2718 :
2719 153148918 : past_dmx_nrg += DFT_PRED_RES[2 * i] * DFT_PRED_RES[2 * i] + DFT_PRED_RES[2 * i + 1] * DFT_PRED_RES[2 * i + 1];
2720 : }
2721 5815142 : if ( !bfi || b >= hStereoDft->res_cod_band_max )
2722 : {
2723 5520002 : norm_fac = sqrtf( ( 0.001f + dmx_nrg ) / ( 0.001f + past_dmx_nrg ) );
2724 5520002 : g2 = pPredGain[b] * norm_fac;
2725 5520002 : pred_gain_avg = g_short * hStereoDft->past_res_pred_gain[d_short_ind][b] +
2726 5520002 : g_long * hStereoDft->past_res_pred_gain[d_long_ind][b];
2727 :
2728 5520002 : g2 = min( pred_gain_avg * STEREO_DFT_STEFFI_GAIN_AMP, pred_gain_avg * ( 1 - STEREO_DFT_STEFFI_GAIN_REST_AMT ) + g2 * STEREO_DFT_STEFFI_GAIN_REST_AMT );
2729 :
2730 157488360 : for ( i = hStereoDft->band_limits[b]; i < min( bin0, hStereoDft->band_limits[b + 1] ); i++ )
2731 : {
2732 151968358 : DFT_PRED_RES[2 * i] *= g2;
2733 151968358 : DFT_PRED_RES[2 * i + 1] *= g2;
2734 : }
2735 : }
2736 : }
2737 : else
2738 : {
2739 186778 : set_zero( DFT_PRED_RES + 2 * hStereoDft->band_limits[b], 2 * ( min( bin0, hStereoDft->band_limits[b + 1] ) - hStereoDft->band_limits[b] ) );
2740 : }
2741 : }
2742 : }
2743 :
2744 : #ifndef DEBUG_STEREO_DFT_NOCORE
2745 3704726 : if ( hStereoDft->band_limits[nbands_respred] > bin0 )
2746 : {
2747 : /* apply stereo filling in ACELP BWE region */
2748 3151852 : if ( hStereoDft->core_hist[0] == ACELP_CORE && hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2] == ACELP_CORE )
2749 : {
2750 : /* ACELP -> ACELP: nothing to do */
2751 1483550 : *stop = bin0;
2752 : }
2753 1668302 : else if ( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2] == ACELP_CORE )
2754 : {
2755 : /* ACELP -> TCX/HQ core transition */
2756 : /* calculate high band energy only */
2757 102400 : dmx_nrg = EPSILON;
2758 26105216 : for ( i = bin0; i < hStereoDft->NFFT / 2; i++ )
2759 : {
2760 26002816 : dmx_nrg += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1];
2761 : }
2762 :
2763 102400 : hStereoDft->hb_nrg[0] += dmx_nrg * 2 / hStereoDft->NFFT;
2764 102400 : *stop = bin0;
2765 : }
2766 1565902 : else if ( hStereoDft->core_hist[0] == ACELP_CORE )
2767 : {
2768 : /* TCX/HQ core -> ACELP transition */
2769 : /* apply short delay only and blend to long/short gain */
2770 62346 : dmx_nrg = hStereoDft->hb_nrg_subr[k];
2771 62346 : d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_TD_STEFI_SUBFR_DELAY;
2772 :
2773 62346 : d_short_ind = ( d_short_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX;
2774 :
2775 : /* calculate high band energy of past dmx */
2776 62346 : past_dmx_nrg = EPSILON;
2777 9361034 : for ( i = bin0; i < min( hStereoDft->NFFT / 2, STEREO_DFT32MS_N_32k / 2 ); i++ )
2778 : {
2779 9298688 : past_dmx_nrg += hStereoDft->DFT_past_DMX[d_short_ind][2 * i] * hStereoDft->DFT_past_DMX[d_short_ind][2 * i] + hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1] * hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1];
2780 : }
2781 :
2782 221924 : for ( b = band0; b < nbands_respred; b++ )
2783 : {
2784 159578 : g_short = hStereoDft->past_res_pred_gain[d_short_ind][b] < 0 ? 0 : ( 1.f + hStereoDft->stefi_short_gain ) / 2;
2785 :
2786 159578 : if ( g_short > 0 )
2787 : {
2788 153190 : norm_fac = sqrtf( ( 0.001f + dmx_nrg ) / ( 0.001f + past_dmx_nrg ) );
2789 153190 : g2 = pPredGain[b] * norm_fac;
2790 153190 : pred_gain_avg = hStereoDft->past_res_pred_gain[d_short_ind][b] * g_short;
2791 :
2792 153190 : g2 = min( pred_gain_avg * STEREO_DFT_STEFFI_GAIN_AMP, pred_gain_avg * ( 1 - STEREO_DFT_STEFFI_GAIN_REST_AMT ) + g2 * STEREO_DFT_STEFFI_GAIN_REST_AMT );
2793 8993510 : for ( i = max( hStereoDft->band_limits[b], bin0 ); i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ )
2794 : {
2795 8840320 : DFT_PRED_RES[2 * i] = g2 * hStereoDft->DFT_past_DMX[d_short_ind][2 * i];
2796 8840320 : DFT_PRED_RES[2 * i + 1] = g2 * hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1];
2797 : }
2798 : }
2799 : else
2800 : {
2801 6388 : begin = max( hStereoDft->band_limits[b], bin0 );
2802 6388 : end = min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 );
2803 6388 : set_zero( DFT_PRED_RES + 2 * begin, 2 * ( end - begin ) );
2804 : }
2805 : }
2806 : }
2807 : else
2808 : #endif
2809 : {
2810 5201966 : for ( b = band0; b < nbands_respred; b++ )
2811 : {
2812 : /* TCX/HQ core -> TCX/HQ core: business as usual */
2813 3698410 : d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_STEFFI_DELAY_SHORT + b % 2;
2814 3698410 : d_long_ind = max( 4, (int16_t) ( ( STEREO_DFT_PAST_MAX + 4 - 1 ) * ( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f ) ) - 4;
2815 : /* make sure d_short really corresponds to a shorter or equally long delay than d_long (e.g. not always the case for
2816 : * STEREO_DFT_STEFFI_DELAY_SHORT=3 and STEREO_DFT_STEFFI_DELAY_LONG=4)*/
2817 3698410 : d_short_ind = max( d_short_ind, d_long_ind );
2818 :
2819 : /* Even number of window sliding (assymmetric OLA) */
2820 3698410 : d_short_ind = 2 * ( d_short_ind / 2 );
2821 3698410 : d_long_ind = 2 * ( d_long_ind / 2 );
2822 :
2823 3698410 : d_short = STEREO_DFT_PAST_MAX - d_short_ind;
2824 3698410 : d_long = STEREO_DFT_PAST_MAX - d_long_ind;
2825 :
2826 3698410 : d_short_ind = ( d_short_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX;
2827 3698410 : d_long_ind = ( d_long_ind + hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX;
2828 :
2829 3698410 : g_short = hStereoDft->stefi_short_gain;
2830 3698410 : g_long = hStereoDft->stefi_long_gain;
2831 :
2832 : /* change mixing ratio if long and short delay are the same */
2833 3698410 : if ( d_short == d_long )
2834 : {
2835 3290928 : g_short = 1;
2836 3290928 : g_long = 0;
2837 : }
2838 :
2839 : /* Avoid transient components */
2840 3698410 : if ( hStereoDft->past_res_pred_gain[d_short_ind][b] == -1 && hStereoDft->past_res_pred_gain[d_long_ind][b] == -1 )
2841 : {
2842 94140 : g_long = 0.0f;
2843 94140 : g_short = 0.0f;
2844 : }
2845 3604270 : else if ( hStereoDft->past_res_pred_gain[d_short_ind][b] == -1 )
2846 : {
2847 5616 : g_long = 1.0f;
2848 5616 : g_short = 0.0f;
2849 : }
2850 3598654 : else if ( hStereoDft->past_res_pred_gain[d_long_ind][b] == -1 )
2851 : {
2852 7722 : g_long = 0.0f;
2853 7722 : g_short = 1.0f;
2854 : }
2855 : #ifndef DEBUG_STEREO_DFT_NOCORE
2856 3698410 : if ( hStereoDft->core_hist[d_short / 2] == ACELP_CORE )
2857 : {
2858 0 : g_short = 0;
2859 : }
2860 3698410 : if ( hStereoDft->core_hist[d_long / 2] == ACELP_CORE )
2861 : {
2862 25556 : g_long = 0;
2863 : }
2864 : #endif
2865 :
2866 3698410 : if ( max( g_short, g_long ) > 0 )
2867 : {
2868 3601593 : past_dmx_nrg = EPSILON;
2869 3601593 : dmx_nrg = EPSILON;
2870 217969745 : for ( i = max( hStereoDft->band_limits[b], bin0 ); i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ )
2871 : {
2872 214368152 : dmx_nrg += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1];
2873 :
2874 214368152 : DFT_PRED_RES[2 * i] = g_short * ( hStereoDft->DFT_past_DMX[d_short_ind][2 * i] ) + g_long * ( hStereoDft->DFT_past_DMX[d_long_ind][2 * i] );
2875 214368152 : DFT_PRED_RES[2 * i + 1] = g_short * ( hStereoDft->DFT_past_DMX[d_short_ind][2 * i + 1] ) + g_long * ( hStereoDft->DFT_past_DMX[d_long_ind][2 * i + 1] );
2876 :
2877 214368152 : past_dmx_nrg += DFT_PRED_RES[2 * i] * DFT_PRED_RES[2 * i] + DFT_PRED_RES[2 * i + 1] * DFT_PRED_RES[2 * i + 1];
2878 : }
2879 :
2880 3601593 : norm_fac = sqrtf( ( 0.001f + dmx_nrg ) / ( 0.001f + past_dmx_nrg ) );
2881 3601593 : g2 = pPredGain[b] * norm_fac;
2882 3601593 : pred_gain_avg = g_short * hStereoDft->past_res_pred_gain[d_short_ind][b] + g_long * hStereoDft->past_res_pred_gain[d_long_ind][b];
2883 :
2884 3601593 : g2 = min( pred_gain_avg * STEREO_DFT_STEFFI_GAIN_AMP, pred_gain_avg * ( 1 - STEREO_DFT_STEFFI_GAIN_REST_AMT ) + g2 * STEREO_DFT_STEFFI_GAIN_REST_AMT );
2885 :
2886 217969745 : for ( i = max( hStereoDft->band_limits[b], bin0 ); i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ )
2887 : {
2888 214368152 : DFT_PRED_RES[2 * i] *= g2;
2889 214368152 : DFT_PRED_RES[2 * i + 1] *= g2;
2890 : }
2891 : }
2892 : else
2893 : {
2894 96817 : begin = max( hStereoDft->band_limits[b], bin0 );
2895 96817 : end = min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 );
2896 96817 : set_zero( DFT_PRED_RES + 2 * begin, 2 * ( end - begin ) );
2897 : }
2898 : }
2899 : }
2900 : #ifndef DEBUG_STEREO_DFT_NOCORE
2901 : }
2902 : #endif
2903 :
2904 : /* update buffers */
2905 33671082 : for ( b = hStereoDft->res_pred_band_min; b < hStereoDft->nbands; b++ )
2906 : {
2907 29966356 : if ( hStereoDft->attackPresent || hStereoDft->wasTransient )
2908 : {
2909 1523660 : hStereoDft->past_res_pred_gain[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = -1;
2910 : }
2911 : else
2912 : {
2913 28442696 : hStereoDft->past_res_pred_gain[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = pPredGain[b];
2914 : }
2915 : }
2916 :
2917 3704726 : pop_wmops();
2918 3704726 : return;
2919 : }
2920 :
2921 :
2922 : /*---------------------------------------------------------------
2923 : * stereo_dft_dec_smooth_parameters()
2924 : *
2925 : *
2926 : * ---------------------------------------------------------------*/
2927 :
2928 1797244 : void stereo_dft_dec_smooth_parameters(
2929 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */
2930 : const int16_t prev_sid_nodata, /* i : Previous SID/No data indicator */
2931 : const int16_t active_frame_counter, /* i : Active frame counter */
2932 : const int32_t element_brate /* i : Element bitrate */
2933 : )
2934 : {
2935 : int16_t k_offset, k, k2, b, N_div;
2936 : float *pIpd, *pInterpol;
2937 : float *pgIpd;
2938 : float *pSideGain;
2939 : float diff_ipd;
2940 : int16_t nbands;
2941 : int16_t max_res_pred_ind;
2942 :
2943 1797244 : N_div = STEREO_DFT_NBDIV;
2944 1797244 : k_offset = STEREO_DFT_OFFSET;
2945 :
2946 1797244 : if ( hStereoDft->frame_sid_nodata || prev_sid_nodata )
2947 : {
2948 69173 : k = 1;
2949 467236 : for ( b = 0; b < hStereoDft->nbands; b++ )
2950 : {
2951 398063 : *( hStereoDft->side_gain + ( ( k + k_offset ) - 1 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b );
2952 : }
2953 :
2954 69173 : if ( hStereoDft->frame_sid_nodata )
2955 : {
2956 : /* set new xfade target if new itd received */
2957 65745 : if ( hStereoDft->ipd_xfade_counter < STEREO_DFT_ITD_CNG_XFADE )
2958 : {
2959 64845 : if ( ( hStereoDft->gipd[k + k_offset] - hStereoDft->ipd_xfade_prev ) > EVS_PI )
2960 : {
2961 0 : hStereoDft->ipd_xfade_target = hStereoDft->gipd[k + k_offset] - 2 * EVS_PI;
2962 0 : hStereoDft->ipd_xfade_step = ( hStereoDft->ipd_xfade_target - hStereoDft->ipd_xfade_prev ) / ( STEREO_DFT_ITD_CNG_XFADE - hStereoDft->ipd_xfade_counter );
2963 : }
2964 64845 : else if ( ( hStereoDft->ipd_xfade_prev - hStereoDft->gipd[k + k_offset] ) > EVS_PI )
2965 : {
2966 465 : hStereoDft->ipd_xfade_target = hStereoDft->gipd[k + k_offset] + 2 * EVS_PI;
2967 465 : hStereoDft->ipd_xfade_step = ( hStereoDft->ipd_xfade_target - hStereoDft->ipd_xfade_prev ) / ( STEREO_DFT_ITD_CNG_XFADE - hStereoDft->ipd_xfade_counter );
2968 : }
2969 : else
2970 : {
2971 64380 : hStereoDft->ipd_xfade_target = hStereoDft->gipd[k + k_offset];
2972 64380 : hStereoDft->ipd_xfade_step = ( hStereoDft->ipd_xfade_target - hStereoDft->ipd_xfade_prev ) / ( STEREO_DFT_ITD_CNG_XFADE - hStereoDft->ipd_xfade_counter );
2973 : }
2974 : }
2975 :
2976 : /* xfade */
2977 65745 : if ( hStereoDft->ipd_xfade_prev != hStereoDft->ipd_xfade_target && hStereoDft->ipd_xfade_counter < STEREO_DFT_ITD_CNG_XFADE && hStereoDft->last_active_element_brate <= 24400 )
2978 : {
2979 16101 : hStereoDft->gipd[k + k_offset] = hStereoDft->ipd_xfade_prev + hStereoDft->ipd_xfade_step;
2980 16101 : hStereoDft->ipd_xfade_prev = hStereoDft->gipd[k + k_offset];
2981 16101 : hStereoDft->ipd_xfade_counter++;
2982 : }
2983 : }
2984 : else
2985 : {
2986 : /* First active frame, "reset" everything if long enough active encoding, only triggered if STEREO_DFT_ITD_CNG_XFADE_RESET = -1 */
2987 3428 : if ( active_frame_counter > STEREO_DFT_ITD_CNG_XFADE_RESET )
2988 : {
2989 3 : hStereoDft->ipd_xfade_target = hStereoDft->gipd[k + k_offset];
2990 3 : hStereoDft->ipd_xfade_prev = hStereoDft->gipd[k + k_offset];
2991 3 : hStereoDft->ipd_xfade_counter = 0;
2992 : }
2993 : }
2994 :
2995 138346 : for ( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ )
2996 : {
2997 69173 : hStereoDft->gipd[( k + k_offset ) - k2] = hStereoDft->gipd[k + k_offset];
2998 : }
2999 :
3000 69173 : if ( hStereoDft->frame_sid_nodata )
3001 : {
3002 : /* set new xfade target if new itd received */
3003 65745 : if ( hStereoDft->itd_xfade_counter < STEREO_DFT_ITD_CNG_XFADE )
3004 : {
3005 65502 : hStereoDft->itd_xfade_target = hStereoDft->itd[k + k_offset];
3006 65502 : hStereoDft->itd_xfade_step = ( hStereoDft->itd_xfade_target - hStereoDft->itd_xfade_prev ) / ( STEREO_DFT_ITD_CNG_XFADE - hStereoDft->itd_xfade_counter );
3007 : }
3008 :
3009 : /* xfade */
3010 65745 : if ( hStereoDft->itd_xfade_prev != hStereoDft->itd_xfade_target && hStereoDft->itd_xfade_counter < STEREO_DFT_ITD_CNG_XFADE && hStereoDft->last_active_element_brate <= 24400 )
3011 : {
3012 10147 : hStereoDft->itd[k + k_offset] = hStereoDft->itd_xfade_prev + hStereoDft->itd_xfade_step;
3013 10147 : hStereoDft->itd_xfade_prev = hStereoDft->itd[k + k_offset];
3014 10147 : hStereoDft->itd_xfade_counter++;
3015 : }
3016 : }
3017 : else
3018 : {
3019 : /* First active frame, "reset" everything if long enough active encoding, only triggered if STEREO_DFT_ITD_CNG_XFADE_RESET = -1 */
3020 3428 : if ( active_frame_counter > STEREO_DFT_ITD_CNG_XFADE_RESET )
3021 : {
3022 3 : hStereoDft->itd_xfade_target = hStereoDft->itd[k + k_offset];
3023 3 : hStereoDft->itd_xfade_prev = hStereoDft->itd[k + k_offset];
3024 3 : hStereoDft->itd_xfade_counter = 0;
3025 : }
3026 :
3027 3428 : hStereoDft->last_active_element_brate = element_brate;
3028 : }
3029 138346 : for ( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ )
3030 : {
3031 69173 : hStereoDft->itd[( k + k_offset ) - k2] = hStereoDft->itd[k + k_offset];
3032 : }
3033 :
3034 69173 : return;
3035 : }
3036 :
3037 : /* Active frame, "reset" everything "reset" everything if long enough active encoding */
3038 1728071 : if ( active_frame_counter > STEREO_DFT_ITD_CNG_XFADE_RESET )
3039 : {
3040 1660094 : hStereoDft->itd_xfade_counter = 0;
3041 1660094 : hStereoDft->itd_xfade_target = hStereoDft->itd[STEREO_DFT_NBDIV - 1];
3042 1660094 : hStereoDft->itd_xfade_prev = hStereoDft->itd[STEREO_DFT_NBDIV - 1];
3043 1660094 : hStereoDft->ipd_xfade_counter = 0;
3044 1660094 : hStereoDft->ipd_xfade_target = hStereoDft->gipd[STEREO_DFT_NBDIV - 1];
3045 1660094 : hStereoDft->ipd_xfade_prev = hStereoDft->gipd[STEREO_DFT_NBDIV - 1];
3046 : }
3047 :
3048 1728071 : hStereoDft->last_active_element_brate = element_brate;
3049 :
3050 3456142 : for ( k = hStereoDft->prm_res[k_offset] - 1; k < N_div; k += hStereoDft->prm_res[k + k_offset] )
3051 : {
3052 1728071 : max_res_pred_ind = 0;
3053 :
3054 1728071 : if ( hStereoDft->reverb_flag == 1 )
3055 : {
3056 353018 : nbands = min( 10, hStereoDft->nbands_respred );
3057 :
3058 : /*Shift 2 last bands residual prediction gains for SWB/FB*/
3059 353018 : if ( hStereoDft->band_res[k_offset] == STEREO_DFT_BAND_RES_HIGH )
3060 : {
3061 539401 : for ( b = hStereoDft->nbands_respred - 1; b >= nbands; b-- )
3062 : {
3063 346248 : hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] =
3064 346248 : hStereoDft->res_gains_ind[1][b - STEREO_DFT_RES_PRED_BAND_MIN_RED + hStereoDft->res_pred_band_min + STEREO_DFT_BAND_MAX];
3065 346248 : hStereoDft->res_gains_ind[1][b - STEREO_DFT_RES_PRED_BAND_MIN_RED + hStereoDft->res_pred_band_min + STEREO_DFT_BAND_MAX] = 0;
3066 : }
3067 : }
3068 :
3069 : /* Get maximal index */
3070 2139853 : for ( b = hStereoDft->res_pred_band_min; b < ( nbands - STEREO_DFT_RES_PRED_BAND_MIN_CONST ); b++ )
3071 : {
3072 1786835 : if ( max_res_pred_ind < hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] )
3073 : {
3074 525795 : max_res_pred_ind = (int16_t) hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX];
3075 : }
3076 : }
3077 :
3078 : /* predictive values */
3079 1412072 : for ( ; b < nbands; b++ )
3080 : {
3081 1059054 : assert( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] == 0 );
3082 1059054 : hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] = max_res_pred_ind;
3083 : }
3084 : }
3085 :
3086 1728071 : for ( b = hStereoDft->res_pred_band_min; b < hStereoDft->res_cod_band_max; b++ )
3087 : {
3088 : float tmp;
3089 : int16_t tmps1, tmps2;
3090 :
3091 0 : hStereoDft->res_gains_ind[0][b] = hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX];
3092 : /*stereo_dft_dequantize_res_gains_f(&hStereoDft->res_gains_ind[0][b], &hStereoDft->res_gains_ind[1][b+STEREO_DFT_BAND_MAX],hStereoDft->side_gain+(k+k_offset)*STEREO_DFT_BAND_MAX+b, hStereoDft->res_pred_gain+(k+k_offset)*STEREO_DFT_BAND_MAX+b, 1);*/
3093 0 : tmps1 = (int16_t) ( hStereoDft->res_gains_ind[0][b] );
3094 0 : tmps2 = (int16_t) ( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] );
3095 0 : stereo_dft_dequantize_res_gains( &tmps1, &tmps2, hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 );
3096 :
3097 0 : if ( hStereoDft->attackPresent )
3098 : {
3099 0 : hStereoDft->res_gains_ind[1][b] = 0.8f * hStereoDft->res_gains_ind[1][b];
3100 : }
3101 0 : else if ( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && ( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] < 2.f ) ) )
3102 : {
3103 0 : hStereoDft->res_gains_ind[1][b] = 0.6f * hStereoDft->res_gains_ind[1][b] + 0.4f * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX];
3104 : }
3105 : else
3106 : {
3107 0 : hStereoDft->res_gains_ind[1][b] = dft_alpha_s2[b] * hStereoDft->res_gains_ind[1][b] + ( 1 - dft_alpha_s2[b] ) * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX];
3108 : }
3109 :
3110 0 : stereo_dft_dequantize_res_gains_f( &hStereoDft->res_gains_ind[0][b], &hStereoDft->res_gains_ind[1][b], &tmp, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 );
3111 : }
3112 :
3113 : /* Smoothing of prediction gains between ftrames */
3114 15232576 : for ( ; b < hStereoDft->nbands; b++ )
3115 : {
3116 13504505 : if ( hStereoDft->attackPresent )
3117 : {
3118 416748 : hStereoDft->res_gains_ind[0][b] = hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX];
3119 416748 : hStereoDft->res_gains_ind[1][b] = 0.8f * hStereoDft->res_gains_ind[1][b];
3120 : }
3121 13087757 : else if ( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && ( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] < 2.f ) ) )
3122 : {
3123 8292289 : hStereoDft->res_gains_ind[0][b] = hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX];
3124 :
3125 8292289 : if ( hStereoDft->hConfig->band_res == STEREO_DFT_BAND_RES_LOW )
3126 : {
3127 1548107 : hStereoDft->res_gains_ind[1][b] = dft_alpha_w_b2[b] * hStereoDft->res_gains_ind[1][b] + ( 1 - dft_alpha_w_b2[b] ) * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX];
3128 : }
3129 : else
3130 : {
3131 6744182 : hStereoDft->res_gains_ind[1][b] = dft_alpha_w[b] * hStereoDft->res_gains_ind[1][b] + ( 1 - dft_alpha_w[b] ) * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX];
3132 : }
3133 : }
3134 : else
3135 : {
3136 4795468 : if ( hStereoDft->hConfig->band_res == STEREO_DFT_BAND_RES_LOW )
3137 : {
3138 955853 : hStereoDft->res_gains_ind[0][b] = dft_alpha_s_b2[b] * hStereoDft->res_gains_ind[0][b] + ( 1 - dft_alpha_s_b2[b] ) * hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX];
3139 955853 : hStereoDft->res_gains_ind[1][b] = dft_alpha_s2_b2[b] * hStereoDft->res_gains_ind[1][b] + ( 1 - dft_alpha_s2_b2[b] ) * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX];
3140 : }
3141 : else
3142 : {
3143 3839615 : hStereoDft->res_gains_ind[0][b] = dft_alpha_s[b] * hStereoDft->res_gains_ind[0][b] + ( 1 - dft_alpha_s[b] ) * hStereoDft->res_gains_ind[0][b + STEREO_DFT_BAND_MAX];
3144 3839615 : hStereoDft->res_gains_ind[1][b] = dft_alpha_s2[b] * hStereoDft->res_gains_ind[1][b] + ( 1 - dft_alpha_s2[b] ) * hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX];
3145 : }
3146 : }
3147 :
3148 13504505 : if ( !hStereoDft->recovery_flg )
3149 : {
3150 13466273 : stereo_dft_dequantize_res_gains_f( &hStereoDft->res_gains_ind[0][b], &hStereoDft->res_gains_ind[1][b], hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 );
3151 : }
3152 : }
3153 :
3154 : /* Smoothing of IPDs*/
3155 1728071 : pgIpd = hStereoDft->gipd + ( k + k_offset );
3156 1728071 : diff_ipd = pgIpd[0] - pgIpd[-hStereoDft->prm_res[k + k_offset]];
3157 1728071 : if ( diff_ipd < -EVS_PI )
3158 : {
3159 93514 : pgIpd[0] += PI2;
3160 : }
3161 1634557 : else if ( diff_ipd > EVS_PI )
3162 : {
3163 72324 : pgIpd[0] -= PI2;
3164 : }
3165 :
3166 1728071 : if ( !hStereoDft->attackPresent )
3167 : {
3168 1677039 : if ( hStereoDft->wasTransient )
3169 : {
3170 48516 : pgIpd[0] = 0.8f * pgIpd[0] + 0.2f * pgIpd[-hStereoDft->prm_res[k + k_offset]];
3171 : }
3172 : else
3173 : {
3174 1628523 : pgIpd[0] = 0.5f * pgIpd[0] + 0.5f * pgIpd[-hStereoDft->prm_res[k + k_offset]];
3175 : }
3176 : }
3177 :
3178 :
3179 1728071 : if ( !hStereoDft->attackPresent )
3180 : {
3181 1677039 : pSideGain = hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX;
3182 5392499 : for ( b = 0; b < hStereoDft->res_cod_band_max; b++ )
3183 : {
3184 3715460 : pSideGain[b] = dft_res_cod_alpha[b] * pSideGain[b] + ( 1 - dft_res_cod_alpha[b] ) * pSideGain[b - hStereoDft->prm_res[k + k_offset] * STEREO_DFT_BAND_MAX];
3185 : }
3186 : }
3187 :
3188 : /*Interpolation between DFT slots*/
3189 3456142 : for ( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ )
3190 : {
3191 1728071 : pInterpol = hStereoDft->gipd + ( ( k + k_offset ) - k2 );
3192 1728071 : pIpd = hStereoDft->gipd + ( k + k_offset );
3193 1728071 : if ( hStereoDft->attackPresent )
3194 : {
3195 51032 : *( pInterpol ) = *( pIpd );
3196 : }
3197 : else
3198 : {
3199 1677039 : *( pInterpol ) = *( hStereoDft->gipd + ( k + k_offset - hStereoDft->prm_res[k + k_offset] ) );
3200 : }
3201 :
3202 19053591 : for ( b = 0; b < hStereoDft->nbands; b++ )
3203 : {
3204 17325520 : *( hStereoDft->res_pred_gain + ( ( k + k_offset ) - k2 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->res_pred_gain + ( k + k_offset - hStereoDft->prm_res[k + k_offset] ) * STEREO_DFT_BAND_MAX + b );
3205 :
3206 17325520 : if ( b < hStereoDft->res_cod_band_max || hStereoDft->attackPresent || hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && ( hStereoDft->res_gains_ind[1][b + STEREO_DFT_BAND_MAX] < 2.f ) ) )
3207 : {
3208 12530052 : *( hStereoDft->side_gain + ( ( k + k_offset ) - k2 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b );
3209 : }
3210 : else
3211 : {
3212 4795468 : *( hStereoDft->side_gain + ( ( k + k_offset ) - k2 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->side_gain + ( k + k_offset - hStereoDft->prm_res[k + k_offset] ) * STEREO_DFT_BAND_MAX + b );
3213 : }
3214 : }
3215 :
3216 1728071 : hStereoDft->itd[( k + k_offset ) - k2] = hStereoDft->itd[k + k_offset];
3217 : } /*end of interpolation*/
3218 : }
3219 :
3220 1728071 : return;
3221 : }
3222 :
3223 :
3224 : /*---------------------------------------------------------------
3225 : * stereo_dft_adapt_sf_delay()
3226 : *
3227 : *
3228 : * ---------------------------------------------------------------*/
3229 :
3230 4229186 : static void stereo_dft_adapt_sf_delay(
3231 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft,
3232 : float *pPredGain )
3233 : {
3234 : float var_mean_ratio;
3235 : float new_variation;
3236 : float target_delay;
3237 : float max_pg, sum_pg, alpha_up, alpha_down;
3238 : int16_t b;
3239 :
3240 4229186 : max_pg = 0.0f;
3241 4229186 : sum_pg = 0.0f;
3242 :
3243 : /* find sum and maximum of prediction gains */
3244 40359480 : for ( b = hStereoDft->res_pred_band_min; b < hStereoDft->nbands; b++ )
3245 : {
3246 36130294 : if ( pPredGain[b] > max_pg )
3247 : {
3248 10055727 : max_pg = pPredGain[b];
3249 : }
3250 36130294 : sum_pg += pPredGain[b];
3251 : }
3252 :
3253 4229186 : if ( sum_pg > 0.0f )
3254 : {
3255 : /* Calculate mean of the prediction gain */
3256 3822238 : hStereoDft->lt_pred_gain = STEREO_DFT_LT_PREDGAIN_UPD * sum_pg + ( 1.0f - STEREO_DFT_LT_PREDGAIN_UPD ) * hStereoDft->lt_pred_gain;
3257 :
3258 : /* Calculate the variation of the prediction gain */
3259 3822238 : new_variation = fabsf( sum_pg - hStereoDft->lt_pred_gain );
3260 3822238 : hStereoDft->lt_pred_gain_variation = STEREO_DFT_VR_PREDGAIN_UPD * new_variation + ( 1.0f - STEREO_DFT_VR_PREDGAIN_UPD ) * hStereoDft->lt_pred_gain_variation;
3261 : }
3262 :
3263 : /* Calculate ratio of variation and mean of prediction gain */
3264 4229186 : var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT;
3265 4229186 : if ( hStereoDft->lt_pred_gain > 0.0f )
3266 : {
3267 4040005 : var_mean_ratio = min( 1.5f * STEREO_DFT_RES_RATIO_LIMIT, hStereoDft->lt_pred_gain_variation / hStereoDft->lt_pred_gain );
3268 : }
3269 :
3270 4229186 : if ( max_pg > STEREO_DFT_STEFFI_PG_THRESHOLD )
3271 : {
3272 : /* slow upwards */
3273 2091188 : alpha_up = STEREO_DFT_STEFFI_RATIO_UP_HIGH;
3274 2091188 : alpha_down = STEREO_DFT_STEFFI_RATIO_DOWN_HIGH;
3275 : }
3276 : else
3277 : {
3278 : /* slow downwards */
3279 2137998 : alpha_up = STEREO_DFT_STEFFI_RATIO_UP_LOW;
3280 2137998 : alpha_down = STEREO_DFT_STEFFI_RATIO_DOWN_LOW;
3281 : }
3282 :
3283 4229186 : if ( var_mean_ratio > hStereoDft->lt_var_mean_ratio )
3284 : {
3285 1437836 : hStereoDft->lt_var_mean_ratio = alpha_up * var_mean_ratio + ( 1.0f - alpha_up ) * hStereoDft->lt_var_mean_ratio;
3286 : }
3287 : else
3288 : {
3289 2791350 : hStereoDft->lt_var_mean_ratio = alpha_down * var_mean_ratio + ( 1.0f - alpha_down ) * hStereoDft->lt_var_mean_ratio;
3290 : }
3291 :
3292 : /* Calculate a target delay for the stereo filling. Set the stereo filling delay lower when the prediction gain
3293 : variation is relatively high compared to the mean */
3294 4229186 : if ( hStereoDft->lt_var_mean_ratio >= STEREO_DFT_RES_RATIO_LIMIT )
3295 : {
3296 1928956 : target_delay = STEREO_DFT_STEFFI_DELAY_SHORT;
3297 : }
3298 : else
3299 : {
3300 2300230 : target_delay = min( STEREO_DFT_STEFFI_DELAY_LONG, STEREO_DFT_STEFFI_DELAY_SHORT + ( STEREO_DFT_STEFFI_DELAY_OFFSET + STEREO_DFT_STEFFI_DELAY_LONG - STEREO_DFT_STEFFI_DELAY_SHORT ) * ( 1.0f - hStereoDft->lt_var_mean_ratio / STEREO_DFT_RES_RATIO_LIMIT ) );
3301 : }
3302 :
3303 : /* Adapt the stereo filling delay by interpolating between two delay taps, one at the shortest delay and one at the longest delay */
3304 4229186 : hStereoDft->stefi_short_gain = ( STEREO_DFT_STEFFI_DELAY_LONG - target_delay ) / ( STEREO_DFT_STEFFI_DELAY_LONG - STEREO_DFT_STEFFI_DELAY_SHORT );
3305 4229186 : hStereoDft->stefi_long_gain = sqrtf( 1.0f - hStereoDft->stefi_short_gain * hStereoDft->stefi_short_gain );
3306 :
3307 : #ifdef DEBUG_MODE_DFT
3308 : dbgwrite( &hStereoDft->lt_pred_gain, sizeof( float ), 1, 1, "res/stereo_dft_lt_pred_gain_b.pcm" );
3309 : dbgwrite( &hStereoDft->lt_pred_gain_variation, sizeof( float ), 1, 1, "res/stereo_dft_lt_pred_gain_variance_b.pcm" );
3310 : dbgwrite( &hStereoDft->lt_var_mean_ratio, sizeof( float ), 1, 1, "res/stereo_dft_lt_var_mean_ratio_b.pcm" );
3311 : dbgwrite( &target_delay, sizeof( float ), 1, 1, "res/stereo_dft_target_delay.pcm" );
3312 : dbgwrite( &hStereoDft->stefi_short_gain, sizeof( float ), 1, 1, "res/stereo_dft_short_gain.pcm" );
3313 : dbgwrite( &hStereoDft->stefi_long_gain, sizeof( float ), 1, 1, "res/stereo_dft_long_gain.pcm" );
3314 : #endif /* DEBUG_MODE_DFT */
3315 :
3316 4229186 : return;
3317 : }
|