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_fx.h"
41 : #include "ivas_prot_fx.h"
42 : #include "ivas_cnst.h"
43 : #include "ivas_rom_com.h"
44 : #include "ivas_rom_com_fx.h"
45 : #include "ivas_rom_dec.h"
46 : #include "wmc_auto.h"
47 : #include "ivas_prot_fx.h"
48 : #include "basop_util.h"
49 : #ifdef DEBUGGING
50 : #include "debug.h"
51 : #endif
52 :
53 :
54 : /*-------------------------------------------------------------------*
55 : * Local constants
56 : *-------------------------------------------------------------------*/
57 :
58 : #define STEFI_DELAY_IND( d, buf_ind ) ( ( buf_ind ) + STEREO_DFT_PAST_MAX - ( d ) + 1 ) % STEREO_DFT_PAST_MAX
59 :
60 : #define STEREO_DFT_RES_RATIO_LIMIT_FX ( Word32 )( 0x170A3D71 )
61 : #define STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2 ( Word32 )( 0x228F5C28 )
62 : #define ONE_STEREO_DFT_RES_RATIO_LIMIT_Q12 ( Word16 )( 0x58E4 )
63 : #define STEREO_DFT_LT_PREDGAIN_UPD_FX ( Word16 )( 0x0CCD )
64 : #define STEREO_DFT_VR_PREDGAIN_UPD_FX ( Word16 )( 0x0CCD )
65 : #define STEREO_DFT_STEFFI_PG_THRESHOLD_FX ( Word32 )( 0x4CCCCCCD )
66 : #define STEREO_DFT_STEFFI_RATIO_UP_HIGH_FX ( Word32 )( 0x03D70A3D )
67 : #define STEREO_DFT_STEFFI_RATIO_DOWN_HIGH_FX ( Word32 )( 0x06666666 )
68 : #define STEREO_DFT_STEFFI_RATIO_UP_LOW_FX ( Word32 )( 0x0CCCCCCC )
69 : #define STEREO_DFT_STEFFI_RATIO_DOWN_LOW_FX ( Word32 )( 0x0020C49C )
70 : #define STEREO_DFT_STEFFI_DELAY_SHORT 2
71 : #define STEREO_DFT_STEFFI_DELAY_LONG 4
72 : #define STEREO_DFT_STEFFI_DELAY_OFFSET 2
73 : #define STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ( Word16 )( 0x4CCD )
74 : #define STEREO_DFT_STEFFI_GAIN_AMP_FX ( Word16 )( 0x7FFF )
75 :
76 :
77 : #define STEREO_DFT_BPF_SIZE 40 /* BPF: Number of weights for BPF in DFT: 40*40Hz=1.6kHz*/
78 :
79 : /*-------------------------------------------------------------------------
80 : * Local function prototypes
81 : *-------------------------------------------------------------------------*/
82 :
83 : static void stereo_dft_compute_td_stefi_params_fx( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, const Word16 samp_ratio );
84 :
85 : static void stereo_dft_adapt_sf_delay_fx( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, Word32 *pPredGain );
86 :
87 : /*-------------------------------------------------------------------------
88 : * stereo_dft_dec_reset_fx()
89 : *
90 : * Reset DFT stereo memories
91 : *------------------------------------------------------------------------*/
92 :
93 908 : void stereo_dft_dec_reset_fx(
94 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i/o: decoder DFT stereo handle */
95 : )
96 : {
97 : Word16 i;
98 : Word16 j, b;
99 908 : set_zero_fx( hStereoDft->buff_LBTCX_mem_fx, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ) );
100 :
101 : /*Configuration*/
102 908 : set16_fx( hStereoDft->prm_res, hStereoDft->hConfig->prm_res, STEREO_DFT_DEC_DFT_NB );
103 :
104 : /* SIDE_GAIN */
105 908 : set16_fx( hStereoDft->side_gain_index, 15, STEREO_DFT_BAND_MAX );
106 908 : set16_fx( hStereoDft->side_gain_index_previous, 15, STEREO_DFT_BAND_MAX );
107 :
108 : /*residual prediction*/
109 908 : set16_fx( hStereoDft->res_pred_mode, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_DEC_DFT_NB );
110 4540 : FOR( i = 0; i < STEREO_DFT_PAST_MAX; i++ )
111 : {
112 3632 : set32_fx( hStereoDft->DFT_past_DMX_fx[i], 0, STEREO_DFT32MS_N_32k );
113 3632 : set32_fx( hStereoDft->past_res_pred_gain_fx[i], 0, STEREO_DFT_BAND_MAX );
114 3632 : hStereoDft->q_DFT_past_DMX_fx[i] = 0;
115 3632 : move16();
116 : }
117 :
118 908 : hStereoDft->past_DMX_pos = 0;
119 908 : move16();
120 :
121 908 : set16_fx( hStereoDft->res_pred_index_previous, 0, STEREO_DFT_BAND_MAX );
122 :
123 24516 : FOR( i = 0; i < STEREO_DFT_BAND_MAX * 2; i++ )
124 : {
125 23608 : hStereoDft->res_gains_ind_fx[0][i] = 1006632960; /* 15.0f in Q26 */
126 23608 : move32();
127 : }
128 :
129 908 : set32_fx( hStereoDft->res_gains_ind_fx[1], 0, STEREO_DFT_BAND_MAX * 2 );
130 :
131 : /*residual coding*/
132 908 : set16_fx( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_DEC_DFT_NB );
133 908 : hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->hConfig->res_cod_mode];
134 908 : set32_fx( hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k );
135 908 : hStereoDft->q_res_cod_mem_fx = Q15;
136 908 : move16();
137 :
138 908 : hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
139 908 : move32();
140 :
141 908 : hStereoDft->stab_fac_smooth_res_fx = 0;
142 908 : move16();
143 908 : bass_psfilter_init_fx( hStereoDft->hBpf );
144 :
145 908 : tcxltp_dec_init_fx( hStereoDft->hTcxLtpDec, 0, MODE1, IVAS_CPE_DFT, PIT_MAX, 12800 );
146 :
147 908 : hStereoDft->reverb_flag = 0;
148 908 : move16();
149 :
150 908 : hStereoDft->res_hb_nrg_mem_fx = 0;
151 908 : move32();
152 908 : hStereoDft->bpf_error_signal_last_fx = 0;
153 908 : move32();
154 908 : hStereoDft->bpf_error_ratio_mem_fx = ONE_IN_Q13;
155 908 : move16();
156 :
157 : /*reset parameters*/
158 908 : set32_fx( hStereoDft->side_gain_fx, 0, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX );
159 908 : set32_fx( hStereoDft->gipd_fx, 0, STEREO_DFT_DEC_DFT_NB );
160 908 : set32_fx( hStereoDft->itd_fx, 0, STEREO_DFT_DEC_DFT_NB );
161 908 : set32_fx( hStereoDft->res_pred_gain_fx, 0, STEREO_DFT_DEC_DFT_NB * STEREO_DFT_BAND_MAX );
162 :
163 908 : hStereoDft->wasTransient = 0;
164 908 : move16();
165 908 : hStereoDft->attackPresent = 0;
166 908 : move16();
167 :
168 908 : hStereoDft->lt_pred_gain_fx = 0;
169 908 : move32();
170 908 : hStereoDft->lt_pred_gain_variation_fx = 0;
171 908 : move32();
172 908 : hStereoDft->lt_var_mean_ratio_fx = STEREO_DFT_RES_RATIO_LIMIT_FX;
173 908 : move32();
174 908 : hStereoDft->stefi_short_gain_fx = MAX_16;
175 908 : move16();
176 908 : hStereoDft->stefi_long_gain_fx = 0;
177 908 : move16();
178 908 : hStereoDft->q_lt_pred_gain = 0;
179 908 : move16();
180 :
181 908 : set16_fx( &hStereoDft->g_state_fx[0], 0, STEREO_DFT_BAND_MAX );
182 :
183 908 : init_basic_allpass_fx( &hStereoDft->ap1, dft_ap_gains_fx[0], dft_ap_delays[0] );
184 908 : init_basic_allpass_fx( &hStereoDft->ap2, dft_ap_gains_fx[1], dft_ap_delays[1] );
185 908 : init_basic_allpass_fx( &hStereoDft->ap3, dft_ap_gains_fx[2], dft_ap_delays[2] );
186 :
187 908 : set32_fx( hStereoDft->ap_delay_mem_fx, 0, NS2SA( 16000, DELAY_BWE_TOTAL_NS ) );
188 908 : set32_fx( hStereoDft->ap_fade_mem_fx, 0, STEREO_DFT_ALLPASS_FADELEN_16k );
189 908 : hStereoDft->q_ap_delay_mem_fx = Q11;
190 908 : move16();
191 908 : hStereoDft->ap_wasTransient = 0;
192 908 : move16();
193 908 : set32_fx( hStereoDft->smooth_dmx_nrg_fx, 0, STEREO_DFT_BAND_MAX );
194 908 : set32_fx( hStereoDft->smooth_res_nrg_fx, 0, STEREO_DFT_BAND_MAX );
195 908 : hStereoDft->q_smoothed_nrg = 0;
196 908 : move16();
197 :
198 908 : set16_fx( hStereoDft->core_hist, ACELP_CORE, STEREO_DFT_CORE_HIST_MAX );
199 :
200 908 : set32_fx( hStereoDft->hb_stefi_sig_fx, 0, L_FRAME48k + NS2SA( 48000, STEREO_DFT_TD_STEFI_DELAY_NS ) );
201 908 : set32_fx( hStereoDft->hb_nrg_fx, 0, STEREO_DFT_CORE_HIST_MAX );
202 908 : set32_fx( hStereoDft->td_gain_fx, 0, STEREO_DFT_CORE_HIST_MAX );
203 908 : set16_fx( hStereoDft->q_td_gain, 0, STEREO_DFT_CORE_HIST_MAX );
204 908 : hStereoDft->q_dft = 0;
205 908 : move16();
206 :
207 : /* PLC parameters */
208 908 : set32_fx( hStereoDft->res_mem_fx, 0, STEREO_DFT_RES_BW_MAX );
209 908 : hStereoDft->time_offs = 0;
210 908 : move16();
211 908 : hStereoDft->past_dmx_nrg_fx = 0;
212 908 : move32();
213 908 : hStereoDft->sg_mean_fx = 0;
214 908 : move32();
215 908 : hStereoDft->sg_mem_corrupt = 0;
216 908 : move16();
217 908 : hStereoDft->recovery_flg = 0;
218 908 : move16();
219 :
220 11804 : FOR( i = 0; i < SBA_DIRAC_STEREO_NUM_BANDS; i++ )
221 : {
222 10896 : set32_fx( hStereoDft->smooth_buf_fx[i], 0, SBA_DIRAC_NRG_SMOOTH_LONG + 1 );
223 : }
224 908 : hStereoDft->q_smooth_buf_fx = Q7;
225 908 : move16();
226 908 : set16_fx( hStereoDft->smooth_fac_fx[0], 0, SBA_DIRAC_STEREO_NUM_BANDS );
227 908 : set16_fx( hStereoDft->smooth_fac_fx[1], 0, SBA_DIRAC_STEREO_NUM_BANDS );
228 :
229 908 : hStereoDft->itd_xfade_target_fx = 0;
230 908 : move32();
231 908 : hStereoDft->itd_xfade_step_fx = 0;
232 908 : move32();
233 908 : hStereoDft->itd_xfade_counter = 0;
234 908 : move16();
235 908 : hStereoDft->itd_xfade_prev_fx = 0;
236 908 : move32();
237 908 : hStereoDft->last_active_element_brate = 0;
238 908 : move32();
239 908 : hStereoDft->ipd_xfade_target_fx = 0;
240 908 : move32();
241 908 : hStereoDft->ipd_xfade_step_fx = 0;
242 908 : move32();
243 908 : hStereoDft->ipd_xfade_counter = 0;
244 908 : move16();
245 908 : hStereoDft->ipd_xfade_prev_fx = 0;
246 908 : move32();
247 908 : hStereoDft->frame_sid_nodata = 0;
248 908 : move16();
249 22700 : FOR( b = 0; b < 2 * IVAS_MAX_NUM_BANDS; b++ )
250 : {
251 65376 : FOR( i = 0; i < 2; i++ )
252 : {
253 217920 : FOR( j = 0; j < 4; j++ )
254 : {
255 174336 : hStereoDft->mixer_mat_smooth_fx[i][j][b] = 0;
256 174336 : move32();
257 : }
258 : }
259 : }
260 908 : hStereoDft->first_frame = 1;
261 908 : move16();
262 908 : hStereoDft->g_L_prev_fx = 0;
263 908 : move32();
264 908 : hStereoDft->g_R_prev_fx = 0;
265 908 : move32();
266 :
267 908 : return;
268 : }
269 :
270 : /*-------------------------------------------------------------------------
271 : * stereo_dft_dec_open_fx()
272 : *
273 : * Open DFT decoder stereo handle
274 : *-------------------------------------------------------------------------*/
275 :
276 908 : static void stereo_dft_dec_open_fx(
277 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */
278 : const Word32 output_Fs, /* i : output sampling rate Q0*/
279 : const Word16 nchan_transport /* i : number of transport channels Q0*/
280 : )
281 : {
282 : /*Sizes*/
283 : // hStereoDft->N = (Word16) ( STEREO_DFT_HOP_MAX * output_Fs / 48000 );
284 908 : hStereoDft->N = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT_HOP_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */
285 908 : move16();
286 :
287 : /*Init. DFT sizes*/
288 908 : hStereoDft->NFFT = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_N_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */
289 908 : move16();
290 :
291 908 : hStereoDft->dft_trigo_8k_fx = dft_trigo_32k_fx; /* Q15 */
292 908 : hStereoDft->dft_trigo_12k8_fx = dft_trigo_12k8_fx; /* Q15 */
293 908 : hStereoDft->dft_trigo_16k_fx = dft_trigo_32k_fx; /* Q15 */
294 :
295 908 : hStereoDft->dft32ms_ovl = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */
296 908 : hStereoDft->win232ms_8k_fx = dft_win232ms_8k_fx; /* Q15 */
297 908 : hStereoDft->win232ms_12k8_fx = dft_win232ms_12k8_fx; /* Q15 */
298 908 : hStereoDft->win232ms_16k_fx = dft_win232ms_16k_fx; /* Q15 */
299 :
300 908 : hStereoDft->dft32ms_ovl2 = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_OVL2_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */
301 908 : hStereoDft->win32ms_8k_fx = dft_win232ms_8k_fx + 1; /* Q15 */
302 908 : hStereoDft->win32ms_12k8_fx = dft_win232ms_12k8_fx + 1; /* Q15 */
303 908 : hStereoDft->win32ms_16k_fx = dft_win232ms_16k_fx + 1; /* Q15 */
304 :
305 908 : IF( EQ_32( output_Fs, 16000 ) )
306 : {
307 89 : hStereoDft->dft_trigo_fx = dft_trigo_32k_fx; /* Q15 */
308 89 : hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP; /* Q0 */
309 89 : move16();
310 89 : hStereoDft->win232ms_fx = dft_win232ms_16k_fx; /* Q15 */
311 89 : hStereoDft->win32ms_fx = dft_win232ms_16k_fx + 1; /* Q15 */
312 : }
313 819 : ELSE IF( EQ_32( output_Fs, 32000 ) )
314 : {
315 212 : hStereoDft->dft_trigo_fx = dft_trigo_32k_fx; /* Q15 */
316 212 : hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP; /* Q0 */
317 212 : move16();
318 212 : hStereoDft->win232ms_fx = dft_win232ms_32k_fx; /* Q15 */
319 212 : hStereoDft->win32ms_fx = dft_win232ms_32k_fx + 1; /* Q15 */
320 : }
321 : ELSE
322 : {
323 607 : assert( output_Fs == 48000 );
324 607 : hStereoDft->dft_trigo_fx = dft_trigo_48k_fx; /* Q15 */
325 607 : hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP; /* Q0 */
326 607 : move16();
327 607 : hStereoDft->win232ms_fx = dft_win232ms_48k_fx; /* Q15 */
328 607 : hStereoDft->win32ms_fx = dft_win232ms_48k_fx + 1; /* Q15 */
329 : }
330 :
331 908 : hStereoDft->win_8k_fx = dft_win_8k_fx; /* Q15 */
332 :
333 : /*Bands: find the number of bands, Nyquist freq. is not taken into account*/
334 908 : set16_fx( hStereoDft->band_res, hStereoDft->hConfig->band_res, STEREO_DFT_DEC_DFT_NB );
335 :
336 908 : hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[0], hStereoDft->NFFT, DEC ); /* Q0 */
337 908 : move16();
338 908 : hStereoDft->hb_stefi_delay = NS2SA_FX2( output_Fs, STEREO_DFT_TD_STEFI_DELAY_NS ); /* Q0 */
339 908 : move16();
340 :
341 908 : IF( GT_16( nchan_transport, 2 ) )
342 : {
343 44 : hStereoDft->min_smooth_gains_fx = min_smooth_gains2_fx; /* Q15 */
344 44 : hStereoDft->max_smooth_gains_fx = max_smooth_gains2_fx; /* Q15 */
345 : }
346 : ELSE
347 : {
348 864 : hStereoDft->min_smooth_gains_fx = min_smooth_gains1_fx; /* Q15 */
349 864 : hStereoDft->max_smooth_gains_fx = max_smooth_gains1_fx; /* Q15 */
350 : }
351 908 : hStereoDft->q_hb_stefi_sig_fx = Q31;
352 908 : move16();
353 908 : hStereoDft->q_ap_fade_mem_fx = Q31;
354 908 : move16();
355 :
356 : /* reset DFT stereo memories */
357 908 : stereo_dft_dec_reset_fx( hStereoDft );
358 :
359 908 : return;
360 : }
361 :
362 :
363 : /*-------------------------------------------------------------------------
364 : * stereo_dft_dec_create_fx()
365 : *
366 : * Create DFT stereo handle
367 : *------------------------------------------------------------------------*/
368 :
369 908 : ivas_error stereo_dft_dec_create_fx(
370 : STEREO_DFT_DEC_DATA_HANDLE *hStereoDft, /* i/o: decoder DFT stereo handle */
371 : const Word32 element_brate, /* i : element bitrate Q0*/
372 : const Word32 output_Fs, /* i : output sampling rate Q0*/
373 : const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC Q0*/
374 : const Word16 nchan_transport /* i : number of transport channels Q0*/
375 : )
376 : {
377 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft_loc;
378 : Word16 tmpS;
379 :
380 908 : IF( *hStereoDft != NULL )
381 : {
382 0 : return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: DFT Stereo memory already allocated\n" );
383 : }
384 :
385 908 : IF( ( hStereoDft_loc = (STEREO_DFT_DEC_DATA_HANDLE) malloc( sizeof( STEREO_DFT_DEC_DATA ) ) ) == NULL )
386 : {
387 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo\n" ) );
388 : }
389 :
390 908 : IF( ( hStereoDft_loc->hConfig = (STEREO_DFT_CONFIG_DATA_HANDLE) malloc( sizeof( STEREO_DFT_CONFIG_DATA ) ) ) == NULL )
391 : {
392 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo Config\n" ) );
393 : }
394 :
395 908 : IF( ( hStereoDft_loc->hBpf = (BPF_DEC_HANDLE) malloc( sizeof( BPF_DEC_DATA ) ) ) == NULL )
396 : {
397 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for BPF handle\n" ) );
398 : }
399 :
400 908 : IF( ( hStereoDft_loc->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL )
401 : {
402 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TCX-LTP handle\n" ) );
403 : }
404 908 : set_zero_fx( hStereoDft_loc->hb_nrg_subr_fx, STEREO_DFT_NBDIV ); /*Setting hb_nrg_subr_fx to zero*/
405 908 : hStereoDft_loc->q_hb_nrg_subr = Q31;
406 908 : move16();
407 :
408 908 : hStereoDft_loc->hConfig->force_mono_transmission = 0;
409 908 : move16();
410 :
411 908 : IF( sba_dirac_stereo_flag )
412 : {
413 96 : ivas_sba_dirac_stereo_config( hStereoDft_loc->hConfig );
414 : }
415 : ELSE
416 : {
417 812 : stereo_dft_config_fx( hStereoDft_loc->hConfig, element_brate, &tmpS, &tmpS );
418 : }
419 :
420 908 : stereo_dft_dec_open_fx( hStereoDft_loc, output_Fs, nchan_transport );
421 :
422 908 : *hStereoDft = hStereoDft_loc;
423 :
424 908 : return IVAS_ERR_OK;
425 : }
426 :
427 :
428 : /*-------------------------------------------------------------------------
429 : * stereo_dft_dequantize_res_gains_fx()
430 : *
431 : * joint dequantizer for side channel prediction gain and residual energy
432 : *-------------------------------------------------------------------------*/
433 :
434 412899 : static void stereo_dft_dequantize_res_gains_fx(
435 : Word16 *ind1, /* Q0 */
436 : Word16 *ind2, /* Q0 */
437 : Word32 *gout, /* Q31 */
438 : Word32 *rout, /* Q31 */
439 : const Word16 N /* Q0 */
440 : )
441 : {
442 : Word16 i, index;
443 : Word16 tmp;
444 :
445 825798 : FOR( i = 0; i < N; i++ )
446 : {
447 : /* Ensure the indices are within range -- may go out of range due to frame loss */
448 412899 : ind1[i] = check_bounds_s_fx( ind1[i], 0, 30 ); /* Q0 */
449 412899 : move16();
450 412899 : ind2[i] = check_bounds_s_fx( ind2[i], 0, 7 ); /* Q0 */
451 412899 : move16();
452 412899 : IF( LE_16( ind1[i], 15 ) )
453 : {
454 318379 : tmp = sub( 15, ind1[i] );
455 : }
456 : ELSE
457 : {
458 94520 : tmp = sub( ind1[i], 15 );
459 : }
460 : // index = add( shl( LE_16( ind1[i], 15 ) ? sub( 15, ind1[i] ) : sub( ind1[i], 15 ), 3 ), ind2[i] );
461 412899 : index = add( shl( tmp, 3 ), ind2[i] );
462 : // gout[i] = LE_16( ind1[i], 15 ) ? L_negate( dft_res_gains_q_fx[index][0] ) : dft_res_gains_q_fx[index][0];
463 412899 : IF( LE_16( ind1[i], 15 ) )
464 : {
465 318379 : gout[i] = L_negate( dft_res_gains_q_fx[index][0] ); /* Q31 */
466 318379 : move16();
467 : }
468 : ELSE
469 : {
470 94520 : gout[i] = dft_res_gains_q_fx[index][0]; /* Q31 */
471 94520 : move16();
472 : }
473 412899 : rout[i] = dft_res_gains_q_fx[index][1]; /* Q31 */
474 412899 : move16();
475 : }
476 :
477 412899 : return;
478 : }
479 :
480 : /*---------------------------------------------------------------------------
481 : * stereo_dft_dequantize_res_gains_f_fx()
482 : *
483 : * returns interepolated values for non-integer indices
484 : *---------------------------------------------------------------------------*/
485 :
486 258886 : static void stereo_dft_dequantize_res_gains_f_fx(
487 : Word32 *ind1, /* Q26 */
488 : Word32 *ind2, /* Q26 */
489 : Word32 *gout, /* Q31 */
490 : Word32 *rout, /* Q31 */
491 : const Word16 N /* Q0 */
492 : )
493 : {
494 : Word16 i, i1, j1, sign, ji, ij;
495 : Word32 L_tmp;
496 : Word32 fi, fj;
497 :
498 517772 : FOR( i = 0; i < N; i++ )
499 : {
500 : /* Ensure the indices are within range -- may go out of range due to frame loss */
501 258886 : ind1[i] = check_bounds_l( ind1[i], 0, 31 << Q26 ); /* Q26 */
502 258886 : move32();
503 258886 : ind2[i] = check_bounds_l( ind2[i], 0, 7 << Q26 ); /* Q26 */
504 258886 : move32();
505 :
506 : /* compensate for the offset and extract/remove sign of first index */
507 : // sign = LT_32( ind1[i], L_shl( 15, Q26 ) ) ? -1 : 1;
508 258886 : IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) )
509 : {
510 151745 : sign = -1;
511 151745 : move16();
512 : }
513 : ELSE
514 : {
515 107141 : sign = 1;
516 107141 : move16();
517 : }
518 258886 : IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) )
519 : {
520 151745 : L_tmp = L_sub( L_shl( 15, Q26 ), ind1[i] ); /* Q26 */
521 : }
522 : ELSE
523 : {
524 107141 : L_tmp = L_sub( ind1[i], L_shl( 15, Q26 ) ); /* Q26 */
525 : }
526 258886 : i1 = extract_l( L_shr( ( L_tmp ), Q26 ) ); /* Q0 */
527 258886 : IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) )
528 : {
529 151745 : L_tmp = L_sub( L_shl( 15, Q26 ), ind1[i] ); /* Q26 */
530 : }
531 : ELSE
532 : {
533 107141 : L_tmp = L_sub( ind1[i], L_shl( 15, Q26 ) ); /* Q26 */
534 : }
535 258886 : fi = L_sub( ( L_tmp ), L_shl( i1, Q26 ) ); /* Q26 */
536 258886 : move16();
537 258886 : j1 = extract_l( L_shr( ind2[i], Q26 ) ); /* Q0 */
538 258886 : fj = L_sub( ind2[i], L_shl( j1, Q26 ) ); /* Q26 */
539 :
540 : /* choose base indices for interpolation */
541 258886 : IF( LT_32( fj, ONE_IN_Q25 ) )
542 : {
543 109241 : ji = extract_l( L_min( j1, 7 ) ); /* Q0 */
544 : }
545 : ELSE
546 : {
547 149645 : ji = extract_l( L_min( add( j1, 1 ), 7 ) ); /* Q0 */
548 : }
549 :
550 258886 : IF( LT_32( fi, ONE_IN_Q25 ) )
551 : {
552 212928 : ij = extract_l( L_min( i1, 15 ) ); /* Q0 */
553 : }
554 : ELSE
555 : {
556 45958 : ij = extract_l( L_min( add( i1, 1 ), 15 ) ); /* Q0 */
557 : }
558 :
559 : /* interpolate values from table */
560 258886 : IF( LT_16( i1, 15 ) )
561 : {
562 258240 : gout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fi, Q5 ) ), dft_res_gains_q_fx[( i1 << 3 ) + ji][0] ), dft_res_gains_q_fx[( ( i1 + 1 ) << 3 ) + ji][0], L_shl( fi, Q5 ) ); /* Q31 */
563 258240 : move32();
564 258240 : IF( EQ_16( sign, -1 ) )
565 : {
566 151131 : gout[i] = L_negate( gout[i] );
567 151131 : move32();
568 : }
569 : }
570 : ELSE
571 : {
572 646 : gout[i] = dft_res_gains_q_fx[120 + ji][0]; /* Q31 */
573 646 : move32();
574 646 : IF( EQ_16( sign, -1 ) )
575 : {
576 614 : gout[i] = L_negate( gout[i] );
577 614 : move32();
578 : }
579 : }
580 :
581 258886 : IF( LT_16( j1, 7 ) )
582 : {
583 258886 : rout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fj, Q5 ) ), dft_res_gains_q_fx[( ij << 3 ) + j1][1] ), L_shl( fj, Q5 ), dft_res_gains_q_fx[( ij << 3 ) + j1 + 1][1] ); /* Q31 */
584 258886 : move32();
585 : }
586 : ELSE
587 : {
588 0 : rout[i] = dft_res_gains_q_fx[( ij << 3 ) + 7][1]; /* Q31 */
589 0 : move32();
590 : }
591 : }
592 258886 : return;
593 : }
594 :
595 : /*-------------------------------------------------------------------------
596 : * stereo_dft_dec_update_fx()
597 : *
598 : * Update DFT memories for new frame
599 : *-------------------------------------------------------------------------*/
600 :
601 68949 : void stereo_dft_dec_update_fx(
602 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */
603 : const Word16 output_frame, /* i : output frame length Q0*/
604 : const Word16 sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC Q0*/
605 : )
606 : {
607 : Word16 b, i, k_offset;
608 :
609 : /* Initialization */
610 68949 : k_offset = STEREO_DFT_OFFSET; /*Add an offset*/
611 68949 : move16();
612 : /* Update parameters */
613 965286 : FOR( i = 0; i < k_offset * STEREO_DFT_BAND_MAX; i++ )
614 : {
615 896337 : hStereoDft->side_gain_fx[i] = hStereoDft->side_gain_fx[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; /* Q31 */
616 896337 : move32();
617 896337 : hStereoDft->res_pred_gain_fx[i] = hStereoDft->res_pred_gain_fx[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; /* Q31 */
618 896337 : move32();
619 : }
620 :
621 137898 : FOR( i = 0; i < k_offset; i++ )
622 : {
623 68949 : hStereoDft->gipd_fx[i] = hStereoDft->gipd_fx[STEREO_DFT_NBDIV + i]; /* Q27 */
624 68949 : move32();
625 : }
626 :
627 : /* Update configuration memories */
628 137898 : FOR( i = 0; i < k_offset; i++ )
629 : {
630 68949 : hStereoDft->band_res[i] = hStereoDft->band_res[i + STEREO_DFT_NBDIV]; /* Q0 */
631 68949 : move16();
632 68949 : hStereoDft->prm_res[i] = hStereoDft->prm_res[i + STEREO_DFT_NBDIV]; /* Q0 */
633 68949 : move16();
634 68949 : hStereoDft->itd_fx[i] = hStereoDft->itd_fx[STEREO_DFT_NBDIV + i]; /* Q15 */
635 68949 : move32();
636 68949 : hStereoDft->res_cod_mode[i] = hStereoDft->res_cod_mode[i + STEREO_DFT_NBDIV]; /* Q0 */
637 68949 : move16();
638 68949 : hStereoDft->res_pred_mode[i] = hStereoDft->res_pred_mode[i + STEREO_DFT_NBDIV]; /* Q0 */
639 68949 : move16();
640 : }
641 :
642 : /* Load new configurations */
643 68949 : set16_fx( hStereoDft->band_res + k_offset, hStereoDft->hConfig->band_res, STEREO_DFT_NBDIV );
644 68949 : set16_fx( hStereoDft->prm_res + k_offset, hStereoDft->hConfig->prm_res, STEREO_DFT_NBDIV );
645 68949 : set16_fx( hStereoDft->res_pred_mode + k_offset, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_NBDIV );
646 68949 : set16_fx( hStereoDft->res_cod_mode + k_offset, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_NBDIV );
647 :
648 : /*Update attack info*/
649 68949 : IF( hStereoDft->attackPresent )
650 : {
651 1576 : hStereoDft->wasTransient = 1;
652 1576 : move16();
653 : }
654 67373 : ELSE IF( hStereoDft->wasTransient )
655 : {
656 1362 : hStereoDft->wasTransient = 0;
657 1362 : move16();
658 : }
659 :
660 206847 : FOR( i = STEREO_DFT_CORE_HIST_MAX - 1; i > 0; i-- )
661 : {
662 137898 : hStereoDft->core_hist[i] = hStereoDft->core_hist[i - 1]; /* Q0 */
663 137898 : move16();
664 : }
665 :
666 68949 : Copy32( hStereoDft->hb_stefi_sig_fx + output_frame, hStereoDft->hb_stefi_sig_fx, hStereoDft->hb_stefi_delay ); /* Qx */
667 68949 : Copy32( hStereoDft->hb_nrg_fx, hStereoDft->hb_nrg_fx + 1, STEREO_DFT_CORE_HIST_MAX - 1 ); /* Qx */
668 68949 : Copy32( hStereoDft->td_gain_fx, hStereoDft->td_gain_fx + 1, STEREO_DFT_CORE_HIST_MAX - 1 ); /* q_td_gain */
669 68949 : Copy( hStereoDft->q_td_gain, hStereoDft->q_td_gain + 1, STEREO_DFT_CORE_HIST_MAX - 1 );
670 :
671 68949 : IF( sba_dirac_stereo_flag )
672 : {
673 : /* buffer update, push back by 2 because of 2 subframes */
674 126010 : FOR( b = 0; b < hStereoDft->nbands; b++ )
675 : {
676 1152200 : FOR( i = SBA_DIRAC_NRG_SMOOTH_LONG; i > 1; i-- )
677 : {
678 1036980 : hStereoDft->smooth_buf_fx[b][i] = hStereoDft->smooth_buf_fx[b][i - 2]; /* q_smooth_buf_fx */
679 1036980 : move32();
680 : }
681 : }
682 : }
683 :
684 68949 : return;
685 : }
686 :
687 : /*-------------------------------------------------------------------------
688 : * stereo_dft_dec_destroy_fx()
689 : *
690 : * destroy DFT stereo handle
691 : *-------------------------------------------------------------------------*/
692 :
693 908 : void stereo_dft_dec_destroy_fx(
694 : STEREO_DFT_DEC_DATA_HANDLE *hStereoDft_glob /* i/o: decoder DFT stereo handle */
695 : )
696 : {
697 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft;
698 :
699 908 : hStereoDft = *hStereoDft_glob;
700 :
701 908 : IF( hStereoDft->hConfig != NULL )
702 : {
703 908 : free( hStereoDft->hConfig );
704 908 : hStereoDft->hConfig = NULL;
705 : }
706 :
707 908 : IF( hStereoDft->hBpf != NULL )
708 : {
709 908 : free( hStereoDft->hBpf );
710 908 : hStereoDft->hBpf = NULL;
711 : }
712 :
713 908 : IF( hStereoDft->hTcxLtpDec != NULL )
714 : {
715 908 : free( hStereoDft->hTcxLtpDec );
716 908 : hStereoDft->hTcxLtpDec = NULL;
717 : }
718 :
719 908 : free( hStereoDft );
720 908 : hStereoDft = NULL;
721 :
722 908 : return;
723 : }
724 :
725 :
726 : /*-------------------------------------------------------------------------
727 : * stereo_dft_dec_analyze_fx()
728 : *
729 : * DFT analysis on a 20ms frame
730 : *-------------------------------------------------------------------------*/
731 :
732 195208 : void stereo_dft_dec_analyze_fx(
733 : CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */
734 : const Word32 *input_fx, /* i : input signal q*/
735 : Word32 out_DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers q_out_DFT*/
736 : const Word16 chan, /* i : channel number Q0*/
737 : const Word16 input_frame, /* i : input frame size Q0*/
738 : const Word16 output_frame, /* i : output frame size Q0*/
739 : const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : type of signal to analyse */
740 : const Word16 k_offset, /* i : offset of DFT Q0*/
741 : const Word16 delay, /* i : delay in samples FOR input signal Q0*/
742 : Word16 *q,
743 : Word16 *q_out_DFT )
744 : {
745 :
746 : Word16 i, k;
747 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft;
748 : Word32 *pInput_fx, *pInput_buff_fx;
749 : Word32 *mem_fx, input_buff_fx[STEREO_DFT32MS_OVL_MAX + L_FRAME48k];
750 : Word32 DFT_fx[STEREO_DFT32MS_N_MAX], *pDFT_out_fx;
751 : Word16 NFFT, NFFT_core, ovl, zp;
752 : Word16 offset;
753 : Word32 fac_fx;
754 : const Word16 *trigo_fx, *win_left_fx, *win_right_fx, *win2_fx;
755 : Word16 trigo_dec_fx[STEREO_DFT32MS_N_MAX / 2 + 1];
756 : Word16 trigo_step;
757 : Word32 inputFs;
758 : Word16 delay_dec;
759 : Word16 mem_size;
760 : Word16 ovl2;
761 :
762 195208 : push_wmops( "DFT_analysis" );
763 :
764 195208 : hStereoDft = hCPE->hStereoDft;
765 :
766 195208 : assert( output_frame == STEREO_DFT_NBDIV * hStereoDft->N );
767 :
768 : /*-----------------------------------------------------------------*
769 : * Initialization
770 : *-----------------------------------------------------------------*/
771 :
772 195208 : IF( EQ_16( input_frame, output_frame ) )
773 : {
774 72286 : trigo_fx = hStereoDft->dft_trigo_fx;
775 72286 : trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); /* Q0 */
776 72286 : win_right_fx = hStereoDft->win32ms_fx; /* Q15 */
777 72286 : win_left_fx = hStereoDft->win32ms_fx; /* Q15 */
778 72286 : win2_fx = hStereoDft->win232ms_fx; /* Q15 */
779 :
780 72286 : test();
781 72286 : IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
782 : {
783 5085 : assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" );
784 5085 : mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */
785 : }
786 67201 : ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) )
787 : {
788 3436 : mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */
789 : }
790 : ELSE
791 : {
792 63765 : mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */
793 : }
794 : }
795 122922 : ELSE IF( EQ_16( input_frame, L_FRAME ) )
796 : {
797 59225 : trigo_fx = hStereoDft->dft_trigo_12k8_fx; /* Q15 */
798 59225 : trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP * STEREO_DFT_TRIGO_DEC_STEP;
799 59225 : move16();
800 59225 : win_right_fx = hStereoDft->win32ms_12k8_fx; /* Q15 */
801 59225 : win_left_fx = hStereoDft->win32ms_12k8_fx; /* Q15 */
802 59225 : win2_fx = hStereoDft->win232ms_12k8_fx; /* Q15 */
803 :
804 59225 : test();
805 59225 : IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
806 : {
807 20955 : assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" );
808 20955 : mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */
809 : }
810 38270 : ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) )
811 : {
812 18516 : mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */
813 : }
814 : ELSE
815 : {
816 19754 : assert( ( chan == 1 ) && "12.8kHz sampling rate only FOR second channel, i.e. residual coding or allpass signal" );
817 19754 : mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */
818 : }
819 : }
820 63697 : ELSE IF( EQ_16( input_frame, L_FRAME16k ) )
821 : {
822 46867 : trigo_fx = hStereoDft->dft_trigo_16k_fx; /* Q15 */
823 46867 : trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP;
824 46867 : move16();
825 46867 : win_right_fx = hStereoDft->win32ms_16k_fx; /* Q15 */
826 46867 : win_left_fx = hStereoDft->win32ms_16k_fx; /* Q15 */
827 46867 : win2_fx = hStereoDft->win232ms_16k_fx; /* Q15 */
828 :
829 46867 : test();
830 46867 : IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
831 : {
832 22157 : assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" );
833 22157 : mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */
834 : }
835 24710 : ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) )
836 : {
837 14901 : mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */
838 : }
839 : ELSE
840 : {
841 9809 : assert( ( chan == 1 ) && ( hCPE->hStereoDft->hConfig->res_pred_mode == STEREO_DFT_RESPRED_ESF ) && "16kHz sampling rate only FOR second channel with allpass signal" );
842 9809 : mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */
843 : }
844 : }
845 16830 : ELSE IF( EQ_16( input_frame, L_FRAME8k ) )
846 : {
847 16830 : assert( ( chan == 1 ) && "DFT stereo: 8kHz analysis only FOR residual coding" );
848 16830 : trigo_fx = hStereoDft->dft_trigo_8k_fx; /* Q15 */
849 16830 : trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP * STEREO_DFT_TRIGO_DEC_STEP;
850 16830 : move16();
851 16830 : win_right_fx = hStereoDft->win32ms_8k_fx; /* Q15 */
852 16830 : win_left_fx = hStereoDft->win32ms_8k_fx; /* Q15 */
853 16830 : win2_fx = hStereoDft->win232ms_8k_fx; /* Q15 */
854 16830 : mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */
855 : }
856 : ELSE
857 : {
858 0 : IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error in DFT stereo: sampling rate not supported" );
859 0 : mem_fx = NULL; /* to avoid compilation warning */
860 0 : trigo_fx = NULL; /* to avoid compilation warning */
861 0 : trigo_step = -1; /* to avoid compilation warning */
862 0 : move16();
863 0 : win_right_fx = NULL; /* to avoid compilation warning */
864 0 : win_left_fx = NULL; /* to avoid compilation warning */
865 0 : win2_fx = NULL; /* to avoid compilation warning */
866 : }
867 :
868 195208 : inputFs = L_mult0( input_frame, FRAMES_PER_SEC ); /* Q0 */
869 195208 : delay_dec = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS );
870 195208 : move16();
871 195208 : zp = NS2SA_FX2( inputFs, STEREO_DFT32MS_ZP_NS );
872 195208 : move16();
873 195208 : ovl = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS );
874 195208 : move16();
875 195208 : NFFT = NS2SA_FX2( inputFs, STEREO_DFT32MS_N_NS );
876 : Word16 qfac_fx;
877 195208 : fac_fx = BASOP_Util_Divide3232_Scale_newton( hStereoDft->NFFT, NFFT, &qfac_fx ); /* qfac_fx */
878 195208 : qfac_fx = sub( 31, qfac_fx );
879 195208 : ovl2 = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL2_NS );
880 195208 : move16();
881 :
882 : /* Offset FOR the time buffers */
883 195208 : 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 ) ) );
884 195208 : mem_size = add( delay_dec, delay );
885 :
886 : /* Update buffers */
887 195208 : Copy32( mem_fx, input_buff_fx, mem_size ); /* Q11 */
888 195208 : Copy32( input_fx, input_buff_fx + mem_size, input_frame ); /* q */
889 195208 : Copy32( input_buff_fx + input_frame, mem_fx, mem_size ); /* q */
890 195208 : pInput_buff_fx = input_buff_fx; /* q */
891 :
892 195208 : test();
893 195208 : IF( EQ_16( hCPE->nchan_out, 1 ) && ( hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) )
894 : {
895 39593 : pop_wmops();
896 39593 : return;
897 : }
898 :
899 :
900 : /*-----------------------------------------------------------------*
901 : * DFT Analysis: loop over frame
902 : *-----------------------------------------------------------------*/
903 :
904 155615 : assert( ( k_offset <= STEREO_DFT_NBDIV ) );
905 :
906 16215071 : FOR( i = 0; i < NFFT / 4; i++ )
907 : {
908 16059456 : trigo_dec_fx[i] = trigo_fx[i * trigo_step];
909 16059456 : move16();
910 16059456 : trigo_dec_fx[NFFT / 2 - i] = trigo_fx[i * trigo_step];
911 16059456 : move16();
912 : }
913 155615 : trigo_dec_fx[NFFT / 4] = trigo_fx[NFFT / 4 * trigo_step];
914 155615 : move16();
915 :
916 396608 : FOR( k = 0; k < STEREO_DFT_NBDIV - k_offset; k++ )
917 : {
918 240993 : set32_fx( DFT_fx, 0, STEREO_DFT32MS_N_MAX );
919 240993 : IF( k == 0 )
920 : {
921 121442 : offset = 0;
922 121442 : move16();
923 : }
924 : ELSE
925 : {
926 : /* If OVL2 = OVL offset = 10ms */
927 119551 : offset = NS2SA_FX2( inputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 );
928 119551 : move16();
929 : }
930 :
931 240993 : pInput_fx = pInput_buff_fx + offset; /* q */
932 240993 : pDFT_out_fx = out_DFT_fx[chan] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* q_out_DFT */
933 :
934 : /*Forwards FFT: L and R*/
935 : /* Zero Padding & Flat Portion */
936 240993 : Copy32( pInput_fx, DFT_fx + zp, sub( NFFT, i_mult( 2, zp ) ) ); /* q */
937 :
938 : /* Overlapping portions */
939 240993 : IF( k == 0 )
940 : {
941 7278692 : FOR( i = 0; i < ovl; i++ )
942 : {
943 7157250 : DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win_left_fx[STEREO_DFT32MS_STEP * i] ); /* q */
944 7157250 : move32();
945 : }
946 21593192 : FOR( i = 0; i < ovl2; i++ )
947 : {
948 21471750 : DFT_fx[NFFT - zp - 1 - i] = Mpy_32_16_1( DFT_fx[NFFT - zp - 1 - i], win2_fx[i] ); /* q */
949 21471750 : move32();
950 : }
951 : }
952 : ELSE
953 : {
954 21153421 : FOR( i = 0; i < ovl2; i++ )
955 : {
956 21033870 : DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win2_fx[i] ); /* q */
957 21033870 : move32();
958 : }
959 7130841 : FOR( i = 0; i < ovl; i++ )
960 : {
961 7011290 : DFT_fx[NFFT - zp - i - 1] = Mpy_32_16_1( DFT_fx[NFFT - zp - i - 1], win_right_fx[STEREO_DFT32MS_STEP * i] ); /* q */
962 7011290 : move32();
963 : }
964 : }
965 : Word16 q_DFT, q_shift, guarded_bits;
966 240993 : q_DFT = *q;
967 240993 : move16();
968 240993 : guarded_bits = find_guarded_bits_fx( NFFT );
969 240993 : q_shift = sub( L_norm_arr( DFT_fx, NFFT ), guarded_bits );
970 :
971 90919649 : FOR( Word16 j = 0; j < NFFT; j++ )
972 : {
973 90678656 : DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift*/
974 90678656 : move32();
975 : }
976 :
977 240993 : q_DFT = add( q_DFT, q_shift );
978 :
979 240993 : rfft_fx( DFT_fx, trigo_dec_fx, NFFT, -1 );
980 :
981 240993 : q_shift = sub( L_norm_arr( DFT_fx, NFFT ), sub( 31, qfac_fx ) );
982 90919649 : FOR( Word16 j = 0; j < NFFT; j++ )
983 : {
984 90678656 : DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift */
985 90678656 : move32();
986 : }
987 240993 : q_DFT = add( q_DFT, q_shift );
988 240993 : IF( sub( q_out_DFT[chan], q_DFT ) > 0 )
989 : {
990 0 : FOR( Word32 j = 0; j < NFFT; j++ )
991 : {
992 0 : out_DFT_fx[chan][j] = L_shr( out_DFT_fx[chan][j], sub( q_out_DFT[chan], q_DFT ) ); /* q_DFT */
993 0 : move32();
994 : }
995 0 : q_out_DFT[chan] = q_DFT;
996 0 : move16();
997 : }
998 : ELSE
999 : {
1000 90919649 : FOR( Word32 j = 0; j < NFFT; j++ )
1001 : {
1002 90678656 : DFT_fx[j] = L_shr( DFT_fx[j], sub( q_DFT, q_out_DFT[chan] ) ); /* q_DFT */
1003 90678656 : move32();
1004 : }
1005 240993 : q_DFT = q_out_DFT[chan];
1006 240993 : move16();
1007 : }
1008 :
1009 : /*Resampling: filtering+scaling*/
1010 240993 : test();
1011 240993 : test();
1012 240993 : IF( ( ana_type == DFT_STEREO_DEC_ANA_FB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_NOCORE ) )
1013 : {
1014 188526 : pDFT_out_fx[0] = L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ); /*DC*/ /* qDFT */
1015 188526 : move32();
1016 188526 : IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/
1017 : {
1018 63290 : pDFT_out_fx[1] = L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */
1019 63290 : move32();
1020 : }
1021 : ELSE
1022 : {
1023 125236 : pDFT_out_fx[1] = 0;
1024 125236 : move32();
1025 : }
1026 74510738 : FOR( i = 2; i < NFFT; i++ )
1027 : {
1028 74322212 : pDFT_out_fx[i] = L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */
1029 74322212 : move32();
1030 : }
1031 55163502 : FOR( i = NFFT; i < hStereoDft->NFFT; i++ )
1032 : {
1033 54974976 : pDFT_out_fx[i] = 0; /* qDFT */
1034 54974976 : move32();
1035 : }
1036 : }
1037 52467 : ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
1038 : {
1039 50394 : pDFT_out_fx[0] = L_sub( pDFT_out_fx[0], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[0], fac_fx ), dft_bpf_weights_fx[0] ), sub( 32, qfac_fx ) ) ); /* qDFT */
1040 50394 : move32();
1041 :
1042 2015760 : FOR( i = 1; i < STEREO_DFT_BPF_SIZE; i++ )
1043 : {
1044 1965366 : pDFT_out_fx[2 * i] = L_sub( pDFT_out_fx[2 * i], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); /* qDFT */
1045 1965366 : move32();
1046 1965366 : pDFT_out_fx[2 * i + 1] = L_sub( pDFT_out_fx[2 * i + 1], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i + 1], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); /* qDFT */
1047 1965366 : move32();
1048 : }
1049 : }
1050 2073 : ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_HB_ADD ) )
1051 : {
1052 80 : NFFT_core = NS2SA_FX2( L_mult0( hCPE->hCoreCoder[0]->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_N_NS ); /* Q0 */
1053 80 : move16();
1054 :
1055 43536 : FOR( i = NFFT_core; i < NFFT; i++ )
1056 : {
1057 43456 : pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); /* qDFT */
1058 43456 : move32();
1059 : }
1060 : }
1061 : ELSE
1062 : {
1063 1993 : pDFT_out_fx[0] = L_add( pDFT_out_fx[0], L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ) ); /*DC*/ /* qDFT */
1064 1993 : move32();
1065 1993 : IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/
1066 : {
1067 1101 : pDFT_out_fx[1] = L_add( L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[1] ); /* qDFT */
1068 1101 : move32();
1069 : }
1070 1039351 : FOR( i = 2; i < NFFT; i++ )
1071 : {
1072 1037358 : pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); /* qDFT */
1073 1037358 : move32();
1074 : }
1075 : }
1076 : }
1077 :
1078 155615 : pop_wmops();
1079 155615 : return;
1080 : }
1081 :
1082 :
1083 : /*-------------------------------------------------------------------------
1084 : * stereo_dft_dec_synthesize_fx()
1085 : *
1086 : * Inverse DFT on a 20ms frame
1087 : *-------------------------------------------------------------------------*/
1088 :
1089 99717 : void stereo_dft_dec_synthesize_fx(
1090 : CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */
1091 : Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i : DFT buffers qDFT*/
1092 : const Word16 chan, /* i : channel number Q0*/
1093 : Word32 output[L_FRAME48k], /* o : output synthesis signal qDFT*/
1094 : const Word16 output_frame /* i : output frame length Q0*/
1095 : )
1096 : {
1097 : Word16 i, k;
1098 : Word16 offset;
1099 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft;
1100 : Word32 *p_DFT;
1101 : const Word16 *win, *win2;
1102 : Word16 trigo_dec[STEREO_DFT32MS_N_MAX / 2 + 1];
1103 : Word16 trigo_step;
1104 : Word16 ovl, zp, NFFT;
1105 : Word32 outputFs;
1106 : Word16 ovl2, flat_portion_end;
1107 : Word32 ola_buff[STEREO_DFT32MS_OVL2_MAX];
1108 : Word16 moffset;
1109 : Word16 scale_dft;
1110 99717 : push_wmops( "DFT_synthesis" );
1111 :
1112 : /*-----------------------------------------------------------------*
1113 : * Initialization
1114 : *-----------------------------------------------------------------*/
1115 :
1116 99717 : hStereoDft = hCPE->hStereoDft;
1117 :
1118 99717 : hCPE->lt_es_em_fx = L_shr( hCPE->lt_es_em_fx, 9 ); // Q24 -> Q15
1119 :
1120 99717 : outputFs = L_mult0( output_frame, FRAMES_PER_SEC ); /* Q0 */
1121 :
1122 99717 : zp = NS2SA_FX2( outputFs, STEREO_DFT32MS_ZP_NS );
1123 99717 : move16();
1124 99717 : ovl = NS2SA_FX2( outputFs, STEREO_DFT32MS_OVL_NS );
1125 99717 : move16();
1126 99717 : win = hStereoDft->win32ms_fx; /* Q15 */
1127 99717 : NFFT = NS2SA_FX2( outputFs, STEREO_DFT32MS_N_NS );
1128 99717 : move16();
1129 99717 : ovl2 = NS2SA_FX2( outputFs, STEREO_DFT32MS_OVL2_NS );
1130 99717 : move16();
1131 99717 : flat_portion_end = NS2SA_FX2( outputFs, L_sub( STEREO_DFT32MS_WIN_CENTER_NS, L_shr( STEREO_DFT32MS_OVL2_NS, 1 ) ) );
1132 99717 : move16();
1133 99717 : win2 = hStereoDft->win232ms_fx; /* Q15 */
1134 :
1135 99717 : p_DFT = DFT[chan];
1136 99717 : set32_fx( output, 0, NS2SA_FX2( outputFs, FRAME_SIZE_NS ) );
1137 :
1138 : /* deactivating the spectrum scrambling on active speech */
1139 99717 : test();
1140 99717 : test();
1141 99717 : test();
1142 99717 : if ( ( chan == 0 && GT_16( hCPE->hCoreCoder[0]->last_coder_type, UNVOICED ) ) || EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) || LT_16( hCPE->last_element_mode, IVAS_CPE_DFT ) )
1143 : {
1144 58688 : hCPE->stereo_switching_counter = 10; /* Q0 */
1145 58688 : move16();
1146 : }
1147 :
1148 99717 : IF( hCPE->stereo_switching_counter == 0 )
1149 : {
1150 : /* Set the level of dispersion */
1151 0 : Word16 tmp = extract_l( L_max( (Word16) 0xF333, L_min( (Word16) 0x3333, hCPE->lt_es_em_fx ) ) );
1152 0 : hCPE->NbFrameMod = extract_h( L_add( L_mult0( 12, tmp ), 0x0000D99A ) ); /* -0.1: -0.4 ; -0.1 -> 0, 0.4 -> 6*/ /* Q0 */
1153 0 : move16();
1154 : }
1155 99717 : moffset = s_max( 0, sub( 6, hCPE->NbFrameMod ) );
1156 :
1157 : /*-----------------------------------------------------------------*
1158 : * Synthesis
1159 : *-----------------------------------------------------------------*/
1160 :
1161 99717 : trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); /* Q0 */
1162 16911797 : FOR( i = 0; i < NFFT / 4; i++ )
1163 : {
1164 16812080 : trigo_dec[i] = hStereoDft->dft_trigo_fx[i * trigo_step]; /* Q15 */
1165 16812080 : move16();
1166 16812080 : trigo_dec[NFFT / 2 - i] = hStereoDft->dft_trigo_fx[i * trigo_step]; /* Q15 */
1167 16812080 : move16();
1168 : }
1169 99717 : trigo_dec[NFFT / 4] = hStereoDft->dft_trigo_fx[NFFT / 4 * trigo_step]; /* Q15 */
1170 99717 : move16();
1171 :
1172 299151 : FOR( k = 0; k < STEREO_DFT_NBDIV; k++ )
1173 : {
1174 : /* scrambling the spectrum */
1175 199434 : test();
1176 199434 : test();
1177 199434 : test();
1178 199434 : test();
1179 199434 : test();
1180 199434 : IF( LE_16( hCPE->stereo_switching_counter, 6 ) && EQ_16( chan, 1 ) && ( GT_32( hCPE->lt_es_em_fx, (Word16) 0xCCCD ) || GT_16( hCPE->NbFrameMod, 4 ) ) )
1181 : {
1182 0 : FOR( i = 3; i < NFFT - moffset - 1; i++ )
1183 : {
1184 0 : p_DFT[i] = L_negate( p_DFT[i + moffset + 1] ); /* q_DFT */
1185 0 : move32();
1186 : }
1187 : }
1188 199434 : ELSE IF( LT_16( hCPE->stereo_switching_counter, 7 ) && ( GT_32( hCPE->lt_es_em_fx, (Word16) 0x199A ) || GT_16( hCPE->NbFrameMod, 4 ) ) )
1189 : {
1190 0 : FOR( i = 16 - hCPE->NbFrameMod; i < NFFT - moffset - 1; i++ )
1191 : {
1192 0 : p_DFT[i - 2] = L_negate( p_DFT[i + moffset + 1] ); /* q_DFT */
1193 0 : move32();
1194 : }
1195 : }
1196 :
1197 : /*IFFT*/
1198 199434 : scale_dft = getScaleFactor32( p_DFT, NFFT );
1199 199434 : scale_dft = sub( find_guarded_bits_fx( NFFT ), scale_dft );
1200 199434 : v_shr( p_DFT, scale_dft, p_DFT, NFFT );
1201 199434 : rfft_fx( p_DFT, trigo_dec, NFFT, 1 );
1202 199434 : v_shr( p_DFT, negate( scale_dft ), p_DFT, NFFT );
1203 :
1204 199434 : IF( k == 0 )
1205 : {
1206 99717 : offset = 0;
1207 99717 : move16();
1208 :
1209 : /* Left OLA - 3.125ms */
1210 10607267 : FOR( i = 0; i < ovl; i++ )
1211 : {
1212 10507550 : output[offset + i] = Madd_32_16( L_shr( hCPE->output_mem_fx[chan][i], sub( hCPE->q_output_mem_fx[chan], hCPE->hStereoDft->q_dft ) ), p_DFT[zp + i], win[STEREO_DFT32MS_STEP * i] ); /* hCPE->hStereoDft->q_dft */
1213 10507550 : move32();
1214 : }
1215 : /* Flat Portion */
1216 12708777 : FOR( i = ovl; i < flat_portion_end; i++ )
1217 : {
1218 12609060 : output[offset + i] = p_DFT[zp + i]; /* hCPE->hStereoDft->q_dft */
1219 12609060 : move32();
1220 : }
1221 : /* Right OLA */
1222 31622367 : FOR( i = 0; i < ovl2; i++ )
1223 : {
1224 31522650 : ola_buff[i] = Mpy_32_16_1( p_DFT[NFFT - zp - ovl2 + i], win2[ovl2 - 1 - i] ); /* hCPE->hStereoDft->q_dft */
1225 31522650 : move32();
1226 : }
1227 : }
1228 : ELSE
1229 : {
1230 : /* If OVL2 = OVL offset = 10ms */
1231 99717 : offset = flat_portion_end;
1232 99717 : move16();
1233 : /* Left OLA */
1234 31622367 : FOR( i = 0; i < ovl2; i++ )
1235 : {
1236 31522650 : output[offset + i] = Madd_32_16( ola_buff[i], p_DFT[zp + i], win2[i] ); /* hCPE->hStereoDft->q_dft */
1237 31522650 : move32();
1238 : }
1239 : /* Flat Portion */
1240 12708777 : FOR( i = ovl2; i < NFFT - 2 * zp - ovl; i++ )
1241 : {
1242 12609060 : output[offset + i] = p_DFT[zp + i]; /* hCPE->hStereoDft->q_dft */
1243 12609060 : move32();
1244 : }
1245 : /* Right OLA - 3.125ms */
1246 10607267 : FOR( i = 0; i < ovl; i++ )
1247 : {
1248 10507550 : hCPE->output_mem_fx[chan][i] = Mpy_32_16_1( p_DFT[NFFT - zp - ovl + i], win[STEREO_DFT32MS_STEP * ( ovl - 1 - i )] ); /* hCPE->hStereoDft->q_dft */
1249 10507550 : move32();
1250 : }
1251 99717 : hCPE->q_output_mem_fx[chan] = hCPE->hStereoDft->q_dft;
1252 99717 : move16();
1253 : }
1254 199434 : p_DFT += STEREO_DFT32MS_N_MAX;
1255 : }
1256 :
1257 99717 : hCPE->lt_es_em_fx = L_shl( hCPE->lt_es_em_fx, 9 ); // Q15 -> Q24
1258 99717 : move32();
1259 :
1260 99717 : pop_wmops();
1261 99717 : return;
1262 : }
1263 :
1264 : /*---------------------------------------------------------------
1265 : * stereo_dft_dec_smooth_parameters_fx()
1266 : *
1267 : *
1268 : * ---------------------------------------------------------------*/
1269 :
1270 41500 : void stereo_dft_dec_smooth_parameters_fx(
1271 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */
1272 : const Word16 prev_sid_nodata, /* i : Previous SID/No data indicator Q0*/
1273 : const Word16 active_frame_counter, /* i : Active frame counter Q0*/
1274 : const Word32 element_brate /* i : Element bitrate Q0*/
1275 : )
1276 : {
1277 : Word16 k_offset, k, k2, b, N_div;
1278 : Word32 *pIpd, *pInterpol;
1279 : Word32 *pgIpd;
1280 : Word32 *pSideGain;
1281 : Word32 diff_ipd;
1282 : Word16 nbands;
1283 : Word32 max_res_pred_ind;
1284 : Word32 PI_round;
1285 :
1286 41500 : N_div = STEREO_DFT_NBDIV;
1287 41500 : move16();
1288 41500 : k_offset = STEREO_DFT_OFFSET;
1289 41500 : move16();
1290 41500 : PI_round = EVS_PI_FX_Q27 + EPSILLON_FX; /*add error corrections when comparing ipds with exactly a difference of pi*/
1291 41500 : move32();
1292 :
1293 41500 : test();
1294 41500 : IF( hStereoDft->frame_sid_nodata || prev_sid_nodata )
1295 : {
1296 5706 : k = 1;
1297 38266 : FOR( b = 0; b < hStereoDft->nbands; b++ )
1298 : {
1299 32560 : *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), 1 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ) ); /* Q31 */
1300 32560 : move32();
1301 : }
1302 :
1303 5706 : IF( hStereoDft->frame_sid_nodata )
1304 : {
1305 : /* set new xfade target if new itd received */
1306 5470 : IF( LT_16( hStereoDft->ipd_xfade_counter, STEREO_DFT_ITD_CNG_XFADE ) )
1307 : {
1308 : Word16 q_val;
1309 5349 : IF( GT_32( L_sub( hStereoDft->gipd_fx[k + k_offset], hStereoDft->ipd_xfade_prev_fx ), EVS_PI_FX_Q27 ) )
1310 : {
1311 0 : hStereoDft->ipd_xfade_target_fx = L_sub( hStereoDft->gipd_fx[k + k_offset], EVS_PI_FX_Q27 << 1 ); /* Q27 */
1312 0 : move32();
1313 0 : hStereoDft->ipd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->ipd_xfade_target_fx, hStereoDft->ipd_xfade_prev_fx ), L_shl( L_sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->ipd_xfade_counter ), Q24 ), &q_val ); /* Q27 */
1314 0 : move32();
1315 :
1316 0 : q_val = add( q_val, Q9 ); /* Q27 - (Q15 - q_val + (-3))*/
1317 0 : move32();
1318 0 : IF( GT_16( q_val, 32 ) )
1319 : {
1320 0 : assert( 0 );
1321 : }
1322 : ELSE
1323 : {
1324 0 : hStereoDft->ipd_xfade_step_fx = L_shl( hStereoDft->ipd_xfade_step_fx, q_val ); /* Q27 */
1325 0 : move32();
1326 : }
1327 : }
1328 5349 : ELSE IF( GT_32( L_sub( hStereoDft->ipd_xfade_prev_fx, hStereoDft->gipd_fx[k + k_offset] ), EVS_PI_FX_Q27 ) )
1329 : {
1330 34 : hStereoDft->ipd_xfade_target_fx = L_add( hStereoDft->gipd_fx[k + k_offset], EVS_PI_FX_Q27 << 1 ); /* Q27 */
1331 34 : move32();
1332 34 : hStereoDft->ipd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->ipd_xfade_target_fx, hStereoDft->ipd_xfade_prev_fx ), L_shl( L_sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->ipd_xfade_counter ), Q24 ), &q_val ); /* Q27 */
1333 34 : q_val = add( q_val, Q9 ); /* Q27 - (Q15 - q_val + (-3))*/
1334 34 : move32();
1335 34 : IF( GT_16( q_val, 32 ) )
1336 : {
1337 0 : assert( 0 );
1338 : }
1339 : ELSE
1340 : {
1341 34 : hStereoDft->ipd_xfade_step_fx = L_shl( hStereoDft->ipd_xfade_step_fx, q_val ); /* Q27 */
1342 34 : move32();
1343 : }
1344 : }
1345 : ELSE
1346 : {
1347 5315 : hStereoDft->ipd_xfade_target_fx = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */
1348 5315 : move32();
1349 5315 : hStereoDft->ipd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->ipd_xfade_target_fx, hStereoDft->ipd_xfade_prev_fx ), L_shl( L_sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->ipd_xfade_counter ), Q24 ), &q_val );
1350 5315 : q_val = add( q_val, Q9 ); /* Q27 - (Q15 - q_val + (-3))*/
1351 5315 : move32();
1352 5315 : IF( GT_16( q_val, 32 ) )
1353 : {
1354 0 : assert( 0 );
1355 : }
1356 : ELSE
1357 : {
1358 5315 : hStereoDft->ipd_xfade_step_fx = L_shl( hStereoDft->ipd_xfade_step_fx, q_val ); /* Q27 */
1359 5315 : move32();
1360 : }
1361 : }
1362 : }
1363 :
1364 : /* xfade */
1365 5470 : test();
1366 5470 : test();
1367 5470 : IF( NE_32( hStereoDft->ipd_xfade_prev_fx, hStereoDft->ipd_xfade_target_fx ) && LT_16( hStereoDft->ipd_xfade_counter, STEREO_DFT_ITD_CNG_XFADE ) && LE_32( hStereoDft->last_active_element_brate, 24400 ) )
1368 : {
1369 3354 : hStereoDft->gipd_fx[k + k_offset] = L_add( hStereoDft->ipd_xfade_prev_fx, hStereoDft->ipd_xfade_step_fx ); /* Q27 */
1370 3354 : move32();
1371 3354 : hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */
1372 3354 : move32();
1373 3354 : hStereoDft->ipd_xfade_counter = add( hStereoDft->ipd_xfade_counter, 1 ); /* Q27 */
1374 3354 : move16();
1375 : }
1376 : }
1377 : ELSE
1378 : {
1379 : /* First active frame, "reset" everything if long enough active encoding, only triggered if STEREO_DFT_ITD_CNG_XFADE_RESET = -1 */
1380 236 : IF( GT_16( active_frame_counter, STEREO_DFT_ITD_CNG_XFADE_RESET ) )
1381 : {
1382 0 : hStereoDft->ipd_xfade_target_fx = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */
1383 0 : move32();
1384 0 : hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */
1385 0 : move32();
1386 0 : hStereoDft->ipd_xfade_counter = 0;
1387 0 : move16();
1388 : }
1389 : }
1390 :
1391 11412 : FOR( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ )
1392 : {
1393 5706 : hStereoDft->gipd_fx[( k + k_offset ) - k2] = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */
1394 5706 : move32();
1395 : }
1396 :
1397 5706 : IF( hStereoDft->frame_sid_nodata )
1398 : {
1399 : /* set new xfade target if new itd received */
1400 5470 : IF( LT_16( hStereoDft->itd_xfade_counter, STEREO_DFT_ITD_CNG_XFADE ) )
1401 : {
1402 : Word16 q_val;
1403 5470 : hStereoDft->itd_xfade_target_fx = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
1404 5470 : move32();
1405 5470 : hStereoDft->itd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->itd_xfade_target_fx, hStereoDft->itd_xfade_prev_fx ), L_shl( sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->itd_xfade_counter ), Q15 ), &q_val );
1406 5470 : IF( GT_16( q_val, 16 ) )
1407 : {
1408 0 : assert( 0 );
1409 : }
1410 : ELSE
1411 : {
1412 5470 : hStereoDft->itd_xfade_step_fx = L_shl( hStereoDft->itd_xfade_step_fx, q_val ); /* Q15 */
1413 5470 : move32();
1414 : }
1415 5470 : move32();
1416 : }
1417 :
1418 : /* xfade */
1419 5470 : IF( NE_32( hStereoDft->itd_xfade_prev_fx, hStereoDft->itd_xfade_target_fx ) && LT_16( hStereoDft->itd_xfade_counter, STEREO_DFT_ITD_CNG_XFADE ) && LE_32( hStereoDft->last_active_element_brate, 24400 ) )
1420 : {
1421 640 : hStereoDft->itd_fx[k + k_offset] = L_add( hStereoDft->itd_xfade_prev_fx, hStereoDft->itd_xfade_step_fx ); /* Q15 */
1422 640 : move32();
1423 640 : hStereoDft->itd_xfade_prev_fx = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
1424 640 : move32();
1425 640 : hStereoDft->itd_xfade_counter = add( hStereoDft->itd_xfade_counter, 1 ); /* Q0 */
1426 : }
1427 : }
1428 : ELSE
1429 : {
1430 : /* First active frame, "reset" everything if long enough active encoding, only triggered if STEREO_DFT_ITD_CNG_XFADE_RESET = -1 */
1431 236 : IF( GT_16( active_frame_counter, STEREO_DFT_ITD_CNG_XFADE_RESET ) )
1432 : {
1433 0 : hStereoDft->itd_xfade_target_fx = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
1434 0 : move32();
1435 0 : hStereoDft->itd_xfade_prev_fx = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
1436 0 : move32();
1437 0 : hStereoDft->itd_xfade_counter = 0; /* Q0 */
1438 0 : move32();
1439 : }
1440 :
1441 236 : hStereoDft->last_active_element_brate = element_brate;
1442 236 : move32();
1443 : }
1444 11412 : FOR( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ )
1445 : {
1446 5706 : hStereoDft->itd_fx[( k + k_offset ) - k2] = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
1447 5706 : move32();
1448 : }
1449 :
1450 5706 : return;
1451 : }
1452 :
1453 : /* Active frame, "reset" everything "reset" everything if long enough active encoding */
1454 35794 : IF( GT_16( active_frame_counter, STEREO_DFT_ITD_CNG_XFADE_RESET ) )
1455 : {
1456 34683 : hStereoDft->itd_xfade_counter = 0;
1457 34683 : move16();
1458 34683 : hStereoDft->itd_xfade_target_fx = hStereoDft->itd_fx[STEREO_DFT_NBDIV - 1]; /* Q15 */
1459 34683 : move32();
1460 34683 : hStereoDft->itd_xfade_prev_fx = hStereoDft->itd_fx[STEREO_DFT_NBDIV - 1]; /* Q15 */
1461 34683 : move32();
1462 34683 : hStereoDft->ipd_xfade_counter = 0;
1463 34683 : move16();
1464 34683 : hStereoDft->ipd_xfade_target_fx = hStereoDft->gipd_fx[STEREO_DFT_NBDIV - 1]; /* Q27 */
1465 34683 : move32();
1466 34683 : hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[STEREO_DFT_NBDIV - 1]; /* Q27 */
1467 34683 : move32();
1468 : }
1469 :
1470 35794 : hStereoDft->last_active_element_brate = element_brate;
1471 35794 : move32();
1472 :
1473 71588 : FOR( k = sub( hStereoDft->prm_res[k_offset], 1 ); k < N_div; k += hStereoDft->prm_res[k + k_offset] )
1474 : {
1475 35794 : max_res_pred_ind = 0;
1476 35794 : move32();
1477 35794 : IF( EQ_16( hStereoDft->reverb_flag, 1 ) )
1478 : {
1479 4922 : nbands = s_min( 10, hStereoDft->nbands_respred );
1480 4922 : move16();
1481 : /*Shift 2 last bands residual prediction gains for SWB/FB*/
1482 4922 : IF( EQ_16( hStereoDft->band_res[k_offset], STEREO_DFT_BAND_RES_HIGH ) )
1483 : {
1484 5290 : FOR( b = sub( hStereoDft->nbands_respred, 1 ); b >= nbands; b-- )
1485 : {
1486 3282 : hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] =
1487 3282 : hStereoDft->res_gains_ind_fx[1][b - STEREO_DFT_RES_PRED_BAND_MIN_RED + hStereoDft->res_pred_band_min + STEREO_DFT_BAND_MAX]; /* Q26 */
1488 3282 : move32();
1489 3282 : hStereoDft->res_gains_ind_fx[1][b - STEREO_DFT_RES_PRED_BAND_MIN_RED + hStereoDft->res_pred_band_min + STEREO_DFT_BAND_MAX] = 0; /* Q26 */
1490 3282 : move32();
1491 : }
1492 : }
1493 :
1494 : /* Get maximal index */
1495 26903 : FOR( b = hStereoDft->res_pred_band_min; b < nbands - STEREO_DFT_RES_PRED_BAND_MIN_CONST; b++ )
1496 : {
1497 21981 : IF( LT_32( max_res_pred_ind, hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] ) )
1498 : {
1499 8781 : max_res_pred_ind = hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX]; /* Q26 */
1500 8781 : move32();
1501 : }
1502 : }
1503 :
1504 : /* predictive values */
1505 19688 : FOR( ; b < nbands; b++ )
1506 : {
1507 14766 : assert( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] == 0 );
1508 14766 : hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = max_res_pred_ind; /* Q26 */
1509 14766 : move32();
1510 : }
1511 : }
1512 :
1513 35794 : FOR( b = hStereoDft->res_pred_band_min; b < hStereoDft->res_cod_band_max; b++ )
1514 : {
1515 : Word32 tmp;
1516 : Word16 tmps1, tmps2;
1517 :
1518 0 : hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; /* Q26 */
1519 0 : move32();
1520 : /*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);*/
1521 0 : tmps1 = (Word16) L_shr( hStereoDft->res_gains_ind_fx[0][b], Q26 ); /* Q0 */
1522 0 : move16();
1523 0 : tmps2 = (Word16) L_shr( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], Q26 ); /* Q0 */
1524 0 : move16();
1525 0 : stereo_dft_dequantize_res_gains_fx( &tmps1, &tmps2, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
1526 :
1527 0 : test();
1528 0 : test();
1529 0 : IF( hStereoDft->attackPresent )
1530 : {
1531 0 : hStereoDft->res_gains_ind_fx[1][b] = Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x6666 ); /* Q26 */
1532 0 : move32();
1533 : }
1534 0 : ELSE IF( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && ( LT_32( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], ONE_IN_Q27 ) ) ) ) /* Assuming Maximum Q of res_gains_ind_fx is Q26 */
1535 : {
1536 0 : hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x4CCD ),
1537 0 : hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], (Word16) 0x3333 ); /* Q26 */
1538 0 : move32();
1539 : }
1540 : ELSE
1541 : {
1542 0 : hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_s2_fx[b] ),
1543 0 : hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX],
1544 0 : sub( (Word16) 0x7FFF, dft_alpha_s2_fx[b] ) ); /* Q26 */
1545 0 : move32();
1546 : }
1547 :
1548 0 : stereo_dft_dequantize_res_gains_f_fx( &hStereoDft->res_gains_ind_fx[0][b], &hStereoDft->res_gains_ind_fx[1][b], &tmp, hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
1549 : }
1550 :
1551 : /* Smoothing of prediction gains between ftrames */
1552 294725 : FOR( ; b < hStereoDft->nbands; b++ )
1553 : {
1554 258931 : test();
1555 258931 : test();
1556 258931 : IF( hStereoDft->attackPresent )
1557 : {
1558 9264 : hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; /* Q26 */
1559 9264 : move32();
1560 9264 : hStereoDft->res_gains_ind_fx[1][b] = Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x6666 ); /* Q26 */
1561 9264 : move32();
1562 : }
1563 249667 : ELSE IF( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && LT_32( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], ONE_IN_Q27 ) ) )
1564 : {
1565 142505 : hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; /* Q26 */
1566 142505 : move32();
1567 142505 : IF( EQ_16( hStereoDft->hConfig->band_res, STEREO_DFT_BAND_RES_LOW ) )
1568 : {
1569 32061 : hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_w_b2_fx[b] ),
1570 32061 : hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], sub( (Word16) 0x7FFF, dft_alpha_w_b2_fx[b] ) ); /* Q26 */
1571 32061 : move32();
1572 : }
1573 : ELSE
1574 : {
1575 110444 : hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_w_fx[b] ),
1576 110444 : hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], sub( (Word16) 0x7FFF, dft_alpha_w_fx[b] ) ); /* Q26 */
1577 110444 : move32();
1578 : }
1579 : }
1580 : ELSE
1581 : {
1582 107162 : IF( EQ_16( hStereoDft->hConfig->band_res, STEREO_DFT_BAND_RES_LOW ) )
1583 : {
1584 30818 : hStereoDft->res_gains_ind_fx[0][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[0][b], dft_alpha_s_b2_fx[b] ),
1585 30818 : hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX],
1586 30818 : sub( (Word16) 0x7FFF, dft_alpha_s_b2_fx[b] ) ); /* Q26 */
1587 30818 : move32();
1588 30818 : hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_s2_b2_fx[b] ),
1589 30818 : hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX],
1590 30818 : sub( (Word16) 0x7FFF, dft_alpha_s2_b2_fx[b] ) ); /* Q26 */
1591 30818 : move32();
1592 : }
1593 : ELSE
1594 : {
1595 76344 : hStereoDft->res_gains_ind_fx[0][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[0][b], dft_alpha_s_fx[b] ),
1596 76344 : hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX],
1597 76344 : sub( (Word16) ( 0x7FFF ), dft_alpha_s_fx[b] ) ); /* Q26 */
1598 76344 : move32();
1599 76344 : hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_s2_fx[b] ),
1600 76344 : hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX],
1601 76344 : sub( (Word16) ( 0x7FFF ), dft_alpha_s2_fx[b] ) ); /* Q26 */
1602 76344 : move32();
1603 : }
1604 : }
1605 :
1606 258931 : IF( !hStereoDft->recovery_flg )
1607 : {
1608 258886 : stereo_dft_dequantize_res_gains_f_fx( &hStereoDft->res_gains_ind_fx[0][b], &hStereoDft->res_gains_ind_fx[1][b], hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
1609 : }
1610 : }
1611 :
1612 : /* Smoothing of IPDs*/
1613 35794 : pgIpd = hStereoDft->gipd_fx + ( add( k, k_offset ) );
1614 35794 : diff_ipd = L_sub( pgIpd[0], pgIpd[-hStereoDft->prm_res[k + k_offset]] ); /* Q27 */
1615 35794 : IF( LT_32( diff_ipd, -PI_round ) )
1616 : {
1617 727 : pgIpd[0] = L_add( pgIpd[0], EVS_2PI_FX_Q27 ); /* Q27 */
1618 727 : move32();
1619 : }
1620 35067 : ELSE IF( GT_32( diff_ipd, PI_round ) )
1621 : {
1622 238 : pgIpd[0] = L_sub( pgIpd[0], EVS_2PI_FX_Q27 ); /* Q27 */
1623 238 : move32();
1624 : }
1625 :
1626 35794 : IF( !hStereoDft->attackPresent )
1627 : {
1628 34509 : IF( hStereoDft->wasTransient )
1629 : {
1630 1251 : pgIpd[0] = L_add( Mpy_32_16_1( pgIpd[0], (Word16) 0x6666 ), Mpy_32_16_1( pgIpd[-hStereoDft->prm_res[k + k_offset]], (Word16) ( 0x199A ) ) ); /* Q27 */
1631 1251 : move32();
1632 : }
1633 : ELSE
1634 : {
1635 33258 : pgIpd[0] = L_add( L_shr( pgIpd[0], 1 ), L_shr( pgIpd[-hStereoDft->prm_res[k + k_offset]], 1 ) ); /* Q27 */
1636 33258 : move32();
1637 : }
1638 : }
1639 :
1640 :
1641 35794 : IF( !hStereoDft->attackPresent )
1642 : {
1643 34509 : pSideGain = hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); /* Q31 */
1644 116034 : FOR( b = 0; b < hStereoDft->res_cod_band_max; b++ )
1645 : {
1646 81525 : pSideGain[b] = Madd_32_16( Mpy_32_16_1( pSideGain[b], dft_res_cod_alpha_fx[b] ),
1647 81525 : pSideGain[b - hStereoDft->prm_res[k + k_offset] * STEREO_DFT_BAND_MAX],
1648 81525 : sub( (Word16) 0x7FFF, dft_res_cod_alpha_fx[b] ) ); /* Q31 */
1649 81525 : move32();
1650 : }
1651 : }
1652 :
1653 : /*Interpolation between DFT slots*/
1654 71588 : FOR( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ )
1655 : {
1656 35794 : pInterpol = hStereoDft->gipd_fx + sub( add( k, k_offset ), k2 ); /* Q27 */
1657 35794 : pIpd = hStereoDft->gipd_fx + add( k, k_offset ); /* Q27 */
1658 35794 : IF( hStereoDft->attackPresent )
1659 : {
1660 1285 : *( pInterpol ) = *( pIpd );
1661 1285 : move32();
1662 : }
1663 : ELSE
1664 : {
1665 34509 : *( pInterpol ) = *( hStereoDft->gipd_fx + sub( add( k, k_offset ), hStereoDft->prm_res[k + k_offset] ) );
1666 34509 : move32();
1667 : }
1668 :
1669 379085 : FOR( b = 0; b < hStereoDft->nbands; b++ )
1670 : {
1671 343291 : *( hStereoDft->res_pred_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->res_pred_gain_fx + add( i_mult( sub( add( k, k_offset ), hStereoDft->prm_res[k + k_offset] ), STEREO_DFT_BAND_MAX ), b ) ); /* Q31 */
1672 343291 : move32();
1673 343291 : test();
1674 343291 : test();
1675 343291 : test();
1676 343291 : test();
1677 343291 : IF( b < hStereoDft->res_cod_band_max || hStereoDft->attackPresent || hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && LT_32( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], ONE_IN_Q27 ) ) )
1678 : {
1679 236129 : *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ) ); /* Q31 */
1680 236129 : move32();
1681 : }
1682 : ELSE
1683 : {
1684 107162 : *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), hStereoDft->prm_res[k + k_offset] ), STEREO_DFT_BAND_MAX ), b ) ); /* Q31 */
1685 107162 : move32();
1686 : }
1687 : }
1688 :
1689 35794 : hStereoDft->itd_fx[k + k_offset - k2] = hStereoDft->itd_fx[k + k_offset]; /* Q15 */
1690 35794 : move32();
1691 : } /*end of interpolation*/
1692 : }
1693 :
1694 35794 : return;
1695 : }
1696 :
1697 : /*-------------------------------------------------------------------------
1698 : * stereo_dft_dec_res_fx()
1699 : *
1700 : * Decode the residual signal
1701 : *-------------------------------------------------------------------------*/
1702 :
1703 16830 : void stereo_dft_dec_res_fx(
1704 : CPE_DEC_HANDLE hCPE, /* i/o: decoder CPE handle */
1705 : Word32 res_buf[STEREO_DFT_N_8k], /* i : residual buffer q_res*/
1706 : Word16 q_res, /* i : q fact of residural buffer */
1707 : Word32 *output /* o : output Q16*/
1708 : )
1709 : {
1710 : Word16 i;
1711 : Word16 win[L_FRAME8k + STEREO_DFT_OVL_8k];
1712 : Word16 out_16[L_FRAME8k + STEREO_DFT_OVL_8k];
1713 : Word16 bpf_error_signal_8k_16[L_FRAME8k];
1714 : Word32 bpf_error_signal_8k[L_FRAME8k];
1715 : Word16 prev_bfi;
1716 : Word16 fac, step;
1717 : Word16 res_bpf_flag;
1718 :
1719 16830 : 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.
1720 : The prev_old_bfi still holds the prev_bfi for the current frame. */
1721 : /* Q0 */
1722 16830 : move16();
1723 :
1724 : /* flush memories when switching residual coding on */
1725 16830 : IF( EQ_16( hCPE->hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1], STEREO_DFT_RES_COD_OFF ) )
1726 : {
1727 133 : set32_fx( hCPE->hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k );
1728 133 : hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
1729 133 : move16();
1730 133 : set32_fx( hCPE->input_mem_fx[1], 0, NS2SA( 8000, STEREO_DFT32MS_OVL_NS ) );
1731 133 : set16_fx( hCPE->hStereoDft->hBpf->pst_old_syn_fx, 0, STEREO_DFT_NBPSF_PIT_MAX_8k );
1732 133 : hCPE->hStereoDft->hBpf->pst_mem_deemp_err_fx = 0;
1733 133 : move16();
1734 : }
1735 :
1736 : /*Inverse MDCT*/
1737 16830 : TCX_MDCT_Inverse( res_buf, q_res, win, STEREO_DFT_OVL_8k, L_FRAME8k - STEREO_DFT_OVL_8k, STEREO_DFT_OVL_8k, IVAS_CPE_DFT );
1738 :
1739 16830 : scale_sig( win, L_FRAME8k + STEREO_DFT_OVL_8k, -1 );
1740 :
1741 16830 : Word16 q_shift = sub( hCPE->hStereoDft->q_res_cod_mem_fx, Q15 );
1742 16830 : IF( !prev_bfi )
1743 : {
1744 : /*OLA*/
1745 : /*overlapping parts*/
1746 :
1747 1174766 : FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ )
1748 : {
1749 1158220 : win[i] = extract_h( L_add( hCPE->hStereoDft->res_cod_mem_fx[i], L_shl( L_mult( win[i], hCPE->hStereoDft->win_8k_fx[i] ), q_shift ) ) ); /* q_res_cod_mem_fx -17 (q_shift -1)*/
1750 1158220 : move16();
1751 1158220 : hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); /* -1 +15 +1 */
1752 1158220 : move32();
1753 : }
1754 :
1755 :
1756 16546 : move16();
1757 : }
1758 : ELSE
1759 : {
1760 : /* For first good frame, ola memory contains extended ECU buffer -- need to crossfade instead of OLA */
1761 284 : step = 468; /* 1 / STEREO_DFT_OVL_8k in Q15 */
1762 284 : move16();
1763 284 : fac = 0;
1764 284 : move16();
1765 20164 : FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ )
1766 : {
1767 19880 : win[i] = extract_h( Madd_32_16( Mpy_32_16_1( hCPE->hStereoDft->res_cod_mem_fx[i], sub( MAX_16, mult( fac, fac ) ) ),
1768 19880 : L_shl( L_mult( hCPE->hStereoDft->win_8k_fx[i], win[i] ), q_shift ),
1769 19880 : sub( MAX_16, mult( sub( MAX_16, fac ), sub( MAX_16, fac ) ) ) ) ); /* Q(q_shift -1) */
1770 19880 : move16();
1771 19880 : hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); /* Q15 */
1772 19880 : move32();
1773 19880 : fac = add( fac, step );
1774 : }
1775 : }
1776 :
1777 16830 : IF( q_shift != 0 )
1778 : {
1779 0 : v_shr_16( &win[STEREO_DFT_OVL_8k], negate( q_shift ), &win[STEREO_DFT_OVL_8k], L_FRAME8k );
1780 : }
1781 :
1782 16830 : hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
1783 :
1784 16830 : Copy( win, out_16, L_FRAME8k ); /* Q(q_shift -1 ) */
1785 :
1786 16830 : IF( hCPE->hCoreCoder[0]->core == ACELP_CORE )
1787 : {
1788 : /* bass post-filter */
1789 10899 : bass_psfilter_fx( hCPE->hStereoDft->hBpf, hCPE->hCoreCoder[0]->Opt_AMR_WB, out_16, L_FRAME8k, hCPE->hCoreCoder[0]->old_pitch_buf_16_fx + ( L_FRAME8k / STEREO_DFT_L_SUBFR_8k ), hCPE->hCoreCoder[0]->bpf_off,
1790 10899 : hCPE->hCoreCoder[0]->stab_fac_fx, &hCPE->hStereoDft->stab_fac_smooth_res_fx, hCPE->hCoreCoder[0]->last_coder_type, sub( q_shift, 1 ), bpf_error_signal_8k_16 );
1791 10899 : Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_8k_16, bpf_error_signal_8k, L_FRAME8k, Q15 ); /* Q15 */
1792 10899 : res_bpf_flag = res_bpf_adapt_ivas_fx( hCPE->hStereoDft, bpf_error_signal_8k, res_buf, q_res );
1793 :
1794 10899 : IF( prev_bfi )
1795 : {
1796 : /* Ramp up BPF contribution for the first good frame */
1797 173 : step = (Word16) ( 0x00CD ); // ( 1.0f / L_FRAME8k ); /* Q15 */
1798 173 : move16();
1799 173 : fac = negate( step );
1800 27853 : FOR( i = 0; i < L_FRAME8k; i++ )
1801 : {
1802 27680 : fac = add( fac, step );
1803 27680 : bpf_error_signal_8k[i] = Mpy_32_16_1( bpf_error_signal_8k[i], fac ); /* Q15 */
1804 27680 : move32();
1805 : }
1806 : }
1807 10899 : Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, sub( 15, sub( q_shift, 1 ) ) ); /* Q15 */
1808 10899 : IF( res_bpf_flag )
1809 : {
1810 10523 : v_sub_32( output, bpf_error_signal_8k, output, L_FRAME8k );
1811 : }
1812 : }
1813 5931 : ELSE IF( hCPE->hCoreCoder[0]->last_core == ACELP_CORE )
1814 : {
1815 0 : set16_fx( hCPE->hStereoDft->hBpf->pst_old_syn_fx, 0, STEREO_DFT_NBPSF_PIT_MAX_8k );
1816 0 : hCPE->hStereoDft->hBpf->pst_mem_deemp_err_fx = 0;
1817 0 : move16();
1818 0 : Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, sub( 15, sub( q_shift, 1 ) ) ); /* Q15 */
1819 : }
1820 : ELSE
1821 : {
1822 : /* This step is needed to ensure output is properly populated with scaled values in all cases*/
1823 5931 : Copy_Scale_sig_16_32_no_sat( out_16, output, L_FRAME8k, sub( 15, sub( q_shift, 1 ) ) ); /* Q15 */
1824 : }
1825 :
1826 16830 : return;
1827 : }
1828 :
1829 :
1830 : /*-------------------------------------------------------------------------
1831 : * stereo_dft_dec_fx()
1832 : *
1833 : * DFT-based stereo main processing function
1834 : *-------------------------------------------------------------------------*/
1835 :
1836 47491 : void stereo_dft_dec_fx(
1837 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */
1838 : Decoder_State *st0, /* i/o: decoder state structure */
1839 : Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers qDFT*/
1840 : Word32 *input_mem, /* i/o: mem of buffer DFT analysis */
1841 : STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure Q0*/
1842 : const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC Q0*/
1843 : const Word16 sba_mono_flag, /* i : signal mono output for SBA DirAC Q0*/
1844 : ivas_spar_md_dec_state_t *hMdDec, /* i : SPAR MD handle for upmixing */
1845 : const Word16 cross_fade_start_offset, /* i : SPAR mixer delay compensation Q0*/
1846 : const Word32 output_Fs, /* i : Fs for delay calculation Q0*/
1847 : const Word16 nchan_transport, /* i : number of transpor channels Q0*/
1848 : const Word16 num_md_sub_frames /* i : number of MD subframes Q0*/
1849 : )
1850 : {
1851 : Word16 i, k, b, N_div, stop;
1852 : Word32 DFT_L[STEREO_DFT32MS_N_MAX];
1853 : Word32 DFT_R[STEREO_DFT32MS_N_MAX];
1854 : Word32 DFT_PRED_RES[STEREO_DFT32MS_N_32k];
1855 : Word32 *pDFT_DMX;
1856 : Word32 *pDFT_DMX1;
1857 : Word32 *pDFT_RES;
1858 : Word16 g;
1859 : Word32 tmp;
1860 : Word32 *pPredGain;
1861 : Word32 *pSideGain;
1862 : Word16 c0, s0;
1863 : Word16 k_offset;
1864 : Word32 *pgIpd;
1865 : Word16 NFFT_inner;
1866 : Word16 gamma;
1867 : Word16 samp_ratio;
1868 : Word16 prev_bfi;
1869 : Word32 dmx_nrg;
1870 : Word16 idx_k0, idx_k1;
1871 : Word16 output_frame;
1872 : Word16 plocs[STEREO_DFT_RES_N_PEAKS_MAX];
1873 : Word16 num_plocs;
1874 : Word32 plocsi[STEREO_DFT_RES_N_PEAKS_MAX];
1875 : Word16 ftmp, coh;
1876 : Word32 N1, N2;
1877 : Word32 scale_fact0, scale_fact;
1878 : Word32 lev1, lev2, cna_level, *ptr_per;
1879 : Word16 q_cna_level;
1880 47491 : HANDLE_FD_CNG_DEC hFdCngDec = st0->hFdCngDec;
1881 47491 : HANDLE_FD_CNG_COM hFdCngCom = hFdCngDec->hFdCngCom;
1882 47491 : Word16 *cna_seed = &( hFdCngCom->seed );
1883 : Word32 DFT_W, DFT_Y;
1884 : Word16 len;
1885 :
1886 47491 : output_frame = (Word16) Mpy_32_32( L_add( st0->output_Fs, FRAMES_PER_SEC_BY_2 ), ONE_BY_FRAMES_PER_SEC_Q31 ); /* Q0 */
1887 :
1888 : /*------------------------------------------------------------------*
1889 : * Initialization
1890 : *-----------------------------------------------------------------*/
1891 :
1892 47491 : samp_ratio = divide3232( st0->sr_core, st0->output_Fs ); // Q15
1893 :
1894 :
1895 47491 : stop = shr( STEREO_DFT32MS_N_32k, 1 );
1896 :
1897 : /* Analyze nature of current frame */
1898 47491 : test();
1899 47491 : test();
1900 47491 : test();
1901 47491 : test();
1902 47491 : test();
1903 47491 : test();
1904 47491 : test();
1905 47491 : test();
1906 86457 : hStereoDft->trans = (Word16) ( ( EQ_16( st0->clas_dec, ONSET ) || EQ_16( st0->clas_dec, SIN_ONSET ) || EQ_16( st0->clas_dec, UNVOICED_CLAS ) || EQ_16( st0->clas_dec, UNVOICED_TRANSITION ) ) || LE_16( st0->stab_fac_fx, (Word16) 0x2000 ) ) ||
1907 38966 : ( ( EQ_16( st0->core, TCX_20_CORE ) && ( EQ_16( st0->hTcxCfg->tcx_last_overlap_mode, MIN_OVERLAP ) || EQ_16( st0->hTcxCfg->tcx_last_overlap_mode, HALF_OVERLAP ) ) ) || EQ_16( st0->core, TCX_10_CORE ) ); /* Q0 */
1908 47491 : move16();
1909 :
1910 : /* Initialization */
1911 47491 : k_offset = 1;
1912 47491 : move16();
1913 47491 : N_div = STEREO_DFT_NBDIV;
1914 47491 : move16();
1915 47491 : prev_bfi = st0->prev_old_bfi; /* The core decoding is already completed here and the prev_bfi has been updated for the next frame.
1916 : The prev_old_bfi still holds the prev_bfi for the current frame. */
1917 : /* make sure number of bands corresponds to output bwidth in case it is lower than parameter bwidth */
1918 47491 : move16();
1919 47491 : test();
1920 47491 : IF( LT_16( output_frame, inner_frame_tbl[st0->bwidth] ) && ( sba_dirac_stereo_flag == 0 ) )
1921 : {
1922 6785 : hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); /* Q0 */
1923 : }
1924 :
1925 47491 : IF( st0->bfi == 0 )
1926 : {
1927 : /* Smoothing for the current frame */
1928 46908 : IF( sba_dirac_stereo_flag )
1929 : {
1930 10753 : ivas_sba_dirac_stereo_smooth_parameters_fx( hStereoDft, hMdDec, cross_fade_start_offset, output_Fs, num_md_sub_frames );
1931 : }
1932 : ELSE
1933 : {
1934 36155 : stereo_dft_dec_smooth_parameters_fx( hStereoDft, hStereoCng->prev_sid_nodata, hStereoCng->active_frame_counter, st0->element_brate );
1935 : }
1936 : }
1937 :
1938 47491 : dmx_nrg = 0;
1939 47491 : move32();
1940 47491 : IF( prev_bfi )
1941 : {
1942 577 : dmx_nrg = stereo_dft_dmx_swb_nrg_fx( DFT[0], DFT[0] + STEREO_DFT32MS_N_MAX, s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), 0, 0 ); /* Q0 */
1943 : }
1944 :
1945 142473 : FOR( k = 0; k < N_div; k++ )
1946 : {
1947 94982 : pDFT_DMX = DFT[0] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* qDFT */
1948 94982 : pDFT_RES = DFT[1] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* qDFT */
1949 94982 : pDFT_DMX1 = 0;
1950 94982 : move16();
1951 :
1952 94982 : IF( GT_16( nchan_transport, 1 ) )
1953 : {
1954 12558 : pDFT_DMX1 = DFT[1] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* qDFT */
1955 : }
1956 :
1957 : /*Apply Stereo*/
1958 94982 : IF( hStereoDft->hConfig->dmx_active )
1959 : {
1960 94982 : g = MAX_16;
1961 94982 : move16();
1962 94982 : c0 = MAX_16;
1963 94982 : move16();
1964 94982 : s0 = 0;
1965 94982 : move16();
1966 :
1967 : /* since delay is just 3.125ms, the parameters received are used for the second window */
1968 94982 : pSideGain = hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); /* Q31 */
1969 94982 : pgIpd = hStereoDft->gipd_fx + add( k, k_offset ); /* Q27 */
1970 94982 : pPredGain = hStereoDft->res_pred_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); /* Q31 */
1971 :
1972 : /* Use coarse band partition in inactive frames */
1973 94982 : test();
1974 94982 : IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
1975 : {
1976 10940 : NFFT_inner = i_mult( ( STEREO_DFT32MS_N_MAX / L_FRAME48k ), inner_frame_tbl[st0->bwidth] ); /* Q0 */
1977 10940 : hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, 2, NFFT_inner, DEC );
1978 : }
1979 :
1980 :
1981 94982 : IF( st0->bfi )
1982 : {
1983 1166 : hStereoDft->past_DMX_pos = ( sub( add( hStereoDft->past_DMX_pos, STEREO_DFT_PAST_MAX ), 1 ) ) % STEREO_DFT_PAST_MAX; /* Q0 */
1984 : }
1985 :
1986 94982 : test();
1987 94982 : IF( !( sba_dirac_stereo_flag && GE_16( nchan_transport, 2 ) ) )
1988 : {
1989 82424 : stereo_dft_generate_res_pred_fx( hStereoDft, samp_ratio, pDFT_DMX, DFT_PRED_RES, pPredGain, k, DFT[1] + i_mult( k, STEREO_DFT32MS_N_MAX ), &stop, st0->bfi );
1990 : }
1991 :
1992 94982 : IF( hStereoDft->res_cod_band_max > 0 )
1993 : {
1994 23908 : IF( !st0->bfi )
1995 : {
1996 23242 : IF( EQ_16( k, 1 ) )
1997 : {
1998 11621 : Copy32( pDFT_RES, hStereoDft->res_mem_fx, shl( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ) ); /* qDFT */
1999 11621 : hStereoDft->time_offs = 0;
2000 11621 : move16();
2001 : }
2002 : }
2003 : ELSE
2004 : {
2005 666 : stereo_dft_res_ecu_fx( hStereoDft, pDFT_RES, DFT_PRED_RES, k, output_frame, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem );
2006 : }
2007 : }
2008 :
2009 : /* Apply active DMX */
2010 : /* pDFT_RES is used for the second channel in inactive frames */
2011 94982 : test();
2012 94982 : IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
2013 : {
2014 10940 : DFT_L[0] = pDFT_DMX[0]; /* qDFT */
2015 10940 : move32();
2016 10940 : DFT_R[0] = pDFT_RES[0]; /* qDFT */
2017 10940 : move32();
2018 : }
2019 : ELSE
2020 : {
2021 84042 : DFT_L[0] = pDFT_DMX[0]; /* qDFT */
2022 84042 : move32();
2023 84042 : DFT_R[0] = pDFT_DMX[0]; /* qDFT */
2024 84042 : move32();
2025 : }
2026 :
2027 94982 : test();
2028 94982 : if ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) )
2029 : {
2030 24302 : hFdCngDec->cna_nbands = 0;
2031 24302 : move16();
2032 : }
2033 :
2034 970736 : FOR( b = 0; b < hStereoDft->nbands; b++ )
2035 : {
2036 875754 : g = extract_h( pSideGain[b] );
2037 875754 : move16();
2038 875754 : test();
2039 875754 : IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
2040 : {
2041 63932 : g = hStereoDft->g_state_fx[b]; /* Q15 */
2042 63932 : move16();
2043 : }
2044 :
2045 : /* store side gains from inactive frames for later use by the stereo CNA */
2046 875754 : test();
2047 875754 : test();
2048 875754 : IF( LT_16( hStereoDft->band_limits[b], L_FRAME16k ) && ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) ) )
2049 : {
2050 206112 : hFdCngDec->cna_nbands = add( b, 1 ); /* Q0 */
2051 206112 : move16();
2052 206112 : hFdCngDec->cna_band_limits[b] = hStereoDft->band_limits[b]; /* Q0 */
2053 206112 : move16();
2054 206112 : hFdCngDec->cna_g_state_fx[b] = g; /* Q15 */
2055 206112 : move16();
2056 : }
2057 :
2058 : /* No residual coding in inactive frames, instead pDFT_RES is used for the second channel */
2059 875754 : test();
2060 875754 : test();
2061 875754 : IF( GE_16( b, hStereoDft->res_cod_band_max ) && !hStereoDft->frame_sid_nodata && !( sba_dirac_stereo_flag && hMdDec ) )
2062 : {
2063 : /*filter non-coded frequencies. It removes some MDCT frequency aliasing*/
2064 19058980 : FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
2065 : {
2066 18585338 : pDFT_RES[2 * i] = 0;
2067 18585338 : move32();
2068 18585338 : pDFT_RES[2 * i + 1] = 0;
2069 18585338 : move32();
2070 : }
2071 : }
2072 :
2073 875754 : test();
2074 875754 : test();
2075 875754 : IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
2076 : {
2077 : /* Low pass filter coherence */
2078 : /* store coherence from inactive frames for later use by the stereo CNA */
2079 63932 : hFdCngDec->cna_cm_fx[b] = hStereoCng->cm_fx[b]; /* Q15 */
2080 63932 : move16();
2081 :
2082 : /* Calculate gamma */
2083 63932 : IF( LT_16( hStereoCng->cm_fx[b], (Word16) 0x7333 ) )
2084 : {
2085 : Word32 op1, op2, l_gamma;
2086 : Word16 q_loc1, q_loc2;
2087 63932 : gamma = hStereoCng->cm_fx[b];
2088 63932 : move16();
2089 63932 : gamma = BASOP_Util_Divide3232_Scale( gamma, sub( MAX_16, gamma ), &q_loc1 ); /* q_loc1 */
2090 63932 : l_gamma = L_deposit_l( gamma );
2091 63932 : op1 = L_add( l_gamma, L_shr( L_deposit_l( sub( MAX_16, mult( g, g ) ) ), q_loc1 ) ); /* q_loc1 */
2092 63932 : q_loc1 = add( Q16, q_loc1 );
2093 63932 : q_loc2 = q_loc1;
2094 63932 : op1 = Sqrt32( op1, &q_loc1 );
2095 63932 : op2 = Sqrt32( l_gamma, &q_loc2 );
2096 63932 : IF( NE_16( q_loc1, q_loc2 ) )
2097 : {
2098 51312 : op2 = L_shl( op2, sub( q_loc2, q_loc1 ) );
2099 51312 : q_loc2 = q_loc1;
2100 : }
2101 63932 : gamma = extract_h( L_sub( op1, op2 ) ); /* q_loc1 - 16 */
2102 63932 : gamma = shl( gamma, q_loc2 ); /* 2 * q_loc1 - 16 */
2103 : }
2104 : ELSE
2105 : {
2106 0 : gamma = 0;
2107 0 : move16();
2108 : }
2109 :
2110 3280512 : FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
2111 : {
2112 : /* Create L and R signals with the correct coherence by mixing channel 0 (pDFT_DMX) and channel 1 (pDFT_RES) */
2113 3216580 : DFT_L[2 * i] = Madd_32_16( Madd_32_16( pDFT_DMX[2 * i], pDFT_DMX[2 * i], g ), pDFT_RES[2 * i], gamma ); /* qDFT */
2114 3216580 : move32();
2115 3216580 : DFT_R[2 * i] = Msub_32_16( Msub_32_16( pDFT_DMX[2 * i], pDFT_DMX[2 * i], g ), pDFT_RES[2 * i], gamma ); /* qDFT */
2116 3216580 : move32();
2117 :
2118 3216580 : DFT_L[2 * i + 1] = Madd_32_16( Madd_32_16( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1], g ), pDFT_RES[2 * i + 1], gamma ); /* qDFt */
2119 3216580 : move32();
2120 3216580 : DFT_R[2 * i + 1] = Msub_32_16( Msub_32_16( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1], g ), pDFT_RES[2 * i + 1], gamma ); /* qDFT */
2121 3216580 : move32();
2122 : }
2123 :
2124 63932 : IF( pgIpd[0] != 0 )
2125 : {
2126 43302 : Word32 theta = pgIpd[0];
2127 43806 : WHILE( GT_32( theta, EVS_2PI_FX_Q27 ) )
2128 : {
2129 504 : theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */
2130 : }
2131 43302 : WHILE( LT_32( theta, -EVS_2PI_FX_Q27 ) )
2132 : {
2133 0 : theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */
2134 : }
2135 43302 : IF( GT_32( theta, EVS_PI_FX_Q27 ) )
2136 : {
2137 1946 : theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */
2138 : }
2139 41356 : ELSE IF( LT_32( theta, -EVS_PI_FX_Q27 ) )
2140 : {
2141 0 : theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */
2142 : }
2143 43302 : c0 = getCosWord16( (Word16) L_shr( theta, 14 ) );
2144 43302 : IF( EQ_16( c0, ONE_IN_Q14 ) )
2145 : {
2146 28212 : c0 = MAX_16;
2147 28212 : move16();
2148 : }
2149 : ELSE
2150 : {
2151 15090 : c0 = shl( c0, 1 );
2152 : }
2153 43302 : s0 = getSinWord16( (Word16) L_shr( theta, 14 ) );
2154 2166686 : FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
2155 : {
2156 : /*rotate L*/
2157 2123384 : tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[2 * i + 1], s0 ); /* qDFT */
2158 2123384 : DFT_L[2 * i + 1] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[2 * i + 1], c0 ); /* qDFT */
2159 2123384 : move32();
2160 2123384 : DFT_L[2 * i] = tmp; /* qDFT */
2161 2123384 : move32();
2162 : }
2163 : }
2164 : }
2165 811822 : ELSE IF( sba_dirac_stereo_flag && hMdDec )
2166 : {
2167 :
2168 218640 : IF( EQ_16( nchan_transport, 1 ) )
2169 : {
2170 75222 : IF( sba_mono_flag )
2171 : {
2172 14640 : IF( b == 0 )
2173 : {
2174 1220 : i = 0;
2175 1220 : move16();
2176 1220 : DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
2177 1220 : move32();
2178 1220 : DFT_L[2 * i] = DFT_W; /* qDFT */
2179 1220 : move32();
2180 1220 : DFT_R[2 * i] = 0;
2181 1220 : move32();
2182 1220 : DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
2183 1220 : move32();
2184 1220 : DFT_L[2 * i + 1] = DFT_W; /* qDFT */
2185 1220 : move32();
2186 1220 : DFT_R[2 * i + 1] = 0;
2187 1220 : move32();
2188 : }
2189 323564 : FOR( i = hStereoDft->band_limits[b]; i < s_min( stop, hStereoDft->band_limits[b + 1] ); i++ )
2190 : {
2191 308924 : DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ),
2192 308924 : L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS],
2193 308924 : L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS],
2194 308924 : hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
2195 308924 : DFT_PRED_RES[2 * i] ); /* qDFT */
2196 308924 : DFT_L[2 * i] = DFT_W; /* qDFT */
2197 308924 : move32();
2198 308924 : DFT_R[2 * i] = 0;
2199 308924 : move32();
2200 :
2201 308924 : DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ),
2202 308924 : L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS],
2203 308924 : L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS],
2204 308924 : hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
2205 308924 : DFT_PRED_RES[2 * i + 1] ); /* qDFT */
2206 308924 : DFT_L[2 * i + 1] = DFT_W; /* qDFT */
2207 308924 : move32();
2208 308924 : DFT_R[2 * i + 1] = 0;
2209 308924 : move32();
2210 : }
2211 290096 : FOR( ; i < hStereoDft->band_limits[b + 1]; i++ )
2212 : {
2213 275456 : DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
2214 275456 : DFT_L[2 * i] = DFT_W; /* qDFT */
2215 275456 : move32();
2216 275456 : DFT_R[2 * i] = 0;
2217 275456 : move32();
2218 :
2219 275456 : DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
2220 275456 : DFT_L[2 * i + 1] = DFT_W; /* qDFT */
2221 275456 : move32();
2222 275456 : DFT_R[2 * i + 1] = 0;
2223 275456 : move32();
2224 : }
2225 : }
2226 : ELSE
2227 : {
2228 60582 : IF( b == 0 )
2229 : {
2230 5442 : i = 0;
2231 5442 : move16();
2232 5442 : DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
2233 5442 : DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
2234 :
2235 5442 : DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */
2236 5442 : move32();
2237 5442 : DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */
2238 5442 : move32();
2239 :
2240 5442 : DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
2241 5442 : DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
2242 :
2243 5442 : DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */
2244 5442 : move32();
2245 5442 : DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */
2246 5442 : move32();
2247 : }
2248 60582 : len = s_min( stop, hStereoDft->band_limits[b + 1] );
2249 1276260 : FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
2250 : {
2251 1215678 : DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ),
2252 1215678 : L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS],
2253 1215678 : L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS],
2254 1215678 : hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
2255 1215678 : DFT_PRED_RES[2 * i] ); /* qDFT */
2256 1215678 : DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ),
2257 1215678 : L_add( hStereoDft->mixer_mat_smooth_fx[1][1][b + k * IVAS_MAX_NUM_BANDS],
2258 1215678 : L_add( hStereoDft->mixer_mat_smooth_fx[1][2][b + k * IVAS_MAX_NUM_BANDS],
2259 1215678 : hStereoDft->mixer_mat_smooth_fx[1][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
2260 1215678 : DFT_PRED_RES[2 * i] ); /* qDFT */
2261 :
2262 1215678 : DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */
2263 1215678 : move32();
2264 1215678 : DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */
2265 1215678 : move32();
2266 :
2267 1215678 : DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ),
2268 1215678 : L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS],
2269 1215678 : L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS],
2270 1215678 : hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
2271 1215678 : DFT_PRED_RES[2 * i + 1] ); /* qDFT */
2272 1215678 : DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ),
2273 1215678 : L_add( hStereoDft->mixer_mat_smooth_fx[1][1][b + k * IVAS_MAX_NUM_BANDS],
2274 1215678 : L_add( hStereoDft->mixer_mat_smooth_fx[1][2][b + k * IVAS_MAX_NUM_BANDS],
2275 1215678 : hStereoDft->mixer_mat_smooth_fx[1][3][b + k * IVAS_MAX_NUM_BANDS] ) ),
2276 1215678 : DFT_PRED_RES[2 * i + 1] ); /* qDFT */
2277 :
2278 1215678 : DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */
2279 1215678 : move32();
2280 1215678 : DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */
2281 1215678 : move32();
2282 : }
2283 696102 : FOR( ; i < hStereoDft->band_limits[b + 1]; i++ )
2284 : {
2285 635520 : DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
2286 635520 : DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
2287 :
2288 635520 : DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */
2289 635520 : move32();
2290 635520 : DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */
2291 635520 : move32();
2292 :
2293 635520 : DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
2294 635520 : DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
2295 :
2296 635520 : DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */
2297 635520 : move32();
2298 635520 : DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */
2299 635520 : move32();
2300 : }
2301 : }
2302 : }
2303 143418 : ELSE IF( GE_16( nchan_transport, 2 ) )
2304 : {
2305 143418 : IF( b == 0 )
2306 : {
2307 12558 : i = 0;
2308 12558 : move32();
2309 :
2310 12558 : DFT_W = pDFT_DMX[2 * i]; /* qDFT */
2311 12558 : move32();
2312 12558 : DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
2313 :
2314 12558 : DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */
2315 12558 : move32();
2316 12558 : DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */
2317 12558 : move32();
2318 :
2319 12558 : DFT_W = pDFT_DMX[2 * i + 1]; /* qDFT */
2320 12558 : move32();
2321 12558 : DFT_Y = Madd_32_32( pDFT_DMX1[2 * i + 1], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
2322 :
2323 12558 : DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */
2324 12558 : move32();
2325 12558 : DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */
2326 12558 : move32();
2327 : }
2328 4994220 : FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
2329 : {
2330 4850802 : DFT_W = pDFT_DMX[2 * i]; /* qDFT */
2331 4850802 : move32();
2332 4850802 : DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */
2333 :
2334 4850802 : DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */
2335 4850802 : move32();
2336 4850802 : DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */
2337 4850802 : move32();
2338 :
2339 4850802 : DFT_W = pDFT_DMX[2 * i + 1]; /* qDFT */
2340 4850802 : move32();
2341 4850802 : DFT_Y = Madd_32_32( pDFT_DMX1[2 * i + 1], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */
2342 :
2343 4850802 : DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */
2344 4850802 : move32();
2345 4850802 : DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */
2346 4850802 : move32();
2347 : }
2348 : }
2349 : ELSE
2350 : {
2351 : assert( "nhcan_transport must be 1 or 1!" );
2352 : }
2353 : }
2354 : ELSE
2355 : {
2356 593182 : len = s_min( stop, hStereoDft->band_limits[b + 1] );
2357 12776424 : FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
2358 : {
2359 12183242 : tmp = L_add( Madd_32_16( pDFT_RES[2 * i], pDFT_DMX[2 * i], g ), DFT_PRED_RES[2 * i] ); /* qDFT */
2360 :
2361 12183242 : DFT_L[2 * i] = L_add( pDFT_DMX[2 * i], tmp ); /* qDFT */
2362 12183242 : move32();
2363 12183242 : DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp ); /* qDFT */
2364 12183242 : move32();
2365 :
2366 12183242 : tmp = L_add( Madd_32_16( pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g ), DFT_PRED_RES[2 * i + 1] ); /* qDFT */
2367 :
2368 12183242 : DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */
2369 12183242 : move32();
2370 12183242 : DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */
2371 12183242 : move32();
2372 : }
2373 :
2374 7473438 : FOR( ; i < hStereoDft->band_limits[b + 1]; i++ )
2375 : {
2376 6880256 : tmp = Madd_32_16( pDFT_RES[2 * i], pDFT_DMX[2 * i], g ); /* qDFT */
2377 :
2378 6880256 : DFT_L[2 * i] = L_add( pDFT_DMX[2 * i], tmp ); /* qDFT */
2379 6880256 : move32();
2380 6880256 : DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp ); /* qDFT */
2381 6880256 : move32();
2382 :
2383 6880256 : tmp = Madd_32_16( pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g ); /* qDFT */
2384 :
2385 6880256 : DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */
2386 6880256 : move32();
2387 6880256 : DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */
2388 6880256 : move32();
2389 : }
2390 :
2391 : /* Active Upmix */
2392 593182 : IF( pgIpd[0] != 0 )
2393 : {
2394 94572 : Word32 theta = pgIpd[0];
2395 94572 : move32();
2396 96420 : WHILE( GT_32( theta, EVS_2PI_FX_Q27 ) )
2397 : {
2398 1848 : theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */
2399 : }
2400 97632 : WHILE( LT_32( theta, -EVS_2PI_FX_Q27 ) )
2401 : {
2402 3060 : theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */
2403 : }
2404 94572 : IF( GT_32( theta, EVS_PI_FX_Q27 ) )
2405 : {
2406 5151 : theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */
2407 : }
2408 89421 : ELSE IF( LT_32( theta, -EVS_PI_FX_Q27 ) )
2409 : {
2410 2688 : theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */
2411 : }
2412 94572 : c0 = getCosWord16( (Word16) L_shr( theta, 14 ) );
2413 94572 : IF( EQ_16( c0, ONE_IN_Q14 ) )
2414 : {
2415 41162 : c0 = MAX_16;
2416 41162 : move16();
2417 : }
2418 : ELSE
2419 : {
2420 53410 : c0 = shl( c0, 1 );
2421 : }
2422 94572 : s0 = getSinWord16( (Word16) L_shr( theta, 14 ) );
2423 2906225 : FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
2424 : {
2425 : /*rotate L*/
2426 2811653 : tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[2 * i + 1], s0 ); /* qDFT */
2427 2811653 : DFT_L[2 * i + 1] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[2 * i + 1], c0 ); /* qDFT */
2428 2811653 : move32();
2429 2811653 : DFT_L[2 * i] = tmp; /* qDFT */
2430 2811653 : move32();
2431 : }
2432 : }
2433 : }
2434 : }
2435 :
2436 94982 : test();
2437 94982 : if ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) )
2438 : {
2439 24302 : hFdCngDec->cna_band_limits[hFdCngDec->cna_nbands] = hStereoDft->band_limits[hFdCngDec->cna_nbands]; /* Q0 */
2440 24302 : move16();
2441 : }
2442 :
2443 94982 : test();
2444 94982 : IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag )
2445 : {
2446 10940 : hStereoCng->first_SID = 0;
2447 10940 : move16();
2448 10940 : hStereoCng->first_SID_after_TD = 0;
2449 10940 : move16();
2450 : }
2451 :
2452 2914822 : FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->NFFT / 2; i++ )
2453 : {
2454 2819840 : DFT_L[2 * i] = 0;
2455 2819840 : move32();
2456 2819840 : DFT_L[2 * i + 1] = 0;
2457 2819840 : move32();
2458 2819840 : DFT_R[2 * i] = 0;
2459 2819840 : move32();
2460 2819840 : DFT_R[2 * i + 1] = 0;
2461 2819840 : move32();
2462 : }
2463 :
2464 : /*Nyquist Freq.*/
2465 94982 : IF( EQ_16( hStereoDft->band_limits[b], shr( hStereoDft->NFFT, 1 ) ) )
2466 : {
2467 76084 : DFT_L[1] = Madd_32_16( pDFT_DMX[1], pDFT_DMX[1], g ); /* qDFT */
2468 76084 : move32();
2469 76084 : DFT_R[1] = Msub_32_16( pDFT_DMX[1], pDFT_DMX[1], g ); /* qDFT */
2470 76084 : move32();
2471 76084 : DFT_L[1] = Mpy_32_16_1( DFT_L[1], INV_SQRT2_FX_Q15 ); /* qDFT */
2472 76084 : move32();
2473 76084 : DFT_R[1] = Mpy_32_16_1( DFT_R[1], INV_SQRT2_FX_Q15 ); /* qDFT */
2474 76084 : move32();
2475 : }
2476 : ELSE
2477 : {
2478 18898 : DFT_L[1] = 0;
2479 18898 : move32();
2480 18898 : DFT_R[1] = 0;
2481 18898 : move32();
2482 : }
2483 : }
2484 : ELSE
2485 : {
2486 0 : pPredGain = NULL; /* to avoid compilation warnings */
2487 0 : pSideGain = NULL;
2488 :
2489 : /* Dummy upmix-> mono binauralization */
2490 0 : FOR( i = 0; i < hStereoDft->NFFT; i++ )
2491 : {
2492 0 : DFT_L[i] = L_add( pDFT_DMX[i], pDFT_RES[i] ); /* qDFT */
2493 0 : move32();
2494 0 : DFT_R[i] = L_sub( pDFT_DMX[i], pDFT_RES[i] ); /* qDFT */
2495 0 : move32();
2496 : }
2497 : }
2498 :
2499 : /* Comfort Noise Addition */
2500 94982 : IF( st0->flag_cna )
2501 : {
2502 78792 : ptr_per = &hFdCngDec->smoothed_psd_fx[hFdCngCom->startBand]; /* hFdCngDec->smoothed_psd_exp */
2503 :
2504 78792 : scale_fact0 = 0;
2505 78792 : move16();
2506 78792 : IF( hFdCngDec->cna_rescale_fact_fx > 0 )
2507 : {
2508 30856 : Word16 q_scale_fact0 = 0;
2509 30856 : move16();
2510 30856 : Word16 op = Sqrt16( shr( hFdCngDec->cna_rescale_fact_fx, 1 ), &q_scale_fact0 );
2511 30856 : move16();
2512 30856 : scale_fact0 = L_mult0( shr( output_frame, 1 ), op );
2513 30856 : IF( q_scale_fact0 > 0 )
2514 : {
2515 0 : assert( 0 );
2516 : }
2517 : ELSE
2518 : {
2519 30856 : scale_fact0 = L_shl( scale_fact0, q_scale_fact0 );
2520 30856 : move32();
2521 : }
2522 : }
2523 :
2524 588380 : FOR( b = 0; b < hFdCngDec->cna_nbands; b++ )
2525 : {
2526 : /* calculate gamma factor reflecting inter-channel correlation and side gain (ILD) */
2527 509588 : coh = hFdCngDec->cna_cm_fx[b];
2528 509588 : move16();
2529 509588 : g = hFdCngDec->cna_g_state_fx[b];
2530 509588 : move16();
2531 509588 : IF( LT_16( coh, (Word16) ( 0x7333 ) ) )
2532 : {
2533 : Word32 op1, op2, l_gamma;
2534 : Word16 q_loc1, q_loc2, q_gamma;
2535 488472 : gamma = coh;
2536 488472 : move16();
2537 488472 : gamma = BASOP_Util_Divide3232_Scale( gamma, sub( (Word16) 0x7FFF, gamma ), &q_gamma );
2538 488472 : if ( gamma == 0 )
2539 : {
2540 247076 : q_gamma = 0;
2541 247076 : move16();
2542 : }
2543 488472 : l_gamma = L_deposit_l( gamma );
2544 488472 : op1 = L_add( l_gamma, L_shr( L_deposit_l( sub( MAX_16, mult_sat( g, g ) ) ), q_gamma ) ); /*The mult_sat function is needed because -0.999979973 is being mapped to -32768. This value, when multiplied by -32768, is causing a crash.*/
2545 488472 : q_loc2 = add( Q16, q_gamma );
2546 488472 : q_loc1 = q_loc2;
2547 488472 : move16();
2548 488472 : op1 = Sqrt32( op1, &q_loc1 );
2549 488472 : op2 = Sqrt32( l_gamma, &q_loc2 );
2550 488472 : IF( op2 != 0 )
2551 : {
2552 241396 : IF( NE_16( q_loc1, q_loc2 ) )
2553 : {
2554 134667 : op2 = L_shl( op2, sub( q_loc2, q_loc1 ) ); /* qloc2 */
2555 134667 : q_loc2 = q_loc1;
2556 134667 : move16();
2557 : }
2558 241396 : gamma = extract_h( L_sub( op1, op2 ) ); /* qloc2 - 16 */
2559 241396 : gamma = shl( gamma, q_loc2 ); /* 2 * qloc2 - 16 */
2560 : }
2561 : ELSE
2562 : {
2563 247076 : gamma = extract_h( L_shl( op1, q_loc1 ) ); /* 2 * qloc2 - 16 */
2564 : }
2565 : }
2566 : ELSE
2567 : {
2568 21116 : gamma = 0;
2569 21116 : move16();
2570 : }
2571 509588 : len = s_min( hFdCngDec->cna_band_limits[b + 1], ( L_FRAME16k ) >> 1 );
2572 13037516 : FOR( i = s_max( hFdCngDec->cna_band_limits[b], ( hFdCngCom->startBand >> 1 ) ); i < len; i++ ) // i < min( hFdCngDec->cna_band_limits[b + 1], ( L_FRAME16k ) >> 1 );
2573 : {
2574 : Word32 l_tmp;
2575 12527928 : lev1 = *ptr_per++;
2576 12527928 : move32();
2577 12527928 : lev2 = *ptr_per++;
2578 12527928 : move32();
2579 :
2580 12527928 : test();
2581 12527928 : test();
2582 12527928 : IF( ( lev1 > 0 ) && ( lev2 > 0 ) && GT_32( Mpy_32_16_1( L_max( lev1, lev2 ), (Word16) 0x6AAB ), L_min( lev1, lev2 ) ) )
2583 : {
2584 : /* take the minimum of two adjacent frequency bins */
2585 395066 : cna_level = L_min( lev1, lev2 ); /* hFdCngDec->smoothed_psd_exp */
2586 : }
2587 : ELSE
2588 : {
2589 : /* take the average of two adjacent frequency bins */
2590 12132862 : cna_level = L_add( L_shr( lev1, 1 ), L_shr( lev2, 1 ) ); /* hFdCngDec->smoothed_psd_exp */
2591 : }
2592 12527928 : q_cna_level = hFdCngDec->smoothed_psd_exp;
2593 12527928 : move16();
2594 12527928 : l_tmp = Sqrt32( cna_level, &q_cna_level );
2595 12527928 : scale_fact = Mpy_32_32( l_tmp, scale_fact0 ); /* Q = (31-q_cna_level) + Q15 - 31 */
2596 : /*
2597 : scale_fact0 will be in Q15 by the time the above operation is performed
2598 : so the q of scale_fact represented now by q_cna_level has to be updated
2599 : */
2600 12527928 : q_cna_level = sub( Q31, add( q_cna_level, Q16 ) );
2601 :
2602 : /* generate comfort noise from gaussian noise and add to the decoded DFT spectrum */
2603 12527928 : Word16 shift = sub( q_cna_level, hStereoDft->q_dft );
2604 12527928 : N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */
2605 12527928 : N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */
2606 12527928 : l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */
2607 12527928 : l_tmp = L_shr( l_tmp, shift ); /* q_dft */
2608 12527928 : DFT_L[2 * i] = L_add_sat( DFT_L[2 * i], l_tmp ); /* q_dft */
2609 12527928 : move32();
2610 12527928 : l_tmp = Msub_32_16( Msub_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */
2611 12527928 : l_tmp = L_shr( l_tmp, shift ); /* q_dft */
2612 12527928 : DFT_R[2 * i] = L_add_sat( DFT_R[2 * i], l_tmp ); /* q_dft */
2613 12527928 : move32();
2614 :
2615 12527928 : N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */
2616 12527928 : N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */
2617 12527928 : l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */
2618 12527928 : l_tmp = L_shr( l_tmp, shift ); /* q_dft */
2619 12527928 : DFT_L[2 * i + 1] = L_add_sat( DFT_L[2 * i + 1], l_tmp ); /* q_dft */
2620 12527928 : move32();
2621 12527928 : l_tmp = Msub_32_16( Msub_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */
2622 12527928 : l_tmp = L_shr( l_tmp, shift ); /* q_dft */
2623 12527928 : DFT_R[2 * i + 1] = L_add_sat( DFT_R[2 * i + 1], l_tmp ); /* q_dft */
2624 12527928 : move32();
2625 : }
2626 : }
2627 :
2628 : /* update CNA re-scaling factor */
2629 78792 : hFdCngDec->cna_rescale_fact_fx = extract_l( L_shr( L_mult0( (Word16) 0x6666, hFdCngDec->cna_act_fact_fx ), Q15 ) ); /* q_cna_act */
2630 78792 : move16();
2631 :
2632 78792 : IF( !hFdCngDec->first_cna_noise_updated )
2633 : {
2634 46762 : hFdCngDec->cna_rescale_fact_fx = 0;
2635 46762 : move16();
2636 : }
2637 : }
2638 :
2639 : /* Update memories */
2640 94982 : hStereoDft->past_DMX_pos = s_and( ( add( hStereoDft->past_DMX_pos, 1 ) ), ( STEREO_DFT_PAST_MAX - 1 ) ); /* Q0 */
2641 94982 : move16();
2642 94982 : Copy32( pDFT_DMX, hStereoDft->DFT_past_DMX_fx[hStereoDft->past_DMX_pos], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); /* qDFT */
2643 94982 : hStereoDft->q_DFT_past_DMX_fx[hStereoDft->past_DMX_pos] = hStereoDft->q_dft;
2644 94982 : move16();
2645 94982 : IF( pPredGain )
2646 : {
2647 94982 : stereo_dft_adapt_sf_delay_fx( hStereoDft, pPredGain );
2648 : }
2649 :
2650 94982 : Copy32( DFT_L, DFT[0] + k * STEREO_DFT32MS_N_MAX, hStereoDft->NFFT ); /* qDFT */
2651 94982 : Copy32( DFT_R, DFT[1] + k * STEREO_DFT32MS_N_MAX, hStereoDft->NFFT ); /* qDFT */
2652 : }
2653 :
2654 47491 : IF( st0->bfi && !prev_bfi )
2655 : {
2656 : Word16 q_shift0;
2657 : Word16 q_shift1;
2658 382 : idx_k0 = add( hStereoDft->past_DMX_pos, STEREO_DFT_PAST_MAX - 1 ) & ( STEREO_DFT_PAST_MAX - 1 ); /* Q0 */
2659 382 : idx_k1 = add( idx_k0, 1 ) & ( STEREO_DFT_PAST_MAX - 1 );
2660 382 : q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k0] );
2661 382 : q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k1] );
2662 : /*dmx energy memory*/
2663 382 : hStereoDft->past_dmx_nrg_fx = stereo_dft_dmx_swb_nrg_fx( hStereoDft->DFT_past_DMX_fx[idx_k0], hStereoDft->DFT_past_DMX_fx[idx_k1], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), q_shift0, q_shift1 ); /* 2 * q_DFT */
2664 : }
2665 :
2666 47491 : stereo_dft_compute_td_stefi_params_fx( hStereoDft, samp_ratio );
2667 :
2668 47491 : return;
2669 : }
2670 :
2671 : /*-------------------------------------------------------------------------
2672 : * stereo_dft_compute_td_stefi_params_fx()
2673 : *
2674 : *
2675 : *-------------------------------------------------------------------------*/
2676 :
2677 47491 : static void stereo_dft_compute_td_stefi_params_fx(
2678 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */
2679 : const Word16 samp_ratio /* i : sampling ratio Q13*/
2680 : )
2681 : {
2682 : Word16 pdmx_ind;
2683 : Word32 g2;
2684 : Word16 bin0;
2685 : Word16 band0;
2686 : Word16 b;
2687 : Word16 nbands;
2688 : Word16 bres;
2689 : Word32 wsum;
2690 : Word32 pred_gain_avg, pred_g;
2691 : Word16 shift_g;
2692 : Word16 q_pred_gain_avg;
2693 : Word32 nrg_DMX, nrg_pred_DMX;
2694 : Word32 op1;
2695 : Word16 q_div, q_sqrt;
2696 :
2697 47491 : pdmx_ind = hStereoDft->past_DMX_pos; /* Q0 */
2698 47491 : move16();
2699 47491 : bres = hStereoDft->band_res[1]; /* Q0 */
2700 47491 : move16();
2701 :
2702 47491 : test();
2703 47491 : IF( ( hStereoDft->core_hist[1] != ACELP_CORE ) || hStereoDft->wasTransient )
2704 : {
2705 23218 : hStereoDft->td_gain_fx[0] = 0;
2706 23218 : move32();
2707 23218 : hStereoDft->q_td_gain[0] = 0;
2708 23218 : move16();
2709 23218 : return;
2710 : }
2711 :
2712 24273 : bin0 = round_fx( L_mult0( hStereoDft->NFFT, samp_ratio ) );
2713 24273 : bin0 = s_min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); /* Q0 */
2714 24273 : b = hStereoDft->nbands; /* Q0 */
2715 24273 : move16();
2716 75653 : WHILE( GT_16( hStereoDft->band_limits[b], bin0 ) )
2717 : {
2718 51380 : b--;
2719 : }
2720 24273 : band0 = b; /* Q0 */
2721 24273 : move16();
2722 :
2723 : /* calculate averages over high bands */
2724 24273 : pred_g = pred_gain_avg = 0;
2725 24273 : move32();
2726 24273 : move32();
2727 24273 : nbands = 0;
2728 24273 : move16();
2729 24273 : wsum = 0;
2730 24273 : move32();
2731 24273 : shift_g = sub( Q15, norm_s( sub( hStereoDft->nbands, band0 ) ) );
2732 74124 : FOR( b = band0; b < hStereoDft->nbands; b++ )
2733 : {
2734 50509 : IF( L_min( hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 1, pdmx_ind )][b], hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 2, pdmx_ind )][b] ) < 0 )
2735 : {
2736 658 : hStereoDft->td_gain_fx[0] = 0;
2737 658 : move32();
2738 658 : hStereoDft->q_td_gain[0] = 0;
2739 658 : move16();
2740 658 : return;
2741 : }
2742 49851 : pred_g = L_add( pred_g, L_shr( Mpy_32_16_1( L_add( L_shr( hStereoDft->res_pred_gain_fx[b + STEREO_DFT_BAND_MAX], 1 ),
2743 49851 : L_shr( hStereoDft->res_pred_gain_fx[b + 2 * STEREO_DFT_BAND_MAX], 1 ) ),
2744 49851 : dft_res_pred_weights_fx[bres][b - band0] ),
2745 : shift_g ) ); /* Q30 - shift_g */
2746 49851 : pred_gain_avg = L_add( pred_gain_avg, L_shr( Mpy_32_16_1( L_add( L_shr( hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 2, pdmx_ind )][b], 1 ),
2747 49851 : L_shr( hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 1, pdmx_ind )][b], 1 ) ),
2748 49851 : dft_res_pred_weights_fx[bres][b - band0] ),
2749 : shift_g ) ); /* Q30 - shift_g */
2750 :
2751 49851 : nbands = add( nbands, 1 );
2752 49851 : wsum = L_add( wsum, dft_res_pred_weights_fx[bres][b - band0] );
2753 : #ifdef DBG_TD_STEFI
2754 : printf( "frame: %d\tband: %-2d\tpred_gain1: %f\tpred_gain2: %f\tppg1: %f\tppg2: %f\n", frame, b, hStereoDft->res_pred_gain[b + STEREO_DFT_BAND_MAX], hStereoDft->res_pred_gain[b + 2 * STEREO_DFT_BAND_MAX], hStereoDft->past_res_pred_gain[STEREO_DFT_TD_STEFI_SUBFR_DELAY - 2][b], hStereoDft->past_res_pred_gain[d_short - 1][b] );
2755 : #endif
2756 : }
2757 :
2758 23615 : IF( nbands == 0 )
2759 : {
2760 : /* apparently, there is nothing to do here */
2761 2968 : hStereoDft->td_gain_fx[0] = 0;
2762 2968 : move32();
2763 2968 : hStereoDft->q_td_gain[0] = 0;
2764 2968 : move16();
2765 2968 : return;
2766 : }
2767 20647 : wsum = L_shl( wsum, sub( Q16, shift_g ) ); /* Q31 - shift_g */
2768 20647 : pred_g = BASOP_Util_Divide3232_Scale( pred_g, wsum, &q_div ); /* q_div */
2769 20647 : IF( GT_16( sub( 15, q_div ), 15 ) )
2770 : {
2771 4921 : pred_g = L_shl( pred_g, q_div );
2772 : }
2773 :
2774 20647 : pred_gain_avg = BASOP_Util_Divide3232_Scale( pred_gain_avg, wsum, &q_div ); /* q_div */
2775 20647 : IF( GT_16( sub( 15, q_div ), 15 ) )
2776 : {
2777 4799 : pred_gain_avg = L_shl( pred_gain_avg, q_div );
2778 4799 : q_pred_gain_avg = 15;
2779 4799 : move16();
2780 : }
2781 : ELSE
2782 : {
2783 15848 : q_pred_gain_avg = sub( 15, q_div );
2784 : }
2785 20647 : nrg_DMX = hStereoDft->hb_nrg_fx[0];
2786 20647 : move32();
2787 20647 : nrg_pred_DMX = hStereoDft->hb_nrg_fx[1];
2788 20647 : move32();
2789 :
2790 20647 : op1 = BASOP_Util_Divide3232_Scale( L_add( EPSILON_FIX, nrg_DMX ), L_add( EPSILON_FIX, nrg_pred_DMX ), &q_div ); /* q_div */
2791 20647 : q_sqrt = add( Q16, q_div );
2792 20647 : op1 = Sqrt32( op1, &q_sqrt );
2793 20647 : g2 = Mpy_32_32( pred_g, op1 ); /* q_div + q_sqrt - 31 */
2794 20647 : IF( LT_16( q_sqrt, 0 ) )
2795 : {
2796 877 : g2 = L_shl( g2, q_sqrt );
2797 877 : q_sqrt = 0;
2798 877 : move16();
2799 : }
2800 19770 : ELSE IF( q_sqrt != 0 )
2801 : {
2802 11947 : IF( LT_32( L_shr( pred_gain_avg, q_sqrt ), g2 ) )
2803 : {
2804 7522 : g2 = pred_gain_avg; /* q_pred_gain_avg */
2805 7522 : move32();
2806 : }
2807 : ELSE
2808 : {
2809 4425 : g2 = L_min( Mpy_32_16_1( L_shr( pred_gain_avg, q_sqrt ), STEREO_DFT_STEFFI_GAIN_AMP_FX ),
2810 4425 : Madd_32_16( Mpy_32_16_1( L_shr( pred_gain_avg, q_sqrt ), sub( (Word16) 0x7FFF, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ),
2811 : g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* q_pred_gain_avg - q_sqrt */
2812 4425 : g2 = L_shl( g2, q_sqrt ); /* q_pred_gain_avg */
2813 : }
2814 : }
2815 : ELSE
2816 : {
2817 7823 : g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ),
2818 7823 : Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( (Word16) 0x7FFF, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ),
2819 : g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* q_pred_gain_avg */
2820 : }
2821 :
2822 20647 : hStereoDft->td_gain_fx[0] = L_deposit_h( (Word16) g2 ); /* Q16 + q_pred_gain_avg */
2823 20647 : hStereoDft->q_td_gain[0] = add( 16, q_pred_gain_avg );
2824 20647 : move32();
2825 20647 : move16();
2826 :
2827 : #ifdef DBG_TD_STEFI
2828 : printf( "frame: %d\tpred_gain: %f\tpred_gain_avg: %f\tg2_0: %f\tgain: %f\n", frame, pred_gain, pred_gain_avg, g2, hStereoDft->td_gain[0] );
2829 : printf( "nrg_DMX: %f\tnrd_pred_DMX: %f\tnbands: %d\tbin0: %d\n", nrg_DMX, nrg_pred_DMX, hStereoDft->nbands, bin0 );
2830 : /*printf( "td_gain: %f\n", hStereoDft->td_gain[0] );*/
2831 : #endif
2832 :
2833 20647 : return;
2834 : }
2835 :
2836 4224 : static void stereo_dft_dequantize_ipd_fx(
2837 : Word16 *ind, /* Q0 */
2838 : Word32 *out_fx, /* Q27 */
2839 : const Word16 bits /* Q0 */
2840 : )
2841 : {
2842 : Word16 delta_fx;
2843 4224 : IF( EQ_16( bits, 2 ) ) /* 2-bit phase quantization for the highest frequency band only */
2844 : {
2845 271 : delta_fx = ( EVS_PI_FX ) >> 1; /* Q13 */
2846 271 : move16();
2847 : }
2848 3953 : ELSE IF( EQ_16( bits, 3 ) )
2849 : {
2850 0 : delta_fx = ( EVS_PI_FX ) >> 2; /* Q13 */
2851 0 : move16();
2852 : }
2853 3953 : ELSE IF( EQ_16( bits, 4 ) )
2854 : {
2855 3953 : delta_fx = ( EVS_PI_FX ) >> 3; /* Q13 */
2856 3953 : move16();
2857 : }
2858 : ELSE
2859 : {
2860 0 : delta_fx = ( EVS_PI_FX ) >> 2; /* Q13 */
2861 0 : move16();
2862 0 : assert( 0 );
2863 : }
2864 :
2865 4224 : *out_fx = L_sub( W_sat_l( W_mult_32_16( L_shl( ind[0], 13 ), delta_fx ) ), EVS_PI_FX_Q27 );
2866 4224 : move32();
2867 4224 : return;
2868 : }
2869 :
2870 : /*-------------------------------------------------------------------------
2871 : * stereo_dft_generate_res_pred_fx()
2872 : *
2873 : *
2874 : *-------------------------------------------------------------------------*/
2875 82696 : void stereo_dft_generate_res_pred_fx(
2876 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */
2877 : const Word16 samp_ratio, /* i : sampling ratio Q15*/
2878 : Word32 *pDFT_DMX, /* i : downmix signal qDFT*/
2879 : Word32 *DFT_PRED_RES, /* o : residual prediction signal qDFT*/
2880 : Word32 *pPredGain, /* i : residual prediction gains Q31*/
2881 : const Word16 k, /* i : subframe index Q0*/
2882 : Word32 *ap_filt_DMX, /* i : enhanced stereo filling signal qDFT*/
2883 : Word16 *stop, /* o : last FD stereo filling bin Q0*/
2884 : const Word16 bfi /* i : BFI flag Q0*/
2885 : )
2886 : {
2887 : /* general variables */
2888 : Word16 i, b;
2889 : Word16 begin, end;
2890 : Word16 bin0, band0; /* ESF->Stefi crossover bin/band */
2891 : Word16 lb_stefi_start_band;
2892 :
2893 : /* variables for enhanced stereo filling */
2894 : Word16 norm_fac, q_norm_fac;
2895 : Word16 q_sqrt;
2896 : Word16 alpha; // gain_limit;
2897 :
2898 : /* variables for stereo filling */
2899 : Word16 d_long, d_short, d_long_ind, d_short_ind;
2900 : Word16 g_short, g_long;
2901 : Word32 dmx_nrg, rev_nrg;
2902 : Word64 dmx_nrg_64bit, rev_nrg_64bit;
2903 : Word16 q_shift, q_com, dmx_nrg_q, rev_nrg_q, q_smoothed_nrg_local[STEREO_DFT_BAND_MAX];
2904 : Word32 past_dmx_nrg;
2905 : Word32 pred_gain_avg;
2906 : Word32 g2;
2907 : Word16 nbands_respred;
2908 : Word16 q_new, diff;
2909 : Word16 len;
2910 82696 : push_wmops( "gen_respred" );
2911 :
2912 : /* smoothing and limiting parameters */
2913 : // alpha = hStereoDft->wasTransient ? 0 : (Word16) ( 0x199A ); /* no smoothing after transients */
2914 82696 : IF( hStereoDft->wasTransient )
2915 : {
2916 2364 : alpha = 0;
2917 2364 : move16();
2918 : }
2919 : ELSE
2920 : {
2921 80332 : alpha = (Word16) ( 0x199A ); /* Q15 */
2922 80332 : move16();
2923 : }
2924 : // gain_limit = 0x7FFF; // 2.0 in Q14
2925 :
2926 : /* residual prediction only used up to 16 kHz (SWB) */
2927 82696 : nbands_respred = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); /* Q0 */
2928 :
2929 : /* In ACELP mode the downmix signal is not available in bandwidth extension area. *
2930 : * Therefore, the downmix energy in the corresponding subbands is estimated. */
2931 82696 : bin0 = round_fx( L_mult0( hStereoDft->NFFT, samp_ratio ) );
2932 82696 : bin0 = s_min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); /* Q0 */
2933 82696 : b = hStereoDft->nbands;
2934 82696 : move16();
2935 265800 : WHILE( GE_16( hStereoDft->band_limits[b], bin0 ) )
2936 : {
2937 183104 : b--;
2938 : }
2939 82696 : band0 = b;
2940 82696 : move16();
2941 :
2942 82696 : IF( LT_16( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET], STEREO_DFT_RESPRED_ESF ) )
2943 : {
2944 : /* no ESF signal available, use stereo filling over whole spectrum */
2945 35120 : lb_stefi_start_band = s_max( hStereoDft->res_pred_band_min, hStereoDft->res_cod_band_max ); /* Q0 */
2946 : }
2947 : ELSE
2948 : {
2949 : /* ESF signal available, use ESF in lowband, stereo filling in highband */
2950 47576 : lb_stefi_start_band = s_max( band0, hStereoDft->res_cod_band_max ); /* Q0 */
2951 : }
2952 :
2953 82696 : IF( bfi )
2954 : {
2955 1404 : lb_stefi_start_band = 0;
2956 1404 : move16();
2957 : }
2958 :
2959 : /* lowband: use ESF if available, else use stereo filling */
2960 82696 : IF( EQ_16( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET], STEREO_DFT_RESPRED_ESF ) )
2961 : {
2962 : /* ESF in lowband */
2963 : /* main loop over core region*/
2964 47576 : set16_fx( q_smoothed_nrg_local, hStereoDft->q_smoothed_nrg, STEREO_DFT_BAND_MAX );
2965 385724 : FOR( b = hStereoDft->res_cod_band_max; b <= band0; b++ )
2966 : {
2967 338148 : dmx_nrg_64bit = EPSILLON_FX;
2968 338148 : move64();
2969 338148 : rev_nrg_64bit = EPSILLON_FX;
2970 338148 : move64();
2971 :
2972 : /* calculate band energies (low band only in case of ACELP) */
2973 338148 : len = s_min( hStereoDft->band_limits[b + 1], bin0 );
2974 7010956 : FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
2975 : {
2976 6672808 : dmx_nrg_64bit = W_mac_32_32( W_mac_32_32( dmx_nrg_64bit, pDFT_DMX[2 * i], pDFT_DMX[2 * i] ),
2977 6672808 : pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ); /* 2 * q_dft + 1 */
2978 6672808 : rev_nrg_64bit = W_mac_32_32( W_mac_32_32( rev_nrg_64bit, ap_filt_DMX[2 * i], ap_filt_DMX[2 * i] ),
2979 6672808 : ap_filt_DMX[2 * i + 1], ap_filt_DMX[2 * i + 1] ); /* 2 * q_dft + 1 */
2980 : }
2981 :
2982 338148 : q_new = add( shl( hStereoDft->q_dft, 1 ), 1 );
2983 338148 : q_shift = W_norm( dmx_nrg_64bit );
2984 338148 : dmx_nrg = W_shl_sat_l( dmx_nrg_64bit, sub( q_shift, 32 ) ); // 2 * hStereoDft->q_dft + 1 - (q_shift - 32)
2985 338148 : dmx_nrg_q = add( q_new, sub( q_shift, 32 ) );
2986 338148 : q_shift = W_norm( rev_nrg_64bit );
2987 338148 : rev_nrg = W_shl_sat_l( rev_nrg_64bit, sub( q_shift, 32 ) ); // 2 * hStereoDft->q_dft + 1 - (q_shift - 32)
2988 338148 : rev_nrg_q = add( q_new, sub( q_shift, 32 ) );
2989 338148 : move16();
2990 :
2991 : /* Reach a common Q for dmx_nrg and rev_nrg */
2992 338148 : q_com = s_min( dmx_nrg_q, rev_nrg_q );
2993 338148 : dmx_nrg = L_shl( dmx_nrg, sub( q_com, dmx_nrg_q ) ); /* q_com */
2994 338148 : rev_nrg = L_shl( rev_nrg, sub( q_com, rev_nrg_q ) ); /* q_com */
2995 :
2996 338148 : diff = sub( hStereoDft->q_smoothed_nrg, q_com );
2997 338148 : IF( diff < 0 )
2998 : {
2999 114877 : rev_nrg = L_shl( rev_nrg, shl( diff, 1 ) );
3000 114877 : dmx_nrg = L_shl( dmx_nrg, shl( diff, 1 ) );
3001 114877 : q_com = hStereoDft->q_smoothed_nrg;
3002 114877 : move16();
3003 : }
3004 : ELSE
3005 : {
3006 223271 : hStereoDft->smooth_res_nrg_fx[b] = L_shr( hStereoDft->smooth_res_nrg_fx[b], shl( diff, 1 ) ); /* hStereoDft->q_smoothed_nrg */
3007 223271 : move32();
3008 223271 : hStereoDft->smooth_dmx_nrg_fx[b] = L_shr( hStereoDft->smooth_dmx_nrg_fx[b], shl( diff, 1 ) ); /* hStereoDft->q_smoothed_nrg */
3009 223271 : move32();
3010 223271 : q_smoothed_nrg_local[b] = q_com;
3011 223271 : move16();
3012 : }
3013 : /* smoothing */
3014 338148 : hStereoDft->smooth_res_nrg_fx[b] = Madd_32_16( Mpy_32_16_1( hStereoDft->smooth_res_nrg_fx[b], alpha ), rev_nrg, sub( (Word16) ( 0x7FFF ), alpha ) ); /* hStereoDft->q_smoothed_nrg */
3015 338148 : move32();
3016 338148 : hStereoDft->smooth_dmx_nrg_fx[b] = Madd_32_16( Mpy_32_16_1( hStereoDft->smooth_dmx_nrg_fx[b], alpha ), dmx_nrg, sub( (Word16) ( 0x7FFF ), alpha ) ); /* hStereoDft->q_smoothed_nrg */
3017 338148 : move32();
3018 :
3019 : // Compute norm_fac in Q14
3020 338148 : norm_fac = MAX_16;
3021 338148 : move16();
3022 : /* normalization factor */
3023 338148 : IF( hStereoDft->smooth_res_nrg_fx[b] != 0 )
3024 : {
3025 333899 : norm_fac = 0;
3026 333899 : move16();
3027 333899 : IF( hStereoDft->smooth_dmx_nrg_fx[b] != 0 )
3028 : {
3029 : Word16 quo, quo_e;
3030 : Word32 prod;
3031 :
3032 333056 : norm_fac = BASOP_Util_Divide3232_Scale( hStereoDft->smooth_dmx_nrg_fx[b], hStereoDft->smooth_res_nrg_fx[b], &q_norm_fac ); /* q_norm_fac */
3033 333056 : norm_fac = Sqrt16( norm_fac, &q_norm_fac );
3034 :
3035 333056 : quo = BASOP_Util_Divide1616_Scale( 32767, norm_fac, &quo_e ); /* q_norm_fac */
3036 333056 : quo_e = sub( quo_e, q_norm_fac );
3037 333056 : quo = shl_sat( quo, sub( quo_e, 1 ) ); // Q14
3038 333056 : quo = s_max( 13107 /*0.8 in Q14 */, quo );
3039 333056 : quo = s_min( quo, 20480 /* 1.25 in Q14*/ );
3040 :
3041 333056 : prod = L_mult( norm_fac, quo ); // exp:q_norm_fac+1
3042 : // Bring to Q30
3043 333056 : prod = L_shl_sat( prod, q_norm_fac );
3044 :
3045 333056 : norm_fac = extract_h( prod );
3046 : }
3047 : }
3048 :
3049 338148 : len = s_min( hStereoDft->band_limits[b + 1], bin0 );
3050 7010956 : FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
3051 : {
3052 6672808 : DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i] ), 1 ); /* q_dft */
3053 6672808 : move32();
3054 6672808 : DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i + 1] ), 1 ); /* q_dft */
3055 6672808 : move32();
3056 : }
3057 : }
3058 :
3059 : /* Reach a common Q for all the bands */
3060 47576 : q_com = Q31;
3061 47576 : move16();
3062 666064 : FOR( b = 0; b < STEREO_DFT_BAND_MAX; b++ )
3063 : {
3064 618488 : q_com = s_min( q_com, q_smoothed_nrg_local[b] );
3065 : }
3066 666064 : FOR( b = 0; b < STEREO_DFT_BAND_MAX; b++ )
3067 : {
3068 618488 : hStereoDft->smooth_dmx_nrg_fx[b] = L_shl( hStereoDft->smooth_dmx_nrg_fx[b], sub( q_com, q_smoothed_nrg_local[b] ) ); /* q_com */
3069 618488 : move32();
3070 :
3071 618488 : hStereoDft->smooth_res_nrg_fx[b] = L_shl( hStereoDft->smooth_res_nrg_fx[b], sub( q_com, q_smoothed_nrg_local[b] ) ); /* q_com */
3072 618488 : move32();
3073 : }
3074 47576 : IF( GT_16( q_com, hStereoDft->q_dft ) )
3075 : {
3076 31 : scale_sig32( hStereoDft->smooth_dmx_nrg_fx, STEREO_DFT_BAND_MAX, sub( hStereoDft->q_dft, q_com ) ); /* q_dft */
3077 31 : scale_sig32( hStereoDft->smooth_res_nrg_fx, STEREO_DFT_BAND_MAX, sub( hStereoDft->q_dft, q_com ) ); /* q_dft */
3078 31 : hStereoDft->q_smoothed_nrg = hStereoDft->q_dft;
3079 31 : move16();
3080 : }
3081 : }
3082 35120 : ELSE IF( EQ_16( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET], STEREO_DFT_RESPRED_STEFI ) )
3083 : {
3084 : /* stefi in lowband */
3085 24180 : set32_fx( DFT_PRED_RES, 0, shl( hStereoDft->band_limits[lb_stefi_start_band], 1 ) );
3086 :
3087 148410 : FOR( b = lb_stefi_start_band; b <= band0; b++ )
3088 : {
3089 : Word16 temp, temp_e;
3090 124230 : d_short_ind = add( sub( STEREO_DFT_PAST_MAX, STEREO_DFT_STEFFI_DELAY_SHORT ), b & 1 ); /* Q0 */
3091 124230 : temp = BASOP_Util_Divide1616_Scale( b, sub( hStereoDft->nbands, 1 ), &temp_e ); /*(float) b / ( hStereoDft->nbands - 1 )*/
3092 124230 : IF( temp_e < 0 )
3093 : {
3094 2270 : temp = shl( temp, temp_e );
3095 2270 : temp_e = 0;
3096 2270 : move16();
3097 : }
3098 124230 : temp = shr( temp, 3 ); /*adding 3 as guard bit*/
3099 124230 : temp_e = add( temp_e, 3 );
3100 124230 : temp = shr( add( imult1616( ( STEREO_DFT_PAST_MAX + 4 - 1 ), temp ), shl( 1, sub( 14, temp_e ) ) ), sub( 15, temp_e ) ); /*( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f*/ /*Q0*/
3101 124230 : d_long_ind = sub( s_max( 4, temp ), 4 );
3102 : /* make sure d_short really corresponds to a shorter or equally long delay than d_long (e.g. not always the case for
3103 : * STEREO_DFT_STEFFI_DELAY_SHORT=3 and STEREO_DFT_STEFFI_DELAY_LONG=4)*/
3104 124230 : d_short_ind = s_max( d_short_ind, d_long_ind );
3105 124230 : move16();
3106 :
3107 : /* Even number of window sliding (assymmetric OLA) */
3108 124230 : d_short_ind = shl( shr( d_short_ind, 1 ), 1 ); /* Q0 */
3109 124230 : d_long_ind = shl( shr( d_long_ind, 1 ), 1 ); /* Q0 */
3110 :
3111 124230 : d_short = sub( STEREO_DFT_PAST_MAX, d_short_ind ); /* Q0 */
3112 124230 : d_long = sub( STEREO_DFT_PAST_MAX, d_long_ind ); /* Q0 */
3113 :
3114 124230 : d_short_ind = add( add( d_short_ind, hStereoDft->past_DMX_pos ), 1 ) % STEREO_DFT_PAST_MAX; /* Q0 */
3115 124230 : move16();
3116 124230 : d_long_ind = add( add( d_long_ind, hStereoDft->past_DMX_pos ), 1 ) % STEREO_DFT_PAST_MAX; /* Q0 */
3117 124230 : move16();
3118 :
3119 124230 : g_short = hStereoDft->stefi_short_gain_fx; /* Q15 */
3120 124230 : move16();
3121 124230 : g_long = hStereoDft->stefi_long_gain_fx; /* Q15 */
3122 124230 : move16();
3123 :
3124 : /* change mixing ratio if long and short delay are the same */
3125 124230 : IF( EQ_16( d_short, d_long ) )
3126 : {
3127 20614 : g_short = MAX_16;
3128 20614 : move16();
3129 20614 : g_long = 0;
3130 20614 : move16();
3131 : }
3132 :
3133 : /* Avoid transient components */
3134 124230 : test();
3135 124230 : IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], EVS_LW_MIN ) && EQ_32( hStereoDft->past_res_pred_gain_fx[d_long_ind][b], EVS_LW_MIN ) )
3136 : {
3137 4884 : g_long = 0;
3138 4884 : move16();
3139 4884 : g_short = 0;
3140 4884 : move16();
3141 : }
3142 119346 : ELSE IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], EVS_LW_MIN ) )
3143 : {
3144 3004 : g_long = MAX_16;
3145 3004 : move16();
3146 3004 : g_short = 0;
3147 3004 : move16();
3148 : }
3149 116342 : ELSE IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_long_ind][b], EVS_LW_MIN ) )
3150 : {
3151 2944 : g_long = 0;
3152 2944 : move16();
3153 2944 : g_short = MAX_16;
3154 2944 : move16();
3155 : }
3156 :
3157 124230 : IF( s_max( g_short, g_long ) > 0 )
3158 : {
3159 119346 : Word16 q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] );
3160 119346 : Word16 q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_long_ind] );
3161 119346 : past_dmx_nrg = EPSILON_FIX;
3162 119346 : move32();
3163 119346 : dmx_nrg = EPSILON_FIX;
3164 119346 : move32();
3165 119346 : len = s_min( bin0, hStereoDft->band_limits[b + 1] );
3166 3308318 : FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
3167 : {
3168 3188972 : dmx_nrg = Madd_32_32( Madd_32_32( dmx_nrg, pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ); /* 2 * q_dft - 31 */
3169 :
3170 3188972 : DFT_PRED_RES[2 * i] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i], g_long ), q_shift1 ) ); /* q_dft */
3171 3188972 : move32();
3172 3188972 : DFT_PRED_RES[2 * i + 1] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i + 1], g_long ), q_shift1 ) ); /* q_dft */
3173 3188972 : move32();
3174 3188972 : past_dmx_nrg = Madd_32_32( Madd_32_32( 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] ); /* q_dft */
3175 : }
3176 119346 : test();
3177 119346 : IF( !bfi || GE_16( b, hStereoDft->res_cod_band_max ) )
3178 : {
3179 : Word16 q_div;
3180 : Word16 op;
3181 114656 : op = BASOP_Util_Divide3232_Scale( L_add( 1, dmx_nrg ), L_add( 1, past_dmx_nrg ), &q_div ); /* q_sqrt */
3182 114656 : q_sqrt = q_div;
3183 114656 : move16();
3184 114656 : norm_fac = Sqrt16( op, &q_sqrt );
3185 114656 : g2 = Mpy_32_16_1( pPredGain[b], norm_fac ); /* Q31 */
3186 114656 : IF( LE_32( q_sqrt, norm_l( g2 ) ) )
3187 : {
3188 103101 : g2 = L_shl( g2, q_sqrt );
3189 103101 : pred_gain_avg = Madd_32_16( Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ),
3190 : hStereoDft->past_res_pred_gain_fx[d_long_ind][b], g_long ); /* Q31 */
3191 :
3192 103101 : g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ),
3193 103101 : Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( MAX_16, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ),
3194 : g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* Q31 */
3195 103101 : q_sqrt = 0;
3196 103101 : move16();
3197 : }
3198 : ELSE
3199 : {
3200 : /* Multiplication with STEREO_DFT_STEFFI_GAIN_AMP_FX is avodided since the float value of
3201 : this constant is 1.0f */
3202 11555 : g2 = Madd_32_16( Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ),
3203 : hStereoDft->past_res_pred_gain_fx[d_long_ind][b], g_long ); /* Q31 */
3204 11555 : q_sqrt = 0;
3205 11555 : move16();
3206 : }
3207 114656 : len = s_min( bin0, hStereoDft->band_limits[b + 1] );
3208 3285140 : FOR( i = hStereoDft->band_limits[b]; i < len; i++ )
3209 : {
3210 3170484 : DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[2 * i] ), q_sqrt ); /* q_dft */
3211 3170484 : move32();
3212 3170484 : DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[2 * i + 1] ), q_sqrt ); /* q_dft */
3213 3170484 : move32();
3214 : }
3215 : }
3216 : }
3217 : ELSE
3218 : {
3219 4884 : set32_fx( DFT_PRED_RES + shl( hStereoDft->band_limits[b], 1 ), 0, shl( sub( s_min( bin0, hStereoDft->band_limits[b + 1] ), hStereoDft->band_limits[b] ), 1 ) );
3220 : }
3221 : }
3222 : }
3223 :
3224 82696 : IF( GT_16( hStereoDft->band_limits[nbands_respred], bin0 ) )
3225 : {
3226 : /* apply stereo filling in ACELP BWE region */
3227 71954 : test();
3228 71954 : IF( ( hStereoDft->core_hist[0] == ACELP_CORE ) && ( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2] == ACELP_CORE ) )
3229 : {
3230 : /* ACELP -> ACELP: nothing to do */
3231 42262 : *stop = bin0;
3232 42262 : move16();
3233 : }
3234 29692 : ELSE IF( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2] == ACELP_CORE )
3235 : {
3236 : /* ACELP -> TCX/HQ core transition */
3237 : /* calculate high band energy only */
3238 1990 : dmx_nrg = EPSILON_FIX;
3239 1990 : move32();
3240 454918 : FOR( i = bin0; i < hStereoDft->NFFT / 2; i++ )
3241 : {
3242 452928 : dmx_nrg = L_add( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ) ); /* 2 * q_dft - 31 */
3243 : }
3244 :
3245 1990 : hStereoDft->hb_nrg_fx[0] = L_add( hStereoDft->hb_nrg_fx[0], div_l( dmx_nrg, shr( hStereoDft->NFFT, 2 ) ) ); /* Q15 */
3246 1990 : move32();
3247 1990 : *stop = bin0;
3248 1990 : move16();
3249 : }
3250 27702 : ELSE IF( hStereoDft->core_hist[0] == ACELP_CORE )
3251 : {
3252 : /* TCX/HQ core -> ACELP transition */
3253 : /* apply short delay only and blend to long/short gain */
3254 1496 : dmx_nrg = hStereoDft->hb_nrg_subr_fx[k]; /* Q15 */
3255 1496 : move32();
3256 1496 : d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_TD_STEFI_SUBFR_DELAY;
3257 1496 : move16();
3258 :
3259 1496 : d_short_ind = s_and( add( d_short_ind, add( hStereoDft->past_DMX_pos, 1 ) ), ( STEREO_DFT_PAST_MAX - 1 ) ); /* Q0 */
3260 :
3261 : /* calculate high band energy of past dmx */
3262 : // past_dmx_nrg = EPSILON_FIX;
3263 1496 : past_dmx_nrg = 0;
3264 1496 : move32();
3265 1496 : len = s_min( shr( hStereoDft->NFFT, 1 ), ( STEREO_DFT32MS_N_32k >> 1 ) );
3266 220768 : FOR( i = bin0; i < len; i++ ) // i < min( ( hStereoDft->NFFT / 2 ), ( hStereoDft->NFFT / 2 ) )
3267 : {
3268 219272 : past_dmx_nrg = L_add( past_dmx_nrg, Madd_32_32( Mpy_32_32( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i] ), hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1] ) ); /* 2 * hStereoDft->q_DFT_past_DMX_fx[d_short_ind] - 31 */
3269 : }
3270 1496 : past_dmx_nrg = L_shl( past_dmx_nrg, shl( sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] ), 1 ) ); /* 2 * hStereoDft->q_dft - 31*/
3271 1496 : IF( past_dmx_nrg == 0 )
3272 : {
3273 1065 : past_dmx_nrg = EPSILON_FX;
3274 1065 : move32();
3275 : }
3276 :
3277 5168 : FOR( b = band0; b < nbands_respred; b++ )
3278 : {
3279 : // g_short = LT_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], 0 ) ? 0 : add( ONE_IN_Q14, shr( hStereoDft->stefi_short_gain_fx, 1 ) );
3280 3672 : IF( hStereoDft->past_res_pred_gain_fx[d_short_ind][b] < 0 )
3281 : {
3282 162 : g_short = 0;
3283 162 : move16();
3284 : }
3285 : ELSE
3286 : {
3287 3510 : g_short = add( ONE_IN_Q14, shr( hStereoDft->stefi_short_gain_fx, 1 ) );
3288 : }
3289 :
3290 3672 : IF( g_short > 0 )
3291 : {
3292 : Word16 q_divide;
3293 3510 : Word32 op = BASOP_Util_Divide3232_Scale( L_add( EPSILON_FIX, dmx_nrg ), L_add( EPSILON_FIX, past_dmx_nrg ), &q_divide );
3294 3510 : q_norm_fac = add( add( Q16, q_divide ), hStereoDft->q_hb_nrg_subr );
3295 3510 : op = Sqrt32( op, &q_norm_fac );
3296 3510 : g2 = Mpy_32_32( pPredGain[b], op ); /* Q31 */
3297 3510 : pred_gain_avg = Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ); /* Q31 */
3298 3510 : IF( q_norm_fac < 0 )
3299 : {
3300 2600 : g2 = L_shl( g2, q_norm_fac );
3301 2600 : q_norm_fac = 0;
3302 2600 : move16();
3303 : }
3304 910 : ELSE IF( q_norm_fac != 0 )
3305 : {
3306 672 : IF( LT_32( L_shr( pred_gain_avg, q_norm_fac ), g2 ) )
3307 : {
3308 569 : g2 = pred_gain_avg;
3309 569 : move32();
3310 : }
3311 : ELSE
3312 : {
3313 103 : g2 = L_min( Mpy_32_16_1( L_shr( pred_gain_avg, q_norm_fac ), STEREO_DFT_STEFFI_GAIN_AMP_FX ),
3314 103 : Madd_32_16( Mpy_32_16_1( L_shr( pred_gain_avg, q_norm_fac ), sub( (Word16) 0x7FFF, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ),
3315 : g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* Q31 - q_norm_fac */
3316 103 : g2 = L_shl( g2, q_norm_fac ); /* Q31 */
3317 : }
3318 : }
3319 : ELSE
3320 : {
3321 238 : g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ),
3322 238 : Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( (Word16) 0x7FFF, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ),
3323 : g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* Q31 */
3324 : }
3325 3510 : q_shift = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] );
3326 3510 : move16();
3327 3510 : len = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k >> 1 );
3328 209660 : FOR( i = s_max( hStereoDft->band_limits[b], bin0 ); i < len; i++ ) // i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 )
3329 : {
3330 206150 : DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( g2, hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i] ), q_shift ); /* q_dft */
3331 206150 : move32();
3332 206150 : DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( g2, hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1] ), q_shift ); /* q_dft */
3333 206150 : move32();
3334 : }
3335 : }
3336 : ELSE
3337 : {
3338 162 : begin = s_max( hStereoDft->band_limits[b], bin0 ); /* Q0 */
3339 162 : end = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); /* Q0 */
3340 162 : set32_fx( DFT_PRED_RES + shl( begin, 1 ), 0, shl( sub( end, begin ), 1 ) );
3341 : }
3342 : }
3343 : }
3344 : ELSE
3345 : {
3346 85286 : FOR( b = band0; b < nbands_respred; b++ )
3347 : {
3348 : /* TCX/HQ core -> TCX/HQ core: business as usual */
3349 59080 : d_short_ind = add( sub( STEREO_DFT_PAST_MAX, STEREO_DFT_STEFFI_DELAY_SHORT ), b & 1 ); /* Q0 */
3350 : Word16 temp, temp_e;
3351 59080 : temp = BASOP_Util_Divide1616_Scale( b, sub( hStereoDft->nbands, 1 ), &temp_e ); /*(float) b / ( hStereoDft->nbands - 1 )*/
3352 59080 : IF( temp_e < 0 )
3353 : {
3354 0 : temp = shl( temp, temp_e );
3355 0 : temp_e = 0;
3356 0 : move16();
3357 : }
3358 59080 : temp = shr( temp, 3 ); /*adding 3 as guard bit*/
3359 59080 : temp_e = add( temp_e, 3 );
3360 59080 : temp = shr( add( imult1616( ( STEREO_DFT_PAST_MAX + 4 - 1 ), temp ), shl( 1, sub( 14, temp_e ) ) ), sub( 15, temp_e ) ); /*( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f*/ /*Q0*/
3361 59080 : d_long_ind = sub( s_max( 4, temp ), 4 ); /* Q0 */
3362 : /* make sure d_short really corresponds to a shorter or equally long delay than d_long (e.g. not always the case for
3363 : * STEREO_DFT_STEFFI_DELAY_SHORT=3 and STEREO_DFT_STEFFI_DELAY_LONG=4)*/
3364 59080 : d_short_ind = s_max( d_short_ind, d_long_ind ); /* Q0 */
3365 :
3366 : /* Even number of window sliding (assymmetric OLA) */
3367 59080 : d_short_ind = d_short_ind & (Word16) ( 0xFFFE ); /* Q0 */
3368 59080 : move16();
3369 59080 : d_long_ind = d_long_ind & (Word16) ( 0xFFFE ); /* Q0 */
3370 59080 : move16();
3371 :
3372 59080 : d_short = sub( STEREO_DFT_PAST_MAX, d_short_ind ); /* Q0 */
3373 59080 : move16();
3374 59080 : d_long = sub( STEREO_DFT_PAST_MAX, d_long_ind ); /* Q0 */
3375 59080 : move16();
3376 :
3377 : /* Works as long as STEREO_DFT_PAST_MAX is a power of 2*/
3378 59080 : d_short_ind = ( add( d_short_ind, add( hStereoDft->past_DMX_pos, 1 ) ) ) & ( STEREO_DFT_PAST_MAX - 1 ); /* Q0 */
3379 59080 : move16();
3380 59080 : d_long_ind = ( add( d_long_ind, add( hStereoDft->past_DMX_pos, 1 ) ) ) & ( STEREO_DFT_PAST_MAX - 1 ); /* Q0 */
3381 59080 : move16();
3382 :
3383 59080 : g_short = hStereoDft->stefi_short_gain_fx; /* Q15 */
3384 59080 : move16();
3385 59080 : g_long = hStereoDft->stefi_long_gain_fx; /* Q15 */
3386 59080 : move16();
3387 :
3388 : /* change mixing ratio if long and short delay are the same */
3389 59080 : IF( EQ_16( d_short, d_long ) )
3390 : {
3391 55244 : g_short = MAX_16;
3392 55244 : move16();
3393 55244 : g_long = 0;
3394 55244 : move16();
3395 : }
3396 :
3397 : /* Avoid transient components */
3398 59080 : test();
3399 59080 : IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], MIN_32 ) &&
3400 : EQ_32( hStereoDft->past_res_pred_gain_fx[d_long_ind][b], MIN_32 ) )
3401 : {
3402 1822 : g_long = 0;
3403 1822 : move16();
3404 1822 : g_short = 0;
3405 1822 : move16();
3406 : }
3407 57258 : ELSE IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], MIN_32 ) )
3408 : {
3409 42 : g_long = MAX_16;
3410 42 : move16();
3411 42 : g_short = 0;
3412 42 : move16();
3413 : }
3414 57216 : ELSE IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_long_ind][b], MIN_32 ) )
3415 : {
3416 52 : g_long = 0;
3417 52 : move16();
3418 52 : g_short = MAX_16;
3419 52 : move16();
3420 : }
3421 59080 : IF( EQ_32( hStereoDft->core_hist[d_short / 2], ACELP_CORE ) )
3422 : {
3423 0 : g_short = 0;
3424 0 : move16();
3425 : }
3426 59080 : IF( EQ_32( hStereoDft->core_hist[d_long / 2], ACELP_CORE ) )
3427 : {
3428 338 : g_long = 0;
3429 338 : move16();
3430 : }
3431 :
3432 59080 : IF( s_max( g_short, g_long ) > 0 )
3433 : {
3434 : Word16 q_div;
3435 : Word32 op1;
3436 57174 : Word16 q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] );
3437 57174 : Word16 q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_long_ind] );
3438 57174 : past_dmx_nrg = EPSILON_FIX;
3439 57174 : move32();
3440 57174 : dmx_nrg = EPSILON_FIX;
3441 57174 : move32();
3442 57174 : len = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k >> 1 );
3443 3718032 : FOR( i = s_max( hStereoDft->band_limits[b], bin0 ); i < len; i++ ) // i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 )
3444 : {
3445 3660858 : dmx_nrg = L_add( dmx_nrg, L_shr( Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ), 1 ) ); /* 2 * q_dft - 31 - 1 */
3446 :
3447 3660858 : DFT_PRED_RES[2 * i] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i], g_long ), q_shift1 ) ); /* q_dft */
3448 3660858 : move32();
3449 3660858 : DFT_PRED_RES[2 * i + 1] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i + 1], g_long ), q_shift1 ) ); /* q_dft */
3450 3660858 : move32();
3451 :
3452 3660858 : past_dmx_nrg = L_add( past_dmx_nrg, L_shr( Madd_32_32( Mpy_32_32( DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[2 * i + 1], DFT_PRED_RES[2 * i + 1] ), 1 ) ); /* 2 * q_dft - 31 -1 */
3453 : }
3454 57174 : op1 = L_deposit_h( BASOP_Util_Divide3232_Scale( ( EPSILON_FIX + dmx_nrg ), ( EPSILON_FIX + past_dmx_nrg ), &q_div ) ); /* q_div + 16 */
3455 57174 : q_norm_fac = q_div;
3456 57174 : move16();
3457 57174 : op1 = Sqrt32( op1, &q_norm_fac );
3458 57174 : IF( GT_16( q_norm_fac, 16 ) )
3459 : {
3460 0 : assert( 0 );
3461 : }
3462 57174 : norm_fac = extract_h( op1 ); /* q_norm_fac - 16 */
3463 57174 : q_norm_fac = sub( q_norm_fac, Q16 );
3464 57174 : g2 = Mpy_32_16_1( pPredGain[b], norm_fac ); /* Q31 */
3465 57174 : pred_gain_avg = Madd_32_16( Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ), hStereoDft->past_res_pred_gain_fx[d_long_ind][b], g_long ); /* Q31 */
3466 :
3467 57174 : g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ),
3468 57174 : Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( (Word16) ( 0x7FFF ), STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ), g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* Q31 */
3469 57174 : len = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k >> 1 );
3470 3718032 : FOR( i = s_max( hStereoDft->band_limits[b], bin0 ); i < len; i++ ) // i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 )
3471 : {
3472 3660858 : DFT_PRED_RES[2 * i] = Mpy_32_32( g2, DFT_PRED_RES[2 * i] ); /* Q31 */
3473 3660858 : move32();
3474 3660858 : DFT_PRED_RES[2 * i + 1] = Mpy_32_32( g2, DFT_PRED_RES[2 * i + 1] ); /* Q31 */
3475 3660858 : move32();
3476 : }
3477 : }
3478 : ELSE
3479 : {
3480 1906 : begin = s_max( hStereoDft->band_limits[b], bin0 ); /* Q0 */
3481 1906 : end = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); /* Q0 */
3482 1906 : set32_fx( DFT_PRED_RES + shl( begin, 1 ), 0, shl( sub( end, begin ), 1 ) );
3483 : }
3484 : }
3485 : }
3486 : }
3487 :
3488 : /* update buffers */
3489 695492 : FOR( b = hStereoDft->res_pred_band_min; b < hStereoDft->nbands; b++ )
3490 : {
3491 612796 : test();
3492 612796 : IF( hStereoDft->attackPresent || hStereoDft->wasTransient )
3493 : {
3494 32906 : hStereoDft->past_res_pred_gain_fx[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = MIN_32;
3495 32906 : move32();
3496 : }
3497 : ELSE
3498 : {
3499 579890 : hStereoDft->past_res_pred_gain_fx[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = pPredGain[b];
3500 579890 : move32();
3501 : }
3502 : }
3503 :
3504 82696 : pop_wmops();
3505 82696 : return;
3506 : }
3507 :
3508 : /*---------------------------------------------------------------
3509 : * stereo_dft_adapt_sf_delay_fx()
3510 : *
3511 : *
3512 : * ---------------------------------------------------------------*/
3513 :
3514 94982 : static void stereo_dft_adapt_sf_delay_fx(
3515 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft,
3516 : Word32 *pPredGain )
3517 : {
3518 : Word32 var_mean_ratio;
3519 : Word32 new_variation;
3520 : Word32 target_delay;
3521 : Word32 max_pg, sum_pg;
3522 : Word32 alpha_up, alpha_down;
3523 : Word16 b;
3524 : Word16 q_sqrt;
3525 : Word16 q_div;
3526 : Word16 q_guard;
3527 : Word16 op;
3528 :
3529 94982 : max_pg = 0;
3530 94982 : move32();
3531 94982 : sum_pg = 0;
3532 94982 : move32();
3533 94982 : q_sqrt = 0;
3534 94982 : move32();
3535 94982 : q_guard = sub( 15, norm_s( hStereoDft->nbands ) );
3536 :
3537 : /* find sum and maximum of prediction gains */
3538 851196 : FOR( b = hStereoDft->res_pred_band_min; b < hStereoDft->nbands; b++ )
3539 : {
3540 756214 : IF( GT_32( pPredGain[b], max_pg ) )
3541 : {
3542 204226 : max_pg = pPredGain[b];
3543 204226 : move16();
3544 : }
3545 756214 : sum_pg = L_add( sum_pg, L_shr( pPredGain[b], q_guard ) ); /* q_gurad */
3546 : }
3547 94982 : IF( GT_16( q_guard, hStereoDft->q_lt_pred_gain ) )
3548 : {
3549 526 : hStereoDft->lt_pred_gain_fx = L_shr( hStereoDft->lt_pred_gain_fx, sub( q_guard, hStereoDft->q_lt_pred_gain ) ); /* q_guard */
3550 526 : hStereoDft->q_lt_pred_gain = q_guard;
3551 526 : move16();
3552 : }
3553 : ELSE
3554 : {
3555 94456 : sum_pg = L_shr( sum_pg, sub( hStereoDft->q_lt_pred_gain, q_guard ) ); /* hStereoDft->q_lt_pred_gain */
3556 94456 : q_guard = hStereoDft->q_lt_pred_gain;
3557 94456 : move16();
3558 : }
3559 94982 : IF( sum_pg > 0 )
3560 : {
3561 : /* Calculate mean of the prediction gain */
3562 87302 : hStereoDft->lt_pred_gain_fx = Madd_32_16( Mpy_32_16_1( sum_pg, STEREO_DFT_LT_PREDGAIN_UPD_FX ), hStereoDft->lt_pred_gain_fx, sub( MAX_16, STEREO_DFT_LT_PREDGAIN_UPD_FX ) ); /* hStereoDft->q_lt_pred_gain */
3563 :
3564 : /* Calculate the variation of the prediction gain */
3565 87302 : new_variation = L_abs( L_sub( sum_pg, hStereoDft->lt_pred_gain_fx ) ); /* hStereoDft->q_lt_pred_gain */
3566 87302 : hStereoDft->lt_pred_gain_variation_fx = Madd_32_16( Mpy_32_16_1( new_variation, STEREO_DFT_VR_PREDGAIN_UPD_FX ), hStereoDft->lt_pred_gain_variation_fx, sub( MAX_16, STEREO_DFT_VR_PREDGAIN_UPD_FX ) ); /* hStereoDft->q_lt_pred_gain */
3567 : }
3568 :
3569 : /* Calculate ratio of variation and mean of prediction gain */
3570 94982 : var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT_FX; /* Q31 */
3571 94982 : move16();
3572 :
3573 94982 : IF( hStereoDft->lt_pred_gain_fx > 0 )
3574 : {
3575 93288 : Word32 opr2 = L_deposit_h( BASOP_Util_Divide3232_Scale( hStereoDft->lt_pred_gain_variation_fx, hStereoDft->lt_pred_gain_fx, &q_div ) );
3576 93288 : IF( q_div < 0 )
3577 : {
3578 84041 : opr2 = L_shl( opr2, q_div );
3579 84041 : q_div = 0;
3580 84041 : move16();
3581 : }
3582 93288 : IF( LT_32( L_shr( STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2, q_div ), opr2 ) )
3583 : {
3584 12923 : var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2; /* Q31 */
3585 12923 : move32();
3586 : }
3587 : ELSE
3588 : {
3589 80365 : var_mean_ratio = L_shl( opr2, q_div ); /* Q31 */
3590 : }
3591 : }
3592 :
3593 94982 : IF( GT_32( max_pg, STEREO_DFT_STEFFI_PG_THRESHOLD_FX ) )
3594 : {
3595 : /* slow upwards */
3596 51293 : alpha_up = STEREO_DFT_STEFFI_RATIO_UP_HIGH_FX; /* Q31 */
3597 51293 : move16();
3598 51293 : alpha_down = STEREO_DFT_STEFFI_RATIO_DOWN_HIGH_FX; /* Q31 */
3599 51293 : move16();
3600 : }
3601 : ELSE
3602 : {
3603 : /* slow downwards */
3604 43689 : alpha_up = STEREO_DFT_STEFFI_RATIO_UP_LOW_FX; /* Q31 */
3605 43689 : move16();
3606 43689 : alpha_down = STEREO_DFT_STEFFI_RATIO_DOWN_LOW_FX; /* Q31 */
3607 43689 : move16();
3608 : }
3609 :
3610 94982 : IF( GT_16( extract_h( var_mean_ratio ), extract_h( hStereoDft->lt_var_mean_ratio_fx ) ) )
3611 : {
3612 26537 : hStereoDft->lt_var_mean_ratio_fx = Madd_32_32( Mpy_32_32( var_mean_ratio, alpha_up ), hStereoDft->lt_var_mean_ratio_fx, L_sub( MAX_32, alpha_up ) ); /* Q31 */
3613 26537 : move32();
3614 : }
3615 : ELSE
3616 : {
3617 68445 : hStereoDft->lt_var_mean_ratio_fx = Madd_32_32( Mpy_32_32( var_mean_ratio, alpha_down ), hStereoDft->lt_var_mean_ratio_fx, L_sub( MAX_32, alpha_down ) ); /* Q31 */
3618 68445 : move32();
3619 : }
3620 :
3621 : /* Calculate a target delay for the stereo filling. Set the stereo filling delay lower when the prediction gain
3622 : variation is relatively high compared to the mean */
3623 94982 : IF( GE_16( extract_h( hStereoDft->lt_var_mean_ratio_fx ), extract_h( STEREO_DFT_RES_RATIO_LIMIT_FX ) ) )
3624 : {
3625 35353 : target_delay = L_shl( STEREO_DFT_STEFFI_DELAY_SHORT, Q15 ); /* Q15 */
3626 35353 : move32();
3627 : }
3628 : ELSE
3629 : {
3630 59629 : target_delay = L_min( L_shl( STEREO_DFT_STEFFI_DELAY_LONG, Q15 ),
3631 : L_add( L_shl( STEREO_DFT_STEFFI_DELAY_SHORT, Q15 ),
3632 : L_mult0( ( STEREO_DFT_STEFFI_DELAY_OFFSET + STEREO_DFT_STEFFI_DELAY_LONG - STEREO_DFT_STEFFI_DELAY_SHORT ),
3633 59629 : sub( MAX_16, extract_h( L_shl( Mpy_32_16_1( hStereoDft->lt_var_mean_ratio_fx, ONE_STEREO_DFT_RES_RATIO_LIMIT_Q12 ), Q3 ) ) ) ) ) ); /* Q15 */
3634 : }
3635 :
3636 : /* Adapt the stereo filling delay by interpolating between two delay taps, one at the shortest delay and one at the longest delay */
3637 94982 : hStereoDft->stefi_short_gain_fx = extract_l( L_shr( L_sub( L_shl( STEREO_DFT_STEFFI_DELAY_LONG, Q15 ), target_delay ), 1 ) ); /* Q15 */
3638 94982 : q_sqrt = 0;
3639 94982 : move16();
3640 94982 : IF( EQ_16( hStereoDft->stefi_short_gain_fx, MIN_16 ) )
3641 : {
3642 35353 : hStereoDft->stefi_short_gain_fx = MAX_16;
3643 35353 : move16();
3644 35353 : hStereoDft->stefi_long_gain_fx = 0;
3645 35353 : move16();
3646 : }
3647 : ELSE
3648 : {
3649 59629 : op = hStereoDft->stefi_short_gain_fx;
3650 59629 : move16();
3651 59629 : hStereoDft->stefi_long_gain_fx = Sqrt16( sub( MAX_16, mult( op, op ) ), &q_sqrt ); /* Q15 */
3652 59629 : IF( q_sqrt != 0 )
3653 : {
3654 2667 : hStereoDft->stefi_long_gain_fx = shl( hStereoDft->stefi_long_gain_fx, q_sqrt ); /* Q15 */
3655 : }
3656 : }
3657 :
3658 94982 : return;
3659 : }
3660 1418 : void stereo_dft_dec_sid_coh_fx(
3661 : Decoder_State *st, /* i/o: decoder state structure */
3662 : const Word16 nbands, /* i : number of DFT stereo bands Q0*/
3663 : Word16 *coh_fx, /* i/o: coherence Q15*/
3664 : Word16 *nb_bits /* i/o: number of bits read Q0*/
3665 : )
3666 : {
3667 : Word16 alpha_fx;
3668 : Word16 pred_fx;
3669 : Word16 pred_err_fx;
3670 : Word16 cohBandq_fx[STEREO_DFT_BAND_MAX];
3671 : const Word16 *pptr_fx;
3672 : Word16 nr_of_sid_stereo_bits;
3673 : Word16 i;
3674 : Word16 alpha_index;
3675 : Word16 alpha_step;
3676 : Word16 coh_pred_index;
3677 : Word16 res_index;
3678 : Word16 bits_tmp;
3679 : Word16 b;
3680 :
3681 1418 : nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; /* Q0 */
3682 1418 : move16();
3683 : /* If the coherence is not encoded due to lack of bits set alpha to zero which leads to that the coherence */
3684 : /* from the previous frame is used. */
3685 1418 : IF( sub( sub( nr_of_sid_stereo_bits, *nb_bits ), STEREO_DFT_N_COH_ALPHA_BITS - STEREO_DFT_PRED_NBITS ) > 0 )
3686 : {
3687 : /* Read coherence from bitstream */
3688 1418 : coh_pred_index = get_next_indice_fx( st, STEREO_DFT_PRED_NBITS ); /* Read predictor index Q0*/
3689 1418 : ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_PRED_NBITS );
3690 :
3691 1418 : alpha_index = get_next_indice_fx( st, STEREO_DFT_N_COH_ALPHA_BITS ); /* Read alpha index Q0*/
3692 1418 : ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_N_COH_ALPHA_BITS );
3693 :
3694 1418 : alpha_step = 0;
3695 1418 : move16();
3696 7090 : FOR( i = 0; i < STEREO_DFT_N_COH_ALPHA_STEPS - 1; i++ )
3697 : {
3698 5672 : IF( GT_16( sub( nr_of_sid_stereo_bits, *nb_bits ), dft_cng_coh_alpha_start[i] ) )
3699 : {
3700 5672 : alpha_step = i + 1;
3701 : }
3702 : }
3703 1418 : alpha_fx = dft_cng_alpha_bits_fx[alpha_step][alpha_index]; /* Q15 */
3704 1418 : move16();
3705 : }
3706 : ELSE
3707 : {
3708 0 : alpha_fx = 0;
3709 0 : coh_pred_index = 0;
3710 0 : move16();
3711 0 : move16();
3712 0 : FOR( i = *nb_bits; i < nr_of_sid_stereo_bits; i++ )
3713 : {
3714 0 : get_next_indice_fx( st, 1 );
3715 0 : ( *nb_bits )++;
3716 : }
3717 : }
3718 :
3719 1418 : pptr_fx = dft_cng_coh_pred_fx[coh_pred_index]; /*Q13*/
3720 1418 : pred_fx = 3276; /*Q13*/
3721 1418 : move16();
3722 1418 : move16();
3723 9610 : FOR( b = 0; b < nbands; b++ )
3724 : {
3725 : /* Intra-frame prediction */
3726 :
3727 27882 : FOR( i = 0; i < b; i++ )
3728 : {
3729 19690 : pred_fx = add( pred_fx, shl( mult( ( *pptr_fx++ ), cohBandq_fx[i] ), 2 ) ); /*q-13*/
3730 : }
3731 : /* Weighted intra/inter-frame prediction */
3732 8192 : pred_fx = add( mult( alpha_fx, pred_fx ), mult( sub( 32767, alpha_fx ), shr( coh_fx[b], 2 ) ) ); /*q-13*/
3733 :
3734 : /* Read residual index from bitstream */
3735 8192 : IF( LT_16( *nb_bits, nr_of_sid_stereo_bits ) ) /* If the bit limit is reached, res_index = 0 is assumed for remaining indices */
3736 : {
3737 8192 : bits_tmp = read_GR0( &st->bit_stream[st->next_bit_pos], &res_index, 1 ); /* Q0 */
3738 8192 : *nb_bits = add( *nb_bits, bits_tmp ); /* Q0 */
3739 8192 : st->next_bit_pos = add( st->next_bit_pos, bits_tmp ); /* Q0 */
3740 8192 : move16();
3741 8192 : move16();
3742 : }
3743 : ELSE
3744 : {
3745 0 : res_index = 0;
3746 0 : move16();
3747 : }
3748 :
3749 : /* Reconstruct */
3750 8192 : res_index = dft_cng_coh_u2i[res_index]; /* Q0 */
3751 8192 : move16();
3752 8192 : pred_err_fx = shr( usdequant_fx( res_index, -13107 /*Q-15*/, 1638 /*Q-14*/ ), 2 ); /* Q15 */
3753 8192 : cohBandq_fx[b] = add( pred_fx, pred_err_fx ); /* Store for intra-frame prediction */
3754 8192 : IF( GT_16( cohBandq_fx[b], 8192 ) )
3755 : {
3756 0 : cohBandq_fx[b] = 8192; /* Q13 */
3757 0 : move16();
3758 : }
3759 8192 : ELSE IF( cohBandq_fx[b] < 0 )
3760 : {
3761 178 : cohBandq_fx[b] = 0;
3762 178 : move16();
3763 : }
3764 8192 : coh_fx[b] = shl_sat( cohBandq_fx[b], 2 ); /* Update memory for next frame */ /* Q15 */
3765 8192 : move16();
3766 8192 : pred_fx = 0;
3767 8192 : move16();
3768 : }
3769 :
3770 : /* Remove padding bits */
3771 25160 : FOR( i = *nb_bits; i < nr_of_sid_stereo_bits; i++ )
3772 : {
3773 23742 : get_next_indice_fx( st, 1 );
3774 23742 : ( *nb_bits )++;
3775 : }
3776 1418 : return;
3777 : }
3778 28950 : void stereo_dft_dequantize_itd_fx(
3779 : Word16 *ind, /* Q0 */
3780 : Word32 *out_fx, /* Q15 */
3781 : const Word32 output_Fs /* Q0 */
3782 : )
3783 : {
3784 : Word16 itd;
3785 : Word16 mask;
3786 28950 : mask = ( 1 << ( STEREO_DFT_ITD_NBITS - 1 ) ) - 1; /* Q0 */
3787 28950 : move16();
3788 28950 : itd = s_and( ind[0], mask ) + STEREO_DFT_ITD_MIN; /* Q0 */
3789 :
3790 28950 : IF( shr( ind[0], ( STEREO_DFT_ITD_NBITS - 1 ) ) )
3791 : {
3792 18566 : itd = imult1616( -1, itd ); /* Q0 */
3793 : }
3794 28950 : assert( ( ABSVAL( itd ) <= STEREO_DFT_ITD_MAX ) && ( ABSVAL( itd ) >= STEREO_DFT_ITD_MIN ) );
3795 :
3796 : /*Convert back @ fs*/
3797 28950 : *out_fx = L_mult( itd, divide3232( output_Fs, STEREO_DFT_ITD_FS << 1 ) ); /*Q15*/
3798 28950 : move32();
3799 28950 : return;
3800 : }
3801 : /*-------------------------------------------------------------------------
3802 : * stereo_dft_dec_read_BS()
3803 : *
3804 : * Read bitstream
3805 : *-------------------------------------------------------------------------*/
3806 :
3807 52733 : void stereo_dft_dec_read_BS_fx(
3808 : const Word32 ivas_total_brate, /* i : IVAS total bitrate Q0*/
3809 : const Word32 element_brate, /* i : element bitrate Q0*/
3810 : Word32 *total_brate, /* o : total bitrate Q0*/
3811 : Decoder_State *st, /* i/o: decoder state structure */
3812 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */
3813 : const Word16 bwidth, /* i : bandwidth Q0*/
3814 : const Word16 output_frame, /* i : output frame length Q0*/
3815 : Word32 res_buf_fx[STEREO_DFT_N_8k], /* o : residual buffer Q0*/
3816 : Word16 *nb_bits, /* o : number of bits read Q0*/
3817 : Word16 *coh_fx, /* i/o: Coherence Q15*/
3818 : const Word16 ivas_format /* i : ivas format Q0*/
3819 : )
3820 : {
3821 : Word32 sg_tmp_fx[STEREO_DFT_BAND_MAX];
3822 : Word32 res_pred_gain_tmp_fx[STEREO_DFT_BAND_MAX];
3823 : Word16 b, N_div, nbands;
3824 : Word16 NFFT_inner;
3825 : Word16 k, k_offset;
3826 : Word16 I;
3827 : Word16 max_bits;
3828 : UWord16 bit_stream_side[800]; /*Max bits per frame for 30kbps*/
3829 : RangeUniDecState range_uni_dec_state;
3830 : ECSQ_instance ecsq_inst;
3831 :
3832 : /* needed for provisorial reordering of indices */
3833 : Word16 ind1[STEREO_DFT_BAND_MAX];
3834 : Word16 n_bits;
3835 : Word16 nb, ind1_ipd[STEREO_DFT_BAND_MAX], ind1_pred[STEREO_DFT_BAND_MAX];
3836 : Word16 sign_flag;
3837 : Word16 itd_mode;
3838 :
3839 : /*------------------------------------------------------------------*
3840 : * Initialization
3841 : *-----------------------------------------------------------------*/
3842 :
3843 52733 : k_offset = STEREO_DFT_OFFSET; /* Q0 */
3844 :
3845 52733 : move16();
3846 52733 : IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) )
3847 : {
3848 1492 : IF( EQ_16( ivas_format, MASA_FORMAT ) )
3849 : {
3850 74 : hStereoDft->frame_nodata = 0;
3851 74 : hStereoDft->frame_sid_nodata = 1;
3852 74 : hStereoDft->frame_sid = 1;
3853 74 : *nb_bits = 0;
3854 : }
3855 : ELSE
3856 : {
3857 1418 : hStereoDft->frame_nodata = 0;
3858 1418 : hStereoDft->frame_sid_nodata = 1;
3859 1418 : hStereoDft->frame_sid = 1;
3860 1418 : *nb_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; /* Q0 */
3861 : }
3862 1492 : move16();
3863 1492 : move16();
3864 1492 : move16();
3865 1492 : move16();
3866 : }
3867 51241 : ELSE IF( EQ_32( ivas_total_brate, FRAME_NO_DATA ) )
3868 : {
3869 8859 : hStereoDft->frame_nodata = 1;
3870 8859 : hStereoDft->frame_sid_nodata = 1;
3871 8859 : hStereoDft->frame_sid = 0;
3872 8859 : *nb_bits = 0;
3873 8859 : *total_brate = 0;
3874 8859 : hStereoDft->itd_fx[k = hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->itd_xfade_target_fx; /* Q15 */
3875 8859 : hStereoDft->gipd_fx[hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->ipd_xfade_target_fx; /* Q27 */
3876 :
3877 8859 : move16();
3878 8859 : move16();
3879 8859 : move16();
3880 8859 : move16();
3881 8859 : move32();
3882 8859 : move32();
3883 8859 : move32();
3884 8859 : return;
3885 : }
3886 : ELSE
3887 : {
3888 42382 : hStereoDft->frame_nodata = 0;
3889 42382 : hStereoDft->frame_sid_nodata = 0;
3890 42382 : hStereoDft->frame_sid = 0;
3891 42382 : move16();
3892 42382 : move16();
3893 42382 : move16();
3894 :
3895 42382 : st->total_brate = L_mult0( *nb_bits, FRAMES_PER_SEC ); /* Q0 */
3896 : }
3897 :
3898 43874 : hStereoDft->reverb_flag = 0;
3899 :
3900 43874 : move16();
3901 : /* reverse the bitstream */
3902 8057535 : FOR( b = 0; b < *nb_bits; b++ )
3903 : {
3904 8013661 : bit_stream_side[b] = st->bit_stream[-b]; /* Q0 */
3905 8013661 : move16();
3906 : }
3907 :
3908 : /* make sure the padding bits read ahead by the arithmetic coder (up to 16) or range coder (up to 32) have binary values */
3909 1447842 : FOR( ; b < *nb_bits + 32; b++ )
3910 : {
3911 1403968 : bit_stream_side[b] = 0;
3912 1403968 : move16();
3913 : }
3914 43874 : st->bit_stream = bit_stream_side; /* Q0 */
3915 :
3916 : /*init*/
3917 43874 : max_bits = *nb_bits; /* Q0 */
3918 43874 : *nb_bits = 0;
3919 43874 : N_div = STEREO_DFT_NBDIV; /* Q0 */
3920 :
3921 43874 : move16();
3922 43874 : move16();
3923 43874 : move16();
3924 43874 : IF( GT_32( ivas_total_brate, IVAS_SID_5k2 ) )
3925 : {
3926 42382 : Copy32( hStereoDft->side_gain_fx + 2 * STEREO_DFT_BAND_MAX, sg_tmp_fx, STEREO_DFT_BAND_MAX ); /*Q_31*/
3927 42382 : Copy32( hStereoDft->res_pred_gain_fx + 2 * STEREO_DFT_BAND_MAX, res_pred_gain_tmp_fx, STEREO_DFT_BAND_MAX ); /*Q_31*/
3928 : }
3929 :
3930 : /* attackPresent always set to 0 in SID frames */
3931 43874 : IF( hStereoDft->frame_sid )
3932 : {
3933 1492 : hStereoDft->attackPresent = 0;
3934 1492 : move16();
3935 : }
3936 : ELSE
3937 : {
3938 42382 : hStereoDft->attackPresent = get_next_indice_fx( st, 1 ); /* Q0 */
3939 42382 : ( *nb_bits ) = add( ( *nb_bits ), 1 );
3940 42382 : move16();
3941 42382 : move16();
3942 : }
3943 :
3944 : /* read res_cod_mode from bitstream */
3945 43874 : test();
3946 43874 : IF( EQ_16( bwidth, WB ) && hStereoDft->hConfig->ada_wb_res_cod_mode )
3947 : {
3948 3265 : hStereoDft->res_cod_mode[k_offset] = get_next_indice_fx( st, 1 ); /* Q0 */
3949 3265 : move16();
3950 3265 : ( *nb_bits ) = add( ( *nb_bits ), 1 );
3951 3265 : move16();
3952 : }
3953 :
3954 : /* read number of bands in the bitstream - depends on the audio bandwidth and not to output_Fs */
3955 43874 : IF( hStereoDft->frame_sid )
3956 : {
3957 1492 : NFFT_inner = imult1616( inner_frame_tbl[bwidth], STEREO_DFT32MS_N_MAX / L_FRAME48k ); /* Q0 */
3958 : }
3959 : ELSE
3960 : {
3961 42382 : NFFT_inner = imult1616( inner_frame_tbl[st->bwidth], STEREO_DFT32MS_N_MAX / L_FRAME48k ); /* Q0 */
3962 : }
3963 :
3964 : /* Use coarse band partition in inactive frames */
3965 43874 : IF( hStereoDft->frame_sid )
3966 : {
3967 1492 : hStereoDft->band_res[k_offset] = STEREO_DFT_BAND_RES_LOW; /* Q0 */
3968 1492 : hStereoDft->res_cod_mode[k_offset] = STEREO_DFT_RES_COD_OFF; /* Q0 */
3969 1492 : move16();
3970 1492 : move16();
3971 1492 : hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], s_min( STEREO_DFT32MS_N_MAX, NFFT_inner ), DEC ); /* Q0 */
3972 :
3973 1492 : IF( hStereoDft->nbands > STEREO_DFT_COH_MAXBAND )
3974 : {
3975 225 : hStereoDft->band_limits[STEREO_DFT_COH_MAXBAND] = hStereoDft->band_limits[hStereoDft->nbands]; /* Q0 */
3976 225 : hStereoDft->nbands = STEREO_DFT_COH_MAXBAND; /* Q0 */
3977 225 : move16();
3978 225 : move16();
3979 : }
3980 : }
3981 : ELSE
3982 : {
3983 42382 : hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, DEC ); /* Q0 */
3984 42382 : move16();
3985 : }
3986 :
3987 43874 : hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]]; /* Q0 */
3988 43874 : move16();
3989 43874 : hStereoDft->res_cod_line_max = (Word16) L_shr( L_add( ( 1 << Q13 ) /*0.5f Q-14*/, L_shl( L_mult0( sub( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ), divide1616( shr( output_frame, 1 ), ( hStereoDft->NFFT ) ) ) /*Q-14*/, 1 ) ), Q14 ); /* Q0 */
3990 43874 : move16();
3991 43874 : hStereoDft->res_cod_line_max = shl( shr( hStereoDft->res_cod_line_max, 3 ), 3 ); /* Q0 */
3992 43874 : move16();
3993 43874 : hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); /* Q0 */
3994 43874 : move16();
3995 :
3996 :
3997 : /*Copy config. for all DFT frames*/
3998 43874 : set16_fx( hStereoDft->band_res + add( k_offset, 1 ), hStereoDft->band_res[k_offset], sub( N_div, 1 ) );
3999 43874 : set16_fx( hStereoDft->prm_res + add( k_offset, 1 ), hStereoDft->prm_res[k_offset], sub( N_div, 1 ) );
4000 43874 : set16_fx( hStereoDft->res_pred_mode + add( k_offset, 1 ), hStereoDft->res_pred_mode[k_offset], sub( N_div, 1 ) );
4001 43874 : set16_fx( hStereoDft->res_cod_mode + add( k_offset, 1 ), hStereoDft->res_cod_mode[k_offset], sub( N_div, 1 ) );
4002 :
4003 : /*------------------------------------------------------------------*
4004 : * Read DFT stereo parameters
4005 : *-----------------------------------------------------------------*/
4006 :
4007 : /* Sent from the latest to the oldest */
4008 87748 : FOR( k = hStereoDft->prm_res[k_offset] - 1; k < N_div; k += hStereoDft->prm_res[k + k_offset] )
4009 : {
4010 : /* reset parameters */
4011 43874 : set_zero_fx( hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), STEREO_DFT_BAND_MAX );
4012 43874 : hStereoDft->gipd_fx[k + k_offset] = 0;
4013 43874 : move32();
4014 43874 : set_zero_fx( hStereoDft->res_pred_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), STEREO_DFT_BAND_MAX );
4015 :
4016 43874 : test();
4017 43874 : IF( !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) )
4018 : {
4019 : /*------------------------------------------------------------------*
4020 : * read Side gains
4021 : *-----------------------------------------------------------------*/
4022 :
4023 : /* side gain */
4024 : /* get coding type */
4025 : /* Do not read and decode side gain if a NO_DATA frame */
4026 43800 : IF( !hStereoDft->frame_nodata )
4027 : {
4028 43800 : n_bits = 0;
4029 43800 : nb = st->next_bit_pos;
4030 43800 : move16();
4031 43800 : move16();
4032 43800 : n_bits = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->side_gain_flag_1 ); /* Q0 */
4033 43800 : nb = add( nb, n_bits );
4034 :
4035 43800 : IF( hStereoDft->side_gain_flag_1 == 0 )
4036 : {
4037 34133 : b = read_BS_adapt_GR_sg( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2, dft_maps_sg ); /* Q0 */
4038 34133 : n_bits = add( n_bits, b ); /* Q0 */
4039 : }
4040 : ELSE
4041 : {
4042 9667 : IF( EQ_16( hStereoDft->side_gain_flag_1, 2 ) ) /* differential */
4043 : {
4044 8651 : b = read_BS_GR( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2 ); /* Q0 */
4045 8651 : n_bits = add( n_bits, b ); /* Q0 */
4046 87841 : FOR( b = 0; b < hStereoDft->nbands; b++ )
4047 : {
4048 79190 : ind1[b] = add( ind1[b], hStereoDft->side_gain_index_previous[b] ); /* Q0 */
4049 : }
4050 : }
4051 : ELSE
4052 : {
4053 6883 : FOR( b = 0; b < hStereoDft->nbands; b++ )
4054 : {
4055 5867 : ind1[b] = get_value( &st->bit_stream[nb], STEREO_DFT_SIDEGAIN_NBITS ); /* Q0 */
4056 5867 : nb = add( nb, STEREO_DFT_SIDEGAIN_NBITS ); /* Q0 */
4057 5867 : n_bits = add( n_bits, STEREO_DFT_SIDEGAIN_NBITS ); /* Q0 */
4058 : }
4059 : }
4060 : }
4061 :
4062 456699 : FOR( b = 0; b < hStereoDft->nbands; b++ )
4063 : {
4064 412899 : hStereoDft->side_gain_index_previous[b] = ind1[b]; /* Q0 */
4065 412899 : move16();
4066 412899 : hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX] = L_shl_sat( ind1[b], 26 ); /* Q26 */
4067 412899 : move32();
4068 : }
4069 :
4070 43800 : st->next_bit_pos = add( st->next_bit_pos, n_bits ); /* Q0 */
4071 43800 : ( *nb_bits ) = add( ( *nb_bits ), n_bits );
4072 43800 : move16();
4073 43800 : move16();
4074 : }
4075 :
4076 : /*------------------------------------------------------------------*
4077 : * read ITDs
4078 : *-----------------------------------------------------------------*/
4079 :
4080 43800 : IF( !hStereoDft->frame_sid_nodata )
4081 : {
4082 42382 : itd_mode = get_next_indice_fx( st, STEREO_DFT_ITD_MODE_NBITS ); /* Q0 */
4083 42382 : ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_ITD_MODE_NBITS ); /*ITD mode flag: 1bit Q0*/
4084 42382 : move16();
4085 42382 : hStereoDft->itd_fx[k + k_offset] = 0;
4086 42382 : move32();
4087 42382 : IF( itd_mode )
4088 : {
4089 25539 : ( *nb_bits ) = add( ( *nb_bits ), read_itd( st, &I ) ); /* Q0 */
4090 25539 : move16();
4091 25539 : stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + add( k, k_offset ), st->output_Fs );
4092 : }
4093 : }
4094 1418 : ELSE IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_ITD_MODE_NBITS - STEREO_DFT_SID_ITD_NBITS - 1 - SID_FORMAT_NBITS ) ) )
4095 : {
4096 1418 : itd_mode = get_next_indice_fx( st, STEREO_DFT_ITD_MODE_NBITS ); /* Q0 */
4097 1418 : ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_ITD_MODE_NBITS ); /*ITD mode flag: 1bit*/
4098 1418 : move16();
4099 :
4100 1418 : hStereoDft->itd_fx[k + k_offset] = 0; /* Q0 */
4101 1418 : move32();
4102 1418 : IF( itd_mode )
4103 : {
4104 23 : sign_flag = get_next_indice_fx( st, 1 ); /* Q0 */
4105 23 : I = get_next_indice_fx( st, STEREO_DFT_SID_ITD_NBITS ); /* Q0 */
4106 23 : ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_SID_ITD_NBITS + 1 ); /* Q0 */
4107 23 : move16();
4108 23 : I = shl( I, STEREO_DFT_SID_ITD_FAC ); /* Q0 */
4109 23 : I = add( I, shl( sign_flag, 8 ) ); /* Q0 */
4110 23 : stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + add( k, k_offset ), st->output_Fs );
4111 : }
4112 : }
4113 :
4114 : /*------------------------------------------------------------------*
4115 : * read IPDs
4116 : *-----------------------------------------------------------------*/
4117 :
4118 43800 : n_bits = 0;
4119 43800 : move16();
4120 43800 : nb = st->next_bit_pos; /* Q0 */
4121 43800 : move16();
4122 :
4123 43800 : IF( !hStereoDft->frame_sid_nodata )
4124 : {
4125 : /* Active frame */
4126 42382 : hStereoDft->no_ipd_flag = st->bit_stream[nb]; /* Q0 */
4127 42382 : move16();
4128 42382 : nb = add( nb, 1 ); /* Q0 */
4129 42382 : n_bits = add( n_bits, 1 ); /* Q0 */
4130 42382 : IF( hStereoDft->no_ipd_flag == 0 )
4131 : {
4132 3953 : ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_GIPD_NBITS ); /* Q0 */
4133 3953 : move16();
4134 3953 : nb = add( nb, STEREO_DFT_GIPD_NBITS ); /* Q0 */
4135 3953 : n_bits = add( n_bits, STEREO_DFT_GIPD_NBITS ); /* Q0 */
4136 3953 : stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + add( k, k_offset ), STEREO_DFT_GIPD_NBITS );
4137 : }
4138 : }
4139 1418 : ELSE IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_FLAG_BITS - STEREO_DFT_SID_GIPD_NBITS - SID_FORMAT_NBITS ) ) )
4140 : {
4141 : /* SID frame, only read IPD only if enough bits left in bitstream */
4142 1418 : hStereoDft->no_ipd_flag = st->bit_stream[nb]; /* Q0 */
4143 1418 : move16();
4144 1418 : nb = add( nb, 1 ); /* Q0 */
4145 1418 : n_bits = add( n_bits, 1 ); /* Q0 */
4146 1418 : IF( hStereoDft->no_ipd_flag == 0 )
4147 : {
4148 271 : ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_SID_GIPD_NBITS ); /* Q0 */
4149 271 : move16();
4150 271 : nb = add( nb, STEREO_DFT_SID_GIPD_NBITS ); /* Q0 */
4151 271 : n_bits = add( n_bits, STEREO_DFT_SID_GIPD_NBITS ); /* Q0 */
4152 271 : stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + add( k, k_offset ), STEREO_DFT_SID_GIPD_NBITS );
4153 : }
4154 : }
4155 : ELSE
4156 : {
4157 0 : hStereoDft->no_ipd_flag = 1; /* Q0 */
4158 0 : move16();
4159 : }
4160 :
4161 43800 : st->next_bit_pos = add( st->next_bit_pos, n_bits ); /* Q0 */
4162 43800 : ( *nb_bits ) = add( ( *nb_bits ), n_bits ); /* Q0 */
4163 43800 : move16();
4164 43800 : move16();
4165 :
4166 : /*------------------------------------------------------------------*
4167 : * read Residual parameters
4168 : *-----------------------------------------------------------------*/
4169 :
4170 : /* Residual prediction */ /* Switch it off if ITD detected */
4171 43800 : n_bits = 0;
4172 43800 : nb = st->next_bit_pos; /* Q0 */
4173 43800 : move16();
4174 43800 : move16();
4175 :
4176 : /* Not used in inactive frames */
4177 43800 : IF( !hStereoDft->frame_sid_nodata )
4178 : {
4179 42382 : test();
4180 42382 : IF( hStereoDft->res_pred_mode[k + k_offset] && hStereoDft->attackPresent == 0 )
4181 : {
4182 40860 : nbands = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); /* Q0 */
4183 :
4184 40860 : hStereoDft->reverb_flag = 0;
4185 40860 : hStereoDft->nbands_respred = nbands; /* Q0 */
4186 40860 : move16();
4187 40860 : move16();
4188 :
4189 : /* Read bit for adaptive SF (WB/SWB & FB) */
4190 40860 : IF( EQ_16( hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) )
4191 : {
4192 24611 : hStereoDft->reverb_flag = get_next_indice_fx( st, STEREO_DFT_REVERB_MODE_NBITS ); /* Q0 */
4193 24611 : ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_REVERB_MODE_NBITS ); /* Q0 */
4194 24611 : move16();
4195 24611 : move16();
4196 24611 : nb = add( nb, STEREO_DFT_REVERB_MODE_NBITS ); /* Q0 */
4197 24611 : IF( hStereoDft->reverb_flag )
4198 : {
4199 6479 : nbands = sub( nbands, STEREO_DFT_RES_PRED_BAND_MIN_CONST ); /* Q0 */
4200 : }
4201 : }
4202 :
4203 : /* get coding type */
4204 40860 : b = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->res_pred_flag_0 ); /* Q0 */
4205 40860 : nb = add( nb, b ); /* Q0 */
4206 40860 : n_bits = add( n_bits, b ); /* Q0 */
4207 :
4208 40860 : IF( hStereoDft->res_pred_flag_0 == 0 )
4209 : {
4210 8245 : b = read_BS_adapt_GR_rpg( st->bit_stream, nb, ind1_pred, hStereoDft->res_pred_band_min, nbands, &hStereoDft->res_pred_flag_1 ); /* Q0 */
4211 8245 : n_bits = add( n_bits, b ); /* Q0 */
4212 : }
4213 : ELSE
4214 : {
4215 32615 : IF( EQ_16( hStereoDft->res_pred_flag_0, 2 ) )
4216 : {
4217 29391 : 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 ); /* Q0 */
4218 :
4219 29391 : n_bits = add( n_bits, b ); /* Q0 */
4220 235575 : FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
4221 : {
4222 206184 : ind1_pred[b] = add( ind1_pred[b], hStereoDft->res_pred_index_previous[b] ); /* Q0 */
4223 206184 : move16();
4224 : }
4225 : }
4226 : ELSE
4227 : {
4228 22581 : FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
4229 : {
4230 19357 : ind1_pred[b] = get_value( &st->bit_stream[nb], STEREO_DFT_RES_GAINS_BITS ); /* Q0 */
4231 19357 : move16();
4232 19357 : nb = add( nb, STEREO_DFT_RES_GAINS_BITS ); /* Q0 */
4233 19357 : n_bits = add( n_bits, STEREO_DFT_RES_GAINS_BITS ); /* Q0 */
4234 : }
4235 : }
4236 : }
4237 :
4238 122105 : FOR( b = 0; b < hStereoDft->res_pred_band_min; b++ )
4239 : {
4240 81245 : I = 0;
4241 81245 : move16();
4242 81245 : stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
4243 81245 : hStereoDft->res_pred_index_previous[b] = I; /* Q0 */
4244 81245 : move16();
4245 81245 : hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; /* Q26 */
4246 81245 : move32();
4247 : }
4248 :
4249 323079 : FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
4250 : {
4251 282219 : I = ind1_pred[b]; /* Q0 */
4252 282219 : move16();
4253 282219 : stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
4254 282219 : hStereoDft->res_pred_index_previous[b] = I; /* Q0 */
4255 282219 : move16();
4256 282219 : hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl_sat( I, 26 ); /* Q26 */
4257 282219 : move32();
4258 : }
4259 :
4260 67938 : FOR( ; b < hStereoDft->nbands; b++ )
4261 : {
4262 27078 : I = 0;
4263 27078 : move16();
4264 27078 : stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
4265 27078 : move16();
4266 27078 : hStereoDft->res_pred_index_previous[b] = I; /* Q0 */
4267 27078 : move16();
4268 27078 : hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; /* Q26 */
4269 27078 : move32();
4270 : }
4271 : }
4272 : ELSE
4273 : {
4274 15687 : FOR( b = 0; b < hStereoDft->nbands; b++ )
4275 : {
4276 14165 : I = 0;
4277 14165 : move16();
4278 14165 : stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
4279 14165 : hStereoDft->res_pred_index_previous[b] = I; /* Q0 */
4280 14165 : move16();
4281 14165 : hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl_sat( I, 26 ); /* Q26 */
4282 14165 : move32();
4283 : }
4284 : }
4285 :
4286 42382 : st->next_bit_pos = add( st->next_bit_pos, n_bits ); /* Q0 */
4287 42382 : ( *nb_bits ) = add( ( *nb_bits ), n_bits ); /* Q0 */
4288 42382 : move16();
4289 42382 : move16();
4290 : }
4291 : ELSE
4292 : {
4293 : /* Dequantize sidegain if SID frame */
4294 1418 : IF( hStereoDft->frame_sid )
4295 : {
4296 9610 : FOR( b = 0; b < hStereoDft->nbands; b++ )
4297 : {
4298 8192 : I = 0;
4299 8192 : move16();
4300 8192 : stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 );
4301 : }
4302 : }
4303 : }
4304 : }
4305 : }
4306 :
4307 43874 : test();
4308 43874 : IF( !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) )
4309 : {
4310 43800 : IF( NE_16( hStereoDft->side_gain_flag_1, 2 ) )
4311 : {
4312 35149 : hStereoDft->sg_mem_corrupt = 0;
4313 35149 : move16();
4314 : }
4315 : }
4316 :
4317 43874 : IF( GT_32( ivas_total_brate, IVAS_SID_5k2 ) )
4318 : {
4319 : // hStereoDft->recovery_flg = stereo_dft_sg_recovery( hStereoDft );
4320 42382 : hStereoDft->recovery_flg = stereo_dft_sg_recovery_fx( hStereoDft ); /* Q0 */
4321 :
4322 42382 : IF( hStereoDft->recovery_flg )
4323 : {
4324 8 : Copy32( sg_tmp_fx, hStereoDft->side_gain_fx + 2 * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); /* Q31 */
4325 8 : Copy32( res_pred_gain_tmp_fx, hStereoDft->res_pred_gain_fx + 2 * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); /* Q31 */
4326 : }
4327 : }
4328 :
4329 : /*----------------------------------------------------------------*
4330 : * Residual decoding: spectral lines
4331 : *----------------------------------------------------------------*/
4332 :
4333 : /* Residual coding not used in inactive frames */
4334 43874 : test();
4335 43874 : IF( hStereoDft->res_cod_band_max > 0 && !hStereoDft->frame_sid_nodata )
4336 : {
4337 : Word16 dec[STEREO_DFT_N_MAX_RES];
4338 :
4339 16830 : I = get_next_indice_fx( st, STEREO_DFT_RES_GLOBAL_GAIN_BITS ); /* Q0 */
4340 16830 : ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_RES_GLOBAL_GAIN_BITS ); /* Q0 */
4341 16830 : move16();
4342 16830 : move16();
4343 :
4344 16830 : push_wmops( "residual_decode" );
4345 16830 : IF( I != ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO )
4346 : {
4347 16373 : ECSQ_init_instance_fx( &ecsq_inst, 0 /*dummy index*/, &range_uni_dec_state );
4348 :
4349 16373 : rc_uni_dec_init_fx( &range_uni_dec_state, bit_stream_side + *nb_bits, max_bits - *nb_bits );
4350 :
4351 16373 : hStereoDft->res_global_gain_fx = ECSQ_dequantize_gain_fx( I ); /* Q15 */
4352 16373 : move32();
4353 : #ifdef DEBUGGING
4354 : dbgwrite_txt( (const float *) ( &hStereoDft->res_global_gain_fx ), 1, "fixed_res_global_gain.txt", NULL );
4355 : #endif
4356 :
4357 16373 : ecsq_inst.config_index = sub( shl( hStereoDft->res_cod_mode[k_offset], 1 ), 1 ); /* Q0 */
4358 16373 : move16();
4359 :
4360 16373 : ECSQ_decode( &ecsq_inst, hStereoDft->res_cod_line_max, dec );
4361 :
4362 16373 : n_bits = rc_uni_dec_virtual_finish_fx( &range_uni_dec_state ); /* Q0 */
4363 :
4364 :
4365 16373 : set_zero_fx( res_buf_fx, STEREO_DFT_N_8k );
4366 671293 : FOR( Word16 c = 0; c < hStereoDft->res_cod_line_max; c++ )
4367 : {
4368 654920 : dec[c] = shl_sat( dec[c], 8 ); /* Q0 */
4369 654920 : move16();
4370 : }
4371 :
4372 16373 : ECSQ_dequantize_vector_fx( dec, hStereoDft->res_global_gain_fx, hStereoDft->res_cod_line_max, res_buf_fx );
4373 :
4374 : #ifdef DEBUGGING
4375 : dbgwrite_txt( (const float *) res_buf_fx, hStereoDft->res_cod_line_max, "fixed_res_buf.txt", NULL );
4376 : #endif
4377 : }
4378 : ELSE
4379 : {
4380 457 : set16_fx( dec, 0, hStereoDft->res_cod_line_max );
4381 457 : hStereoDft->res_global_gain_fx = 0;
4382 457 : n_bits = 0;
4383 457 : move32();
4384 457 : move16();
4385 457 : set_zero_fx( res_buf_fx, STEREO_DFT_N_8k );
4386 : }
4387 :
4388 16830 : ( *nb_bits ) = add( ( *nb_bits ), n_bits ); /* Q0 */
4389 16830 : pop_wmops();
4390 : }
4391 :
4392 43874 : test();
4393 43874 : test();
4394 43874 : IF( hStereoDft->frame_sid && !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) )
4395 : {
4396 1418 : stereo_dft_dec_sid_coh_fx( st, hStereoDft->nbands, coh_fx, nb_bits );
4397 : }
4398 :
4399 43874 : test();
4400 43874 : IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_16( ivas_format, MASA_FORMAT ) )
4401 : {
4402 1418 : *nb_bits = (Word16) Mult_32_16( L_sub( element_brate, SID_2k40 ), INV_FRAME_PER_SEC_Q15 ); /* => hCPE->hCoreCoder[0]->total_brate = SID_2k40; Q0*/
4403 1418 : move16();
4404 : }
4405 : {
4406 43874 : *total_brate = L_sub( element_brate, L_mult0( *nb_bits, FRAMES_PER_SEC ) ); /* Q0 */
4407 43874 : move32();
4408 : }
4409 43874 : return;
4410 : }
|