Line data Source code
1 : /******************************************************************************************************
2 :
3 : (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
4 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
5 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
6 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
7 : contributors to this repository. All Rights Reserved.
8 :
9 : This software is protected by copyright law and by international treaties.
10 : The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
11 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
12 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
13 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
14 : contributors to this repository retain full ownership rights in their respective contributions in
15 : the software. This notice grants no license of any kind, including but not limited to patent
16 : license, nor is any license granted by implication, estoppel or otherwise.
17 :
18 : Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
19 : contributions.
20 :
21 : This software is provided "AS IS", without any express or implied warranties. The software is in the
22 : development stage. It is intended exclusively for experts who have experience with such software and
23 : solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
24 : and fitness for a particular purpose are hereby disclaimed and excluded.
25 :
26 : Any dispute, controversy or claim arising under or in relation to providing this software shall be
27 : submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
28 : accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
29 : the United Nations Convention on Contracts on the International Sales of Goods.
30 :
31 : *******************************************************************************************************/
32 :
33 : #include <assert.h>
34 : #include <stdint.h>
35 : #include "options.h"
36 : #include <math.h>
37 : #include "cnst.h"
38 : #include "rom_com.h"
39 : #include "rom_dec.h"
40 : #include "prot_fx.h"
41 : #include "ivas_cnst.h"
42 : #include "ivas_rom_com.h"
43 : #include "ivas_rom_com_fx.h"
44 : #include "ivas_rom_dec.h"
45 : #include "wmc_auto.h"
46 : #include "ivas_prot_fx.h"
47 :
48 : /*-------------------------------------------------------------------*
49 : * Local constants
50 : *-------------------------------------------------------------------*/
51 :
52 : #define STEFI_DELAY_IND( d, buf_ind ) ( ( buf_ind ) + STEREO_DFT_PAST_MAX - ( d ) + 1 ) % STEREO_DFT_PAST_MAX
53 :
54 : #define STEREO_DFT_RES_RATIO_LIMIT_FX ( Word32 )( 0x170A3D71 )
55 : #define STEREO_DFT_STEFFI_DELAY_SHORT 2
56 : #define STEREO_DFT_STEFFI_DELAY_LONG 4
57 : #define STEREO_DFT_STEFFI_DELAY_OFFSET 2
58 :
59 :
60 : #define STEREO_DFT_BPF_SIZE 40 /* BPF: Number of weights for BPF in DFT: 40*40Hz=1.6kHz*/
61 :
62 :
63 : /*-------------------------------------------------------------------------
64 : * Local function prototypes
65 : *-------------------------------------------------------------------------*/
66 :
67 :
68 : /*-------------------------------------------------------------------------
69 : * stereo_dft_dec_create()
70 : *
71 : * Create DFT stereo handle
72 : *------------------------------------------------------------------------*/
73 :
74 :
75 : /*-------------------------------------------------------------------------
76 : * stereo_dft_dec_open()
77 : *
78 : * Open DFT decoder stereo handle
79 : *-------------------------------------------------------------------------*/
80 :
81 :
82 : /*-------------------------------------------------------------------------
83 : * stereo_dft_dec_reset()
84 : *
85 : * Reset DFT stereo memories
86 : *------------------------------------------------------------------------*/
87 :
88 : /*-------------------------------------------------------------------------
89 : * stereo_dft_dec_update()
90 : *
91 : * Update DFT memories for new frame
92 : *-------------------------------------------------------------------------*/
93 :
94 : /*-------------------------------------------------------------------------
95 : * stereo_dft_dec_destroy()
96 : *
97 : * destroy DFT stereo handle
98 : *-------------------------------------------------------------------------*/
99 :
100 908 : void stereo_dft_dec_destroy(
101 : STEREO_DFT_DEC_DATA_HANDLE *hStereoDft_glob /* i/o: decoder DFT stereo handle */
102 : )
103 : {
104 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft;
105 :
106 908 : hStereoDft = *hStereoDft_glob;
107 :
108 908 : IF( hStereoDft->hConfig != NULL )
109 : {
110 908 : free( hStereoDft->hConfig );
111 908 : hStereoDft->hConfig = NULL;
112 : }
113 :
114 908 : IF( hStereoDft->hBpf != NULL )
115 : {
116 908 : free( hStereoDft->hBpf );
117 908 : hStereoDft->hBpf = NULL;
118 : }
119 :
120 908 : IF( hStereoDft->hTcxLtpDec != NULL )
121 : {
122 908 : free( hStereoDft->hTcxLtpDec );
123 908 : hStereoDft->hTcxLtpDec = NULL;
124 : }
125 :
126 908 : free( hStereoDft );
127 908 : hStereoDft = NULL;
128 :
129 908 : return;
130 : }
131 :
132 :
133 : /*-------------------------------------------------------------------------
134 : * stereo_dft_dec_analyze()
135 : *
136 : * DFT analysis on a 20ms frame
137 : *-------------------------------------------------------------------------*/
138 :
139 195208 : void stereo_dft_dec_analyze_fx(
140 : CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */
141 : const Word32 *input_fx, /* i : input signal q*/
142 : Word32 out_DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers q_out_DFT*/
143 : const Word16 chan, /* i : channel number Q0*/
144 : const Word16 input_frame, /* i : input frame size Q0*/
145 : const Word16 output_frame, /* i : output frame size Q0*/
146 : const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : type of signal to analyse */
147 : const Word16 k_offset, /* i : offset of DFT Q0*/
148 : const Word16 delay, /* i : delay in samples FOR input signal Q0*/
149 : Word16 *q,
150 : Word16 *q_out_DFT )
151 : {
152 :
153 : Word16 i, k;
154 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft;
155 : Word32 *pInput_fx, *pInput_buff_fx;
156 : Word32 *mem_fx, input_buff_fx[STEREO_DFT32MS_OVL_MAX + L_FRAME48k];
157 : Word32 DFT_fx[STEREO_DFT32MS_N_MAX], *pDFT_out_fx;
158 : Word16 NFFT, NFFT_core, ovl, zp;
159 : Word16 offset;
160 : Word32 fac_fx;
161 : const Word16 *trigo_fx, *win_left_fx, *win_right_fx, *win2_fx;
162 : Word16 trigo_dec_fx[STEREO_DFT32MS_N_MAX / 2 + 1];
163 : Word16 trigo_step;
164 : Word32 inputFs;
165 : Word16 delay_dec;
166 : Word16 mem_size;
167 : Word16 ovl2;
168 :
169 195208 : push_wmops( "DFT_analysis" );
170 :
171 195208 : hStereoDft = hCPE->hStereoDft;
172 :
173 195208 : assert( output_frame == STEREO_DFT_NBDIV * hStereoDft->N );
174 :
175 : /*-----------------------------------------------------------------*
176 : * Initialization
177 : *-----------------------------------------------------------------*/
178 :
179 195208 : IF( EQ_16( input_frame, output_frame ) )
180 : {
181 72286 : trigo_fx = hStereoDft->dft_trigo_fx;
182 72286 : trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); /* Q0 */
183 72286 : win_right_fx = hStereoDft->win32ms_fx; /* Q15 */
184 72286 : win_left_fx = hStereoDft->win32ms_fx; /* Q15 */
185 72286 : win2_fx = hStereoDft->win232ms_fx; /* Q15 */
186 :
187 72286 : test();
188 72286 : IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
189 : {
190 5085 : assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" );
191 5085 : mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */
192 : }
193 67201 : ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) )
194 : {
195 3436 : mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */
196 : }
197 : ELSE
198 : {
199 63765 : mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */
200 : }
201 : }
202 122922 : ELSE IF( EQ_16( input_frame, L_FRAME ) )
203 : {
204 59225 : trigo_fx = hStereoDft->dft_trigo_12k8_fx; /* Q15 */
205 59225 : trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP * STEREO_DFT_TRIGO_DEC_STEP;
206 59225 : move16();
207 59225 : win_right_fx = hStereoDft->win32ms_12k8_fx; /* Q15 */
208 59225 : win_left_fx = hStereoDft->win32ms_12k8_fx; /* Q15 */
209 59225 : win2_fx = hStereoDft->win232ms_12k8_fx; /* Q15 */
210 :
211 59225 : test();
212 59225 : IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
213 : {
214 20955 : assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" );
215 20955 : mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */
216 : }
217 38270 : ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) )
218 : {
219 18516 : mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */
220 : }
221 : ELSE
222 : {
223 19754 : assert( ( chan == 1 ) && "12.8kHz sampling rate only FOR second channel, i.e. residual coding or allpass signal" );
224 19754 : mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */
225 : }
226 : }
227 63697 : ELSE IF( EQ_16( input_frame, L_FRAME16k ) )
228 : {
229 46867 : trigo_fx = hStereoDft->dft_trigo_16k_fx; /* Q15 */
230 46867 : trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP;
231 46867 : move16();
232 46867 : win_right_fx = hStereoDft->win32ms_16k_fx; /* Q15 */
233 46867 : win_left_fx = hStereoDft->win32ms_16k_fx; /* Q15 */
234 46867 : win2_fx = hStereoDft->win232ms_16k_fx; /* Q15 */
235 :
236 46867 : test();
237 46867 : IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
238 : {
239 22157 : assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" );
240 22157 : mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */
241 : }
242 24710 : ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) )
243 : {
244 14901 : mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */
245 : }
246 : ELSE
247 : {
248 9809 : assert( ( chan == 1 ) && ( hCPE->hStereoDft->hConfig->res_pred_mode == STEREO_DFT_RESPRED_ESF ) && "16kHz sampling rate only FOR second channel with allpass signal" );
249 9809 : mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */
250 : }
251 : }
252 16830 : ELSE IF( EQ_16( input_frame, L_FRAME8k ) )
253 : {
254 16830 : assert( ( chan == 1 ) && "DFT stereo: 8kHz analysis only FOR residual coding" );
255 16830 : trigo_fx = hStereoDft->dft_trigo_8k_fx; /* Q15 */
256 16830 : trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP * STEREO_DFT_TRIGO_DEC_STEP;
257 16830 : move16();
258 16830 : win_right_fx = hStereoDft->win32ms_8k_fx; /* Q15 */
259 16830 : win_left_fx = hStereoDft->win32ms_8k_fx; /* Q15 */
260 16830 : win2_fx = hStereoDft->win232ms_8k_fx; /* Q15 */
261 16830 : mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */
262 : }
263 : ELSE
264 : {
265 0 : IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error in DFT stereo: sampling rate not supported" );
266 0 : mem_fx = NULL; /* to avoid compilation warning */
267 0 : trigo_fx = NULL; /* to avoid compilation warning */
268 0 : trigo_step = -1; /* to avoid compilation warning */
269 0 : move16();
270 0 : win_right_fx = NULL; /* to avoid compilation warning */
271 0 : win_left_fx = NULL; /* to avoid compilation warning */
272 0 : win2_fx = NULL; /* to avoid compilation warning */
273 : }
274 :
275 195208 : inputFs = L_mult0( input_frame, FRAMES_PER_SEC ); /* Q0 */
276 195208 : delay_dec = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS );
277 195208 : move16();
278 195208 : zp = NS2SA_FX2( inputFs, STEREO_DFT32MS_ZP_NS );
279 195208 : move16();
280 195208 : ovl = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS );
281 195208 : move16();
282 195208 : NFFT = NS2SA_FX2( inputFs, STEREO_DFT32MS_N_NS );
283 : Word16 qfac_fx;
284 195208 : fac_fx = BASOP_Util_Divide3232_Scale_newton( hStereoDft->NFFT, NFFT, &qfac_fx ); /* qfac_fx */
285 195208 : qfac_fx = sub( 31, qfac_fx );
286 195208 : ovl2 = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL2_NS );
287 195208 : move16();
288 :
289 : /* Offset FOR the time buffers */
290 195208 : assert( ( delay >= -NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_DELAY_DEC_BWE_NS + STEREO_DFT_OVL_NS / 2 ) ) && ( delay <= NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_OVL_NS ) ) );
291 195208 : mem_size = add( delay_dec, delay );
292 :
293 : /* Update buffers */
294 195208 : Copy32( mem_fx, input_buff_fx, mem_size ); /* Q11 */
295 195208 : Copy32( input_fx, input_buff_fx + mem_size, input_frame ); /* q */
296 195208 : Copy32( input_buff_fx + input_frame, mem_fx, mem_size ); /* q */
297 195208 : pInput_buff_fx = input_buff_fx; /* q */
298 :
299 195208 : test();
300 195208 : IF( EQ_16( hCPE->nchan_out, 1 ) && ( hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) )
301 : {
302 39593 : pop_wmops();
303 39593 : return;
304 : }
305 :
306 :
307 : /*-----------------------------------------------------------------*
308 : * DFT Analysis: loop over frame
309 : *-----------------------------------------------------------------*/
310 :
311 155615 : assert( ( k_offset <= STEREO_DFT_NBDIV ) );
312 :
313 16215071 : FOR( i = 0; i < NFFT / 4; i++ )
314 : {
315 16059456 : trigo_dec_fx[i] = trigo_fx[i * trigo_step];
316 16059456 : move16();
317 16059456 : trigo_dec_fx[NFFT / 2 - i] = trigo_fx[i * trigo_step];
318 16059456 : move16();
319 : }
320 155615 : trigo_dec_fx[NFFT / 4] = trigo_fx[NFFT / 4 * trigo_step];
321 155615 : move16();
322 :
323 396608 : FOR( k = 0; k < STEREO_DFT_NBDIV - k_offset; k++ )
324 : {
325 240993 : set32_fx( DFT_fx, 0, STEREO_DFT32MS_N_MAX );
326 240993 : IF( k == 0 )
327 : {
328 121442 : offset = 0;
329 121442 : move16();
330 : }
331 : ELSE
332 : {
333 : /* If OVL2 = OVL offset = 10ms */
334 119551 : offset = NS2SA_FX2( inputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 );
335 119551 : move16();
336 : }
337 :
338 240993 : pInput_fx = pInput_buff_fx + offset; /* q */
339 240993 : pDFT_out_fx = out_DFT_fx[chan] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* q_out_DFT */
340 :
341 : /*Forwards FFT: L and R*/
342 : /* Zero Padding & Flat Portion */
343 240993 : Copy32( pInput_fx, DFT_fx + zp, sub( NFFT, i_mult( 2, zp ) ) ); /* q */
344 :
345 : /* Overlapping portions */
346 240993 : IF( k == 0 )
347 : {
348 7278692 : FOR( i = 0; i < ovl; i++ )
349 : {
350 7157250 : DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win_left_fx[STEREO_DFT32MS_STEP * i] ); /* q */
351 7157250 : move32();
352 : }
353 21593192 : FOR( i = 0; i < ovl2; i++ )
354 : {
355 21471750 : DFT_fx[NFFT - zp - 1 - i] = Mpy_32_16_1( DFT_fx[NFFT - zp - 1 - i], win2_fx[i] ); /* q */
356 21471750 : move32();
357 : }
358 : }
359 : ELSE
360 : {
361 21153421 : FOR( i = 0; i < ovl2; i++ )
362 : {
363 21033870 : DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win2_fx[i] ); /* q */
364 21033870 : move32();
365 : }
366 7130841 : FOR( i = 0; i < ovl; i++ )
367 : {
368 7011290 : DFT_fx[NFFT - zp - i - 1] = Mpy_32_16_1( DFT_fx[NFFT - zp - i - 1], win_right_fx[STEREO_DFT32MS_STEP * i] ); /* q */
369 7011290 : move32();
370 : }
371 : }
372 : Word16 q_DFT, q_shift, guarded_bits;
373 240993 : q_DFT = *q;
374 240993 : move16();
375 240993 : guarded_bits = find_guarded_bits_fx( NFFT );
376 240993 : q_shift = sub( L_norm_arr( DFT_fx, NFFT ), guarded_bits );
377 :
378 90919649 : FOR( Word16 j = 0; j < NFFT; j++ )
379 : {
380 90678656 : DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift*/
381 90678656 : move32();
382 : }
383 :
384 240993 : q_DFT = add( q_DFT, q_shift );
385 :
386 240993 : rfft_fx( DFT_fx, trigo_dec_fx, NFFT, -1 );
387 :
388 240993 : q_shift = sub( L_norm_arr( DFT_fx, NFFT ), sub( 31, qfac_fx ) );
389 90919649 : FOR( Word16 j = 0; j < NFFT; j++ )
390 : {
391 90678656 : DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift */
392 90678656 : move32();
393 : }
394 240993 : q_DFT = add( q_DFT, q_shift );
395 240993 : IF( sub( q_out_DFT[chan], q_DFT ) > 0 )
396 : {
397 0 : FOR( Word32 j = 0; j < NFFT; j++ )
398 : {
399 0 : out_DFT_fx[chan][j] = L_shr( out_DFT_fx[chan][j], sub( q_out_DFT[chan], q_DFT ) ); /* q_DFT */
400 0 : move32();
401 : }
402 0 : q_out_DFT[chan] = q_DFT;
403 0 : move16();
404 : }
405 : ELSE
406 : {
407 90919649 : FOR( Word32 j = 0; j < NFFT; j++ )
408 : {
409 90678656 : DFT_fx[j] = L_shr( DFT_fx[j], sub( q_DFT, q_out_DFT[chan] ) ); /* q_DFT */
410 90678656 : move32();
411 : }
412 240993 : q_DFT = q_out_DFT[chan];
413 240993 : move16();
414 : }
415 :
416 : /*Resampling: filtering+scaling*/
417 240993 : test();
418 240993 : test();
419 240993 : IF( ( ana_type == DFT_STEREO_DEC_ANA_FB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_NOCORE ) )
420 : {
421 188526 : pDFT_out_fx[0] = L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ); /*DC*/ /* qDFT */
422 188526 : move32();
423 188526 : IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/
424 : {
425 63290 : pDFT_out_fx[1] = L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */
426 63290 : move32();
427 : }
428 : ELSE
429 : {
430 125236 : pDFT_out_fx[1] = 0;
431 125236 : move32();
432 : }
433 74510738 : FOR( i = 2; i < NFFT; i++ )
434 : {
435 74322212 : pDFT_out_fx[i] = L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */
436 74322212 : move32();
437 : }
438 55163502 : FOR( i = NFFT; i < hStereoDft->NFFT; i++ )
439 : {
440 54974976 : pDFT_out_fx[i] = 0; /* qDFT */
441 54974976 : move32();
442 : }
443 : }
444 52467 : ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) )
445 : {
446 50394 : pDFT_out_fx[0] = L_sub( pDFT_out_fx[0], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[0], fac_fx ), dft_bpf_weights_fx[0] ), sub( 32, qfac_fx ) ) ); /* qDFT */
447 50394 : move32();
448 :
449 2015760 : FOR( i = 1; i < STEREO_DFT_BPF_SIZE; i++ )
450 : {
451 1965366 : pDFT_out_fx[2 * i] = L_sub( pDFT_out_fx[2 * i], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); /* qDFT */
452 1965366 : move32();
453 1965366 : pDFT_out_fx[2 * i + 1] = L_sub( pDFT_out_fx[2 * i + 1], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i + 1], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); /* qDFT */
454 1965366 : move32();
455 : }
456 : }
457 2073 : ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_HB_ADD ) )
458 : {
459 80 : NFFT_core = NS2SA_FX2( L_mult0( hCPE->hCoreCoder[0]->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_N_NS ); /* Q0 */
460 80 : move16();
461 :
462 43536 : FOR( i = NFFT_core; i < NFFT; i++ )
463 : {
464 43456 : pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); /* qDFT */
465 43456 : move32();
466 : }
467 : }
468 : ELSE
469 : {
470 1993 : pDFT_out_fx[0] = L_add( pDFT_out_fx[0], L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ) ); /*DC*/ /* qDFT */
471 1993 : move32();
472 1993 : IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/
473 : {
474 1101 : pDFT_out_fx[1] = L_add( L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[1] ); /* qDFT */
475 1101 : move32();
476 : }
477 1039351 : FOR( i = 2; i < NFFT; i++ )
478 : {
479 1037358 : pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); /* qDFT */
480 1037358 : move32();
481 : }
482 : }
483 : }
484 :
485 155615 : pop_wmops();
486 155615 : return;
487 : }
488 :
489 :
490 : /*---------------------------------------------------------------
491 : * stereo_dft_dec_smooth_parameters()
492 : *
493 : *
494 : * ---------------------------------------------------------------*/
|