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