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 "ivas_cnst.h"
39 : #include "prot_fx.h"
40 : #include "ivas_prot_fx.h"
41 : #include "wmc_auto.h"
42 : #include "rom_com.h"
43 : #include "ivas_rom_com.h"
44 : #include "ivas_rom_com_fx.h"
45 :
46 :
47 : #define Q_icBWE 16
48 :
49 : /*-------------------------------------------------------------------*
50 : * ic_bwe_dec_reset()
51 : *
52 : * core switching reset of IC BWE memory
53 : *-------------------------------------------------------------------*/
54 :
55 16099 : static void ic_bwe_dec_reset_fx(
56 : STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo ICBWE handle */
57 : )
58 : {
59 : /* unscaled & scaled SHB synthesis memory */
60 16099 : set32_fx( hStereoICBWE->mem_syn_shb_nonref_fx, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */
61 16099 : set32_fx( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, 0, LPC_SHB_ORDER );
62 16099 : set32_fx( hStereoICBWE->mem_syn_shb_ola_nonref_fx, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */
63 :
64 16099 : hStereoICBWE->prev_Q_syn_shb_nonref = 31;
65 16099 : move16();
66 16099 : hStereoICBWE->prev_Q_lpc_shbsynth_nonref = 31;
67 16099 : move16();
68 16099 : hStereoICBWE->prev_Q_syn_shb_ola_nonref = 31;
69 16099 : move16();
70 :
71 : /* inter-channel BWE SP and GSP mem reset */
72 16099 : hStereoICBWE->memShbSpecMapping_fx = 0;
73 16099 : move32();
74 16099 : hStereoICBWE->prev_Q_memshbspec = 31;
75 16099 : move16();
76 :
77 16099 : set32_fx( hStereoICBWE->memShbHilbert_nonref_fx, 0, HILBERT_MEM_SIZE );
78 16099 : set32_fx( hStereoICBWE->memShbInterp_nonref_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) );
79 16099 : set32_fx( hStereoICBWE->memShb_fsout_nonref_fx, 0, INTERP_3_2_MEM_LEN );
80 :
81 16099 : hStereoICBWE->prev_Q_hilb = 31;
82 16099 : move16();
83 16099 : hStereoICBWE->prev_Q_interp = 31;
84 16099 : move16();
85 16099 : hStereoICBWE->prev_Q_fsout = 31;
86 16099 : move16();
87 :
88 16099 : hStereoICBWE->syn_dm_phase_nonref = 0;
89 16099 : move16();
90 :
91 16099 : return;
92 : }
93 :
94 :
95 95958 : static Word16 FindScale(
96 : Word32 *buff, /* Q_buff */
97 : Word16 len, /* Q0 */
98 : Word16 Q_buff,
99 : Word16 Q_prev )
100 : {
101 : Word32 maxVal;
102 : Word16 norm_shift, Q_out;
103 :
104 95958 : maximum_abs_32_fx( buff, len, &maxVal );
105 95958 : norm_shift = norm_l( maxVal );
106 95958 : if ( maxVal == 0 )
107 : {
108 11153 : norm_shift = 31;
109 11153 : move16();
110 : }
111 :
112 95958 : Q_out = s_min( Q_prev, add( Q_buff, norm_shift ) );
113 :
114 95958 : return Q_out;
115 : }
116 :
117 :
118 145402 : void stereo_icBWE_dec_fx(
119 : CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */
120 : Word32 *synthRef_fx, /* i/o: Reference channel HB synthesis at output Fs Q11 */
121 : Word32 *synth_fx, /* o : Non reference channel HB synthesis at output Fs Q11 */
122 : const Word16 *fb_synth_ref_fx, /* i : ref. high-band synthesis 16-20 kHz Q_white_exc*/
123 : const Word16 *voice_factors_fx, /* i : voicing factors Q15 */
124 : const Word16 output_frame, /* i : frame length Q0 */
125 : Word16 *Q_syn /* i : Q of synth and synthRef buffers */
126 : ,
127 : const Word16 Q_white_exc /* i : Q of fb_synth_ref_fx */
128 : )
129 : {
130 : Word16 i, j, k, nbSubFr;
131 : Decoder_State *st; /* i/o: decoder state structure, primary channel */
132 : Word16 spIndx, gsIndx;
133 : Word32 excSHB_nonref_fx[L_FRAME16k];
134 : Word32 shb_synth_nonref_fx[L_FRAME16k + L_SHB_LAHEAD];
135 : Word32 error_fx[L_FRAME32k];
136 : Word16 nlMixFac_fx[NB_SUBFR16k];
137 : Word16 specMapping_fx;
138 : Word16 fb_synth_nonref_fx[L_FRAME48k];
139 : Word32 prev_pow_fx, curr_pow_fx, maxVal1, maxVal;
140 : Word16 scale_fx, e_scale_fx;
141 : Word16 alpha_fx, winSlope_fx, winLen_fx;
142 : Word16 prevgsMapping_fx;
143 : Word16 temp1_fx, temp2_fx;
144 : Word16 icbweM2Ref_fx, ratio_L_fx;
145 : Word16 gsMapping_fx;
146 : Word32 hb_nrg_fx;
147 : Word16 Q_syn_shb;
148 : Word16 shift_prev_pow, synthRef_shift;
149 : Word32 L_tmp;
150 : Word16 tmp;
151 : Word32 L_nlExc16k, L_mixExc16k;
152 :
153 145402 : STEREO_DFT_DEC_DATA_HANDLE hStereoDft = hCPE->hStereoDft;
154 145402 : STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE;
155 145402 : st = hCPE->hCoreCoder[0];
156 :
157 : /*--------------------------------------------------------------------*
158 : * skip IC-BWE in case of mono DMX output *
159 : * -------------------------------------------------------------------*/
160 :
161 145402 : test();
162 145402 : test();
163 145402 : test();
164 145402 : IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && GT_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) )
165 : {
166 5345 : hCPE->hStereoDft->core_hist[0] = st->core; /* Q0 */
167 5345 : move16();
168 :
169 5345 : return;
170 : }
171 140057 : ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) )
172 : {
173 17001 : return;
174 : }
175 :
176 : /*--------------------------------------------------------------------*
177 : * skip IC-BWE in case of SID or NO_DATA frame
178 : * -------------------------------------------------------------------*/
179 :
180 123056 : IF( LE_32( st->core_brate, SID_2k40 ) )
181 : {
182 9642 : return;
183 : }
184 :
185 : /*--------------------------------------------------------------------*
186 : * TD high band stereo filling *
187 : * -------------------------------------------------------------------*/
188 :
189 : /* update buffers for TD stereo filling */
190 113414 : IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
191 : {
192 31231 : hb_nrg_fx = 0;
193 31231 : move32();
194 31231 : move32();
195 31231 : maximum_abs_32_fx( synthRef_fx, output_frame, &maxVal );
196 31231 : synthRef_shift = norm_l( maxVal );
197 31231 : if ( maxVal == 0 )
198 : {
199 12936 : synthRef_shift = 31;
200 12936 : move16();
201 : }
202 31231 : synthRef_shift = sub( synthRef_shift, shr( add( find_guarded_bits_fx( shr( output_frame, 1 ) ), 1 ), 1 ) );
203 31231 : test();
204 31231 : IF( EQ_16( st->core, ACELP_CORE ) || EQ_16( st->last_core, ACELP_CORE ) )
205 21152 : {
206 21152 : Word64 W_tmp = 0;
207 21152 : move64();
208 21152 : tmp = shl_sat( 1, synthRef_shift );
209 6866752 : FOR( i = 0; i < output_frame / 2; i++ )
210 : {
211 : // needed to be adjusted for q
212 6845600 : L_tmp = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn + SynthRef_shift - 15 */
213 6845600 : W_tmp = W_mac_32_32( W_tmp, L_tmp, L_tmp ); /* 2 * (Qsyn + SynthRef_shift) - 29 */
214 : }
215 21152 : hb_nrg_fx = W_round48_L( W_tmp ); /* 2 * (Qsyn + SynthRef_shift) - 45 */
216 21152 : hCPE->hStereoDft->hb_nrg_subr_fx[0] = hb_nrg_fx; /* 2 * (Qsyn + SynthRef_shift) - 45 */
217 21152 : move32();
218 21152 : hStereoDft->q_hb_nrg_subr = sub( shl( add( *Q_syn, synthRef_shift ), 1 ), 45 );
219 21152 : move16();
220 21152 : W_tmp = 0;
221 21152 : move64();
222 6866752 : FOR( ; i < output_frame; i++ )
223 : {
224 6845600 : L_tmp = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn + SynthRef_shift - 15 */
225 6845600 : W_tmp = W_mac_32_32( W_tmp, L_tmp, L_tmp ); /* 2 * (Qsyn + SynthRef_shift) - 45 */
226 : }
227 :
228 21152 : hCPE->hStereoDft->hb_nrg_subr_fx[1] = W_round48_L( W_tmp ); // 2 * (Qsyn + SynthRef_shift) - 45
229 21152 : hb_nrg_fx = L_add( hCPE->hStereoDft->hb_nrg_subr_fx[0], hCPE->hStereoDft->hb_nrg_subr_fx[1] ); // 2 * (Qsyn + SynthRef_shift) - 45
230 :
231 :
232 21152 : Copy32( synthRef_fx, hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, output_frame ); /* Qsynth */
233 : }
234 : ELSE
235 : {
236 10079 : set32_fx( hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, 0, output_frame );
237 10079 : hCPE->hStereoDft->hb_nrg_subr_fx[0] = 0;
238 10079 : move32();
239 10079 : hCPE->hStereoDft->hb_nrg_subr_fx[1] = 0;
240 10079 : move32();
241 : }
242 31231 : hCPE->hStereoDft->hb_nrg_subr_fx[0] = ( Mpy_32_16_1( hCPE->hStereoDft->hb_nrg_subr_fx[0], shl( shr( hCPE->hStereoDft->NFFT, 1 ), 6 ) ) ); // 2 * (Qsynth + SynthRef_shift) - 40 // 2 * (Qx + SynthRef_shift) - 31 - 15
243 31231 : move32();
244 31231 : hCPE->hStereoDft->hb_nrg_subr_fx[1] = ( Mpy_32_16_1( hCPE->hStereoDft->hb_nrg_subr_fx[1], shl( shr( hCPE->hStereoDft->NFFT, 1 ), 6 ) ) ); // 2 * (Qsynth + SynthRef_shift) - 40
245 31231 : move32();
246 31231 : hCPE->hStereoDft->q_hb_nrg_subr = sub( shl( ( *Q_syn + synthRef_shift ), 1 ), 45 + 9 );
247 31231 : hCPE->hStereoDft->hb_nrg_fx[0] = hb_nrg_fx; // 2 * (Qx + SynthRef_shift) - 31
248 31231 : move32();
249 31231 : hCPE->hStereoDft->td_gain_fx[0] = 0;
250 31231 : move32();
251 31231 : hCPE->hStereoDft->core_hist[0] = st->core;
252 31231 : move16();
253 : }
254 :
255 : /*--------------------------------------------------------------------*
256 : * IC-BWE *
257 : * -------------------------------------------------------------------*/
258 113414 : test();
259 113414 : test();
260 113414 : test();
261 113414 : test();
262 113414 : IF( st->core != ACELP_CORE || EQ_16( st->extl, -1 ) || ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && NE_16( hCPE->hCoreCoder[0]->tdm_LRTD_flag, 0 ) ) )
263 : {
264 95561 : return;
265 : }
266 17853 : ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && LE_32( st->core_brate, SID_2k40 ) )
267 : {
268 0 : Copy32( synthRef_fx, synth_fx, output_frame ); /* Qsynth */
269 0 : return;
270 : }
271 :
272 :
273 17853 : set16_fx( fb_synth_nonref_fx, 0, L_FRAME48k );
274 :
275 : /* core switching reset */
276 17853 : test();
277 17853 : IF( st->last_core != ACELP_CORE || EQ_16( st->bwidth, (Word16) WB ) )
278 : {
279 3210 : ic_bwe_dec_reset_fx( hStereoICBWE );
280 :
281 3210 : IF( st->last_core != ACELP_CORE )
282 : {
283 574 : hStereoICBWE->prevSpecMapping_fx = 0;
284 574 : move16();
285 574 : hStereoICBWE->prevgsMapping_fx = 16384; /* 1.f in Q14 */
286 574 : move16();
287 574 : hStereoICBWE->icbweM2Ref_prev_fx = 16384; /* 1.f in Q14 */
288 574 : move16();
289 : }
290 :
291 3210 : IF( EQ_16( st->bwidth, WB ) )
292 : {
293 : /* copy to outputHB and reset hb_synth values */
294 2688 : Copy32( synthRef_fx, synth_fx, output_frame );
295 :
296 2688 : IF( EQ_16( st->element_mode, IVAS_CPE_TD ) )
297 : {
298 3 : hStereoICBWE->prevSpecMapping_fx = 0;
299 3 : move16();
300 3 : hStereoICBWE->prevgsMapping_fx = 16384; /* 1.f in Q14 */
301 3 : move16();
302 3 : hStereoICBWE->icbweM2Ref_prev_fx = 16384; /* 1.f in Q14 */
303 3 : move16();
304 : }
305 2685 : ELSE IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) )
306 : {
307 : Word32 temp;
308 2685 : hStereoICBWE->refChanIndx_bwe = L_CH_INDX;
309 2685 : move16();
310 2685 : hStereoICBWE->prevSpecMapping_fx = 0;
311 2685 : move16();
312 :
313 2685 : prevgsMapping_fx = hStereoICBWE->prevgsMapping_fx;
314 2685 : move16();
315 2685 : temp = L_shr( hStereoDft->side_gain_fx[2 * STEREO_DFT_BAND_MAX + hStereoDft->nbands - 1], 1 ); // Q30
316 2685 : icbweM2Ref_fx = extract_h( L_add( ONE_IN_Q30, temp ) ); // Q14
317 2685 : gsMapping_fx = extract_h( L_sub( ONE_IN_Q30, temp ) ); // Q14
318 :
319 2685 : winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); //(int16_t)((SHB_OVERLAP_LEN * st->output_Fs) / 16000); Q0
320 2685 : winSlope_fx = div_s( 1, winLen_fx ); /* Q15 */
321 2685 : alpha_fx = winSlope_fx; /* Q15 */
322 2685 : move16();
323 60145 : FOR( i = 0; i < winLen_fx; i++ )
324 : {
325 : /*synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) );*/
326 57460 : temp1_fx = sub( 32767, alpha_fx ); /* 1.f in Q15 */
327 57460 : L_tmp = L_mult( alpha_fx, icbweM2Ref_fx ); // Q15 + Q14 + 1
328 57460 : L_tmp = L_mac( L_tmp, temp1_fx, hStereoICBWE->icbweM2Ref_prev_fx ); // Q15 + Q14 + 1
329 57460 : synthRef_fx[i] = L_shl( Mpy_32_32( synthRef_fx[i], L_tmp ), 1 ); // Qsynth
330 57460 : move32();
331 : /*synth[i] *= ( alpha * ( gsMapping ) + ( 1.0f - alpha ) * ( prevgsMapping ) );*/
332 57460 : L_tmp = L_mult( alpha_fx, gsMapping_fx ); // Q15 + Q14 + 1
333 57460 : L_tmp = L_mac( L_tmp, temp1_fx, prevgsMapping_fx ); // Q15 + Q14 +1
334 57460 : synth_fx[i] = L_shl( Mpy_32_32( synth_fx[i], L_tmp ), 1 ); // Qsynth
335 57460 : move32();
336 57460 : alpha_fx = add_sat( alpha_fx, winSlope_fx ); /* Q15 */
337 : }
338 864585 : FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ )
339 : {
340 861900 : synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); // Qsyth - 1
341 861900 : move32();
342 861900 : synth_fx[i] = Mpy_32_16_1( synth_fx[i], gsMapping_fx ); // Qsynth - 1
343 861900 : move32();
344 : }
345 2685 : hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; // Q14
346 2685 : move16();
347 2685 : hStereoICBWE->prevgsMapping_fx = gsMapping_fx; // Q14
348 2685 : move16();
349 :
350 2685 : *Q_syn = sub( *Q_syn, 1 );
351 : }
352 :
353 2688 : return;
354 : }
355 : }
356 :
357 15165 : IF( st->bfi == 0 )
358 : {
359 14949 : hStereoICBWE->refChanIndx_bwe = get_next_indice_fx( st, STEREO_ICBWE_REFBITS );
360 14949 : IF( EQ_16( st->flag_ACELP16k, 1 ) )
361 : {
362 8766 : spIndx = get_next_indice_fx( st, STEREO_ICBWE_SPBITS ); /* Q0 */
363 : }
364 : ELSE
365 : {
366 6183 : spIndx = 3;
367 6183 : move16();
368 : }
369 14949 : IF( EQ_16( st->element_mode, IVAS_CPE_TD ) )
370 : {
371 34 : gsIndx = get_next_indice_fx( st, STEREO_ICBWE_GSBITS ); /* Q0 */
372 : }
373 : ELSE
374 : {
375 14915 : gsIndx = get_next_indice_fx( st, STEREO_ICBWE_GSBITS_DFT ); /* Q0 */
376 : }
377 :
378 : /* Store indices in case of frame loss */
379 14949 : hStereoICBWE->prev_spIndx = spIndx; /* Q0 */
380 14949 : move16();
381 14949 : hStereoICBWE->prev_gsIndx = gsIndx; /* Q0 */
382 14949 : move16();
383 : }
384 : ELSE /*bfi*/
385 : {
386 : /* Retrieve last decoded indices */
387 216 : spIndx = hStereoICBWE->prev_spIndx; /* Q0 */
388 216 : move16();
389 216 : gsIndx = hStereoICBWE->prev_gsIndx; /* Q0 */
390 216 : move16();
391 216 : hStereoICBWE->refChanIndx_bwe = hStereoICBWE->prev_refChanIndx_bwe; /* Q0 */
392 216 : move16();
393 : }
394 :
395 : /* IC-BWE parameter de-quant */
396 : /* sp Mapping */
397 15165 : hStereoICBWE->prevSpecMapping_fx = usdequant_fx( spIndx, -19661 /* -0.6 in Q15 */, 3277 /* 0.2 in Q14 */ ); // Q15
398 :
399 : /* gs Mapping */
400 15165 : prevgsMapping_fx = hStereoICBWE->prevgsMapping_fx; // Q14
401 15165 : move16();
402 :
403 15165 : IF( EQ_16( st->element_mode, IVAS_CPE_TD ) )
404 : {
405 34 : hStereoICBWE->prevgsMapping_fx = pow_10_icbwe_gsMapping_tbl_fx[gsIndx]; /* Q14 */
406 34 : move16();
407 : }
408 : ELSE
409 : {
410 15131 : hStereoICBWE->prevgsMapping_fx = pow_10_icbwe_gsMappingDFT_tbl_fx[gsIndx]; /* Q14 */
411 15131 : move16();
412 : }
413 :
414 : // hStereoICBWE->prevgsMapping = powf( 10, hStereoICBWE->prevgsMapping );
415 :
416 15165 : specMapping_fx = hStereoICBWE->prevSpecMapping_fx; // Q15
417 15165 : move16();
418 15165 : gsMapping_fx = hStereoICBWE->prevgsMapping_fx; // Q14
419 15165 : move16();
420 :
421 15165 : test();
422 15165 : test();
423 15165 : IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && EQ_16( st->flag_ACELP16k, 1 ) )
424 : {
425 8556 : Copy( voice_factors_fx, nlMixFac_fx, NB_SUBFR16k ); // Q15
426 8556 : IF( hCPE->hStereoDftDmx != NULL )
427 : {
428 6 : test();
429 6 : IF( LT_32( hCPE->hStereoDftDmx->targetGain_fx, 268435456 /* 0.5 in Q29 */ ) || GT_32( hCPE->hStereoDftDmx->targetGain_fx, 1073741824 /* 2.0 in Q29 */ ) )
430 : {
431 0 : v_multc_fixed_16_16( voice_factors_fx, 16384 /* 0.5 in Q15 */, nlMixFac_fx, NB_SUBFR16k );
432 : }
433 : }
434 : ELSE
435 : {
436 8550 : test();
437 8550 : IF( LT_32( hCPE->hStereoTCA->targetGain_fx, 268435456 /* 0.5 in Q29 */ ) || GT_32( hCPE->hStereoTCA->targetGain_fx, 1073741824 /* 2.0 in Q29 */ ) )
438 : {
439 0 : v_multc_fixed_16_16( voice_factors_fx, 16384 /* 0.5 in Q15 */, nlMixFac_fx, NB_SUBFR16k );
440 : }
441 : }
442 :
443 : // nbSubFr = ( st->flag_ACELP16k == 0 ) ? NB_SUBFR : NB_SUBFR16k;
444 8556 : IF( st->flag_ACELP16k == 0 )
445 : {
446 0 : nbSubFr = NB_SUBFR;
447 0 : move16();
448 : }
449 : ELSE
450 : {
451 8556 : nbSubFr = NB_SUBFR16k;
452 8556 : move16();
453 : }
454 8556 : k = 0;
455 8556 : move16();
456 51336 : FOR( i = 0; i < nbSubFr; i++ )
457 : {
458 42780 : IF( EQ_16( hCPE->hCoreCoder[0]->coder_type, UNVOICED ) || EQ_16( hStereoICBWE->MSFlag, 1 ) )
459 : {
460 9305 : temp1_fx = 0;
461 9305 : move16();
462 9305 : temp2_fx = 32767; /* 1.0f in Q15 */
463 9305 : move16();
464 : }
465 : ELSE
466 : {
467 33475 : tmp = 0;
468 33475 : move16();
469 33475 : temp1_fx = Sqrt16( nlMixFac_fx[i], &tmp );
470 33475 : IF( LT_16( tmp, 0 ) )
471 : {
472 20998 : temp1_fx = shl( temp1_fx, tmp );
473 : }
474 33475 : tmp = 0;
475 33475 : move16();
476 33475 : temp2_fx = Sqrt16( sub( 32767 /* 1.0f in Q15 */, nlMixFac_fx[i] ), &tmp );
477 33475 : IF( LT_16( tmp, 0 ) )
478 : {
479 707 : temp2_fx = shl( temp2_fx, tmp );
480 : }
481 : }
482 :
483 2780700 : FOR( j = 0; j < L_FRAME16k / nbSubFr; j++ )
484 : {
485 : // common Q for addition
486 2737920 : L_nlExc16k = L_deposit_l( hStereoICBWE->nlExc16k_fx[k] ); // prev_q_bwe_exc - 16
487 2737920 : L_mixExc16k = L_deposit_l( hStereoICBWE->mixExc16k_fx[k] ); // Q_exc
488 2737920 : L_nlExc16k = L_shl( L_nlExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // Q_icBWE
489 2737920 : L_mixExc16k = L_shl( L_mixExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 25 ) ) ) ); // Q_icBWE
490 2737920 : excSHB_nonref_fx[k] = L_add( Mpy_32_16_1( L_nlExc16k, temp1_fx ), Mpy_32_16_1( L_mixExc16k, temp2_fx ) ); // Q_icBWE
491 2737920 : move32();
492 2737920 : k++;
493 : }
494 : }
495 :
496 : /* LP synthesis */
497 8556 : Q_syn_shb = 31;
498 8556 : move16();
499 :
500 8556 : Q_syn_shb = FindScale( hStereoICBWE->mem_syn_shb_nonref_fx, LPC_SHB_ORDER, hStereoICBWE->prev_Q_syn_shb_nonref, Q_syn_shb );
501 8556 : Q_syn_shb = FindScale( hStereoICBWE->lpSHBRef_fx, LPC_SHB_ORDER + 1, 12, Q_syn_shb );
502 8556 : Q_syn_shb = FindScale( excSHB_nonref_fx, L_FRAME16k, Q_icBWE, Q_syn_shb );
503 8556 : Q_syn_shb = FindScale( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, LPC_SHB_ORDER, hStereoICBWE->prev_Q_lpc_shbsynth_nonref, Q_syn_shb );
504 :
505 8556 : Q_syn_shb = sub( Q_syn_shb, 3 ); // gaurded bits
506 :
507 8556 : Scale_sig32( hStereoICBWE->lpSHBRef_fx, LPC_SHB_ORDER + 1, sub( Q_syn_shb, 12 ) ); // Q_syn_shb
508 8556 : Scale_sig32( excSHB_nonref_fx, L_FRAME16k, sub( Q_syn_shb, Q_icBWE ) ); // Q_syn_shb
509 8556 : Scale_sig32( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, LPC_SHB_ORDER, sub( Q_syn_shb, hStereoICBWE->prev_Q_lpc_shbsynth_nonref ) ); // Q_syn_shb
510 8556 : Scale_sig32( hStereoICBWE->mem_syn_shb_nonref_fx, L_SHB_LAHEAD, sub( Q_syn_shb, hStereoICBWE->prev_Q_syn_shb_nonref ) ); // Q_syn_shb
511 :
512 :
513 8556 : Copy32( hStereoICBWE->mem_syn_shb_nonref_fx, shb_synth_nonref_fx, L_SHB_LAHEAD ); // Q_syn_shb
514 :
515 8556 : E_UTIL_synthesis_fx( 0, hStereoICBWE->lpSHBRef_fx, excSHB_nonref_fx, shb_synth_nonref_fx + L_SHB_LAHEAD, L_FRAME16k, hStereoICBWE->mem_lpc_shbsynth_nonref_fx, 1, LPC_SHB_ORDER );
516 :
517 8556 : hStereoICBWE->prev_Q_lpc_shbsynth_nonref = Q_syn_shb;
518 8556 : move16();
519 :
520 8556 : maximum_abs_32_fx( shb_synth_nonref_fx, L_SHB_LAHEAD + 10 + L_SHB_LAHEAD + 10, &maxVal1 ); // Qsyn_shb
521 :
522 8556 : shift_prev_pow = sub( norm_l( maxVal1 ), find_guarded_bits_fx( L_SHB_LAHEAD + 10 ) );
523 :
524 8556 : prev_pow_fx = 0;
525 8556 : move32();
526 8556 : curr_pow_fx = 0;
527 8556 : move32();
528 265236 : FOR( i = 0; i < L_SHB_LAHEAD + 10; i++ )
529 : {
530 256680 : L_tmp = L_shl( shb_synth_nonref_fx[i], shift_prev_pow ); // Qsyn_shb + shift_prev_pow
531 256680 : prev_pow_fx = L_add( prev_pow_fx, Mpy_32_32( L_tmp, L_tmp ) ); /* 2 * ( Qsyn_shb + shift_prev_pow ) - 31 */
532 : }
533 265236 : FOR( i = 0; i < L_SHB_LAHEAD + 10; i++ )
534 : {
535 256680 : L_tmp = L_shl( shb_synth_nonref_fx[L_SHB_LAHEAD + 10 + i], shift_prev_pow ); // Qsyn_shb + shift_prev_pow
536 256680 : curr_pow_fx = L_add( curr_pow_fx, Mpy_32_32( L_tmp, L_tmp ) ); /* 2 * ( Qsyn_shb + shift_prev_pow ) - 31 */
537 : }
538 :
539 8556 : IF( prev_pow_fx == 0 )
540 : {
541 11 : e_scale_fx = 0;
542 11 : move16();
543 11 : scale_fx = 0;
544 11 : move16();
545 : }
546 : ELSE
547 : {
548 8545 : e_scale_fx = 0;
549 8545 : move16();
550 8545 : scale_fx = BASOP_Util_Divide3232_Scale( curr_pow_fx, prev_pow_fx, &e_scale_fx );
551 8545 : scale_fx = Sqrt16( scale_fx, &e_scale_fx );
552 : }
553 8556 : IF( e_scale_fx < 0 )
554 : {
555 889 : scale_fx = shl( scale_fx, e_scale_fx ); /* exp(e_scale_fx) */
556 889 : e_scale_fx = 0;
557 889 : move16();
558 : }
559 179676 : FOR( i = 0; i < L_SHB_LAHEAD; i++ )
560 : {
561 171120 : shb_synth_nonref_fx[i] = Mpy_32_16_1( shb_synth_nonref_fx[i], scale_fx ); // Qsyn_shb
562 171120 : move32();
563 : }
564 8556 : tmp = 3276; /* 0.1 in Q15 */
565 8556 : move16();
566 94116 : FOR( ; i < L_SHB_LAHEAD + 10; i++ )
567 : {
568 85560 : IF( EQ_16( e_scale_fx, 0 ) )
569 : {
570 45910 : temp1_fx = 32767; /* 1.0f in Q15 */
571 45910 : move16();
572 : }
573 : ELSE
574 : {
575 39650 : temp1_fx = shl( 1, sub( 15, e_scale_fx ) ); /* 15 - e_scale_fx */
576 39650 : move16();
577 : }
578 85560 : L_tmp = L_mult0( tmp, temp1_fx ); /* Q15 + Q15 - e_scale_fx */
579 85560 : L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0f in Q15 */, tmp ), scale_fx ); /* Q15 + Q15 - e_scale_fx */
580 85560 : shb_synth_nonref_fx[i] = Mpy_32_16_1( shb_synth_nonref_fx[i], shl( round_fx( L_tmp ), 1 ) ); // Q_syn_shb - e_scale_fx
581 85560 : move32();
582 85560 : IF( LT_16( tmp, 29492 /* 0.9f in Q15 */ ) )
583 : {
584 77004 : tmp = add( tmp, 3276 /* 0.1f in Q15 */ );
585 : }
586 : }
587 :
588 : /* spec and gs adjustment */
589 8556 : Q_syn_shb = sub( Q_syn_shb, e_scale_fx );
590 8556 : Scale_sig32( shb_synth_nonref_fx + L_SHB_LAHEAD + 10, L_FRAME16k - 10, -e_scale_fx ); /* Q_syn_shb */
591 :
592 8556 : tmp = 31;
593 8556 : move16();
594 8556 : tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp );
595 8556 : temp1_fx = norm_l( hStereoICBWE->memShbSpecMapping_fx );
596 8556 : IF( EQ_32( hStereoICBWE->memShbSpecMapping_fx, 0 ) )
597 : {
598 548 : temp1_fx = 31;
599 548 : move16();
600 : }
601 8556 : temp1_fx = add( temp1_fx, hStereoICBWE->prev_Q_memshbspec );
602 8556 : tmp = s_min( temp1_fx, tmp );
603 :
604 8556 : tmp = sub( tmp, 9 );
605 :
606 8556 : Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, sub( tmp, Q_syn_shb ) ); /* tmp */
607 8556 : hStereoICBWE->memShbSpecMapping_fx = L_shl( hStereoICBWE->memShbSpecMapping_fx, sub( tmp, hStereoICBWE->prev_Q_memshbspec ) ); /* tmp */
608 :
609 8556 : hStereoICBWE->prev_Q_memshbspec = tmp;
610 8556 : move16();
611 8556 : Q_syn_shb = tmp;
612 8556 : move16();
613 :
614 8556 : deemph_fx_32( shb_synth_nonref_fx + L_SHB_LAHEAD, specMapping_fx, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping_fx ) );
615 8556 : hStereoICBWE->prev_Q_memshbspec = Q_syn_shb;
616 8556 : move16();
617 8556 : Copy32( shb_synth_nonref_fx + L_FRAME16k, hStereoICBWE->mem_syn_shb_nonref_fx, L_SHB_LAHEAD ); /* Q_syn_shb */
618 8556 : hStereoICBWE->prev_Q_syn_shb_nonref = Q_syn_shb;
619 8556 : move16();
620 :
621 8556 : tmp = 31;
622 8556 : move16();
623 8556 : tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp );
624 8556 : tmp = FindScale( hStereoICBWE->mem_syn_shb_ola_nonref_fx, L_SHB_LAHEAD, hStereoICBWE->prev_Q_syn_shb_ola_nonref, tmp );
625 :
626 8556 : tmp = sub( tmp, 3 );
627 :
628 8556 : Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, sub( tmp, Q_syn_shb ) ); /* tmp */
629 8556 : Scale_sig32( hStereoICBWE->mem_syn_shb_ola_nonref_fx, L_SHB_LAHEAD, sub( tmp, hStereoICBWE->prev_Q_syn_shb_ola_nonref ) ); /* tmp */
630 :
631 8556 : ScaleShapedSHB_fx32( SHB_OVERLAP_LEN, shb_synth_nonref_fx, hStereoICBWE->mem_syn_shb_ola_nonref_fx, hStereoICBWE->gshapeRef_fx, ( Mpy_32_16_1( L_shl( hStereoICBWE->gFrameRef_fx, 1 ), mult_r( gsMapping_fx, 29492 /* 0.9 in Q15 */ ) ) ), window_shb_fx, subwin_shb_fx, &tmp, &temp1_fx );
632 :
633 8556 : hStereoICBWE->prev_Q_syn_shb_ola_nonref = tmp;
634 8556 : move16();
635 8556 : Q_syn_shb = tmp;
636 8556 : move16();
637 :
638 8556 : IF( EQ_16( st->extl, FB_TBE ) )
639 : {
640 4093 : v_multc_fixed_16_16( fb_synth_ref_fx, gsMapping_fx, fb_synth_nonref_fx, L_FRAME48k );
641 : }
642 :
643 : /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */
644 :
645 8556 : tmp = 31;
646 8556 : move16();
647 8556 : tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp );
648 8556 : tmp = FindScale( hStereoICBWE->memShbHilbert_nonref_fx, HILBERT_MEM_SIZE, hStereoICBWE->prev_Q_hilb, tmp );
649 8556 : tmp = FindScale( hStereoICBWE->memShbInterp_nonref_fx, 2 * ALLPASSSECTIONS_STEEP + 1, hStereoICBWE->prev_Q_interp, tmp );
650 :
651 8556 : tmp = sub( tmp, 3 );
652 :
653 8556 : Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, sub( tmp, Q_syn_shb ) ); /* tmp */
654 8556 : Scale_sig32( hStereoICBWE->memShbHilbert_nonref_fx, HILBERT_MEM_SIZE, sub( tmp, hStereoICBWE->prev_Q_hilb ) ); /* tmp */
655 8556 : Scale_sig32( hStereoICBWE->memShbInterp_nonref_fx, 2 * ALLPASSSECTIONS_STEEP + 1, sub( tmp, hStereoICBWE->prev_Q_interp ) ); /* tmp */
656 :
657 8556 : hStereoICBWE->prev_Q_hilb = tmp;
658 8556 : move16();
659 8556 : hStereoICBWE->prev_Q_interp = tmp;
660 8556 : move16();
661 :
662 8556 : Q_syn_shb = tmp;
663 8556 : move16();
664 :
665 8556 : GenSHBSynth_fx32( shb_synth_nonref_fx, error_fx, hStereoICBWE->memShbHilbert_nonref_fx, hStereoICBWE->memShbInterp_nonref_fx, st->L_frame, &( hStereoICBWE->syn_dm_phase_nonref ) );
666 : }
667 : ELSE
668 : {
669 6609 : Copy32( synthRef_fx, synth_fx, output_frame ); /* Q_syn */
670 :
671 6609 : winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); /* Q0 */
672 6609 : winSlope_fx = div_s( 1, winLen_fx ); /* Q15 */
673 6609 : alpha_fx = winSlope_fx; /* Q15 */
674 6609 : move16();
675 :
676 :
677 6609 : IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
678 : {
679 6597 : ratio_L_fx = 16384; /* 0.5 in Q15 */
680 6597 : move16();
681 : }
682 : ELSE
683 : {
684 12 : ratio_L_fx = extract_h( tdm_ratio_tabl_fx[hCPE->hStereoTD->tdm_last_ratio_idx] ); /* Q15 */
685 12 : move16();
686 : }
687 :
688 6609 : icbweM2Ref_fx = gsMapping_fx; /* Q14 */
689 6609 : move16();
690 6609 : IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX )
691 : {
692 :
693 2088 : IF( GE_16( ratio_L_fx, 3276 /* 0.1 in Q15 */ ) )
694 : {
695 2084 : tmp = mult_r( sub( 32767 /* 1.0 in Q15 */, ratio_L_fx ), sub( 32767 /* 1.0 in Q15 */, ratio_L_fx ) ); // Q15
696 2084 : tmp = mult_r( tmp, gsMapping_fx ); // Q14
697 2084 : tmp = mult_r( tmp, gsMapping_fx ); // Q13
698 2084 : IF( LT_16( tmp, 4096 /* 0.5 in Q13*/ ) )
699 : {
700 2080 : temp1_fx = 0;
701 2080 : move16();
702 2080 : temp2_fx = 0;
703 2080 : move16();
704 2080 : tmp = shl( tmp, 2 ); /* Q13 + Q2 */
705 2080 : icbweM2Ref_fx = Sqrt16( sub( 16384 /* 0.5 in Q15 */, tmp ), &temp1_fx );
706 2080 : icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, ratio_L_fx, &temp2_fx );
707 2080 : icbweM2Ref_fx = shl_sat( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14
708 : }
709 : ELSE
710 : {
711 4 : icbweM2Ref_fx = 0;
712 4 : move16();
713 : }
714 : }
715 : }
716 : ELSE
717 : {
718 4521 : IF( LE_16( ratio_L_fx, 29490 /* 0.9 in Q15*/ ) )
719 : {
720 4521 : tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15
721 4521 : tmp = mult_r( tmp, gsMapping_fx ); // Q14
722 4521 : tmp = mult_r( tmp, gsMapping_fx ); // Q13
723 4521 : IF( LT_16( tmp, 4096 /* 0.5 in Q13*/ ) )
724 : {
725 4521 : temp1_fx = 0;
726 4521 : move16();
727 4521 : temp2_fx = 0;
728 4521 : move16();
729 4521 : tmp = shl( tmp, 2 );
730 4521 : icbweM2Ref_fx = Sqrt16( sub( 16384 /* 0.5 in Q15 */, tmp ), &temp1_fx );
731 4521 : icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, sub( 32767, ratio_L_fx ), &temp2_fx );
732 4521 : icbweM2Ref_fx = shl_sat( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14
733 : }
734 : ELSE
735 : {
736 0 : icbweM2Ref_fx = 0;
737 0 : move16();
738 : }
739 : }
740 : }
741 :
742 6609 : icbweM2Ref_fx = s_max( gsMapping_fx, icbweM2Ref_fx );
743 :
744 248749 : FOR( i = 0; i < winLen_fx; i++ )
745 : {
746 242140 : L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */
747 242140 : L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0 in Q15*/, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); /* Q29 */
748 242140 : tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */
749 242140 : synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn - 1*/
750 242140 : move32();
751 242140 : L_tmp = L_mult0( alpha_fx, gsMapping_fx ); /* Q29 */
752 242140 : L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0 in Q15*/, alpha_fx ), prevgsMapping_fx ); /* Q29 */
753 242140 : tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */
754 242140 : synth_fx[i] = Mpy_32_16_1( synth_fx[i], tmp ); /* Qsyn - 1 */
755 242140 : move32();
756 242140 : IF( LE_16( alpha_fx, sub( 32767 /* 1.0 in Q15*/, winSlope_fx ) ) )
757 : {
758 235531 : alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */
759 : }
760 : }
761 3638709 : FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ )
762 : {
763 3632100 : synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); /* Qsyn - 1 */
764 3632100 : move32();
765 3632100 : synth_fx[i] = Mpy_32_16_1( synth_fx[i], gsMapping_fx ); /* Qsyn - 1 */
766 3632100 : move32();
767 : }
768 6609 : hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; /* Q14 */
769 6609 : move16();
770 :
771 6609 : ic_bwe_dec_reset_fx( hStereoICBWE );
772 6609 : hStereoICBWE->prevSpecMapping_fx = 0;
773 6609 : move16();
774 :
775 6609 : *Q_syn = sub( *Q_syn, 1 );
776 6609 : move16();
777 :
778 6609 : return;
779 : }
780 :
781 : /* resample to output FS */
782 :
783 :
784 8556 : IF( EQ_32( st->output_Fs, 48000 /* Q0 */ ) )
785 : {
786 5199 : tmp = 31;
787 5199 : move16();
788 5199 : tmp = FindScale( error_fx, L_FRAME32k, Q_syn_shb, tmp );
789 5199 : tmp = FindScale( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, hStereoICBWE->prev_Q_fsout, tmp );
790 5199 : tmp = sub( tmp, 4 );
791 :
792 5199 : Scale_sig32( error_fx, L_FRAME32k, sub( tmp, Q_syn_shb ) ); /* tmp */
793 5199 : Scale_sig32( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, sub( tmp, hStereoICBWE->prev_Q_fsout ) ); /* tmp */
794 5199 : interpolate_3_over_2_allpass_fx32( error_fx, L_FRAME32k, synth_fx, hStereoICBWE->memShb_fsout_nonref_fx );
795 5199 : hStereoICBWE->prev_Q_fsout = tmp;
796 5199 : move16();
797 : }
798 3357 : ELSE IF( EQ_32( st->output_Fs, 32000 /* Q0 */ ) )
799 : {
800 3357 : Copy32( error_fx, synth_fx, L_FRAME32k ); /* tmp */
801 : }
802 0 : ELSE IF( EQ_32( st->output_Fs, 16000 /* Q0 */ ) )
803 : {
804 0 : tmp = 31;
805 0 : move16();
806 0 : tmp = FindScale( error_fx, L_FRAME32k, Q_syn_shb, tmp );
807 0 : tmp = FindScale( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, hStereoICBWE->prev_Q_fsout, tmp );
808 0 : tmp = sub( tmp, 4 );
809 :
810 0 : Scale_sig32( error_fx, L_FRAME32k, sub( tmp, Q_syn_shb ) ); /* tmp */
811 0 : Scale_sig32( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, sub( tmp, hStereoICBWE->prev_Q_fsout ) ); /* tmp */
812 0 : Decimate_allpass_steep_fx32( error_fx, hStereoICBWE->memShb_fsout_nonref_fx, L_FRAME32k, synth_fx );
813 0 : hStereoICBWE->prev_Q_fsout = tmp;
814 0 : move16();
815 : }
816 8556 : Scale_sig32( synth_fx, output_frame, sub( *Q_syn, add( 1, tmp ) ) ); /* Qsyn - 1 */
817 :
818 8556 : *Q_syn = sub( *Q_syn, 1 );
819 :
820 8556 : test();
821 8556 : IF( EQ_16( st->extl, FB_TBE ) && EQ_32( st->output_Fs, 48000 /* Q0*/ ) )
822 : {
823 :
824 : // v_add( fb_synth_nonref_fx, synth_fx, synth_fx, L_FRAME48k, 0 );
825 3152 : tmp = shl_sat( 1, sub( Q11 + 15, Q_white_exc ) ); /* 29 - Q_white_exc */
826 3152 : IF( tmp != 0 )
827 : {
828 2934894 : FOR( i = 0; i < L_FRAME48k; i++ )
829 : {
830 2931840 : synth_fx[i] = L_mac( synth_fx[i], fb_synth_nonref_fx[i], tmp ); /* Q_syn */
831 : }
832 : }
833 : }
834 :
835 : /* copy to outputHB and reset hb_synth values */
836 :
837 8556 : IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
838 : {
839 8534 : ratio_L_fx = 16384; /* 1.0 in Q15 */
840 8534 : move16();
841 : }
842 : ELSE
843 : {
844 22 : ratio_L_fx = extract_h( tdm_ratio_tabl_fx[hCPE->hStereoTD->tdm_last_ratio_idx] ); /* Q15 */
845 22 : move16();
846 : }
847 :
848 8556 : icbweM2Ref_fx = gsMapping_fx;
849 8556 : move16();
850 8556 : IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX )
851 : {
852 2743 : IF( GE_16( ratio_L_fx, 3276 /* 0.1 in Q15*/ ) )
853 : {
854 2735 : tmp = mult_r( sub( 32767 /* 1.0 in Q15*/, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15
855 2735 : tmp = mult_r( tmp, gsMapping_fx ); // Q14
856 2735 : tmp = mult_r( tmp, gsMapping_fx ); // Q13
857 2735 : IF( LT_16( tmp, 4096 /* 0.5 in Q13*/ ) )
858 : {
859 2730 : temp1_fx = 0;
860 2730 : move16();
861 2730 : temp2_fx = 0;
862 2730 : move16();
863 2730 : tmp = shl( tmp, 2 );
864 2730 : icbweM2Ref_fx = Sqrt16( sub( 16384 /* 0.5 in Q15*/, tmp ), &temp1_fx );
865 2730 : icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, ratio_L_fx, &temp2_fx );
866 2730 : icbweM2Ref_fx = shl_sat( icbweM2Ref_fx, add( temp1_fx, sub( temp2_fx, 1 ) ) ); // Q14
867 : }
868 : ELSE
869 : {
870 5 : icbweM2Ref_fx = 0;
871 5 : move16();
872 : }
873 : }
874 : }
875 : ELSE
876 : {
877 5813 : IF( LE_16( ratio_L_fx, 29490 /* 0.9 in Q15*/ ) )
878 : {
879 5813 : tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15
880 5813 : tmp = mult_r( tmp, gsMapping_fx ); // Q14
881 5813 : tmp = mult_r( tmp, gsMapping_fx ); // Q13
882 5813 : IF( LT_16( tmp, 4096 /* 0.5 in Q13*/ ) )
883 : {
884 5813 : temp1_fx = 0;
885 5813 : move16();
886 5813 : temp2_fx = 0;
887 5813 : move16();
888 5813 : tmp = shl( tmp, 2 );
889 5813 : icbweM2Ref_fx = Sqrt16( sub( 16384 /* 0.5 in Q15*/, tmp ), &temp1_fx );
890 5813 : icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, sub( 32767, ratio_L_fx ), &temp2_fx );
891 5813 : icbweM2Ref_fx = shl_sat( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14
892 : }
893 : ELSE
894 : {
895 0 : icbweM2Ref_fx = 0;
896 0 : move16();
897 : }
898 : }
899 : }
900 :
901 8556 : icbweM2Ref_fx = s_max( gsMapping_fx, icbweM2Ref_fx ); /* Q14 */
902 :
903 8556 : winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); /* Q0 */
904 8556 : winSlope_fx = div_s( 1, winLen_fx ); /* Q15 */
905 8556 : alpha_fx = winSlope_fx; /* Q15 */
906 8556 : move16();
907 8556 : Word16 winSlope_fx_ = sub( 32767 /* 1.0 in Q15*/, winSlope_fx );
908 454776 : FOR( i = 0; i < winLen_fx; i++ )
909 : {
910 446220 : L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */
911 446220 : L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0 in Q15*/, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); /* Q29 */
912 446220 : tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */
913 446220 : synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn - 1 */
914 446220 : move32();
915 446220 : if ( LE_16( alpha_fx, winSlope_fx_ ) )
916 : {
917 437664 : alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */
918 : }
919 : }
920 :
921 6701856 : FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ )
922 : {
923 6693300 : synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); /* Qsyn - 1 */
924 6693300 : move32();
925 : }
926 :
927 8556 : hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; /* Q14 */
928 8556 : move16();
929 :
930 8556 : return;
931 : }
932 :
933 : /*-------------------------------------------------------------------*
934 : * stereo_icBWE_decproc()
935 : *
936 : * Stereo (inter-channel) BWE mapping - decoder initialization
937 : *-------------------------------------------------------------------*/
938 :
939 145402 : void stereo_icBWE_decproc_fx(
940 : CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */
941 : Word32 *output[CPE_CHANNELS], /* i/o: output synthesis Q11*/
942 : Word32 outputHB[CPE_CHANNELS][L_FRAME48k], /* i : HB synthesis Q11*/
943 : const Word16 last_core, /* i : last core, primary channel Q0*/
944 : const Word16 last_bwidth, /* i : last bandwidth Q0*/
945 : const Word16 output_frame /* i : frame length Q0*/
946 : )
947 : {
948 : Word16 i, j, n, decoderDelay, icbweOLASize, dftOvlLen;
949 : Word16 core, memOffset, refChanIndx_bwe;
950 :
951 : Word32 temp0_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )], temp1_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )];
952 145402 : Word16 winSlope_fx = 0, alpha_fx;
953 145402 : move32();
954 : const Word16 *win_dft_fx;
955 : Word32 extl_brate, output_Fs;
956 :
957 145402 : STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE;
958 :
959 : /*--------------------------------------------------------------------*
960 : * skip IC-BWE in case of SID or NO_DATA frame
961 : * -------------------------------------------------------------------*/
962 :
963 145402 : test();
964 145402 : test();
965 145402 : test();
966 145402 : IF( ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) || EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) && EQ_16( hCPE->nchan_out, 2 ) /*&& hCPE->hCoreCoder[0]->core_brate > SID_2k40*/ && LE_32( hCPE->hCoreCoder[0]->last_core_brate, SID_2k40 ) )
967 : {
968 5470 : stereo_icBWE_init_dec_fx( hCPE->hStereoICBWE );
969 : }
970 :
971 145402 : IF( LE_32( hCPE->hCoreCoder[0]->core_brate, SID_2k40 ) )
972 : {
973 14523 : return;
974 : }
975 :
976 : /*--------------------------------------------------------------------*
977 : * skip IC-BWE in case of mono DMX output *
978 : * -------------------------------------------------------------------*/
979 :
980 130879 : test();
981 130879 : test();
982 130879 : IF( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
983 : {
984 17465 : add_HB_to_mono_dmx_fx( hCPE, output[0], outputHB[0], last_core, output_frame );
985 17465 : return;
986 : }
987 113414 : ELSE IF( EQ_16( hCPE->nchan_out, 1 ) && NE_16( hCPE->element_mode, IVAS_CPE_TD ) )
988 : {
989 5872 : return;
990 : }
991 :
992 : /*--------------------------------------------------------------------*
993 : * IC-BWE processing
994 : * -------------------------------------------------------------------*/
995 :
996 107542 : core = hCPE->hCoreCoder[0]->core; /* Q0 */
997 107542 : move16();
998 107542 : extl_brate = hCPE->hCoreCoder[0]->extl_brate; /* Q0 */
999 107542 : move32();
1000 107542 : output_Fs = hCPE->hCoreCoder[0]->output_Fs; /* Q0 */
1001 107542 : move32();
1002 :
1003 107542 : memOffset = NS2SA_FX2( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); /* Q0 */
1004 :
1005 : /* LRTD stereo mode - 2xBWEs used */
1006 107542 : test();
1007 107542 : IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag )
1008 : {
1009 : /* delay HB synth */
1010 10875 : FOR( n = 0; n < CPE_CHANNELS; n++ )
1011 : {
1012 7250 : Copy32( outputHB[n] + output_frame - memOffset, temp0_fx, memOffset ); /* Q11 */
1013 7250 : Copy32( outputHB[n], outputHB[n] + memOffset, output_frame - memOffset ); /* Q11 */
1014 7250 : Copy32( hCPE->prev_hb_synth_fx[n], outputHB[n], memOffset ); /* Q11 */
1015 7250 : Copy32( temp0_fx, hCPE->prev_hb_synth_fx[n], memOffset ); /* Q11 */
1016 : }
1017 :
1018 3625 : IF( EQ_16( hCPE->nchan_out, 1 ) )
1019 : {
1020 : /* stereo to mono downmix */
1021 791399 : FOR( i = 0; i < output_frame; i++ )
1022 : {
1023 790080 : outputHB[0][i] = W_extract_l( W_shr( W_mac_32_16( W_mult_32_16( outputHB[0][i], 16384 ), outputHB[1][i], 16384 ), Q16 ) ); /* Q11 */
1024 790080 : move32();
1025 : }
1026 1319 : v_add_32( output[0], outputHB[0], output[0], output_frame );
1027 : }
1028 : ELSE
1029 : {
1030 : /* Add the delayed hb_synth component to the delayed ACELP synthesis */
1031 6918 : FOR( n = 0; n < CPE_CHANNELS; n++ )
1032 : {
1033 4612 : v_add_32( output[n], outputHB[n], output[n], output_frame );
1034 : }
1035 : }
1036 : }
1037 : ELSE
1038 : {
1039 311751 : FOR( n = 0; n < CPE_CHANNELS; n++ )
1040 : {
1041 207834 : set32_fx( hCPE->prev_hb_synth_fx[n], 0, memOffset );
1042 : }
1043 : }
1044 :
1045 107542 : test();
1046 107542 : test();
1047 107542 : test();
1048 107542 : test();
1049 107542 : test();
1050 107542 : test();
1051 107542 : IF( NE_16( hCPE->element_mode, IVAS_CPE_MDCT ) && !( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) )
1052 : {
1053 31357 : IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) )
1054 : {
1055 262 : set32_fx( hStereoICBWE->memOutHB_fx[0], 0, memOffset );
1056 262 : set32_fx( hStereoICBWE->memOutHB_fx[1], 0, memOffset );
1057 :
1058 262 : set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) );
1059 262 : set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) );
1060 : }
1061 :
1062 31357 : test();
1063 31357 : IF( EQ_16( core, ACELP_CORE ) && extl_brate > 0 )
1064 : {
1065 17839 : refChanIndx_bwe = hStereoICBWE->refChanIndx_bwe;
1066 17839 : move16();
1067 :
1068 17839 : test();
1069 17839 : test();
1070 17839 : test();
1071 17839 : IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && GT_16( hCPE->hCoreCoder[0]->bwidth, WB ) && EQ_16( last_bwidth, WB ) && GT_16( hCPE->hCoreCoder[0]->ini_frame, 1 ) /* counter wass already updated */ )
1072 : {
1073 : /* fad-in reference HB signal */
1074 21 : IF( GT_16( memOffset, 0 ) )
1075 : {
1076 21 : SWITCH( memOffset )
1077 : {
1078 0 : case 15:
1079 0 : winSlope_fx = 2185; /* 0.06 in Q15 */
1080 0 : move32();
1081 0 : BREAK;
1082 10 : case 30:
1083 10 : winSlope_fx = 1092; /* 0.03 in Q15 */
1084 10 : move32();
1085 10 : BREAK;
1086 11 : case 45:
1087 11 : winSlope_fx = 728; /* 0.02 in Q15 */
1088 11 : move32();
1089 11 : BREAK;
1090 : }
1091 : // memOffset for 16K 32K 48K are 15 30 45 respectively.camera
1092 21 : }
1093 : ELSE
1094 : {
1095 0 : winSlope_fx = 0;
1096 0 : move32();
1097 : }
1098 21 : alpha_fx = 0;
1099 21 : move16();
1100 816 : FOR( i = 0; i < memOffset; i++ )
1101 : {
1102 795 : alpha_fx = add_sat( alpha_fx, winSlope_fx ); /* Q15 */
1103 795 : outputHB[refChanIndx_bwe][i] = W_round48_L( W_mult_32_16( outputHB[refChanIndx_bwe][i] /* Q11 + Q15 + 1 - 16 = Q11)*/, winSlope_fx ) ); // Q11
1104 795 : move32();
1105 : }
1106 : }
1107 : /* Resampled LB and HB offset */
1108 17839 : Copy32( outputHB[refChanIndx_bwe], temp0_fx + memOffset, sub( output_frame, memOffset ) ); /* Q11 */
1109 17839 : Copy32( outputHB[!refChanIndx_bwe], temp1_fx + memOffset, sub( output_frame, memOffset ) ); /* Q11 */
1110 :
1111 17839 : decoderDelay = NS2SA_FX2( output_Fs, IVAS_DEC_DELAY_NS ); /* Q0 */
1112 :
1113 17839 : test();
1114 17839 : IF( last_core != ACELP_CORE && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
1115 : {
1116 : /* hb_synth of mid band is faded out in the 1.25 ms prior to DFT analysis and the icbwe is faded in time domain */
1117 603 : icbweOLASize = NS2SA_FX2( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); /* Q0 */
1118 :
1119 70751 : FOR( i = 0; i < decoderDelay; i++ )
1120 : {
1121 70148 : temp0_fx[i] = 0;
1122 70148 : move32();
1123 70148 : temp1_fx[i] = 0;
1124 70148 : move32();
1125 : }
1126 :
1127 603 : assert( icbweOLASize > 0 );
1128 603 : SWITCH( icbweOLASize )
1129 : {
1130 250 : case 60:
1131 250 : winSlope_fx = 546; /* 0.0166 in Q15 */
1132 250 : move16();
1133 250 : BREAK;
1134 246 : case 40:
1135 246 : winSlope_fx = 819; /* 0.025 in Q15 */
1136 246 : move16();
1137 246 : BREAK;
1138 107 : case 20:
1139 107 : winSlope_fx = 1638; /* 0.05 in Q15 */
1140 107 : move16();
1141 107 : BREAK;
1142 0 : default:
1143 0 : fprintf( stderr, "icbweOLASize of size %d not implemented \n", icbweOLASize );
1144 0 : assert( 0 );
1145 : BREAK;
1146 : }
1147 603 : alpha_fx = winSlope_fx; // Q15
1148 603 : move32();
1149 27583 : FOR( ; i < add( decoderDelay, icbweOLASize ); i++ )
1150 : {
1151 26980 : temp0_fx[i] = W_round48_L( W_mult_32_16( temp0_fx[i], alpha_fx ) ); // Q11
1152 26980 : move32();
1153 26980 : temp1_fx[i] = W_round48_L( W_mult_32_16( temp1_fx[i], alpha_fx ) ); // Q11
1154 26980 : move32();
1155 26980 : alpha_fx = add_sat( alpha_fx, winSlope_fx ); // Q15
1156 : }
1157 : }
1158 : ELSE
1159 : {
1160 17236 : IF( NE_16( refChanIndx_bwe, hStereoICBWE->prev_refChanIndx_bwe ) )
1161 : {
1162 2287 : IF( memOffset > 0 )
1163 : {
1164 2287 : SWITCH( memOffset )
1165 : {
1166 330 : case 15:
1167 330 : winSlope_fx = 2185; /* 0.06 in Q15 */
1168 330 : move16();
1169 330 : BREAK;
1170 863 : case 30:
1171 863 : winSlope_fx = 1092; /* 0.03 in Q15 */
1172 863 : move16();
1173 863 : BREAK;
1174 1094 : case 45:
1175 1094 : winSlope_fx = 728; /* 0.022 in Q15 */
1176 1094 : move16();
1177 1094 : BREAK;
1178 : }
1179 : // memOffset for 16K 32K 48K are 15 30 45 respectively.camera
1180 2287 : }
1181 : ELSE
1182 : {
1183 0 : winSlope_fx = 0;
1184 0 : move32();
1185 : }
1186 2287 : Word16 Incr = 0;
1187 2287 : Word16 Decr = MAX_16;
1188 2287 : move16();
1189 2287 : move16();
1190 82357 : FOR( i = 0; i < memOffset; i++ )
1191 : {
1192 80070 : Incr = add_sat( Incr, winSlope_fx ); /* Q15 */
1193 80070 : Decr = sub( Decr, winSlope_fx ); /* Q15 */
1194 80070 : temp0_fx[i] = W_round48_L( W_mac_32_16( W_mult_32_16( hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i], Incr ), hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i], Decr ) ); /* Q11 */
1195 80070 : temp1_fx[i] = W_round48_L( W_mac_32_16( W_mult_32_16( hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i], Incr ), hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i], Decr ) ); /* Q11 */
1196 80070 : move32();
1197 : }
1198 : }
1199 : ELSE
1200 : {
1201 14949 : Copy32( hStereoICBWE->memOutHB_fx[refChanIndx_bwe], temp0_fx, memOffset ); /* Q11 */
1202 14949 : Copy32( hStereoICBWE->memOutHB_fx[!refChanIndx_bwe], temp1_fx, memOffset ); /* Q11 */
1203 : }
1204 : }
1205 :
1206 17839 : IF( EQ_16( hCPE->nchan_out, 1 ) )
1207 : {
1208 : Word64 W_tmp;
1209 : /* stereo to mono downmix */
1210 5769 : FOR( i = 0; i < output_frame; i++ )
1211 : {
1212 5760 : W_tmp = W_mult_32_16( output[0][i], 32767 /* 1.0 in Q15*/ ); /* Q11 */
1213 5760 : W_tmp = W_mac_32_16( W_tmp, temp0_fx[i], 16384 /* 0.5 in Q15*/ ); /* Q11*/
1214 5760 : output[0][i] = W_round48_L( W_mac_32_16( W_tmp, temp1_fx[i], 16384 /* 0.5 in Q15*/ ) ); /* Q11 */
1215 5760 : move32();
1216 5760 : move32();
1217 : }
1218 : }
1219 : ELSE
1220 : {
1221 17830 : v_add_32( temp0_fx, output[0], output[0], output_frame );
1222 17830 : v_add_32( temp1_fx, output[1], output[1], output_frame );
1223 : }
1224 :
1225 17839 : Copy32( outputHB[0] + output_frame - memOffset, hStereoICBWE->memOutHB_fx[0], memOffset ); /* Q11*/
1226 17839 : Copy32( outputHB[1] + output_frame - memOffset, hStereoICBWE->memOutHB_fx[1], memOffset ); /* Q11 */
1227 :
1228 17839 : IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) )
1229 : {
1230 : /*win_dft = hCPE->hStereoDft->win32ms;*/
1231 17802 : win_dft_fx = hCPE->hStereoDft->win32ms_fx; /* Q15 */
1232 17802 : dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; /* Q0 */
1233 17802 : move16();
1234 :
1235 : /* Preparing buffers in anticipation of an ACELP to TCX switch */
1236 :
1237 17802 : j = sub( dftOvlLen, 1 );
1238 575667 : FOR( i = 0; i < memOffset; i++ )
1239 : {
1240 557865 : Word16 tmp_mul = i_mult( STEREO_DFT32MS_STEP, j );
1241 557865 : hStereoICBWE->memTransitionHB_fx[0][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[0][i], win_dft_fx[tmp_mul] ); /* Q11 */
1242 557865 : move32();
1243 557865 : hStereoICBWE->memTransitionHB_fx[1][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[1][i], win_dft_fx[tmp_mul] ); /* Q11 */
1244 557865 : move32();
1245 557865 : j = sub( j, 1 );
1246 : }
1247 :
1248 593469 : FOR( i = 0; j < dftOvlLen; i++ )
1249 : {
1250 575667 : Word16 tmp_mul = mult0( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) );
1251 575667 : hStereoICBWE->memTransitionHB_fx[0][memOffset + i] = Mpy_32_16_1( outputHB[0][output_frame - i - 1], win_dft_fx[tmp_mul] ); /* Q11 */
1252 575667 : move32();
1253 575667 : hStereoICBWE->memTransitionHB_fx[1][memOffset + i] = Mpy_32_16_1( outputHB[1][output_frame - i - 1], win_dft_fx[tmp_mul] ); /* Q11 */
1254 575667 : move32();
1255 575667 : j = add( j, 1 );
1256 : }
1257 : }
1258 :
1259 17839 : hStereoICBWE->prev_refChanIndx_bwe = refChanIndx_bwe;
1260 17839 : move16();
1261 : }
1262 : ELSE
1263 : {
1264 13518 : IF( last_core == ACELP_CORE )
1265 : {
1266 3238 : IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) )
1267 : {
1268 23 : v_add_32( output[0], hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe], output[0], memOffset );
1269 23 : v_add_32( output[1], hStereoICBWE->memOutHB_fx[!hStereoICBWE->prev_refChanIndx_bwe], output[1], memOffset );
1270 : }
1271 : ELSE
1272 : {
1273 : /* This is generated in the ACELP frame and windowed. This process is akin to GenTransition for IC-BWE */
1274 3215 : v_add_32( output[0], hStereoICBWE->memTransitionHB_fx[hStereoICBWE->prev_refChanIndx_bwe], output[0], NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) );
1275 3215 : v_add_32( output[1], hStereoICBWE->memTransitionHB_fx[!hStereoICBWE->prev_refChanIndx_bwe], output[1], NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) );
1276 : }
1277 :
1278 3238 : set32_fx( hStereoICBWE->memOutHB_fx[0], 0, memOffset );
1279 3238 : set32_fx( hStereoICBWE->memOutHB_fx[1], 0, memOffset );
1280 :
1281 3238 : set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) );
1282 3238 : set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) );
1283 : }
1284 : }
1285 : }
1286 76185 : ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag && hStereoICBWE != NULL )
1287 : {
1288 0 : stereo_icBWE_init_dec_fx( hCPE->hStereoICBWE );
1289 : }
1290 76185 : ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) && EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && EQ_16( last_core, ACELP_CORE ) )
1291 : {
1292 511 : Word16 delay_tdbwe = NS2SA_FX2( output_Fs, DELAY_BWE_TOTAL_NS );
1293 :
1294 1533 : FOR( n = 0; n < hCPE->nchan_out; n++ )
1295 : {
1296 101366 : FOR( i = 0; i < delay_tdbwe; i++ )
1297 : {
1298 100344 : output[n][NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i] = L_add_sat( output[n][NS2SA_FX2( output_Fs, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i], outputHB[0][i] );
1299 100344 : move32();
1300 : }
1301 : }
1302 :
1303 : /* reset BWE structs as they are only needed in the transition frame in MDCT Stereo */
1304 511 : td_bwe_dec_init_fx( hCPE->hCoreCoder[0]->hBWE_TD, -1, output_Fs );
1305 511 : fd_bwe_dec_init_fx( hCPE->hCoreCoder[0]->hBWE_FD );
1306 :
1307 511 : hCPE->hCoreCoder[0]->prev_Q_bwe_exc = 31;
1308 511 : move16();
1309 : }
1310 :
1311 107542 : test();
1312 107542 : IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && GT_32( L_max( hCPE->hStereoDft->td_gain_fx[0], hCPE->hStereoDft->td_gain_fx[1] ), 0 ) )
1313 : {
1314 : Word32 win_in_fx, win_out_fx, tmp_fx;
1315 : Word64 W_tmp, W_tmp1;
1316 16790 : win_dft_fx = hCPE->hStereoDft->win32ms_fx; /* Q15 */
1317 16790 : dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; /* Q0 */
1318 16790 : move16();
1319 :
1320 : // Scale_sig32(hCPE->hStereoDft->td_gain_fx, STEREO_DFT_CORE_HIST_MAX, -12);
1321 :
1322 1773790 : FOR( i = 0; i < dftOvlLen; i++ )
1323 : {
1324 1757000 : j = i_mult( STEREO_DFT32MS_STEP, i );
1325 1757000 : win_in_fx = L_mult( win_dft_fx[j], win_dft_fx[j] ); /* Q31 */
1326 1757000 : win_out_fx = L_sub( ONE_IN_Q31, win_in_fx ); /* Q31 */
1327 : /* hCPE->hStereoDft->q_hb_stefi_sig_fx is always 31 here */
1328 : /* tmp = ( win_in * hCPE->hStereoDft->td_gain[0] + win_out * hCPE->hStereoDft->td_gain[1] ) * hCPE->hStereoDft->hb_stefi_sig[i]; */
1329 :
1330 1757000 : W_tmp = W_mult_32_32( hCPE->hStereoDft->td_gain_fx[0], win_in_fx ); /* q_td_gain + Q31 + 1 */
1331 1757000 : if ( hCPE->hStereoDft->q_td_gain[0] != 0 )
1332 : {
1333 1659250 : W_tmp = W_shl( W_tmp, sub( 31, hCPE->hStereoDft->q_td_gain[0] ) ); /* Q63 */
1334 : }
1335 1757000 : W_tmp1 = W_mult_32_32( hCPE->hStereoDft->td_gain_fx[1], win_out_fx ); /* q_td_gain + Q31 + 1 */
1336 1757000 : if ( hCPE->hStereoDft->q_td_gain[1] != 0 )
1337 : {
1338 1644900 : W_tmp1 = W_shl( W_tmp1, sub( 31, hCPE->hStereoDft->q_td_gain[1] ) ); /* Q63 */
1339 : }
1340 1757000 : tmp_fx = W_extract_h( W_add_nosat( W_tmp, W_tmp1 ) ); /* Q31 */
1341 1757000 : tmp_fx = W_extract_h( W_mult_32_32( tmp_fx, hCPE->hStereoDft->hb_stefi_sig_fx[i] ) ); /* Q11 */
1342 :
1343 1757000 : output[0][i] = L_add_sat( output[0][i], tmp_fx ); /* Q11 */
1344 1757000 : move32();
1345 1757000 : output[1][i] = L_sub_sat( output[1][i], tmp_fx ); /* Q11 */
1346 1757000 : move32();
1347 : }
1348 9504590 : FOR( i = dftOvlLen; i < output_frame; i++ )
1349 : {
1350 9487800 : tmp_fx = W_extract_h( W_mult_32_32( hCPE->hStereoDft->td_gain_fx[0], hCPE->hStereoDft->hb_stefi_sig_fx[i] ) ); /* Q11 --> Q11 */
1351 9487800 : output[0][i] = L_add_sat( output[0][i], tmp_fx ); /* Q11 */
1352 9487800 : move32();
1353 9487800 : output[1][i] = L_sub_sat( output[1][i], tmp_fx ); /* Q11 */
1354 9487800 : move32();
1355 : }
1356 : }
1357 :
1358 107542 : return;
1359 : }
1360 :
1361 : /*-------------------------------------------------------------------*
1362 : * stereo_icBWE_init_dec()
1363 : *
1364 : * Stereo (inter-channel) BWE mapping - decoder initialization
1365 : *-------------------------------------------------------------------*/
1366 :
1367 6280 : void stereo_icBWE_init_dec_fx(
1368 : STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */
1369 : )
1370 : {
1371 : /* BWE ref channel */
1372 6280 : hStereoICBWE->refChanIndx_bwe = L_CH_INDX;
1373 6280 : move16();
1374 6280 : hStereoICBWE->prev_refChanIndx_bwe = L_CH_INDX;
1375 6280 : move16();
1376 :
1377 : /* SHB output memory */
1378 6280 : set32_fx( hStereoICBWE->memOutHB_fx[0], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) );
1379 6280 : set32_fx( hStereoICBWE->memOutHB_fx[1], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) );
1380 :
1381 :
1382 : /* SHB output memory */
1383 6280 : set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) );
1384 6280 : set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) );
1385 :
1386 : /* inter-channel BWE spectral shape adj. */
1387 6280 : hStereoICBWE->prevSpecMapping_fx = 0;
1388 6280 : move16();
1389 6280 : hStereoICBWE->prevgsMapping_fx = 16384; /* 1.0 in Q14 */
1390 6280 : move16();
1391 6280 : hStereoICBWE->icbweM2Ref_prev_fx = 16384; /* 1.0 in Q14 */
1392 6280 : move16();
1393 :
1394 6280 : hStereoICBWE->prev_spIndx = 0;
1395 6280 : move16();
1396 6280 : hStereoICBWE->prev_gsIndx = 0;
1397 6280 : move16();
1398 :
1399 6280 : ic_bwe_dec_reset_fx( hStereoICBWE );
1400 :
1401 6280 : return;
1402 : }
|