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 "cnst.h"
37 : #include "rom_com.h"
38 : #include "prot_fx.h"
39 : #include "ivas_prot_fx.h"
40 : #include "ivas_cnst.h"
41 : #include "wmc_auto.h"
42 :
43 : /*-------------------------------------------------------------------------
44 : * ivas_post_proc()
45 : *
46 : * IVAS post-processing
47 : * - in SCE, post-processing of output channel
48 : * - in CPE_DFT, post-processing on output channels
49 : * - in CPE_TD, post-processing on decoded channels before upmixing
50 : *-------------------------------------------------------------------------*/
51 :
52 1301282 : void ivas_post_proc_fx(
53 : SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */
54 : CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */
55 : const Word16 n, /* i : channel number Q0*/
56 : Word32 synth[], /* i/o: output synthesis signal Q11*/
57 : Word32 *output[CPE_CHANNELS], /* i/o: output synthesis signal output_q*/
58 : const Word16 output_frame, /* i : output frame length Q0*/
59 : const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC Q0*/
60 : Word16 output_q )
61 : {
62 : Word16 k;
63 : Word16 delay_comp;
64 : Word32 output_Fs;
65 : Decoder_State **sts;
66 : TCX_LTP_DEC_HANDLE hTcxLtpDec;
67 :
68 1301282 : IF( hSCE != NULL )
69 : {
70 411406 : sts = hSCE->hCoreCoder;
71 : }
72 : ELSE
73 : {
74 889876 : sts = hCPE->hCoreCoder;
75 : }
76 :
77 1301282 : output_Fs = sts[0]->output_Fs;
78 1301282 : move32();
79 :
80 1301282 : test();
81 1301282 : test();
82 1301282 : test();
83 1301282 : test();
84 1301282 : test();
85 1301282 : IF( ( NE_16( sts[n]->element_mode, IVAS_CPE_DFT ) && !( sba_dirac_stereo_flag && NE_16( sts[n]->element_mode, IVAS_CPE_MDCT ) ) ) || ( EQ_16( sts[n]->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) )
86 : {
87 1241064 : IF( sts[n]->hTcxLtpDec != NULL )
88 : {
89 1236836 : hTcxLtpDec = sts[n]->hTcxLtpDec;
90 :
91 1236836 : test();
92 1236836 : IF( NE_16( sts[n]->core, TCX_20_CORE ) && NE_16( sts[n]->core, TCX_10_CORE ) )
93 : {
94 : /* TCX-LTP Postfilter: used in Mode 1 to update memories and to avoid discontinuities when the past frame was TCX */
95 187263 : tcx_ltp_post_fx32( sts[n], hTcxLtpDec, ACELP_CORE, output_frame, 0, synth, NULL, output_q );
96 : }
97 : ELSE
98 : {
99 : /* set delay */
100 1049573 : delay_comp = NS2SA_FX2( output_Fs, DELAY_CLDFB_NS ); /*Q0*/
101 1049573 : move16();
102 :
103 1049573 : test();
104 1049573 : test();
105 1049573 : test();
106 1049573 : test();
107 1049573 : IF( EQ_16( EQ_16( sts[n]->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ), 0 ) && NE_16( sts[n]->element_mode, IVAS_CPE_MDCT ) )
108 : {
109 261150 : Copy32( sts[n]->delay_buf_out32_fx, sts[n]->hTcxDec->FBTCXdelayBuf_32, delay_comp ); /*Q11*/
110 : }
111 788423 : ELSE IF( sba_dirac_stereo_flag && EQ_16( sts[n]->element_mode, IVAS_CPE_MDCT ) )
112 : {
113 22392 : Word16 numZeros = (Word16) ( NS2SA_FX2( output_Fs, N_ZERO_MDCT_NS ) ); /*Q0*/
114 22392 : move16();
115 22392 : assert( sts[n]->hHQ_core->Q_old_out_fx32 == Q11 );
116 22392 : Copy32( sts[n]->hHQ_core->old_out_fx32 + numZeros, sts[n]->hTcxDec->FBTCXdelayBuf_32, delay_comp ); /*Q11*/
117 : }
118 :
119 1049573 : tcx_ltp_post_fx32( sts[n], hTcxLtpDec, sts[n]->core, output_frame, add( NS2SA_FX2( output_Fs, ACELP_LOOK_NS ), delay_comp ), synth, sts[n]->hTcxDec->FBTCXdelayBuf_32, output_q );
120 : }
121 : }
122 : }
123 : ELSE /* IVAS_CPE_DFT */
124 : {
125 : Word16 pit_res_max_past_tmp;
126 :
127 60218 : pit_res_max_past_tmp = sts[0]->pit_res_max_past; /*Q0*/
128 60218 : move16();
129 175335 : FOR( k = 0; k < hCPE->nchan_out; k++ )
130 : {
131 115117 : IF( k == 0 )
132 : {
133 60218 : hTcxLtpDec = sts[0]->hTcxLtpDec;
134 : }
135 : ELSE
136 : {
137 54899 : hTcxLtpDec = hCPE->hStereoDft->hTcxLtpDec;
138 : /* copy LTP side-info of downmix channel also to right channel struct */
139 54899 : hTcxLtpDec->tcxltp = sts[0]->hTcxLtpDec->tcxltp; /*Q0*/
140 54899 : move16();
141 54899 : hTcxLtpDec->tcxltp_gain = sts[0]->hTcxLtpDec->tcxltp_gain; /*Q15*/
142 54899 : move16();
143 54899 : hTcxLtpDec->tcxltp_pitch_int = sts[0]->hTcxLtpDec->tcxltp_pitch_int; /*Q0*/
144 54899 : move16();
145 54899 : hTcxLtpDec->tcxltp_pitch_fr = sts[0]->hTcxLtpDec->tcxltp_pitch_fr; /*Q0*/
146 54899 : move16();
147 : /* revert update of pit_res_max_past to have correct value also in right channel */
148 54899 : sts[0]->pit_res_max_past = pit_res_max_past_tmp; /*Q0*/
149 54899 : move16();
150 : }
151 :
152 : /*TCX-LTP*/
153 115117 : IF( NE_16( sts[0]->core, TCX_20_CORE ) && NE_16( sts[0]->core, TCX_10_CORE ) )
154 : {
155 : /* update memories and to avoid discontinuities when the past frame was TCX */
156 71733 : tcx_ltp_post_fx32( sts[0], hTcxLtpDec, ACELP_CORE, output_frame, 0, output[k], NULL, output_q );
157 : }
158 : ELSE
159 : {
160 : /*Use channel 0 side info.*/
161 43384 : tcx_ltp_post_fx32( sts[0], hTcxLtpDec, TCX_20_CORE, output_frame, NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ), output[k], hCPE->output_mem_fx[k], output_q );
162 : }
163 : }
164 : }
165 :
166 1301282 : return;
167 : }
168 :
169 :
170 : /*-------------------------------------------------------------------------
171 : * stereo_dft_dec_core_switching_fx()
172 : *
173 : * core switching in DFT stereo
174 : *-------------------------------------------------------------------------*/
175 :
176 89316 : void stereo_dft_dec_core_switching_fx(
177 : CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */
178 : Word32 output_fx[], /* i/o: synthesis @internal Fs q*/
179 : Word32 synth_fx[], /* i/o: synthesis @output Fs q*/
180 : Word32 hb_synth_fx[], /* i/o: hb synthesis q*/
181 : Word32 DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers q_DFT*/
182 : const Word16 output_frame, /* i : output frame length Q0*/
183 : const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB FOR DFT Stereo Q0*/
184 : const Word16 sba_dirac_stereo_dtx_flag, /* i : DTX indicator FOR SBA DirAC stereo Q0*/
185 : Word16 *q,
186 : Word16 *q_DFT )
187 : {
188 : Word32 output_Fs;
189 : Decoder_State *st;
190 : Word16 i, tmps;
191 : Word16 delay_dft_dec, delay_dft_dec_lb, delay_tdbwe, delay_comp;
192 : Word16 L_frameTCX;
193 : Word16 predelay, ap_fade_len;
194 : Word32 ap_fade_len_inv, ap_fade_len_fx;
195 : Word16 qap_fade_len;
196 : Word32 pAp_input_fx[L_FRAME16k];
197 : Word32 tcx_core_buf_fx[L_FRAME16k];
198 : Word64 calc_inv;
199 : Word32 synth_tmp_fx[L_FRAME48k];
200 :
201 :
202 89316 : st = hCPE->hCoreCoder[0]; /* in DFT stereo, only M channel is decoded by the CoreCoder */
203 89316 : output_Fs = st->output_Fs; /*Q0*/
204 89316 : move32();
205 89316 : L_frameTCX = st->hTcxDec->L_frameTCX; /*Q0*/
206 89316 : move16();
207 :
208 : /*TBE*/
209 89316 : delay_tdbwe = NS2SA_FX2( output_Fs, DELAY_BWE_TOTAL_NS ); /*Q0*/
210 89316 : move16();
211 89316 : delay_dft_dec = NS2SA_FX2( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); /*Q0*/
212 89316 : move16();
213 89316 : delay_dft_dec_lb = NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT_DELAY_DEC_BWE_NS ); /*Q0*/
214 89316 : move16();
215 :
216 : /* TCX/ACELP/HQ-CORE->TCX */
217 89316 : tmps = NS2SA_FX2( output_Fs, DELAY_BWE_TOTAL_NS ); /*cross-fading size @ FB*/ /*Q0*/
218 89316 : move16();
219 89316 : delay_comp = NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), DELAY_BWE_TOTAL_NS ); /*cross-fading size @ LB*/ /*Q0*/
220 89316 : move16();
221 :
222 89316 : calc_inv = W_shl( 1, 31 );
223 :
224 : // Memory Tables //////////////////////////////////////////////////////////////////////////////
225 89316 : Word32 mem_len_inv_tbl[] = { 85899345, 42949672, 28633115, 21474836, 17179869, 14316557 }; /*Q31*/
226 89316 : Word32 delay_comp_inv_tbl[] = { 2147483647, 306783378, 153391689, 97612893, 74051160, 58040098, 48806446, 42107522, 36398027, 32537631, 29020049 }; /*Q31*/
227 : ///////////////////////////////////////////////////////////////////////////////////////////////
228 :
229 89316 : test();
230 89316 : test();
231 89316 : IF( NE_16( st->last_L_frame, st->L_frame ) && LE_16( st->last_L_frame, L_FRAME16k ) && LE_16( st->L_frame, L_FRAME16k ) )
232 : {
233 1167 : L_lerp_fx_q11( hCPE->input_mem_LB_fx[0], hCPE->input_mem_LB_fx[0], NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ), NS2SA_FX2( L_mult0( st->last_L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) );
234 1167 : L_lerp_fx_q11( hCPE->input_mem_BPF_fx[0], hCPE->input_mem_BPF_fx[0], NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ), NS2SA_FX2( L_mult0( st->last_L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) );
235 : }
236 :
237 89316 : test();
238 89316 : test();
239 89316 : IF( ( st->prev_bfi != 0 ) && EQ_16( ( st->last_core_bfi == ACELP_CORE ) && EQ_16( st->last_con_tcx, 1 ), 0 ) )
240 : {
241 : /* last_core needed FOR correctly decoding ACELP->TCX/HQ switching frames in ivas_core_dec().
242 : In the following steps the decoder needs to consider IF the core was changed due to a lost frame to apply the correct transition */
243 1863 : st->last_core = st->last_core_bfi;
244 1863 : move16();
245 : }
246 :
247 :
248 89316 : test();
249 89316 : test();
250 89316 : test();
251 89316 : test();
252 89316 : test();
253 89316 : IF( EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) || EQ_16( st->core, HQ_CORE ) || ( EQ_16( st->bfi, 1 ) && EQ_16( st->core, ACELP_CORE ) && EQ_16( st->con_tcx, 1 ) ) )
254 : {
255 31336 : test();
256 31336 : test();
257 31336 : test();
258 31336 : test();
259 31336 : test();
260 31336 : test();
261 31336 : IF( ( ( ( st->last_core != ACELP_CORE ) || ( EQ_16( st->prev_bfi, 1 ) && EQ_16( st->last_core, ACELP_CORE ) && EQ_16( st->last_con_tcx, 1 ) ) ) && NE_16( st->last_core, AMR_WB_CORE ) ) || ( sba_dirac_stereo_dtx_flag && EQ_16( st->cng_type, FD_CNG ) ) ) /* TCX / HQ-CORE -> TCX / HQ-CORE */
262 : {
263 : /* In case of a TCX to ACELP switch next frame */
264 29435 : Copy32( &output_fx[st->L_frame - NS2SA( ( st->L_frame * FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS )], hCPE->hStereoDft->buff_LBTCX_mem_fx, NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) ); /*q*/
265 :
266 : /* BPF */
267 29435 : test();
268 29435 : test();
269 29435 : IF( st->p_bpf_noise_buf_32 && NE_16( st->core, HQ_CORE ) )
270 : {
271 28084 : Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( *q, Q11 ) ); /*q*/
272 28084 : stereo_dft_dec_analyze_fx( hCPE, st->p_bpf_noise_buf_32, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_BPF, 2, 0, q, q_DFT );
273 : }
274 : /* st->p_bpf_noise_buf not updated FOR HQ core -> skip analysis and set input memory to zero */
275 1351 : ELSE IF( st->p_bpf_noise_buf_32 && EQ_16( st->core, HQ_CORE ) )
276 : {
277 1343 : set32_fx( hCPE->input_mem_BPF_fx[0], 0, STEREO_DFT32MS_OVL_16k );
278 : }
279 :
280 : /* TCX */
281 29435 : stereo_dft_dec_analyze_fx( hCPE, synth_fx, DFT_fx, 0, L_frameTCX, output_frame, DFT_STEREO_DEC_ANA_FB, 0, 0, q, q_DFT );
282 : }
283 1901 : ELSE IF( EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) || EQ_16( st->core, HQ_CORE ) ) /* ACELP -> TCX/HQ */
284 : {
285 1901 : test();
286 1901 : IF( LE_32( st->last_core_brate, SID_2k40 ) && LE_16( st->element_mode, IVAS_SCE ) )
287 1 : {
288 1 : Word16 mem_len = NS2SA_FX2( L_mult0( L_frameTCX, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ); /*Q0*/
289 1 : move16();
290 1 : Word32 mem_len_inv = mem_len_inv_tbl[( mem_len / 25 ) - 1];
291 1 : move32();
292 1 : Word16 qmem_len = norm_l( mem_len );
293 1 : Word32 mem_len_fx = L_shl( mem_len, qmem_len );
294 151 : FOR( i = 0; i < mem_len; i++ )
295 : {
296 150 : hCPE->input_mem_fx[0][i] = Mpy_32_32( hCPE->input_mem_fx[0][i], L_sub( mem_len_fx, L_shl( i, qmem_len ) ) ); /*Q11 + qmem_len - 31*/
297 150 : move32();
298 150 : hCPE->input_mem_fx[0][i] = L_shl( Mpy_32_32( hCPE->input_mem_fx[0][i], mem_len_inv ), sub( Q31, qmem_len ) ); /*Q11*/
299 150 : move32();
300 : }
301 :
302 : /* Update FB input buff with hb synth FOR last delay_tdbwe sampled */
303 112 : FOR( i = 0; i < delay_tdbwe; i++ )
304 : {
305 222 : hCPE->input_mem_fx[0][( ( NS2SA( L_frameTCX * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe ) + i )] =
306 111 : L_add( hCPE->input_mem_fx[0][NS2SA( ( ( L_frameTCX * FRAMES_PER_SEC ) - STEREO_DFT32MS_OVL_NS ) + delay_tdbwe, i )], hb_synth_fx[i] ); /*Q11*/
307 111 : move32();
308 : }
309 : }
310 : ELSE
311 : {
312 : /* Update FB input buff with hb synth FOR last delay_tdbwe sampled */
313 173025 : FOR( i = 0; i < delay_tdbwe; i++ )
314 : {
315 171125 : hCPE->input_mem_fx[0][( ( NS2SA_FX2( L_frameTCX * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe ) + i )] = hb_synth_fx[i]; /*Q11*/
316 171125 : move32();
317 : }
318 : }
319 :
320 : /* cross-fading between (delayed) TBE and FB-TCX over 2.3125ms */
321 1901 : Copy32( synth_fx, synth_tmp_fx, output_frame ); /*q*/
322 1901 : Word16 qtmps = norm_l( tmps );
323 1901 : Word32 tmps_fx = L_shl( tmps, qtmps );
324 1901 : Word32 tmps_inv = (Word32) ( calc_inv / tmps );
325 173137 : FOR( i = 0; i < tmps; i++ )
326 : {
327 171236 : synth_tmp_fx[i] = L_add( Mpy_32_32( hb_synth_fx[( i + delay_tdbwe )], L_sub( tmps_fx, L_shl( i, qtmps ) ) ), Mpy_32_32( synth_fx[i], L_shl( i, qtmps ) ) ); /*q + qtmps - 31*/
328 171236 : move32();
329 171236 : synth_tmp_fx[i] = L_shl( Mpy_32_32( synth_tmp_fx[i], tmps_inv ), sub( 31, qtmps ) ); /*q*/
330 171236 : move32();
331 : }
332 :
333 : /* FB-TCX */
334 1901 : stereo_dft_dec_analyze_fx( hCPE, synth_tmp_fx, DFT_fx, 0, L_frameTCX, output_frame, DFT_STEREO_DEC_ANA_FB, 0, 0, q, q_DFT );
335 :
336 1901 : IF( st->tcxonly == 0 )
337 : {
338 1897 : IF( EQ_16( hCPE->hStereoDft->hConfig->res_pred_mode, STEREO_DFT_RESPRED_ESF ) )
339 : {
340 1163 : Copy32( output_fx, tcx_core_buf_fx, L_FRAME16k ); /*q*/
341 : }
342 : /* fading-out LB-TCX/ACELP */
343 1897 : Word16 qdelay_comp = norm_l( delay_comp );
344 1897 : Word32 delay_comp_inv = delay_comp_inv_tbl[( delay_comp / 7 )]; /*Q31*/
345 1897 : move32();
346 1897 : Word32 delay_comp_fx = L_shl( delay_comp, qdelay_comp );
347 67974 : FOR( i = 0; i < delay_comp; i++ )
348 : {
349 66077 : output_fx[i] = Mpy_32_32( output_fx[i], L_sub( delay_comp_fx, L_shl( i, qdelay_comp ) ) ); /*q + qdelay_comp - 31*/
350 66077 : move32();
351 66077 : output_fx[i] = L_shl( Mpy_32_32( output_fx[i], delay_comp_inv ), sub( Q31, qdelay_comp ) ); /*q*/
352 66077 : move32();
353 : }
354 :
355 : /* In case of TCX frames, output LB TCX is zeroed out until the end but in case of an TCX->ACELP switch, this memory is needed, hence it is backed up */
356 : /* Unlike the case when DFT32MS is disabled, there is only 1 DFT analysis window, hence in the TCX frame we don't want to do a DFT analysis FOR LB TCX
357 : but in a potential ACELP frame, we want the memories of the LB TCX FOR the last OLA samples so that HB analysis can be skipped */
358 1897 : Copy32( &output_fx[st->L_frame - NS2SA_FX2( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS )], hCPE->hStereoDft->buff_LBTCX_mem_fx, NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) ); /*q*/
359 :
360 : /*zero the rest FOR avoiding adding contribution except the last samples which are not considered in DFT analysis (potentially used in next ACELP frame)*/
361 1897 : IF( GT_32( st->last_core_brate, SID_2k40 ) )
362 : {
363 493828 : FOR( ; i < st->L_frame; i++ )
364 : {
365 491989 : output_fx[i] = 0;
366 491989 : move32();
367 : }
368 :
369 1839 : stereo_dft_dec_analyze_fx( hCPE, output_fx, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_LB_ADD, 1, 0, q, q_DFT );
370 :
371 : /* BPF */
372 1839 : IF( st->p_bpf_noise_buf_32 )
373 : {
374 1839 : set32_fx( hCPE->input_mem_BPF_fx[0], 0, NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) );
375 : }
376 : }
377 : }
378 : }
379 : }
380 : ELSE /* ACELP core */
381 : {
382 57980 : test();
383 57980 : test();
384 57980 : test();
385 57980 : IF( LE_32( st->core_brate, SID_2k40 ) && !sba_dirac_stereo_dtx_flag )
386 : {
387 10319 : set32_fx( hCPE->input_mem_fx[0], 0, NS2SA_FX2( L_mult0( st->hTcxDec->L_frameTCX, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) );
388 10319 : set32_fx( hCPE->input_mem_LB_fx[0], 0, NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) );
389 :
390 : /* CNG generated in ivas_cpe_dec() */
391 : }
392 47661 : ELSE IF( EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) || EQ_16( st->last_core, HQ_CORE ) ) /* TCX/HQ -> ACELP */
393 : {
394 3493 : IF( ( LE_16( st->last_L_frame, L_FRAME16k ) && LE_16( st->L_frame, L_FRAME16k ) ) || ( sba_dirac_stereo_dtx_flag && EQ_32( st->core_brate, SID_2k40 ) && EQ_16( st->cng_type, FD_CNG ) ) )
395 : {
396 : /* In case of a TCX to ACELP switch, retrieve the LB-TCX memories FOR the first STEREO_DFT32MS_OVL_NS NS of OLA */
397 1711 : L_lerp_fx_q11( hCPE->hStereoDft->buff_LBTCX_mem_fx, hCPE->input_mem_LB_fx[0], NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ), NS2SA_FX2( L_mult0( st->last_L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) );
398 : }
399 :
400 3493 : IF( sba_dirac_stereo_dtx_flag && EQ_32( st->core_brate, SID_2k40 ) && EQ_16( st->cng_type, FD_CNG ) )
401 2 : {
402 : Word16 nZeros;
403 2 : nZeros = (Word16) ( NS2SA_FX2( st->output_Fs, N_ZERO_MDCT_NS ) ); /*Q0*/
404 2 : move16();
405 2 : delay_comp = NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ); /*Q0*/
406 2 : move16();
407 :
408 2 : Copy32( &st->hHQ_core->old_out_fx32[nZeros - ( delay_comp + NS2SA( output_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) )], hCPE->input_mem_fx[0], NS2SA_FX2( L_mult0( output_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) ); /*Q11*/
409 2 : Copy32( synth_fx, synth_tmp_fx, output_frame ); /*q*/
410 :
411 : Word16 mem_len;
412 2 : mem_len = NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ); /*Q0*/
413 2 : move16();
414 :
415 2 : Word16 qmem_len = norm_l( mem_len );
416 2 : Word32 mem_len_fx = L_shl( mem_len, qmem_len );
417 2 : Word32 mem_len_inv = (Word32) ( calc_inv / tmps );
418 2 : move32();
419 102 : FOR( i = 0; i < mem_len; i++ )
420 : {
421 100 : hCPE->input_mem_LB_fx[0][i] = Mpy_32_32( hCPE->input_mem_LB_fx[0][i], L_sub( mem_len_fx, L_shl( i, qmem_len ) ) ); /*Q11 + qmem_len - 31*/
422 100 : move32();
423 100 : hCPE->input_mem_LB_fx[0][i] = L_shl( Mpy_32_32( hCPE->input_mem_LB_fx[0][i], mem_len_inv ), sub( Q31, qmem_len ) ); /*Q11*/
424 100 : move32();
425 : }
426 2 : set32_fx( output_fx, 0, st->L_frame );
427 :
428 2 : stereo_dft_dec_analyze_fx( hCPE, output_fx, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_LB, 0, 0, q, q_DFT );
429 :
430 : /* BPF */
431 2 : IF( st->p_bpf_noise_buf_32 )
432 : {
433 2 : Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( *q, Q11 ) ); /*q*/
434 2 : stereo_dft_dec_analyze_fx( hCPE, st->p_bpf_noise_buf_32, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_BPF, 0, 0, q, q_DFT );
435 : }
436 : }
437 : ELSE
438 : {
439 : /* ACELP */
440 95801 : FOR( i = 0; i < ( NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) - delay_dft_dec_lb ); i++ )
441 : {
442 92310 : hCPE->input_mem_LB_fx[0][i] = 0;
443 92310 : move32();
444 : }
445 : /* ACELP fading-in*/
446 3491 : Word16 qdelay_dft_dec_lb = norm_l( delay_dft_dec_lb );
447 3491 : Word32 delay_dft_dec_lb_inv = (Word32) ( calc_inv / delay_dft_dec_lb );
448 65031 : FOR( i = 0; i < delay_dft_dec_lb; i++ )
449 : {
450 123080 : hCPE->input_mem_LB_fx[0][( ( NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_dft_dec_lb ) + i )] =
451 61540 : Mpy_32_32( hCPE->input_mem_LB_fx[0][( NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_dft_dec_lb ) + i], L_shl( i, qdelay_dft_dec_lb ) ); /*Q11 + qdelay_dft_dec_lb -31*/
452 61540 : move32();
453 123080 : hCPE->input_mem_LB_fx[0][( ( NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_dft_dec_lb ) + i )] =
454 61540 : L_shl( Mpy_32_32( hCPE->input_mem_LB_fx[0][( ( NS2SA( st->L_frame * FRAMES_PER_SEC, STEREO_DFT32MS_OVL_NS ) - delay_dft_dec_lb ) + i )], delay_dft_dec_lb_inv ), sub( Q31, qdelay_dft_dec_lb ) ); /*Q11*/
455 61540 : move32();
456 : }
457 3491 : stereo_dft_dec_analyze_fx( hCPE, output_fx, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_LB, 0, 0, q, q_DFT );
458 :
459 : /* BPF */
460 3491 : IF( st->p_bpf_noise_buf_32 )
461 : {
462 1706 : Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( *q, Q11 ) ); /*q*/
463 1706 : stereo_dft_dec_analyze_fx( hCPE, st->p_bpf_noise_buf_32, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_BPF, 0, 0, q, q_DFT );
464 : }
465 :
466 : /* Fading-in TD-BWE, Fading-out FB-TCX*/
467 3491 : Copy32( synth_fx, synth_tmp_fx, output_frame ); /*q*/
468 3491 : IF( NE_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) )
469 : {
470 1684 : Word16 qdelay_dft_dec = norm_l( delay_dft_dec );
471 1684 : Word32 delay_dft_dec_inv = (Word32) ( calc_inv / delay_dft_dec );
472 1684 : Word32 delay_dft_dec_fx = L_shl( delay_dft_dec, qdelay_dft_dec );
473 84904 : FOR( i = 0; i < delay_dft_dec; i++ ) /* 1.25 ms of hb_synth fade-in and TCX fade-out */
474 : {
475 249660 : hCPE->input_mem_fx[0][( ( NS2SA_FX2( L_mult0( L_frameTCX, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) - delay_dft_dec ) + i )] = L_add(
476 83220 : Mpy_32_32( hb_synth_fx[( ( delay_tdbwe - delay_dft_dec ) + i )], L_shl( i, qdelay_dft_dec ) ),
477 83220 : Mpy_32_32( hCPE->input_mem_fx[0][( ( NS2SA_FX2( L_mult0( L_frameTCX, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) - delay_dft_dec ) + i )], L_sub( delay_dft_dec_fx, L_shl( i, qdelay_dft_dec ) ) ) ); /*Q11 + qdelay_dft_dec - 31*/
478 83220 : move32();
479 83220 : hCPE->input_mem_fx[0][( ( NS2SA_FX2( L_mult0( L_frameTCX, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) - delay_dft_dec ) + i )] = L_shl(
480 83220 : Mpy_32_32( hCPE->input_mem_fx[0][( ( NS2SA_FX2( L_mult0( L_frameTCX, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) - delay_dft_dec ) + i )], delay_dft_dec_inv ),
481 83220 : sub( Q31, qdelay_dft_dec ) ); /*Q11*/
482 83220 : move32();
483 : }
484 84904 : FOR( i = 0; i < delay_dft_dec; i++ ) /* 1.25 ms of hb_synth fade out. ICBWE fade in performed in time domain here */
485 : {
486 83220 : synth_tmp_fx[i] = Mpy_32_32( hb_synth_fx[( ( delay_tdbwe - delay_dft_dec ) + i )], L_sub( delay_dft_dec_fx, L_shl( i, qdelay_dft_dec ) ) ); /*q + qdelay_dft_dec - 31*/
487 83220 : move32();
488 83220 : synth_tmp_fx[i] = L_shl( Mpy_32_32( synth_tmp_fx[i], delay_dft_dec_inv ), sub( Q31, qdelay_dft_dec ) ); /*q*/
489 83220 : move32();
490 : }
491 :
492 1249984 : FOR( ; i < output_frame; i++ )
493 : {
494 1248300 : synth_tmp_fx[i] = 0;
495 1248300 : move32();
496 : }
497 : }
498 : }
499 :
500 :
501 3493 : IF( sba_dirac_stereo_dtx_flag )
502 : {
503 2 : stereo_dft_dec_analyze_fx( hCPE, synth_tmp_fx, DFT_fx, 0, output_frame, output_frame, DFT_STEREO_DEC_ANA_FB_ADD, 0, 0, q, q_DFT );
504 : }
505 3491 : ELSE IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) )
506 : {
507 1807 : stereo_dft_dec_analyze_fx( hCPE, synth_tmp_fx, DFT_fx, 0, output_frame, output_frame, DFT_STEREO_DEC_ANA_HB_ADD, 1, 0, q, q_DFT );
508 : }
509 : ELSE
510 : {
511 1684 : stereo_dft_dec_analyze_fx( hCPE, synth_tmp_fx, DFT_fx, 0, output_frame, output_frame, DFT_STEREO_DEC_ANA_FB_ADD, 1, 0, q, q_DFT );
512 : }
513 : }
514 : ELSE /* ACELP -> ACELP */
515 : {
516 44168 : test();
517 44168 : test();
518 44168 : test();
519 44168 : test();
520 44168 : IF( sba_dirac_stereo_dtx_flag && LE_32( st->core_brate, SID_2k40 ) && EQ_16( st->cng_type, FD_CNG ) )
521 : {
522 13 : set32_fx( output_fx, 0, st->L_frame );
523 : }
524 : /* this needs an indication FOR sba2stereo in general */
525 44155 : ELSE IF( EQ_16( hCPE->element_mode, IVAS_SCE ) && LE_32( st->last_core_brate, SID_2k40 ) && EQ_16( st->cng_type, FD_CNG ) )
526 : {
527 2 : L_lerp_fx_q11( hCPE->input_mem_fx[0], hCPE->input_mem_LB_fx[0], NS2SA_FX2( L_mult0( st->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ), NS2SA_FX2( L_mult0( output_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_OVL_NS ) );
528 : }
529 :
530 : /* ACELP synthesis @ internal sampling rate */
531 :
532 44168 : stereo_dft_dec_analyze_fx( hCPE, output_fx, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_LB, 0, 0, q, q_DFT );
533 :
534 : /* BPF */
535 44168 : IF( st->p_bpf_noise_buf_32 )
536 : {
537 39193 : Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( *q, Q11 ) ); /*q*/
538 39193 : stereo_dft_dec_analyze_fx( hCPE, st->p_bpf_noise_buf_32, DFT_fx, 0, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_BPF, 0, 0, q, q_DFT );
539 : }
540 :
541 : /* BWE */
542 44168 : test();
543 44168 : test();
544 44168 : test();
545 44168 : test();
546 44168 : IF( sba_dirac_stereo_dtx_flag && LE_32( st->core_brate, SID_2k40 ) && EQ_16( st->cng_type, FD_CNG ) )
547 : {
548 13 : stereo_dft_dec_analyze_fx( hCPE, synth_fx, DFT_fx, 0, output_frame, output_frame, DFT_STEREO_DEC_ANA_FB_ADD, 0, 0, q, q_DFT );
549 : }
550 44155 : ELSE IF( NE_16( st->extl, -1 ) || ( ( st->bws_cnt > 0 ) && EQ_16( st->core, ACELP_CORE ) ) )
551 : {
552 39196 : stereo_dft_dec_analyze_fx( hCPE, hb_synth_fx, DFT_fx, 0, output_frame, output_frame, DFT_STEREO_DEC_ANA_FB_ADD, 2, negate( delay_tdbwe ), q, q_DFT );
553 : }
554 : }
555 : }
556 :
557 : /*----------------------------------------------------------------*
558 : * enhanced stereo filling: allpass filter
559 : *----------------------------------------------------------------*/
560 :
561 89316 : IF( EQ_16( hCPE->hStereoDft->hConfig->res_pred_mode, STEREO_DFT_RESPRED_ESF ) )
562 : {
563 44154 : IF( EQ_32( st->sr_core, INT_FS_12k8 ) )
564 : {
565 23323 : ap_fade_len = STEREO_DFT_ALLPASS_FADELEN_12k8;
566 23323 : move16();
567 23323 : ap_fade_len_inv = 67108864; /*1/32 in Q31*/
568 23323 : move32();
569 : }
570 : ELSE
571 : {
572 20831 : ap_fade_len = STEREO_DFT_ALLPASS_FADELEN_16k;
573 20831 : move16();
574 20831 : ap_fade_len_inv = 53687091; /*1/40 in Q31*/
575 20831 : move32();
576 : }
577 :
578 44154 : qap_fade_len = norm_l( ap_fade_len );
579 44154 : ap_fade_len_fx = L_shl( ap_fade_len, qap_fade_len );
580 :
581 44154 : test();
582 44154 : test();
583 44154 : test();
584 44154 : test();
585 44154 : test();
586 44154 : IF( EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) || EQ_16( st->core, HQ_CORE ) || ( EQ_16( st->bfi, 1 ) && EQ_16( st->core, ACELP_CORE ) && EQ_16( st->con_tcx, 1 ) ) )
587 17185 : {
588 17185 : Word16 numZeros = (Word16) ( NS2SA_FX2( st->sr_core, N_ZERO_MDCT_NS ) ); /*Q0*/
589 : Word32 tmp_fade_fx[max( STEREO_DFT_ALLPASS_FADELEN_12k8, STEREO_DFT_ALLPASS_FADELEN_16k )];
590 :
591 17185 : Copy32( st->hHQ_core->old_out_LB_fx32 + numZeros, hCPE->hStereoDft->ap_fade_mem_fx, ap_fade_len ); /*st->hHQ_core->q_old_outLB_fx*/
592 17185 : hCPE->hStereoDft->q_ap_fade_mem_fx = st->hHQ_core->Q_old_out_fx32;
593 17185 : move16();
594 :
595 17185 : test();
596 17185 : test();
597 17185 : test();
598 17185 : test();
599 17185 : test();
600 17185 : IF( EQ_16( st->last_core, ACELP_CORE ) && !( EQ_16( st->prev_bfi, 1 ) && EQ_16( st->last_core, ACELP_CORE ) && EQ_16( st->last_con_tcx, 1 ) ) && !st->tcxonly )
601 : {
602 1163 : Copy32( tcx_core_buf_fx, pAp_input_fx, st->L_frame ); /*q*/
603 : }
604 : ELSE
605 : {
606 16022 : Copy32( output_fx, pAp_input_fx, st->L_frame ); /*q*/
607 : }
608 :
609 17185 : IF( EQ_16( st->last_core, ACELP_CORE ) && EQ_16( EQ_16( st->prev_bfi, 1 ) && EQ_16( st->last_core, ACELP_CORE ) && EQ_16( st->last_con_tcx, 1 ), 0 ) && !st->tcxonly ) /* ACELP -> TCX/HQ-Core */
610 : {
611 1163 : Copy32( tcx_core_buf_fx, tmp_fade_fx, ap_fade_len ); /*q*/
612 44571 : FOR( i = 0; i < ap_fade_len; i++ )
613 : {
614 43408 : pAp_input_fx[i] = L_add(
615 : Mpy_32_32( pAp_input_fx[i], L_shl( i, qap_fade_len ) ),
616 : Mpy_32_32( tmp_fade_fx[i], L_sub( ap_fade_len_fx, L_shl( i, qap_fade_len ) ) ) ); /*q + qap_fade_len - 31*/
617 43408 : move32();
618 43408 : pAp_input_fx[i] = L_shl( Mpy_32_32( pAp_input_fx[i], ap_fade_len_inv ), sub( Q31, qap_fade_len ) ); /*q*/
619 43408 : move32();
620 : }
621 : }
622 : }
623 : ELSE
624 : {
625 26969 : Copy32( output_fx, pAp_input_fx, st->L_frame ); /*q*/
626 26969 : IF( NE_16( st->last_core, ACELP_CORE ) ) /* TCX/HQ-Core -> ACELP */
627 : {
628 2582 : Word16 shift = sub( hCPE->hStereoDft->q_ap_fade_mem_fx, q_DFT[0] );
629 92326 : FOR( i = 0; i < ap_fade_len; i++ )
630 : {
631 179488 : pAp_input_fx[i] = L_add(
632 : Mpy_32_32( pAp_input_fx[i], L_shl( i, qap_fade_len ) ),
633 89744 : Mpy_32_32( L_shr( hCPE->hStereoDft->ap_fade_mem_fx[i], shift ), L_sub( ap_fade_len_fx, L_shl( i, qap_fade_len ) ) ) ); /*q + qap_fade_len - 31*/
634 89744 : move32();
635 89744 : pAp_input_fx[i] = L_shl( Mpy_32_32( pAp_input_fx[i], ap_fade_len_inv ), sub( Q31, qap_fade_len ) ); /*q*/
636 89744 : move32();
637 : }
638 : }
639 : }
640 44154 : predelay = NS2SA_FX2( st->sr_core, DELAY_BWE_TOTAL_NS ); /*Q0*/
641 44154 : move16();
642 :
643 : /* apply predelay to have same overall filter delay FOR all cases */
644 :
645 44154 : delay_signal_q_adj_fx( pAp_input_fx, st->L_frame, hCPE->hStereoDft->ap_delay_mem_fx, predelay, *q, hCPE->hStereoDft->q_ap_delay_mem_fx );
646 :
647 : /* input zeroes FOR transient frames */
648 44154 : IF( hCPE->hStereoDft->attackPresent )
649 : {
650 1408 : IF( hCPE->hStereoDft->ap_wasTransient )
651 : {
652 107 : set32_fx( pAp_input_fx, 0, ap_fade_len );
653 : }
654 : ELSE
655 : {
656 48669 : FOR( i = 0; i < ap_fade_len; i++ )
657 : {
658 47368 : pAp_input_fx[i] = Mpy_32_32( pAp_input_fx[i], L_sub( ap_fade_len_fx, L_shl( i, qap_fade_len ) ) ); /*q + qap_fade_len - 31*/
659 47368 : move32();
660 47368 : pAp_input_fx[i] = L_shl( Mpy_32_32( pAp_input_fx[i], ap_fade_len_inv ), sub( Q31, qap_fade_len ) ); /*q*/
661 47368 : move32();
662 : }
663 : }
664 1408 : set32_fx( pAp_input_fx + ap_fade_len, 0, st->L_frame - ap_fade_len );
665 1408 : hCPE->hStereoDft->ap_wasTransient = 1;
666 1408 : move16();
667 : }
668 42746 : ELSE IF( hCPE->hStereoDft->ap_wasTransient )
669 : {
670 47972 : FOR( i = 0; i < ap_fade_len; i++ )
671 : {
672 46688 : pAp_input_fx[i] = Mpy_32_32( pAp_input_fx[i], L_shl( i, qap_fade_len ) ); /*q + qap_fade_len - 31*/
673 46688 : move32();
674 46688 : pAp_input_fx[i] = L_shl( Mpy_32_32( pAp_input_fx[i], ap_fade_len_inv ), sub( Q31, qap_fade_len ) ); /*q*/
675 46688 : move32();
676 : }
677 1284 : hCPE->hStereoDft->ap_wasTransient = 0;
678 1284 : move16();
679 : }
680 :
681 : /* apply 5-stage allpass, each stage consisting of a nested allpass pair */
682 44154 : filter_with_allpass_fx( pAp_input_fx, pAp_input_fx, st->L_frame, &hCPE->hStereoDft->ap1, *q );
683 44154 : filter_with_allpass_fx( pAp_input_fx, pAp_input_fx, st->L_frame, &hCPE->hStereoDft->ap2, *q );
684 44154 : filter_with_allpass_fx( pAp_input_fx, pAp_input_fx, st->L_frame, &hCPE->hStereoDft->ap3, *q );
685 :
686 : /* apply DFT to allpass-filtered signal */
687 44154 : stereo_dft_dec_analyze_fx( hCPE, pAp_input_fx, DFT_fx, 1, st->L_frame, output_frame, DFT_STEREO_DEC_ANA_FB, 0, 0, q, q_DFT );
688 44154 : hCPE->hStereoDft->q_ap_delay_mem_fx = *q;
689 44154 : move16();
690 : }
691 :
692 89316 : IF( EQ_16( st->core, ACELP_CORE ) )
693 : {
694 58068 : IF( !use_cldfb_for_dft ) /* Skip this FOR DFT Stereo mono output at non-residual bitrates */
695 : {
696 36595 : L_lerp_fx_q11( output_fx, synth_fx, output_frame, hCPE->hCoreCoder[0]->L_frame ); /* Dirty resampling, but should be good enough FOR ECU analysis */
697 : }
698 58068 : test();
699 58068 : test();
700 58068 : test();
701 58068 : test();
702 58068 : test();
703 58068 : IF( !use_cldfb_for_dft || ( ( EQ_32( st->core_brate, FRAME_NO_DATA ) || EQ_32( st->core_brate, SID_2k40 ) ) && EQ_16( st->cng_type, LP_CNG ) && EQ_16( st->extl, SWB_CNG ) && EQ_16( hCPE->nchan_out, 1 ) ) )
704 : {
705 37422 : v_add_fx( synth_fx, hb_synth_fx, synth_fx, output_frame ); /* Use one channel TD-BWE FOR ECU analysis buffer */ /*q*/
706 : }
707 : }
708 :
709 :
710 89316 : return;
711 : }
|