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.q_inp
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_enc.h"
39 : #include "rom_com.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_enc.h"
46 : #include "wmc_auto.h"
47 :
48 :
49 : /*-------------------------------------------------------------------*
50 : * Local constants
51 : *-------------------------------------------------------------------*/
52 :
53 : #define STEREO_DFT_NRG_PAST_MAX_BAND 9
54 : #define STEREO_DFT_NRG_PAST_MAX_BAND_LB 4
55 : #define STEREO_DFT_DMX_CROSSOVER ( int16_t )( 132 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) + 0.5f ) /* crossover bin between binwise and bandwise DMX */
56 : #define ITD_VAD_E_BAND_N_INIT 200000
57 : #define ITD_SID_PREV_FRAMES 5
58 :
59 :
60 : /*-------------------------------------------------------------------------
61 : * Local function prototypes
62 : *------------------------------------------------------------------------*/
63 :
64 : static void stereo_dft_enc_open_fx( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, const Word32 input_Fs, const Word16 max_bwidth );
65 :
66 : static void stereo_dft_enc_compute_prm_fx(
67 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
68 : Word32 *DFT_L_fx, // Q(31-DFT_L_fx_e[])
69 : Word16 *DFT_L_fx_e,
70 : Word32 *DFT_R_fx, // Q(31-DFT_R_fx_e[])
71 : Word16 *DFT_R_fx_e,
72 : Word16 k_offset,
73 : Word16 flag_quant,
74 : const Word16 sp_aud_decision0,
75 : const Word16 vad_flag,
76 : Word32 *bin_nrgL_fx, // Q(31-bin_nrgL_fx_e[])
77 : Word16 *bin_nrgL_fx_e,
78 : Word32 *bin_nrgR_fx, // Q(31-bin_nrgR_fx_e[])
79 : Word16 *bin_nrgR_fx_e,
80 : Word32 *dot_prod_nrg_ratio_fx, // Q(31-dot_prod_nrg_ratio_fx_e[])
81 : Word16 *dot_prod_nrg_ratio_fx_e );
82 :
83 : static Word32 stereo_dft_calc_mean_bipd_fx( Word32 *pIpd, Word32 ipd_buf[STEREO_DFT_IPD_BUF_LEN] );
84 :
85 : static Word32 stereo_dft_calc_mean_ipd_change_fx(
86 : Word32 *pIpd, /* i : bandwise IPDs Q13 */
87 : Word32 *ipd_smooth, /* i : mean of previous bandwise IPDs Q13 */
88 : Word16 gipd_band_max /* i : number of IPD bands */
89 : );
90 :
91 : static void stereo_dft_gipd_stabilization_fx(
92 : Word32 *pgIpd, /* i/o: global IPD to be stabilized Q13 */
93 : Word32 prev_gipd, /* i : previous global IPD Q13 */
94 : Word32 ipd_mean_change /* i : mean of previous bandwise IPDs Q13 */
95 : );
96 :
97 : static void stereo_dft_enc_get_nipd_flag_fx( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, const Word16 sp_aud_decision0, const Word32 gainIPD );
98 :
99 : static void stereo_dft_enc_get_reverb_flag_fx( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, Word32 *pPredGain, Word32 *sub_nrg_DMX, Word16 *sub_nrg_DMX_e, const Word32 *sub_nrg_L, const Word16 *sub_nrg_L_e, const Word32 *sub_nrg_R, const Word16 *sub_nrg_R_e, const Word16 k_offset, const Word32 *bin_nrgL, const Word16 *bin_nrgL_e, const Word32 *bin_nrgR, const Word16 *bin_nrgR_e );
100 :
101 : static Word32 stereo_dft_gain_offset_fx( const Word32 c, const Word16 c_e, const Word16 itd );
102 :
103 : static void side_gain_mode_decision_fx(
104 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i : DFT stereo encoder handle */
105 : Word16 encoded_ind_GR[],
106 : const Word16 sp_aud_decision0, /* i : Speech/audio decision 0 */
107 : const Word32 last_core_brate /* i : Last core bitrate */
108 : );
109 :
110 : static void res_pred_gain_mode_decision_fx(
111 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i : DFT stereo encoder handle */
112 : Word16 encoded_ind_pred_GR[],
113 : const Word16 k_offset, /* i : Parameter offset */
114 : const Word32 last_core_brate /* i : Last core bitrate */
115 : );
116 :
117 : static void stereo_dft_enc_calculate_nrg_for_icbwe_fx(
118 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle */
119 : const Word16 *DFT_L_e,
120 : const Word16 *DFT_R_e,
121 : const Word32 *DMX, /* i : DFT Stereo downmix Q(31-DMX_e[]) */
122 : const Word16 *DMX_e, /* i : DFT Stereo downmix */
123 : const Word32 input_Fs /* i : input sampling rate */
124 : );
125 :
126 : static void stereo_dft_enc_get_res_cod_mode_flag_fx(
127 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
128 : const Word32 res_nrg_all_curr,
129 : const Word16 res_nrg_all_curr_e,
130 : const Word32 dmx_nrg_all_curr,
131 : const Word16 dmx_nrg_all_curr_e,
132 : Word32 *res_dmx_ratio, // Q31
133 : Word32 *frame_nrg_ratio ); // Q28
134 :
135 : /*-------------------------------------------------------------------------
136 : * stereo_dft_quantize_res_gains()
137 : *
138 : * Joint quantization routine for residual gains
139 : *------------------------------------------------------------------------*/
140 556745 : void stereo_dft_quantize_res_gains_fx(
141 : const Word32 *g, // Q31
142 : const Word32 *r, // Q31
143 : Word32 *gq, // Q31
144 : Word32 *rq, // Q31
145 : Word16 *ig,
146 : Word16 *ir )
147 : {
148 : Word8 sign;
149 : Word16 min_ind, i;
150 : Word32 min_val, old_val, gg, rr;
151 : Word16 level, index;
152 : Word32 ild; // Q25
153 : Word32 L_tmp;
154 : Word16 L_tmp_e;
155 :
156 556745 : gg = *g;
157 556745 : move32();
158 :
159 556745 : IF( rq != NULL )
160 : {
161 547863 : rr = *r;
162 547863 : move32();
163 : }
164 : ELSE
165 : {
166 8882 : rr = 0;
167 8882 : move32();
168 : }
169 :
170 556745 : IF( gg < 0 )
171 : {
172 352285 : gg = L_negate( gg );
173 352285 : sign = -1;
174 352285 : move16();
175 : }
176 : ELSE
177 : {
178 204460 : sign = 1;
179 204460 : move16();
180 : }
181 :
182 :
183 : // gg = min(gg, 1 - EPSILON);
184 : // rr = min(rr, sqrtf(1 - gg * gg) - EPSILON);
185 556745 : L_tmp = L_sub( MAX_32, Mpy_32_32( gg, gg ) );
186 556745 : L_tmp_e = 0;
187 556745 : move16();
188 556745 : L_tmp = Sqrt32( L_tmp, &L_tmp_e );
189 556745 : L_tmp = L_shl( L_tmp, L_tmp_e ); // Q31
190 556745 : rr = L_min( rr, L_tmp );
191 :
192 : /* we calculate the ILD ... */
193 : // ild = 10.f * log10f(((1 + gg) * (1 + gg) + rr * rr) / ((1 - gg) * (1 - gg) + rr * rr));
194 556745 : ild = L_add( Mpy_32_32( L_add( ONE_IN_Q30, L_shr( gg, 1 ) ), L_add( ONE_IN_Q30, L_shr( gg, 1 ) ) ), L_shr_r( Mpy_32_32( rr, rr ), 2 ) ); // Q29
195 556745 : ild = BASOP_Util_Log10( ild, 2 ); // Q25
196 556745 : L_tmp = L_add( L_shr( Mpy_32_32( L_sub( MAX_32, gg ), L_sub( MAX_32, gg ) ), 1 ), L_shr( Mpy_32_32( rr, rr ), 1 ) ); // Q30
197 556745 : L_tmp = BASOP_Util_Log10( L_tmp, 1 ); // Q25
198 556745 : ild = L_sub( ild, L_tmp );
199 556745 : ild = W_extract_h( W_shl( W_mult0_32_32( 10, ild ), 32 ) );
200 :
201 : /* ... which is truncated to the range [0,50] ... */
202 : // ild = ild > 50 ? 50 : ild;
203 556745 : ild = L_min( 1677721600 /*50*/, ild );
204 :
205 : /* ... and determine the optimal ILD quantization ...*/
206 556745 : min_ind = 0;
207 556745 : move16();
208 : // old_val = fabsf(ild_q[0] - ild);
209 556745 : old_val = L_abs( L_sub( ild_q_Q25[0], ild ) );
210 :
211 1594685 : FOR( i = 1; i < 16; i++ )
212 : {
213 : // min_val = fabsf(ild_q[i] - ild);
214 1593229 : min_val = L_abs( L_sub( ild_q_Q25[i], ild ) );
215 1593229 : IF( LT_32( min_val, old_val ) )
216 : {
217 1037940 : min_ind = i;
218 1037940 : move16();
219 : }
220 : ELSE
221 : {
222 555289 : BREAK;
223 : }
224 1037940 : old_val = min_val;
225 1037940 : move32();
226 : }
227 :
228 : /* ... which determines the quantization level: */
229 556745 : level = min_ind;
230 556745 : move16();
231 :
232 : /* Now we look for the closest quantization point in the corresponding column of res_gain_energy_q*/
233 : // old_val = FLT_MAX;
234 556745 : old_val = MAX_32;
235 556745 : move32();
236 556745 : min_ind = 0;
237 556745 : move16();
238 556745 : index = -1;
239 556745 : move16();
240 5010705 : FOR( i = 0; i < 8; i++ )
241 : {
242 : // min_val = (gg - dft_res_gains_q[8 * level + i][0]) * (gg - dft_res_gains_q[8 * level + i][0]) + (rr - dft_res_gains_q[8 * level + i][1]) * (rr - dft_res_gains_q[8 * level + i][1]);
243 4453960 : min_val = L_add_sat( Mpy_32_32( L_sub( gg, dft_res_gains_q_fx[8 * level + i][0] ), L_sub( gg, dft_res_gains_q_fx[8 * level + i][0] ) ), Mpy_32_32( L_sub( rr, dft_res_gains_q_fx[8 * level + i][1] ), L_sub( rr, dft_res_gains_q_fx[8 * level + i][1] ) ) ); // saturation is expected
244 :
245 : // min_ind = min_val < old_val ? i : min_ind;
246 : // old_val = min_val < old_val ? min_val : old_val;
247 4453960 : IF( LT_32( min_val, old_val ) )
248 : {
249 1979608 : min_ind = i;
250 1979608 : move16();
251 1979608 : old_val = min_val;
252 1979608 : move32();
253 : }
254 :
255 4453960 : index = min_ind;
256 4453960 : move16();
257 : }
258 :
259 : /* and here we are: */
260 556745 : IF( rq != NULL )
261 : {
262 : //*gq = dft_res_gains_q[8 * level + index][0] * sign;
263 547863 : *gq = W_extract_l( W_mult0_32_32( dft_res_gains_q_fx[8 * level + index][0], sign ) );
264 547863 : move32();
265 : //*rq = dft_res_gains_q[8 * level + index][1];
266 547863 : *rq = dft_res_gains_q_fx[8 * level + index][1];
267 547863 : move32();
268 :
269 547863 : *ir = index;
270 547863 : move16();
271 : }
272 : //*ig = sign < 0 ? 15 - level : 15 + level;
273 556745 : IF( sign < 0 )
274 : {
275 352285 : *ig = sub( 15, level );
276 352285 : move16();
277 : }
278 : ELSE
279 : {
280 204460 : *ig = add( 15, level );
281 204460 : move16();
282 : }
283 :
284 556745 : return;
285 : }
286 :
287 :
288 : /*-------------------------------------------------------------------------
289 : * stereo_dft_quantize_ipd()
290 : *
291 : * Quantize the IPD between [-PI, PI] on 3 or 4 bits
292 : *------------------------------------------------------------------------*/
293 6386 : static void stereo_dft_quantize_ipd_fx(
294 : const Word32 *in, // Q13
295 : Word32 *out, // Q13
296 : Word16 *ind,
297 : const Word16 bits )
298 : {
299 : Word16 max_ind;
300 : Word32 delta;
301 : Word16 tmp, tmp_e;
302 :
303 6386 : IF( EQ_16( bits, 2 ) ) /* New 2-bit phase quantization for the highest frequency band only */
304 : {
305 275 : delta = EVS_PI_FX / 2;
306 275 : move16();
307 275 : max_ind = 3;
308 275 : move16();
309 : }
310 6111 : ELSE IF( EQ_16( bits, 3 ) )
311 : {
312 0 : delta = EVS_PI_FX / 4;
313 0 : move16();
314 0 : max_ind = 7;
315 0 : move16();
316 : }
317 6111 : ELSE IF( EQ_16( bits, 4 ) )
318 : {
319 6111 : delta = EVS_PI_FX / 8;
320 6111 : move16();
321 6111 : max_ind = 15;
322 6111 : move16();
323 : }
324 : ELSE
325 : {
326 0 : delta = EVS_PI_FX / 4;
327 0 : move16();
328 0 : max_ind = 7;
329 0 : move16();
330 0 : assert( 0 );
331 : }
332 :
333 : //*ind = (int16_t)(((*in + EVS_PI) / delta) + 0.5f);
334 6386 : tmp = BASOP_Util_Divide3232_Scale( L_add( *in, EVS_PI_FX ), delta, &tmp_e );
335 6386 : *ind = shr_r( tmp, sub( 15, tmp_e ) ); // Q0
336 6386 : move16();
337 :
338 : /*modulo 2*PI*/
339 6386 : if ( EQ_16( *ind, add( max_ind, 1 ) ) )
340 : {
341 103 : *ind = 0;
342 103 : move16();
343 : }
344 :
345 : /*Sanity check since no saturation can normally happen*/
346 6386 : *ind = s_min( s_max( *ind, 0 ), max_ind );
347 6386 : move16();
348 :
349 6386 : *out = L_sub( L_mult0( *ind, extract_l( delta ) ), EVS_PI_FX ); // Q13
350 6386 : move32();
351 :
352 6386 : return;
353 : }
354 :
355 : /*-------------------------------------------------------------------------
356 : * stereo_dft_enc_create()
357 : *
358 : * Create DFT stereo handle
359 : *------------------------------------------------------------------------*/
360 :
361 879 : ivas_error stereo_dft_enc_create_fx(
362 : STEREO_DFT_ENC_DATA_HANDLE *hStereoDft, /* i/o: encoder DFT stereo handle */
363 : const Word32 input_Fs, /* i : input sampling rate */
364 : const Word16 max_bwidth /* i : maximum encoded bandwidth */
365 : )
366 : {
367 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft_loc;
368 : Word16 tmpS;
369 :
370 879 : IF( *hStereoDft != NULL )
371 : {
372 0 : return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: DFT Stereo memory already allocated\n" );
373 : }
374 :
375 879 : IF( ( hStereoDft_loc = (STEREO_DFT_ENC_DATA_HANDLE) malloc( sizeof( STEREO_DFT_ENC_DATA ) ) ) == NULL )
376 : {
377 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo\n" ) );
378 : }
379 :
380 879 : IF( ( hStereoDft_loc->hConfig = (STEREO_DFT_CONFIG_DATA_HANDLE) malloc( sizeof( STEREO_DFT_CONFIG_DATA ) ) ) == NULL )
381 : {
382 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DFT Stereo Config\n" ) );
383 : }
384 :
385 879 : IF( ( hStereoDft_loc->hItd = (ITD_DATA_HANDLE) malloc( sizeof( ITD_DATA ) ) ) == NULL )
386 : {
387 0 : return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ITD data\n" ) );
388 : }
389 :
390 879 : hStereoDft_loc->hConfig->force_mono_transmission = 0;
391 879 : move16();
392 :
393 879 : stereo_dft_config_fx( hStereoDft_loc->hConfig, IVAS_24k4, &tmpS, &tmpS );
394 :
395 879 : stereo_dft_enc_open_fx( hStereoDft_loc, input_Fs, max_bwidth );
396 :
397 879 : stereo_dft_hybrid_ITD_flag_fx( hStereoDft_loc->hConfig, input_Fs,
398 879 : hStereoDft_loc->hItd->hybrid_itd_max );
399 :
400 879 : *hStereoDft = hStereoDft_loc;
401 :
402 879 : return IVAS_ERR_OK;
403 : }
404 :
405 :
406 : /*-------------------------------------------------------------------------
407 : * stereo_dft_enc_open()
408 : *
409 : * Initialize DFT stereo handle
410 : *------------------------------------------------------------------------*/
411 :
412 879 : static void stereo_dft_enc_open_fx(
413 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle */
414 : const Word32 input_Fs, /* i : input sampling rate */
415 : const Word16 max_bwidth /* i : maximum encoded bandwidth */
416 : )
417 : {
418 : Word16 NFFT_inner;
419 : PWord16 win_p[STEREO_DFT_OVL_MAX];
420 : Word16 win[STEREO_DFT_OVL_MAX];
421 : Word32 L_tmp;
422 : Word16 tmp, tmp_e;
423 :
424 : /*Sizes*/
425 :
426 879 : hStereoDft->N = extract_l( Mpy_32_32( input_Fs, 42949673 /* STEREO_DFT_HOP_MAX_ENC / 48000 in Q31 */ ) );
427 879 : move16();
428 879 : assert( ( ( input_Fs / FRAMES_PER_SEC ) / hStereoDft->N ) == 1 );
429 :
430 : /*Init. DFT sizes*/
431 879 : hStereoDft->NFFT = extract_l( Mpy_32_32( input_Fs, 85899346 /* STEREO_DFT_N_MAX_ENC / 48000 in Q31 */ ) );
432 879 : move16();
433 879 : hStereoDft->dft_ovl = extract_l( Mpy_32_32( input_Fs, 18790482 /* STEREO_DFT_OVL_MAX / 48000 in Q31 */ ) );
434 879 : move16();
435 879 : mdct_window_sine_IVAS_updated( win_p, input_Fs, hStereoDft->dft_ovl, FULL_OVERLAP, IVAS_CPE_DFT ); // win_e = 15
436 170699 : FOR( Word16 i = 0; i < ( hStereoDft->dft_ovl / 2 ); i++ )
437 : {
438 169820 : win[hStereoDft->dft_ovl - 1 - i] = win_p[i].v.re;
439 169820 : move16();
440 169820 : win[i] = win_p[i].v.im;
441 169820 : move16();
442 : }
443 :
444 879 : L_tmp = L_shl( L_sub( hStereoDft->N, hStereoDft->dft_ovl ), Q15 ); /* Q15 */
445 879 : L_tmp = L_add( L_tmp, L_shl( sum16_32_fx( win, hStereoDft->dft_ovl ), 1 ) ); /* Q15 */
446 879 : tmp = BASOP_Util_Divide3232_Scale( L_tmp, hStereoDft->NFFT, &tmp_e );
447 879 : tmp_e = sub( tmp_e, 15 );
448 879 : hStereoDft->win_ana_energy_fx = shl( tmp, tmp_e ); /* Q15 */
449 879 : move16();
450 :
451 879 : set32_fx( hStereoDft->output_mem_dmx_32k_fx, 0, STEREO_DFT_OVL_32k );
452 :
453 879 : hStereoDft->dft_zp = extract_l( Mpy_32_32( input_Fs, 12079596 /* STEREO_DFT_ZP_MAX_ENC / 48000 in Q31 */ ) );
454 879 : move16();
455 :
456 879 : hStereoDft->dft_trigo_8k_fx = dft_trigo_32k_fx;
457 879 : hStereoDft->dft_trigo_12k8_fx = dft_trigo_12k8_fx;
458 879 : hStereoDft->dft_trigo_16k_fx = dft_trigo_32k_fx;
459 879 : hStereoDft->dft_trigo_32k_fx = dft_trigo_32k_fx;
460 :
461 879 : hStereoDft->win_ana_8k_fx = win_ana_8k_fx;
462 879 : hStereoDft->win_ana_12k8_fx = win_ana_12k8_fx;
463 879 : hStereoDft->win_ana_16k_fx = win_ana_16k_fx;
464 879 : hStereoDft->win_ana_32k_fx = win_ana_32k_fx;
465 :
466 879 : hStereoDft->win_8k_fx = win_syn_8k_fx;
467 879 : hStereoDft->win_12k8_fx = win_syn_12k8_fx;
468 879 : hStereoDft->win_16k_fx = win_syn_16k_fx;
469 879 : hStereoDft->win_32k_fx = win_syn_32k_fx;
470 :
471 879 : IF( EQ_32( input_Fs, 16000 ) )
472 : {
473 23 : hStereoDft->dft_trigo_fx = dft_trigo_32k_fx;
474 23 : hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP;
475 23 : move16();
476 23 : hStereoDft->win_ana_fx = win_ana_16k_fx;
477 23 : hStereoDft->win_fx = win_syn_16k_fx;
478 : }
479 856 : ELSE IF( EQ_32( input_Fs, 32000 ) )
480 : {
481 165 : hStereoDft->dft_trigo_fx = dft_trigo_32k_fx;
482 165 : hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP;
483 165 : move16();
484 165 : hStereoDft->win_ana_fx = win_ana_32k_fx;
485 165 : hStereoDft->win_fx = win_syn_32k_fx;
486 : }
487 : ELSE
488 : {
489 691 : assert( EQ_32( input_Fs, 48000 ) );
490 691 : hStereoDft->dft_trigo_fx = dft_trigo_48k_fx;
491 691 : hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP;
492 691 : move16();
493 691 : hStereoDft->win_ana_fx = win_ana_48k_fx;
494 691 : hStereoDft->win_fx = win_syn_48k_fx;
495 : }
496 :
497 879 : hStereoDft->win_mdct_8k_fx = win_mdct_8k_fx;
498 :
499 : /*I/O Buffers*/
500 879 : set_zero_fx( hStereoDft->output_mem_dmx_fx, STEREO_DFT_OVL_MAX );
501 879 : set_zero_fx( hStereoDft->output_mem_dmx_12k8_fx, STEREO_DFT_OVL_12k8 );
502 879 : set_zero_fx( hStereoDft->output_mem_dmx_16k_fx, STEREO_DFT_OVL_16k );
503 879 : set_zero_fx( hStereoDft->output_mem_dmx_16k_shb_fx, STEREO_DFT_OVL_16k );
504 879 : set_zero_fx( hStereoDft->output_mem_res_8k_fx, STEREO_DFT_OVL_8k );
505 :
506 : /*Bands: find the number of bands, Nyquist freq. is not taken into account*/
507 : /* NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[max_bwidth] / L_FRAME48k; */
508 879 : NFFT_inner = imult1616( inner_frame_tbl[max_bwidth], STEREO_DFT_N_MAX_ENC / L_FRAME48k );
509 879 : hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->hConfig->band_res, NFFT_inner, ENC );
510 879 : hStereoDft->nbands_dmx = stereo_dft_band_config_fx( hStereoDft->band_limits_dmx, 1, NFFT_inner, ENC );
511 879 : move16();
512 879 : move16();
513 :
514 : /*Set configuration*/
515 879 : set16_fx( hStereoDft->band_res, hStereoDft->hConfig->band_res, STEREO_DFT_ENC_DFT_NB );
516 879 : test();
517 879 : IF( hStereoDft->hConfig->ada_wb_res_cod_mode && EQ_16( hStereoDft->NFFT, STEREO_DFT_N_16k_ENC ) )
518 : {
519 : /* residual coding is only applied for 16 kHz sampling rate */
520 0 : set16_fx( hStereoDft->res_cod_mode, hStereoDft->hConfig->ada_wb_res_cod_mode, STEREO_DFT_ENC_DFT_NB );
521 : }
522 : ELSE
523 : {
524 879 : set16_fx( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_ENC_DFT_NB );
525 : }
526 879 : set16_fx( hStereoDft->res_pred_mode, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_ENC_DFT_NB );
527 :
528 : /* reset DFT stereo memories */
529 879 : stereo_dft_enc_reset_fx( hStereoDft );
530 :
531 879 : return;
532 : }
533 :
534 :
535 : /*-------------------------------------------------------------------------
536 : * stereo_dft_enc_reset()
537 : *
538 : * Reset DFT stereo memories
539 : *------------------------------------------------------------------------*/
540 :
541 1659 : void stereo_dft_enc_reset_fx(
542 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft /* i/o: encoder stereo handle */
543 : )
544 : {
545 : Word16 i;
546 : /*reset parameters*/
547 1659 : set_zero_fx( hStereoDft->side_gain_fx, STEREO_DFT_ENC_DFT_NB * STEREO_DFT_BAND_MAX );
548 1659 : set16_fx( hStereoDft->side_gain_index_EC, 15, STEREO_DFT_BAND_MAX );
549 1659 : set16_fx( hStereoDft->side_gain_index_ECDiff, 0, STEREO_DFT_BAND_MAX );
550 1659 : set16_fx( hStereoDft->side_gain_index_ECprevious, 15, STEREO_DFT_BAND_MAX );
551 1659 : hStereoDft->side_gain_counter = 0;
552 1659 : move16();
553 1659 : hStereoDft->side_gain_bitdiff_lp_fx = STEREO_DFT_BITDIFF_INIT_FX;
554 1659 : move16();
555 1659 : hStereoDft->q_side_gain_bitdiff_lp = Q10;
556 1659 : move16();
557 1659 : set_zero_fx( hStereoDft->gipd_fx, STEREO_DFT_ENC_DFT_NB );
558 1659 : set_zero_fx( hStereoDft->dot_prod_real_smooth_fx, STEREO_DFT_BAND_MAX );
559 1659 : set16_zero_fx( hStereoDft->dot_prod_real_smooth_fx_e, STEREO_DFT_BAND_MAX );
560 1659 : set_zero_fx( hStereoDft->dot_prod_img_smooth_fx, STEREO_DFT_BAND_MAX );
561 1659 : set16_zero_fx( hStereoDft->dot_prod_img_smooth_fx_e, STEREO_DFT_BAND_MAX );
562 23226 : FOR( i = 0; i < STEREO_DFT_BAND_MAX; i++ )
563 : {
564 21567 : set_zero_fx( hStereoDft->ipd_buf_fx[i], STEREO_DFT_IPD_BUF_LEN );
565 : }
566 1659 : hStereoDft->prev_gipd_fx = 0;
567 1659 : move32();
568 1659 : hStereoDft->gipd_index = 0;
569 1659 : move16();
570 1659 : set_zero_fx( hStereoDft->res_pred_gain_fx, STEREO_DFT_ENC_DFT_NB * STEREO_DFT_BAND_MAX );
571 1659 : set16_fx( hStereoDft->res_pred_index_EC, 0, STEREO_DFT_BAND_MAX );
572 1659 : set16_fx( hStereoDft->res_pred_index_ECDiff, 0, STEREO_DFT_BAND_MAX );
573 1659 : set16_fx( hStereoDft->res_pred_index_ECprevious, 0, STEREO_DFT_BAND_MAX );
574 1659 : hStereoDft->res_pred_counter = 0;
575 1659 : move16();
576 1659 : set_zero_fx( hStereoDft->past_nrgL_fx, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
577 1659 : set16_zero_fx( hStereoDft->past_nrgL_fx_e, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
578 1659 : set_zero_fx( hStereoDft->past_nrgR_fx, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
579 1659 : set16_zero_fx( hStereoDft->past_nrgR_fx_e, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
580 1659 : set_zero_fx( hStereoDft->past_dot_prod_real_fx, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
581 1659 : set16_zero_fx( hStereoDft->past_dot_prod_real_fx_e, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
582 1659 : set_zero_fx( hStereoDft->past_dot_prod_imag_fx, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
583 1659 : set16_zero_fx( hStereoDft->past_dot_prod_imag_fx_e, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX );
584 :
585 1659 : hStereoDft->nrg_past_pos = 0;
586 1659 : move16();
587 :
588 1659 : hStereoDft->res_dmx_ratio_lt_fx = MAX_32;
589 1659 : move32();
590 1659 : hStereoDft->hangover_cnt0 = 0;
591 1659 : move16();
592 1659 : hStereoDft->hangover_cnt1 = 0;
593 1659 : move16();
594 1659 : hStereoDft->dmx_res_all_prev_fx = 1;
595 1659 : move32();
596 1659 : hStereoDft->dmx_res_all_prev_fx_e = 31;
597 1659 : move16();
598 1659 : hStereoDft->last_res_cod_mode_modify_flag = 0;
599 1659 : move16();
600 1659 : hStereoDft->res_cod_sw_flag = 0;
601 1659 : move16();
602 1659 : hStereoDft->switch_fade_factor_fx = ONE_IN_Q14; // Q15/2
603 1659 : move16();
604 1659 : hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1] = STEREO_DFT_RES_COD_1kHz;
605 1659 : move16();
606 23226 : FOR( i = 0; i < STEREO_DFT_BAND_MAX; i++ )
607 : {
608 21567 : hStereoDft->res_cod_NRG_M_fx[i] = 0;
609 21567 : move32();
610 21567 : hStereoDft->res_cod_NRG_M_fx_e[i] = 0;
611 21567 : move16();
612 21567 : hStereoDft->res_cod_NRG_S_fx[i] = 0;
613 21567 : move32();
614 21567 : hStereoDft->res_cod_NRG_S_fx_e[i] = 0;
615 21567 : move16();
616 : }
617 1659 : hStereoDft->old_snr_fx = 0;
618 1659 : move32();
619 :
620 :
621 1659 : hStereoDft->reverb_flag = 0;
622 1659 : move16();
623 1659 : set_zero_fx( hStereoDft->pre_sub_nrg_DMX_fx, STEREO_DFT_BAND_MAX );
624 1659 : set16_zero_fx( hStereoDft->pre_sub_nrg_DMX_fx_e, STEREO_DFT_BAND_MAX );
625 1659 : hStereoDft->diff_l_h_sm_fx = 0;
626 1659 : move32();
627 1659 : hStereoDft->diff_l_h_sm_fx_e = 0;
628 1659 : move16();
629 1659 : hStereoDft->diff_r_h_sm_fx = 0;
630 1659 : move32();
631 1659 : hStereoDft->diff_r_h_sm_fx_e = 0;
632 1659 : move16();
633 1659 : hStereoDft->prev_fac2_fx = MAX_32;
634 1659 : move32();
635 :
636 1659 : set_zero_fx( hStereoDft->res_pred_gain_f_fx, STEREO_DFT_BAND_MAX );
637 :
638 : /*misc*/
639 1659 : hStereoDft->no_ipd_flag = 1; /* Initialization of the no IPD variables */
640 1659 : move16();
641 1659 : hStereoDft->prev_no_ipd_flag = 1;
642 1659 : move16();
643 1659 : hStereoDft->no_ipd_cnt = 0;
644 1659 : move16();
645 1659 : hStereoDft->no_ipd_cnt1 = 0;
646 1659 : move16();
647 1659 : hStereoDft->attackPresent = 0;
648 1659 : move16();
649 1659 : hStereoDft->wasTransient = 0;
650 1659 : move16();
651 1659 : hStereoDft->gainIPD_sm_fx = MAX_32;
652 1659 : move32();
653 :
654 :
655 1659 : hStereoDft->voicing_lt_fx = 0;
656 1659 : move32();
657 :
658 1659 : hStereoDft->flip_sign = 1;
659 1659 : move16();
660 :
661 1659 : hStereoDft->sfm_fx = 0;
662 1659 : move32();
663 1659 : hStereoDft->sum_dot_prod_real_fx = 0;
664 1659 : move32();
665 1659 : hStereoDft->sum_dot_prod_real_fx_e = 0;
666 1659 : move16();
667 1659 : hStereoDft->sum_dot_prod_img_fx = 0;
668 1659 : move32();
669 1659 : hStereoDft->sum_dot_prod_img_fx_e = 0;
670 1659 : move16();
671 :
672 : /*Coherence*/
673 1659 : set32_fx( hStereoDft->xspec_smooth_fx, MAX_32, STEREO_DFT_N_32k_ENC );
674 1659 : set16_fx( hStereoDft->xspec_smooth_fx_e, 0, STEREO_DFT_N_32k_ENC );
675 1659 : set32_fx( hStereoDft->Spd_L_smooth_fx, MAX_32, STEREO_DFT_N_32k_ENC / 2 );
676 1659 : hStereoDft->Spd_L_smooth_fx_e = 0;
677 1659 : move16();
678 1659 : set32_fx( hStereoDft->Spd_R_smooth_fx, MAX_32, STEREO_DFT_N_32k_ENC / 2 );
679 1659 : hStereoDft->Spd_R_smooth_fx_e = 0;
680 1659 : move16();
681 :
682 1659 : hStereoDft->currentNumUpdates = 0;
683 1659 : move16();
684 1659 : hStereoDft->expectedNumUpdates = FIXED_SID_RATE;
685 1659 : move16();
686 1659 : hStereoDft->resetFrames = 0;
687 1659 : move16();
688 1659 : hStereoDft->sid_gipd_fx = 0;
689 1659 : move32();
690 1659 : hStereoDft->prev_sid_gipd_fx = 0;
691 1659 : move32();
692 1659 : hStereoDft->prev_sid_no_ipd_flag = 1;
693 1659 : move16();
694 :
695 1659 : hStereoDft->coh_fade_counter = 0;
696 1659 : move16();
697 :
698 : /* Xtalk classifier */
699 1659 : hStereoDft->hItd->prev_m1_fx = 0;
700 1659 : move32();
701 1659 : hStereoDft->hItd->prev_m2_fx = 0;
702 1659 : move32();
703 1659 : hStereoDft->hItd->prev_itd1 = 0;
704 1659 : move16();
705 1659 : hStereoDft->hItd->prev_itd2 = 0;
706 1659 : move16();
707 :
708 1659 : hStereoDft->first_frm_flag = 1;
709 1659 : move16();
710 :
711 :
712 1659 : stereo_enc_itd_init_fx( hStereoDft->hItd );
713 :
714 1659 : return;
715 : }
716 :
717 :
718 : /*-------------------------------------------------------------------------
719 : * stereo_enc_itd_init()
720 : *
721 : * initialize ITD struct
722 : *------------------------------------------------------------------------*/
723 :
724 1810 : void stereo_enc_itd_init_fx(
725 : ITD_DATA_HANDLE hItd /* i/o: encoder ITD handle */
726 : )
727 : {
728 1810 : hItd->prev_itd = 0;
729 1810 : move16();
730 1810 : set32_fx( hItd->itd_fx, 0, STEREO_DFT_ENC_DFT_NB );
731 1810 : set32_fx( hItd->deltaItd_fx, 0, STEREO_DFT_ENC_DFT_NB );
732 1810 : set16_fx( hItd->td_itd, 0, STEREO_DFT_ENC_DFT_NB );
733 1810 : set16_fx( hItd->td_itd_32k, 0, STEREO_DFT_ENC_DFT_NB );
734 1810 : set16_fx( hItd->itd_index, 0, STEREO_DFT_ENC_DFT_NB );
735 1810 : set32_fx( hItd->xcorr_smooth_fx, 0, STEREO_DFT_N_32k_ENC );
736 1810 : set16_fx( hItd->xcorr_smooth_fx_e, 0, STEREO_DFT_N_32k_ENC );
737 1810 : hItd->lp_phat_peak_fx = 0;
738 1810 : move32();
739 1810 : hItd->itd_hangover = 0;
740 1810 : move16();
741 1810 : hItd->itd_cnt = 0;
742 1810 : move16();
743 1810 : hItd->prev_sum_nrg_L_lb_fx = 0;
744 1810 : move32();
745 1810 : hItd->prev_sum_nrg_L_lb_fx_e = 0;
746 1810 : move16();
747 1810 : set32_fx( hItd->prev_xcorr_lb_fx, 0, STEREO_DFT_XCORR_LB_MAX );
748 1810 : hItd->prev_xcorr_lb_fx_e = 0;
749 1810 : move16();
750 1810 : set32_fx( hItd->E_band_n_fx, ITD_VAD_E_BAND_N_INIT, STEREO_DFT_ITD_VAD_BAND_NUM );
751 1810 : set16_fx( hItd->E_band_n_exp, Q31, STEREO_DFT_ITD_VAD_BAND_NUM );
752 1810 : hItd->vad_frm_cnt = 0;
753 1810 : move16();
754 1810 : hItd->pre_vad = 0;
755 1810 : move16();
756 1810 : hItd->itd_nonzero_cnt = 0;
757 1810 : move16();
758 1810 : set32_fx( hItd->acorr_L_fx, 0, STEREO_DFT_BAND_MAX );
759 1810 : hItd->acorr_L_fx_e = 0;
760 1810 : move16();
761 1810 : set32_fx( hItd->acorr_R_fx, 0, STEREO_DFT_BAND_MAX );
762 1810 : hItd->acorr_R_fx_e = 0;
763 1810 : move16();
764 1810 : hItd->cohSNR_fx = 983040; /*Q16*/
765 1810 : move32();
766 1810 : hItd->itd_thres_fx = 0;
767 1810 : move32();
768 1810 : hItd->valid_itd_cnt = 0;
769 1810 : move16();
770 1810 : hItd->detected_itd_flag = 0;
771 1810 : move16();
772 1810 : hItd->itd_tracking = 0;
773 1810 : move16();
774 1810 : hItd->prev_max_fx = 0;
775 1810 : move32();
776 1810 : hItd->prev_index = 0;
777 1810 : move16();
778 1810 : hItd->prev_avg_max_fx = 0;
779 1810 : move32();
780 1810 : hItd->prev_avg_max_fx_e = 0;
781 1810 : move16();
782 1810 : hItd->currFlatness_fx = 0;
783 1810 : move16();
784 : /* Xtalk classifier */
785 1810 : hItd->prev_m1_fx = 0;
786 1810 : move32();
787 1810 : hItd->prev_m2_fx = 0;
788 1810 : move32();
789 1810 : hItd->prev_itd1 = 0;
790 1810 : move16();
791 1810 : hItd->prev_itd2 = 0;
792 1810 : move16();
793 1810 : hItd->hybrid_itd_max = 0;
794 1810 : move16();
795 1810 : return;
796 : }
797 :
798 :
799 : /*--------------------------------------------------------------------------
800 : * stereo_dft_enc_update()
801 : *
802 : * Update DFT stereo memories for new frame
803 : *--------------------------------------------------------------------------*/
804 :
805 59659 : void stereo_dft_enc_update_fx(
806 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */
807 : const Word16 max_bwidth /* i : maximum encoded bandwidth */
808 : )
809 : {
810 : Word16 i, k_offset;
811 : Word16 NFFT_inner;
812 :
813 : /* Initialization */
814 59659 : k_offset = STEREO_DFT_OFFSET; /*Add an offset at encoder*/
815 59659 : move32();
816 :
817 : /* Update the parameters and serial */
818 835226 : FOR( i = 0; i < ( k_offset * STEREO_DFT_BAND_MAX ); i++ )
819 : {
820 775567 : hStereoDft->side_gain_fx[i] = hStereoDft->side_gain_fx[STEREO_DFT_BAND_MAX + i];
821 775567 : move32();
822 775567 : hStereoDft->res_pred_gain_fx[i] = hStereoDft->res_pred_gain_fx[STEREO_DFT_BAND_MAX + i];
823 775567 : move32();
824 : }
825 :
826 119318 : FOR( i = 0; i < k_offset; i++ )
827 : {
828 59659 : hStereoDft->gipd_fx[i] = hStereoDft->gipd_fx[i + 1];
829 59659 : move32();
830 : }
831 :
832 : /*Update configurations*/
833 119318 : FOR( i = 0; i < k_offset; i++ )
834 : {
835 59659 : hStereoDft->band_res[i] = hStereoDft->band_res[i + 1];
836 59659 : move16();
837 59659 : hStereoDft->hItd->itd_fx[i] = hStereoDft->hItd->itd_fx[i + 1];
838 59659 : move32();
839 59659 : hStereoDft->res_cod_mode[i] = hStereoDft->res_cod_mode[i + 1];
840 59659 : move16();
841 59659 : hStereoDft->res_pred_mode[i] = hStereoDft->res_pred_mode[i + 1];
842 59659 : move16();
843 : }
844 :
845 : /*Set new configurations*/
846 59659 : hStereoDft->band_res[k_offset] = hStereoDft->hConfig->band_res;
847 59659 : move16();
848 :
849 59659 : IF( hStereoDft->hConfig->ada_wb_res_cod_mode && EQ_16( hStereoDft->NFFT, STEREO_DFT_N_16k_ENC ) )
850 : {
851 2886 : hStereoDft->res_cod_mode[k_offset] = hStereoDft->hConfig->ada_wb_res_cod_mode;
852 2886 : move16();
853 : }
854 : ELSE
855 : {
856 56773 : hStereoDft->res_cod_mode[k_offset] = hStereoDft->hConfig->res_cod_mode;
857 56773 : move16();
858 : }
859 59659 : hStereoDft->res_pred_mode[k_offset] = hStereoDft->hConfig->res_pred_mode;
860 59659 : move16();
861 :
862 59659 : hStereoDft->last_res_cod_mode_modify_flag = hStereoDft->res_cod_sw_flag;
863 59659 : move16();
864 59659 : hStereoDft->res_cod_sw_flag = 0;
865 59659 : move16();
866 :
867 : /* update band limits in case of rate switching assuming max_bwidth as BWD output not yet know here */
868 59659 : NFFT_inner = shl( inner_frame_tbl[max_bwidth], 1 ) /* * STEREO_DFT_N_MAX_ENC / L_FRAME48k*/;
869 :
870 59659 : hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->hConfig->band_res, NFFT_inner, ENC );
871 59659 : move16();
872 59659 : hStereoDft->nbands_dmx = stereo_dft_band_config_fx( hStereoDft->band_limits_dmx, 1, NFFT_inner, ENC );
873 59659 : move16();
874 :
875 : /*Compute main parameters*/
876 59659 : hStereoDft->gipd_band_max = dft_band_ipd[1][3];
877 59659 : move16();
878 59659 : hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->res_cod_mode[k_offset]];
879 59659 : move16();
880 : // hStereoDft->res_cod_line_max = (int16_t) ( 0.5f + ( hStereoDft->band_limits[hStereoDft->res_cod_band_max] - 1 ) * 2.f * hStereoDft->N / (float) ( hStereoDft->NFFT ) );
881 59659 : Word32 tmp = L_shl( L_mult0( sub( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ), hStereoDft->N ), 1 );
882 : Word16 exp;
883 59659 : tmp = BASOP_Util_Divide3232_Scale_newton( tmp, hStereoDft->NFFT, &exp );
884 59659 : hStereoDft->res_cod_line_max = extract_l( L_shr( tmp, sub( 31, exp ) ) );
885 59659 : move16();
886 : // hStereoDft->res_cod_line_max = 8 * (hStereoDft->res_cod_line_max / 8);
887 59659 : hStereoDft->res_cod_line_max = shl( shr( hStereoDft->res_cod_line_max, 3 ), 3 );
888 59659 : move16();
889 59659 : hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
890 59659 : move16();
891 :
892 :
893 59659 : return;
894 : }
895 :
896 : /*-------------------------------------------------------------------------
897 : * stereo_dft_enc_destroy()
898 : *
899 : * destroy DFT stereo handle
900 : *-------------------------------------------------------------------------*/
901 :
902 879 : void stereo_dft_enc_destroy_fx(
903 : STEREO_DFT_ENC_DATA_HANDLE *hStereoDft /* i/o: encoder DFT stereo handle */
904 : )
905 : {
906 879 : IF( ( *hStereoDft )->hConfig != NULL )
907 : {
908 879 : free( ( *hStereoDft )->hConfig );
909 879 : ( *hStereoDft )->hConfig = NULL;
910 : }
911 :
912 879 : IF( ( *hStereoDft )->hItd != NULL )
913 : {
914 879 : free( ( *hStereoDft )->hItd );
915 879 : ( *hStereoDft )->hItd = NULL;
916 : }
917 :
918 879 : free( *hStereoDft );
919 879 : *hStereoDft = NULL;
920 :
921 879 : return;
922 : }
923 :
924 :
925 : /*-------------------------------------------------------------------------
926 : * stereo_dft_enc_analyze()
927 : *
928 : * DFT analysis on a 20ms frame
929 : *-------------------------------------------------------------------------*/
930 74349 : void stereo_dft_enc_analyze_fx(
931 : Encoder_State **sts, /* i/o: encoder state structure */
932 : const Word16 n_channels, /* i : number of input channels */
933 : const Word16 input_frame, /* i : input frame length */
934 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */
935 : STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: encoder MDCT stereo handle */
936 : Word32 DFT[CPE_CHANNELS][STEREO_DFT_N_MAX_ENC], /* o : DFT buffers Q(31-DFT_e) */
937 : Word16 DFT_e[CPE_CHANNELS], /* o : DFT buffers */
938 : Word16 *input_mem[CPE_CHANNELS], /* i/o: input buffer memory Q(q_input_mem_ */
939 : Word16 *q_input_mem )
940 : {
941 : Word16 i, n;
942 : Word32 *pDFT_L, *pDFT_R;
943 : Word16 N, NFFT;
944 : Word16 dft_zp, dft_ovl;
945 : const Word16 *pWin;
946 : const Word16 *pTrigo;
947 : Word16 offset;
948 : Word16 *input[CPE_CHANNELS], *mem[CPE_CHANNELS];
949 : Word16 trigo_enc[STEREO_DFT_N_MAX_ENC / 2 + 1];
950 : Word16 trigo_step;
951 :
952 :
953 74349 : push_wmops( "DFT_analysis" );
954 :
955 : /*-----------------------------------------------------------------*
956 : * Initialization
957 : *-----------------------------------------------------------------*/
958 :
959 223047 : FOR( n = 0; n < n_channels; n++ )
960 : {
961 148698 : input[n] = sts[n]->input_fx;
962 148698 : mem[n] = input_mem[n];
963 : }
964 :
965 :
966 : /*-----------------------------------------------------------------*
967 : * DFT Analysis
968 : *-----------------------------------------------------------------*/
969 :
970 74349 : pDFT_L = DFT[0];
971 74349 : pDFT_R = DFT[1];
972 :
973 74349 : IF( hStereoDft != NULL )
974 : {
975 59659 : N = hStereoDft->N;
976 59659 : move16();
977 59659 : NFFT = hStereoDft->NFFT;
978 59659 : move16();
979 59659 : dft_zp = hStereoDft->dft_zp;
980 59659 : move16();
981 59659 : dft_ovl = hStereoDft->dft_ovl;
982 59659 : move16();
983 59659 : offset = negate( dft_ovl );
984 59659 : pWin = hStereoDft->win_ana_fx;
985 59659 : pTrigo = hStereoDft->dft_trigo_fx;
986 59659 : trigo_step = hStereoDft->dft_trigo_step;
987 59659 : move16();
988 : }
989 : ELSE
990 : {
991 14690 : N = hStereoMdct->hDft_ana->N;
992 14690 : move16();
993 14690 : NFFT = hStereoMdct->hDft_ana->NFFT;
994 14690 : move16();
995 14690 : dft_zp = hStereoMdct->hDft_ana->dft_zp;
996 14690 : move16();
997 14690 : dft_ovl = hStereoMdct->hDft_ana->dft_ovl;
998 14690 : move16();
999 14690 : offset = negate( dft_ovl );
1000 14690 : pWin = hStereoMdct->hDft_ana->win_ana_fx;
1001 14690 : pTrigo = hStereoMdct->hDft_ana->dft_trigo_fx;
1002 14690 : trigo_step = hStereoMdct->hDft_ana->dft_trigo_step;
1003 14690 : move16();
1004 : }
1005 :
1006 25094029 : FOR( i = 0; i < shr( NFFT, 2 ); i++ )
1007 : {
1008 25019680 : trigo_enc[i] = pTrigo[i * trigo_step];
1009 25019680 : move16();
1010 25019680 : trigo_enc[( ( NFFT / 2 ) - i )] = pTrigo[L_mult0( i, trigo_step )];
1011 25019680 : move16();
1012 : }
1013 74349 : trigo_enc[NFFT / 4] = pTrigo[( ( NFFT / 4 ) * trigo_step )];
1014 74349 : move16();
1015 :
1016 : /*Forwards FFT: L and R*/
1017 : /*zero padding*/
1018 14147919 : FOR( i = 0; i < dft_zp; i++ )
1019 : {
1020 14073570 : pDFT_L[i] = 0;
1021 14073570 : move32();
1022 14073570 : pDFT_L[( ( NFFT - 1 ) - i )] = 0;
1023 14073570 : move32();
1024 :
1025 14073570 : pDFT_R[i] = 0;
1026 14073570 : move32();
1027 14073570 : pDFT_R[( ( NFFT - 1 ) - i )] = 0;
1028 14073570 : move32();
1029 : }
1030 :
1031 223047 : FOR( n = 0; n < n_channels; n++ )
1032 : {
1033 148698 : Scale_sig( &mem[n][0], dft_ovl, sub( sts[n]->q_inp, q_input_mem[n] ) ); // Q(sts[n]->q_inp)
1034 148698 : q_input_mem[n] = sts[n]->q_inp;
1035 148698 : move16();
1036 : }
1037 : /*overlapping parts*/
1038 21966569 : FOR( i = 0; i < dft_ovl; i++ )
1039 : {
1040 21892220 : pDFT_L[( dft_zp + i )] = L_mult0( mem[0][i], pWin[i] );
1041 21892220 : move32();
1042 21892220 : pDFT_L[( ( ( dft_zp + N ) + dft_ovl ) - 1 - i )] = L_mult0( input[0][offset + N + dft_ovl - 1 - i], pWin[i] );
1043 21892220 : move32();
1044 :
1045 21892220 : pDFT_R[dft_zp + i] = L_mult0( mem[1][i], pWin[i] );
1046 21892220 : move32();
1047 21892220 : pDFT_R[( ( dft_zp + N ) + dft_ovl ) - 1 - i] = L_mult0( input[1][offset + N + dft_ovl - 1 - i], pWin[i] );
1048 21892220 : move32();
1049 : }
1050 :
1051 : /*middle part*/
1052 28221489 : FOR( i = 0; i < N - dft_ovl; i++ )
1053 : {
1054 28147140 : pDFT_L[dft_zp + dft_ovl + i] = L_shr( L_deposit_h( input[0][offset + dft_ovl + i] ), 1 );
1055 28147140 : move32();
1056 :
1057 28147140 : pDFT_R[dft_zp + dft_ovl + i] = L_shr( L_deposit_h( input[1][offset + dft_ovl + i] ), 1 );
1058 28147140 : move32();
1059 : }
1060 74349 : DFT_e[0] = sub( 31, add( 15, sts[0]->q_inp ) );
1061 74349 : move16();
1062 74349 : DFT_e[1] = sub( 31, add( 15, sts[1]->q_inp ) );
1063 74349 : move16();
1064 :
1065 : Word16 q_shift, guarded_bits;
1066 74349 : guarded_bits = find_guarded_bits_fx( NFFT );
1067 :
1068 74349 : q_shift = sub( L_norm_arr( pDFT_L, NFFT ), guarded_bits );
1069 74349 : scale_sig32( pDFT_L, NFFT, q_shift );
1070 74349 : DFT_e[0] = sub( DFT_e[0], q_shift );
1071 74349 : move16();
1072 :
1073 74349 : q_shift = sub( L_norm_arr( pDFT_R, NFFT ), guarded_bits );
1074 74349 : scale_sig32( pDFT_R, NFFT, q_shift );
1075 74349 : DFT_e[1] = sub( DFT_e[1], q_shift );
1076 74349 : move16();
1077 :
1078 74349 : rfft_fx( pDFT_L, trigo_enc, NFFT, -1 );
1079 74349 : rfft_fx( pDFT_R, trigo_enc, NFFT, -1 );
1080 :
1081 : /* update pointers to overlap memory */
1082 223047 : FOR( n = 0; n < n_channels; n++ )
1083 : {
1084 148698 : mem[n] = &input[n][sub( N, dft_ovl )];
1085 : }
1086 74349 : test();
1087 74349 : test();
1088 74349 : IF( hStereoDft != NULL && hStereoDft->hConfig->hybrid_itd_flag && hStereoDft->hItd->td_itd[STEREO_DFT_OFFSET] )
1089 : {
1090 36315 : FOR( n = 0; n < n_channels; n++ )
1091 : {
1092 24210 : Scale_sig( hStereoDft->input_mem_itd_fx[n], dft_ovl, sub( sts[n]->q_inp, hStereoDft->q_input_mem_itd[n] ) ); // Q(sts[n]->q_inp)
1093 24210 : hStereoDft->q_input_mem_itd[n] = sts[n]->q_inp;
1094 24210 : move16();
1095 24210 : Copy( hStereoDft->input_mem_itd_fx[n], input_mem[n], dft_ovl );
1096 : }
1097 : }
1098 : ELSE
1099 : {
1100 186732 : FOR( n = 0; n < n_channels; n++ )
1101 : {
1102 124488 : Copy( input[n] + input_frame - dft_ovl, input_mem[n], dft_ovl );
1103 : }
1104 : }
1105 :
1106 74349 : pop_wmops();
1107 74349 : return;
1108 : }
1109 :
1110 : /*-------------------------------------------------------------------------
1111 : * stereo_dft_enc_synthesize()
1112 : *
1113 : * Inverse DFT on a 20ms frame
1114 : *-------------------------------------------------------------------------*/
1115 :
1116 224696 : Word32 stereo_dft_enc_synthesize_fx(
1117 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */
1118 : Word32 *output_fx, /* o : output synthesis Q15 */
1119 : Word16 *output_start_index,
1120 : Word16 *output_end_index,
1121 : const Word16 chan, /* i : channel number */
1122 : const Word32 input_Fs, /* i : input sampling rate */
1123 : const Word32 output_sampling_rate, /* i : output sampling rate */
1124 : const Word16 L_frame, /* i : frame length at internal Fs */
1125 : Word16 *nrg_out_fx_e )
1126 : {
1127 : Word16 i, j, sign;
1128 : Word32 *pDFT_in_fx;
1129 : Word16 DFT_in_fx_e;
1130 : Word16 offset, NFFT, N, ovl, zp;
1131 : Word16 temp_exp;
1132 : Word32 fac_fx;
1133 : Word32 *mem_fx;
1134 : const Word16 *trigo_fx;
1135 : const Word32 *win_fx;
1136 : const Word16 *win_ana_fx;
1137 : Word32 tmp_fx[STEREO_DFT_N_MAX_ENC];
1138 : Word32 nrg_fx;
1139 : Word16 nrg_fx_e;
1140 : Word16 trigo_enc_fx[STEREO_DFT_N_MAX_ENC / 2 + 1];
1141 : Word16 trigo_step;
1142 : Word16 scal_fac;
1143 :
1144 :
1145 : /*-----------------------------------------------------------------*
1146 : * Initialization
1147 : *-----------------------------------------------------------------*/
1148 :
1149 224696 : IF( L_frame > 0 )
1150 : {
1151 35803 : assert( ( output_sampling_rate == 16000 ) && "High-band generation only possible at 16kHz!" );
1152 : }
1153 224696 : nrg_fx = 0;
1154 224696 : move32();
1155 224696 : nrg_fx_e = 0;
1156 224696 : move16();
1157 :
1158 224696 : hStereoDft->icbweRefEner_fx = 0;
1159 224696 : move32();
1160 224696 : hStereoDft->icbweRefEner_fx_e = 0;
1161 224696 : move16();
1162 224696 : hStereoDft->lbEner_fx = 0;
1163 224696 : move32();
1164 224696 : hStereoDft->lbEner_fx_e = 0;
1165 224696 : move16();
1166 :
1167 224696 : IF( chan == 0 )
1168 : {
1169 204728 : pDFT_in_fx = hStereoDft->DFT_fx[0];
1170 204728 : DFT_in_fx_e = hStereoDft->DFT_fx_e[0];
1171 204728 : move16();
1172 : }
1173 : ELSE
1174 : {
1175 19968 : pDFT_in_fx = hStereoDft->DFT_fx[1];
1176 19968 : DFT_in_fx_e = hStereoDft->DFT_fx_e[1];
1177 19968 : move16();
1178 : }
1179 :
1180 224696 : IF( EQ_32( output_sampling_rate, input_Fs ) )
1181 : {
1182 59659 : assert( chan == 0 );
1183 :
1184 59659 : NFFT = hStereoDft->NFFT;
1185 59659 : move16();
1186 59659 : fac_fx = MAX_32;
1187 59659 : move32();
1188 59659 : N = hStereoDft->N;
1189 59659 : move16();
1190 59659 : ovl = hStereoDft->dft_ovl;
1191 59659 : move16();
1192 59659 : zp = hStereoDft->dft_zp;
1193 59659 : move16();
1194 59659 : trigo_fx = hStereoDft->dft_trigo_fx;
1195 59659 : trigo_step = hStereoDft->dft_trigo_step;
1196 59659 : move16();
1197 59659 : IF( L_frame > 0 )
1198 : {
1199 0 : mem_fx = hStereoDft->output_mem_dmx_16k_shb_fx;
1200 : }
1201 : ELSE
1202 : {
1203 59659 : mem_fx = hStereoDft->output_mem_dmx_fx;
1204 : }
1205 59659 : win_fx = hStereoDft->win_fx;
1206 59659 : win_ana_fx = hStereoDft->win_ana_fx;
1207 :
1208 59659 : push_wmops( "DFT_synth_fs" );
1209 : }
1210 165037 : ELSE IF( EQ_32( output_sampling_rate, INT_FS_12k8 ) )
1211 : {
1212 59659 : assert( chan == 0 );
1213 :
1214 59659 : NFFT = STEREO_DFT_N_12k8_ENC;
1215 59659 : move16();
1216 59659 : N = STEREO_DFT_HOP_12k8_ENC;
1217 59659 : move16();
1218 59659 : zp = STEREO_DFT_ZP_12k8_ENC;
1219 59659 : move16();
1220 : // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT );
1221 59659 : fac_fx = BASOP_Util_Divide3232_Scale_newton( NFFT, hStereoDft->NFFT, &temp_exp );
1222 59659 : fac_fx = L_shl( fac_fx, temp_exp );
1223 59659 : ovl = STEREO_DFT_OVL_12k8;
1224 59659 : move16();
1225 59659 : trigo_fx = hStereoDft->dft_trigo_12k8_fx;
1226 59659 : trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP;
1227 59659 : move16();
1228 59659 : mem_fx = hStereoDft->output_mem_dmx_12k8_fx;
1229 59659 : win_fx = hStereoDft->win_12k8_fx;
1230 59659 : win_ana_fx = hStereoDft->win_ana_12k8_fx;
1231 :
1232 59659 : push_wmops( "DFT_synth_12k8" );
1233 : }
1234 105378 : ELSE IF( EQ_32( output_sampling_rate, 16000 ) )
1235 : {
1236 83919 : assert( chan == 0 );
1237 :
1238 83919 : NFFT = STEREO_DFT_N_16k_ENC;
1239 83919 : move16();
1240 83919 : N = STEREO_DFT_HOP_16k_ENC;
1241 83919 : move16();
1242 83919 : zp = STEREO_DFT_ZP_16k_ENC;
1243 83919 : move16();
1244 : // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT );
1245 83919 : fac_fx = BASOP_Util_Divide3232_Scale_newton( NFFT, hStereoDft->NFFT, &temp_exp );
1246 83919 : fac_fx = L_shl( fac_fx, temp_exp );
1247 83919 : ovl = STEREO_DFT_OVL_16k;
1248 83919 : move16();
1249 83919 : trigo_fx = hStereoDft->dft_trigo_16k_fx;
1250 83919 : trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP;
1251 83919 : move16();
1252 83919 : IF( L_frame > 0 )
1253 : {
1254 35803 : mem_fx = hStereoDft->output_mem_dmx_16k_shb_fx;
1255 :
1256 35803 : push_wmops( "DFT_synth_16k_shb" );
1257 : }
1258 : ELSE
1259 : {
1260 48116 : mem_fx = hStereoDft->output_mem_dmx_16k_fx;
1261 :
1262 48116 : push_wmops( "DFT_synth_16k" );
1263 : }
1264 83919 : win_fx = hStereoDft->win_16k_fx;
1265 83919 : win_ana_fx = hStereoDft->win_ana_16k_fx;
1266 : }
1267 21459 : ELSE IF( EQ_32( output_sampling_rate, 32000 ) )
1268 : {
1269 1491 : assert( chan == 0 );
1270 :
1271 1491 : NFFT = STEREO_DFT_N_32k_ENC;
1272 1491 : move16();
1273 1491 : N = STEREO_DFT_HOP_32k_ENC;
1274 1491 : move16();
1275 1491 : zp = STEREO_DFT_ZP_32k_ENC;
1276 1491 : move16();
1277 : // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT );
1278 1491 : fac_fx = BASOP_Util_Divide3232_Scale_newton( NFFT, hStereoDft->NFFT, &temp_exp );
1279 1491 : fac_fx = L_shl( fac_fx, temp_exp );
1280 1491 : ovl = STEREO_DFT_OVL_32k;
1281 1491 : move16();
1282 1491 : trigo_fx = hStereoDft->dft_trigo_32k_fx;
1283 1491 : trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP;
1284 1491 : move16();
1285 1491 : mem_fx = hStereoDft->output_mem_dmx_32k_fx;
1286 1491 : win_fx = hStereoDft->win_32k_fx;
1287 1491 : win_ana_fx = hStereoDft->win_ana_32k_fx;
1288 :
1289 1491 : push_wmops( "DFT_synth_32k" );
1290 : }
1291 19968 : ELSE IF( EQ_32( output_sampling_rate, 8000 ) )
1292 : {
1293 19968 : assert( chan == 1 );
1294 :
1295 19968 : NFFT = STEREO_DFT_N_8k_ENC;
1296 19968 : move16();
1297 19968 : N = STEREO_DFT_HOP_8k_ENC;
1298 19968 : move16();
1299 19968 : zp = STEREO_DFT_ZP_8k_ENC;
1300 19968 : move16();
1301 : // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT );
1302 19968 : fac_fx = BASOP_Util_Divide3232_Scale_newton( NFFT, hStereoDft->NFFT, &temp_exp );
1303 19968 : fac_fx = L_shl( fac_fx, temp_exp );
1304 19968 : ovl = STEREO_DFT_OVL_8k;
1305 19968 : move16();
1306 19968 : trigo_fx = hStereoDft->dft_trigo_8k_fx;
1307 19968 : trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP;
1308 19968 : move16();
1309 19968 : mem_fx = hStereoDft->output_mem_res_8k_fx;
1310 19968 : win_fx = hStereoDft->win_8k_fx;
1311 19968 : win_ana_fx = hStereoDft->win_ana_8k_fx;
1312 :
1313 19968 : push_wmops( "DFT_synth_8k" );
1314 : }
1315 : ELSE
1316 : {
1317 0 : assert( 0 && "DFT stereo: sampling rate not supported!" );
1318 : NFFT = -1; /* to avoid compilation warning */
1319 : move16();
1320 : fac_fx = -1; /* to avoid compilation warning */
1321 : move32();
1322 : N = -1; /* to avoid compilation warning */
1323 : move16();
1324 : zp = -1; /* to avoid compilation warning */
1325 : move16();
1326 : win_fx = NULL; /* to avoid compilation warning */
1327 : trigo_fx = NULL; /* to avoid compilation warning */
1328 : trigo_step = -1; /* to avoid compilation warning */
1329 : move16();
1330 : ovl = -1; /* to avoid compilation warning */
1331 : move16();
1332 : mem_fx = NULL; /* to avoid compilation warning */
1333 : win_ana_fx = NULL; /* to avoid compilation warning */
1334 : }
1335 :
1336 224696 : offset = 0;
1337 224696 : move16();
1338 :
1339 43948728 : FOR( i = 0; i < NFFT / 4; i++ )
1340 : {
1341 43724032 : trigo_enc_fx[i] = trigo_fx[i * trigo_step];
1342 43724032 : move16();
1343 43724032 : trigo_enc_fx[( NFFT / 2 ) - i] = trigo_fx[i * trigo_step];
1344 43724032 : move16();
1345 : }
1346 224696 : trigo_enc_fx[NFFT / 4] = trigo_fx[( NFFT / 4 ) * trigo_step];
1347 224696 : move16();
1348 :
1349 : /*-----------------------------------------------------------------*
1350 : * Synthesizing & resampling
1351 : *-----------------------------------------------------------------*/
1352 :
1353 224696 : offset = negate( ovl );
1354 :
1355 224696 : test();
1356 224696 : IF( EQ_16( L_frame, L_FRAME ) || EQ_16( L_frame, L_FRAME16k ) )
1357 : {
1358 : // for ( i = (int16_t) ( 200 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i < (int16_t) ( 400 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i++ )
1359 11492763 : FOR( i = 320; i < 640; i++ )
1360 : {
1361 : // hStereoDft->icbweRefEner += pDFT_in[2 * i] * pDFT_in[2 * i] + pDFT_in[2 * i + 1] * pDFT_in[2 * i + 1];
1362 11456960 : hStereoDft->icbweRefEner_fx = BASOP_Util_Add_Mant32Exp( hStereoDft->icbweRefEner_fx, hStereoDft->icbweRefEner_fx_e, L_add( L_shr( Mpy_32_32( pDFT_in_fx[2 * i], pDFT_in_fx[2 * i] ), 1 ), L_shr( Mpy_32_32( pDFT_in_fx[2 * i + 1], pDFT_in_fx[2 * i + 1] ), 1 ) ), add( shl( DFT_in_fx_e, 1 ), 1 ), &hStereoDft->icbweRefEner_fx_e );
1363 11456960 : move32();
1364 : }
1365 : // for ( i = 0; i < (int16_t) ( 200 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i++ )
1366 11492763 : FOR( i = 0; i < 320; i++ )
1367 : {
1368 : // hStereoDft->lbEner += pDFT_in[2 * i] * pDFT_in[2 * i] + pDFT_in[2 * i + 1] * pDFT_in[2 * i + 1];
1369 11456960 : hStereoDft->lbEner_fx = BASOP_Util_Add_Mant32Exp( hStereoDft->lbEner_fx, hStereoDft->lbEner_fx_e, L_add( L_shr( Mpy_32_32( pDFT_in_fx[2 * i], pDFT_in_fx[2 * i] ), 1 ), L_shr( Mpy_32_32( pDFT_in_fx[2 * i + 1], pDFT_in_fx[2 * i + 1] ), 1 ) ), add( shl( DFT_in_fx_e, 1 ), 1 ), &hStereoDft->lbEner_fx_e );
1370 11456960 : move32();
1371 : }
1372 35803 : hStereoDft->icbweRefEner_fx = Mpy_32_32( hStereoDft->icbweRefEner_fx, fac_fx );
1373 35803 : move32();
1374 35803 : hStereoDft->lbEner_fx = Mpy_32_32( hStereoDft->lbEner_fx, fac_fx );
1375 35803 : move32();
1376 : }
1377 :
1378 : /*Flip?*/
1379 224696 : set32_fx( tmp_fx, 0, STEREO_DFT_N_MAX_ENC );
1380 224696 : IF( EQ_16( L_frame, L_FRAME ) )
1381 : {
1382 : /* 6 to 14 kHz SHB target signal*/
1383 17232 : j = 2;
1384 17232 : move16();
1385 17232 : sign = hStereoDft->flip_sign;
1386 17232 : move16();
1387 :
1388 : // for ( i = (int16_t) ( 350 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ); i >= (int16_t) 150 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i-- )
1389 5548704 : FOR( i = 560; i >= 240; i-- )
1390 : {
1391 : /* alternate sign between frames for even starting index */
1392 5531472 : tmp_fx[j++] = W_extract_l( W_mult0_32_32( sign, Mpy_32_32( pDFT_in_fx[2 * i], fac_fx ) ) );
1393 5531472 : tmp_fx[j++] = W_extract_l( W_mult0_32_32( negate( sign ), Mpy_32_32( pDFT_in_fx[2 * i + 1], fac_fx ) ) );
1394 5531472 : move32();
1395 5531472 : move32();
1396 : }
1397 17232 : scal_fac = sub( L_norm_arr( tmp_fx, STEREO_DFT_N_MAX_ENC ), 1 );
1398 17232 : scale_sig32( tmp_fx, STEREO_DFT_N_MAX_ENC, scal_fac ); // Q16
1399 17232 : DFT_in_fx_e = sub( DFT_in_fx_e, scal_fac );
1400 :
1401 17232 : hStereoDft->flip_sign = negate( sign );
1402 17232 : move16();
1403 :
1404 : // for ( i = 0; i <= (int16_t) 100 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i++ )
1405 2791584 : FOR( i = 0; i <= 160; i++ )
1406 : {
1407 2774352 : nrg_fx = BASOP_Util_Add_Mant32Exp( nrg_fx, nrg_fx_e, Mpy_32_32( tmp_fx[2 * i], tmp_fx[2 * i] ), shl( DFT_in_fx_e, 1 ), &nrg_fx_e );
1408 2774352 : nrg_fx = BASOP_Util_Add_Mant32Exp( nrg_fx, nrg_fx_e, Mpy_32_32( tmp_fx[2 * i + 1], tmp_fx[2 * i + 1] ), shl( DFT_in_fx_e, 1 ), &nrg_fx_e );
1409 : }
1410 : }
1411 207464 : ELSE IF( EQ_16( L_frame, L_FRAME16k ) )
1412 : {
1413 : /* 7.5 - 15.5 kHz SHB target signal*/
1414 18571 : j = 2;
1415 18571 : move16();
1416 : // for ( i = (int16_t) ( 400 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) ) - 1; i >= (int16_t) 200 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i-- )
1417 5961291 : FOR( i = 640 - 1; i >= 320; i-- )
1418 : {
1419 5942720 : tmp_fx[j++] = Mpy_32_32( pDFT_in_fx[2 * i], fac_fx );
1420 5942720 : tmp_fx[j++] = L_negate( Mpy_32_32( pDFT_in_fx[2 * i + 1], fac_fx ) );
1421 5942720 : move32();
1422 5942720 : move32();
1423 : }
1424 18571 : scal_fac = sub( L_norm_arr( tmp_fx, STEREO_DFT_N_MAX_ENC ), 1 );
1425 18571 : scale_sig32( tmp_fx, STEREO_DFT_N_MAX_ENC, scal_fac ); // Q16
1426 18571 : DFT_in_fx_e = sub( DFT_in_fx_e, scal_fac );
1427 :
1428 : // for ( i = 0; i <= (int16_t) 100 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ); i++ )
1429 3008502 : FOR( i = 0; i <= 160; i++ )
1430 : {
1431 2989931 : nrg_fx = BASOP_Util_Add_Mant32Exp( nrg_fx, nrg_fx_e, Mpy_32_32( tmp_fx[2 * i], tmp_fx[2 * i] ), shl( DFT_in_fx_e, 1 ), &nrg_fx_e );
1432 2989931 : nrg_fx = BASOP_Util_Add_Mant32Exp( nrg_fx, nrg_fx_e, Mpy_32_32( tmp_fx[2 * i + 1], tmp_fx[2 * i + 1] ), shl( DFT_in_fx_e, 1 ), &nrg_fx_e );
1433 : }
1434 : }
1435 188893 : ELSE IF( NE_32( fac_fx, MAX_32 ) )
1436 : {
1437 : /*Copy and scale*/
1438 129234 : tmp_fx[0] = Mpy_32_32( pDFT_in_fx[0], fac_fx );
1439 129234 : move32();
1440 129234 : tmp_fx[1] = 0;
1441 129234 : move32();
1442 69508654 : FOR( i = 2; i < NFFT; i++ )
1443 : {
1444 69379420 : tmp_fx[i] = Mpy_32_32( pDFT_in_fx[i], fac_fx );
1445 69379420 : move32();
1446 : }
1447 :
1448 129234 : IF( LT_32( fac_fx, MAX_32 ) )
1449 : {
1450 129234 : tmp_fx[1] = 0; /*Nyquist is set to 0*/
1451 129234 : tmp_fx[0] = 0; /*DC is set to 0*/
1452 129234 : move32();
1453 129234 : move32();
1454 : }
1455 129234 : scal_fac = sub( L_norm_arr( tmp_fx, STEREO_DFT_N_MAX_ENC ), 1 );
1456 129234 : scale_sig32( tmp_fx, STEREO_DFT_N_MAX_ENC, scal_fac ); // Q16
1457 129234 : DFT_in_fx_e = sub( DFT_in_fx_e, scal_fac );
1458 : }
1459 : ELSE
1460 : {
1461 82403979 : FOR( i = 0; i < NFFT; i++ )
1462 : {
1463 82344320 : tmp_fx[i] = pDFT_in_fx[i];
1464 82344320 : move32();
1465 : }
1466 59659 : scal_fac = sub( L_norm_arr( tmp_fx, STEREO_DFT_N_MAX_ENC ), 1 );
1467 59659 : scale_sig32( tmp_fx, STEREO_DFT_N_MAX_ENC, scal_fac ); // Q16
1468 59659 : DFT_in_fx_e = sub( DFT_in_fx_e, scal_fac );
1469 : }
1470 :
1471 : /*Reconstruct */
1472 : /*IFFT*/
1473 224696 : scal_fac = sub( 1, find_guarded_bits_fx( NFFT ) );
1474 224696 : scale_sig32( tmp_fx, NFFT, scal_fac ); // Q16
1475 224696 : rfft_fx( tmp_fx, trigo_enc_fx, NFFT, +1 );
1476 224696 : Scale_sig32( tmp_fx, NFFT, sub( sub( DFT_in_fx_e, scal_fac ), 16 ) ); // Q15
1477 :
1478 38483224 : FOR( i = 0; i < ovl; i++ )
1479 : {
1480 : // output[offset + i] = mem[i] + tmp[zp + i] * win[i];
1481 38258528 : output_fx[offset + i] = L_add_sat( mem_fx[i], Mpy_32_32( tmp_fx[zp + i], win_fx[i] ) ); // Q15
1482 38258528 : move32();
1483 : // mem[i] = tmp[zp + N + i] * win[ovl - 1 - i];
1484 38258528 : mem_fx[i] = Mpy_32_32( tmp_fx[zp + N + i], win_fx[ovl - 1 - i] ); // Q15
1485 38258528 : move32();
1486 : }
1487 :
1488 : /*Middle->Copy*/
1489 49414232 : FOR( i = 0; i < N - ovl; i++ )
1490 : {
1491 : // output_fx[offset + ovl + i] = tmp[zp + ovl + i];
1492 49189536 : output_fx[offset + ovl + i] = tmp_fx[zp + ovl + i]; // Q15
1493 49189536 : move32();
1494 : }
1495 :
1496 : /*-----------------------------------------------------------------*
1497 : * Lookahead: redress signal
1498 : *-----------------------------------------------------------------*/
1499 :
1500 38483224 : FOR( i = 0; i < ovl; i++ )
1501 : {
1502 38258528 : Word32 ifft_deviation = tmp_fx[zp + N + ovl]; // Q15
1503 38258528 : move32();
1504 : // output[offset + N + i] = ( tmp[zp + N + i] - ifft_deviation ) / win_ana[ovl - 1 - i] + ifft_deviation;
1505 : Word16 L_temp_e;
1506 38258528 : Word32 L_temp = BASOP_Util_Divide3232_Scale_newton( L_sub_sat( tmp_fx[zp + N + i], ifft_deviation ), L_deposit_h( win_ana_fx[ovl - 1 - i] ), &L_temp_e );
1507 38258528 : L_temp = L_shl_sat( L_temp, L_temp_e );
1508 38258528 : output_fx[offset + N + i] = L_add_sat( L_temp, ifft_deviation ); // Q15
1509 38258528 : move32();
1510 : }
1511 :
1512 224696 : *output_start_index = offset;
1513 224696 : move16();
1514 224696 : *output_end_index = add( add( offset, ovl ), N );
1515 224696 : move16();
1516 224696 : IF( nrg_out_fx_e )
1517 : {
1518 35803 : *nrg_out_fx_e = nrg_fx_e;
1519 35803 : move16();
1520 : }
1521 224696 : pop_wmops();
1522 224696 : return ( nrg_fx );
1523 : }
1524 :
1525 : /*-------------------------------------------------------------------------
1526 : * stereo_dft_enc_process()
1527 : *
1528 : * DFT-based stereo main processing function:
1529 : * 1) compute/encode stereo parameters
1530 : * 2) Mid/Side computation
1531 : *-------------------------------------------------------------------------*/
1532 59659 : void stereo_dft_enc_process_fx(
1533 : CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */
1534 : const Word16 vad_flag_dtx[], /* i : VAD dtx flags */
1535 : const Word16 vad_hover_flag[], /* i : VAD hangover flags */
1536 : const Word16 input_frame /* i : input frame length */
1537 : )
1538 : {
1539 : Word16 i, j, b;
1540 : Word32 *pDFT_L_fx, *pDFT_R_fx;
1541 : Word32 *pDFT_DMX;
1542 : Word32 *pDFT_RES;
1543 : Word16 k_offset;
1544 : Word32 *pgIpd;
1545 : Word32 *pSideGain;
1546 : Word16 c_fx /*Q15*/, alpha_fx /*Q13*/;
1547 : Word32 g_fx; // Q31
1548 : Word32 wL, wR;
1549 : Word16 wL_e, wR_e;
1550 : Word16 wS;
1551 : Word16 tmp_fx;
1552 : Word32 tmp_32fx;
1553 : Word16 s_fx /*Q15*/, c1_fx /*Q15*/, s1_fx /*Q15*/;
1554 : Word16 fac_att_fx; // Q15
1555 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft;
1556 : Word32 DFT_DMX[STEREO_DFT_N_MAX_ENC];
1557 : Word16 DFT_DMX_e[STEREO_DFT_N_MAX_ENC];
1558 : Word32 DFT_RES[STEREO_DFT_N_8k_ENC];
1559 : Word16 DFT_RES_e[STEREO_DFT_N_8k_ENC];
1560 : Word32 input_Fs;
1561 : Word32 bin_nrgL_fx[STEREO_DFT_N_MAX_ENC];
1562 : Word16 bin_nrgL_fx_e[STEREO_DFT_N_MAX_ENC];
1563 : Word32 bin_nrgR_fx[STEREO_DFT_N_MAX_ENC];
1564 : Word16 bin_nrgR_fx_e[STEREO_DFT_N_MAX_ENC];
1565 : Word32 *pNrgL, *pNrgR;
1566 : Word32 res_nrg_all_curr, dmx_nrg_all_curr;
1567 : Word16 res_nrg_all_curr_e, dmx_nrg_all_curr_e;
1568 : Word32 res_dmx_ratio /*Q31*/, frame_nrg_ratio /*Q28*/;
1569 : Word32 dot_prod_nrg_ratio_fx[STEREO_DFT_BAND_MAX]; /* contains only dot product for higher bands Q31 */
1570 : Word16 dot_prod_nrg_ratio_fx_e[STEREO_DFT_BAND_MAX]; /* contains only dot product for higher bands Q31 */
1571 : Word32 sum_nrg_L2, sum_nrg_R2, dot_prod_real2;
1572 : Word16 sum_nrg_L2_e, sum_nrg_R2_e, dot_prod_real2_e;
1573 : Word32 sum_nrg_Mid, sum_abs;
1574 : Word16 sum_nrg_Mid_e, sum_abs_e;
1575 : Word16 tmp_e;
1576 : Word16 DFT_L_e_tmp[STEREO_DFT_N_MAX_ENC], DFT_R_e_tmp[STEREO_DFT_N_MAX_ENC];
1577 : Word32 L_tmp1, L_tmp2, L_tmp3;
1578 : Word16 L_tmp1_e, L_tmp2_e, L_tmp3_e;
1579 :
1580 : /*------------------------------------------------------------------*
1581 : * Initialization
1582 : *-----------------------------------------------------------------*/
1583 :
1584 59659 : input_Fs = L_mult0( input_frame, FRAMES_PER_SEC );
1585 :
1586 59659 : hStereoDft = hCPE->hStereoDft;
1587 :
1588 59659 : wL = 0; /* avoid compilation warning */
1589 59659 : move32();
1590 59659 : wL_e = 0; /* avoid compilation warning */
1591 59659 : move16();
1592 59659 : wR = 0; /* avoid compilation warning */
1593 59659 : move32();
1594 59659 : wR_e = 0; /* avoid compilation warning */
1595 59659 : move16();
1596 :
1597 : /* Initialization */
1598 59659 : k_offset = STEREO_DFT_OFFSET; /*Add an offset at encoder*/
1599 59659 : move16();
1600 :
1601 59659 : hStereoDft->gipd_band_max = dft_band_ipd[1][3];
1602 59659 : move16();
1603 59659 : hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]];
1604 59659 : move16();
1605 : // hStereoDft->res_cod_line_max = (int16_t) ( 0.5f + ( hStereoDft->band_limits[hStereoDft->res_cod_band_max] - 1 ) * 2.f * input_frame / (float) ( hStereoDft->NFFT ) );
1606 59659 : tmp_32fx = L_shl( L_mult0( sub( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ), input_frame ), 1 );
1607 59659 : tmp_32fx = BASOP_Util_Divide3216_Scale( tmp_32fx, hStereoDft->NFFT, &tmp_e );
1608 59659 : hStereoDft->res_cod_line_max = extract_l( L_shr_r( tmp_32fx, sub( -1, tmp_e ) ) ); // 15 - (31 - 15 + tmp_e) = -1 - tmp_e
1609 59659 : move16();
1610 : // hStereoDft->res_cod_line_max = 8 * (hStereoDft->res_cod_line_max / 8);
1611 59659 : hStereoDft->res_cod_line_max = shl( shr( hStereoDft->res_cod_line_max, 3 ), 3 );
1612 59659 : move16();
1613 59659 : hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
1614 59659 : move16();
1615 :
1616 : // hStereoDft->voicing_lt = 0.75f * hStereoDft->voicing_lt + 0.25f * hCPE->hCoreCoder[0]->voicing[0];
1617 : // hStereoDft->voicing_lt = 0.75f * hStereoDft->voicing_lt + 0.25f * hCPE->hCoreCoder[0]->voicing[1];
1618 :
1619 59659 : hStereoDft->voicing_lt_fx = L_add( Mpy_32_16_1( hStereoDft->voicing_lt_fx, 24576 ), L_mult( 8192, hCPE->hCoreCoder[0]->voicing_fx[0] ) );
1620 59659 : move32();
1621 59659 : hStereoDft->voicing_lt_fx = L_add( Mpy_32_16_1( hStereoDft->voicing_lt_fx, 24576 ), L_mult( 8192, hCPE->hCoreCoder[0]->voicing_fx[1] ) );
1622 59659 : move32();
1623 :
1624 : /*------------------------------------------------------------------*
1625 : * Compute stereo parameters
1626 : *-----------------------------------------------------------------*/
1627 :
1628 : /*ITD in Frequency domain*/
1629 : // fac_att = 1.0f;
1630 59659 : fac_att_fx = MAX_16;
1631 59659 : move16();
1632 :
1633 59659 : pDFT_L_fx = hStereoDft->DFT_fx[0];
1634 59659 : pDFT_R_fx = hStereoDft->DFT_fx[1];
1635 82403979 : FOR( i = 0; i < hStereoDft->NFFT; i++ )
1636 : {
1637 82344320 : tmp_e = norm_l( hStereoDft->DFT_fx[0][i] );
1638 82344320 : pDFT_L_fx[i] = L_shl( hStereoDft->DFT_fx[0][i], tmp_e );
1639 82344320 : move32();
1640 82344320 : DFT_L_e_tmp[i] = sub( hStereoDft->DFT_fx_e[0], tmp_e );
1641 82344320 : move16();
1642 82344320 : tmp_e = norm_l( hStereoDft->DFT_fx[1][i] );
1643 82344320 : pDFT_R_fx[i] = L_shl( hStereoDft->DFT_fx[1][i], tmp_e );
1644 82344320 : move32();
1645 82344320 : DFT_R_e_tmp[i] = sub( hStereoDft->DFT_fx_e[1], tmp_e );
1646 82344320 : move16();
1647 : }
1648 :
1649 : {
1650 59659 : stereo_dft_enc_compute_itd_fx( hCPE, pDFT_L_fx, DFT_L_e_tmp, pDFT_R_fx, DFT_R_e_tmp, k_offset, input_frame, vad_flag_dtx, vad_hover_flag, bin_nrgL_fx, bin_nrgL_fx_e, bin_nrgR_fx, bin_nrgR_fx_e );
1651 :
1652 59659 : IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) )
1653 : {
1654 0 : return;
1655 : }
1656 :
1657 59659 : test();
1658 59659 : IF( hStereoDft->hItd->deltaItd_fx[k_offset] != 0 && hStereoDft->hConfig->dmx_active )
1659 : {
1660 : /*time shift channels*/
1661 : // alpha = -2.0f * EVS_PI * hStereoDft->hItd->deltaItd[k_offset] / hStereoDft->NFFT;
1662 22804 : alpha_fx = BASOP_Util_Divide3216_Scale( hStereoDft->hItd->deltaItd_fx[k_offset], hStereoDft->NFFT, &tmp_e );
1663 22804 : alpha_fx = negate( shl_r( mult_r( EVS_PI_FX, alpha_fx ), add( tmp_e, 1 ) ) ); // Q13*Q15= Q13
1664 :
1665 : // c = 1.f; /*cos(0)*/
1666 22804 : c_fx = MAX_16; /*cos(0)*/
1667 22804 : move16();
1668 : // s = 0.f; /*sin(0)*/
1669 22804 : s_fx = 0; /*sin(0)*/
1670 22804 : move16();
1671 : // c1 = cosf( alpha );
1672 22804 : c1_fx = shl_sat( getCosWord16( alpha_fx ), 1 );
1673 : // s1 = sinf( alpha );
1674 22804 : s1_fx = getSinWord16( alpha_fx );
1675 :
1676 22804 : IF( alpha_fx >= 0 )
1677 : {
1678 15499 : c_fx = shr( c_fx, 1 );
1679 15499 : s_fx = shr( s_fx, 1 );
1680 11169280 : FOR( i = 1; i < hStereoDft->NFFT / 2; i++ )
1681 : {
1682 : // tmp = s * c1 + c * s1;
1683 11153781 : tmp_fx = add( mult_r( s_fx, c1_fx ), mult_r( c_fx, s1_fx ) );
1684 : // c = c * c1 - s * s1;
1685 11153781 : c_fx = sub( mult_r( c_fx, c1_fx ), mult_r( s_fx, s1_fx ) );
1686 11153781 : s_fx = tmp_fx;
1687 11153781 : move16();
1688 :
1689 : /*time shift of L*/
1690 : // tmp = pDFT_L[2 * i] * c - pDFT_L[2 * i + 1] * s;
1691 11153781 : tmp_32fx = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( pDFT_L_fx[2 * i], c_fx ), add( DFT_L_e_tmp[2 * i], 1 ), L_negate( Mpy_32_16_1( pDFT_L_fx[2 * i + 1], s_fx ) ), add( DFT_L_e_tmp[2 * i + 1], 1 ), &tmp_e );
1692 : // pDFT_L[2 * i + 1] = pDFT_L[2 * i] * s + pDFT_L[2 * i + 1] * c;
1693 11153781 : pDFT_L_fx[2 * i + 1] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( pDFT_L_fx[2 * i], s_fx ), add( DFT_L_e_tmp[2 * i], 1 ), Mpy_32_16_1( pDFT_L_fx[2 * i + 1], c_fx ), add( DFT_L_e_tmp[2 * i + 1], 1 ), &DFT_L_e_tmp[2 * i + 1] );
1694 11153781 : move32();
1695 : // pDFT_L[2 * i] = tmp;
1696 11153781 : pDFT_L_fx[2 * i] = tmp_32fx;
1697 11153781 : move32();
1698 11153781 : DFT_L_e_tmp[2 * i] = tmp_e;
1699 11153781 : move16();
1700 : }
1701 : }
1702 : ELSE
1703 : {
1704 4759360 : FOR( i = 1; i < hStereoDft->NFFT / 2; i++ )
1705 : {
1706 : // tmp = s * c1 + c * s1;
1707 4752055 : tmp_fx = add_sat( mult_r( s_fx, c1_fx ), mult_r( c_fx, s1_fx ) ); // saturation expected
1708 : // c = c * c1 - s * s1;
1709 4752055 : c_fx = sub_sat( mult_r( c_fx, c1_fx ), mult_r( s_fx, s1_fx ) ); // saturation expected
1710 4752055 : s_fx = tmp_fx;
1711 4752055 : move16();
1712 :
1713 : /*time shift of R*/
1714 : // tmp = pDFT_R[2 * i] * c + pDFT_R[2 * i + 1] * s;
1715 4752055 : tmp_32fx = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( pDFT_R_fx[2 * i], c_fx ), DFT_R_e_tmp[2 * i], Mpy_32_16_1( pDFT_R_fx[2 * i + 1], s_fx ), DFT_R_e_tmp[2 * i + 1], &tmp_e );
1716 : // pDFT_R[2 * i + 1] = -pDFT_R[2 * i] * s + pDFT_R[2 * i + 1] * c;
1717 4752055 : pDFT_R_fx[2 * i + 1] = BASOP_Util_Add_Mant32Exp( L_negate( Mpy_32_16_1( pDFT_R_fx[2 * i], s_fx ) ), DFT_R_e_tmp[2 * i], Mpy_32_16_1( pDFT_R_fx[2 * i + 1], c_fx ), DFT_R_e_tmp[2 * i + 1], &DFT_R_e_tmp[2 * i + 1] );
1718 4752055 : move32();
1719 : // pDFT_R[2 * i] = tmp;
1720 4752055 : pDFT_R_fx[2 * i] = tmp_32fx;
1721 4752055 : move32();
1722 4752055 : DFT_R_e_tmp[2 * i] = tmp_e;
1723 4752055 : move16();
1724 : }
1725 : }
1726 :
1727 : // if ( fabsf( hStereoDft->hItd->deltaItd[k_offset] * 32000.f / input_Fs ) > 80.0f )
1728 22804 : tmp_32fx = L_abs( BASOP_Util_Divide3232_Scale_newton( hStereoDft->hItd->deltaItd_fx[k_offset], input_Fs, &tmp_e ) );
1729 22804 : tmp_e = add( tmp_e, 15 - 31 );
1730 22804 : IF( BASOP_Util_Cmp_Mant32Exp( tmp_32fx, tmp_e, 5368709 /* 80.0f / 32000.f in Q31 */, 0 ) > 0 )
1731 : {
1732 : // fac_att = min( 1.0f, max( 0.2f, 2.6f - 0.02f * fabsf( hStereoDft->hItd->deltaItd[1] ) * 32000.f / input_Fs ) );
1733 5932 : tmp_fx = BASOP_Util_Divide3232_Scale( L_abs( hStereoDft->hItd->deltaItd_fx[1] ), input_Fs, &tmp_e );
1734 5932 : tmp_e = add( tmp_e, 15 - 31 );
1735 5932 : tmp_32fx = L_sub( 85197 /*2.6f in Q15*/, L_shl( L_mult0( tmp_fx, 640 /*0.02f * 32000.f in Q0*/ ), tmp_e ) ); // Q15
1736 5932 : fac_att_fx = extract_l( L_min( MAX_16, L_max( 6554 /*0.2f in Q15*/, tmp_32fx ) ) ); // Q15
1737 : }
1738 : }
1739 :
1740 : /* compute remaining binwise energies for FB mode (ITD function only computes energies up to 16 kHz) */
1741 6743819 : FOR( i = STEREO_DFT_N_32k_ENC / 2; i < hStereoDft->NFFT / 2; i++ )
1742 : {
1743 : // bin_nrgL[i] = pDFT_L[2 * i] * pDFT_L[2 * i] + pDFT_L[2 * i + 1] * pDFT_L[2 * i + 1];
1744 6684160 : bin_nrgL_fx[i] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L_fx[2 * i], pDFT_L_fx[2 * i] ), shl( DFT_L_e_tmp[2 * i], 1 ), Mpy_32_32( pDFT_L_fx[2 * i + 1], pDFT_L_fx[2 * i + 1] ), shl( DFT_L_e_tmp[2 * i + 1], 1 ), &bin_nrgL_fx_e[i] );
1745 6684160 : move32();
1746 : // bin_nrgR[i] = pDFT_R[2 * i] * pDFT_R[2 * i] + pDFT_R[2 * i + 1] * pDFT_R[2 * i + 1];
1747 6684160 : bin_nrgR_fx[i] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_R_fx[2 * i], pDFT_R_fx[2 * i] ), shl( DFT_R_e_tmp[2 * i], 1 ), Mpy_32_32( pDFT_R_fx[2 * i + 1], pDFT_R_fx[2 * i + 1] ), shl( DFT_R_e_tmp[2 * i + 1], 1 ), &bin_nrgR_fx_e[i] );
1748 6684160 : move32();
1749 : }
1750 : }
1751 :
1752 : /* DFT stereo parameters */
1753 59659 : stereo_dft_enc_compute_prm_fx( hStereoDft, pDFT_L_fx, DFT_L_e_tmp, pDFT_R_fx, DFT_R_e_tmp, k_offset, 1, hCPE->hCoreCoder[0]->sp_aud_decision0, hCPE->hCoreCoder[0]->vad_flag, bin_nrgL_fx, bin_nrgL_fx_e, bin_nrgR_fx, bin_nrgR_fx_e, dot_prod_nrg_ratio_fx, dot_prod_nrg_ratio_fx_e );
1754 : // printf("\n%f ", (float)hStereoDft->res_pred_gain_fx[0] / 0x7fffffff);
1755 : // printf("\n%f ", (float)hStereoDft->sum_dot_prod_img_fx / powf(2, 31 - hStereoDft->sum_dot_prod_img_fx_e
1756 :
1757 59659 : IF( vad_flag_dtx[0] == 0 )
1758 : {
1759 10482 : test();
1760 10482 : IF( hCPE->hStereoCng->cng_counter == 0 && !hCPE->hStereoCng->first_SID_after_TD )
1761 : {
1762 128 : hStereoDft->sid_gipd_fx = hStereoDft->prev_sid_gipd_fx;
1763 128 : move32();
1764 128 : hStereoDft->no_ipd_flag = hStereoDft->prev_sid_no_ipd_flag;
1765 128 : move16();
1766 : }
1767 :
1768 10482 : IF( GT_16( hCPE->hStereoCng->cng_counter, ITD_SID_PREV_FRAMES ) )
1769 : {
1770 9398 : hStereoDft->prev_sid_gipd_fx = hStereoDft->sid_gipd_fx;
1771 9398 : move32();
1772 9398 : hStereoDft->prev_sid_no_ipd_flag = hStereoDft->no_ipd_flag;
1773 9398 : move16();
1774 : }
1775 : }
1776 :
1777 :
1778 : /*----------------------------------------------------------------*
1779 : * UNCLR classifier (detection of uncorrelated L and R channels)
1780 : *----------------------------------------------------------------*/
1781 :
1782 59659 : unclr_classifier_dft_fx( hCPE );
1783 :
1784 : /*------------------------------------------------------------------*
1785 : * Channel mapping: computation of DMX and RES
1786 : *-----------------------------------------------------------------*/
1787 :
1788 59659 : res_nrg_all_curr = EPSILON_FX_M;
1789 59659 : move32();
1790 59659 : res_nrg_all_curr_e = EPSILON_FX_E;
1791 59659 : move16();
1792 59659 : dmx_nrg_all_curr = EPSILON_FX_M;
1793 59659 : move32();
1794 59659 : dmx_nrg_all_curr_e = EPSILON_FX_E;
1795 59659 : move16();
1796 :
1797 59659 : pDFT_DMX = DFT_DMX;
1798 59659 : pDFT_RES = DFT_RES;
1799 59659 : pNrgL = bin_nrgL_fx;
1800 59659 : pNrgR = bin_nrgR_fx;
1801 :
1802 59659 : set_zero_fx( pDFT_DMX, STEREO_DFT_N_MAX_ENC );
1803 59659 : set16_zero_fx( DFT_DMX_e, STEREO_DFT_N_MAX_ENC );
1804 59659 : set_zero_fx( pDFT_RES, STEREO_DFT_N_8k_ENC );
1805 59659 : set16_zero_fx( DFT_RES_e, STEREO_DFT_N_8k_ENC );
1806 :
1807 59659 : pgIpd = hStereoDft->gipd_fx + k_offset;
1808 59659 : pSideGain = hStereoDft->side_gain_fx + k_offset * STEREO_DFT_BAND_MAX;
1809 :
1810 :
1811 59659 : IF( hStereoDft->hConfig->dmx_active )
1812 : {
1813 : /*Active DMX*/
1814 : // alpha = 0; /* to avoid compilation warning */
1815 59659 : alpha_fx = 0; /* to avoid compilation warning */
1816 59659 : move16();
1817 59659 : g_fx = MAX_32;
1818 59659 : move32();
1819 :
1820 : /*Apply active DMX*/
1821 59659 : pDFT_DMX[0] = 0;
1822 59659 : move32();
1823 59659 : DFT_DMX_e[0] = 0;
1824 59659 : move16();
1825 59659 : pDFT_RES[0] = 0;
1826 59659 : move32();
1827 59659 : DFT_RES_e[0] = 0;
1828 59659 : move16();
1829 760720 : FOR( b = 0; b < hStereoDft->nbands_dmx; b++ )
1830 : {
1831 701061 : g_fx = pSideGain[b];
1832 701061 : move32();
1833 :
1834 701061 : IF( pgIpd[0] != 0 )
1835 : {
1836 199309 : Word32 theta = pgIpd[0];
1837 201224 : WHILE( GT_32( theta, EVS_2PI_FX ) )
1838 : {
1839 1915 : theta = L_sub( theta, EVS_2PI_FX ); /* Q13 */
1840 : }
1841 201061 : WHILE( LT_32( theta, -EVS_2PI_FX ) )
1842 : {
1843 1752 : theta = L_add( theta, EVS_2PI_FX ); /* Q13 */
1844 : }
1845 :
1846 199309 : IF( GT_32( theta, MAX_16 ) )
1847 : {
1848 11464 : theta = L_sub( theta, EVS_2PI_FX ); /* Q13 */
1849 : }
1850 187845 : ELSE IF( LT_32( theta, MIN_16 ) )
1851 : {
1852 1152 : theta = L_add( theta, EVS_2PI_FX ); /* Q13 */
1853 : }
1854 :
1855 199309 : c_fx = shl_sat( getCosWord16( extract_l( theta ) ), 1 );
1856 199309 : s_fx = getSinWord16( extract_l( theta ) );
1857 :
1858 10708352 : FOR( i = hStereoDft->band_limits_dmx[b]; i < hStereoDft->band_limits_dmx[b + 1]; i++ )
1859 : {
1860 : /*rotate L*/
1861 : // tmp = pDFT_L[2 * i] * c + pDFT_L[2 * i + 1] * s;
1862 10509043 : tmp_32fx = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( pDFT_L_fx[2 * i], c_fx ), DFT_L_e_tmp[2 * i], Mpy_32_16_1( pDFT_L_fx[2 * i + 1], s_fx ), DFT_L_e_tmp[2 * i + 1], &tmp_e );
1863 : // pDFT_L[2 * i + 1] = pDFT_L[2 * i + 1] * c - pDFT_L[2 * i] * s;
1864 10509043 : pDFT_L_fx[2 * i + 1] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( pDFT_L_fx[2 * i + 1], c_fx ), DFT_L_e_tmp[2 * i + 1], L_negate( Mpy_32_16_1( pDFT_L_fx[2 * i], s_fx ) ), DFT_L_e_tmp[2 * i], &DFT_L_e_tmp[2 * i + 1] );
1865 10509043 : move32();
1866 : // pDFT_L[2 * i] = tmp;
1867 10509043 : pDFT_L_fx[2 * i] = tmp_32fx;
1868 10509043 : move32();
1869 10509043 : DFT_L_e_tmp[2 * i] = tmp_e;
1870 10509043 : move16();
1871 : }
1872 : }
1873 :
1874 701061 : test();
1875 701061 : IF( LT_16( b, hStereoDft->res_cod_band_max ) && vad_flag_dtx[0] )
1876 : {
1877 :
1878 : /*Get the previous frame energy*/
1879 86890 : IF( hStereoDft->hConfig->ada_wb_res_cod_mode )
1880 : {
1881 : /*Calculate the energy of RES and DMX*/
1882 : /* 90% of old frame ... */
1883 : // dmx_nrg_all_curr += hStereoDft->res_cod_NRG_M[b] * 0.9f;
1884 86890 : dmx_nrg_all_curr = BASOP_Util_Add_Mant32Exp( dmx_nrg_all_curr, dmx_nrg_all_curr_e, Mpy_32_32( hStereoDft->res_cod_NRG_M_fx[b], 1932735283 /*0.9f*/ ), hStereoDft->res_cod_NRG_M_fx_e[b], &dmx_nrg_all_curr_e );
1885 : // res_nrg_all_curr += hStereoDft->res_cod_NRG_S[b] * 0.9f;
1886 86890 : res_nrg_all_curr = BASOP_Util_Add_Mant32Exp( res_nrg_all_curr, res_nrg_all_curr_e, Mpy_32_32( hStereoDft->res_cod_NRG_S_fx[b], 1932735283 /*0.9f*/ ), hStereoDft->res_cod_NRG_S_fx_e[b], &res_nrg_all_curr_e );
1887 : }
1888 86890 : hStereoDft->res_cod_NRG_M_fx[b] = EPSILON_FX_M;
1889 86890 : move32();
1890 86890 : hStereoDft->res_cod_NRG_M_fx_e[b] = EPSILON_FX_E;
1891 86890 : move16();
1892 86890 : hStereoDft->res_cod_NRG_S_fx[b] = EPSILON_FX_M;
1893 86890 : move32();
1894 86890 : hStereoDft->res_cod_NRG_S_fx_e[b] = EPSILON_FX_E;
1895 86890 : move16();
1896 :
1897 799388 : FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
1898 : {
1899 : // pDFT_DMX[2 * i] = ( pDFT_L[2 * i] + pDFT_R[2 * i] ) * 0.5f;
1900 712498 : pDFT_DMX[2 * i] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * i], DFT_L_e_tmp[2 * i], pDFT_R_fx[2 * i], DFT_R_e_tmp[2 * i], &DFT_DMX_e[2 * i] );
1901 712498 : move32();
1902 712498 : DFT_DMX_e[2 * i] = sub( DFT_DMX_e[2 * i], 1 ); // * 0.5f
1903 712498 : move16();
1904 : // pDFT_DMX[2 * i + 1] = ( pDFT_L[2 * i + 1] + pDFT_R[2 * i + 1] ) * 0.5f;
1905 712498 : pDFT_DMX[2 * i + 1] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * i + 1], DFT_L_e_tmp[2 * i + 1], pDFT_R_fx[2 * i + 1], DFT_R_e_tmp[2 * i + 1], &DFT_DMX_e[2 * i + 1] );
1906 712498 : move32();
1907 712498 : DFT_DMX_e[2 * i + 1] = sub( DFT_DMX_e[2 * i + 1], 1 ); // * 0.5f
1908 712498 : move16();
1909 :
1910 : // pDFT_RES[2 * i] = ( pDFT_L[2 * i] - pDFT_R[2 * i] ) * 0.5f;
1911 712498 : pDFT_RES[2 * i] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * i], DFT_L_e_tmp[2 * i], L_negate( pDFT_R_fx[2 * i] ), DFT_R_e_tmp[2 * i], &DFT_RES_e[2 * i] );
1912 712498 : move32();
1913 712498 : DFT_RES_e[2 * i] = sub( DFT_RES_e[2 * i], 1 ); // * 0.5f
1914 712498 : move16();
1915 : // pDFT_RES[2 * i + 1] = ( pDFT_L[2 * i + 1] - pDFT_R[2 * i + 1] ) * 0.5f;
1916 712498 : pDFT_RES[2 * i + 1] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * i + 1], DFT_L_e_tmp[2 * i + 1], L_negate( pDFT_R_fx[2 * i + 1] ), DFT_R_e_tmp[2 * i + 1], &DFT_RES_e[2 * i + 1] );
1917 712498 : move32();
1918 712498 : DFT_RES_e[2 * i + 1] = sub( DFT_RES_e[2 * i + 1], 1 ); // * 0.5f
1919 712498 : move16();
1920 :
1921 : /*Prediction of RES with DMX*/
1922 : // pDFT_RES[2 * i] = pDFT_RES[2 * i] - g * pDFT_DMX[2 * i];
1923 712498 : pDFT_RES[2 * i] = BASOP_Util_Add_Mant32Exp( pDFT_RES[2 * i], DFT_RES_e[2 * i], L_negate( Mpy_32_32( g_fx, pDFT_DMX[2 * i] ) ), DFT_DMX_e[2 * i], &DFT_RES_e[2 * i] );
1924 712498 : move32();
1925 : // pDFT_RES[2 * i + 1] = pDFT_RES[2 * i + 1] - g * pDFT_DMX[2 * i + 1];
1926 712498 : pDFT_RES[2 * i + 1] = BASOP_Util_Add_Mant32Exp( pDFT_RES[2 * i + 1], DFT_RES_e[2 * i + 1], L_negate( Mpy_32_32( g_fx, pDFT_DMX[2 * i + 1] ) ), DFT_DMX_e[2 * i + 1], &DFT_RES_e[2 * i + 1] );
1927 712498 : move32();
1928 :
1929 : // pDFT_RES[2 * i] *= fac_att;
1930 712498 : pDFT_RES[2 * i] = Mpy_32_16_1( pDFT_RES[2 * i], fac_att_fx );
1931 712498 : move32();
1932 : // pDFT_RES[2 * i + 1] *= fac_att;
1933 712498 : pDFT_RES[2 * i + 1] = Mpy_32_16_1( pDFT_RES[2 * i + 1], fac_att_fx );
1934 712498 : move32();
1935 :
1936 : /*Energy of the DMX and RES*/
1937 : // hStereoDft->res_cod_NRG_M[b] += pDFT_DMX[2 * i] * pDFT_DMX[2 * i] + pDFT_DMX[2 * i + 1] * pDFT_DMX[2 * i + 1];
1938 712498 : tmp_32fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), shl( DFT_DMX_e[2 * i], 1 ), Mpy_32_32( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ), shl( DFT_DMX_e[2 * i + 1], 1 ), &tmp_e );
1939 712498 : hStereoDft->res_cod_NRG_M_fx[b] = BASOP_Util_Add_Mant32Exp( hStereoDft->res_cod_NRG_M_fx[b], hStereoDft->res_cod_NRG_M_fx_e[b], tmp_32fx, tmp_e, &hStereoDft->res_cod_NRG_M_fx_e[b] );
1940 712498 : move32();
1941 : // hStereoDft->res_cod_NRG_S[b] += pDFT_RES[2 * i] * pDFT_RES[2 * i] + pDFT_RES[2 * i + 1] * pDFT_RES[2 * i + 1];
1942 712498 : tmp_32fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_RES[2 * i], pDFT_RES[2 * i] ), shl( DFT_RES_e[2 * i], 1 ), Mpy_32_32( pDFT_RES[2 * i + 1], pDFT_RES[2 * i + 1] ), shl( DFT_RES_e[2 * i + 1], 1 ), &tmp_e );
1943 712498 : hStereoDft->res_cod_NRG_S_fx[b] = BASOP_Util_Add_Mant32Exp( hStereoDft->res_cod_NRG_S_fx[b], hStereoDft->res_cod_NRG_S_fx_e[b], tmp_32fx, tmp_e, &hStereoDft->res_cod_NRG_S_fx_e[b] );
1944 712498 : move32();
1945 : }
1946 :
1947 86890 : IF( hStereoDft->hConfig->ada_wb_res_cod_mode )
1948 : {
1949 : /*Calculate the energy of RES and DMX*/
1950 : /* ... + 10% of current frame. */
1951 : // dmx_nrg_all_curr += hStereoDft->res_cod_NRG_M[b] * 0.1f;
1952 86890 : dmx_nrg_all_curr = BASOP_Util_Add_Mant32Exp( dmx_nrg_all_curr, dmx_nrg_all_curr_e, Mpy_32_32( hStereoDft->res_cod_NRG_M_fx[b], 214748365 /*0.1f*/ ), hStereoDft->res_cod_NRG_M_fx_e[b], &dmx_nrg_all_curr_e );
1953 : // res_nrg_all_curr += hStereoDft->res_cod_NRG_S[b] * 0.1f;
1954 86890 : res_nrg_all_curr = BASOP_Util_Add_Mant32Exp( res_nrg_all_curr, res_nrg_all_curr_e, Mpy_32_32( hStereoDft->res_cod_NRG_S_fx[b], 214748365 /*0.1f*/ ), hStereoDft->res_cod_NRG_S_fx_e[b], &res_nrg_all_curr_e );
1955 : }
1956 : }
1957 : ELSE
1958 : {
1959 : Word16 upper_border;
1960 : Word16 triple_bin;
1961 : Word32 frac_dot_prod; /* fraction of dot product according to energy ratio of current bins and whole band */
1962 : Word16 frac_dot_prod_e; /* fraction of dot product according to energy ratio of current bins and whole band */
1963 : Word32 Sr, Si;
1964 : Word16 Sr_e, Si_e;
1965 : Word32 comb_nrgL, comb_nrgR;
1966 : Word16 comb_nrgL_e, comb_nrgR_e;
1967 :
1968 614171 : upper_border = s_min( STEREO_DFT_DMX_CROSSOVER, hStereoDft->band_limits_dmx[b + 1] );
1969 :
1970 614171 : triple_bin = 0;
1971 614171 : move16();
1972 :
1973 614171 : test();
1974 614171 : IF( GT_16( upper_border, hStereoDft->band_limits_dmx[b] ) && sub( upper_border, hStereoDft->band_limits_dmx[b] ) % 2 )
1975 : {
1976 : /* if odd number of bins in band, combine last 3 bins */
1977 186502 : triple_bin = 1;
1978 186502 : move16();
1979 186502 : upper_border = sub( upper_border, 3 );
1980 : }
1981 :
1982 6242364 : FOR( i = hStereoDft->band_limits_dmx[b]; i < upper_border; i += 2 )
1983 : {
1984 : // comb_nrgL = pNrgL[i] + pNrgL[i + 1];
1985 5628193 : comb_nrgL = BASOP_Util_Add_Mant32Exp( pNrgL[i], bin_nrgL_fx_e[i], pNrgL[i + 1], bin_nrgL_fx_e[i + 1], &comb_nrgL_e );
1986 : // comb_nrgR = pNrgR[i] + pNrgR[i + 1];
1987 5628193 : comb_nrgR = BASOP_Util_Add_Mant32Exp( pNrgR[i], bin_nrgR_fx_e[i], pNrgR[i + 1], bin_nrgR_fx_e[i + 1], &comb_nrgR_e );
1988 :
1989 : // Sr = ( pDFT_L[2 * i] + pDFT_R[2 * i] ) * ( pDFT_L[2 * i] + pDFT_R[2 * i] ) + ( pDFT_L[2 * i + 2] + pDFT_R[2 * i + 2] ) * ( pDFT_L[2 * i + 2] + pDFT_R[2 * i + 2] );
1990 5628193 : L_tmp1 = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * i], DFT_L_e_tmp[2 * i], pDFT_R_fx[2 * i], DFT_R_e_tmp[2 * i], &L_tmp1_e );
1991 5628193 : L_tmp2 = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * i + 2], DFT_L_e_tmp[2 * i + 2], pDFT_R_fx[2 * i + 2], DFT_R_e_tmp[2 * i + 2], &L_tmp2_e );
1992 5628193 : Sr = BASOP_Util_Add_Mant32Exp( Mpy_32_32( L_tmp1, L_tmp1 ), shl( L_tmp1_e, 1 ), Mpy_32_32( L_tmp2, L_tmp2 ), shl( L_tmp2_e, 1 ), &Sr_e );
1993 :
1994 : // Si = ( pDFT_L[2 * i + 1] + pDFT_R[2 * i + 1] ) * ( pDFT_L[2 * i + 1] + pDFT_R[2 * i + 1] ) + ( pDFT_L[2 * i + 3] + pDFT_R[2 * i + 3] ) * ( pDFT_L[2 * i + 3] + pDFT_R[2 * i + 3] );
1995 5628193 : L_tmp1 = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * i + 1], DFT_L_e_tmp[2 * i + 1], pDFT_R_fx[2 * i + 1], DFT_R_e_tmp[2 * i + 1], &L_tmp1_e );
1996 5628193 : L_tmp2 = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * i + 3], DFT_L_e_tmp[2 * i + 3], pDFT_R_fx[2 * i + 3], DFT_R_e_tmp[2 * i + 3], &L_tmp2_e );
1997 5628193 : Si = BASOP_Util_Add_Mant32Exp( Mpy_32_32( L_tmp1, L_tmp1 ), shl( L_tmp1_e, 1 ), Mpy_32_32( L_tmp2, L_tmp2 ), shl( L_tmp2_e, 1 ), &Si_e );
1998 :
1999 : // sum_abs = sqrtf( comb_nrgL ) + sqrtf( comb_nrgR ) + EPSILON;
2000 5628193 : L_tmp1 = comb_nrgL;
2001 5628193 : move32();
2002 5628193 : L_tmp1_e = comb_nrgL_e;
2003 5628193 : move16();
2004 5628193 : L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
2005 5628193 : L_tmp2 = comb_nrgR;
2006 5628193 : move32();
2007 5628193 : L_tmp2_e = comb_nrgR_e;
2008 5628193 : move16();
2009 5628193 : L_tmp2 = Sqrt32( L_tmp2, &L_tmp2_e );
2010 5628193 : sum_abs = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, L_tmp2, L_tmp2_e, &sum_abs_e );
2011 5628193 : sum_abs = BASOP_Util_Add_Mant32Exp( sum_abs, sum_abs_e, EPSILON_FX_M, EPSILON_FX_E, &sum_abs_e );
2012 :
2013 : // frac_dot_prod = ( comb_nrgL + comb_nrgR ) * dot_prod_nrg_ratio[b];
2014 5628193 : L_tmp1 = BASOP_Util_Add_Mant32Exp( comb_nrgL, comb_nrgL_e, comb_nrgR, comb_nrgR_e, &L_tmp1_e );
2015 5628193 : frac_dot_prod = Mpy_32_32( L_tmp1, dot_prod_nrg_ratio_fx[b] );
2016 5628193 : frac_dot_prod_e = add( L_tmp1_e, dot_prod_nrg_ratio_fx_e[b] );
2017 :
2018 : // wR = sqrtf( 0.5f * ( comb_nrgL + comb_nrgR ) + frac_dot_prod ) / sum_abs;
2019 5628193 : L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp1, sub( L_tmp1_e, 1 ), frac_dot_prod, frac_dot_prod_e, &L_tmp1_e );
2020 5628193 : L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
2021 5628193 : wR = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &wR_e );
2022 5628193 : wR_e = add( wR_e, sub( L_tmp1_e, sum_abs_e ) );
2023 :
2024 : // wL = wR + sqrtf( 2.f ) * ( 1.f - ( sqrtf( Sr + Si ) / sum_abs ) );
2025 5628193 : L_tmp1 = BASOP_Util_Add_Mant32Exp( Sr, Sr_e, Si, Si_e, &L_tmp1_e );
2026 5628193 : L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
2027 5628193 : L_tmp2 = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &L_tmp2_e );
2028 5628193 : L_tmp2_e = add( L_tmp2_e, sub( L_tmp1_e, sum_abs_e ) );
2029 5628193 : L_tmp2 = L_shl_sat( L_tmp2, L_tmp2_e ); // Q31 saturation expected
2030 5628193 : L_tmp1 = L_sub( MAX_32, L_tmp2 ); // Q31
2031 5628193 : L_tmp1 = Mpy_32_32( 1518500250 /*sqrtf(2.f) in Q30*/, L_tmp1 ); // Q30
2032 5628193 : wL = BASOP_Util_Add_Mant32Exp( wR, wR_e, L_tmp1, 1 /*Q30*/, &wL_e );
2033 :
2034 : /*DMX Mapping*/
2035 : // pDFT_DMX[2 * i] = ( wL * pDFT_L[2 * i] + wR * pDFT_R[2 * i] ) * INV_SQRT_2;
2036 5628193 : pDFT_DMX[2 * i] = Mpy_32_32( BASOP_Util_Add_Mant32Exp( Mpy_32_32( wL, pDFT_L_fx[2 * i] ), add( wL_e, DFT_L_e_tmp[2 * i] ), Mpy_32_32( wR, pDFT_R_fx[2 * i] ), add( wR_e, DFT_R_e_tmp[2 * i] ), &DFT_DMX_e[2 * i] ), INV_SQRT_2_Q31 );
2037 5628193 : move32();
2038 : // pDFT_DMX[2 * i + 1] = ( wL * pDFT_L[2 * i + 1] + wR * pDFT_R[2 * i + 1] ) * INV_SQRT_2;
2039 5628193 : pDFT_DMX[2 * i + 1] = Mpy_32_32( BASOP_Util_Add_Mant32Exp( Mpy_32_32( wL, pDFT_L_fx[2 * i + 1] ), add( wL_e, DFT_L_e_tmp[2 * i + 1] ), Mpy_32_32( wR, pDFT_R_fx[2 * i + 1] ), add( wR_e, DFT_R_e_tmp[2 * i + 1] ), &DFT_DMX_e[2 * i + 1] ), INV_SQRT_2_Q31 );
2040 5628193 : move32();
2041 : // pDFT_DMX[2 * i + 2] = ( wL * pDFT_L[2 * i + 2] + wR * pDFT_R[2 * i + 2] ) * INV_SQRT_2;
2042 5628193 : pDFT_DMX[2 * i + 2] = Mpy_32_32( BASOP_Util_Add_Mant32Exp( Mpy_32_32( wL, pDFT_L_fx[2 * i + 2] ), add( wL_e, DFT_L_e_tmp[2 * i + 2] ), Mpy_32_32( wR, pDFT_R_fx[2 * i + 2] ), add( wR_e, DFT_R_e_tmp[2 * i + 2] ), &DFT_DMX_e[2 * i + 2] ), INV_SQRT_2_Q31 );
2043 5628193 : move32();
2044 : // pDFT_DMX[2 * i + 3] = ( wL * pDFT_L[2 * i + 3] + wR * pDFT_R[2 * i + 3] ) * INV_SQRT_2;
2045 5628193 : pDFT_DMX[2 * i + 3] = Mpy_32_32( BASOP_Util_Add_Mant32Exp( Mpy_32_32( wL, pDFT_L_fx[2 * i + 3] ), add( wL_e, DFT_L_e_tmp[2 * i + 3] ), Mpy_32_32( wR, pDFT_R_fx[2 * i + 3] ), add( wR_e, DFT_R_e_tmp[2 * i + 3] ), &DFT_DMX_e[2 * i + 3] ), INV_SQRT_2_Q31 );
2046 5628193 : move32();
2047 : }
2048 :
2049 614171 : IF( triple_bin )
2050 : {
2051 186502 : comb_nrgL = comb_nrgR = 0;
2052 186502 : move32();
2053 186502 : move32();
2054 186502 : comb_nrgL_e = comb_nrgR_e = 0;
2055 186502 : move16();
2056 186502 : move16();
2057 186502 : Sr = Si = 0;
2058 186502 : move32();
2059 186502 : move32();
2060 186502 : Sr_e = Si_e = 0;
2061 186502 : move16();
2062 186502 : move16();
2063 746008 : FOR( j = i; j < i + 3; j++ )
2064 : {
2065 : // comb_nrgL += pNrgL[j];
2066 559506 : comb_nrgL = BASOP_Util_Add_Mant32Exp( comb_nrgL, comb_nrgL_e, pNrgL[j], bin_nrgL_fx_e[j], &comb_nrgL_e );
2067 :
2068 : // comb_nrgR += pNrgR[j];
2069 559506 : comb_nrgR = BASOP_Util_Add_Mant32Exp( comb_nrgR, comb_nrgR_e, pNrgR[j], bin_nrgR_fx_e[j], &comb_nrgR_e );
2070 :
2071 : // Sr += ( pDFT_L[2 * j] + pDFT_R[2 * j] ) * ( pDFT_L[2 * j] + pDFT_R[2 * j] );
2072 559506 : L_tmp1 = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * j], DFT_L_e_tmp[2 * j], pDFT_R_fx[2 * j], DFT_R_e_tmp[2 * j], &L_tmp1_e );
2073 559506 : L_tmp1 = Mpy_32_32( L_tmp1, L_tmp1 );
2074 559506 : L_tmp1_e = shl( L_tmp1_e, 1 );
2075 559506 : Sr = BASOP_Util_Add_Mant32Exp( Sr, Sr_e, L_tmp1, L_tmp1_e, &Sr_e );
2076 :
2077 : // Si += ( pDFT_L[2 * j + 1] + pDFT_R[2 * j + 1] ) * ( pDFT_L[2 * j + 1] + pDFT_R[2 * j + 1] );
2078 559506 : L_tmp2 = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[2 * j + 1], DFT_L_e_tmp[2 * j + 1], pDFT_R_fx[2 * j + 1], DFT_R_e_tmp[2 * j + 1], &L_tmp2_e );
2079 559506 : L_tmp2 = Mpy_32_32( L_tmp2, L_tmp2 );
2080 559506 : L_tmp2_e = shl( L_tmp2_e, 1 );
2081 559506 : Si = BASOP_Util_Add_Mant32Exp( Si, Si_e, L_tmp2, L_tmp2_e, &Si_e );
2082 : }
2083 :
2084 : // sum_abs = sqrtf( comb_nrgL ) + sqrtf( comb_nrgR ) + EPSILON;
2085 186502 : L_tmp1 = comb_nrgL;
2086 186502 : move32();
2087 186502 : L_tmp1_e = comb_nrgL_e;
2088 186502 : move16();
2089 186502 : L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
2090 186502 : L_tmp2 = comb_nrgR;
2091 186502 : move32();
2092 186502 : L_tmp2_e = comb_nrgR_e;
2093 186502 : move16();
2094 186502 : L_tmp2 = Sqrt32( L_tmp2, &L_tmp2_e );
2095 186502 : sum_abs = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, L_tmp2, L_tmp2_e, &sum_abs_e );
2096 186502 : sum_abs = BASOP_Util_Add_Mant32Exp( sum_abs, sum_abs_e, EPSILON_FX_M, EPSILON_FX_E, &sum_abs_e );
2097 :
2098 : // frac_dot_prod = ( comb_nrgL + comb_nrgR ) * dot_prod_nrg_ratio[b];
2099 186502 : L_tmp1 = BASOP_Util_Add_Mant32Exp( comb_nrgL, comb_nrgL_e, comb_nrgR, comb_nrgR_e, &L_tmp1_e );
2100 186502 : frac_dot_prod = Mpy_32_32( L_tmp1, dot_prod_nrg_ratio_fx[b] );
2101 186502 : frac_dot_prod_e = add( L_tmp1_e, dot_prod_nrg_ratio_fx_e[b] );
2102 :
2103 : // wR = sqrtf( 0.5f * ( comb_nrgL + comb_nrgR ) + frac_dot_prod ) / sum_abs;
2104 186502 : L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp1, sub( L_tmp1_e, 1 ), frac_dot_prod, frac_dot_prod_e, &L_tmp1_e );
2105 186502 : L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
2106 186502 : wR = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &wR_e );
2107 186502 : wR_e = add( wR_e, sub( L_tmp1_e, sum_abs_e ) );
2108 :
2109 : // wL = wR + sqrtf( 2.f ) * ( 1.f - ( sqrtf( Sr + Si ) / sum_abs ) );
2110 186502 : L_tmp1 = BASOP_Util_Add_Mant32Exp( Sr, Sr_e, Si, Si_e, &L_tmp1_e );
2111 186502 : L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
2112 186502 : L_tmp2 = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &L_tmp2_e );
2113 186502 : L_tmp2_e = add( L_tmp2_e, sub( L_tmp1_e, sum_abs_e ) );
2114 186502 : L_tmp2 = L_shl_sat( L_tmp2, L_tmp2_e ); // Q31 saturation expected
2115 186502 : L_tmp1 = L_sub( MAX_32, L_tmp2 ); // Q31
2116 186502 : L_tmp1 = Mpy_32_32( 1518500250 /*sqrtf(2.f) in Q30*/, L_tmp1 ); // Q30
2117 186502 : wL = BASOP_Util_Add_Mant32Exp( wR, wR_e, L_tmp1, 1 /*Q30*/, &wL_e );
2118 :
2119 746008 : FOR( j = i; j < i + 3; j++ )
2120 : {
2121 : // pDFT_DMX[2 * j] = ( wL * pDFT_L[2 * j] + wR * pDFT_R[2 * j] ) * INV_SQRT_2;
2122 559506 : pDFT_DMX[2 * j] = Mpy_32_32( BASOP_Util_Add_Mant32Exp( Mpy_32_32( wL, pDFT_L_fx[2 * j] ), add( wL_e, DFT_L_e_tmp[2 * j] ), Mpy_32_32( wR, pDFT_R_fx[2 * j] ), add( wR_e, DFT_R_e_tmp[2 * j] ), &DFT_DMX_e[2 * j] ), INV_SQRT_2_Q31 );
2123 559506 : move32();
2124 : // pDFT_DMX[2 * j + 1] = ( wL * pDFT_L[2 * j + 1] + wR * pDFT_R[2 * j + 1] ) * INV_SQRT_2;
2125 559506 : pDFT_DMX[2 * j + 1] = Mpy_32_32( BASOP_Util_Add_Mant32Exp( Mpy_32_32( wL, pDFT_L_fx[2 * j + 1] ), add( wL_e, DFT_L_e_tmp[2 * j + 1] ), Mpy_32_32( wR, pDFT_R_fx[2 * j + 1] ), add( wR_e, DFT_R_e_tmp[2 * j + 1] ), &DFT_DMX_e[2 * j + 1] ), INV_SQRT_2_Q31 );
2126 559506 : move32();
2127 : }
2128 186502 : i = add( i, 3 );
2129 : }
2130 :
2131 614171 : IF( LT_16( i, hStereoDft->band_limits_dmx[b + 1] ) )
2132 : {
2133 164130 : sum_nrg_L2 = EPSILON_FX_M;
2134 164130 : move32();
2135 164130 : sum_nrg_L2_e = EPSILON_FX_E;
2136 164130 : move16();
2137 164130 : sum_nrg_R2 = EPSILON_FX_M;
2138 164130 : move32();
2139 164130 : sum_nrg_R2_e = EPSILON_FX_E;
2140 164130 : move16();
2141 164130 : dot_prod_real2 = EPSILON_FX_M;
2142 164130 : move32();
2143 164130 : dot_prod_real2_e = EPSILON_FX_E;
2144 164130 : move16();
2145 25154641 : FOR( j = hStereoDft->band_limits_dmx[b]; j < hStereoDft->band_limits_dmx[b + 1]; j++ )
2146 : {
2147 : // sum_nrg_L2 += pDFT_L[2 * j] * pDFT_L[2 * j] + pDFT_L[2 * j + 1] * pDFT_L[2 * j + 1];
2148 24990511 : L_tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L_fx[2 * j], pDFT_L_fx[2 * j] ), shl( DFT_L_e_tmp[2 * j], 1 ), Mpy_32_32( pDFT_L_fx[2 * j + 1], pDFT_L_fx[2 * j + 1] ), shl( DFT_L_e_tmp[2 * j + 1], 1 ), &L_tmp1_e );
2149 24990511 : sum_nrg_L2 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, L_tmp1, L_tmp1_e, &sum_nrg_L2_e );
2150 : // sum_nrg_R2 += pDFT_R[2 * j] * pDFT_R[2 * j] + pDFT_R[2 * j + 1] * pDFT_R[2 * j + 1];
2151 24990511 : L_tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_R_fx[2 * j], pDFT_R_fx[2 * j] ), shl( DFT_R_e_tmp[2 * j], 1 ), Mpy_32_32( pDFT_R_fx[2 * j + 1], pDFT_R_fx[2 * j + 1] ), shl( DFT_R_e_tmp[2 * j + 1], 1 ), &L_tmp1_e );
2152 24990511 : sum_nrg_R2 = BASOP_Util_Add_Mant32Exp( sum_nrg_R2, sum_nrg_R2_e, L_tmp1, L_tmp1_e, &sum_nrg_R2_e );
2153 : // dot_prod_real2 += pDFT_L[2 * j] * pDFT_R[2 * j] + pDFT_L[2 * j + 1] * pDFT_R[2 * j + 1];
2154 24990511 : L_tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L_fx[2 * j], pDFT_R_fx[2 * j] ), add( DFT_L_e_tmp[2 * j], DFT_R_e_tmp[2 * j] ), Mpy_32_32( pDFT_L_fx[2 * j + 1], pDFT_R_fx[2 * j + 1] ), add( DFT_L_e_tmp[2 * j + 1], DFT_R_e_tmp[2 * j + 1] ), &L_tmp1_e );
2155 24990511 : dot_prod_real2 = BASOP_Util_Add_Mant32Exp( dot_prod_real2, dot_prod_real2_e, L_tmp1, L_tmp1_e, &dot_prod_real2_e );
2156 : }
2157 :
2158 : // sum_nrg_Mid = max( 0.f, sum_nrg_L2 + sum_nrg_R2 + 2.f * dot_prod_real2 );
2159 164130 : L_tmp3 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, sum_nrg_R2, sum_nrg_R2_e, &L_tmp3_e );
2160 164130 : sum_nrg_Mid = BASOP_Util_Add_Mant32Exp( L_tmp3, L_tmp3_e, dot_prod_real2, add( dot_prod_real2_e, 1 ), &sum_nrg_Mid_e );
2161 164130 : IF( sum_nrg_Mid < 0 )
2162 : {
2163 0 : sum_nrg_Mid = 0;
2164 0 : move32();
2165 0 : sum_nrg_Mid_e = 0;
2166 0 : move16();
2167 : }
2168 :
2169 : // sum_abs = sqrtf( sum_nrg_L2 ) + sqrtf( sum_nrg_R2 ) + EPSILON;
2170 164130 : L_tmp1 = sum_nrg_L2;
2171 164130 : move32();
2172 164130 : L_tmp1_e = sum_nrg_L2_e;
2173 164130 : move16();
2174 164130 : L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
2175 164130 : L_tmp2 = sum_nrg_R2;
2176 164130 : move32();
2177 164130 : L_tmp2_e = sum_nrg_R2_e;
2178 164130 : move16();
2179 164130 : L_tmp2 = Sqrt32( L_tmp2, &L_tmp2_e );
2180 164130 : sum_abs = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, L_tmp2, L_tmp2_e, &sum_abs_e );
2181 164130 : sum_abs = BASOP_Util_Add_Mant32Exp( sum_abs, sum_abs_e, EPSILON_FX_M, EPSILON_FX_E, &sum_abs_e );
2182 :
2183 : // wR = sqrtf( 0.5f * ( sum_nrg_L2 + sum_nrg_R2 ) + dot_prod_nrg_ratio[b] ) / sum_abs;
2184 164130 : L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp3, sub( L_tmp3_e, 1 ), dot_prod_nrg_ratio_fx[b], dot_prod_nrg_ratio_fx_e[b], &L_tmp1_e );
2185 164130 : L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
2186 164130 : wR = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &wR_e );
2187 164130 : wR_e = add( wR_e, sub( L_tmp1_e, sum_abs_e ) );
2188 :
2189 : // wL = wR + sqrtf( 2.f ) * ( 1.f - sqrtf( sum_nrg_Mid ) / sum_abs );
2190 164130 : L_tmp1 = sum_nrg_Mid;
2191 164130 : move32();
2192 164130 : L_tmp1_e = sum_nrg_Mid_e;
2193 164130 : move16();
2194 164130 : L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
2195 164130 : L_tmp2 = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &L_tmp2_e );
2196 164130 : L_tmp2_e = add( L_tmp2_e, sub( L_tmp1_e, sum_abs_e ) );
2197 164130 : L_tmp2 = L_shl_sat( L_tmp2, L_tmp2_e ); // Q31 saturation expected
2198 164130 : L_tmp1 = L_sub( MAX_32, L_tmp2 ); // Q31
2199 164130 : L_tmp1 = Mpy_32_32( 1518500250 /*sqrtf(2.f) in Q30*/, L_tmp1 ); // Q30
2200 164130 : wL = BASOP_Util_Add_Mant32Exp( wR, wR_e, L_tmp1, 1 /*Q30*/, &wL_e );
2201 : }
2202 :
2203 25604682 : FOR( ; i < hStereoDft->band_limits_dmx[b + 1]; i++ )
2204 : {
2205 : /*DMX Mapping*/
2206 : // pDFT_DMX[2 * i] = ( wL * pDFT_L[2 * i] + wR * pDFT_R[2 * i] ) * INV_SQRT_2;
2207 24990511 : pDFT_DMX[2 * i] = Mpy_32_32( BASOP_Util_Add_Mant32Exp( Mpy_32_32( wL, pDFT_L_fx[2 * i] ), add( wL_e, DFT_L_e_tmp[2 * i] ), Mpy_32_32( wR, pDFT_R_fx[2 * i] ), add( wR_e, DFT_R_e_tmp[2 * i] ), &DFT_DMX_e[2 * i] ), INV_SQRT_2_Q31 );
2208 24990511 : move32();
2209 : // pDFT_DMX[2 * i + 1] = ( wL * pDFT_L[2 * i + 1] + wR * pDFT_R[2 * i + 1] ) * INV_SQRT_2;
2210 24990511 : pDFT_DMX[2 * i + 1] = Mpy_32_32( BASOP_Util_Add_Mant32Exp( Mpy_32_32( wL, pDFT_L_fx[2 * i + 1] ), add( wL_e, DFT_L_e_tmp[2 * i + 1] ), Mpy_32_32( wR, pDFT_R_fx[2 * i + 1] ), add( wR_e, DFT_R_e_tmp[2 * i + 1] ), &DFT_DMX_e[2 * i + 1] ), INV_SQRT_2_Q31 );
2211 24990511 : move32();
2212 : }
2213 : }
2214 : }
2215 :
2216 3653259 : FOR( i = hStereoDft->band_limits_dmx[b]; i < hStereoDft->NFFT / 2; i++ )
2217 : {
2218 3593600 : pDFT_DMX[2 * i] = 0;
2219 3593600 : move32();
2220 3593600 : DFT_DMX_e[2 * i] = 0;
2221 3593600 : move16();
2222 3593600 : pDFT_DMX[2 * i + 1] = 0;
2223 3593600 : move32();
2224 3593600 : DFT_DMX_e[2 * i + 1] = 0;
2225 3593600 : move16();
2226 : }
2227 :
2228 : /*Nyquist Freq.*/
2229 59659 : IF( GE_16( hStereoDft->band_limits_dmx[b], shr( hStereoDft->NFFT, 1 ) ) )
2230 : {
2231 : // pDFT_DMX[1] = ( pDFT_L[1] + pDFT_R[1] ) * 0.5f;
2232 49468 : pDFT_DMX[1] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[1], DFT_L_e_tmp[1], pDFT_R_fx[1], DFT_R_e_tmp[1], &DFT_DMX_e[1] );
2233 49468 : move32();
2234 49468 : DFT_DMX_e[1] = sub( DFT_DMX_e[1], 1 );
2235 49468 : move16();
2236 : }
2237 : ELSE
2238 : {
2239 10191 : pDFT_DMX[1] = 0;
2240 10191 : move32();
2241 10191 : DFT_DMX_e[1] = 0;
2242 10191 : move16();
2243 : }
2244 :
2245 : /* DC component */
2246 : // pDFT_DMX[0] = ( pDFT_L[0] + pDFT_R[0] ) * 0.5f;
2247 59659 : pDFT_DMX[0] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[0], DFT_L_e_tmp[0], pDFT_R_fx[0], DFT_R_e_tmp[0], &DFT_DMX_e[0] );
2248 59659 : move32();
2249 59659 : DFT_DMX_e[0] = sub( DFT_DMX_e[0], 1 );
2250 59659 : move16();
2251 : }
2252 : ELSE
2253 : {
2254 : /*passive DMX*/
2255 0 : assert( hStereoDft->nbands == hStereoDft->nbands_dmx && "Don't use coarser stereo parameter resolution for residual coding bitrates!" );
2256 0 : FOR( i = 0; i < hStereoDft->band_limits[hStereoDft->res_cod_band_max]; i++ )
2257 : {
2258 : // pDFT_DMX[i] = ( pDFT_L[i] + pDFT_R[i] ) * 0.5f;
2259 0 : pDFT_DMX[i] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[i], DFT_L_e_tmp[i], pDFT_R_fx[i], DFT_R_e_tmp[i], &DFT_DMX_e[i] );
2260 0 : move32();
2261 0 : DFT_DMX_e[i] = sub( DFT_DMX_e[i], 1 );
2262 0 : move16();
2263 : // pDFT_RES[i] = ( pDFT_L[i] - pDFT_R[i] ) * 0.5f;
2264 0 : pDFT_RES[i] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[i], DFT_L_e_tmp[i], L_negate( pDFT_R_fx[i] ), DFT_R_e_tmp[i], &DFT_RES_e[i] );
2265 0 : move32();
2266 0 : DFT_RES_e[i] = sub( DFT_RES_e[i], 1 );
2267 0 : move16();
2268 : }
2269 0 : FOR( ; i < hStereoDft->NFFT; i++ )
2270 : {
2271 : // pDFT_DMX[i] = ( pDFT_L[i] + pDFT_R[i] ) * 0.5f;
2272 0 : pDFT_DMX[i] = BASOP_Util_Add_Mant32Exp( pDFT_L_fx[i], DFT_L_e_tmp[i], pDFT_R_fx[i], DFT_R_e_tmp[i], &DFT_DMX_e[i] );
2273 0 : move32();
2274 0 : DFT_DMX_e[i] = sub( DFT_DMX_e[i], 1 );
2275 0 : move16();
2276 : }
2277 : }
2278 :
2279 : /*------------------------------------------------------------------*
2280 : * Recalculate RES and DMX
2281 : *-----------------------------------------------------------------*/
2282 :
2283 59659 : test();
2284 59659 : IF( EQ_16( hStereoDft->NFFT, STEREO_DFT_N_16k_ENC ) && hStereoDft->hConfig->ada_wb_res_cod_mode )
2285 : {
2286 2886 : stereo_dft_enc_get_res_cod_mode_flag_fx( hStereoDft, res_nrg_all_curr, res_nrg_all_curr_e, dmx_nrg_all_curr, dmx_nrg_all_curr_e, &res_dmx_ratio, &frame_nrg_ratio );
2287 :
2288 2886 : IF( hStereoDft->res_cod_sw_flag )
2289 : {
2290 : Word16 res_cod_band_max;
2291 :
2292 60 : res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->hConfig->ada_wb_res_cod_mode];
2293 60 : move16();
2294 :
2295 : /* Recalculate RES and DMX */
2296 360 : FOR( b = 0; b < res_cod_band_max; b++ )
2297 : {
2298 300 : sum_nrg_L2 = EPSILON_FX_M;
2299 300 : move32();
2300 300 : sum_nrg_L2_e = EPSILON_FX_E;
2301 300 : move16();
2302 300 : sum_nrg_R2 = EPSILON_FX_M;
2303 300 : move32();
2304 300 : sum_nrg_R2_e = EPSILON_FX_E;
2305 300 : move16();
2306 300 : dot_prod_real2 = EPSILON_FX_M;
2307 300 : move32();
2308 300 : dot_prod_real2_e = EPSILON_FX_E;
2309 300 : move16();
2310 2760 : FOR( j = hStereoDft->band_limits_dmx[b]; j < hStereoDft->band_limits_dmx[b + 1]; j++ )
2311 : {
2312 : // sum_nrg_L2 += pDFT_L[2 * j] * pDFT_L[2 * j] + pDFT_L[2 * j + 1] * pDFT_L[2 * j + 1];
2313 2460 : L_tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L_fx[2 * j], pDFT_L_fx[2 * j] ), shl( DFT_L_e_tmp[2 * j], 1 ), Mpy_32_32( pDFT_L_fx[2 * j + 1], pDFT_L_fx[2 * j + 1] ), shl( DFT_L_e_tmp[2 * j + 1], 1 ), &L_tmp1_e );
2314 2460 : sum_nrg_L2 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, L_tmp1, L_tmp1_e, &sum_nrg_L2_e );
2315 :
2316 : // sum_nrg_R2 += pDFT_R[2 * j] * pDFT_R[2 * j] + pDFT_R[2 * j + 1] * pDFT_R[2 * j + 1];
2317 2460 : L_tmp2 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_R_fx[2 * j], pDFT_R_fx[2 * j] ), shl( DFT_R_e_tmp[2 * j], 1 ), Mpy_32_32( pDFT_R_fx[2 * j + 1], pDFT_R_fx[2 * j + 1] ), shl( DFT_R_e_tmp[2 * j + 1], 1 ), &L_tmp2_e );
2318 2460 : sum_nrg_R2 = BASOP_Util_Add_Mant32Exp( sum_nrg_R2, sum_nrg_R2_e, L_tmp2, L_tmp2_e, &sum_nrg_R2_e );
2319 :
2320 : // dot_prod_real2 += pDFT_L[2 * j] * pDFT_R[2 * j] + pDFT_L[2 * j + 1] * pDFT_R[2 * j + 1];
2321 2460 : L_tmp3 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L_fx[2 * j], pDFT_R_fx[2 * j] ), add( DFT_L_e_tmp[2 * j], DFT_R_e_tmp[2 * j] ), Mpy_32_32( pDFT_L_fx[2 * j + 1], pDFT_R_fx[2 * j + 1] ), add( DFT_L_e_tmp[2 * j + 1], DFT_R_e_tmp[2 * j + 1] ), &L_tmp3_e );
2322 2460 : dot_prod_real2 = BASOP_Util_Add_Mant32Exp( dot_prod_real2, dot_prod_real2_e, L_tmp3, L_tmp3_e, &dot_prod_real2_e );
2323 : }
2324 :
2325 : // sum_nrg_Mid = max( 0.f, sum_nrg_L2 + sum_nrg_R2 + 2.f * dot_prod_real2 );
2326 300 : L_tmp1 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, sum_nrg_R2, sum_nrg_R2_e, &L_tmp1_e );
2327 300 : sum_nrg_Mid = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, dot_prod_real2, add( dot_prod_real2_e, 1 ), &sum_nrg_Mid_e );
2328 300 : IF( sum_nrg_Mid < 0 )
2329 : {
2330 0 : sum_nrg_Mid = 0;
2331 0 : move32();
2332 0 : sum_nrg_Mid_e = 0;
2333 0 : move16();
2334 : }
2335 :
2336 : // wL = 0.5f * max( sqrtf( sum_nrg_L2 ) + sqrtf( sum_nrg_R2 ) - sqrtf( sum_nrg_Mid ), 0 ) * inv_sqrt( sum_nrg_L2 + EPSILON );
2337 300 : L_tmp1_e = sum_nrg_L2_e;
2338 300 : move16();
2339 300 : L_tmp1 = Sqrt32( sum_nrg_L2, &L_tmp1_e );
2340 300 : L_tmp2_e = sum_nrg_R2_e;
2341 300 : move16();
2342 300 : L_tmp2 = Sqrt32( sum_nrg_R2, &L_tmp2_e );
2343 300 : L_tmp3_e = sum_nrg_Mid_e;
2344 300 : move16();
2345 300 : L_tmp3 = Sqrt32( sum_nrg_Mid, &L_tmp3_e );
2346 300 : wL = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, L_tmp2, L_tmp2_e, &wL_e );
2347 300 : wL = BASOP_Util_Add_Mant32Exp( wL, wL_e, L_negate( L_tmp3 ), L_tmp3_e, &wL_e );
2348 300 : IF( wL < 0 )
2349 : {
2350 0 : wL = 0; // Q31
2351 0 : move32();
2352 : }
2353 : ELSE
2354 : {
2355 300 : L_tmp1 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e );
2356 300 : L_tmp1 = ISqrt32( L_tmp1, &L_tmp1_e );
2357 300 : wL = Mpy_32_32( wL, L_tmp1 );
2358 300 : wL_e = sub( add( wL_e, L_tmp1_e ), 1 ); // *0.5f
2359 300 : wL = L_shl( wL, wL_e ); // Q31
2360 : }
2361 :
2362 300 : wS = MAX_16; // Q15
2363 300 : move16();
2364 :
2365 300 : IF( hStereoDft->res_cod_sw_flag )
2366 : {
2367 : // wL *= ( 1 - hStereoDft->switch_fade_factor );
2368 300 : wL = Mpy_32_16_1( wL, sub( MAX_16, hStereoDft->switch_fade_factor_fx ) ); // Q31
2369 : // wS = hStereoDft->switch_fade_factor;
2370 300 : wS = hStereoDft->switch_fade_factor_fx; // Q15
2371 300 : move16();
2372 : }
2373 :
2374 2760 : FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ )
2375 : {
2376 : /*DMX Recalculation*/
2377 : // DFT_DMX[2 * i] += wL * pDFT_L[2 * i];
2378 2460 : DFT_DMX[2 * i] = BASOP_Util_Add_Mant32Exp( DFT_DMX[2 * i], DFT_DMX_e[2 * i], Mpy_32_32( pDFT_L_fx[2 * i], wL ), DFT_L_e_tmp[2 * i], &DFT_DMX_e[2 * i] );
2379 2460 : move32();
2380 : // DFT_DMX[2 * i + 1] += wL * pDFT_L[2 * i + 1];
2381 2460 : DFT_DMX[2 * i + 1] = BASOP_Util_Add_Mant32Exp( DFT_DMX[2 * i + 1], DFT_DMX_e[2 * i + 1], Mpy_32_32( pDFT_L_fx[2 * i + 1], wL ), DFT_L_e_tmp[2 * i + 1], &DFT_DMX_e[2 * i + 1] );
2382 2460 : move32();
2383 :
2384 : /*RES Recalculation*/
2385 : // DFT_RES[2 * i] *= wS;
2386 2460 : DFT_RES[2 * i] = Mpy_32_16_1( DFT_RES[2 * i], wS );
2387 2460 : move32();
2388 : // DFT_RES[2 * i + 1] *= wS;
2389 2460 : DFT_RES[2 * i + 1] = Mpy_32_16_1( DFT_RES[2 * i + 1], wS );
2390 2460 : move32();
2391 : }
2392 : }
2393 : }
2394 : }
2395 :
2396 59659 : IF( GE_32( input_Fs, 32000 ) )
2397 : {
2398 48116 : stereo_dft_enc_calculate_nrg_for_icbwe_fx( hStereoDft, DFT_L_e_tmp, DFT_R_e_tmp, DFT_DMX, DFT_DMX_e, input_Fs );
2399 : }
2400 :
2401 : // making exp common
2402 59659 : Word16 max_exp = MIN_16;
2403 59659 : move16();
2404 114604939 : FOR( i = 0; i < STEREO_DFT_N_MAX_ENC; i++ )
2405 : {
2406 114545280 : max_exp = s_max( max_exp, DFT_DMX_e[i] );
2407 : }
2408 114604939 : FOR( i = 0; i < STEREO_DFT_N_MAX_ENC; i++ )
2409 : {
2410 114545280 : DFT_DMX[i] = L_shr_r( DFT_DMX[i], sub( max_exp, DFT_DMX_e[i] ) ); // Q(31-max_exp)
2411 114545280 : move32();
2412 : }
2413 59659 : hStereoDft->DFT_fx_e[0] = max_exp;
2414 59659 : move16();
2415 :
2416 59659 : max_exp = MIN_16;
2417 59659 : move16();
2418 19150539 : FOR( i = 0; i < STEREO_DFT_N_8k_ENC; i++ )
2419 : {
2420 19090880 : max_exp = s_max( max_exp, DFT_RES_e[i] );
2421 : }
2422 19150539 : FOR( i = 0; i < STEREO_DFT_N_8k_ENC; i++ )
2423 : {
2424 19090880 : DFT_RES[i] = L_shr_r( DFT_RES[i], sub( max_exp, DFT_RES_e[i] ) ); // Q(31-max_exp)
2425 19090880 : move32();
2426 : }
2427 59659 : hStereoDft->DFT_fx_e[1] = max_exp;
2428 59659 : move16();
2429 :
2430 59659 : Copy32( DFT_DMX, hStereoDft->DFT_fx[0], STEREO_DFT_N_MAX_ENC );
2431 59659 : Copy32( DFT_RES, hStereoDft->DFT_fx[1], STEREO_DFT_N_8k_ENC );
2432 59659 : set_zero_fx( hStereoDft->DFT_fx[1] + STEREO_DFT_N_8k_ENC, STEREO_DFT_N_MAX_ENC - STEREO_DFT_N_8k_ENC );
2433 :
2434 59659 : return;
2435 : }
2436 : /*-------------------------------------------------------------------------
2437 : * stereo_dft_enc_get_res_cod_mode_flag()
2438 : *
2439 : * Get the residual signal coding flag
2440 : *-------------------------------------------------------------------------*/
2441 2886 : static void stereo_dft_enc_get_res_cod_mode_flag_fx(
2442 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
2443 : const Word32 res_nrg_all_curr, // Q(31-res_nrg_all_curr_e)
2444 : const Word16 res_nrg_all_curr_e,
2445 : const Word32 dmx_nrg_all_curr, // Q(31-dmx_nrg_all_curr_e)
2446 : const Word16 dmx_nrg_all_curr_e,
2447 : Word32 *res_dmx_ratio, // Q31
2448 : Word32 *frame_nrg_ratio ) // Q28
2449 : {
2450 : Word16 b, k_offset;
2451 : Word32 dmx_res_all, g /*Q31*/;
2452 : Word16 dmx_res_all_e;
2453 : Word16 fast_update_flag;
2454 : Word16 prev_res_cod_mode_flag, res_cod_mode_flag;
2455 : Word32 L_tmp1, L_tmp2;
2456 : Word16 L_tmp1_e, L_tmp2_e;
2457 :
2458 2886 : k_offset = STEREO_DFT_OFFSET; /*Add an offset at encoder*/
2459 2886 : move16();
2460 :
2461 : /*Calculate energy ratio between residual signal and downmix signal */
2462 2886 : *res_dmx_ratio = 0;
2463 2886 : move32();
2464 :
2465 17316 : FOR( b = 0; b < hStereoDft->res_cod_band_max; b++ )
2466 : {
2467 : // g = fabsf(hStereoDft->side_gain[(k_offset)*STEREO_DFT_BAND_MAX + b]);
2468 14430 : g = L_abs( hStereoDft->side_gain_fx[(k_offset) *STEREO_DFT_BAND_MAX + b] );
2469 : //*res_dmx_ratio = max(hStereoDft->res_cod_NRG_S[b] / (hStereoDft->res_cod_NRG_S[b] + (1 - g) * (1 - g) * hStereoDft->res_cod_NRG_M[b] + 1), *res_dmx_ratio);
2470 14430 : L_tmp1 = L_sub( MAX_32, g ); // Q31
2471 14430 : L_tmp2 = BASOP_Util_Add_Mant32Exp( hStereoDft->res_cod_NRG_S_fx[b], hStereoDft->res_cod_NRG_S_fx_e[b], Mpy_32_32( Mpy_32_32( L_tmp1, L_tmp1 ), hStereoDft->res_cod_NRG_M_fx[b] ), hStereoDft->res_cod_NRG_M_fx_e[b], &L_tmp2_e );
2472 14430 : L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, MAX_32, 0, &L_tmp2_e );
2473 14430 : L_tmp1 = BASOP_Util_Divide3232_Scale_newton( hStereoDft->res_cod_NRG_S_fx[b], L_tmp2, &L_tmp1_e );
2474 14430 : L_tmp1_e = add( L_tmp1_e, sub( hStereoDft->res_cod_NRG_S_fx_e[b], L_tmp2_e ) );
2475 14430 : L_tmp1 = L_shl( L_tmp1, L_tmp1_e ); // Q31
2476 14430 : *res_dmx_ratio = L_max( L_tmp1, *res_dmx_ratio );
2477 14430 : move32();
2478 : }
2479 : //*res_dmx_ratio = check_bounds(*res_dmx_ratio, 0, 1); /*should always be satisfied*/
2480 2886 : *res_dmx_ratio = check_bounds_l( *res_dmx_ratio, 0, MAX_32 ); /*should always be satisfied*/
2481 2886 : move32();
2482 :
2483 : /*Calculate the total energy of RES and DMX*/
2484 : // dmx_res_all = res_nrg_all_curr + dmx_nrg_all_curr;
2485 2886 : dmx_res_all = BASOP_Util_Add_Mant32Exp( res_nrg_all_curr, res_nrg_all_curr_e, dmx_nrg_all_curr, dmx_nrg_all_curr_e, &dmx_res_all_e );
2486 :
2487 : /*Calculate the energy ratio of the inter-frame */
2488 : //*frame_nrg_ratio = dmx_res_all / hStereoDft->dmx_res_all_prev;
2489 2886 : *frame_nrg_ratio = BASOP_Util_Divide3232_Scale_newton( dmx_res_all, hStereoDft->dmx_res_all_prev_fx, &L_tmp1_e );
2490 2886 : move32();
2491 2886 : L_tmp1_e = add( L_tmp1_e, sub( dmx_res_all_e, hStereoDft->dmx_res_all_prev_fx_e ) );
2492 2886 : *frame_nrg_ratio = L_shr_r_sat( *frame_nrg_ratio, sub( 3, L_tmp1_e ) ); // Q28
2493 2886 : move32();
2494 : //*frame_nrg_ratio = L_min(5.0f, max(0.2f, *frame_nrg_ratio));
2495 2886 : *frame_nrg_ratio = L_min( ( 5 << 28 ) /*5.0f*/, L_max( 53687091 /*0.2f*/, *frame_nrg_ratio ) ); // Q28
2496 2886 : move32();
2497 :
2498 : /* Get fast update flag */
2499 2886 : fast_update_flag = 0;
2500 2886 : move16();
2501 : // if ((*frame_nrg_ratio > 3.2f && *res_dmx_ratio < 0.1f) || (*frame_nrg_ratio < 0.21f && *res_dmx_ratio > 0.4f))
2502 2886 : test();
2503 2886 : test();
2504 2886 : test();
2505 2886 : if ( ( GT_32( *frame_nrg_ratio, 858993459 /*3.2f*/ ) && LT_32( *res_dmx_ratio, 214748365 /*0.1f*/ ) ) || ( LT_32( *frame_nrg_ratio, 56371446 /*0.21f */ ) && GT_32( *res_dmx_ratio, 858993459 /*0.4f*/ ) ) )
2506 : {
2507 63 : fast_update_flag = 1;
2508 63 : move16();
2509 : }
2510 :
2511 : /* Calculate long term energy ratio between residual signal and downmix signal */
2512 2886 : IF( fast_update_flag )
2513 : {
2514 : // hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.2f + hStereoDft->res_dmx_ratio_lt * 0.8f;
2515 63 : hStereoDft->res_dmx_ratio_lt_fx = L_add( Mpy_32_32( *res_dmx_ratio, 429496730 /*0.2f*/ ), Mpy_32_32( hStereoDft->res_dmx_ratio_lt_fx, 1717986918 /*0.8f*/ ) );
2516 63 : move32();
2517 : }
2518 : ELSE
2519 : {
2520 : // hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.05f + hStereoDft->res_dmx_ratio_lt * 0.95f;
2521 2823 : hStereoDft->res_dmx_ratio_lt_fx = L_add( Mpy_32_32( *res_dmx_ratio, 107374182 /*0.05f*/ ), Mpy_32_32( hStereoDft->res_dmx_ratio_lt_fx, 2040109466 /*0.95f*/ ) );
2522 2823 : move32();
2523 : }
2524 :
2525 : /*Get the residual signal coding initial flag */
2526 : // if (hStereoDft->res_dmx_ratio_lt > 0.01f)
2527 2886 : IF( GT_32( hStereoDft->res_dmx_ratio_lt_fx, 21474836 /*0.01f*/ ) )
2528 : {
2529 2886 : res_cod_mode_flag = 1;
2530 2886 : move16();
2531 : }
2532 : ELSE
2533 : {
2534 0 : res_cod_mode_flag = 0;
2535 0 : move16();
2536 : }
2537 :
2538 : /* Get the residual signal coding flag */
2539 2886 : IF( hStereoDft->first_frm_flag )
2540 : {
2541 7 : prev_res_cod_mode_flag = res_cod_mode_flag;
2542 7 : move16();
2543 7 : hStereoDft->first_frm_flag = 0;
2544 7 : move16();
2545 : }
2546 : ELSE
2547 : {
2548 2879 : prev_res_cod_mode_flag = hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1];
2549 2879 : move16();
2550 : }
2551 2886 : IF( NE_16( res_cod_mode_flag, prev_res_cod_mode_flag ) )
2552 : {
2553 354 : IF( EQ_16( prev_res_cod_mode_flag, 1 ) )
2554 : {
2555 0 : test();
2556 0 : test();
2557 0 : IF( LT_16( hStereoDft->hangover_cnt0, 5 ) && hStereoDft->last_res_cod_mode_modify_flag == 0 && fast_update_flag == 0 )
2558 : {
2559 0 : res_cod_mode_flag = prev_res_cod_mode_flag;
2560 0 : move16();
2561 0 : hStereoDft->hangover_cnt0 = add( hStereoDft->hangover_cnt0, 1 );
2562 0 : move16();
2563 : }
2564 : ELSE
2565 : {
2566 : /* reset hangover */
2567 0 : hStereoDft->hangover_cnt0 = 0;
2568 0 : move16();
2569 : }
2570 : }
2571 : ELSE
2572 : {
2573 : // if (*frame_nrg_ratio > 2.5f || *frame_nrg_ratio < 0.21f)
2574 354 : test();
2575 354 : IF( GT_32( *frame_nrg_ratio, 671088640 /*2.5f*/ ) || LT_32( *frame_nrg_ratio, 56371446 /*0.21f*/ ) )
2576 : {
2577 : /* reset hangover */
2578 7 : hStereoDft->hangover_cnt1 = 0;
2579 7 : move16();
2580 : }
2581 : ELSE
2582 : {
2583 347 : IF( LT_16( hStereoDft->hangover_cnt1, 5 ) )
2584 : {
2585 294 : res_cod_mode_flag = prev_res_cod_mode_flag;
2586 294 : move16();
2587 294 : hStereoDft->hangover_cnt1 = add( hStereoDft->hangover_cnt1, 1 );
2588 294 : move16();
2589 : }
2590 : ELSE
2591 : {
2592 : /* reset hangover */
2593 53 : hStereoDft->hangover_cnt1 = 0;
2594 53 : move16();
2595 : }
2596 : }
2597 : }
2598 : }
2599 :
2600 : /* handle switching frames */
2601 2886 : test();
2602 2886 : IF( NE_16( res_cod_mode_flag, prev_res_cod_mode_flag ) && hStereoDft->last_res_cod_mode_modify_flag == 0 )
2603 : {
2604 60 : hStereoDft->res_cod_sw_flag = 1;
2605 60 : move16();
2606 :
2607 : /* Update switch_fade_factor */
2608 : // if (*frame_nrg_ratio > 3.2f && *res_dmx_ratio < 0.1f)
2609 60 : test();
2610 60 : test();
2611 60 : IF( GT_32( *frame_nrg_ratio, 858993459 /*3.2f*/ ) && LT_32( *res_dmx_ratio, 214748365 /*0.1f*/ ) )
2612 : {
2613 : // hStereoDft->switch_fade_factor = 0.75f;
2614 0 : hStereoDft->switch_fade_factor_fx = 24576; // 0.75f
2615 0 : move16();
2616 : }
2617 : // else if (*frame_nrg_ratio < 0.21f && *res_dmx_ratio > 0.4f)
2618 60 : ELSE IF( LT_32( *frame_nrg_ratio, 56371446 /*0.21f*/ ) && GT_32( *res_dmx_ratio, 858993459 /*0.4f*/ ) )
2619 : {
2620 : // hStereoDft->switch_fade_factor = 0.25f;
2621 0 : hStereoDft->switch_fade_factor_fx = 8192; // 0.25f
2622 0 : move16();
2623 : }
2624 : ELSE
2625 : {
2626 : // hStereoDft->switch_fade_factor = 0.5f;
2627 60 : hStereoDft->switch_fade_factor_fx = 16384; // 0.5f
2628 60 : move16();
2629 : }
2630 :
2631 60 : if ( res_cod_mode_flag == 0 )
2632 : {
2633 0 : res_cod_mode_flag = 1;
2634 0 : move16();
2635 : }
2636 : }
2637 :
2638 : /*update previous frame's total energy of RES and DMX */
2639 2886 : hStereoDft->dmx_res_all_prev_fx = dmx_res_all;
2640 2886 : move32();
2641 2886 : hStereoDft->dmx_res_all_prev_fx_e = dmx_res_all_e;
2642 2886 : move16();
2643 :
2644 : /* update residual coding mode */
2645 2886 : hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] = res_cod_mode_flag;
2646 2886 : move16();
2647 2886 : IF( !hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] )
2648 : {
2649 294 : hStereoDft->res_cod_band_max = 0;
2650 294 : move16();
2651 294 : hStereoDft->res_cod_line_max = 0;
2652 294 : move16();
2653 : }
2654 :
2655 : /*Update residual signal memory when switching from not coding residual signal to coding it*/
2656 2886 : test();
2657 2886 : IF( prev_res_cod_mode_flag == 0 && EQ_16( res_cod_mode_flag, 1 ) )
2658 : {
2659 60 : set_zero_fx( hStereoDft->output_mem_res_8k_fx, STEREO_DFT_OVL_8k );
2660 : }
2661 :
2662 2886 : return;
2663 : }
2664 : /*-------------------------------------------------------------------------
2665 : * stereo_dft_enc_res()
2666 : *
2667 : * Code the residual signal
2668 : *-------------------------------------------------------------------------*/
2669 :
2670 59131 : void stereo_dft_enc_res_fx(
2671 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */
2672 : const Word32 *input_8k, /* i : input buffer sampled at 8kHz Q15 */
2673 : BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */
2674 : Word16 *nb_bits, /* o : number of bits written */
2675 : const Word16 max_bits )
2676 : {
2677 : Word16 i, b;
2678 : RangeUniEncState range_uni_enc_state;
2679 : ECSQ_instance ecsq_inst;
2680 : Word32 MDCT_RES[L_FRAME8k];
2681 : Word16 MDCT_RES_e;
2682 : Word16 win[L_FRAME8k + STEREO_DFT_OVL_8k]; // Q0
2683 : Word16 global_gain_index;
2684 : Word16 total_bit_count;
2685 : Word32 max_snr; // Q25
2686 : Word32 panning_gain, panning_gain_min;
2687 : Word32 res_cod_gain[10]; // Q25
2688 : Word32 in_phase_ratio;
2689 : Word16 in_phase_ratio_e;
2690 : Word32 L_tmp1, L_tmp2;
2691 : Word16 /*L_tmp1_e,*/ L_tmp2_e;
2692 59131 : assert( hStereoDft->res_cod_line_max <= L_FRAME8k );
2693 :
2694 59131 : IF( hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] )
2695 : {
2696 : /* Windowing */
2697 : /* overlapping parts */
2698 : /*input_8k-=STEREO_DFT_OVL_8k;*/
2699 1236252 : FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ )
2700 : {
2701 : // win[i] = input_8k[i] * hStereoDft->win_mdct_8k[i];
2702 1218840 : win[i] = extract_h( Mpy_32_32( input_8k[i], hStereoDft->win_mdct_8k_fx[i] /*Q31*/ ) );
2703 1218840 : move32();
2704 : // win[L_FRAME8k + i] = input_8k[L_FRAME8k + i] * hStereoDft->win_mdct_8k[STEREO_DFT_OVL_8k - 1 - i];
2705 1218840 : win[L_FRAME8k + i] = extract_h( Mpy_32_32( input_8k[L_FRAME8k + i], hStereoDft->win_mdct_8k_fx[STEREO_DFT_OVL_8k - 1 - i] /*Q31*/ ) );
2706 1218840 : move32();
2707 : }
2708 : /* middle part */
2709 1584492 : FOR( ; i < L_FRAME8k; i++ )
2710 : {
2711 1567080 : win[i] = extract_h( input_8k[i] );
2712 1567080 : move32();
2713 : }
2714 :
2715 : /* MDCT analysis */
2716 : // TCX_MDCT_flt( win, MDCT_RES, STEREO_DFT_OVL_8k, L_FRAME8k - STEREO_DFT_OVL_8k, STEREO_DFT_OVL_8k, IVAS_CPE_DFT );
2717 17412 : MDCT_RES_e = 17;
2718 17412 : move16();
2719 17412 : TCX_MDCT( win, MDCT_RES, &MDCT_RES_e, STEREO_DFT_OVL_8k, L_FRAME8k - STEREO_DFT_OVL_8k, STEREO_DFT_OVL_8k, IVAS_CPE_DFT );
2720 :
2721 : /*Compute the DMX to RES for each band*/
2722 17412 : max_snr = 0; /*minimum gain for residual coding -> no coding*/
2723 17412 : move32();
2724 104472 : FOR( b = 0; b < hStereoDft->res_cod_band_max; b++ )
2725 : {
2726 : /*Get side gain information and it is we*/
2727 87060 : panning_gain = hStereoDft->side_gain_fx[STEREO_DFT_OFFSET * STEREO_DFT_BAND_MAX + b];
2728 87060 : panning_gain_min = L_sub( MAX_32, L_abs( panning_gain ) );
2729 :
2730 : // in_phase_ratio = ( panning_gain_min * panning_gain_min * hStereoDft->res_cod_NRG_M[b] ) / ( panning_gain_min * panning_gain_min * hStereoDft->res_cod_NRG_M[b] + hStereoDft->res_cod_NRG_S[b] + 1 );
2731 87060 : L_tmp1 = Mpy_32_32( Mpy_32_32( panning_gain_min, panning_gain_min ), hStereoDft->res_cod_NRG_M_fx[b] );
2732 87060 : L_tmp2 = L_tmp1;
2733 87060 : L_tmp2_e = hStereoDft->res_cod_NRG_M_fx_e[b];
2734 87060 : L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, hStereoDft->res_cod_NRG_S_fx[b], hStereoDft->res_cod_NRG_S_fx_e[b], &L_tmp2_e );
2735 87060 : L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, MAX_32, 0, &L_tmp2_e );
2736 87060 : in_phase_ratio = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &in_phase_ratio_e );
2737 87060 : in_phase_ratio_e = add( in_phase_ratio_e, sub( hStereoDft->res_cod_NRG_M_fx_e[b], L_tmp2_e ) );
2738 87060 : in_phase_ratio = L_shl_sat( in_phase_ratio, in_phase_ratio_e ); // Q31 : bound from 0.0 to 1.0
2739 87060 : in_phase_ratio = L_max( 0, in_phase_ratio );
2740 : // in_phase_ratio = check_bounds(in_phase_ratio, 0, 1);
2741 :
2742 : // res_cod_gain[b] = in_phase_ratio * STEREO_DFT_RES_COD_SNR_MIN + ( 1 - in_phase_ratio ) * STEREO_DFT_RES_COD_SNR_MAX;
2743 87060 : res_cod_gain[b] = L_add( Mpy_32_32( in_phase_ratio, STEREO_DFT_RES_COD_SNR_MIN_Q25 ), Mpy_32_32( L_sub( MAX_32, in_phase_ratio ), STEREO_DFT_RES_COD_SNR_MAX_Q25 ) ); // Q25
2744 87060 : move32();
2745 :
2746 : /*get the maximum through bands*/
2747 87060 : if ( GT_32( res_cod_gain[b], max_snr ) )
2748 : {
2749 44454 : max_snr = res_cod_gain[b];
2750 44454 : move32();
2751 : }
2752 : }
2753 :
2754 : /*Smooth max_snr because of several perturbations in computation*/
2755 17412 : hStereoDft->old_snr_fx = L_add( Mpy_32_32( 429496730 /*0.2f*/, max_snr ), Mpy_32_32( 1717986918 /*0.8f*/, hStereoDft->old_snr_fx ) );
2756 17412 : move32();
2757 17412 : max_snr = hStereoDft->old_snr_fx;
2758 17412 : move32();
2759 :
2760 17412 : if ( LT_32( max_snr, STEREO_DFT_RES_COD_SNR_MIN_Q25 ) )
2761 : {
2762 540 : max_snr = STEREO_DFT_RES_COD_SNR_MIN_Q25;
2763 540 : move32();
2764 : }
2765 :
2766 17412 : push_wmops( "residual_encode" );
2767 : /* residual encoding */
2768 17412 : ECSQ_init_instance_fx( &ecsq_inst, 0 /*dummy index*/, &range_uni_enc_state );
2769 17412 : rc_uni_enc_init_fx( &range_uni_enc_state );
2770 :
2771 17412 : ecsq_inst.bit_count_estimate = 0;
2772 17412 : move32();
2773 17412 : ecsq_inst.config_index = sub( shl( hStereoDft->res_cod_mode[STEREO_DFT_OFFSET], 1 ), 1 );
2774 17412 : move16();
2775 :
2776 : /* 7 bits (STEREO_DFT_RES_GLOBAL_GAIN_BITS) for global_gain_index, 2 bits for closing of the arithmetic coder, 8 safety bits to account for the size estimation accuracy */
2777 17412 : ECSQ_encode_target_SNR_fx( &ecsq_inst, MDCT_RES, MDCT_RES_e, hStereoDft->res_cod_line_max, max_snr, max_bits - ( *nb_bits ) - STEREO_DFT_RES_GLOBAL_GAIN_BITS - 2 - 8, NULL, &global_gain_index );
2778 17412 : IF( NE_16( global_gain_index, ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO ) )
2779 : {
2780 16537 : total_bit_count = rc_uni_enc_finish_fx( &range_uni_enc_state );
2781 :
2782 16537 : IF( LE_16( total_bit_count, sub( sub( max_bits, *nb_bits ), STEREO_DFT_RES_GLOBAL_GAIN_BITS ) ) )
2783 : {
2784 : Word16 idx;
2785 : UWord8 *byte_buffer;
2786 :
2787 : /* Global gain */
2788 16537 : push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_GLOBAL_GAIN, global_gain_index, STEREO_DFT_RES_GLOBAL_GAIN_BITS );
2789 16537 : ( *nb_bits ) = add( *nb_bits, STEREO_DFT_RES_GLOBAL_GAIN_BITS );
2790 16537 : move16();
2791 :
2792 : /* Push arithmetic coded bits */
2793 16537 : byte_buffer = range_uni_enc_state.byte_buffer;
2794 304033 : FOR( idx = 0; idx < shr( total_bit_count, 3 ); ++idx )
2795 : {
2796 287496 : push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_COD, byte_buffer[idx], 8 );
2797 : }
2798 16537 : IF( s_and( total_bit_count, 7 ) != 0 )
2799 : {
2800 : /* move the last 1 to 7 bits from the MSB position of the last byte to the LSB postion */
2801 14489 : push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_COD, shr( byte_buffer[idx], sub( 8, s_and( total_bit_count, 7 ) ) ), s_and( total_bit_count, 7 ) );
2802 : }
2803 16537 : ( *nb_bits ) = add( *nb_bits, total_bit_count );
2804 16537 : move16();
2805 : }
2806 : ELSE
2807 : {
2808 : /* Global gain -> 127*/
2809 0 : global_gain_index = ECSQ_GLOBAL_GAIN_INDEX_ALL_ZERO;
2810 0 : move16();
2811 0 : push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_GLOBAL_GAIN, global_gain_index, STEREO_DFT_RES_GLOBAL_GAIN_BITS );
2812 0 : ( *nb_bits ) = add( *nb_bits, STEREO_DFT_RES_GLOBAL_GAIN_BITS );
2813 0 : move16();
2814 : }
2815 : }
2816 : ELSE
2817 : {
2818 : /* Global gain -> 127*/
2819 875 : push_indice( hBstr, IND_STEREO_DFT_RESIDUAL_GLOBAL_GAIN, global_gain_index, STEREO_DFT_RES_GLOBAL_GAIN_BITS );
2820 875 : ( *nb_bits ) = add( *nb_bits, STEREO_DFT_RES_GLOBAL_GAIN_BITS );
2821 875 : move16();
2822 : }
2823 :
2824 17412 : pop_wmops();
2825 : }
2826 :
2827 :
2828 59131 : return;
2829 : }
2830 :
2831 : /*-------------------------------------------------------------------------
2832 : * stereo_dft_enc_write_BS()
2833 : *
2834 : * Write DFT stereo bitstream
2835 : *-------------------------------------------------------------------------*/
2836 53492 : void stereo_dft_enc_write_BS_fx(
2837 : CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */
2838 : Word16 *nb_bits /* o : number of bits written */
2839 : )
2840 : {
2841 : Word16 b, k_offset, itd, nb, nbands, sp_aud_decision0;
2842 : Word16 NFFT_inner, nbands_full;
2843 : Word16 no_GR_ord;
2844 : Word16 encoded_ind_GR[STEREO_DFT_BAND_MAX];
2845 : Word16 encoded_ind_pred_GR[STEREO_DFT_BAND_MAX];
2846 : Word16 sid_gIpd_index, sid_itd;
2847 : Word32 cohBand[STEREO_DFT_BAND_MAX / 2];
2848 : BSTR_ENC_HANDLE hBstr;
2849 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft;
2850 : Word32 core_brate;
2851 :
2852 : /*------------------------------------------------------------------*
2853 : * Initialization
2854 : *-----------------------------------------------------------------*/
2855 :
2856 53492 : hStereoDft = hCPE->hStereoDft;
2857 53492 : hBstr = hCPE->hMetaData;
2858 53492 : core_brate = hCPE->hCoreCoder[0]->core_brate;
2859 53492 : move32();
2860 :
2861 53492 : sp_aud_decision0 = 0;
2862 53492 : move16();
2863 53492 : if ( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) )
2864 : {
2865 53132 : sp_aud_decision0 = hCPE->hCoreCoder[0]->sp_aud_decision0;
2866 53132 : move16();
2867 : }
2868 :
2869 53492 : *nb_bits = 0;
2870 53492 : move16();
2871 53492 : k_offset = STEREO_DFT_OFFSET;
2872 53492 : move16();
2873 :
2874 53492 : nbands_full = hStereoDft->nbands;
2875 53492 : move16();
2876 :
2877 53492 : test();
2878 53492 : IF( ( core_brate == FRAME_NO_DATA ) || EQ_32( core_brate, SID_2k40 ) )
2879 : {
2880 9866 : NFFT_inner = s_min( STEREO_DFT_N_32k_ENC, STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k );
2881 9866 : hStereoDft->band_res[k_offset] = hStereoDft->hConfig->band_res;
2882 9866 : move16();
2883 9866 : hStereoDft->res_pred_mode[k_offset] = 0;
2884 9866 : move16();
2885 9866 : hStereoDft->res_cod_mode[k_offset] = 0;
2886 9866 : move16();
2887 : }
2888 : ELSE
2889 : {
2890 : // NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k;
2891 43626 : NFFT_inner = shl( inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth], 1 );
2892 : }
2893 :
2894 : /* set number of bands according to bandwidth after BWD */
2895 53492 : hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, ENC );
2896 53492 : move16();
2897 :
2898 53492 : IF( core_brate == FRAME_NO_DATA )
2899 : {
2900 : /* No data frame */
2901 8407 : ( *nb_bits ) = 0;
2902 8407 : move16();
2903 8407 : return;
2904 : }
2905 :
2906 : /* attack present */
2907 : /* attackPresent not sent in inactive frames, receiver assumes = 0 */
2908 45085 : IF( NE_32( core_brate, SID_2k40 ) )
2909 : {
2910 43626 : push_indice( hBstr, IND_STEREO_DFT_ATTACK_PRESENT, hStereoDft->attackPresent, 1 );
2911 43626 : ( *nb_bits ) = add( *nb_bits, 1 );
2912 43626 : move16();
2913 : }
2914 :
2915 : /* Writing coding residual coding mode into bitstream */
2916 45085 : test();
2917 45085 : IF( hStereoDft->hConfig->ada_wb_res_cod_mode && EQ_16( hCPE->hCoreCoder[0]->bwidth, WB ) )
2918 : {
2919 3319 : push_indice( hBstr, IND_STEREO_DFT_RES_COD, hStereoDft->res_cod_mode[k_offset], 1 );
2920 3319 : ( *nb_bits ) = add( *nb_bits, 1 );
2921 3319 : move16();
2922 3319 : hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->res_cod_mode[k_offset]];
2923 3319 : move16();
2924 3319 : hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
2925 3319 : move16();
2926 : }
2927 :
2928 :
2929 45085 : if ( LT_16( nbands_full, hStereoDft->nbands ) )
2930 : {
2931 0 : hStereoDft->reverb_flag = 0;
2932 0 : move16();
2933 : }
2934 :
2935 : /* Side gains */
2936 45085 : hStereoDft->side_gain_flag_1 = 0; /* EC coding by default */
2937 45085 : move16();
2938 45085 : side_gain_mode_decision_fx( hStereoDft, encoded_ind_GR, sp_aud_decision0, hCPE->hCoreCoder[0]->last_core_brate );
2939 :
2940 : /* residual pred. gains */
2941 45085 : hStereoDft->res_pred_flag_1 = 0; /* EC coding by default */
2942 45085 : move16();
2943 :
2944 45085 : res_pred_gain_mode_decision_fx( hStereoDft, encoded_ind_pred_GR, k_offset, hCPE->hCoreCoder[0]->last_core_brate );
2945 :
2946 : /*------------------------------------------------------------------*
2947 : * write ITD indices
2948 : *-----------------------------------------------------------------*/
2949 :
2950 45085 : IF( NE_32( core_brate, SID_2k40 ) )
2951 : {
2952 43626 : push_indice( hBstr, IND_STEREO_DFT_ITD_MODE, ( hStereoDft->hItd->itd_fx[k_offset] != 0 ), STEREO_DFT_ITD_MODE_NBITS );
2953 43626 : ( *nb_bits ) = add( *nb_bits, STEREO_DFT_ITD_MODE_NBITS ); /*ITD mode flag: 1bit*/
2954 43626 : move16();
2955 : }
2956 :
2957 45085 : IF( NE_32( core_brate, SID_2k40 ) )
2958 : {
2959 43626 : IF( hStereoDft->hItd->itd_fx[k_offset] )
2960 : {
2961 25983 : itd = hStereoDft->hItd->itd_index[k_offset];
2962 25983 : move16();
2963 25983 : IF( GT_16( itd, 255 ) )
2964 : {
2965 16787 : itd = sub( itd, 256 );
2966 :
2967 16787 : IF( LT_16( itd, 20 ) )
2968 : {
2969 9687 : push_indice( hBstr, IND_STEREO_DFT_ITD_HUFF, 1, 1 ); /* use Huffman*/
2970 9687 : push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 1, 1 ); /* negative */
2971 9687 : push_indice( hBstr, IND_STEREO_DFT_ITD_COD, dft_code_itd[itd], dft_len_itd[itd] );
2972 9687 : ( *nb_bits ) = add( *nb_bits, add( dft_len_itd[itd], 2 ) );
2973 9687 : move16();
2974 : }
2975 : ELSE
2976 : {
2977 7100 : push_indice( hBstr, IND_STEREO_DFT_ITD_HUFF, 0, 1 ); /* don't use Huffman */
2978 7100 : push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 1, 1 ); /* negative */
2979 7100 : push_indice( hBstr, IND_STEREO_DFT_ITD_COD, itd, STEREO_DFT_ITD_NBITS - 1 );
2980 7100 : ( *nb_bits ) = add( *nb_bits, STEREO_DFT_ITD_NBITS + 1 );
2981 7100 : move16();
2982 : }
2983 : }
2984 : ELSE
2985 : {
2986 9196 : IF( LT_16( itd, 20 ) )
2987 : {
2988 3983 : push_indice( hBstr, IND_STEREO_DFT_ITD_HUFF, 1, 1 ); /* use Huffman*/
2989 3983 : push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 0, 1 ); /* positive */
2990 3983 : push_indice( hBstr, IND_STEREO_DFT_ITD_COD, dft_code_itd[itd], dft_len_itd[itd] );
2991 3983 : ( *nb_bits ) = add( *nb_bits, add( dft_len_itd[itd], 2 ) );
2992 3983 : move16();
2993 : }
2994 : ELSE
2995 : {
2996 : /* don't use Huffman and positive*/
2997 5213 : push_indice( hBstr, IND_STEREO_DFT_ITD_COD, itd, STEREO_DFT_ITD_NBITS + 1 );
2998 5213 : ( *nb_bits ) = add( *nb_bits, STEREO_DFT_ITD_NBITS + 1 );
2999 5213 : move16();
3000 : }
3001 : }
3002 : }
3003 : }
3004 :
3005 : #ifdef DEBUG_MODE_DFT_BITS
3006 : fprintf( ITD_bits, "%d ", *nb_bits );
3007 : #endif
3008 :
3009 : /*------------------------------------------------------------------*
3010 : * write Side gain indices
3011 : *-----------------------------------------------------------------*/
3012 :
3013 : /* Side Gain flag 1 */
3014 45085 : nb = 0;
3015 45085 : move16();
3016 45085 : IF( hStereoDft->side_gain_flag_1 > 0 )
3017 : {
3018 9907 : push_indice( hBstr, IND_STEREO_DFT_SIDEGAIN_FLAG, hStereoDft->side_gain_flag_1, 2 );
3019 9907 : nb = add( nb, 2 );
3020 : }
3021 : ELSE
3022 : {
3023 35178 : push_indice( hBstr, IND_STEREO_DFT_SIDEGAIN_FLAG, hStereoDft->side_gain_flag_1, STEREO_DFT_FLAG_BITS );
3024 35178 : nb = add( nb, STEREO_DFT_FLAG_BITS );
3025 : }
3026 :
3027 45085 : no_GR_ord = 3;
3028 45085 : move16();
3029 :
3030 45085 : IF( hStereoDft->side_gain_flag_1 == 0 )
3031 : {
3032 35178 : nb = add( nb, write_bitstream_adapt_GR_fx( hBstr, IND_STEREO_DFT_SIDEGAINS, encoded_ind_GR, hStereoDft->nbands, hStereoDft->side_gain_flag_2, no_GR_ord ) );
3033 : }
3034 : ELSE{
3035 9907 : IF( EQ_16( hStereoDft->side_gain_flag_1, 2 ) ){
3036 8836 : nb = add( nb, write_bitstream_GR_fx( hBstr, IND_STEREO_DFT_SIDEGAINS, hStereoDft->side_gain_index_ECDiff, hStereoDft->nbands, hStereoDft->side_gain_flag_2 - no_GR_ord ) );
3037 : }
3038 : ELSE
3039 : {
3040 7253 : FOR( b = 0; b < hStereoDft->nbands; b++ )
3041 : {
3042 : /*ILD*/
3043 6182 : push_indice( hBstr, IND_STEREO_DFT_SIDEGAINS, hStereoDft->side_gain_index_EC[b], STEREO_DFT_SIDEGAIN_NBITS );
3044 6182 : nb = add( nb, STEREO_DFT_SIDEGAIN_NBITS );
3045 : }
3046 : }
3047 : }
3048 :
3049 : /* nb bits are used for side gain*/
3050 45085 : ( *nb_bits ) = add( *nb_bits, nb );
3051 45085 : move16();
3052 : #ifdef DEBUG_MODE_DFT_BITS
3053 : fprintf( SG_bits, "%d ", nb );
3054 : #endif
3055 45085 : nb = 0;
3056 45085 : move16();
3057 :
3058 45085 : IF( EQ_32( core_brate, SID_2k40 ) )
3059 : {
3060 1459 : stereo_dft_enc_sid_calc_coh_fx( hStereoDft, hCPE->hStereoCng->prev_cohBand_fx, &hCPE->hStereoCng->td_active, &hCPE->hStereoCng->first_SID, cohBand );
3061 :
3062 1459 : IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - STEREO_DFT_ITD_MODE_NBITS - STEREO_DFT_SID_ITD_NBITS - 1 ) ) )
3063 : {
3064 1459 : IF( NE_32( hStereoDft->hItd->itd_fx[k_offset], 0 ) )
3065 : {
3066 : /* Re-quantize ITD with lower resolution for Stereo CNG */
3067 46 : itd = hStereoDft->hItd->itd_index[k_offset];
3068 46 : move16();
3069 46 : if ( GT_16( itd, 255 ) )
3070 : {
3071 37 : itd = sub( itd, 256 );
3072 : }
3073 46 : itd = shr( itd, STEREO_DFT_SID_ITD_FAC );
3074 :
3075 46 : sid_itd = itd && 1;
3076 46 : move16();
3077 : }
3078 : ELSE
3079 : {
3080 1413 : sid_itd = 0;
3081 1413 : move16();
3082 : }
3083 :
3084 1459 : push_indice( hBstr, IND_STEREO_DFT_ITD_MODE, sid_itd, STEREO_DFT_ITD_MODE_NBITS );
3085 1459 : ( *nb_bits ) = add( *nb_bits, STEREO_DFT_ITD_MODE_NBITS ); /*ITD mode flag: 1bit*/
3086 1459 : move16();
3087 :
3088 1459 : IF( sid_itd )
3089 : {
3090 21 : itd = hStereoDft->hItd->itd_index[k_offset];
3091 21 : move16();
3092 21 : IF( GT_16( itd, 255 ) )
3093 : {
3094 12 : itd = sub( itd, 256 );
3095 12 : itd = shr( itd, STEREO_DFT_SID_ITD_FAC );
3096 :
3097 12 : if ( GT_16( itd, ( ( 1 << STEREO_DFT_SID_ITD_NBITS ) - 1 ) ) )
3098 : {
3099 12 : itd = ( 1 << STEREO_DFT_SID_ITD_NBITS ) - 1;
3100 12 : move16();
3101 : }
3102 :
3103 12 : push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 1, 1 ); /* negative */
3104 12 : push_indice( hBstr, IND_STEREO_DFT_ITD_COD, itd, STEREO_DFT_SID_ITD_NBITS );
3105 12 : ( *nb_bits ) = add( *nb_bits, STEREO_DFT_SID_ITD_NBITS + 1 );
3106 12 : move16();
3107 : }
3108 : ELSE
3109 : {
3110 9 : itd = shr( itd, STEREO_DFT_SID_ITD_FAC );
3111 :
3112 9 : if ( GT_16( itd, ( ( 1 << STEREO_DFT_SID_ITD_NBITS ) - 1 ) ) )
3113 : {
3114 8 : itd = ( 1 << STEREO_DFT_SID_ITD_NBITS ) - 1;
3115 8 : move16();
3116 : }
3117 :
3118 9 : push_indice( hBstr, IND_STEREO_DFT_ITD_NEG, 0, 1 ); /* Positive */
3119 9 : push_indice( hBstr, IND_STEREO_DFT_ITD_COD, itd, STEREO_DFT_SID_ITD_NBITS );
3120 9 : ( *nb_bits ) = add( *nb_bits, STEREO_DFT_SID_ITD_NBITS + 1 );
3121 9 : move16();
3122 : }
3123 : }
3124 : }
3125 : }
3126 :
3127 : /*------------------------------------------------------------------*
3128 : * write IPD indices
3129 : *-----------------------------------------------------------------*/
3130 :
3131 45085 : IF( NE_32( core_brate, SID_2k40 ) )
3132 : {
3133 43626 : push_indice( hBstr, IND_STEREO_DFT_NO_IPD_FLAG, hStereoDft->no_ipd_flag, STEREO_DFT_FLAG_BITS );
3134 43626 : nb = add( nb, STEREO_DFT_FLAG_BITS ); /*IPD mode flag: 1bit*/
3135 :
3136 43626 : IF( hStereoDft->no_ipd_flag == 0 )
3137 : {
3138 4076 : push_indice( hBstr, IND_STEREO_DFT_GIPD, hStereoDft->gipd_index, STEREO_DFT_GIPD_NBITS );
3139 4076 : nb = add( nb, STEREO_DFT_GIPD_NBITS );
3140 : }
3141 : }
3142 1459 : ELSE IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - STEREO_DFT_FLAG_BITS - STEREO_DFT_SID_GIPD_NBITS ) ) )
3143 : {
3144 1459 : push_indice( hBstr, IND_STEREO_DFT_NO_IPD_FLAG, hStereoDft->no_ipd_flag, STEREO_DFT_FLAG_BITS );
3145 1459 : nb = add( nb, STEREO_DFT_FLAG_BITS ); /*IPD mode flag: 1bit*/
3146 :
3147 1459 : IF( hStereoDft->no_ipd_flag == 0 )
3148 : {
3149 275 : stereo_dft_quantize_ipd_fx( &hStereoDft->sid_gipd_fx, &hStereoDft->sid_gipd_fx, &sid_gIpd_index, STEREO_DFT_SID_GIPD_NBITS );
3150 275 : push_indice( hBstr, IND_STEREO_DFT_GIPD, sid_gIpd_index, STEREO_DFT_SID_GIPD_NBITS );
3151 275 : nb = add( nb, STEREO_DFT_SID_GIPD_NBITS );
3152 : }
3153 : }
3154 :
3155 :
3156 : #ifdef DEBUG_MODE_DFT_BITS
3157 : fprintf( IPD_bits, "%d ", nb );
3158 : #endif
3159 45085 : ( *nb_bits ) = add( *nb_bits, nb );
3160 :
3161 : /*----------------------------------------------------------------*
3162 : * Residual prediction
3163 : *----------------------------------------------------------------*/
3164 :
3165 45085 : nb = 0; /* bits for residual pred gains */
3166 45085 : move16();
3167 45085 : IF( hStereoDft->res_pred_mode[k_offset] )
3168 : {
3169 43626 : IF( hStereoDft->attackPresent == 0 )
3170 : {
3171 42026 : nbands = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX );
3172 42026 : b = hStereoDft->res_pred_band_min;
3173 42026 : move16();
3174 :
3175 : /*Adaptive SF*/
3176 42026 : IF( hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF )
3177 : {
3178 : /*read flag*/
3179 25222 : push_indice( hBstr, IND_STEREO_DFT_REVERB_MODE, hStereoDft->reverb_flag, STEREO_DFT_REVERB_MODE_NBITS );
3180 25222 : nb = add( nb, STEREO_DFT_REVERB_MODE_NBITS );
3181 25222 : IF( hStereoDft->reverb_flag )
3182 : {
3183 6808 : nbands = sub( nbands, STEREO_DFT_RES_PRED_BAND_MIN_CONST );
3184 : }
3185 : }
3186 :
3187 : /* Res Pred Gain flag 0 */
3188 42026 : IF( hStereoDft->res_pred_flag_1 > 0 )
3189 : {
3190 33625 : push_indice( hBstr, IND_STEREO_DFT_RES_PRED_FLAG, hStereoDft->res_pred_flag_1, 2 );
3191 33625 : nb = add( nb, 2 ); /*pred gain mode flag: 2 bits*/
3192 : }
3193 : ELSE
3194 : {
3195 8401 : push_indice( hBstr, IND_STEREO_DFT_RES_PRED_FLAG, hStereoDft->res_pred_flag_1, STEREO_DFT_FLAG_BITS );
3196 8401 : nb = add( nb, STEREO_DFT_FLAG_BITS ); /*pred gain mode flag: 1bit*/
3197 : }
3198 :
3199 42026 : no_GR_ord = 2;
3200 42026 : move16();
3201 42026 : IF( hStereoDft->res_pred_flag_1 == 0 )
3202 : {
3203 8401 : IF( EQ_16( encoded_ind_pred_GR[0], dft_maps_rpg[8 * NO_SYMB_GR_PRED_G] ) )
3204 : {
3205 975 : nb = add( nb, write_GR1_fx( hBstr, IND_STEREO_DFT_PRED_GAIN_COD, encoded_ind_pred_GR, 1 ) );
3206 : }
3207 : ELSE
3208 : {
3209 7426 : nb = add( nb, write_bitstream_adapt_GR_fx( hBstr, IND_STEREO_DFT_PRED_GAIN_COD, encoded_ind_pred_GR, nbands - hStereoDft->res_pred_band_min, hStereoDft->res_pred_flag_2, 2 ) );
3210 : }
3211 : }
3212 : ELSE
3213 : {
3214 33625 : IF( EQ_16( hStereoDft->res_pred_flag_1, 2 ) )
3215 : {
3216 30258 : nb = add( nb, write_bitstream_GR_fx( hBstr, IND_STEREO_DFT_PRED_GAIN_COD, &hStereoDft->res_pred_index_ECDiff[hStereoDft->res_pred_band_min], nbands - hStereoDft->res_pred_band_min, hStereoDft->res_pred_flag_2 - no_GR_ord ) );
3217 : }
3218 : ELSE
3219 : {
3220 23445 : FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ )
3221 : {
3222 20078 : push_indice( hBstr, IND_STEREO_DFT_PRED_GAIN_COD, hStereoDft->res_pred_index_EC[b], STEREO_DFT_RES_GAINS_BITS );
3223 20078 : nb = add( nb, STEREO_DFT_RES_GAINS_BITS );
3224 : }
3225 : }
3226 : }
3227 : }
3228 : ELSE
3229 : {
3230 1600 : set16_fx( hStereoDft->res_pred_index_ECprevious, 0, sub( hStereoDft->nbands, hStereoDft->res_pred_band_min ) );
3231 : }
3232 : }
3233 : ELSE
3234 : {
3235 1459 : set16_fx( hStereoDft->res_pred_index_ECprevious, 0, hStereoDft->nbands - hStereoDft->res_pred_band_min );
3236 : }
3237 :
3238 45085 : ( *nb_bits ) = add( *nb_bits, nb );
3239 45085 : move16();
3240 :
3241 45085 : IF( EQ_32( core_brate, SID_2k40 ) )
3242 : {
3243 1459 : stereo_dft_enc_sid_coh_fx( hBstr, hCPE->hStereoCng->mem_cohBand_fx, hStereoDft->nbands, nb_bits, cohBand );
3244 : }
3245 :
3246 :
3247 45085 : return;
3248 : }
3249 :
3250 : /*-------------------------------------------------------------------------
3251 : * stereo_dft_enc_compute_prm()
3252 : *
3253 : * Compute stereo parameters: IPD and SIDE_GAIN
3254 : * SIDE_GAIN: Interchannel Level Difference
3255 : * IPD: Interchannel Phase Difference: angle(L)-angle(R) = acos(<L,R>/(|L|.|R|)) or atan2(Img(L.R*)/Re(L.R*))
3256 : *------------------------------------------------------------------------*/
3257 :
3258 59659 : static void stereo_dft_enc_compute_prm_fx(
3259 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
3260 : Word32 *DFT_L_fx, // Q(31-DFT_L_fx_e[])
3261 : Word16 *DFT_L_fx_e,
3262 : Word32 *DFT_R_fx, // Q(31-DFT_R_fx_e[])
3263 : Word16 *DFT_R_fx_e,
3264 : Word16 k_offset,
3265 : Word16 flag_quant,
3266 : const Word16 sp_aud_decision0,
3267 : const Word16 vad_flag,
3268 : Word32 *bin_nrgL_fx, // Q(31-bin_nrgL_fx_e[])
3269 : Word16 *bin_nrgL_fx_e,
3270 : Word32 *bin_nrgR_fx, // Q(31-bin_nrgR_fx_e[])
3271 : Word16 *bin_nrgR_fx_e,
3272 : Word32 *dot_prod_nrg_ratio_fx, // Q(31-dot_prod_nrg_ratio_fx_e[])
3273 : Word16 *dot_prod_nrg_ratio_fx_e )
3274 : {
3275 : Word16 b, i;
3276 : Word16 b2;
3277 : Word32 *pDFT_L, *pDFT_R;
3278 : // Word16 DFT_L_e, DFT_R_e;
3279 : Word32 sum_nrg_L, sum_nrg_R;
3280 : Word16 sum_nrg_L_e, sum_nrg_R_e;
3281 : Word32 dot_prod_real, dot_prod_img;
3282 : Word16 dot_prod_real_e, dot_prod_img_e;
3283 : Word32 sum_nrg_L2, sum_nrg_R2;
3284 : Word16 sum_nrg_L2_e, sum_nrg_R2_e;
3285 : Word32 dot_prod_real2, dot_prod_img2;
3286 : Word16 dot_prod_real2_e, dot_prod_img2_e;
3287 : Word32 *pPredGain;
3288 : Word32 *pSideGain;
3289 : Word32 sum_energy_L, sum_energy_R;
3290 : Word16 sum_energy_L_e, sum_energy_R_e;
3291 : Word32 g, c;
3292 : Word16 /*g,*/ c_e;
3293 : Word32 abs_L_R;
3294 : Word16 abs_L_R_e;
3295 : Word32 abs_L_R2;
3296 : Word16 abs_L_R2_e;
3297 : Word32 gain_IPD; // Q31
3298 : Word32 sub_nrg_DMX[STEREO_DFT_BAND_MAX];
3299 : Word16 sub_nrg_DMX_e[STEREO_DFT_BAND_MAX];
3300 : Word32 sub_nrg_DMX2;
3301 : Word16 sub_nrg_DMX2_e;
3302 : Word32 sub_nrg_L[STEREO_DFT_BAND_MAX];
3303 : Word16 sub_nrg_L_e[STEREO_DFT_BAND_MAX];
3304 : Word32 sub_nrg_R[STEREO_DFT_BAND_MAX];
3305 : Word16 sub_nrg_R_e[STEREO_DFT_BAND_MAX];
3306 : Word32 diff_ipd;
3307 : Word32 *pNrgL, *pNrgR;
3308 : Word16 *pNrgL_e, *pNrgR_e;
3309 : Word32 reg;
3310 : Word16 reg_e;
3311 : Word32 *pgIpd, sum_dot_prod_real, sum_dot_prod_img;
3312 : Word16 sum_dot_prod_real_e, sum_dot_prod_img_e;
3313 : Word32 sum_past_nrgL, sum_past_nrgL2;
3314 : Word16 sum_past_nrgL_e, sum_past_nrgL2_e;
3315 : Word32 sum_past_nrgR, sum_past_nrgR2;
3316 : Word16 sum_past_nrgR_e, sum_past_nrgR2_e;
3317 : Word32 sum_past_dpr, sum_past_dpr2;
3318 : Word16 sum_past_dpr_e, sum_past_dpr2_e;
3319 : Word32 sum_past_dpi, sum_past_dpi2;
3320 : Word16 sum_past_dpi_e, sum_past_dpi2_e;
3321 : Word32 sum_past_dot_prod_abs, sum_past_dot_prod_abs2;
3322 59659 : Word16 sum_past_dot_prod_abs_e, sum_past_dot_prod_abs2_e = 0;
3323 : Word32 sum_past_nrg_dmx;
3324 : Word16 sum_past_nrg_dmx_e;
3325 : Word16 pos;
3326 : Word32 pIpd[STEREO_DFT_BAND_MAX]; // Q13
3327 : Word32 ipd_smooth[STEREO_DFT_BAND_MAX]; // Q13
3328 : Word32 ipd_mean_change; // Q13
3329 :
3330 : Word32 L_tmp;
3331 : Word16 L_tmp_e;
3332 : Word32 L_tmp1;
3333 : Word16 L_tmp1_e;
3334 : Word32 L_tmp2;
3335 : Word16 L_tmp2_e;
3336 : Word64 W_tmp;
3337 : Word16 W_shift;
3338 59659 : move16();
3339 :
3340 : /*Word16 past_nrgL_fx_tmp_e[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX];
3341 : Word16 past_nrgR_fx_tmp_e[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX];
3342 : Word16 past_dot_prod_real_fx_tmp_e[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX];
3343 : Word16 past_dot_prod_imag_fx_tmp_e[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX];
3344 : set16_fx(past_nrgL_fx_tmp_e, hStereoDft->past_nrgL_fx_e, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX);
3345 : set16_fx(past_nrgR_fx_tmp_e, hStereoDft->past_nrgR_fx_e, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX);
3346 : set16_fx(past_dot_prod_real_fx_tmp_e, hStereoDft->past_dot_prod_real_fx_e, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX);
3347 : set16_fx(past_dot_prod_imag_fx_tmp_e, hStereoDft->past_dot_prod_imag_fx_e, STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX);*/
3348 :
3349 : /*------------------------------------------------------------------*
3350 : * Initialization
3351 : *-----------------------------------------------------------------*/
3352 :
3353 59659 : sum_past_dot_prod_abs2 = 0;
3354 59659 : move16();
3355 59659 : pos = hStereoDft->nrg_past_pos;
3356 59659 : move16();
3357 :
3358 59659 : set32_fx( sub_nrg_DMX, 0, STEREO_DFT_BAND_MAX );
3359 59659 : set16_fx( sub_nrg_DMX_e, 0, STEREO_DFT_BAND_MAX );
3360 59659 : set32_fx( sub_nrg_L, 0, STEREO_DFT_BAND_MAX );
3361 59659 : set16_fx( sub_nrg_L_e, 0, STEREO_DFT_BAND_MAX );
3362 59659 : set32_fx( sub_nrg_R, 0, STEREO_DFT_BAND_MAX );
3363 59659 : set16_fx( sub_nrg_R_e, 0, STEREO_DFT_BAND_MAX );
3364 :
3365 59659 : pSideGain = hStereoDft->side_gain_fx + k_offset * STEREO_DFT_BAND_MAX; // Q31
3366 59659 : pgIpd = hStereoDft->gipd_fx + k_offset; // Q13
3367 59659 : pPredGain = hStereoDft->res_pred_gain_fx + k_offset * STEREO_DFT_BAND_MAX; // Q31
3368 : // gain_IPD = EPSILON;
3369 59659 : gain_IPD = 0;
3370 59659 : move32();
3371 59659 : sum_energy_L = EPSILON_FX_M; /* Set the accumulations for the no IPD Calculation */
3372 59659 : move32();
3373 59659 : sum_energy_L_e = EPSILON_FX_E; /* Set the accumulations for the no IPD Calculation */
3374 59659 : move16();
3375 59659 : sum_energy_R = EPSILON_FX_M;
3376 59659 : move32();
3377 59659 : sum_energy_R_e = EPSILON_FX_E;
3378 59659 : move16();
3379 59659 : sum_dot_prod_real = EPSILON_FX_M;
3380 59659 : move32();
3381 59659 : sum_dot_prod_real_e = EPSILON_FX_E;
3382 59659 : move16();
3383 59659 : sum_dot_prod_img = EPSILON_FX_M;
3384 59659 : move32();
3385 59659 : sum_dot_prod_img_e = EPSILON_FX_E;
3386 59659 : move16();
3387 59659 : sub_nrg_DMX2 = 0;
3388 59659 : move32();
3389 59659 : sub_nrg_DMX2_e = 0;
3390 59659 : move16();
3391 :
3392 : /*------------------------------------------------------------------*
3393 : * Band-wise processing
3394 : *-----------------------------------------------------------------*/
3395 :
3396 59659 : b2 = 0;
3397 59659 : move16();
3398 607522 : FOR( b = 0; b < hStereoDft->nbands; b++ )
3399 : {
3400 547863 : pPredGain[b] = MAX_32;
3401 547863 : move32();
3402 547863 : sum_nrg_L = EPSILON_FX_M;
3403 547863 : move32();
3404 547863 : sum_nrg_L_e = EPSILON_FX_E;
3405 547863 : move16();
3406 547863 : sum_nrg_R = EPSILON_FX_M;
3407 547863 : move32();
3408 547863 : sum_nrg_R_e = EPSILON_FX_E;
3409 547863 : move16();
3410 547863 : dot_prod_real = EPSILON_FX_M;
3411 547863 : move32();
3412 547863 : dot_prod_real_e = EPSILON_FX_E;
3413 547863 : move16();
3414 547863 : dot_prod_img = EPSILON_FX_M;
3415 547863 : move32();
3416 547863 : dot_prod_img_e = EPSILON_FX_E;
3417 547863 : move16();
3418 547863 : sum_past_nrgL = 0;
3419 547863 : move32();
3420 547863 : sum_past_nrgL_e = 0;
3421 547863 : move16();
3422 547863 : sum_past_nrgR = 0;
3423 547863 : move32();
3424 547863 : sum_past_nrgR_e = 0;
3425 547863 : move16();
3426 547863 : sum_past_dpr = 0;
3427 547863 : move32();
3428 547863 : sum_past_dpr_e = 0;
3429 547863 : move16();
3430 547863 : sum_past_dpi = 0;
3431 547863 : move32();
3432 547863 : sum_past_dpi_e = 0;
3433 547863 : move16();
3434 :
3435 1248924 : WHILE( hStereoDft->band_limits_dmx[b2] < hStereoDft->band_limits[b + 1] )
3436 : {
3437 701061 : pDFT_L = DFT_L_fx;
3438 : // DFT_L_e = hStereoDft->DFT_fx_e[0];
3439 701061 : pDFT_R = DFT_R_fx;
3440 : // DFT_R_e = hStereoDft->DFT_fx_e[1];
3441 701061 : pNrgL = bin_nrgL_fx;
3442 701061 : pNrgL_e = bin_nrgL_fx_e;
3443 701061 : pNrgR = bin_nrgR_fx;
3444 701061 : pNrgR_e = bin_nrgR_fx_e;
3445 :
3446 701061 : sum_nrg_L2 = EPSILON_FX_M;
3447 701061 : move32();
3448 701061 : sum_nrg_L2_e = EPSILON_FX_E;
3449 701061 : move16();
3450 701061 : sum_nrg_R2 = EPSILON_FX_M;
3451 701061 : move32();
3452 701061 : sum_nrg_R2_e = EPSILON_FX_E;
3453 701061 : move16();
3454 701061 : dot_prod_real2 = EPSILON_FX_M;
3455 701061 : move32();
3456 701061 : dot_prod_real2_e = EPSILON_FX_E;
3457 701061 : move16();
3458 701061 : dot_prod_img2 = EPSILON_FX_M;
3459 701061 : move32();
3460 701061 : dot_prod_img2_e = EPSILON_FX_E;
3461 701061 : move16();
3462 :
3463 38219962 : FOR( i = hStereoDft->band_limits_dmx[b2]; i < hStereoDft->band_limits_dmx[b2 + 1]; i++ )
3464 : {
3465 : // sum_nrg_L2 += pNrgL[i];
3466 37518901 : sum_nrg_L2 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, pNrgL[i], pNrgL_e[i], &sum_nrg_L2_e );
3467 : // sum_nrg_R2 += pNrgR[i];
3468 37518901 : sum_nrg_R2 = BASOP_Util_Add_Mant32Exp( sum_nrg_R2, sum_nrg_R2_e, pNrgR[i], pNrgR_e[i], &sum_nrg_R2_e );
3469 :
3470 : /* compute dot product*/
3471 : // dot_prod_real2 += pDFT_L[2 * i] * pDFT_R[2 * i] + pDFT_L[2 * i + 1] * pDFT_R[2 * i + 1];
3472 37518901 : L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L[2 * i], pDFT_R[2 * i] ), add( DFT_L_fx_e[2 * i], DFT_R_fx_e[2 * i] ), Mpy_32_32( pDFT_L[2 * i + 1], pDFT_R[2 * i + 1] ), add( DFT_L_fx_e[2 * i + 1], DFT_R_fx_e[2 * i + 1] ), &L_tmp_e );
3473 37518901 : dot_prod_real2 = BASOP_Util_Add_Mant32Exp( dot_prod_real2, dot_prod_real2_e, L_tmp, L_tmp_e, &dot_prod_real2_e );
3474 : // dot_prod_img2 += pDFT_L[2 * i + 1] * pDFT_R[2 * i] - pDFT_L[2 * i] * pDFT_R[2 * i + 1];
3475 37518901 : L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L[2 * i + 1], pDFT_R[2 * i] ), add( DFT_L_fx_e[2 * i + 1], DFT_R_fx_e[2 * i] ), L_negate( Mpy_32_32( pDFT_L[2 * i], pDFT_R[2 * i + 1] ) ), add( DFT_L_fx_e[2 * i], DFT_R_fx_e[2 * i + 1] ), &L_tmp_e );
3476 37518901 : dot_prod_img2 = BASOP_Util_Add_Mant32Exp( dot_prod_img2, dot_prod_img2_e, L_tmp, L_tmp_e, &dot_prod_img2_e );
3477 : }
3478 : // abs_L_R2 = sqrtf(dot_prod_real2 * dot_prod_real2 + dot_prod_img2 * dot_prod_img2);
3479 701061 : abs_L_R2 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( dot_prod_real2, dot_prod_real2 ), shl( dot_prod_real2_e, 1 ), Mpy_32_32( dot_prod_img2, dot_prod_img2 ), shl( dot_prod_img2_e, 1 ), &abs_L_R2_e );
3480 701061 : abs_L_R2 = Sqrt32( abs_L_R2, &abs_L_R2_e );
3481 : // sub_nrg_DMX2 = sum_nrg_L2 + sum_nrg_R2 + 2 * abs_L_R2;
3482 701061 : L_tmp = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, sum_nrg_R2, sum_nrg_R2_e, &L_tmp_e );
3483 701061 : sub_nrg_DMX2 = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_e, abs_L_R2, add( abs_L_R2_e, 1 ), &sub_nrg_DMX2_e );
3484 :
3485 701061 : IF( LT_16( b2, hStereoDft->gipd_band_max ) )
3486 : {
3487 : // hStereoDft->dot_prod_real_smooth[b2] = 0.5f * hStereoDft->dot_prod_real_smooth[b2] + 0.5f * dot_prod_real2;
3488 477272 : hStereoDft->dot_prod_real_smooth_fx[b2] = BASOP_Util_Add_Mant32Exp( hStereoDft->dot_prod_real_smooth_fx[b2], sub( hStereoDft->dot_prod_real_smooth_fx_e[b2], 1 ), dot_prod_real2, sub( dot_prod_real2_e, 1 ), &hStereoDft->dot_prod_real_smooth_fx_e[b2] );
3489 477272 : move32();
3490 : // hStereoDft->dot_prod_img_smooth[b2] = 0.5f * hStereoDft->dot_prod_img_smooth[b2] + 0.5f * dot_prod_img2;
3491 477272 : hStereoDft->dot_prod_img_smooth_fx[b2] = BASOP_Util_Add_Mant32Exp( hStereoDft->dot_prod_img_smooth_fx[b2], sub( hStereoDft->dot_prod_img_smooth_fx_e[b2], 1 ), dot_prod_img2, sub( dot_prod_img2_e, 1 ), &hStereoDft->dot_prod_img_smooth_fx_e[b2] );
3492 477272 : move32();
3493 : // pIpd[b2] = (float) atan2f( hStereoDft->dot_prod_img_smooth[b2], hStereoDft->dot_prod_real_smooth[b2] );
3494 477272 : pIpd[b2] = BASOP_util_atan2( hStereoDft->dot_prod_img_smooth_fx[b2], hStereoDft->dot_prod_real_smooth_fx[b2], sub( hStereoDft->dot_prod_img_smooth_fx_e[b2], hStereoDft->dot_prod_real_smooth_fx_e[b2] ) ); // Q13
3495 477272 : move32();
3496 :
3497 477272 : ipd_smooth[b2] = stereo_dft_calc_mean_bipd_fx( &pIpd[b2], hStereoDft->ipd_buf_fx[b2] );
3498 477272 : move32();
3499 :
3500 : // gain_IPD += ( sum_nrg_L2 + sum_nrg_R2 + 2 * dot_prod_real2 ) / sub_nrg_DMX2 / hStereoDft->gipd_band_max;
3501 477272 : L_tmp1 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, sum_nrg_R2, sum_nrg_R2_e, &L_tmp1_e );
3502 477272 : L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, dot_prod_real2, add( dot_prod_real2_e, 1 ), &L_tmp1_e );
3503 477272 : W_tmp = W_mult_32_32( sub_nrg_DMX2, hStereoDft->gipd_band_max );
3504 477272 : W_shift = W_norm( W_tmp );
3505 477272 : L_tmp2 = W_extract_h( W_shl( W_tmp, W_shift ) );
3506 477272 : L_tmp2_e = sub( add( sub_nrg_DMX2_e, 31 ), W_shift );
3507 477272 : L_tmp = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp_e );
3508 477272 : L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, L_tmp2_e ) );
3509 477272 : L_tmp = L_shl( L_tmp, L_tmp_e ); // Q31hStereoDft->gainIPD_sm_fx = L_add( L_shr( hStereoDft->gainIPD_sm_fx, 1 ), L_
3510 477272 : gain_IPD = L_add_sat( gain_IPD, L_tmp ); // Q31: saturation expected
3511 : }
3512 :
3513 701061 : sum_past_nrgL2 = EPSILON_FX_M;
3514 701061 : move32();
3515 701061 : sum_past_nrgL2_e = EPSILON_FX_E;
3516 701061 : move16();
3517 701061 : sum_past_nrgR2 = EPSILON_FX_M;
3518 701061 : move32();
3519 701061 : sum_past_nrgR2_e = EPSILON_FX_E;
3520 701061 : move16();
3521 701061 : sum_past_dpr2 = EPSILON_FX_M;
3522 701061 : move32();
3523 701061 : sum_past_dpr2_e = EPSILON_FX_E;
3524 701061 : move16();
3525 701061 : sum_past_dpi2 = EPSILON_FX_M;
3526 701061 : move32();
3527 701061 : sum_past_dpi2_e = EPSILON_FX_E;
3528 701061 : move16();
3529 701061 : test();
3530 701061 : test();
3531 701061 : test();
3532 701061 : IF( ( EQ_16( hStereoDft->band_res[k_offset], STEREO_DFT_BAND_RES_HIGH ) && LT_16( b2, STEREO_DFT_NRG_PAST_MAX_BAND ) ) ||
3533 : ( EQ_16( hStereoDft->band_res[k_offset], STEREO_DFT_BAND_RES_LOW ) && LT_16( b2, 2 * STEREO_DFT_NRG_PAST_MAX_BAND_LB ) ) )
3534 : {
3535 510358 : hStereoDft->past_nrgL_fx[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = sum_nrg_L2;
3536 510358 : move32();
3537 510358 : hStereoDft->past_nrgL_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = sum_nrg_L2_e;
3538 510358 : move16();
3539 510358 : hStereoDft->past_nrgR_fx[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = sum_nrg_R2;
3540 510358 : move32();
3541 510358 : hStereoDft->past_nrgR_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = sum_nrg_R2_e;
3542 510358 : move16();
3543 510358 : hStereoDft->past_dot_prod_real_fx[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = dot_prod_real2;
3544 510358 : move32();
3545 510358 : hStereoDft->past_dot_prod_real_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = dot_prod_real2_e;
3546 510358 : move16();
3547 510358 : hStereoDft->past_dot_prod_imag_fx[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = dot_prod_img2;
3548 510358 : move32();
3549 510358 : hStereoDft->past_dot_prod_imag_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = dot_prod_img2_e;
3550 510358 : move16();
3551 :
3552 2041432 : FOR( i = 0; i < STEREO_DFT_NRG_PAST_LEN; i++ )
3553 : {
3554 : // sum_past_nrgL2 += hStereoDft->past_nrgL[b2 * STEREO_DFT_NRG_PAST_LEN + i];
3555 1531074 : sum_past_nrgL2 = BASOP_Util_Add_Mant32Exp( sum_past_nrgL2, sum_past_nrgL2_e, hStereoDft->past_nrgL_fx[b2 * STEREO_DFT_NRG_PAST_LEN + i], hStereoDft->past_nrgL_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + i], &sum_past_nrgL2_e );
3556 : // sum_past_nrgR2 += hStereoDft->past_nrgR[b2 * STEREO_DFT_NRG_PAST_LEN + i];
3557 1531074 : sum_past_nrgR2 = BASOP_Util_Add_Mant32Exp( sum_past_nrgR2, sum_past_nrgR2_e, hStereoDft->past_nrgR_fx[b2 * STEREO_DFT_NRG_PAST_LEN + i], hStereoDft->past_nrgR_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + i], &sum_past_nrgR2_e );
3558 : // sum_past_dpr2 += hStereoDft->past_dot_prod_real[b2 * STEREO_DFT_NRG_PAST_LEN + i];
3559 1531074 : sum_past_dpr2 = BASOP_Util_Add_Mant32Exp( sum_past_dpr2, sum_past_dpr2_e, hStereoDft->past_dot_prod_real_fx[b2 * STEREO_DFT_NRG_PAST_LEN + i], hStereoDft->past_dot_prod_real_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + i], &sum_past_dpr2_e );
3560 : // sum_past_dpi2 += hStereoDft->past_dot_prod_imag[b2 * STEREO_DFT_NRG_PAST_LEN + i];
3561 1531074 : sum_past_dpi2 = BASOP_Util_Add_Mant32Exp( sum_past_dpi2, sum_past_dpi2_e, hStereoDft->past_dot_prod_imag_fx[b2 * STEREO_DFT_NRG_PAST_LEN + i], hStereoDft->past_dot_prod_imag_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + i], &sum_past_dpi2_e );
3562 : }
3563 :
3564 510358 : IF( hStereoDft->attackPresent )
3565 : {
3566 : /* omit transient frames from past part of parameter estimation in following frames */
3567 15737 : Word16 prev_pos = add( pos, STEREO_DFT_NRG_PAST_LEN - 1 ) % STEREO_DFT_NRG_PAST_LEN;
3568 15737 : hStereoDft->past_nrgL_fx[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_nrgL_fx[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
3569 15737 : move32();
3570 15737 : hStereoDft->past_nrgL_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_nrgL_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
3571 15737 : move16();
3572 15737 : hStereoDft->past_nrgR_fx[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_nrgR_fx[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
3573 15737 : move32();
3574 15737 : hStereoDft->past_nrgR_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_nrgR_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
3575 15737 : move16();
3576 15737 : hStereoDft->past_dot_prod_real_fx[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_dot_prod_real_fx[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
3577 15737 : move32();
3578 15737 : hStereoDft->past_dot_prod_real_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_dot_prod_real_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
3579 15737 : move16();
3580 15737 : hStereoDft->past_dot_prod_imag_fx[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_dot_prod_imag_fx[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
3581 15737 : move32();
3582 15737 : hStereoDft->past_dot_prod_imag_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + pos] = hStereoDft->past_dot_prod_imag_fx_e[b2 * STEREO_DFT_NRG_PAST_LEN + prev_pos];
3583 15737 : move16();
3584 : }
3585 :
3586 : // sum_past_dot_prod_abs2 = sqrtf( sum_past_dpr2 * sum_past_dpr2 + sum_past_dpi2 * sum_past_dpi2 );
3587 510358 : sum_past_dot_prod_abs2 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( sum_past_dpr2, sum_past_dpr2 ), shl( sum_past_dpr2_e, 1 ), Mpy_32_32( sum_past_dpi2, sum_past_dpi2 ), shl( sum_past_dpi2_e, 1 ), &sum_past_dot_prod_abs2_e );
3588 510358 : sum_past_dot_prod_abs2 = Sqrt32( sum_past_dot_prod_abs2, &sum_past_dot_prod_abs2_e );
3589 : // dot_prod_nrg_ratio[b2] = sum_past_dot_prod_abs2 / ( sum_past_nrgL2 + sum_past_nrgR2 + EPSILON );
3590 510358 : L_tmp2 = BASOP_Util_Add_Mant32Exp( sum_past_nrgL2, sum_past_nrgL2_e, sum_past_nrgR2, sum_past_nrgR2_e, &L_tmp2_e );
3591 510358 : L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e );
3592 510358 : dot_prod_nrg_ratio_fx[b2] = BASOP_Util_Divide3232_Scale_newton( sum_past_dot_prod_abs2, L_tmp2, &L_tmp_e );
3593 510358 : move32();
3594 510358 : L_tmp_e = add( L_tmp_e, sub( sum_past_dot_prod_abs2_e, L_tmp2_e ) );
3595 510358 : dot_prod_nrg_ratio_fx[b2] = L_shl( dot_prod_nrg_ratio_fx[b2], L_tmp_e ); // Q31
3596 510358 : move32();
3597 510358 : dot_prod_nrg_ratio_fx_e[b2] = 0;
3598 510358 : move16();
3599 : // printf("\n%f\t", (float)dot_prod_nrg_ratio_fx[b2] / 0x7fffffff);
3600 : }
3601 : ELSE
3602 : {
3603 : // sum_past_nrgL2 += sum_nrg_L2;
3604 190703 : sum_past_nrgL2 = BASOP_Util_Add_Mant32Exp( sum_past_nrgL2, sum_past_nrgL2_e, sum_nrg_L2, sum_nrg_L2_e, &sum_past_nrgL2_e );
3605 : // sum_past_nrgR2 += sum_nrg_R2;
3606 190703 : sum_past_nrgR2 = BASOP_Util_Add_Mant32Exp( sum_past_nrgR2, sum_past_nrgR2_e, sum_nrg_R2, sum_nrg_R2_e, &sum_past_nrgR2_e );
3607 : // dot_prod_nrg_ratio[b2] = sqrtf( dot_prod_real2 * dot_prod_real2 + dot_prod_img2 * dot_prod_img2 );
3608 190703 : L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( dot_prod_real2, dot_prod_real2 ), shl( dot_prod_real2_e, 1 ), Mpy_32_32( dot_prod_img2, dot_prod_img2 ), shl( dot_prod_img2_e, 1 ), &L_tmp_e );
3609 190703 : L_tmp = Sqrt32( L_tmp, &L_tmp_e );
3610 190703 : dot_prod_nrg_ratio_fx[b2] = L_tmp;
3611 190703 : move32();
3612 190703 : dot_prod_nrg_ratio_fx_e[b2] = L_tmp_e;
3613 190703 : move16();
3614 190703 : IF( EQ_16( b2, 2 * STEREO_DFT_NRG_PAST_MAX_BAND_LB ) ) /* hStereoDft->band_res[k_offset] == 2 */
3615 : {
3616 : // dot_prod_nrg_ratio[b2] /= ( sum_nrg_L2 + sum_nrg_R2 + EPSILON );
3617 26573 : L_tmp2 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, sum_nrg_R2, sum_nrg_R2_e, &L_tmp2_e );
3618 26573 : L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e );
3619 26573 : dot_prod_nrg_ratio_fx[b2] = BASOP_Util_Divide3232_Scale_newton( dot_prod_nrg_ratio_fx[b2], L_tmp2, &L_tmp_e );
3620 26573 : move32();
3621 26573 : L_tmp_e = add( L_tmp_e, sub( dot_prod_nrg_ratio_fx_e[b2], L_tmp2_e ) );
3622 26573 : dot_prod_nrg_ratio_fx[b2] = L_shl( dot_prod_nrg_ratio_fx[b2], L_tmp_e ); // Q31
3623 26573 : move32();
3624 26573 : dot_prod_nrg_ratio_fx_e[b2] = 0;
3625 26573 : move16();
3626 : }
3627 : }
3628 : // sum_nrg_L += sum_nrg_L2;
3629 701061 : sum_nrg_L = BASOP_Util_Add_Mant32Exp( sum_nrg_L, sum_nrg_L_e, sum_nrg_L2, sum_nrg_L2_e, &sum_nrg_L_e );
3630 : // sum_nrg_R += sum_nrg_R2;
3631 701061 : sum_nrg_R = BASOP_Util_Add_Mant32Exp( sum_nrg_R, sum_nrg_R_e, sum_nrg_R2, sum_nrg_R2_e, &sum_nrg_R_e );
3632 : // dot_prod_real += dot_prod_real2;
3633 701061 : dot_prod_real = BASOP_Util_Add_Mant32Exp( dot_prod_real, dot_prod_real_e, dot_prod_real2, dot_prod_real2_e, &dot_prod_real_e );
3634 : // dot_prod_img += dot_prod_img2;
3635 701061 : dot_prod_img = BASOP_Util_Add_Mant32Exp( dot_prod_img, dot_prod_img_e, dot_prod_img2, dot_prod_img2_e, &dot_prod_img_e );
3636 :
3637 : // sum_past_nrgL += sum_past_nrgL2;
3638 701061 : sum_past_nrgL = BASOP_Util_Add_Mant32Exp( sum_past_nrgL, sum_past_nrgL_e, sum_past_nrgL2, sum_past_nrgL2_e, &sum_past_nrgL_e );
3639 : // sum_past_nrgR += sum_past_nrgR2;
3640 701061 : sum_past_nrgR = BASOP_Util_Add_Mant32Exp( sum_past_nrgR, sum_past_nrgR_e, sum_past_nrgR2, sum_past_nrgR2_e, &sum_past_nrgR_e );
3641 : // sum_past_dpr += sum_past_dpr2;
3642 701061 : sum_past_dpr = BASOP_Util_Add_Mant32Exp( sum_past_dpr, sum_past_dpr_e, sum_past_dpr2, sum_past_dpr2_e, &sum_past_dpr_e );
3643 : // sum_past_dpi += sum_past_dpi2;
3644 701061 : sum_past_dpi = BASOP_Util_Add_Mant32Exp( sum_past_dpi, sum_past_dpi_e, sum_past_dpi2, sum_past_dpi2_e, &sum_past_dpi_e );
3645 :
3646 701061 : b2++;
3647 : }
3648 : // sum_energy_L += sum_nrg_L; /* Energies of the individual Band for Left and Right */
3649 547863 : sum_energy_L = BASOP_Util_Add_Mant32Exp( sum_energy_L, sum_energy_L_e, sum_nrg_L, sum_nrg_L_e, &sum_energy_L_e ); /* Energies of the individual Band for Left and Right */
3650 : // sum_energy_R += sum_nrg_R;
3651 547863 : sum_energy_R = BASOP_Util_Add_Mant32Exp( sum_energy_R, sum_energy_R_e, sum_nrg_R, sum_nrg_R_e, &sum_energy_R_e );
3652 : // sum_dot_prod_real += dot_prod_real;
3653 547863 : sum_dot_prod_real = BASOP_Util_Add_Mant32Exp( sum_dot_prod_real, sum_dot_prod_real_e, dot_prod_real, dot_prod_real_e, &sum_dot_prod_real_e );
3654 : // sum_dot_prod_img += dot_prod_img;
3655 547863 : sum_dot_prod_img = BASOP_Util_Add_Mant32Exp( sum_dot_prod_img, sum_dot_prod_img_e, dot_prod_img, dot_prod_img_e, &sum_dot_prod_img_e );
3656 :
3657 : /* compute side and residual gains over two frames */
3658 : // abs_L_R = sqrtf( dot_prod_real * dot_prod_real + dot_prod_img * dot_prod_img );
3659 547863 : abs_L_R = BASOP_Util_Add_Mant32Exp( Mpy_32_32( dot_prod_real, dot_prod_real ), shl( dot_prod_real_e, 1 ), Mpy_32_32( dot_prod_img, dot_prod_img ), shl( dot_prod_img_e, 1 ), &abs_L_R_e );
3660 547863 : abs_L_R = Sqrt32( abs_L_R, &abs_L_R_e );
3661 :
3662 547863 : test();
3663 547863 : test();
3664 547863 : IF( EQ_16( hStereoDft->band_res[k_offset], STEREO_DFT_BAND_RES_LOW ) && LT_16( b, 4 ) )
3665 : {
3666 : // sum_past_dot_prod_abs = sqrtf( sum_past_dpr * sum_past_dpr + sum_past_dpi * sum_past_dpi );
3667 106292 : sum_past_dot_prod_abs = BASOP_Util_Add_Mant32Exp( Mpy_32_32( sum_past_dpr, sum_past_dpr ), shl( sum_past_dpr_e, 1 ), Mpy_32_32( sum_past_dpi, sum_past_dpi ), shl( sum_past_dpi_e, 1 ), &sum_past_dot_prod_abs_e );
3668 106292 : sum_past_dot_prod_abs = Sqrt32( sum_past_dot_prod_abs, &sum_past_dot_prod_abs_e );
3669 : }
3670 441571 : ELSE IF( EQ_16( hStereoDft->band_res[k_offset], STEREO_DFT_BAND_RES_HIGH ) && LT_16( b, 9 ) )
3671 : {
3672 297774 : sum_past_dot_prod_abs = sum_past_dot_prod_abs2;
3673 297774 : move32();
3674 297774 : sum_past_dot_prod_abs_e = sum_past_dot_prod_abs2_e;
3675 297774 : move16();
3676 : }
3677 : ELSE
3678 : {
3679 143797 : sum_past_dot_prod_abs = abs_L_R;
3680 143797 : move32();
3681 143797 : sum_past_dot_prod_abs_e = abs_L_R_e;
3682 143797 : move16();
3683 : }
3684 :
3685 : // c = sqrtf( sum_past_nrgL / sum_past_nrgR );
3686 547863 : c = BASOP_Util_Divide3232_Scale_newton( sum_past_nrgL, sum_past_nrgR, &c_e );
3687 547863 : c_e = add( c_e, sub( sum_past_nrgL_e, sum_past_nrgR_e ) );
3688 547863 : c = Sqrt32( c, &c_e );
3689 : // sum_past_nrg_dmx = sum_past_nrgL + sum_past_nrgR + 2 * sum_past_dot_prod_abs;
3690 547863 : sum_past_nrg_dmx = BASOP_Util_Add_Mant32Exp( sum_past_nrgL, sum_past_nrgL_e, sum_past_nrgR, sum_past_nrgR_e, &sum_past_nrg_dmx_e );
3691 547863 : sum_past_nrg_dmx = BASOP_Util_Add_Mant32Exp( sum_past_nrg_dmx, sum_past_nrg_dmx_e, sum_past_dot_prod_abs, add( sum_past_dot_prod_abs_e, 1 ), &sum_past_nrg_dmx_e );
3692 : // sub_nrg_DMX[b] = sum_nrg_L + sum_nrg_R + 2 * abs_L_R;
3693 547863 : sub_nrg_DMX[b] = BASOP_Util_Add_Mant32Exp( sum_nrg_L, sum_nrg_L_e, sum_nrg_R, sum_nrg_R_e, &sub_nrg_DMX_e[b] );
3694 547863 : move32();
3695 547863 : sub_nrg_DMX[b] = BASOP_Util_Add_Mant32Exp( sub_nrg_DMX[b], sub_nrg_DMX_e[b], abs_L_R, add( abs_L_R_e, 1 ), &sub_nrg_DMX_e[b] );
3696 547863 : move32();
3697 :
3698 547863 : sub_nrg_L[b] = sum_nrg_L;
3699 547863 : move32();
3700 547863 : sub_nrg_L_e[b] = sum_nrg_L_e;
3701 547863 : move16();
3702 547863 : sub_nrg_R[b] = sum_nrg_R;
3703 547863 : move32();
3704 547863 : sub_nrg_R_e[b] = sum_nrg_R_e;
3705 547863 : move16();
3706 :
3707 547863 : test();
3708 547863 : test();
3709 547863 : IF( ( hStereoDft->res_pred_mode[k_offset] && GE_16( b, hStereoDft->res_pred_band_min ) ) || LT_16( b, hStereoDft->res_cod_band_max ) )
3710 : {
3711 : // g = ( sum_past_nrgL - sum_past_nrgR ) / ( sum_past_nrg_dmx );
3712 522881 : L_tmp1 = BASOP_Util_Add_Mant32Exp( sum_past_nrgL, sum_past_nrgL_e, L_negate( sum_past_nrgR ), sum_past_nrgR_e, &L_tmp1_e );
3713 522881 : L_tmp = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_past_nrg_dmx, &L_tmp_e );
3714 522881 : L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, sum_past_nrg_dmx_e ) );
3715 522881 : g = L_shl_sat( L_tmp, L_tmp_e ); // Q31 saturation expected
3716 522881 : pSideGain[b] = g;
3717 522881 : move32();
3718 : }
3719 : ELSE
3720 : {
3721 24982 : g = 0; /* to avoid compilation warning */
3722 24982 : move32();
3723 : // pSideGain[b] = ( c - 1 ) / ( c + 1 );
3724 24982 : L_tmp1 = BASOP_Util_Add_Mant32Exp( c, c_e, MIN_32, 0, &L_tmp1_e );
3725 24982 : L_tmp2 = BASOP_Util_Add_Mant32Exp( c, c_e, MAX_32, 0, &L_tmp2_e );
3726 24982 : L_tmp = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp_e );
3727 24982 : L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, L_tmp2_e ) );
3728 24982 : pSideGain[b] = L_shl_sat( L_tmp, L_tmp_e ); // Q31 saturation expected
3729 24982 : move32();
3730 : }
3731 :
3732 547863 : test();
3733 547863 : test();
3734 547863 : IF( hStereoDft->res_pred_mode[k_offset] && GE_16( b, hStereoDft->res_pred_band_min ) && !( hStereoDft->attackPresent ) )
3735 : {
3736 : /*(1-g)^2*L*L' + (1+g)^2*R*R' - 2(1-g^2)*abs(L*R')*/
3737 : // pPredGain[b] = max( 0, ( ( 1 - g ) * sum_past_nrgL + ( 1 + g ) * sum_past_nrgR - 2 * sum_past_dot_prod_abs ) );
3738 408836 : L_tmp1 = BASOP_Util_Add_Mant32Exp( MAX_32, 0, L_negate( g ), 0, &L_tmp1_e );
3739 408836 : L_tmp1 = Mpy_32_32( L_tmp1, sum_past_nrgL );
3740 408836 : L_tmp1_e = add( L_tmp1_e, sum_past_nrgL_e );
3741 408836 : L_tmp2 = BASOP_Util_Add_Mant32Exp( MAX_32, 0, g, 0, &L_tmp2_e );
3742 408836 : L_tmp2 = Mpy_32_32( L_tmp2, sum_past_nrgR );
3743 408836 : L_tmp2_e = add( L_tmp2_e, sum_past_nrgR_e );
3744 408836 : L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, L_tmp2, L_tmp2_e, &L_tmp_e );
3745 408836 : L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_e, L_negate( sum_past_dot_prod_abs ), add( sum_past_dot_prod_abs_e, 1 ), &L_tmp_e );
3746 408836 : IF( L_tmp < 0 )
3747 : {
3748 507 : L_tmp = 0;
3749 507 : move32();
3750 507 : L_tmp_e = 0;
3751 507 : move16();
3752 : }
3753 :
3754 : /*Normalized with energy of DMX*/
3755 :
3756 : /*Regularized gain computation by adding a coherent low energy contribution->avoid singularity for very low energy signals */
3757 :
3758 : // reg = ( hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b] ) * sqrtf( STEREO_DFT_N_32k_ENC );
3759 408836 : reg = L_mult0( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), 18318 /* sqrtf( STEREO_DFT_N_32k_ENC ) in Q9 */ );
3760 408836 : reg_e = norm_l( reg );
3761 408836 : reg = L_shl( reg, reg_e );
3762 408836 : reg_e = sub( 22, reg_e );
3763 : // reg *= reg;
3764 408836 : reg = Mpy_32_32( reg, reg );
3765 408836 : reg_e = shl( reg_e, 1 );
3766 :
3767 : // pPredGain[b] = sqrtf( pPredGain[b] / ( reg + sum_past_nrg_dmx ) );
3768 408836 : L_tmp2 = BASOP_Util_Add_Mant32Exp( reg, reg_e, sum_past_nrg_dmx, sum_past_nrg_dmx_e, &L_tmp2_e );
3769 408836 : L_tmp1 = BASOP_Util_Divide3232_Scale_newton( L_tmp, L_tmp2, &L_tmp1_e );
3770 408836 : L_tmp1_e = add( L_tmp1_e, sub( L_tmp_e, L_tmp2_e ) );
3771 408836 : L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e );
3772 408836 : pPredGain[b] = L_shl( L_tmp1, L_tmp1_e ); // Q31
3773 408836 : move32();
3774 :
3775 408836 : IF( hStereoDft->hItd->deltaItd_fx[k_offset] != 0 )
3776 : {
3777 : Word32 gain_offset, conversion_factor /*Q30*/;
3778 : Word16 dItd32;
3779 :
3780 : /* factor for converting deltaItd to 32kHz */
3781 143817 : conversion_factor = ONE_IN_Q30 /*1.f*/;
3782 143817 : move32();
3783 143817 : IF( EQ_16( hStereoDft->NFFT, STEREO_DFT_N_16k_ENC ) )
3784 : {
3785 29960 : conversion_factor = MAX_32 /*2.f*/;
3786 29960 : move32();
3787 : }
3788 113857 : ELSE IF( EQ_16( hStereoDft->NFFT, STEREO_DFT_N_MAX_ENC ) )
3789 : {
3790 51531 : conversion_factor = 715827883 /*2.f / 3*/;
3791 51531 : move32();
3792 : }
3793 : // dItd32 = (int16_t) floorf( conversion_factor * hStereoDft->hItd->deltaItd[k_offset] + 0.5f );
3794 143817 : dItd32 = extract_l( L_shr_r( Mpy_32_32( conversion_factor, hStereoDft->hItd->deltaItd_fx[k_offset] ), Q15 ) ); // Q0
3795 :
3796 143817 : gain_offset = stereo_dft_gain_offset_fx( c, c_e, dItd32 ); // Q31
3797 143817 : pPredGain[b] = L_max( 0, L_sub( pPredGain[b], gain_offset ) );
3798 143817 : move32();
3799 : }
3800 :
3801 : /*Limiter for active speech*/
3802 408836 : test();
3803 408836 : IF( sp_aud_decision0 == 0 && vad_flag )
3804 : {
3805 : /*Avoid jump of residual prediction gain when ITD is changing*/
3806 233493 : IF( NE_32( hStereoDft->hItd->deltaItd_fx[k_offset], hStereoDft->hItd->deltaItd_fx[0] ) )
3807 : {
3808 20728 : pPredGain[b] = L_min( hStereoDft->res_pred_gain_f_fx[b], pPredGain[b] );
3809 20728 : move32();
3810 : }
3811 :
3812 : /*Limiter*/
3813 : // hStereoDft->res_pred_gain_f[b] = 0.9f * hStereoDft->res_pred_gain_f[b] + 0.1f * pPredGain[b];
3814 233493 : hStereoDft->res_pred_gain_f_fx[b] = L_add( Mpy_32_32( 1932735283 /* 0.9f in Q31*/, hStereoDft->res_pred_gain_f_fx[b] ), Mpy_32_32( 214748365 /* 0.1f in Q31*/, pPredGain[b] ) );
3815 233493 : move32();
3816 : // pPredGain[b] = min( 1.1f * hStereoDft->res_pred_gain_f[b], pPredGain[b] );
3817 233493 : pPredGain[b] = L_shl( L_min( Mpy_32_32( 1181116006 /*1.1f in Q30*/, hStereoDft->res_pred_gain_f_fx[b] ), L_shr( pPredGain[b], 1 ) ), 1 );
3818 233493 : move32();
3819 : }
3820 : ELSE
3821 : {
3822 175343 : hStereoDft->res_pred_gain_f_fx[b] = pPredGain[b];
3823 175343 : move32();
3824 : }
3825 : }
3826 : ELSE
3827 : {
3828 139027 : pPredGain[b] = 0;
3829 139027 : move32();
3830 : }
3831 :
3832 :
3833 547863 : IF( EQ_16( b2, hStereoDft->gipd_band_max ) )
3834 : {
3835 59659 : ipd_mean_change = stereo_dft_calc_mean_ipd_change_fx( pIpd, ipd_smooth, hStereoDft->gipd_band_max ); // Q13
3836 : // hStereoDft->sum_dot_prod_real = ( 1.f - hStereoDft->sfm ) * hStereoDft->sum_dot_prod_real + hStereoDft->sfm * sum_dot_prod_real;
3837 59659 : hStereoDft->sum_dot_prod_real_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( L_sub( MAX_32, hStereoDft->sfm_fx ), hStereoDft->sum_dot_prod_real_fx ), hStereoDft->sum_dot_prod_real_fx_e,
3838 : Mpy_32_32( hStereoDft->sfm_fx, sum_dot_prod_real ), sum_dot_prod_real_e, &hStereoDft->sum_dot_prod_real_fx_e );
3839 59659 : move32();
3840 : // hStereoDft->sum_dot_prod_img = ( 1.f - hStereoDft->sfm ) * hStereoDft->sum_dot_prod_img + hStereoDft->sfm * sum_dot_prod_img;
3841 59659 : hStereoDft->sum_dot_prod_img_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( L_sub( MAX_32, hStereoDft->sfm_fx ), hStereoDft->sum_dot_prod_img_fx ), hStereoDft->sum_dot_prod_img_fx_e,
3842 : Mpy_32_32( hStereoDft->sfm_fx, sum_dot_prod_img ), sum_dot_prod_img_e, &hStereoDft->sum_dot_prod_img_fx_e );
3843 59659 : move32();
3844 :
3845 : // pgIpd[0] = (float) atan2f( hStereoDft->sum_dot_prod_img, hStereoDft->sum_dot_prod_real );
3846 59659 : pgIpd[0] = BASOP_util_atan2( hStereoDft->sum_dot_prod_img_fx, hStereoDft->sum_dot_prod_real_fx, sub( hStereoDft->sum_dot_prod_img_fx_e, hStereoDft->sum_dot_prod_real_fx_e ) ); // Q13
3847 59659 : move32();
3848 :
3849 59659 : stereo_dft_gipd_stabilization_fx( &pgIpd[0], hStereoDft->prev_gipd_fx, ipd_mean_change );
3850 59659 : hStereoDft->prev_gipd_fx = pgIpd[0];
3851 59659 : move32();
3852 : }
3853 : }
3854 59659 : hStereoDft->nrg_past_pos = ( pos + 1 ) % STEREO_DFT_NRG_PAST_LEN;
3855 59659 : move16();
3856 :
3857 :
3858 : /*------------------------------------------------------------------*
3859 : * Compute IPDs
3860 : *-----------------------------------------------------------------*/
3861 :
3862 59659 : stereo_dft_enc_get_nipd_flag_fx( hStereoDft, sp_aud_decision0, gain_IPD );
3863 :
3864 59659 : IF( flag_quant )
3865 : {
3866 59659 : IF( hStereoDft->no_ipd_flag == 0 )
3867 : {
3868 6111 : hStereoDft->sid_gipd_fx = *pgIpd;
3869 6111 : move32();
3870 6111 : stereo_dft_quantize_ipd_fx( pgIpd, pgIpd, &( hStereoDft->gipd_index ), STEREO_DFT_GIPD_NBITS );
3871 : }
3872 : ELSE
3873 : {
3874 53548 : pgIpd[0] = 0;
3875 53548 : move32();
3876 : }
3877 : }
3878 59659 : diff_ipd = L_sub( pgIpd[0], pgIpd[-1] );
3879 :
3880 59659 : IF( LT_32( diff_ipd, -EVS_PI_FX ) )
3881 : {
3882 1281 : pgIpd[0] = L_add( pgIpd[0], EVS_2PI_FX );
3883 1281 : move32();
3884 : }
3885 58378 : ELSE IF( GT_32( diff_ipd, EVS_PI_FX ) )
3886 : {
3887 299 : pgIpd[0] = L_sub( pgIpd[0], EVS_2PI_FX );
3888 299 : move32();
3889 : }
3890 :
3891 59659 : IF( !hStereoDft->attackPresent )
3892 : {
3893 57812 : IF( hStereoDft->wasTransient )
3894 : {
3895 : // pgIpd[0] = 0.8f * pgIpd[0] + 0.2f * pgIpd[-1];
3896 1741 : pgIpd[0] = L_add( Mpy_32_32( 1717986918 /*0.8f in Q31*/, pgIpd[0] ), Mpy_32_32( 429496730 /*0.2f in Q31*/, pgIpd[-1] ) );
3897 1741 : move32();
3898 : }
3899 : ELSE
3900 : {
3901 : // pgIpd[0] = 0.5f * pgIpd[0] + 0.5f * pgIpd[-1];
3902 56071 : pgIpd[0] = L_add( L_shr( pgIpd[0], 1 ), L_shr( pgIpd[-1], 1 ) );
3903 56071 : move32();
3904 : }
3905 : }
3906 :
3907 : // c = sqrtf( sum_energy_L / sum_energy_R );
3908 59659 : c = BASOP_Util_Divide3232_Scale_newton( sum_energy_L, sum_energy_R, &c_e );
3909 59659 : c_e = add( c_e, sub( sum_energy_L_e, sum_energy_R_e ) );
3910 59659 : c = Sqrt32( c, &c_e );
3911 :
3912 : // g = fabsf( ( c - 1 ) / ( c + 1 ) );
3913 59659 : L_tmp1 = BASOP_Util_Add_Mant32Exp( c, c_e, MIN_32, 0, &L_tmp1_e );
3914 59659 : L_tmp2 = BASOP_Util_Add_Mant32Exp( c, c_e, MAX_32, 0, &L_tmp2_e );
3915 59659 : g = L_abs( BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp_e ) );
3916 59659 : L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, L_tmp2_e ) );
3917 59659 : g = L_shl_sat( g, L_tmp_e ); // Q31 saturation expected
3918 59659 : IF( GT_32( g, 1717986918 /*0.8f in Q31*/ ) )
3919 : {
3920 : // g = max( 0.f, -10.f * g + 9.0f );
3921 651 : g = L_max( 0, L_sub( 1932735283 /*9.f/10.f in Q31*/, g ) );
3922 651 : W_tmp = W_mult0_32_32( g, 10 );
3923 651 : if ( GT_64( W_tmp, MAX_32 ) )
3924 : {
3925 0 : W_tmp = MAX_32;
3926 0 : move64();
3927 : }
3928 651 : g = W_extract_l( W_tmp ); // Q31
3929 5554 : FOR( b = 0; b < hStereoDft->nbands; b++ )
3930 : {
3931 : // pPredGain[b] *= g;
3932 4903 : pPredGain[b] = Mpy_32_32( pPredGain[b], g );
3933 4903 : move32();
3934 : }
3935 : }
3936 :
3937 59659 : IF( EQ_16( hStereoDft->hConfig->band_res, STEREO_DFT_BAND_RES_LOW ) )
3938 : {
3939 26573 : hStereoDft->reverb_flag = 1;
3940 26573 : move16();
3941 : }
3942 : ELSE
3943 : {
3944 33086 : stereo_dft_enc_get_reverb_flag_fx( hStereoDft, pPredGain, sub_nrg_DMX, sub_nrg_DMX_e, sub_nrg_L, sub_nrg_L_e, sub_nrg_R, sub_nrg_R_e, k_offset, bin_nrgL_fx, bin_nrgL_fx_e, bin_nrgR_fx, bin_nrgR_fx_e );
3945 : }
3946 :
3947 :
3948 : /*------------------------------------------------------------------*
3949 : * Compute Side gains
3950 : *-----------------------------------------------------------------*/
3951 :
3952 607522 : FOR( b = 0; b < hStereoDft->nbands; b++ )
3953 : {
3954 547863 : hStereoDft->sidSideGain_fx[b] = *( pSideGain + b );
3955 547863 : move32();
3956 :
3957 : /* Quantization */
3958 547863 : IF( flag_quant )
3959 : {
3960 547863 : stereo_dft_quantize_res_gains_fx( pSideGain + b, pPredGain + b, pSideGain + b, pPredGain + b, hStereoDft->side_gain_index_EC + b, hStereoDft->res_pred_index_EC + b );
3961 : }
3962 :
3963 :
3964 547863 : IF( !hStereoDft->attackPresent )
3965 : {
3966 531348 : IF( LT_16( b, hStereoDft->res_cod_band_max ) )
3967 : {
3968 : // pSideGain[b] = dft_res_cod_alpha[b] * pSideGain[b] + ( 1 - dft_res_cod_alpha[b] ) * pSideGain[b - STEREO_DFT_BAND_MAX];
3969 98235 : pSideGain[b] = L_add( Mpy_32_16_1( pSideGain[b], dft_res_cod_alpha_fx[b] ), Mpy_32_16_1( pSideGain[b - STEREO_DFT_BAND_MAX], sub( MAX_16, dft_res_cod_alpha_fx[b] ) ) );
3970 98235 : move32();
3971 : }
3972 : }
3973 : }
3974 :
3975 : /*------------------------------------------------------------------*
3976 : * simulate prediction of parameters at the decoder
3977 : *-----------------------------------------------------------------*/
3978 :
3979 59659 : IF( hStereoDft->reverb_flag )
3980 : {
3981 : Word16 ipred, bpred0, bpred1, max_dev, sum_abs_dev;
3982 :
3983 38556 : ipred = 0;
3984 38556 : move16();
3985 38556 : max_dev = 0;
3986 38556 : move16();
3987 38556 : sum_abs_dev = 0;
3988 38556 : move16();
3989 :
3990 : /* parameters for bred0 <= b < bpred1 are estimated from parameters of
3991 : the remaining bands with ptrans0 <= b < btrans1. */
3992 : // bpred1 = ( hStereoDft->nbands > 10 ) ? STEREO_DFT_RES_PRED_BAND_MAX - 2 : hStereoDft->nbands;
3993 38556 : IF( GT_16( hStereoDft->nbands, 10 ) )
3994 : {
3995 9066 : bpred1 = STEREO_DFT_RES_PRED_BAND_MAX - 2;
3996 9066 : move16();
3997 : }
3998 : ELSE
3999 : {
4000 29490 : bpred1 = hStereoDft->nbands;
4001 29490 : move16();
4002 : }
4003 :
4004 38556 : IF( EQ_16( hStereoDft->band_res[k_offset], STEREO_DFT_BAND_RES_LOW ) )
4005 : {
4006 26573 : bpred1 = s_min( bpred1, 6 );
4007 : }
4008 38556 : bpred0 = sub( bpred1, STEREO_DFT_RES_PRED_BAND_MIN_CONST );
4009 :
4010 : /* get estimate (currently the maximal index) */
4011 195916 : FOR( b = hStereoDft->res_pred_band_min; b < bpred0; b++ )
4012 : {
4013 157360 : ipred = s_max( ipred, hStereoDft->res_pred_index_EC[b] );
4014 : }
4015 :
4016 : /* check prediction error */
4017 154224 : FOR( b = bpred0; b < bpred1; b++ )
4018 : {
4019 115668 : max_dev = s_max( max_dev, abs_s( sub( ipred, hStereoDft->res_pred_index_EC[b] ) ) );
4020 115668 : sum_abs_dev = add( sum_abs_dev, abs_s( sub( ipred, hStereoDft->res_pred_index_EC[b] ) ) );
4021 : }
4022 :
4023 38556 : test();
4024 38556 : hStereoDft->reverb_flag = ( LE_16( max_dev, 1 ) && LE_16( sum_abs_dev, 2 ) );
4025 :
4026 38556 : test();
4027 38556 : IF( hStereoDft->reverb_flag && GT_16( hStereoDft->nbands, 10 ) ) /*SWB and FB*/
4028 : {
4029 8763 : FOR( b = STEREO_DFT_RES_PRED_BAND_MAX - 1; b >= STEREO_DFT_RES_PRED_BAND_MAX - 2; b-- )
4030 : {
4031 5842 : hStereoDft->res_pred_index_EC[b - STEREO_DFT_RES_PRED_BAND_MIN_CONST] = hStereoDft->res_pred_index_EC[b];
4032 5842 : move16();
4033 : }
4034 : }
4035 : }
4036 :
4037 59659 : assert( hStereoDft->nbands <= 13 ); /* always use band_limits_erb4 and not band_limits_erb2 */
4038 :
4039 59659 : return;
4040 : }
4041 :
4042 : /*---------------------------------------------------------------------*
4043 : * side_gain_mode_decision()
4044 : *
4045 : *
4046 : *---------------------------------------------------------------------*/
4047 45085 : static void side_gain_mode_decision_fx(
4048 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i : DFT stereo encoder handle */
4049 : Word16 encoded_ind_GR[],
4050 : const Word16 sp_aud_decision0, /* i : Speech/audio decision 0 */
4051 : const Word32 last_core_brate /* i : Last core bitrate */
4052 : )
4053 : {
4054 : Word16 try_diff, nb_diff, no_GR_ord, n_bits, i;
4055 :
4056 45085 : try_diff = sp_aud_decision0;
4057 45085 : move16();
4058 45085 : IF( try_diff )
4059 : {
4060 10806 : IF( EQ_16( hStereoDft->side_gain_counter, STEREO_DFT_FEC_THRESHOLD ) )
4061 : {
4062 345 : try_diff = 0;
4063 345 : move16();
4064 345 : hStereoDft->side_gain_counter = 0;
4065 345 : move16();
4066 : }
4067 : }
4068 : ELSE
4069 : {
4070 34279 : hStereoDft->side_gain_counter = 0;
4071 34279 : move16();
4072 : }
4073 :
4074 : /* If last frame SID/NO_DATA do not use differential coding */
4075 45085 : if ( LE_32( last_core_brate, SID_2k40 ) )
4076 : {
4077 1426 : try_diff = 0;
4078 1426 : move16();
4079 : }
4080 45085 : no_GR_ord = 3;
4081 45085 : move16();
4082 90170 : hStereoDft->side_gain_flag_2 = adapt_GR_ief_fx( hStereoDft->side_gain_index_EC, hStereoDft->side_gain_index_ECDiff, hStereoDft->side_gain_index_ECprevious,
4083 45085 : hStereoDft->nbands, NO_SYMB_GR_SIDE_G, &n_bits, encoded_ind_GR, dft_maps_sg, no_GR_ord, &nb_diff,
4084 45085 : hStereoDft->side_gain_counter, &hStereoDft->side_gain_bitdiff_lp_fx, &hStereoDft->q_side_gain_bitdiff_lp, try_diff );
4085 45085 : move16();
4086 :
4087 471018 : FOR( i = 0; i < hStereoDft->nbands; i++ )
4088 : {
4089 425933 : hStereoDft->side_gain_index_ECprevious[i] = hStereoDft->side_gain_index_EC[i];
4090 425933 : move16();
4091 : }
4092 :
4093 45085 : IF( GT_16( n_bits, sub( imult1616( hStereoDft->nbands, STEREO_DFT_SIDE_GAIN_NBITS ), 1 ) ) )
4094 : {
4095 : /* use fixed rate */
4096 1071 : hStereoDft->side_gain_flag_1 = 3;
4097 1071 : move16();
4098 1071 : hStereoDft->side_gain_counter = 0;
4099 1071 : move16();
4100 : }
4101 : ELSE
4102 : {
4103 44014 : IF( GE_32( hStereoDft->side_gain_flag_2, no_GR_ord ) )
4104 : {
4105 8836 : hStereoDft->side_gain_flag_1 = 2;
4106 8836 : move16();
4107 8836 : hStereoDft->side_gain_counter = add( hStereoDft->side_gain_counter, 1 );
4108 8836 : move16();
4109 : }
4110 : ELSE
4111 : {
4112 35178 : hStereoDft->side_gain_flag_1 = 0;
4113 35178 : move16();
4114 35178 : hStereoDft->side_gain_counter = 0;
4115 35178 : move16();
4116 : }
4117 : }
4118 :
4119 45085 : return;
4120 : }
4121 :
4122 : /*---------------------------------------------------------------------*
4123 : * res_pred_gain_mode_decision()
4124 : *
4125 : *
4126 : *---------------------------------------------------------------------*/
4127 :
4128 45085 : static void res_pred_gain_mode_decision_fx(
4129 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i : DFT stereo encoder handle */
4130 : Word16 encoded_ind_pred_GR[],
4131 : const Word16 k_offset, /* i : Parameter offset */
4132 : const Word32 last_core_brate /* i : Last core bitrate */
4133 : )
4134 : {
4135 : Word16 nb_diff, try_diff, no_GR_ord, i, n_bits;
4136 : Word16 nbands;
4137 :
4138 : /* Residual Prediction Gain */
4139 45085 : IF( hStereoDft->res_pred_mode[k_offset] )
4140 : {
4141 43626 : IF( hStereoDft->attackPresent == 0 )
4142 : {
4143 42026 : nbands = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX );
4144 :
4145 42026 : if ( hStereoDft->reverb_flag )
4146 : {
4147 6808 : nbands = sub( nbands, STEREO_DFT_RES_PRED_BAND_MIN_CONST );
4148 : }
4149 :
4150 42026 : try_diff = 1;
4151 42026 : move16();
4152 42026 : IF( EQ_16( hStereoDft->res_pred_counter, STEREO_DFT_FEC_THRESHOLD ) )
4153 : {
4154 1650 : try_diff = 0;
4155 1650 : move16();
4156 1650 : hStereoDft->res_pred_counter = 0;
4157 1650 : move16();
4158 : }
4159 :
4160 : /* If last frame SID/NO_DATA do not use differential coding */
4161 42026 : IF( LE_32( last_core_brate, SID_2k40 ) )
4162 : {
4163 303 : try_diff = 0;
4164 303 : move16();
4165 : }
4166 :
4167 42026 : no_GR_ord = 2;
4168 42026 : move16();
4169 :
4170 42026 : hStereoDft->res_pred_flag_2 = adapt_GR_rpg1_ief_fx( &hStereoDft->res_pred_index_EC[hStereoDft->res_pred_band_min], &hStereoDft->res_pred_index_ECDiff[hStereoDft->res_pred_band_min], &hStereoDft->res_pred_index_ECprevious[hStereoDft->res_pred_band_min], nbands - hStereoDft->res_pred_band_min, NO_SYMB_GR_PRED_G, &n_bits, encoded_ind_pred_GR, dft_maps_rpg, &nb_diff, no_GR_ord, try_diff );
4171 42026 : move16();
4172 :
4173 416114 : FOR( i = 0; i < nbands; i++ )
4174 : {
4175 374088 : hStereoDft->res_pred_index_ECprevious[i] = hStereoDft->res_pred_index_EC[i];
4176 374088 : move16();
4177 : }
4178 :
4179 70500 : FOR( ; i < hStereoDft->nbands; i++ )
4180 : {
4181 28474 : hStereoDft->res_pred_index_ECprevious[i] = 0;
4182 28474 : move16();
4183 : }
4184 :
4185 42026 : IF( GT_16( n_bits, sub( imult1616( sub( nbands, hStereoDft->res_pred_band_min ), STEREO_DFT_RES_GAINS_BITS ), 1 ) ) )
4186 : {
4187 3367 : hStereoDft->res_pred_flag_1 = 3;
4188 3367 : move16();
4189 3367 : hStereoDft->res_pred_counter = 0;
4190 3367 : move16();
4191 : }
4192 : ELSE
4193 : {
4194 38659 : IF( GT_16( hStereoDft->res_pred_flag_2, 1 ) )
4195 : {
4196 : /* differential coding */
4197 30258 : hStereoDft->res_pred_flag_1 = 2;
4198 30258 : move16();
4199 30258 : hStereoDft->res_pred_counter = add( hStereoDft->res_pred_counter, 1 );
4200 30258 : move16();
4201 : }
4202 : ELSE
4203 : {
4204 8401 : hStereoDft->res_pred_counter = 0;
4205 8401 : move16();
4206 8401 : hStereoDft->res_pred_flag_1 = 0;
4207 8401 : move16();
4208 : }
4209 : }
4210 : }
4211 : ELSE
4212 : {
4213 1600 : set16_fx( hStereoDft->res_pred_index_ECprevious, 0, hStereoDft->nbands );
4214 : }
4215 : }
4216 : ELSE
4217 : {
4218 1459 : set16_fx( hStereoDft->res_pred_index_ECprevious, 0, hStereoDft->nbands );
4219 : }
4220 :
4221 45085 : return;
4222 : }
4223 :
4224 : /*-------------------------------------------------------------------------
4225 : * stereo_dft_calc_mean_bipd()
4226 : *
4227 : * Calculate mean of previous bandwise IPD values
4228 : *------------------------------------------------------------------------*/
4229 : static Word16 ipd_table1[STEREO_DFT_IPD_BUF_LEN] = { 0, 16384, 21845, 24576, 26214 }; //(i / (float)(i + 1))
4230 : static Word16 ipd_table2[STEREO_DFT_IPD_BUF_LEN] = { MAX_16, 16384, 10923, 8192, 6554 }; //(1 / (float)(i + 1))
4231 477272 : static Word32 stereo_dft_calc_mean_bipd_fx(
4232 : Word32 *pIpd, /* i : current bandwise IPD Q13 */
4233 : Word32 ipd_buf[STEREO_DFT_IPD_BUF_LEN] /* i/o: previous bandwise IPDs Q13 */
4234 : )
4235 : {
4236 : Word16 i;
4237 : Word32 ipd_smooth;
4238 : Word32 diff_to_last;
4239 :
4240 477272 : assert( *pIpd <= EVS_PI_FX && *pIpd >= -EVS_PI_FX );
4241 :
4242 477272 : ipd_smooth = 0;
4243 477272 : move16();
4244 2863632 : FOR( i = 0; i < STEREO_DFT_IPD_BUF_LEN; i++ )
4245 : {
4246 2386360 : IF( i == 0 )
4247 : {
4248 477272 : diff_to_last = ipd_buf[0];
4249 477272 : move32();
4250 : }
4251 : ELSE
4252 : {
4253 1909088 : diff_to_last = L_abs( L_sub( ipd_buf[i], ipd_smooth ) );
4254 : }
4255 2386360 : IF( GT_32( diff_to_last, EVS_PI_FX ) )
4256 : {
4257 52573 : IF( ipd_buf[i] > 0 )
4258 : {
4259 30088 : ipd_buf[i] = L_sub( ipd_buf[i], 2 * EVS_PI_FX );
4260 : }
4261 : ELSE
4262 : {
4263 22485 : ipd_buf[i] = L_add( ipd_buf[i], 2 * EVS_PI_FX );
4264 : }
4265 52573 : move32();
4266 : }
4267 : // ipd_smooth = (i / (float)(i + 1)) * ipd_smooth + (1 / (float)(i + 1)) * ipd_buf[i];
4268 2386360 : ipd_smooth = L_add( Mpy_32_16_1( ipd_smooth, ipd_table1[i] ), Mpy_32_16_1( ipd_buf[i], ipd_table2[i] ) ); // Q13
4269 2386360 : IF( LT_32( ipd_smooth, -EVS_PI_FX ) )
4270 : {
4271 18659 : ipd_smooth = L_add( ipd_smooth, 2 * EVS_PI_FX );
4272 : }
4273 2367701 : ELSE IF( GT_32( ipd_smooth, EVS_PI_FX ) )
4274 : {
4275 11079 : ipd_smooth = L_sub( ipd_smooth, 2 * EVS_PI_FX );
4276 : }
4277 : }
4278 :
4279 2386360 : FOR( i = 0; i < STEREO_DFT_IPD_BUF_LEN - 1; i++ )
4280 : {
4281 1909088 : ipd_buf[i] = ipd_buf[i + 1];
4282 1909088 : move32();
4283 : }
4284 477272 : ipd_buf[STEREO_DFT_IPD_BUF_LEN - 1] = *pIpd;
4285 477272 : move32();
4286 :
4287 :
4288 477272 : return ipd_smooth;
4289 : }
4290 :
4291 : /*-------------------------------------------------------------------------
4292 : * stereo_dft_calc_mean_ipd_change()
4293 : *
4294 : * Calculate mean IPD change over all bands
4295 : *------------------------------------------------------------------------*/
4296 59659 : static Word32 stereo_dft_calc_mean_ipd_change_fx(
4297 : Word32 *pIpd, /* i : bandwise IPDs Q13 */
4298 : Word32 *ipd_smooth, /* i : mean of previous bandwise IPDs Q13 */
4299 : Word16 gipd_band_max /* i : number of IPD bands */
4300 : )
4301 : {
4302 : Word16 b;
4303 : Word32 ipd_mean_change; // Q13
4304 : Word16 ipd_mean_change_e;
4305 : Word32 ipd_change[STEREO_DFT_BAND_MAX]; // Q13
4306 :
4307 59659 : ipd_mean_change = 0;
4308 59659 : move32();
4309 536931 : FOR( b = 0; b < gipd_band_max; b++ )
4310 : {
4311 477272 : ipd_change[b] = L_abs( L_sub( pIpd[b], ipd_smooth[b] ) );
4312 477272 : move32();
4313 477272 : IF( GT_32( ipd_change[b], EVS_PI_FX ) )
4314 : {
4315 21563 : ipd_change[b] = L_sub( 2 * EVS_PI_FX, ipd_change[b] );
4316 21563 : move32();
4317 : }
4318 477272 : ipd_mean_change = L_add( ipd_mean_change, ipd_change[b] );
4319 : }
4320 : // ipd_mean_change /= gipd_band_max;
4321 59659 : ipd_mean_change = BASOP_Util_Divide3232_Scale_newton( ipd_mean_change, gipd_band_max, &ipd_mean_change_e );
4322 59659 : ipd_mean_change_e = add( ipd_mean_change_e, 18 - 31 );
4323 59659 : ipd_mean_change = L_shr( ipd_mean_change, sub( 18, ipd_mean_change_e ) ); // Q13
4324 :
4325 59659 : return ipd_mean_change;
4326 : }
4327 :
4328 : /*-------------------------------------------------------------------------
4329 : * stereo_dft_gipd_stabilization()
4330 : *
4331 : * stabilize global IPD based on stability of bandwise IPDs
4332 : *------------------------------------------------------------------------*/
4333 59659 : static void stereo_dft_gipd_stabilization_fx(
4334 : Word32 *pgIpd, /* i/o: global IPD to be stabilized Q13 */
4335 : Word32 prev_gipd, /* i : previous global IPD Q13 */
4336 : Word32 ipd_mean_change /* i : mean of previous bandwise IPDs Q13 */
4337 : )
4338 : {
4339 : Word32 diff_gipd;
4340 :
4341 59659 : IF( LT_32( ipd_mean_change, 2458 /*0.3f in Q13*/ ) )
4342 : {
4343 26282 : *pgIpd = prev_gipd;
4344 26282 : move32();
4345 : }
4346 : ELSE
4347 : {
4348 33377 : diff_gipd = L_abs( L_sub( *pgIpd, prev_gipd ) );
4349 33377 : if ( GT_32( diff_gipd, EVS_PI_FX ) )
4350 : {
4351 1275 : diff_gipd = L_sub( 2 * EVS_PI_FX, diff_gipd );
4352 : }
4353 33377 : IF( GT_32( diff_gipd, ipd_mean_change ) )
4354 : {
4355 5519 : IF( GT_32( *pgIpd, prev_gipd ) )
4356 : {
4357 2595 : IF( LT_32( L_sub( *pgIpd, prev_gipd ), EVS_PI_FX ) )
4358 : {
4359 2206 : *pgIpd = L_add( prev_gipd, ipd_mean_change );
4360 2206 : move32();
4361 : }
4362 : ELSE
4363 : {
4364 389 : *pgIpd = L_sub( prev_gipd, ipd_mean_change );
4365 389 : move32();
4366 389 : if ( LT_32( *pgIpd, -EVS_PI_FX ) )
4367 : {
4368 154 : *pgIpd = L_add( *pgIpd, 2 * EVS_PI_FX );
4369 154 : move32();
4370 : }
4371 : }
4372 : }
4373 : ELSE
4374 : {
4375 2924 : IF( LT_32( L_sub( prev_gipd, *pgIpd ), EVS_PI_FX ) )
4376 : {
4377 2302 : *pgIpd = L_sub( prev_gipd, ipd_mean_change );
4378 2302 : move32();
4379 : }
4380 : ELSE
4381 : {
4382 622 : *pgIpd = L_add( prev_gipd, ipd_mean_change );
4383 622 : move32();
4384 622 : if ( GT_32( *pgIpd, EVS_PI_FX ) )
4385 : {
4386 275 : *pgIpd = L_sub( *pgIpd, 2 * EVS_PI_FX );
4387 275 : move32();
4388 : }
4389 : }
4390 : }
4391 : }
4392 : }
4393 59659 : return;
4394 : }
4395 :
4396 : /*-------------------------------------------------------------------------
4397 : * stereo_dft_enc_get_nipd_flag()
4398 : *
4399 : *
4400 : *------------------------------------------------------------------------*/
4401 59659 : static void stereo_dft_enc_get_nipd_flag_fx(
4402 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
4403 : const Word16 sp_aud_decision0,
4404 : const Word32 gainIPD )
4405 : {
4406 : // hStereoDft->gainIPD_sm = 0.5f * hStereoDft->gainIPD_sm + 0.5f * gainIPD; /* to decide on use of no IPD */
4407 59659 : hStereoDft->gainIPD_sm_fx = L_add( L_shr( hStereoDft->gainIPD_sm_fx, 1 ), L_shr( gainIPD, 1 ) ); /* to decide on use of no IPD */
4408 59659 : move32();
4409 :
4410 59659 : hStereoDft->no_ipd_flag = 0; /* Set flag initially to zero - subband IPD */
4411 59659 : move16();
4412 :
4413 : // if (hStereoDft->gainIPD_sm >= 0.75f || (hStereoDft->prev_no_ipd_flag && (sp_aud_decision0 || hStereoDft->voicing_lt > 0.98f)))
4414 59659 : test();
4415 59659 : test();
4416 59659 : test();
4417 59659 : if ( GE_32( hStereoDft->gainIPD_sm_fx, 1610612736 /*0.75f in Q31*/ ) || ( hStereoDft->prev_no_ipd_flag && ( sp_aud_decision0 || GT_32( hStereoDft->voicing_lt_fx, 2104533975 /*0.98f in Q31*/ ) ) ) )
4418 : {
4419 51848 : hStereoDft->no_ipd_flag = 1; /* Set the flag */
4420 51848 : move16();
4421 : }
4422 :
4423 :
4424 : /* hangover between the group IPD and subband IPD */
4425 59659 : test();
4426 59659 : IF( NE_16( hStereoDft->prev_no_ipd_flag, hStereoDft->no_ipd_flag ) && LT_16( hStereoDft->no_ipd_cnt, 5 ) )
4427 : {
4428 6854 : hStereoDft->no_ipd_flag = hStereoDft->prev_no_ipd_flag;
4429 6854 : move16();
4430 6854 : hStereoDft->no_ipd_cnt = add( hStereoDft->no_ipd_cnt, 1 );
4431 6854 : move16();
4432 : }
4433 : ELSE
4434 : {
4435 52805 : hStereoDft->no_ipd_cnt = 0;
4436 52805 : move16();
4437 : }
4438 :
4439 59659 : hStereoDft->prev_no_ipd_flag = hStereoDft->no_ipd_flag; /* Save the no IPD flag for the next frame */
4440 59659 : move16();
4441 :
4442 59659 : return;
4443 : }
4444 :
4445 : /*---------------------------------------------------------------
4446 : * stereo_dft_enc_get_reverb_flag()
4447 : *
4448 : *
4449 : * ---------------------------------------------------------------*/
4450 33086 : static void stereo_dft_enc_get_reverb_flag_fx(
4451 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft,
4452 : Word32 *pPredGain, // Q31
4453 : Word32 *sub_nrg_DMX, // Q(31-sub_nrg_DMX_e)
4454 : Word16 *sub_nrg_DMX_e,
4455 : const Word32 *sub_nrg_L, // Q(31-sub_nrg_L_e[])
4456 : const Word16 *sub_nrg_L_e,
4457 : const Word32 *sub_nrg_R, // Q(31-sub_nrg_R_e[])
4458 : const Word16 *sub_nrg_R_e,
4459 : const Word16 k_offset,
4460 : const Word32 *bin_nrgL, // Q(31-bin_nrgL_e[])
4461 : const Word16 *bin_nrgL_e,
4462 : const Word32 *bin_nrgR, // Q(31-bin_nrgR_e[])
4463 : const Word16 *bin_nrgR_e )
4464 : {
4465 : Word16 i, b, b1, index_min, nbands;
4466 : Word32 nrg_DMX_min;
4467 : Word16 nrg_DMX_min_e;
4468 : Word32 norm_r, norm_l, norm_dmx;
4469 : Word16 norm_r_e, norm_l_e, norm_dmx_e;
4470 : Word32 diff_l_l, diff_r_l, diff_l_h, diff_r_h;
4471 : Word16 diff_l_l_e, diff_r_l_e, diff_l_h_e, diff_r_h_e;
4472 : Word32 ener_l, ener_r, ener_dmx;
4473 : Word16 ener_l_e, ener_r_e, ener_dmx_e;
4474 : Word32 nrg_DMX_max_avrg, nrg_DMX_min_avrg;
4475 : Word16 nrg_DMX_max_avrg_e, nrg_DMX_min_avrg_e;
4476 : Word32 fac;
4477 : Word32 L_tmp;
4478 : Word16 L_tmp_e;
4479 :
4480 33086 : hStereoDft->reverb_flag = 0;
4481 33086 : move16();
4482 33086 : test();
4483 33086 : IF( hStereoDft->res_pred_mode[k_offset] && EQ_16( hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) )
4484 : {
4485 12824 : diff_r_l = EPSILON_FX_M;
4486 12824 : move32();
4487 12824 : diff_r_l_e = EPSILON_FX_E;
4488 12824 : move16();
4489 12824 : diff_l_l = EPSILON_FX_M;
4490 12824 : move32();
4491 12824 : diff_l_l_e = EPSILON_FX_E;
4492 12824 : move16();
4493 12824 : diff_r_h = EPSILON_FX_M;
4494 12824 : move32();
4495 12824 : diff_r_h_e = EPSILON_FX_E;
4496 12824 : move16();
4497 12824 : diff_l_h = EPSILON_FX_M;
4498 12824 : move32();
4499 12824 : diff_l_h_e = EPSILON_FX_E;
4500 12824 : move16();
4501 :
4502 102592 : FOR( b = 0; b <= s_min( hStereoDft->nbands, 6 ); b++ ) /* choose the subbands used for stereo filling */
4503 : {
4504 : // norm_dmx = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_DMX[b]);
4505 89768 : norm_dmx = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_DMX[b], &norm_dmx_e );
4506 89768 : norm_dmx_e = add( norm_dmx_e, sub( 31, sub_nrg_DMX_e[b] ) );
4507 : // norm_l = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_L[b]);
4508 89768 : norm_l = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_L[b], &norm_l_e );
4509 89768 : norm_l_e = add( norm_l_e, sub( 31, sub_nrg_L_e[b] ) );
4510 : // norm_r = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_R[b]);
4511 89768 : norm_r = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_R[b], &norm_r_e );
4512 89768 : norm_r_e = add( norm_r_e, sub( 31, sub_nrg_R_e[b] ) );
4513 :
4514 1231104 : FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) /* normalization on each subbands */
4515 : {
4516 1141336 : ener_l = bin_nrgL[i];
4517 1141336 : move32();
4518 1141336 : ener_l_e = bin_nrgL_e[i];
4519 1141336 : move16();
4520 1141336 : ener_r = bin_nrgR[i];
4521 1141336 : move32();
4522 1141336 : ener_r_e = bin_nrgR_e[i];
4523 1141336 : move16();
4524 : // ener_dmx = (ener_l + ener_r + 2 * sqrtf(ener_l * ener_r)) * norm_dmx; /*approximation of nrg of DMX per line*/
4525 1141336 : L_tmp = Mpy_32_32( ener_l, ener_r );
4526 1141336 : L_tmp_e = add( ener_l_e, ener_r_e );
4527 1141336 : L_tmp = Sqrt32( L_tmp, &L_tmp_e );
4528 1141336 : L_tmp = Mpy_32_32( L_tmp, norm_dmx );
4529 1141336 : L_tmp_e = add( add( L_tmp_e, norm_dmx_e ), 1 );
4530 1141336 : L_tmp = BASOP_Util_Add_Mant32Exp( ener_l, ener_l_e, L_tmp, L_tmp_e, &L_tmp_e );
4531 1141336 : L_tmp = BASOP_Util_Add_Mant32Exp( ener_r, ener_r_e, L_tmp, L_tmp_e, &L_tmp_e );
4532 1141336 : ener_dmx = L_tmp;
4533 1141336 : move32();
4534 1141336 : ener_dmx_e = L_tmp_e;
4535 1141336 : move16();
4536 :
4537 : // ener_l *= norm_l;
4538 1141336 : ener_l = Mpy_32_32( ener_l, norm_l );
4539 1141336 : ener_l_e = add( ener_l_e, norm_l_e );
4540 : // ener_r *= norm_r;
4541 1141336 : ener_r = Mpy_32_32( ener_r, norm_r );
4542 1141336 : ener_r_e = add( ener_r_e, norm_r_e );
4543 :
4544 : // diff_l_l += fabsf(ener_l - ener_dmx);
4545 1141336 : L_tmp = L_abs( BASOP_Util_Add_Mant32Exp( ener_l, ener_l_e, L_negate( ener_dmx ), ener_dmx_e, &L_tmp_e ) );
4546 1141336 : diff_l_l = BASOP_Util_Add_Mant32Exp( diff_l_l, diff_l_l_e, L_tmp, L_tmp_e, &diff_l_l_e );
4547 : // diff_r_l += fabsf(ener_r - ener_dmx);
4548 1141336 : L_tmp = L_abs( BASOP_Util_Add_Mant32Exp( ener_r, ener_r_e, L_negate( ener_dmx ), ener_dmx_e, &L_tmp_e ) );
4549 1141336 : diff_r_l = BASOP_Util_Add_Mant32Exp( diff_r_l, diff_r_l_e, L_tmp, L_tmp_e, &diff_r_l_e );
4550 : }
4551 : }
4552 12824 : IF( LE_16( hStereoDft->nbands, 10 ) )
4553 : {
4554 11668 : FOR( ; b < s_min( hStereoDft->nbands, 10 ); b++ ) /* choose the subbands used for stereo filling */
4555 : {
4556 : // norm_dmx = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_DMX[b]);
4557 8751 : norm_dmx = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_DMX[b], &norm_dmx_e );
4558 8751 : norm_dmx_e = add( norm_dmx_e, sub( 31, sub_nrg_DMX_e[b] ) );
4559 : // norm_l = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_L[b]);
4560 8751 : norm_l = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_L[b], &norm_l_e );
4561 8751 : norm_l_e = add( norm_l_e, sub( 31, sub_nrg_L_e[b] ) );
4562 : // norm_r = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_R[b]);
4563 8751 : norm_r = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_R[b], &norm_r_e );
4564 8751 : norm_r_e = add( norm_r_e, sub( 31, sub_nrg_R_e[b] ) );
4565 :
4566 679661 : FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) /* normalization on each subbands */
4567 : {
4568 670910 : ener_l = bin_nrgL[i];
4569 670910 : move32();
4570 670910 : ener_l_e = bin_nrgL_e[i];
4571 670910 : move16();
4572 670910 : ener_r = bin_nrgR[i];
4573 670910 : move32();
4574 670910 : ener_r_e = bin_nrgR_e[i];
4575 670910 : move16();
4576 : // ener_dmx = (ener_l + ener_r + 2 * sqrtf(ener_l * ener_r)) * norm_dmx; /*approximation of nrg of DMX per line*/
4577 670910 : L_tmp = Mpy_32_32( ener_l, ener_r );
4578 670910 : L_tmp_e = add( ener_l_e, ener_r_e );
4579 670910 : L_tmp = Sqrt32( L_tmp, &L_tmp_e );
4580 670910 : L_tmp = Mpy_32_32( L_tmp, norm_dmx );
4581 670910 : L_tmp_e = add( add( L_tmp_e, norm_dmx_e ), 1 );
4582 670910 : L_tmp = BASOP_Util_Add_Mant32Exp( ener_l, ener_l_e, L_tmp, L_tmp_e, &L_tmp_e );
4583 670910 : L_tmp = BASOP_Util_Add_Mant32Exp( ener_r, ener_r_e, L_tmp, L_tmp_e, &L_tmp_e );
4584 670910 : ener_dmx = L_tmp;
4585 670910 : move32();
4586 670910 : ener_dmx_e = L_tmp_e;
4587 670910 : move16();
4588 :
4589 : // ener_l *= norm_l;
4590 670910 : ener_l = Mpy_32_32( ener_l, norm_l );
4591 670910 : ener_l_e = add( ener_l_e, norm_l_e );
4592 : // ener_r *= norm_r;
4593 670910 : ener_r = Mpy_32_32( ener_r, norm_r );
4594 670910 : ener_r_e = add( ener_r_e, norm_r_e );
4595 :
4596 : // diff_l_h += fabsf(ener_l - ener_dmx);
4597 670910 : L_tmp = L_abs( BASOP_Util_Add_Mant32Exp( ener_l, ener_l_e, L_negate( ener_dmx ), ener_dmx_e, &L_tmp_e ) );
4598 670910 : diff_l_h = BASOP_Util_Add_Mant32Exp( diff_l_h, diff_l_h_e, L_tmp, L_tmp_e, &diff_l_h_e );
4599 : // diff_r_h += fabsf(ener_r - ener_dmx);
4600 670910 : L_tmp = L_abs( BASOP_Util_Add_Mant32Exp( ener_r, ener_r_e, L_negate( ener_dmx ), ener_dmx_e, &L_tmp_e ) );
4601 670910 : diff_r_h = BASOP_Util_Add_Mant32Exp( diff_r_h, diff_r_h_e, L_tmp, L_tmp_e, &diff_r_h_e );
4602 : }
4603 : }
4604 : }
4605 :
4606 161836 : FOR( b = 0; b < hStereoDft->nbands; b++ ) /* choose the subbands used for stereo filling */
4607 : {
4608 : // sub_nrg_DMX[b] /= (hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]);
4609 149012 : sub_nrg_DMX[b] = BASOP_Util_Divide3232_Scale_newton( sub_nrg_DMX[b], sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), &L_tmp_e );
4610 149012 : move32();
4611 149012 : sub_nrg_DMX_e[b] = add( L_tmp_e, sub( sub_nrg_DMX_e[b], 31 ) );
4612 149012 : move16();
4613 : // sub_nrg_DMX[b] = 0.6f * hStereoDft->pre_sub_nrg_DMX[b] + 0.4f * sub_nrg_DMX[b];
4614 149012 : sub_nrg_DMX[b] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( 1288490189 /*0.6f*/, hStereoDft->pre_sub_nrg_DMX_fx[b] ), hStereoDft->pre_sub_nrg_DMX_fx_e[b], Mpy_32_32( 858993459 /*0.4f*/, sub_nrg_DMX[b] ), sub_nrg_DMX_e[b], &sub_nrg_DMX_e[b] );
4615 149012 : move32();
4616 149012 : hStereoDft->pre_sub_nrg_DMX_fx[b] = sub_nrg_DMX[b];
4617 149012 : move32();
4618 149012 : hStereoDft->pre_sub_nrg_DMX_fx_e[b] = sub_nrg_DMX_e[b];
4619 149012 : move16();
4620 : }
4621 :
4622 : /* adaptively select the subbands to predict based on the energy */
4623 : // nbands = (hStereoDft->nbands > 10) ? (hStereoDft->nbands - 2) : hStereoDft->nbands;
4624 12824 : IF( GT_16( hStereoDft->nbands, 10 ) )
4625 : {
4626 9907 : nbands = sub( hStereoDft->nbands, 2 );
4627 : }
4628 : ELSE
4629 : {
4630 2917 : nbands = hStereoDft->nbands;
4631 2917 : move16();
4632 : }
4633 :
4634 12824 : nrg_DMX_min_avrg = 0;
4635 12824 : move32();
4636 12824 : nrg_DMX_min_avrg_e = 0;
4637 12824 : move16();
4638 25648 : FOR( b = 2; b < STEREO_DFT_RES_PRED_BAND_MIN_RED; b++ )
4639 : {
4640 12824 : nrg_DMX_min = sub_nrg_DMX[b];
4641 12824 : move32();
4642 12824 : nrg_DMX_min_e = sub_nrg_DMX_e[b];
4643 12824 : move16();
4644 12824 : index_min = b;
4645 12824 : move16();
4646 :
4647 116374 : FOR( b1 = 2; b1 < nbands; b1++ )
4648 : {
4649 : // if (nrg_DMX_min > sub_nrg_DMX[b1])
4650 103550 : IF( BASOP_Util_Cmp_Mant32Exp( nrg_DMX_min, nrg_DMX_min_e, sub_nrg_DMX[b1], sub_nrg_DMX_e[b1] ) > 0 )
4651 : {
4652 72459 : nrg_DMX_min = sub_nrg_DMX[b1];
4653 72459 : move32();
4654 72459 : nrg_DMX_min_e = sub_nrg_DMX_e[b1];
4655 72459 : move16();
4656 72459 : index_min = b1;
4657 72459 : move16();
4658 : }
4659 : }
4660 :
4661 : // nrg_DMX_min_avrg += nrg_DMX_min;
4662 12824 : nrg_DMX_min_avrg = BASOP_Util_Add_Mant32Exp( nrg_DMX_min_avrg, nrg_DMX_min_avrg_e, nrg_DMX_min, nrg_DMX_min_e, &nrg_DMX_min_avrg_e );
4663 : // sub_nrg_DMX[index_min] = FLT_MAX;
4664 12824 : sub_nrg_DMX[index_min] = MAX_32;
4665 12824 : move32();
4666 12824 : sub_nrg_DMX_e[index_min] = 128;
4667 12824 : move16();
4668 : }
4669 :
4670 12824 : nrg_DMX_max_avrg = 0;
4671 12824 : move32();
4672 12824 : nrg_DMX_max_avrg_e = 0;
4673 12824 : move16();
4674 116374 : FOR( ( b = 2, b1 = STEREO_DFT_RES_PRED_BAND_MIN_RED ); b < nbands; b++ )
4675 : {
4676 : // if (sub_nrg_DMX[b] != FLT_MAX)
4677 103550 : IF( BASOP_Util_Cmp_Mant32Exp( sub_nrg_DMX[b], sub_nrg_DMX_e[b], MAX_32, 128 ) != 0 )
4678 : {
4679 : // nrg_DMX_max_avrg += sub_nrg_DMX[b];
4680 90726 : nrg_DMX_max_avrg = BASOP_Util_Add_Mant32Exp( nrg_DMX_max_avrg, nrg_DMX_max_avrg_e, sub_nrg_DMX[b], sub_nrg_DMX_e[b], &nrg_DMX_max_avrg_e );
4681 : }
4682 : }
4683 :
4684 12824 : IF( LE_16( hStereoDft->nbands, 10 ) ) /*WB*/
4685 : {
4686 2917 : test();
4687 2917 : IF( EQ_16( hStereoDft->res_pred_mode[0], STEREO_DFT_RESPRED_OFF ) || NE_16( hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) )
4688 : {
4689 712 : hStereoDft->diff_l_h_sm_fx = diff_l_h;
4690 712 : move32();
4691 712 : hStereoDft->diff_l_h_sm_fx_e = diff_l_h_e;
4692 712 : move16();
4693 712 : hStereoDft->diff_r_h_sm_fx = diff_r_h;
4694 712 : move32();
4695 712 : hStereoDft->diff_r_h_sm_fx_e = diff_r_h_e;
4696 712 : move16();
4697 : }
4698 : ELSE
4699 : {
4700 : // hStereoDft->diff_l_h_sm = 0.9f * hStereoDft->diff_l_h_sm + 0.1f * diff_l_h;
4701 2205 : hStereoDft->diff_l_h_sm_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( 1932735283 /*0.9f*/, hStereoDft->diff_l_h_sm_fx ), hStereoDft->diff_l_h_sm_fx_e, Mpy_32_32( 214748365 /*0.1f*/, diff_l_h ), diff_l_h_e, &hStereoDft->diff_l_h_sm_fx_e );
4702 2205 : move32();
4703 : // hStereoDft->diff_r_h_sm = 0.9f * hStereoDft->diff_r_h_sm + 0.1f * diff_r_h;
4704 2205 : hStereoDft->diff_r_h_sm_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( 1932735283 /*0.9f*/, hStereoDft->diff_r_h_sm_fx ), hStereoDft->diff_r_h_sm_fx_e, Mpy_32_32( 214748365 /*0.1f*/, diff_r_h ), diff_r_h_e, &hStereoDft->diff_r_h_sm_fx_e );
4705 2205 : move32();
4706 : }
4707 :
4708 : // if (hStereoDft->diff_l_h_sm > 120.0f || hStereoDft->diff_r_h_sm > 120.0f)
4709 2917 : test();
4710 2917 : if ( BASOP_Util_Cmp_Mant32Exp( hStereoDft->diff_l_h_sm_fx, hStereoDft->diff_l_h_sm_fx_e, 120, 31 ) > 0 || BASOP_Util_Cmp_Mant32Exp( hStereoDft->diff_r_h_sm_fx, hStereoDft->diff_r_h_sm_fx_e, 120, 31 ) > 0 )
4711 : {
4712 2917 : hStereoDft->reverb_flag = 1;
4713 2917 : move16();
4714 : }
4715 : }
4716 : ELSE /*SWB/FB*/
4717 : {
4718 : // if (3 * nrg_DMX_max_avrg > 64 * 5 * nrg_DMX_min_avrg)
4719 9907 : if ( BASOP_Util_Cmp_Mant32Exp( Mpy_32_32( 1288490189 /*3/5 in Q31*/, nrg_DMX_max_avrg ), nrg_DMX_max_avrg_e, nrg_DMX_min_avrg, add( nrg_DMX_min_avrg_e, 6 /* * 64 */ ) ) > 0 )
4720 : {
4721 9066 : hStereoDft->reverb_flag = 1;
4722 9066 : move16();
4723 : }
4724 : }
4725 :
4726 : /*Stereo Filling gain damping*/
4727 : // fac = ((diff_l_l > diff_r_l) ? diff_r_l / diff_l_l : diff_l_l / diff_r_l);
4728 12824 : IF( BASOP_Util_Cmp_Mant32Exp( diff_l_l, diff_l_l_e, diff_r_l, diff_r_l_e ) > 0 )
4729 : {
4730 1765 : fac = BASOP_Util_Divide3232_Scale_newton( diff_r_l, diff_l_l, &L_tmp_e );
4731 1765 : L_tmp_e = add( L_tmp_e, sub( diff_r_l_e, diff_l_l_e ) );
4732 : }
4733 : ELSE
4734 : {
4735 11059 : fac = BASOP_Util_Divide3232_Scale_newton( diff_l_l, diff_r_l, &L_tmp_e );
4736 11059 : L_tmp_e = add( L_tmp_e, sub( diff_l_l_e, diff_r_l_e ) );
4737 : }
4738 12824 : fac = L_shl_sat( fac, L_tmp_e ); // Q31
4739 : // fac = fac > 0.25f ? 1.0f : 4.f * fac;
4740 12824 : fac = L_shl_sat( fac, 2 );
4741 : // fac = 0.98f * hStereoDft->prev_fac2 + 0.02f * fac;
4742 12824 : fac = L_add( Mpy_32_32( 2104533975 /*0.98f*/, hStereoDft->prev_fac2_fx ), Mpy_32_32( 42949673 /*0.02f*/, fac ) );
4743 12824 : hStereoDft->prev_fac2_fx = fac;
4744 12824 : move32();
4745 :
4746 161836 : FOR( b = 0; b < hStereoDft->nbands; b++ )
4747 : {
4748 149012 : IF( LT_16( b, 5 ) )
4749 : {
4750 : // pPredGain[b] *= max(0.5f, fac);
4751 64120 : pPredGain[b] = Mpy_32_32( pPredGain[b], L_max( ONE_IN_Q30, fac ) );
4752 64120 : move32();
4753 : }
4754 : ELSE
4755 : {
4756 : // pPredGain[b] *= min(1.0f, max(0.75f, 0.5f + fac));
4757 84892 : pPredGain[b] = Mpy_32_32( pPredGain[b], L_max( 1610612736 /*0.75f*/, L_add_sat( ONE_IN_Q30, fac ) ) );
4758 84892 : move32();
4759 : }
4760 : }
4761 : }
4762 :
4763 :
4764 33086 : return;
4765 : }
4766 : /*---------------------------------------------------------------
4767 : * stereo_dft_gain_offset()
4768 : *
4769 : * c = gain between L and R, itd = itd in samples @ 32kHz
4770 : * ---------------------------------------------------------------*/
4771 143817 : static Word32 stereo_dft_gain_offset_fx(
4772 : const Word32 c, // Q(31-c_e)
4773 : const Word16 c_e,
4774 : const Word16 itd )
4775 : {
4776 : Word32 wnt, go, alpha;
4777 : Word16 alpha_e;
4778 : Word16 tau, k0;
4779 : Word32 L_tmp, L_tmp1, L_tmp2;
4780 : Word16 L_tmp_e, L_tmp1_e, L_tmp2_e;
4781 :
4782 143817 : tau = s_min( abs_s( itd ), 160 ); // Q0
4783 : /* Wn_table contains every 8th sample of the window's cross-correlation
4784 : * function @ 32kHz from which the values are interpolated: */
4785 143817 : k0 = shr( tau, 3 );
4786 : // alpha = s_and(tau, 7) / 8.f;
4787 143817 : alpha = BASOP_Util_Divide3232_Scale_newton( s_and( tau, 7 ), 8, &alpha_e );
4788 143817 : alpha = L_shl( alpha, alpha_e ); // Q31
4789 : // wnt = (1 - alpha) * Wn_table[k0] + alpha * Wn_table[k0 + 1];
4790 143817 : wnt = L_add( Mpy_32_32( L_sub( MAX_32, alpha ), Wn_table_fx[k0] ), Mpy_32_32( alpha, Wn_table_fx[k0 + 1] ) ); // Q31
4791 :
4792 : // go = sqrtf(8 * c * c / ((1 + c) * (1 + c)) * (1 - wnt) / (1 + c * c + 2 * c * wnt));
4793 143817 : L_tmp = Mpy_32_32( c, c );
4794 143817 : L_tmp_e = shl( c_e, 1 );
4795 143817 : L_tmp1 = BASOP_Util_Add_Mant32Exp( MAX_32, 0, c, c_e, &L_tmp1_e );
4796 143817 : L_tmp1 = Mpy_32_32( L_tmp1, L_tmp1 );
4797 143817 : L_tmp1_e = shl( L_tmp1_e, 1 );
4798 143817 : L_tmp2 = BASOP_Util_Divide3232_Scale_newton( L_tmp, L_tmp1, &L_tmp2_e );
4799 143817 : L_tmp2_e = add( add( L_tmp2_e, sub( L_tmp_e, L_tmp1_e ) ), 3 /*multiply by 8*/ );
4800 143817 : L_tmp2 = Mpy_32_32( L_tmp2, L_sub( MAX_32, wnt ) );
4801 143817 : L_tmp1 = BASOP_Util_Add_Mant32Exp( MAX_32, 0, L_tmp, L_tmp_e, &L_tmp1_e );
4802 143817 : L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, Mpy_32_32( c, wnt ), add( c_e, 1 ), &L_tmp1_e );
4803 143817 : L_tmp = BASOP_Util_Divide3232_Scale_newton( L_tmp2, L_tmp1, &L_tmp_e );
4804 143817 : L_tmp_e = add( L_tmp_e, sub( L_tmp2_e, L_tmp1_e ) );
4805 143817 : L_tmp = Sqrt32( L_tmp, &L_tmp_e );
4806 143817 : go = L_shl( L_tmp, L_tmp_e );
4807 :
4808 143817 : return go;
4809 : }
4810 :
4811 : /*---------------------------------------------------------------
4812 : * stereo_dft_enc_calculate_nrg_for_icbwe()
4813 : *
4814 : * calculate energy of downmix and left and right channel in the
4815 : * SHB region for later use in ICBWE
4816 : * ---------------------------------------------------------------*/
4817 48116 : static void stereo_dft_enc_calculate_nrg_for_icbwe_fx(
4818 : STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle */
4819 : const Word16 *DFT_L_e,
4820 : const Word16 *DFT_R_e,
4821 : const Word32 *DMX, /* i : DFT Stereo downmix Q(31-DMX_e[]) */
4822 : const Word16 *DMX_e, /* i : DFT Stereo downmix */
4823 : const Word32 input_Fs /* i : input sampling rate */
4824 : )
4825 : {
4826 : Word32 *pDFT_L, *pDFT_R, bandResDft;
4827 : Word16 bandResDft_e;
4828 : Word16 i, shbBins[3];
4829 : Word16 tmp_e;
4830 : Word32 tmp;
4831 :
4832 : // bandResDft = ( (float) input_Fs ) / hStereoDft->NFFT;
4833 48116 : bandResDft = BASOP_Util_Divide3232_Scale_newton( input_Fs, hStereoDft->NFFT, &bandResDft_e );
4834 : // shbBins[0] = (int16_t) ( 6400 / bandResDft );
4835 48116 : shbBins[0] = BASOP_Util_Divide3232_Scale( 6400, bandResDft, &tmp_e );
4836 48116 : move16();
4837 48116 : tmp_e = add( tmp_e, sub( 31, bandResDft_e ) );
4838 48116 : shbBins[0] = shr( shbBins[0], sub( 15, tmp_e ) ); // Q0
4839 48116 : move16();
4840 :
4841 : // shbBins[1] = (int16_t) ( 10400 / bandResDft );
4842 48116 : shbBins[1] = BASOP_Util_Divide3232_Scale( 10400, bandResDft, &tmp_e );
4843 48116 : move16();
4844 48116 : tmp_e = add( tmp_e, sub( 31, bandResDft_e ) );
4845 48116 : shbBins[1] = shr( shbBins[1], sub( 15, tmp_e ) ); // Q0
4846 48116 : move16();
4847 :
4848 : // shbBins[2] = (int16_t) ( 14400 / bandResDft );
4849 48116 : shbBins[2] = BASOP_Util_Divide3232_Scale( 14400, bandResDft, &tmp_e );
4850 48116 : move16();
4851 48116 : tmp_e = add( tmp_e, sub( 31, bandResDft_e ) );
4852 48116 : shbBins[2] = shr( shbBins[2], sub( 15, tmp_e ) ); // Q0
4853 48116 : move16();
4854 :
4855 48116 : assert( shbBins[1] <= hStereoDft->NFFT / 2 );
4856 :
4857 48116 : set32_fx( hStereoDft->nrg_L_fx, EPSILON_FX_M, 2 );
4858 48116 : set16_fx( hStereoDft->nrg_L_fx_e, EPSILON_FX_E, 2 );
4859 48116 : set32_fx( hStereoDft->nrg_R_fx, EPSILON_FX_M, 2 );
4860 48116 : set16_fx( hStereoDft->nrg_R_fx_e, EPSILON_FX_E, 2 );
4861 48116 : set32_fx( hStereoDft->nrg_DMX_fx, EPSILON_FX_M, 2 );
4862 48116 : set16_fx( hStereoDft->nrg_DMX_fx_e, EPSILON_FX_E, 2 );
4863 :
4864 48116 : pDFT_L = hStereoDft->DFT_fx[0]; // Q(31-DFT_L_e[])
4865 48116 : pDFT_R = hStereoDft->DFT_fx[1]; // Q(31-DFT_R_e[])
4866 :
4867 7746676 : FOR( i = shbBins[0]; i < shbBins[1]; i++ )
4868 : {
4869 : // hStereoDft->nrg_L[0] += pDFT_L[2 * i] * pDFT_L[2 * i] + pDFT_L[2 * i + 1] * pDFT_L[2 * i + 1];
4870 7698560 : tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L[2 * i], pDFT_L[2 * i] ), shl( DFT_L_e[2 * i], 1 ), Mpy_32_32( pDFT_L[2 * i + 1], pDFT_L[2 * i + 1] ), shl( DFT_L_e[2 * i + 1], 1 ), &tmp_e );
4871 7698560 : hStereoDft->nrg_L_fx[0] = BASOP_Util_Add_Mant32Exp( hStereoDft->nrg_L_fx[0], hStereoDft->nrg_L_fx_e[0], tmp, tmp_e, &hStereoDft->nrg_L_fx_e[0] );
4872 7698560 : move32();
4873 : // hStereoDft->nrg_R[0] += pDFT_R[2 * i] * pDFT_R[2 * i] + pDFT_R[2 * i + 1] * pDFT_R[2 * i + 1];
4874 7698560 : tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_R[2 * i], pDFT_R[2 * i] ), shl( DFT_R_e[2 * i], 1 ), Mpy_32_32( pDFT_R[2 * i + 1], pDFT_R[2 * i + 1] ), shl( DFT_R_e[2 * i + 1], 1 ), &tmp_e );
4875 7698560 : hStereoDft->nrg_R_fx[0] = BASOP_Util_Add_Mant32Exp( hStereoDft->nrg_R_fx[0], hStereoDft->nrg_R_fx_e[0], tmp, tmp_e, &hStereoDft->nrg_R_fx_e[0] );
4876 7698560 : move32();
4877 : // hStereoDft->nrg_DMX[0] += DMX[2 * i] * DMX[2 * i] + DMX[2 * i + 1] * DMX[2 * i + 1];
4878 7698560 : tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( DMX[2 * i], DMX[2 * i] ), shl( DMX_e[2 * i], 1 ), Mpy_32_32( DMX[2 * i + 1], DMX[2 * i + 1] ), shl( DMX_e[2 * i + 1], 1 ), &tmp_e );
4879 7698560 : hStereoDft->nrg_DMX_fx[0] = BASOP_Util_Add_Mant32Exp( hStereoDft->nrg_DMX_fx[0], hStereoDft->nrg_DMX_fx_e[0], tmp, tmp_e, &hStereoDft->nrg_DMX_fx_e[0] );
4880 7698560 : move32();
4881 : }
4882 7746676 : FOR( ; i < shbBins[2]; i++ )
4883 : {
4884 : // hStereoDft->nrg_L[1] += pDFT_L[2 * i] * pDFT_L[2 * i] + pDFT_L[2 * i + 1] * pDFT_L[2 * i + 1];
4885 7698560 : tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_L[2 * i], pDFT_L[2 * i] ), shl( DFT_L_e[2 * i], 1 ), Mpy_32_32( pDFT_L[2 * i + 1], pDFT_L[2 * i + 1] ), shl( DFT_L_e[2 * i + 1], 1 ), &tmp_e );
4886 7698560 : hStereoDft->nrg_L_fx[1] = BASOP_Util_Add_Mant32Exp( hStereoDft->nrg_L_fx[1], hStereoDft->nrg_L_fx_e[1], tmp, tmp_e, &hStereoDft->nrg_L_fx_e[1] );
4887 7698560 : move32();
4888 : // hStereoDft->nrg_R[1] += pDFT_R[2 * i] * pDFT_R[2 * i] + pDFT_R[2 * i + 1] * pDFT_R[2 * i + 1];
4889 7698560 : tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( pDFT_R[2 * i], pDFT_R[2 * i] ), shl( DFT_R_e[2 * i], 1 ), Mpy_32_32( pDFT_R[2 * i + 1], pDFT_R[2 * i + 1] ), shl( DFT_R_e[2 * i + 1], 1 ), &tmp_e );
4890 7698560 : hStereoDft->nrg_R_fx[1] = BASOP_Util_Add_Mant32Exp( hStereoDft->nrg_R_fx[1], hStereoDft->nrg_R_fx_e[1], tmp, tmp_e, &hStereoDft->nrg_R_fx_e[1] );
4891 7698560 : move32();
4892 : // hStereoDft->nrg_DMX[1] += DMX[2 * i] * DMX[2 * i] + DMX[2 * i + 1] * DMX[2 * i + 1];
4893 7698560 : tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( DMX[2 * i], DMX[2 * i] ), shl( DMX_e[2 * i], 1 ), Mpy_32_32( DMX[2 * i + 1], DMX[2 * i + 1] ), shl( DMX_e[2 * i + 1], 1 ), &tmp_e );
4894 7698560 : hStereoDft->nrg_DMX_fx[1] = BASOP_Util_Add_Mant32Exp( hStereoDft->nrg_DMX_fx[1], hStereoDft->nrg_DMX_fx_e[1], tmp, tmp_e, &hStereoDft->nrg_DMX_fx_e[1] );
4895 7698560 : move32();
4896 : }
4897 :
4898 48116 : return;
4899 : }
|