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 <stdint.h>
34 : #include "math.h"
35 : #include "options.h"
36 : #include "basop_util.h"
37 : #include "ivas_stat_com.h"
38 : #include "prot_fx.h"
39 : #include "rom_com.h"
40 : #include "ivas_rom_com.h"
41 : #include "cnst.h"
42 : #include <assert.h>
43 : #include "wmc_auto.h"
44 : #include "basop_util.h"
45 : #include "basop32.h"
46 : #include "ivas_prot_fx.h"
47 : #include "ivas_rom_com_fx.h"
48 :
49 :
50 : /*------------------------------------------------------------------------------------------*
51 : * Local constants
52 : *------------------------------------------------------------------------------------------*/
53 :
54 : #define IVAS_FIX_EPS ( 1 )
55 : #define IVAS_FIX_EPS_Q40 ( 110 )
56 :
57 :
58 : #define IVAS_ACTIVEW_DM_F_Q30 ( ONE_IN_Q30 ) /*1 Q30*/
59 : #define IVAS_ACTIVEW_DM_F_DTX_Q30 ( 268435456 ) /*0.25 Q30*/
60 : #define IVAS_ACTIVEW_DM_F_VLBR_Q30 ( 268435456 ) /*0.25 Q30*/
61 : #define IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH_Q29 ( 1610612736 ) /*3 Q29*/
62 :
63 : #define IVAS_P_NORM_SCALING_FX ( ONE_IN_Q31 ) // 1 Q31
64 : #define IVAS_P_NORM_SCALING_DTX_FX ( 1610612736 ) // 0.75 Q31
65 :
66 : #define IVAS_MAT_DIM_3 ( 3 )
67 : #define IVAS_MAT_DIM_2 ( 2 )
68 : #define IVAS_MAT_DIM_1 ( 1 )
69 : #define MAX_MAT_DIM ( FOA_CHANNELS - 1 )
70 :
71 : /*------------------------------------------------------------------------------------------*
72 : * Static functions declaration
73 : *------------------------------------------------------------------------------------------*/
74 :
75 : static void ivas_get_pred_coeffs_enc_fx(
76 : Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
77 : Word16 *q_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
78 : Word32 ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_pred_coeffs*/
79 : Word16 *q_pred_coeffs,
80 : Word32 ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_dm_fv_re*/
81 : Word16 *q_dm_fv_re,
82 : const Word16 in_chans,
83 : const Word16 start_band,
84 : const Word16 end_band,
85 : const Word16 active_w,
86 : const Word16 active_w_vlbr,
87 : const Word16 dtx_vad,
88 : const Word16 from_dirac,
89 : const Word16 dyn_active_w_flag,
90 : const Word16 res_ind );
91 :
92 : static void ivas_get_Wscaling_factor_enc_fx(
93 : Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
94 : Word16 *q_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
95 : Word32 pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_pred_coeffs_re*/
96 : Word16 q_pred_coeffs_re,
97 : Word32 ***mixer_mat, /*q_mixer_mat*/
98 : Word16 q_mixer_mat,
99 : const Word16 start_band,
100 : const Word16 end_band,
101 : const Word16 dtx_vad,
102 : const Word16 num_ch,
103 : const Word16 *pNum_dmx,
104 : const Word16 bands_bw,
105 : const Word16 active_w,
106 : const Word16 active_w_vlbr,
107 : Word32 *pWscale, /*q_pWscale*/
108 : Word16 *q_pWscale,
109 : const Word16 dyn_active_w_flag );
110 :
111 : static void ivas_calc_post_pred_per_band_enc_fx(
112 : Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
113 : Word16 *q_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
114 : Word32 ***mixer_mat, /*q_mixer_mat*/
115 : Word16 q_mixer_mat,
116 : const Word16 num_ch,
117 : const Word16 band_idx,
118 : Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_postpred_cov_re*/
119 : Word16 *q_postpred_cov_re );
120 :
121 : static void ivas_get_pred_coeffs_fx(
122 : Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*Q30*/
123 : Word32 ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_pred_coeffs*/
124 : Word32 ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_dm_fv_re*/
125 : const Word16 in_chans,
126 : const Word16 start_band,
127 : const Word16 end_band,
128 : const Word16 active_w,
129 : const Word16 active_w_vlbr,
130 : const Word16 dtx_vad,
131 : const Word16 from_dirac,
132 : const Word16 dyn_active_w_flag,
133 : const Word16 res_ind,
134 : Word16 *q_pred_coeffs,
135 : Word16 *q_dm_fv_re );
136 : static void ivas_reorder_array_fx( Word32 in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS] /*qx*/, const Word16 in_chans, const Word16 order[IVAS_SPAR_MAX_CH], Word32 ***mixer_mat /*qx*/, const Word16 start_band, const Word16 end_band );
137 : static void ivas_get_Wscaling_factor_fx( Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] /*q_cov_real*/, Word16 q_cov_real, Word32 pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS] /*q_pred_coeffs_re*/, Word16 q_pred_coeffs_re, Word32 ***mixer_mat /*q_mixer_mat*/, Word16 q_mixer_mat, const Word16 start_band, const Word16 end_band, const Word16 dtx_vad, const Word16 num_ch, const Word16 *pNum_dmx, const Word16 bands_bw, const Word16 active_w, const Word16 active_w_vlbr, Word32 *pWscale /*q_pWscale*/, Word16 *q_pWscale, const Word16 dyn_active_w_flag );
138 : static void ivas_calc_post_pred_per_band_fx( Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] /*q_cov_real*/, Word16 q_cov_real, Word32 ***mixer_mat /*q_mixer_mat*/, Word16 q_mixer_mat, const Word16 num_ch, const Word16 band_idx, Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] /*q_postpred_cov_re*/, Word16 *q_postpred_cov_re );
139 : static Word16 ivas_is_mat_inv_fx( Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM] /*q_in_re*/, Word16 q_in_re, const Word16 dim );
140 : static void ivas_calc_mat_inv_fx( Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM] /*q_in_re*/, Word16 q_in_re, const Word16 dim, Word32 out_re[MAX_MAT_DIM][MAX_MAT_DIM] /*q_out_re*/, Word16 *q_out_re );
141 :
142 : /*-----------------------------------------------------------------------------------------*
143 : * Function ivas_get_bw_idx_from_sample_rate()
144 : *
145 : * Get bwidth index from sample rate.
146 : *-----------------------------------------------------------------------------------------*/
147 :
148 : /*! r: audio BW index */
149 158628 : Word16 ivas_get_bw_idx_from_sample_rate_fx(
150 : const Word32 sampling_rate /* i : sampling rate */
151 : )
152 : {
153 158628 : Word16 bwidth = 0;
154 158628 : move16();
155 :
156 158628 : SWITCH( sampling_rate )
157 : {
158 12158 : case 16000:
159 12158 : bwidth = WB;
160 12158 : move16();
161 12158 : BREAK;
162 70962 : case 32000:
163 70962 : bwidth = SWB;
164 70962 : move16();
165 70962 : BREAK;
166 75508 : case 48000:
167 75508 : bwidth = FB;
168 75508 : move16();
169 75508 : BREAK;
170 0 : default:
171 0 : assert( !"Unsupported sample rate!" );
172 : }
173 :
174 158628 : return bwidth;
175 : }
176 :
177 : /*-------------------------------------------------------------------------
178 : * ivas_spar_config()
179 : *
180 : * SPAR configuration function
181 : *------------------------------------------------------------------------*/
182 :
183 6107 : void ivas_spar_config_fx(
184 : Word32 ivas_total_brate, /* i : codec total bitrate */
185 : const Word16 sba_order, /* i : Ambisonic (SBA) order */
186 : Word16 *nchan_transport, /* o : number of transport channels */
187 : Word16 *nSCE, /* o : number of SCEs */
188 : Word16 *nCPE, /* o : number of CPEs */
189 : Word32 *core_nominal_brate, /* o : core-coding nominal bitrate */
190 : const Word16 sid_format /* i : IVAS format indicator from SID frame */
191 : )
192 : {
193 6107 : IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) )
194 : {
195 0 : IF( EQ_16( sid_format, SID_SBA_1TC ) )
196 : {
197 0 : *nchan_transport = 1;
198 0 : move16();
199 : }
200 : ELSE
201 : {
202 0 : *nchan_transport = 2;
203 0 : move16();
204 : }
205 : }
206 : ELSE
207 : {
208 6107 : *nchan_transport = ivas_get_sba_num_TCs_fx( ivas_total_brate, sba_order );
209 6107 : move16();
210 : }
211 :
212 6107 : IF( GT_16( *nchan_transport, 1 ) )
213 : {
214 3953 : *nCPE = shr( add( *nchan_transport, 1 ), 1 );
215 3953 : move16();
216 : }
217 : ELSE
218 : {
219 2154 : *nCPE = 0;
220 2154 : move16();
221 : }
222 :
223 6107 : *nSCE = s_max( 0, sub( *nchan_transport, shl( *nCPE, 1 ) ) );
224 6107 : move16();
225 :
226 6107 : IF( EQ_16( *nchan_transport, 1 ) )
227 : {
228 : /* map SPAR SID bitrate to SPAR active bitrate */
229 2154 : if ( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) )
230 : {
231 0 : ivas_total_brate = IVAS_32k;
232 0 : move32();
233 : }
234 2154 : assert( ivas_total_brate == IVAS_32k || ivas_total_brate == IVAS_24k4 || ivas_total_brate == IVAS_16k4 || ivas_total_brate == IVAS_13k2 );
235 2154 : IF( EQ_32( ivas_total_brate, IVAS_32k ) )
236 : {
237 469 : *core_nominal_brate = ACELP_24k40;
238 469 : move32();
239 : }
240 1685 : ELSE IF( EQ_32( ivas_total_brate, IVAS_24k4 ) )
241 : {
242 442 : *core_nominal_brate = ACELP_16k40;
243 442 : move32();
244 : }
245 1243 : ELSE IF( EQ_32( ivas_total_brate, IVAS_16k4 ) )
246 : {
247 650 : *core_nominal_brate = ACELP_13k20;
248 650 : move32();
249 : }
250 593 : ELSE IF( EQ_32( ivas_total_brate, IVAS_13k2 ) )
251 : {
252 593 : *core_nominal_brate = ACELP_9k60;
253 593 : move32();
254 : }
255 : }
256 :
257 6107 : return;
258 : }
259 :
260 : /*-----------------------------------------------------------------------------------------*
261 : * Function ivas_get_spar_table_idx()
262 : *
263 : * Get SPAR table index
264 : *-----------------------------------------------------------------------------------------*/
265 :
266 : /*! r: config. table index */
267 480877 : Word16 ivas_get_spar_table_idx_fx(
268 : const Word32 ivas_total_brate, /* i : IVAS total bitrate */
269 : const Word16 sba_order, /* i : Ambisonic (SBA) order */
270 : const Word16 bwidth, /* i : audio bandwidth */
271 : Word16 *bitlen, /* o : number of bits */
272 : Word16 *ind /* o : indice */
273 : )
274 : {
275 480877 : Word16 table_idx = 0, ind1[IVAS_SPAR_BR_TABLE_LEN];
276 480877 : Word16 i, j = 0, ind2 = -1;
277 480877 : move16();
278 480877 : move16();
279 480877 : move16();
280 :
281 10098417 : FOR( i = 0; i < IVAS_SPAR_BR_TABLE_LEN; i++ )
282 : {
283 9617540 : ind1[j] = 0;
284 9617540 : move16();
285 9617540 : test();
286 9617540 : IF( ( EQ_32( ivas_spar_br_table_consts[i].ivas_total_brate, ivas_total_brate ) ) &&
287 : ( EQ_16( ivas_spar_br_table_consts[i].sba_order, sba_order ) ) )
288 : {
289 480877 : ind1[j] = i;
290 480877 : j++;
291 480877 : move16();
292 : }
293 : }
294 :
295 480877 : FOR( i = 0; i < j; i++ )
296 : {
297 480877 : IF( EQ_16( ivas_spar_br_table_consts[ind1[i]].bwidth, bwidth ) )
298 : {
299 480877 : ind2 = i;
300 480877 : move16();
301 480877 : BREAK;
302 : }
303 : }
304 480877 : assert( j > 0 ); /* to check if bitrate entry is present */
305 480877 : assert( ind2 >= 0 ); /* to check if bw entry is present */
306 :
307 480877 : table_idx = ind1[ind2];
308 480877 : move16();
309 :
310 480877 : if ( ind != NULL )
311 : {
312 5183 : *ind = ind2;
313 5183 : move16();
314 : }
315 :
316 480877 : IF( bitlen != NULL )
317 : {
318 29833 : *bitlen = ivas_get_bits_to_encode( sub( j, 1 ) );
319 29833 : move16();
320 : }
321 :
322 480877 : return table_idx;
323 : }
324 : /*-------------------------------------------------------------------*
325 : * ivas_get_sba_num_TCs()
326 : *
327 : * Return number of TCs in SBA format
328 : *-------------------------------------------------------------------*/
329 :
330 : /*! r: number of transport channels */
331 288649 : Word16 ivas_get_sba_num_TCs_fx(
332 : const Word32 ivas_total_brate, /* i : IVAS total bitrate */
333 : const Word16 sba_order /* i : Ambisonic (SBA) order */
334 : )
335 : {
336 : Word16 table_idx, nchan_transport;
337 :
338 288649 : table_idx = ivas_get_spar_table_idx_fx( ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL );
339 :
340 288649 : nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport;
341 288649 : move16();
342 :
343 288649 : return nchan_transport;
344 : }
345 :
346 : /*-----------------------------------------------------------------------------------------*
347 : * Function ivas_get_pred_coeffs()
348 : *
349 : * Calculation of prediction coefficients
350 : *-----------------------------------------------------------------------------------------*/
351 :
352 : /*-----------------------------------------------------------------------------------------*
353 : * Function ivas_get_pred_coeffs_fx()
354 : *
355 : * Calculation of prediction coefficients
356 : *-----------------------------------------------------------------------------------------*/
357 :
358 305060 : static void ivas_get_pred_coeffs_enc_fx(
359 : Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
360 : Word16 *q_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
361 : Word32 ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_pred_coeffs*/
362 : Word16 *q_pred_coeffs,
363 : Word32 ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_dm_fv_re*/
364 : Word16 *q_dm_fv_re,
365 : const Word16 in_chans,
366 : const Word16 start_band,
367 : const Word16 end_band,
368 : const Word16 active_w,
369 : const Word16 active_w_vlbr,
370 : const Word16 dtx_vad,
371 : const Word16 from_dirac,
372 : const Word16 dyn_active_w_flag,
373 : const Word16 res_ind )
374 : {
375 : Word16 i, j, k, b;
376 : Word32 abs_value;
377 : Word32 w_norm_fac;
378 : Word32 L_tmp;
379 : Word16 q_tmp, e_tmp;
380 : Word64 abs_value64, tmp64;
381 : Word16 q_ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
382 : Word16 div_factor[IVAS_MAX_NUM_BANDS];
383 : Word16 div_factor_e[IVAS_MAX_NUM_BANDS];
384 305060 : Word16 pred_dim = sub( in_chans, 1 );
385 : Word16 tmp_shift, s_div, div_shift;
386 :
387 305060 : IF( EQ_16( from_dirac, 1 ) )
388 : {
389 147560 : w_norm_fac = 1;
390 147560 : move32();
391 : }
392 : ELSE
393 : {
394 157500 : w_norm_fac = 3;
395 157500 : move32();
396 : }
397 :
398 305060 : IF( active_w == 0 )
399 : {
400 : Word64 pPred_temp[IVAS_MAX_NUM_BANDS];
401 : Word16 q_pPred_temp[IVAS_MAX_NUM_BANDS];
402 :
403 217278 : set64_fx( pPred_temp, 0, IVAS_MAX_NUM_BANDS );
404 217278 : set16_fx( q_pPred_temp, 31, IVAS_MAX_NUM_BANDS );
405 1670446 : FOR( k = start_band; k < end_band; k++ )
406 : {
407 1453168 : div_factor[k] = BASOP_Util_Divide3232_Scale( ONE_IN_Q31 /*1 in q31*/, L_max( 1, cov_real[0][0][k] ), &s_div ); /*Q=15-(s_div-(31-q_cov_real))*/
408 1453168 : move16();
409 :
410 1453168 : div_factor_e[k] = sub( add( s_div, q_cov_real[0][0][k] ), 31 );
411 1453168 : move16();
412 : }
413 :
414 971312 : FOR( i = 0; i < pred_dim; i++ )
415 : {
416 6339938 : FOR( k = start_band; k < end_band; k++ )
417 : {
418 5585904 : tmp64 = W_mult_32_16( cov_real[i + 1][0][k], div_factor[k] ); /*q_cov_real+15-div_factor_e[k]+1*/
419 5585904 : tmp_shift = W_norm( tmp64 );
420 5585904 : IF( tmp64 != 0 )
421 : {
422 5130186 : ppPred_coeffs_re[i][k] = W_extract_h( W_shl( tmp64, tmp_shift ) ); // 1 + q_cov_real[i+1][0][k] + tmp_shift + 15 - div_factor_e[k] - 32
423 5130186 : move32();
424 5130186 : q_ppPred_coeffs_re[i][k] = add( sub( add( q_cov_real[i + 1][0][k], tmp_shift ), div_factor_e[k] ), 1 + 15 - 32 );
425 5130186 : move16();
426 : }
427 : ELSE
428 : {
429 455718 : ppPred_coeffs_re[i][k] = 0;
430 455718 : move32();
431 455718 : q_ppPred_coeffs_re[i][k] = 31;
432 455718 : move16();
433 : }
434 :
435 : // IVAS_CALCULATE_SQ_ABS_N( ppPred_coeffs_re[i][k], abs_value );
436 5585904 : abs_value = Mpy_32_32( ppPred_coeffs_re[i][k], ppPred_coeffs_re[i][k] ); // Q = 2*q_ppPred_coeffs_re[i][k] - 31
437 5585904 : q_tmp = sub( shl( q_ppPred_coeffs_re[i][k], 1 ), 31 );
438 :
439 5585904 : IF( GE_16( q_tmp, q_pPred_temp[k] ) )
440 : {
441 5578313 : abs_value = L_shr( abs_value, sub( q_tmp, q_pPred_temp[k] ) ); // q_tmp -> q_pPred_temp[k]
442 : }
443 : ELSE
444 : {
445 7591 : pPred_temp[k] = W_shr( pPred_temp[k], sub( q_pPred_temp[k], q_tmp ) ); // q_pPred_temp[k]->q_tmp
446 7591 : move64();
447 7591 : q_pPred_temp[k] = q_tmp;
448 7591 : move16();
449 : }
450 :
451 5585904 : pPred_temp[k] = W_add( pPred_temp[k], abs_value ); // Q = q_pPred_temp[k]
452 5585904 : move64();
453 : }
454 : }
455 :
456 1670446 : FOR( k = start_band; k < end_band; k++ )
457 : {
458 1453168 : tmp_shift = W_norm( pPred_temp[k] );
459 1453168 : e_tmp = sub( 31, sub( add( q_pPred_temp[k], tmp_shift ), 32 ) );
460 1453168 : L_tmp = Sqrt32( W_extract_h( W_shl( pPred_temp[k], tmp_shift ) ), &e_tmp ); // Q=31-e_tmp
461 :
462 1453168 : IF( BASOP_Util_Cmp_Mant32Exp( L_tmp, e_tmp, ONE_IN_Q31, 0 ) <= 0 )
463 : {
464 1381626 : L_tmp = ONE_IN_Q31;
465 1381626 : move32();
466 1381626 : e_tmp = 0;
467 1381626 : move16();
468 : }
469 :
470 1453168 : div_factor[k] = BASOP_Util_Divide3232_Scale( 1, L_tmp, &s_div ); // exp(0-e_tmp+s_div)
471 1453168 : move16();
472 1453168 : div_factor[k] = shl( div_factor[k], sub( add( s_div, 30 ), e_tmp ) ); // Q = Q14
473 1453168 : move16();
474 : }
475 :
476 217278 : tmp_shift = Q30; // To avoid saturation for Q31
477 217278 : move16();
478 971312 : FOR( i = 0; i < pred_dim; i++ )
479 : {
480 6339938 : FOR( k = start_band; k < end_band; k++ )
481 : {
482 5585904 : IF( NE_16( div_factor[k], ONE_IN_Q14 /*1 in Q14*/ ) )
483 : {
484 473648 : ppPred_coeffs_re[i][k] = L_shl( Mpy_32_16_1( ppPred_coeffs_re[i][k], div_factor[k] ), 1 ); // Q = q_ppPred_coeffs_re[i][k]
485 473648 : move32();
486 : }
487 5585904 : ppDM_Fv_re[i][k] = 0;
488 5585904 : move32();
489 :
490 5585904 : IF( ppPred_coeffs_re[i][k] != 0 )
491 : {
492 5130186 : tmp_shift = s_min( tmp_shift, add( norm_l( ppPred_coeffs_re[i][k] ), q_ppPred_coeffs_re[i][k] ) );
493 : }
494 : }
495 : }
496 971312 : FOR( i = 0; i < pred_dim; i++ )
497 : {
498 6339938 : FOR( k = start_band; k < end_band; k++ )
499 : {
500 5585904 : ppPred_coeffs_re[i][k] = L_shr( ppPred_coeffs_re[i][k], sub( q_ppPred_coeffs_re[i][k], tmp_shift ) ); // Q=tmp_shift
501 5585904 : move32();
502 : }
503 : }
504 217278 : *q_pred_coeffs = tmp_shift;
505 217278 : move16();
506 217278 : *q_dm_fv_re = 30; // To avoid saturation in Q31
507 217278 : move16();
508 : }
509 : ELSE
510 : {
511 : Word64 real64[IVAS_SPAR_MAX_CH - 1];
512 : Word64 re, dm_y;
513 : Word16 dm_beta_re_q;
514 : Word16 dm_alpha_q[IVAS_MAX_NUM_BANDS];
515 : Word16 dm_v_re_q[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
516 : Word32 dm_alpha[IVAS_MAX_NUM_BANDS], dm_v_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
517 : Word32 dm_g[IVAS_MAX_NUM_BANDS];
518 : Word16 real64_q[IVAS_SPAR_MAX_CH - 1];
519 : Word32 dm_f_local, dm_w, DM_F[IVAS_MAX_NUM_BANDS];
520 : Word16 DM_F_q[IVAS_MAX_NUM_BANDS], dm_g_q[IVAS_MAX_NUM_BANDS];
521 : Word32 num_f, den_f, passive_g, dm_beta_re /*, inv_den_f*/;
522 : Word32 activew_quad_thresh, g_th_sq;
523 : Word32 L_tmp1, L_tmp2;
524 : Word16 L_tmp1_q, L_tmp2_q;
525 : Word16 den_f_e, s_dm_f;
526 : Word16 guard_bits;
527 :
528 87782 : IF( EQ_16( dyn_active_w_flag, 1 ) )
529 : {
530 0 : activew_quad_thresh = ONE_IN_Q29; /*1 in Q29*/
531 0 : move32();
532 : }
533 : ELSE
534 : {
535 87782 : activew_quad_thresh = IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH_Q29; /*3.0f Q29*/
536 87782 : move32();
537 : }
538 87782 : g_th_sq = Mpy_32_32( activew_quad_thresh, activew_quad_thresh ); // Q27
539 :
540 87782 : guard_bits = sub( find_guarded_bits_fx( in_chans ), 1 );
541 552420 : FOR( k = start_band; k < end_band; k++ )
542 : {
543 464638 : IF( cov_real[1][0][k] == 0 )
544 : {
545 46275 : tmp64 = 0;
546 46275 : move64();
547 46275 : dm_alpha_q[k] = 127;
548 46275 : move16();
549 : }
550 : ELSE
551 : {
552 418363 : tmp64 = W_shr( W_mult0_32_32( cov_real[1][0][k], cov_real[1][0][k] ), guard_bits ); // Q = 2 * q_cov_real[1][0][k] - guard_bits
553 418363 : dm_alpha_q[k] = sub( shl( q_cov_real[1][0][k], 1 ), guard_bits );
554 418363 : move16();
555 : }
556 1393914 : FOR( i = 2; i < in_chans; i++ )
557 : {
558 : // IVAS_CALCULATE_SQ_ABS_N( cov_real[i][0][k], abs_value );
559 929276 : IF( cov_real[i][0][k] != 0 )
560 : {
561 869714 : abs_value64 = W_shr( W_mult0_32_32( cov_real[i][0][k], cov_real[i][0][k] ), guard_bits ); // Q = 2 * q_cov_real[i][0][k] - guard_bits
562 869714 : q_tmp = sub( shl( q_cov_real[i][0][k], 1 ), guard_bits );
563 869714 : tmp_shift = sub( q_tmp, dm_alpha_q[k] );
564 :
565 869714 : IF( tmp_shift < 0 )
566 : {
567 176849 : IF( LE_16( tmp_shift, -63 ) )
568 : {
569 46095 : tmp64 = abs_value64;
570 46095 : move64();
571 : }
572 : ELSE
573 : {
574 130754 : tmp64 = W_add( W_shl( tmp64, tmp_shift ), abs_value64 ); // Q=q_tmp
575 : }
576 176849 : dm_alpha_q[k] = q_tmp;
577 176849 : move16();
578 : }
579 : ELSE
580 : {
581 692865 : IF( LE_16( tmp_shift, 63 ) )
582 : {
583 692865 : tmp64 = W_add( tmp64, W_shr( abs_value64, tmp_shift ) ); // Q=dm_alpha_q[k]
584 : }
585 : }
586 : }
587 : }
588 464638 : IF( tmp64 != 0 )
589 : {
590 464458 : tmp_shift = W_norm( tmp64 );
591 464458 : e_tmp = sub( 63, add( dm_alpha_q[k], tmp_shift ) );
592 464458 : dm_alpha[k] = Sqrt32( W_extract_h( W_shl( tmp64, tmp_shift ) ), &e_tmp ); // Q=31-e_tmp
593 464458 : move32();
594 464458 : dm_alpha_q[k] = sub( 31, e_tmp );
595 464458 : move16();
596 :
597 464458 : div_factor[k] = BASOP_Util_Divide3232_Scale( ONE_IN_Q31 /*1 Q31*/, dm_alpha[k], &s_div ); // Q=15-(dm_alpha_q[k]+ s_div-31)
598 464458 : move16();
599 :
600 464458 : div_factor_e[k] = sub( add( dm_alpha_q[k], s_div ), 31 );
601 464458 : move16();
602 : }
603 : ELSE
604 : {
605 180 : dm_alpha[k] = 0;
606 180 : move32();
607 180 : dm_alpha_q[k] = 31;
608 180 : move16();
609 :
610 180 : div_factor[k] = 22204;
611 180 : move16();
612 :
613 180 : div_factor_e[k] = -37;
614 180 : move16();
615 : }
616 : }
617 :
618 351128 : FOR( i = 0; i < pred_dim; i++ )
619 : {
620 1657260 : FOR( k = start_band; k < end_band; k++ )
621 : {
622 1393914 : tmp64 = W_mult_32_16( cov_real[i + 1][0][k], div_factor[k] ); // Q=(15-div_factor_e[k]+q_cov_real[i+1][0][k])+1
623 1393914 : tmp_shift = W_norm( tmp64 );
624 1393914 : IF( tmp64 != 0 )
625 : {
626 1288077 : dm_v_re[i][k] = W_extract_h( W_shl( tmp64, tmp_shift ) ); // 1 + q_cov_real[i+1][0][k] + tmp_shift + 15 - div_factor_e[k] - 32
627 1288077 : move32();
628 1288077 : dm_v_re_q[i][k] = add( sub( add( q_cov_real[i + 1][0][k], tmp_shift ), div_factor_e[k] ), 1 + 15 - 32 );
629 1288077 : move16();
630 : }
631 : ELSE
632 : {
633 105837 : dm_v_re[i][k] = 0;
634 105837 : move32();
635 105837 : dm_v_re_q[i][k] = 31;
636 105837 : move16();
637 : }
638 : }
639 : }
640 :
641 87782 : IF( dtx_vad == 0 )
642 : {
643 3746 : dm_f_local = IVAS_ACTIVEW_DM_F_DTX_Q30; // q30
644 3746 : move32();
645 : }
646 : ELSE
647 : {
648 84036 : IF( active_w_vlbr )
649 : {
650 25408 : dm_f_local = IVAS_ACTIVEW_DM_F_VLBR_Q30; // q30
651 25408 : move32();
652 : }
653 : ELSE
654 : {
655 58628 : dm_f_local = IVAS_ACTIVEW_DM_F_Q30; // q30
656 58628 : move32();
657 : }
658 : }
659 :
660 552420 : FOR( b = start_band; b < end_band; b++ )
661 : {
662 464638 : set64_fx( real64, 0, pred_dim );
663 464638 : set16_fx( real64_q, 31, pred_dim );
664 :
665 1858552 : FOR( j = 0; j < pred_dim; j++ )
666 : {
667 5575656 : FOR( k = 1; k < in_chans; k++ )
668 : {
669 : // IVAS_RMULT_FLOAT( cov_real[j + 1][k][b], dm_v_re[k - 1][b], re );
670 4181742 : re = W_mult0_32_32( cov_real[j + 1][k][b], dm_v_re[k - 1][b] ); // Q=q_cov_real[j+1][k][b]+dm_v_re_q[k-1][b]
671 4181742 : tmp_shift = W_norm( re );
672 4181742 : IF( re != 0 )
673 : {
674 3641693 : q_tmp = sub( add( add( q_cov_real[j + 1][k][b], dm_v_re_q[k - 1][b] ), tmp_shift ), 32 );
675 : }
676 : ELSE
677 : {
678 540049 : q_tmp = 31;
679 540049 : move16();
680 : }
681 :
682 4181742 : IF( LT_16( q_tmp, real64_q[j] ) )
683 : {
684 1321583 : real64[j] = W_add( W_shr( real64[j], sub( real64_q[j], q_tmp ) ), W_extract_h( W_shl( re, tmp_shift ) ) ); // Q=q_tmp
685 1321583 : move64();
686 1321583 : real64_q[j] = q_tmp;
687 1321583 : move16();
688 : }
689 : ELSE
690 : {
691 2860159 : tmp_shift = sub( add( q_tmp, sub( 32, tmp_shift ) ), real64_q[j] );
692 2860159 : IF( LT_16( tmp_shift, 63 ) )
693 : {
694 2854952 : real64[j] = W_add( real64[j], W_shr( re, tmp_shift ) ); // Q=real64_q[j]
695 2854952 : move64();
696 : }
697 : }
698 : }
699 : }
700 :
701 464638 : tmp64 = 0;
702 464638 : move64();
703 464638 : dm_beta_re_q = 31;
704 464638 : move16();
705 1858552 : FOR( k = 0; k < pred_dim; k++ )
706 : {
707 : // IVAS_RMULT_FLOAT( real[k], dm_v_re[k][b], re );
708 1393914 : tmp_shift = W_norm( real64[k] );
709 1393914 : re = W_mult0_32_32( W_extract_h( W_shl( real64[k], tmp_shift ) ), dm_v_re[k][b] ); // Q=(real64[k]+tmp_shift-32)+dm_v_re_q
710 1393914 : q_tmp = sub( add( add( real64_q[k], dm_v_re_q[k][b] ), tmp_shift ), 32 );
711 1393914 : tmp_shift = W_norm( re );
712 1393914 : IF( re != 0 )
713 : {
714 1288077 : q_tmp = sub( add( q_tmp, tmp_shift ), 32 );
715 : }
716 : ELSE
717 : {
718 105837 : q_tmp = 31;
719 105837 : move16();
720 : }
721 :
722 1393914 : IF( LT_16( q_tmp, dm_beta_re_q ) )
723 : {
724 437154 : tmp64 = W_add( W_shr( tmp64, sub( dm_beta_re_q, q_tmp ) ), W_extract_h( W_shl( re, tmp_shift ) ) ); // Q=q_tmp
725 437154 : dm_beta_re_q = q_tmp;
726 437154 : move16();
727 : }
728 : ELSE
729 : {
730 956760 : tmp_shift = sub( add( q_tmp, sub( 32, tmp_shift ) ), dm_beta_re_q );
731 956760 : IF( LT_16( tmp_shift, 63 ) )
732 : {
733 911093 : tmp64 = W_add( tmp64, W_shr( re, tmp_shift ) ); // Q=dm_beta_re_q
734 : }
735 : }
736 : }
737 464638 : tmp_shift = W_norm( tmp64 );
738 464638 : dm_beta_re = W_extract_h( W_shl( tmp64, tmp_shift ) ); // Q=dm_beta_re_q+tmp_shift-32
739 464638 : IF( tmp64 != 0 )
740 : {
741 464458 : dm_beta_re_q = sub( add( dm_beta_re_q, tmp_shift ), 32 );
742 : }
743 : ELSE
744 : {
745 180 : dm_beta_re_q = 31;
746 180 : move16();
747 : }
748 :
749 464638 : dm_w = cov_real[0][0][b]; // q_cov_real[0][0][b]
750 464638 : move32();
751 464638 : den_f = L_max( dm_w, 1 ); // q_cov_real[0][0][b]
752 464638 : passive_g = L_deposit_l( BASOP_Util_Divide3232_Scale( dm_alpha[b], den_f, &s_div ) ); // dm_alpha_q[b] - q_cov_real[0][0][b] + 15 - s_div
753 :
754 464638 : div_shift = sub( Q29, add( sub( dm_alpha_q[b], q_cov_real[0][0][b] ), sub( 15, s_div ) ) );
755 464638 : passive_g = L_shl_sat( passive_g, div_shift ); // Q = 29
756 :
757 464638 : IF( EQ_16( dyn_active_w_flag, 1 ) )
758 : {
759 0 : dm_alpha[b] = 0;
760 0 : move32();
761 0 : dm_alpha_q[b] = 0;
762 0 : move16();
763 0 : dm_w = 0;
764 0 : move32();
765 0 : FOR( i = 0; i < pred_dim; i++ )
766 : {
767 0 : dm_v_re[i][b] = 0;
768 0 : move32();
769 0 : dm_v_re_q[i][b] = 31;
770 0 : move16();
771 : }
772 0 : dm_v_re[res_ind - 1][b] = MAX_32; /*1 Q31*/
773 0 : move32();
774 0 : dm_v_re_q[i][b] = 31;
775 0 : move16();
776 :
777 0 : passive_g = activew_quad_thresh; // q29
778 0 : move32();
779 : }
780 :
781 464638 : IF( LT_32( passive_g, activew_quad_thresh ) ) // q29
782 : {
783 : /*linear activeW*/
784 464638 : dm_y = 0;
785 464638 : move32();
786 464638 : q_tmp = 31;
787 464638 : move16();
788 :
789 1858552 : FOR( k = 1; k < in_chans; k++ )
790 : {
791 1393914 : IF( GT_16( q_tmp, q_cov_real[k][k][b] ) )
792 : {
793 574803 : dm_y = W_add( W_shr( dm_y, sub( q_tmp, q_cov_real[k][k][b] ) ), cov_real[k][k][b] ); // q_cov_real[k][k][b]
794 574803 : q_tmp = q_cov_real[k][k][b];
795 574803 : move16();
796 : }
797 : ELSE
798 : {
799 819111 : dm_y = W_add( dm_y, L_shr( cov_real[k][k][b], sub( q_cov_real[k][k][b], q_tmp ) ) ); // q_tmp
800 : }
801 : }
802 464638 : tmp64 = W_mult0_32_32( w_norm_fac, dm_w ); // Q=q_tmp
803 464638 : IF( LT_16( q_tmp, q_cov_real[0][0][b] ) )
804 : {
805 8590 : tmp64 = W_shr( tmp64, sub( q_cov_real[0][0][b], q_tmp ) ); // Q=q_tmp
806 : }
807 : ELSE
808 : {
809 456048 : q_tmp = q_cov_real[0][0][b];
810 456048 : move16();
811 456048 : dm_y = W_shr( dm_y, sub( q_tmp, q_cov_real[0][0][b] ) ); // Q=q_cov_real[0][0][b]
812 : }
813 :
814 464638 : if ( GT_64( tmp64, dm_y ) )
815 : {
816 426736 : dm_y = tmp64; // Q=q_tmp
817 426736 : move16();
818 : }
819 :
820 464638 : tmp_shift = W_norm( dm_y );
821 464638 : IF( dm_y == 0 )
822 : {
823 0 : tmp_shift = 32;
824 0 : move16();
825 0 : den_f = W_extract_l( dm_y );
826 : }
827 : ELSE
828 : {
829 464638 : den_f = W_extract_h( W_shl( dm_y, tmp_shift ) ); // q_tmp + tmp_shift - 32
830 : }
831 :
832 464638 : den_f = L_max( den_f, 1 ); // q_tmp + tmp_shift - 32
833 :
834 464638 : DM_F[b] = L_deposit_l( BASOP_Util_Divide3232_Scale( Mpy_32_32( dm_f_local, dm_alpha[b] ), den_f, &s_div ) ); // Q30 + dm_alpha_q[b] - 31 - q_tmp - tmp_shift + 32 + 15 - s_div
835 464638 : move32();
836 :
837 464638 : DM_F_q[b] = add( sub( sub( dm_alpha_q[b], add( q_tmp, tmp_shift ) ), s_div ), ( 30 - 31 + 32 + 15 ) );
838 464638 : move16();
839 :
840 464638 : IF( LT_32( ONE_IN_Q30, L_shl_sat( DM_F[b], sub( Q30, DM_F_q[b] ) ) ) ) // q30
841 : {
842 0 : DM_F[b] = ONE_IN_Q31; /*1 Q31*/
843 0 : move32();
844 0 : DM_F_q[b] = Q31;
845 0 : move16();
846 : }
847 :
848 464638 : tmp64 = W_mult0_32_32( DM_F[b], DM_F[b] ); /*Q=(2*DM_F_q[b])*/
849 464638 : tmp_shift = W_norm( tmp64 );
850 464638 : IF( tmp64 == 0 )
851 : {
852 180 : tmp_shift = 32;
853 180 : move16();
854 : }
855 : ELSE
856 : {
857 464458 : tmp64 = W_shl( tmp64, tmp_shift ); /*Q=(2*DM_F_q[b]+tmp_shift)*/
858 : }
859 464638 : tmp64 = W_mult0_32_32( W_extract_h( tmp64 ), dm_beta_re ); // 2 * DM_F_q[b] + tmp_shift - 32 + dm_beta_re_q
860 464638 : q_tmp = sub( add( add( shl( DM_F_q[b], 1 ), tmp_shift ), dm_beta_re_q ), 32 );
861 464638 : tmp_shift = sub( W_norm( tmp64 ), 2 );
862 464638 : IF( tmp64 == 0 )
863 : {
864 180 : tmp_shift = 32;
865 180 : move16();
866 : }
867 : ELSE
868 : {
869 464458 : tmp64 = W_shl( tmp64, tmp_shift ); // Q=q_tmp+tmp_shift
870 : }
871 464638 : L_tmp2 = W_extract_h( tmp64 ); // Q=q_tmp+tmp_shift-32
872 464638 : L_tmp2_q = sub( add( q_tmp, tmp_shift ), 32 );
873 :
874 464638 : tmp64 = W_shl( W_mult0_32_32( dm_alpha[b], DM_F[b] ), 1 ); // Q=dm_alpha_q[b]+DM_F_q[b]
875 464638 : tmp_shift = sub( W_norm( tmp64 ), 2 );
876 464638 : IF( tmp64 == 0 )
877 : {
878 180 : tmp_shift = 32;
879 180 : move16();
880 : }
881 : ELSE
882 : {
883 464458 : tmp64 = W_shl( tmp64, tmp_shift ); // Q=dm_alpha_q[b]+DM_F_q[b]+tmp_shift
884 : }
885 464638 : L_tmp1 = W_extract_h( tmp64 ); // DM_F_q[b] + dm_alpha_q[b] + tmp_shift - 32
886 464638 : L_tmp1_q = sub( add( add( DM_F_q[b], dm_alpha_q[b] ), tmp_shift ), 32 );
887 :
888 464638 : IF( LT_16( L_tmp2_q, L_tmp1_q ) )
889 : {
890 0 : L_tmp1 = L_add( L_shr( L_tmp1, sub( L_tmp1_q, L_tmp2_q ) ), L_tmp2 ); // Q=L_tmp2_q
891 0 : L_tmp1_q = L_tmp2_q;
892 0 : move16();
893 : }
894 : ELSE
895 : {
896 464638 : L_tmp1 = L_add( L_tmp1, L_shr( L_tmp2, sub( L_tmp2_q, L_tmp1_q ) ) ); // Q=L_tmp1_q
897 : }
898 :
899 464638 : tmp_shift = sub( norm_l( dm_w ), 1 );
900 464638 : L_tmp2 = L_shl( dm_w, tmp_shift ); // Q=q_cov_real[0][0][b]+ tmp_shift
901 464638 : L_tmp2_q = add( q_cov_real[0][0][b], tmp_shift );
902 :
903 464638 : IF( LT_16( L_tmp2_q, L_tmp1_q ) )
904 : {
905 353282 : den_f = L_add( L_shr( L_tmp1, sub( L_tmp1_q, L_tmp2_q ) ), L_tmp2 ); // Q=L_tmp2_q
906 353282 : den_f_e = sub( 31, L_tmp2_q );
907 : }
908 : ELSE
909 : {
910 111356 : den_f = L_add( L_tmp1, L_shr( L_tmp2, sub( L_tmp2_q, L_tmp1_q ) ) ); // Q=L_tmp2_q
911 111356 : den_f_e = sub( 31, L_tmp1_q );
912 : }
913 :
914 464638 : den_f = L_max( den_f, 1 ); // Q=31-den_f_e
915 :
916 464638 : tmp64 = W_mult0_32_32( DM_F[b], dm_beta_re ); // Q= DM_F_q[b]+dm_beta_re_q
917 464638 : tmp_shift = sub( W_norm( tmp64 ), 1 );
918 464638 : IF( tmp64 == 0 )
919 : {
920 180 : tmp_shift = 32;
921 180 : move16();
922 : }
923 : ELSE
924 : {
925 464458 : tmp64 = W_shl( tmp64, tmp_shift ); // Q= DM_F_q[b]+dm_beta_re_q+tmp_shift
926 : }
927 464638 : L_tmp2_q = sub( add( add( DM_F_q[b], dm_beta_re_q ), tmp_shift ), 32 );
928 464638 : L_tmp2 = W_extract_h( tmp64 ); // Q= DM_F_q[b]+dm_beta_re_q+tmp_shift-32
929 :
930 464638 : tmp_shift = sub( norm_l( dm_alpha[b] ), 1 );
931 :
932 464638 : IF( LT_16( L_tmp2_q, add( dm_alpha_q[b], tmp_shift ) ) )
933 : {
934 1224 : L_tmp1 = L_add( L_shr( dm_alpha[b], sub( dm_alpha_q[b], L_tmp2_q ) ), L_tmp2 ); // Q=L_tmp2_q
935 1224 : L_tmp1_q = L_tmp2_q;
936 1224 : move16();
937 : }
938 : ELSE
939 : {
940 463414 : L_tmp1_q = add( dm_alpha_q[b], tmp_shift );
941 463414 : L_tmp1 = L_add( L_shl( dm_alpha[b], tmp_shift ), L_shr( L_tmp2, sub( L_tmp2_q, L_tmp1_q ) ) ); // Q=L_tmp1_q
942 : }
943 :
944 464638 : dm_g[b] = L_deposit_l( BASOP_Util_Divide3232_Scale( L_tmp1, den_f, &s_div ) ); // L_tmp1_q - (31 - den_f_e) + (15 - s_div)
945 464638 : move32();
946 464638 : dm_g_q[b] = add( sub( add( L_tmp1_q, den_f_e ), s_div ), 15 - 31 );
947 464638 : move16();
948 : }
949 : ELSE
950 : {
951 : Word32 sqrt_val;
952 : Word16 val_e;
953 : Word16 num_f_e;
954 :
955 : /* quadratic activeW */
956 0 : tmp64 = W_shl( W_mult0_32_32( dm_alpha[b], activew_quad_thresh ), 1 ); // Q=dm_alpha_q[b]+29
957 0 : tmp_shift = sub( W_norm( tmp64 ), 1 );
958 0 : IF( tmp64 == 0 )
959 : {
960 0 : tmp_shift = 32;
961 0 : move16();
962 : }
963 : ELSE
964 : {
965 0 : tmp64 = W_shl( tmp64, tmp_shift ); // Q=dm_alpha_q+29+tmp_shift
966 : }
967 0 : L_tmp1 = W_extract_h( tmp64 ); // Q29 + dm_alpha_q[b] + tmp_shift - 32
968 0 : L_tmp1_q = sub( add( add( Q29, dm_alpha_q[b] ), tmp_shift ), 32 ); // Q=dm_alpha_q+29+1+tmp_shift-32
969 :
970 0 : num_f = BASOP_Util_Add_Mant32Exp( dm_beta_re, sub( 31, dm_beta_re_q ), L_negate( L_tmp1 ), sub( 31, L_tmp1_q ), &num_f_e ); // Q=31-num_f_e
971 :
972 0 : sqrt_val = Mpy_32_32( Mpy_32_32( dm_alpha[b], dm_alpha[b] ), g_th_sq ); //((2*dm_alpha_q[b]-31)+27-31)-2 ,reducing the Q by 2 instead of multiplication by 4
973 0 : val_e = sub( 31, sub( sub( add( sub( shl( dm_alpha_q[b], 1 ), 31 ), 27 ), 31 ), 2 ) ); // reducing the Q by 2 instead of multiplication by 4
974 0 : sqrt_val = BASOP_Util_Add_Mant32Exp( sqrt_val, val_e, Mpy_32_32( dm_beta_re, dm_beta_re ), sub( 31, sub( shl( dm_beta_re_q, 1 ), 31 ) ), &val_e ); // q=31-val_e
975 0 : sqrt_val = BASOP_Util_Add_Mant32Exp( sqrt_val, val_e, L_negate( Mpy_32_32( Mpy_32_32( dm_beta_re, g_th_sq ), dm_w ) ), sub( 31, sub( sub( add( sub( add( dm_beta_re_q, 27 ), 31 ), q_cov_real[0][0][b] ), 31 ), 2 ) ) /* reducing the Q by 2 instead of multiplication by 4*/, &val_e ); // q=31-val_e
976 : // val_e = norm_l( sqrt_val );
977 0 : sqrt_val = Sqrt32( sqrt_val, &val_e ); // q=31-val_e
978 :
979 0 : num_f = BASOP_Util_Add_Mant32Exp( num_f, num_f_e, sqrt_val, val_e, &num_f_e ); // q=31-num_f_e
980 :
981 0 : den_f = Mpy_32_32( dm_beta_re, g_th_sq ); // Q=dm_beta_re_q+27-31-1
982 0 : den_f_e = add( add( sub( 31, dm_beta_re_q ), 4 ), 1 ); // adding the exp with 1 instead of multiplication by 2
983 0 : den_f = L_max( den_f, 1 ); // q=31-den_f_e
984 0 : dm_g[b] = activew_quad_thresh; // Q29
985 0 : move32();
986 0 : dm_g_q[b] = Q29;
987 0 : move16();
988 0 : DM_F[b] = BASOP_Util_Divide3232_Scale_newton( Mpy_32_32( dm_g[b], num_f ), den_f, &s_dm_f ); // Q=(31-(s_dm_f+2+num_f_e-den_f_e))
989 0 : move32();
990 0 : DM_F_q[b] = sub( 31, add( s_dm_f, sub( add( 2, num_f_e ), den_f_e ) ) );
991 0 : move16();
992 : }
993 : }
994 :
995 87782 : *q_pred_coeffs = 30; // To avoid saturation in Q31
996 87782 : move16();
997 87782 : *q_dm_fv_re = 30; // To avoid saturation in Q31
998 87782 : move16();
999 :
1000 351128 : FOR( i = 0; i < pred_dim; i++ )
1001 : {
1002 1657260 : FOR( b = start_band; b < end_band; b++ )
1003 : {
1004 1393914 : tmp64 = W_mult0_32_32( dm_v_re[i][b], dm_g[b] ); // dm_v_re_q[i][b]+dm_g_q[b]
1005 1393914 : tmp_shift = W_norm( tmp64 );
1006 1393914 : IF( tmp64 == 0 )
1007 : {
1008 105837 : tmp_shift = 32;
1009 105837 : move16();
1010 : }
1011 : ELSE
1012 : {
1013 1288077 : tmp64 = W_shl( tmp64, tmp_shift ); // dm_v_re_q[i][b]+dm_g_q[b]+tmp_shift
1014 : }
1015 1393914 : ppPred_coeffs_re[i][b] = W_extract_h( tmp64 ); // Q = dm_v_re_q[i][b] + dm_g_q[b] + tmp_shift - 32
1016 1393914 : move32();
1017 1393914 : q_ppPred_coeffs_re[i][b] = sub( add( add( dm_v_re_q[i][b], dm_g_q[b] ), tmp_shift ), 32 );
1018 1393914 : move16();
1019 :
1020 1393914 : tmp64 = W_mult0_32_32( dm_v_re[i][b], DM_F[b] ); // Q = dm_v_re_q[i][b] + DM_F_q[b]
1021 1393914 : tmp_shift = W_norm( tmp64 );
1022 1393914 : IF( tmp64 == 0 )
1023 : {
1024 105837 : tmp_shift = 32;
1025 105837 : move16();
1026 : }
1027 : ELSE
1028 : {
1029 1288077 : tmp64 = W_shl( tmp64, tmp_shift ); // Q = dm_v_re_q[i][b] + DM_F_q[b] + tmp_shift
1030 : }
1031 1393914 : ppDM_Fv_re[i][b] = W_extract_h( tmp64 ); // Q = dm_v_re_q[i][b] + DM_F_q[b] + tmp_shift - 32
1032 1393914 : move32();
1033 1393914 : dm_v_re_q[i][b] = sub( add( add( dm_v_re_q[i][b], DM_F_q[b] ), tmp_shift ), 32 );
1034 1393914 : move16();
1035 : // if ( ppDM_Fv_re[i][b] == 0 )
1036 : //{
1037 : // dm_v_re_q[i][b] = Q31;
1038 : // move16();
1039 : // }
1040 :
1041 1393914 : IF( ppPred_coeffs_re[i][b] )
1042 : {
1043 1288077 : *q_pred_coeffs = s_min( *q_pred_coeffs, q_ppPred_coeffs_re[i][b] );
1044 1288077 : move16();
1045 : }
1046 1393914 : IF( ppDM_Fv_re[i][b] )
1047 : {
1048 1288077 : *q_dm_fv_re = s_min( *q_dm_fv_re, dm_v_re_q[i][b] );
1049 1288077 : move16();
1050 : }
1051 : }
1052 : }
1053 351128 : FOR( i = 0; i < pred_dim; i++ )
1054 : {
1055 1657260 : FOR( b = start_band; b < end_band; b++ )
1056 : {
1057 1393914 : ppPred_coeffs_re[i][b] = L_shr( ppPred_coeffs_re[i][b], sub( q_ppPred_coeffs_re[i][b], *q_pred_coeffs ) ); // Q=*q_pred_coeffs
1058 1393914 : move32();
1059 1393914 : ppDM_Fv_re[i][b] = L_shr( ppDM_Fv_re[i][b], sub( dm_v_re_q[i][b], *q_dm_fv_re ) ); // Q=*q_dm_fv_re
1060 1393914 : move32();
1061 : }
1062 : }
1063 : }
1064 :
1065 305060 : return;
1066 : }
1067 :
1068 584711 : static void ivas_get_pred_coeffs_fx(
1069 : Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*Q30*/
1070 : Word32 ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_pred_coeffs*/
1071 : Word32 ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_dm_fv_re*/
1072 : const Word16 in_chans,
1073 : const Word16 start_band,
1074 : const Word16 end_band,
1075 : const Word16 active_w,
1076 : const Word16 active_w_vlbr,
1077 : const Word16 dtx_vad,
1078 : const Word16 from_dirac,
1079 : const Word16 dyn_active_w_flag,
1080 : const Word16 res_ind,
1081 : Word16 *q_pred_coeffs,
1082 : Word16 *q_dm_fv_re )
1083 : {
1084 : Word16 i, j, k, b, p;
1085 : Word32 abs_value;
1086 : Word32 w_norm_fac;
1087 : Word32 one_in_q;
1088 : Word32 div_factor[IVAS_MAX_NUM_BANDS];
1089 584711 : Word16 pred_dim = sub( in_chans, 1 );
1090 : Word16 tmp_shift, prev_tmp_shift, s_div, div_shift;
1091 :
1092 584711 : IF( EQ_16( from_dirac, 1 ) )
1093 : {
1094 584711 : w_norm_fac = ONE_IN_Q29; /*1 q29*/
1095 584711 : move32();
1096 : }
1097 : ELSE
1098 : {
1099 0 : w_norm_fac = 3 * ONE_IN_Q29; /* 3 q29*/
1100 0 : move32();
1101 : }
1102 584711 : tmp_shift = Q30;
1103 584711 : move16();
1104 584711 : IF( active_w == 0 )
1105 : {
1106 : Word32 pPred_temp[IVAS_MAX_NUM_BANDS];
1107 : Word16 q_pred_temp;
1108 467230 : prev_tmp_shift = 31;
1109 467230 : move16();
1110 :
1111 467230 : set32_fx( pPred_temp, 0, IVAS_MAX_NUM_BANDS );
1112 2265630 : FOR( k = start_band; k < end_band; k++ )
1113 : {
1114 1798400 : div_factor[k] = L_max( 1, cov_real[0][0][k] ); // q30
1115 1798400 : move32();
1116 1798400 : tmp_shift = Q30;
1117 1798400 : move16();
1118 1798400 : IF( NE_32( cov_real[0][0][k], ONE_IN_Q30 ) ) // q30
1119 : {
1120 0 : div_factor[k] = L_deposit_l( BASOP_Util_Divide3232_Scale( ONE_IN_Q31 /*1 q31*/, div_factor[k], &s_div ) ); // Q=15-(s_div-(31-30))
1121 0 : move32();
1122 0 : IF( s_div < 0 )
1123 : {
1124 0 : div_shift = add( 15, s_div );
1125 0 : tmp_shift = Q30;
1126 0 : move16();
1127 : }
1128 : ELSE
1129 : {
1130 0 : div_shift = 15;
1131 0 : move16();
1132 0 : tmp_shift = sub( Q30, s_div );
1133 : }
1134 0 : div_factor[k] = L_shl( div_factor[k], div_shift ); // Q = tmp_shift
1135 0 : move16();
1136 :
1137 0 : IF( LT_16( tmp_shift, prev_tmp_shift ) )
1138 : {
1139 0 : FOR( p = start_band; p < k; p++ )
1140 : {
1141 0 : div_factor[p] = L_shr( div_factor[p], sub( prev_tmp_shift, tmp_shift ) ); // tmp_shift
1142 0 : move32();
1143 : }
1144 0 : prev_tmp_shift = tmp_shift;
1145 0 : move16();
1146 : }
1147 0 : ELSE IF( GT_16( tmp_shift, prev_tmp_shift ) )
1148 : {
1149 0 : div_factor[k] = L_shr( div_factor[k], sub( tmp_shift, prev_tmp_shift ) ); // prev_tmp_shift
1150 0 : move32();
1151 0 : tmp_shift = prev_tmp_shift;
1152 0 : move16();
1153 : }
1154 : }
1155 : }
1156 :
1157 1868920 : FOR( i = 0; i < pred_dim; i++ )
1158 : {
1159 6796890 : FOR( k = start_band; k < end_band; k++ )
1160 : {
1161 5395200 : ppPred_coeffs_re[i][k] = Mpy_32_32( cov_real[i + 1][0][k], div_factor[k] ); // Q30 + temp_shift - 31 => tmp_shift - 1
1162 5395200 : move32();
1163 :
1164 : // IVAS_CALCULATE_SQ_ABS_N( ppPred_coeffs_re[i][k], abs_value );
1165 5395200 : abs_value = Mpy_32_32( ppPred_coeffs_re[i][k], ppPred_coeffs_re[i][k] ); // Q = 2*tmp_shift - 2 - 31
1166 :
1167 5395200 : pPred_temp[k] = L_add( pPred_temp[k], abs_value ); // Q= 2*tmp_shift - 2 - 31
1168 5395200 : move32();
1169 : }
1170 : }
1171 467230 : *q_pred_coeffs = sub( tmp_shift, 1 );
1172 467230 : move16();
1173 :
1174 2265630 : FOR( k = start_band; k < end_band; k++ )
1175 : {
1176 1798400 : q_pred_temp = sub( 31, sub( shl( *q_pred_coeffs, 1 ), 31 ) );
1177 1798400 : pPred_temp[k] = Sqrt32( pPred_temp[k], &q_pred_temp ); // q=31-q_pred_temp
1178 1798400 : move32();
1179 :
1180 1798400 : IF( LT_16( q_pred_temp, 1 ) )
1181 : {
1182 1733441 : pPred_temp[k] = L_shr( pPred_temp[k], add( abs_s( q_pred_temp ), 1 ) ); // Q30
1183 1733441 : move32();
1184 1733441 : q_pred_temp = 1;
1185 1733441 : move16();
1186 : }
1187 64959 : ELSE IF( GT_16( q_pred_temp, 1 ) )
1188 : {
1189 100 : pPred_temp[k] = L_shl( pPred_temp[k], sub( abs_s( q_pred_temp ), 1 ) ); // Q30
1190 100 : move32();
1191 100 : q_pred_temp = 1;
1192 100 : move16();
1193 : }
1194 :
1195 1798400 : one_in_q = L_shl( 1, sub( 31, q_pred_temp ) ); /*Q=q_pred_temp*/
1196 :
1197 1798400 : IF( LT_32( one_in_q, pPred_temp[k] ) )
1198 : {
1199 4531 : div_factor[k] = pPred_temp[k]; /*Q=q_pred_temp*/
1200 4531 : move32();
1201 :
1202 4531 : div_factor[k] = L_deposit_l( BASOP_Util_Divide3232_Scale( one_in_q, div_factor[k], &s_div ) ); // q=15-s_div
1203 4531 : move32();
1204 4531 : IF( s_div < 0 )
1205 : {
1206 0 : div_shift = add( 15, s_div );
1207 0 : tmp_shift = Q30;
1208 0 : move16();
1209 : }
1210 : ELSE
1211 : {
1212 4531 : div_shift = 15;
1213 4531 : move16();
1214 4531 : tmp_shift = sub( Q30, s_div );
1215 : }
1216 4531 : div_factor[k] = L_shl( div_factor[k], div_shift ); // Q = tmp_shift
1217 4531 : move32();
1218 : }
1219 : ELSE
1220 : {
1221 1793869 : div_factor[k] = one_in_q; // q=31-q_pred_temp
1222 1793869 : move32();
1223 1793869 : tmp_shift = sub( 31, q_pred_temp );
1224 : }
1225 :
1226 1798400 : IF( LT_16( tmp_shift, prev_tmp_shift ) )
1227 : {
1228 468290 : FOR( p = start_band; p < k; p++ )
1229 : {
1230 596 : div_factor[p] = L_shr( div_factor[p], sub( prev_tmp_shift, tmp_shift ) ); // q=tmp_shift
1231 596 : move32();
1232 : }
1233 467694 : prev_tmp_shift = tmp_shift;
1234 467694 : move16();
1235 : }
1236 1330706 : ELSE IF( GT_16( tmp_shift, prev_tmp_shift ) )
1237 : {
1238 507 : div_factor[k] = L_shr( div_factor[k], sub( tmp_shift, prev_tmp_shift ) ); // q=prev_tmp_shift
1239 507 : move32();
1240 507 : tmp_shift = prev_tmp_shift;
1241 507 : move16();
1242 : }
1243 : }
1244 :
1245 1868920 : FOR( i = 0; i < pred_dim; i++ )
1246 : {
1247 6796890 : FOR( k = start_band; k < end_band; k++ )
1248 : {
1249 5395200 : ppPred_coeffs_re[i][k] = Mpy_32_32( ppPred_coeffs_re[i][k], div_factor[k] ); // Q = q_pred_coeffs + tmp_shift -31
1250 5395200 : move32();
1251 5395200 : ppDM_Fv_re[i][k] = 0;
1252 5395200 : move32();
1253 : }
1254 : }
1255 467230 : *q_pred_coeffs = sub( add( *q_pred_coeffs, tmp_shift ), 31 );
1256 467230 : *q_dm_fv_re = 0;
1257 467230 : move16();
1258 : }
1259 : ELSE
1260 : {
1261 : Word32 dm_alpha[IVAS_MAX_NUM_BANDS], dm_v_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
1262 117481 : Word32 real[IVAS_SPAR_MAX_CH - 1], dm_beta_re = 0, dm_g[IVAS_MAX_NUM_BANDS];
1263 : Word32 dm_f_local, dm_w, dm_y, DM_F[IVAS_MAX_NUM_BANDS];
1264 : Word32 num_f, den_f, passive_g /*, inv_den_f*/;
1265 : Word32 activew_quad_thresh, g_th_sq;
1266 : Word32 L_tmp1, L_tmp2;
1267 : Word16 L_tmp2_q;
1268 : Word16 dm_alpha_e, den_f_e, s_dm_f;
1269 117481 : prev_tmp_shift = 31;
1270 117481 : dm_alpha_e = 0;
1271 117481 : Word16 dm_beta_re_e = 0;
1272 117481 : move32();
1273 117481 : move16();
1274 117481 : move16();
1275 117481 : move16();
1276 :
1277 :
1278 117481 : IF( EQ_16( dyn_active_w_flag, 1 ) )
1279 : {
1280 0 : activew_quad_thresh = ONE_IN_Q29; // 1 q29
1281 0 : move32();
1282 : }
1283 : ELSE
1284 : {
1285 117481 : activew_quad_thresh = IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH_Q29; // 3 q29
1286 117481 : move32();
1287 : }
1288 117481 : g_th_sq = Mpy_32_32( activew_quad_thresh, activew_quad_thresh ); // Q27
1289 :
1290 117481 : set32_fx( dm_alpha, 0, IVAS_MAX_NUM_BANDS );
1291 :
1292 469924 : FOR( i = 1; i < in_chans; i++ )
1293 : {
1294 1664967 : FOR( k = start_band; k < end_band; k++ )
1295 : {
1296 : // IVAS_CALCULATE_SQ_ABS_N( cov_real[i][0][k], abs_value );
1297 1312524 : abs_value = Mpy_32_32( cov_real[i][0][k], cov_real[i][0][k] ); // Q29
1298 1312524 : dm_alpha[k] = L_add( dm_alpha[k], abs_value ); // Q29
1299 1312524 : move32();
1300 : }
1301 : }
1302 :
1303 554989 : FOR( k = start_band; k < end_band; k++ )
1304 : {
1305 437508 : dm_alpha_e = 31 - Q29;
1306 437508 : dm_alpha[k] = Sqrt32( dm_alpha[k], &dm_alpha_e ); // q=31-dm_alpha_e
1307 437508 : move32();
1308 :
1309 437508 : div_factor[k] = L_max( dm_alpha[k], 1 ); // q=31-dm_alpha_e
1310 437508 : move32();
1311 :
1312 437508 : div_factor[k] = L_deposit_l( BASOP_Util_Divide3232_Scale( ONE_IN_Q31, div_factor[k], &s_div ) ); // q=15-(s_div+(0-dm_alpha_e))
1313 437508 : move32();
1314 437508 : IF( s_div < 0 )
1315 : {
1316 0 : div_shift = add( 15, sub( s_div, dm_alpha_e ) );
1317 0 : tmp_shift = Q30;
1318 0 : move16();
1319 : }
1320 : ELSE
1321 : {
1322 437508 : div_shift = 15;
1323 437508 : move16();
1324 437508 : tmp_shift = sub( Q30, sub( s_div, dm_alpha_e ) );
1325 : }
1326 437508 : div_factor[k] = L_shl( div_factor[k], div_shift ); // Q = tmp_shift
1327 437508 : move32();
1328 :
1329 437508 : IF( LT_16( tmp_shift, prev_tmp_shift ) )
1330 : {
1331 221616 : FOR( p = start_band; p < k; p++ )
1332 : {
1333 62086 : div_factor[p] = L_shr( div_factor[p], sub( prev_tmp_shift, tmp_shift ) ); // q=tmp_shift
1334 62086 : move32();
1335 : }
1336 159530 : prev_tmp_shift = tmp_shift;
1337 159530 : move16();
1338 : }
1339 277978 : ELSE IF( GT_16( tmp_shift, prev_tmp_shift ) )
1340 : {
1341 26410 : div_factor[k] = L_shr( div_factor[k], sub( tmp_shift, prev_tmp_shift ) ); // q=prev_tmp_shift
1342 26410 : move32();
1343 26410 : tmp_shift = prev_tmp_shift;
1344 26410 : move16();
1345 : }
1346 : }
1347 :
1348 469924 : FOR( i = 0; i < pred_dim; i++ )
1349 : {
1350 1664967 : FOR( k = start_band; k < end_band; k++ )
1351 : {
1352 1312524 : dm_v_re[i][k] = Mpy_32_32( cov_real[i + 1][0][k], div_factor[k] ); // Q30 + Qb - 31 = tmp_shift - 1
1353 1312524 : move32();
1354 : }
1355 : }
1356 :
1357 117481 : IF( dtx_vad == 0 )
1358 : {
1359 890 : dm_f_local = IVAS_ACTIVEW_DM_F_DTX_Q30; // q30
1360 890 : move32();
1361 : }
1362 : ELSE
1363 : {
1364 116591 : IF( active_w_vlbr )
1365 : {
1366 10943 : dm_f_local = IVAS_ACTIVEW_DM_F_VLBR_Q30; // q30
1367 10943 : move32();
1368 : }
1369 : ELSE
1370 : {
1371 105648 : dm_f_local = IVAS_ACTIVEW_DM_F_Q30; // q30
1372 105648 : move32();
1373 : }
1374 : }
1375 :
1376 554989 : FOR( b = start_band; b < end_band; b++ )
1377 : {
1378 437508 : set32_fx( real, 0, pred_dim );
1379 :
1380 1750032 : FOR( j = 0; j < pred_dim; j++ )
1381 : {
1382 5250096 : FOR( k = 1; k < in_chans; k++ )
1383 : {
1384 : Word32 re;
1385 :
1386 : // IVAS_RMULT_FLOAT( cov_real[j + 1][k][b], dm_v_re[k - 1][b], re );
1387 3937572 : re = Mpy_32_32( cov_real[j + 1][k][b], dm_v_re[k - 1][b] ); // Q30 + Q_div_factor - 1 - 31
1388 3937572 : real[j] = L_add( real[j], re ); // tmp_shift - 2
1389 3937572 : move32();
1390 : }
1391 : }
1392 437508 : dm_beta_re = 0;
1393 437508 : move32();
1394 1750032 : FOR( k = 0; k < pred_dim; k++ )
1395 : {
1396 : Word32 re;
1397 : // IVAS_RMULT_FLOAT( real[k], dm_v_re[k][b], re );
1398 1312524 : re = Mpy_32_32( real[k], dm_v_re[k][b] ); // Q = 2*tmp_shift - 3 - 31
1399 1312524 : dm_beta_re = L_add( dm_beta_re, re ); // Q = 2*tmp_shift - 3 - 31
1400 : }
1401 :
1402 437508 : dm_beta_re_e = sub( 31, ( sub( sub( shl( tmp_shift, 1 ), 3 ), 31 ) ) );
1403 437508 : dm_w = cov_real[0][0][b]; // Q30
1404 437508 : move32();
1405 437508 : den_f = L_max( dm_w, 1 ); // Q30
1406 437508 : passive_g = L_deposit_l( BASOP_Util_Divide3232_Scale( dm_alpha[b], den_f, &s_div ) ); // Q=15-(s_div+dm_alpha_e-1)
1407 :
1408 437508 : div_shift = add( ( sub( 15, ( sub( ( sub( 31, dm_alpha_e ) ), Q30 ) ) ) ), sub( s_div, 1 ) );
1409 437508 : passive_g = L_shl( passive_g, div_shift ); // Q = 29
1410 :
1411 437508 : IF( EQ_16( dyn_active_w_flag, 1 ) )
1412 : {
1413 0 : dm_alpha[b] = 0;
1414 0 : move32();
1415 0 : dm_w = 0;
1416 0 : move32();
1417 0 : FOR( i = 0; i < pred_dim; i++ )
1418 : {
1419 0 : dm_v_re[i][b] = 0;
1420 0 : move32();
1421 : }
1422 0 : IF( NE_16( sub( tmp_shift, 1 ), 31 ) )
1423 : {
1424 0 : dm_v_re[res_ind - 1][b] = L_shl( 1, sub( tmp_shift, 1 ) ); // Q=tmp_shift-1
1425 0 : move32();
1426 : }
1427 : ELSE
1428 : {
1429 0 : dm_v_re[res_ind - 1][b] = MAX_32; // Q=tmp_shift-1
1430 0 : move32();
1431 : }
1432 0 : passive_g = activew_quad_thresh; // q29
1433 0 : move32();
1434 : }
1435 :
1436 437508 : IF( LT_32( passive_g, activew_quad_thresh ) )
1437 : {
1438 : /*linear activeW*/
1439 437508 : dm_y = 0;
1440 437508 : move32();
1441 :
1442 1750032 : FOR( k = 1; k < in_chans; k++ )
1443 : {
1444 1312524 : dm_y = L_add( dm_y, L_shr( cov_real[k][k][b], 2 ) ); // Q28
1445 : }
1446 437508 : den_f = L_max( dm_y, 1 ); // Q28
1447 437508 : den_f = L_max( den_f, Mpy_32_32( w_norm_fac, dm_w ) ); // Q28
1448 :
1449 437508 : DM_F[b] = L_deposit_l( BASOP_Util_Divide3232_Scale( Mpy_32_32( dm_f_local, dm_alpha[b] ), den_f, &s_div ) ); // Q30 + 31 - dm_alpha_e - 31 + den_f_e - 31 => den_f_e - dm_alpha_e - 1
1450 437508 : move32();
1451 :
1452 437508 : div_shift = add( ( sub( 15, ( sub( ( sub( 30, dm_alpha_e ) ), 28 ) ) ) ), s_div );
1453 :
1454 437508 : DM_F[b] = L_shl( DM_F[b], div_shift ); // Q30
1455 437508 : move32();
1456 :
1457 437508 : DM_F[b] = L_min( ONE_IN_Q30, DM_F[b] ); // q30
1458 437508 : move32();
1459 :
1460 437508 : L_tmp1 = L_add( L_shr( dm_w, 1 ), Mpy_32_32( dm_alpha[b], DM_F[b] ) ); /* Q 29*/
1461 437508 : L_tmp2 = Mpy_32_32( Mpy_32_32( DM_F[b], DM_F[b] ), dm_beta_re ); // Q=(Q29-dm_beta_re_e)
1462 437508 : L_tmp2_q = add( 29, sub( shl( tmp_shift, 1 ), 65 ) ); // simplified equation for calculating Q of L_tmp2
1463 437508 : L_tmp2 = L_shl( L_tmp2, sub( 29, L_tmp2_q ) ); // Q29
1464 :
1465 437508 : den_f = L_add( L_tmp1, L_tmp2 ); // Q29
1466 437508 : den_f = L_max( den_f, 1 ); // Q29
1467 :
1468 437508 : den_f_e = 31 - 29;
1469 437508 : move16();
1470 437508 : L_tmp2 = Mpy_32_32( DM_F[b], dm_beta_re ); // Q=30-dm_beta_re_e
1471 437508 : L_tmp2_q = add( 30, sub( ( sub( shl( tmp_shift, 1 ), 34 ) ), 31 ) );
1472 437508 : L_tmp2 = L_shl( L_tmp2, ( sub( ( sub( 29, dm_alpha_e ) ), L_tmp2_q ) ) ); // Q=29
1473 437508 : L_tmp1 = L_shr( dm_alpha[b], ( sub( ( sub( 31, dm_alpha_e ) ), 29 ) ) ); // Q=29
1474 437508 : L_tmp1 = L_add( L_tmp1, L_tmp2 ); // Q29
1475 :
1476 437508 : dm_g[b] = L_deposit_l( BASOP_Util_Divide3232_Scale( L_tmp1, den_f, &s_div ) ); // Q29 + den_f_e - 31 + 15 - s_div
1477 437508 : move32();
1478 437508 : div_shift = add( sub( 15, ( sub( 29, sub( 31, den_f_e ) ) ) ), s_div );
1479 437508 : dm_g[b] = L_shl( dm_g[b], div_shift ); // Q30
1480 437508 : move32();
1481 : }
1482 : ELSE
1483 : {
1484 : Word32 sqrt_val;
1485 : Word16 val_e;
1486 : Word16 num_f_e;
1487 :
1488 : /* quadratic activeW */
1489 :
1490 0 : num_f = BASOP_Util_Add_Mant32Exp( dm_beta_re, dm_beta_re_e, L_negate( L_shl( Mpy_32_32( dm_alpha[b], activew_quad_thresh ), 1 ) ), add( dm_alpha_e, ( 31 - Q29 ) ), &num_f_e ); // Q=31-num_f_e
1491 :
1492 0 : sqrt_val = L_shl( Mpy_32_32( Mpy_32_32( dm_alpha[b], dm_alpha[b] ), g_th_sq ), 2 ); /*Q27*/
1493 0 : val_e = 4;
1494 0 : move16();
1495 :
1496 0 : sqrt_val = BASOP_Util_Add_Mant32Exp( sqrt_val, 4, Mpy_32_32( dm_beta_re, dm_beta_re ), 2 * dm_beta_re_e, &val_e ); // Q=31-val_e
1497 0 : sqrt_val = BASOP_Util_Add_Mant32Exp( sqrt_val, val_e, L_negate( L_shl( Mpy_32_32( Mpy_32_32( dm_beta_re, g_th_sq ), dm_w ), 2 ) ), add( dm_beta_re_e, 4 + 1 ), &val_e ); // Q=31-val_e
1498 : // val_e = norm_l( sqrt_val );
1499 0 : sqrt_val = Sqrt32( sqrt_val, &val_e ); // Q=31-val_e
1500 0 : IF( val_e < 0 )
1501 : {
1502 0 : sqrt_val = L_shr( sqrt_val, abs_s( val_e ) ); // Q31
1503 : }
1504 0 : ELSE IF( val_e > 0 )
1505 : {
1506 0 : sqrt_val = L_shl( sqrt_val, abs_s( val_e ) ); // Q31
1507 0 : val_e = 0;
1508 0 : move16();
1509 : }
1510 0 : num_f = BASOP_Util_Add_Mant32Exp( num_f, num_f_e, sqrt_val, 0, &num_f_e ); // Q=31-num_f_e
1511 :
1512 0 : den_f = L_shl( Mpy_32_32( dm_beta_re, g_th_sq ), 1 ); // Q=31-dm_beta_re_e+27-31=>-dm_beta_re_e+27
1513 0 : den_f_e = add( dm_beta_re_e, 4 );
1514 0 : den_f = L_max( den_f, 1 ); // Q=31-den_f_e
1515 0 : dm_g[b] = activew_quad_thresh; // Q29
1516 0 : move32();
1517 0 : DM_F[b] = BASOP_Util_Divide3232_Scale_newton( Mpy_32_32( dm_g[b], num_f ), den_f, &s_dm_f ); // s_dm_f+2+num_f_e-den_f_e
1518 0 : move32();
1519 0 : s_dm_f = add( s_dm_f, sub( add( 2, num_f_e ), den_f_e ) ); /*Resultant exp for DM_F s_dm_f +( 2 + num_f_e ) - den_f_e*/
1520 0 : div_shift = sub( s_dm_f, 1 );
1521 0 : DM_F[b] = L_shl( DM_F[b], div_shift ); // Q30
1522 0 : move32();
1523 : }
1524 : }
1525 :
1526 469924 : FOR( i = 0; i < pred_dim; i++ )
1527 : {
1528 1664967 : FOR( b = start_band; b < end_band; b++ )
1529 : {
1530 1312524 : ppPred_coeffs_re[i][b] = Mpy_32_32( dm_v_re[i][b], dm_g[b] ); // Q = tmp_shift - 1 + 30 - 31
1531 1312524 : move32();
1532 1312524 : ppDM_Fv_re[i][b] = Mpy_32_32( dm_v_re[i][b], DM_F[b] ); // Q = tmp_shift - 1 + 30 -31
1533 1312524 : move32();
1534 : }
1535 : }
1536 117481 : *q_pred_coeffs = sub( tmp_shift, 2 );
1537 117481 : move16();
1538 117481 : *q_dm_fv_re = sub( tmp_shift, 2 );
1539 117481 : move16();
1540 : }
1541 :
1542 584711 : return;
1543 : }
1544 :
1545 :
1546 : /*-----------------------------------------------------------------------------------------*
1547 : * Function ivas_get_Wscaling_factor()
1548 : *
1549 : * Calculation of scaling factor for post predicted W channel
1550 : *-----------------------------------------------------------------------------------------*/
1551 :
1552 :
1553 305060 : static void ivas_get_Wscaling_factor_enc_fx(
1554 : Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
1555 : Word16 *q_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
1556 : Word32 pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_pred_coeffs_re*/
1557 : Word16 q_pred_coeffs_re,
1558 : Word32 ***mixer_mat, /*q_mixer_mat*/
1559 : Word16 q_mixer_mat,
1560 : const Word16 start_band,
1561 : const Word16 end_band,
1562 : const Word16 dtx_vad,
1563 : const Word16 num_ch,
1564 : const Word16 *pNum_dmx,
1565 : const Word16 bands_bw,
1566 : const Word16 active_w,
1567 : const Word16 active_w_vlbr,
1568 : Word32 *pWscale, /*q_pWscale*/
1569 : Word16 *q_pWscale,
1570 : const Word16 dyn_active_w_flag )
1571 : {
1572 : Word16 b, ch, q_tmp, q_postpred_cov_re;
1573 : Word32 dm_f_local, abs_val;
1574 : Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
1575 :
1576 305060 : q_postpred_cov_re = 0;
1577 305060 : move16();
1578 :
1579 3660720 : FOR( ch = 0; ch < IVAS_SPAR_MAX_CH; ch++ )
1580 : {
1581 3355660 : set32_fx( postpred_cov_re[ch], 0, IVAS_SPAR_MAX_CH );
1582 : }
1583 :
1584 305060 : IF( dtx_vad == 0 )
1585 : {
1586 6726 : dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_DTX_FX; // Q31
1587 6726 : move32();
1588 : }
1589 298334 : ELSE IF( active_w_vlbr != 0 )
1590 : {
1591 25408 : dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_VLBR_FX; // Q31
1592 25408 : move32();
1593 : }
1594 : ELSE
1595 : {
1596 272926 : dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_FX; // Q31
1597 272926 : move32();
1598 : }
1599 :
1600 2222866 : FOR( b = start_band; b < end_band; b++ )
1601 : {
1602 1917806 : pWscale[b] = ONE_IN_Q31;
1603 1917806 : move32();
1604 1917806 : q_pWscale[b] = Q31;
1605 1917806 : move16();
1606 :
1607 1917806 : test();
1608 1917806 : IF( EQ_16( active_w, 1 ) && ( dyn_active_w_flag == 0 ) )
1609 : {
1610 : Word16 shift, guard_bits, q_Gw_sq, q_g_sq, q_min, tmp_exp;
1611 : Word32 Gw_sq, g_sq, tmp;
1612 :
1613 464638 : g_sq = 0;
1614 464638 : move32();
1615 :
1616 464638 : IF( NE_16( num_ch, pNum_dmx[b * bands_bw] ) )
1617 : {
1618 464638 : ivas_calc_post_pred_per_band_enc_fx( cov_real, q_cov_real, mixer_mat, q_mixer_mat, num_ch, b, postpred_cov_re, &q_postpred_cov_re );
1619 : }
1620 :
1621 464638 : tmp = L_shl_sat( IVAS_FIX_EPS_Q40, sub( q_postpred_cov_re, 40 ) );
1622 :
1623 464638 : IF( LE_32( postpred_cov_re[0][0], tmp ) )
1624 : {
1625 180 : Gw_sq = Mpy_32_32( cov_real[0][0][b], 1250000000 ); /*1/1e-10 = 1250000000 Q(-4)*/
1626 180 : q_Gw_sq = add( q_cov_real[0][0][b], -4 - 31 );
1627 : }
1628 : ELSE
1629 : {
1630 464458 : Gw_sq = BASOP_Util_Divide3232_Scale( cov_real[0][0][b], postpred_cov_re[0][0], &tmp_exp ); // 15-(tmp_exp-(q_cov_real[0][0][b]- q_postpred_cov_re))
1631 464458 : q_Gw_sq = add( sub( 15, tmp_exp ), sub( q_cov_real[0][0][b], q_postpred_cov_re ) );
1632 : }
1633 :
1634 464638 : shift = MAX16B;
1635 464638 : move16();
1636 :
1637 1858552 : FOR( ch = 0; ch < ( num_ch - 1 ); ch++ )
1638 : {
1639 1393914 : IF( pred_coeffs_re[ch][b] != 0 )
1640 : {
1641 1288077 : shift = s_min( shift, norm_l( pred_coeffs_re[ch][b] ) );
1642 : }
1643 : }
1644 464638 : guard_bits = find_guarded_bits_fx( num_ch );
1645 464638 : if ( EQ_16( shift, MAX16B ) )
1646 : {
1647 180 : shift = 0;
1648 180 : move16();
1649 : }
1650 1858552 : FOR( ch = 0; ch < ( num_ch - 1 ); ch++ )
1651 : {
1652 1393914 : abs_val = L_shr( Mpy_32_32( L_shl( pred_coeffs_re[ch][b], shift ), L_shl( pred_coeffs_re[ch][b], shift ) ), guard_bits ); // q=2*q_pred_coeffs_re-guard_bits-31
1653 1393914 : g_sq = L_add( g_sq, abs_val ); // q=2*q_pred_coeffs_re-guard_bits-31
1654 : }
1655 464638 : q_g_sq = sub( shl( add( q_pred_coeffs_re, shift ), 1 ), add( 31, guard_bits ) );
1656 :
1657 464638 : tmp = Mpy_32_32( ONE_IN_Q30 /*4 in Q28*/, Mpy_32_32( dm_f_local, g_sq ) ); // q_g_sq+28-31
1658 464638 : q_tmp = sub( q_g_sq, 3 );
1659 :
1660 464638 : q_min = s_min( q_Gw_sq, q_tmp );
1661 464638 : tmp = L_shr( tmp, sub( q_tmp, q_min ) ); // Q=q_min
1662 464638 : tmp = L_add( L_shr( Gw_sq, sub( q_Gw_sq, q_min ) ), tmp ); // Q=q_min
1663 :
1664 464638 : tmp_exp = sub( 31, q_min );
1665 464638 : tmp = Sqrt32( tmp, &tmp_exp ); // q=31-tmp_exp
1666 464638 : q_tmp = sub( 31, tmp_exp );
1667 :
1668 464638 : tmp_exp = sub( 31, q_Gw_sq );
1669 464638 : Gw_sq = Sqrt32( Gw_sq, &tmp_exp ); // q=31-tmp_exp
1670 464638 : q_Gw_sq = sub( 31, tmp_exp );
1671 :
1672 464638 : q_min = s_min( q_Gw_sq, q_tmp );
1673 464638 : Gw_sq = L_shr( Gw_sq, sub( q_Gw_sq, q_min ) ); // q=q_min
1674 464638 : q_Gw_sq = q_min;
1675 464638 : move16();
1676 :
1677 464638 : tmp = L_shr( tmp, sub( q_tmp, q_min ) ); // q=q_min
1678 :
1679 464638 : pWscale[b] = L_add( Mpy_32_32( Gw_sq, ONE_IN_Q30 /* 0.5 in Q31*/ ), Mpy_32_32( tmp, ONE_IN_Q30 /* 0.5 in Q31*/ ) ); // q=q_Gw_sq
1680 464638 : move32();
1681 464638 : q_pWscale[b] = q_Gw_sq;
1682 464638 : move16();
1683 : }
1684 : }
1685 :
1686 305060 : return;
1687 : }
1688 :
1689 584711 : static void ivas_get_Wscaling_factor_fx(
1690 : Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
1691 : Word16 q_cov_real,
1692 : Word32 pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_pred_coeffs_re*/
1693 : Word16 q_pred_coeffs_re,
1694 : Word32 ***mixer_mat, /*q_mixer_mat*/
1695 : Word16 q_mixer_mat,
1696 : const Word16 start_band,
1697 : const Word16 end_band,
1698 : const Word16 dtx_vad,
1699 : const Word16 num_ch,
1700 : const Word16 *pNum_dmx,
1701 : const Word16 bands_bw,
1702 : const Word16 active_w,
1703 : const Word16 active_w_vlbr,
1704 : Word32 *pWscale, /*q_pWscale*/
1705 : Word16 *q_pWscale,
1706 : const Word16 dyn_active_w_flag )
1707 : {
1708 : Word16 b, ch, q_tmp, q_postpred_cov_re;
1709 : Word32 dm_f_local, abs_val;
1710 : Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
1711 :
1712 584711 : q_postpred_cov_re = 0;
1713 584711 : move16();
1714 :
1715 7016532 : FOR( ch = 0; ch < IVAS_SPAR_MAX_CH; ch++ )
1716 : {
1717 6431821 : set32_fx( postpred_cov_re[ch], 0, IVAS_SPAR_MAX_CH );
1718 : }
1719 :
1720 584711 : IF( dtx_vad == 0 )
1721 : {
1722 2480 : dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_DTX_FX; // Q31
1723 2480 : move32();
1724 : }
1725 582231 : ELSE IF( active_w_vlbr != 0 )
1726 : {
1727 10943 : dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_VLBR_FX; // Q31
1728 10943 : move32();
1729 : }
1730 : ELSE
1731 : {
1732 571288 : dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_FX; // Q31
1733 571288 : move32();
1734 : }
1735 :
1736 2820619 : FOR( b = start_band; b < end_band; b++ )
1737 : {
1738 2235908 : pWscale[b] = 1;
1739 2235908 : move32();
1740 2235908 : q_pWscale[b] = 0;
1741 2235908 : move16();
1742 :
1743 2235908 : test();
1744 2235908 : IF( EQ_16( active_w, 1 ) && ( dyn_active_w_flag == 0 ) )
1745 : {
1746 : Word16 guard_bits, q_Gw_sq, q_g_sq, q_min, tmp_exp;
1747 : Word32 Gw_sq, g_sq, tmp;
1748 :
1749 437508 : g_sq = 0;
1750 437508 : move32();
1751 :
1752 437508 : IF( NE_16( num_ch, pNum_dmx[b * bands_bw] ) )
1753 : {
1754 437508 : ivas_calc_post_pred_per_band_fx( cov_real, q_cov_real, mixer_mat, q_mixer_mat, num_ch, b, postpred_cov_re, &q_postpred_cov_re );
1755 : }
1756 :
1757 437508 : Gw_sq = BASOP_Util_Divide3232_Scale( cov_real[0][0][b], L_max( postpred_cov_re[0][0], IVAS_FIX_EPS ), &tmp_exp ); /*15-(tmp_exp-(q_cov_real-q_postpred_cov_re))*/
1758 437508 : q_Gw_sq = add( sub( 15, tmp_exp ), sub( q_cov_real, q_postpred_cov_re ) );
1759 :
1760 437508 : guard_bits = find_guarded_bits_fx( num_ch );
1761 :
1762 1750032 : FOR( ch = 0; ch < sub( num_ch, 1 ); ch++ )
1763 : {
1764 1312524 : abs_val = L_shr( Mpy_32_32( pred_coeffs_re[ch][b], pred_coeffs_re[ch][b] ), guard_bits ); /*q=2*q_pred_coeffs_re-guard_bits-31*/
1765 1312524 : g_sq = L_add( g_sq, abs_val ); /*q=2*q_pred_coeffs_re-guard_bits-31*/
1766 : }
1767 437508 : q_g_sq = sub( add( q_pred_coeffs_re, q_pred_coeffs_re ), add( 31, guard_bits ) );
1768 :
1769 437508 : tmp = Mpy_32_32( ONE_IN_Q30 /*4 in Q28*/, Mpy_32_32( dm_f_local, g_sq ) ); /*q=q_g_sq-3*/
1770 437508 : q_tmp = sub( q_g_sq, 3 );
1771 :
1772 437508 : q_min = s_min( q_Gw_sq, q_tmp );
1773 437508 : tmp = L_shr( tmp, sub( q_tmp, q_min ) ); // q=q_min
1774 437508 : tmp = L_add( L_shr( Gw_sq, sub( q_Gw_sq, q_min ) ), tmp ); // q=q_min
1775 :
1776 437508 : tmp_exp = sub( 31, q_min );
1777 437508 : tmp = Sqrt32( tmp, &tmp_exp ); // q=31-tmp_exp
1778 437508 : q_tmp = sub( 31, tmp_exp );
1779 :
1780 437508 : tmp_exp = sub( 31, q_Gw_sq );
1781 437508 : Gw_sq = Sqrt32( Gw_sq, &tmp_exp ); // q=31-tmp_exp
1782 437508 : q_Gw_sq = sub( 31, tmp_exp );
1783 :
1784 437508 : q_min = s_min( q_Gw_sq, q_tmp );
1785 437508 : Gw_sq = L_shr( Gw_sq, sub( q_Gw_sq, q_min ) ); // q=q_min
1786 437508 : q_Gw_sq = q_min;
1787 437508 : move16();
1788 :
1789 437508 : tmp = L_shr( tmp, sub( q_tmp, q_min ) ); // q=q_min
1790 :
1791 437508 : pWscale[b] = L_add( L_shr( Gw_sq, 1 /* Gw_sq * 0.5 */ ), L_shr( tmp, 1 /* tmp * 0.5 */ ) ); // q=q_Gw_sq
1792 437508 : move32();
1793 437508 : q_pWscale[b] = q_Gw_sq;
1794 437508 : move16();
1795 : }
1796 : }
1797 :
1798 584711 : return;
1799 : }
1800 :
1801 :
1802 : /*-----------------------------------------------------------------------------------------*
1803 : * Function ivas_create_fullr_dmx_mat()
1804 : *
1805 : * Calculation of downmix matrix
1806 : *-----------------------------------------------------------------------------------------*/
1807 :
1808 :
1809 1048350 : void ivas_create_fullr_dmx_mat_fx(
1810 : Word32 pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_pred_coeffs_re*/
1811 : Word16 q_pred_coeffs_re,
1812 : Word32 dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_dm_fv_re*/
1813 : Word16 q_dm_fv_re,
1814 : Word32 ***mixer_mat, /*q_mixer_mat*/
1815 : Word16 *q_mixer_mat,
1816 : const Word16 in_chans,
1817 : const Word16 start_band,
1818 : const Word16 end_band,
1819 : const Word16 active_w,
1820 : ivas_spar_md_com_cfg *hMdCfg )
1821 : {
1822 : Word16 i, j, k, b;
1823 : const Word16 *order;
1824 : Word32 max_val_tmp_p2;
1825 : Word32 tmp_p1_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS];
1826 : Word32 tmp_p2_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS];
1827 : Word32 down_mix_mat1_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS];
1828 : Word16 remix_unmix_order;
1829 : Word16 nbands;
1830 :
1831 1048350 : max_val_tmp_p2 = 0;
1832 1048350 : move32();
1833 :
1834 1048350 : nbands = sub( end_band, start_band );
1835 1048350 : remix_unmix_order = hMdCfg->remix_unmix_order;
1836 1048350 : move16();
1837 :
1838 1048350 : order = remix_order_set[remix_unmix_order];
1839 1048350 : move16();
1840 :
1841 5446150 : FOR( i = 0; i < in_chans; i++ )
1842 : {
1843 23924320 : FOR( j = 0; j < in_chans; j++ )
1844 : {
1845 19526520 : set32_fx( &tmp_p1_re[i][j][start_band], 0, nbands );
1846 19526520 : set32_fx( &tmp_p2_re[i][j][start_band], 0, nbands );
1847 19526520 : set32_fx( &down_mix_mat1_re[i][j][start_band], 0, nbands );
1848 : }
1849 : }
1850 :
1851 5446150 : FOR( j = 0; j < in_chans; j++ )
1852 : {
1853 28603112 : FOR( b = start_band; b < end_band; b++ )
1854 : {
1855 24205312 : tmp_p2_re[j][j][b] = L_shl( 1, q_pred_coeffs_re ); // q=q_pred_coeffs_re
1856 24205312 : move32();
1857 : }
1858 : }
1859 1048350 : max_val_tmp_p2 = L_shl( 1, q_pred_coeffs_re ); // q=q_pred_coeffs_re
1860 :
1861 4397800 : FOR( j = 1; j < in_chans; j++ )
1862 : {
1863 22116634 : FOR( b = start_band; b < end_band; b++ )
1864 : {
1865 18767184 : tmp_p2_re[j][0][b] = L_negate( pred_coeffs_re[j - 1][b] ); // q=q_pred_coeffs_re
1866 18767184 : move32();
1867 18767184 : max_val_tmp_p2 = L_max( max_val_tmp_p2, L_abs( tmp_p2_re[j][0][b] ) ); // q=q_pred_coeffs_re
1868 : }
1869 : }
1870 :
1871 1048350 : IF( EQ_16( active_w, 1 ) )
1872 : {
1873 : Word16 guard_bits;
1874 : Word32 max_val, tmp_re;
1875 :
1876 249974 : max_val = 0;
1877 249974 : move32();
1878 :
1879 1249870 : FOR( j = 0; j < in_chans; j++ )
1880 : {
1881 5785480 : FOR( b = start_band; b < end_band; b++ )
1882 : {
1883 4785584 : tmp_p1_re[j][j][b] = L_shl( 1, q_dm_fv_re ); // q=q_dm_fv_re
1884 4785584 : move32();
1885 : }
1886 : }
1887 249974 : max_val = L_shl( 1, q_dm_fv_re ); // q=q_dm_fv_re
1888 :
1889 999896 : FOR( j = 1; j < in_chans; j++ )
1890 : {
1891 4339110 : FOR( b = start_band; b < end_band; b++ )
1892 : {
1893 3589188 : tmp_p1_re[0][j][b] = dm_fv_re[j - 1][b]; // q=q_dm_fv_re
1894 3589188 : move32();
1895 3589188 : max_val = L_max( max_val, L_abs( tmp_p1_re[0][j][b] ) ); // q=q_dm_fv_re
1896 : }
1897 : }
1898 :
1899 249974 : guard_bits = add( norm_l( max_val ), norm_l( max_val_tmp_p2 ) );
1900 249974 : guard_bits = s_max( sub( find_guarded_bits_fx( sub( end_band, start_band ) ), guard_bits ), 0 );
1901 : /* 4x4 mult */
1902 1249870 : FOR( i = 0; i < in_chans; i++ )
1903 : {
1904 4999480 : FOR( j = 0; j < in_chans; j++ )
1905 : {
1906 19997920 : FOR( k = 0; k < in_chans; k++ )
1907 : {
1908 92567680 : FOR( b = start_band; b < end_band; b++ )
1909 : {
1910 76569344 : tmp_re = L_shr( Mpy_32_32( tmp_p2_re[i][k][b], tmp_p1_re[k][j][b] ), guard_bits ); // q= q_dm_fv_re+ q_pred_coeffs_re-31-guard_bits
1911 76569344 : down_mix_mat1_re[i][j][b] = L_add( down_mix_mat1_re[i][j][b], tmp_re ); // q= q_dm_fv_re+ q_pred_coeffs_re-31-guard_bits
1912 76569344 : move32();
1913 : }
1914 : }
1915 : }
1916 : }
1917 249974 : *q_mixer_mat = sub( add( q_dm_fv_re, q_pred_coeffs_re ), add( 31, guard_bits ) );
1918 249974 : move16();
1919 : }
1920 : ELSE
1921 : {
1922 4196280 : FOR( j = 0; j < in_chans; j++ )
1923 : {
1924 18924840 : FOR( k = 0; k < in_chans; k++ )
1925 : {
1926 116429688 : FOR( b = start_band; b < end_band; b++ )
1927 : {
1928 100902752 : down_mix_mat1_re[j][k][b] = tmp_p2_re[j][k][b]; // q=q_pred_coeffs_re
1929 100902752 : move32();
1930 : }
1931 : }
1932 : }
1933 798376 : *q_mixer_mat = q_pred_coeffs_re;
1934 798376 : move16();
1935 : }
1936 :
1937 1048350 : IF( NE_16( remix_unmix_order, 3 ) )
1938 : {
1939 1048350 : ivas_reorder_array_fx( down_mix_mat1_re, in_chans, order, mixer_mat, start_band, end_band );
1940 : }
1941 :
1942 1048350 : return;
1943 : }
1944 :
1945 :
1946 : /*-----------------------------------------------------------------------------------------*
1947 : * Function ivas_reorder_array()
1948 : *
1949 : * reorders the input matrix based on order
1950 : *-----------------------------------------------------------------------------------------*/
1951 :
1952 1048350 : static void ivas_reorder_array_fx(
1953 : Word32 in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS], /*qx*/
1954 : const Word16 in_chans,
1955 : const Word16 order[IVAS_SPAR_MAX_CH],
1956 : Word32 ***mixer_mat, /*qx*/
1957 : const Word16 start_band,
1958 : const Word16 end_band )
1959 : {
1960 : Word16 i, j, b, idx;
1961 :
1962 5446150 : FOR( i = 0; i < in_chans; i++ )
1963 : {
1964 4397800 : idx = order[i];
1965 4397800 : move16();
1966 :
1967 23924320 : FOR( j = 0; j < in_chans; j++ )
1968 : {
1969 139571608 : FOR( b = start_band; b < end_band; b++ )
1970 : {
1971 120045088 : mixer_mat[i][j][b] = in_re[idx][j][b]; /*qx*/
1972 120045088 : move32();
1973 : }
1974 : }
1975 : }
1976 :
1977 1048350 : return;
1978 : }
1979 :
1980 : /*-----------------------------------------------------------------------------------------*
1981 : * Function ivas_calc_post_pred_per_band()
1982 : *
1983 : * Calculate post pred mat per band
1984 : *-----------------------------------------------------------------------------------------*/
1985 :
1986 :
1987 2895408 : static void ivas_calc_post_pred_per_band_enc_fx(
1988 : Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
1989 : Word16 *q_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
1990 : Word32 ***mixer_mat, /*q_mixer_mat*/
1991 : Word16 q_mixer_mat,
1992 : const Word16 num_ch,
1993 : const Word16 band_idx,
1994 : Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_postpred_cov_re*/
1995 : Word16 *q_postpred_cov_re )
1996 : {
1997 : Word16 i, j, k;
1998 : Word32 dmx_mat_conj[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
1999 : Word32 temp_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
2000 : Word16 temp_mat_e[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
2001 : Word16 q_postpred_cov_re_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
2002 : Word16 min_val;
2003 : Word32 tmp_re;
2004 : Word16 tmp_q;
2005 : Word16 tmp_e;
2006 :
2007 16929840 : FOR( i = 0; i < num_ch; i++ )
2008 : {
2009 93396000 : FOR( j = 0; j < num_ch; j++ )
2010 : {
2011 79361568 : dmx_mat_conj[i][j] = mixer_mat[j][i][band_idx]; /*q_mixer_mat*/
2012 79361568 : move32();
2013 : }
2014 : }
2015 :
2016 16929840 : FOR( i = 0; i < num_ch; i++ )
2017 : {
2018 14034432 : set32_fx( temp_mat[i], 0, num_ch );
2019 14034432 : set32_fx( postpred_cov_re[i], 0, num_ch );
2020 : }
2021 :
2022 2895408 : min_val = MAX16B;
2023 2895408 : move16();
2024 : /* num_ch x num_ch mult */
2025 16929840 : FOR( i = 0; i < num_ch; i++ )
2026 : {
2027 93396000 : FOR( j = 0; j < num_ch; j++ )
2028 : {
2029 79361568 : temp_mat[i][j] = 0;
2030 79361568 : move32();
2031 79361568 : temp_mat_e[i][j] = 0;
2032 79361568 : move16();
2033 624374400 : FOR( k = 0; k < num_ch; k++ )
2034 : {
2035 545012832 : tmp_re = Mpy_32_32( cov_real[i][k][band_idx], dmx_mat_conj[k][j] );
2036 545012832 : tmp_e = sub( 62, add( q_cov_real[i][k][band_idx], q_mixer_mat ) );
2037 545012832 : IF( tmp_re )
2038 : {
2039 153709032 : temp_mat[i][j] = BASOP_Util_Add_Mant32Exp( temp_mat[i][j], temp_mat_e[i][j], tmp_re, tmp_e, &temp_mat_e[i][j] );
2040 153709032 : move32();
2041 : }
2042 : }
2043 : }
2044 : }
2045 :
2046 : /* num_ch x num_ch mult */
2047 16929840 : FOR( i = 0; i < num_ch; i++ )
2048 : {
2049 60732432 : FOR( j = i; j < num_ch; j++ )
2050 : {
2051 46698000 : q_postpred_cov_re_buf[i][j] = *q_postpred_cov_re;
2052 46698000 : move16();
2053 358885200 : FOR( k = 0; k < num_ch; k++ )
2054 : {
2055 312187200 : tmp_re = Mpy_32_32( mixer_mat[i][k][band_idx], temp_mat[k][j] );
2056 312187200 : tmp_q = sub( q_mixer_mat, temp_mat_e[k][j] );
2057 312187200 : IF( tmp_re )
2058 : {
2059 89626478 : tmp_e = sub( 31, q_postpred_cov_re_buf[i][j] );
2060 89626478 : postpred_cov_re[i][j] = BASOP_Util_Add_Mant32Exp( postpred_cov_re[i][j], tmp_e, tmp_re, sub( Q31, tmp_q ), &tmp_e );
2061 89626478 : move32();
2062 89626478 : q_postpred_cov_re_buf[i][j] = sub( 31, tmp_e );
2063 89626478 : move16();
2064 : }
2065 : }
2066 46698000 : IF( postpred_cov_re[i][j] )
2067 : {
2068 43547400 : min_val = s_min( min_val, q_postpred_cov_re_buf[i][j] );
2069 : }
2070 : }
2071 : }
2072 :
2073 : /*Changing Q of postpred_cov_re to min_val*/
2074 16929840 : FOR( i = 0; i < num_ch; i++ )
2075 : {
2076 60732432 : FOR( j = i; j < num_ch; j++ )
2077 : {
2078 46698000 : IF( postpred_cov_re[i][j] )
2079 : {
2080 43547400 : postpred_cov_re[i][j] = L_shl( postpred_cov_re[i][j], sub( min_val, q_postpred_cov_re_buf[i][j] ) );
2081 43547400 : move32();
2082 : }
2083 : }
2084 : }
2085 :
2086 :
2087 16929840 : FOR( i = 0; i < num_ch; i++ )
2088 : {
2089 46698000 : FOR( j = 0; j < i; j++ )
2090 : {
2091 32663568 : postpred_cov_re[i][j] = postpred_cov_re[j][i]; //*q_postpred_cov_re
2092 32663568 : move32();
2093 : }
2094 : }
2095 :
2096 2895408 : if ( EQ_16( min_val, MAX16B ) )
2097 : {
2098 6720 : min_val = Q31;
2099 6720 : move16();
2100 : }
2101 2895408 : *q_postpred_cov_re = min_val;
2102 2895408 : move16();
2103 :
2104 2895408 : return;
2105 : }
2106 :
2107 2155966 : static void ivas_calc_post_pred_per_band_fx(
2108 : Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
2109 : Word16 q_cov_real,
2110 : Word32 ***mixer_mat, /*q_mixer_mat*/
2111 : Word16 q_mixer_mat,
2112 : const Word16 num_ch,
2113 : const Word16 band_idx,
2114 : Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_postpred_cov_re*/
2115 : Word16 *q_postpred_cov_re )
2116 : {
2117 : Word16 i, j, k, guard_bits, tmp, q_temp_mat;
2118 : Word32 dmx_mat_conj[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
2119 : Word32 temp_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
2120 : Word32 max_val;
2121 : Word64 tmp_re;
2122 :
2123 10779830 : FOR( i = 0; i < num_ch; i++ )
2124 : {
2125 43119320 : FOR( j = 0; j < num_ch; j++ )
2126 : {
2127 34495456 : dmx_mat_conj[i][j] = mixer_mat[j][i][band_idx]; /*q_mixer_mat*/
2128 34495456 : move32();
2129 : }
2130 : }
2131 :
2132 2155966 : guard_bits = find_guarded_bits_fx( num_ch );
2133 :
2134 10779830 : FOR( i = 0; i < num_ch; i++ )
2135 : {
2136 8623864 : set32_fx( temp_mat[i], 0, num_ch );
2137 8623864 : set32_fx( postpred_cov_re[i], 0, num_ch );
2138 : }
2139 :
2140 2155966 : max_val = 1;
2141 2155966 : move32();
2142 : /* num_ch x num_ch mult */
2143 10779830 : FOR( i = 0; i < num_ch; i++ )
2144 : {
2145 43119320 : FOR( j = 0; j < num_ch; j++ )
2146 : {
2147 34495456 : tmp_re = 0;
2148 34495456 : move64();
2149 172477280 : FOR( k = 0; k < num_ch; k++ )
2150 : {
2151 137981824 : tmp_re = W_add( tmp_re, W_shr( W_mult0_32_32( cov_real[i][k][band_idx], dmx_mat_conj[k][j] ), guard_bits ) ); /*q_cov_real+q_mixer_mat-guard_bits*/
2152 : }
2153 34495456 : if ( LT_64( W_abs( tmp_re ), L_shl( IVAS_FIX_EPS, guard_bits ) ) )
2154 : {
2155 5697570 : tmp_re = 0;
2156 5697570 : move64();
2157 : }
2158 34495456 : temp_mat[i][j] = W_extract_l( W_shr( tmp_re, q_mixer_mat ) ); // Q = (q_cov_real - guard_bits)
2159 34495456 : move32();
2160 34495456 : max_val = L_max( max_val, L_abs( temp_mat[i][j] ) ); // Q = (q_cov_real - guard_bits)
2161 : }
2162 : }
2163 2155966 : q_temp_mat = sub( q_cov_real, guard_bits );
2164 :
2165 2155966 : guard_bits = find_guarded_bits_fx( num_ch );
2166 :
2167 2155966 : tmp = norm_l( max_val );
2168 2155966 : IF( LT_16( tmp, guard_bits ) )
2169 : {
2170 12537 : guard_bits = sub( guard_bits, tmp );
2171 : }
2172 : ELSE
2173 : {
2174 2143429 : guard_bits = 0;
2175 2143429 : move16();
2176 : }
2177 :
2178 : /* num_ch x num_ch mult */
2179 10779830 : FOR( i = 0; i < num_ch; i++ )
2180 : {
2181 30183524 : FOR( j = i; j < num_ch; j++ )
2182 : {
2183 21559660 : tmp_re = 0;
2184 21559660 : move64();
2185 107798300 : FOR( k = 0; k < num_ch; k++ )
2186 : {
2187 86238640 : tmp_re = W_add( tmp_re, W_shr( W_mult0_32_32( mixer_mat[i][k][band_idx], temp_mat[k][j] ), guard_bits ) ); /*q_mixer_mat+q_temp_mat-guard_bits*/
2188 : }
2189 :
2190 21559660 : if ( LT_64( W_abs( tmp_re ), L_shl( IVAS_FIX_EPS, guard_bits ) ) )
2191 : {
2192 5634038 : tmp_re = 0;
2193 5634038 : move64();
2194 : }
2195 :
2196 21559660 : postpred_cov_re[i][j] = W_extract_l( W_shr( tmp_re, q_mixer_mat ) ); /*q_temp_mat-guard_bits*/
2197 21559660 : move32();
2198 : }
2199 : }
2200 :
2201 2155966 : *q_postpred_cov_re = sub( q_temp_mat, guard_bits );
2202 2155966 : move16();
2203 :
2204 10779830 : FOR( i = 0; i < num_ch; i++ )
2205 : {
2206 21559660 : FOR( j = 0; j < i; j++ )
2207 : {
2208 12935796 : postpred_cov_re[i][j] = postpred_cov_re[j][i]; /* *q_postpred_cov_re */
2209 12935796 : move32();
2210 : }
2211 : }
2212 :
2213 2155966 : return;
2214 : }
2215 :
2216 :
2217 : /*-----------------------------------------------------------------------------------------*
2218 : * Function ivas_calc_p_coeffs_per_band()
2219 : *
2220 : * Calculate P coeffs per band
2221 : *-----------------------------------------------------------------------------------------*/
2222 :
2223 1591966 : static void ivas_calc_p_coeffs_per_band_enc_fx(
2224 : ivas_spar_md_t *pSparMd,
2225 : const Word16 i_ts,
2226 : Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_postpred_cov_re*/
2227 : Word16 q_postpred_cov_re,
2228 : const Word16 num_ch,
2229 : const Word16 dtx_vad,
2230 : const Word16 num_dmx,
2231 : const Word16 band_idx )
2232 : {
2233 : Word16 i, j, k;
2234 : Word16 m;
2235 : Word32 factor;
2236 : Word32 recon_uu_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS];
2237 : Word16 q_recon_uu_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS];
2238 : Word64 trace, W_tmp;
2239 : Word16 q_factor, q_tmp, q_tmp1;
2240 : Word32 tmp;
2241 : Word32 p_norm_scaling;
2242 : Word16 q_cov_uu_re, q_cov_dd_re;
2243 : Word32 cov_dd_re[IVAS_SPAR_MAX_CH - 1][IVAS_SPAR_MAX_CH - 1];
2244 : Word32 cov_uu_re[IVAS_SPAR_MAX_CH - 1][IVAS_SPAR_MAX_CH - 1];
2245 : Word16 q_cov_uu_re_per_value[IVAS_SPAR_MAX_CH - 1][IVAS_SPAR_MAX_CH - 1];
2246 : Word16 b_ts_idx;
2247 :
2248 1591966 : b_ts_idx = add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) );
2249 :
2250 1591966 : IF( NE_16( num_dmx, num_ch ) )
2251 : {
2252 1591966 : set32_fx( pSparMd->band_coeffs[b_ts_idx].P_re_fx, 0, IVAS_SPAR_MAX_CH - 1 );
2253 1591966 : pSparMd->band_coeffs[b_ts_idx].q_P_re_fx = 0;
2254 1591966 : move16();
2255 12735728 : FOR( i = 0; i < sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ); i++ )
2256 : {
2257 11143762 : set32_fx( recon_uu_re[i], 0, sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ) );
2258 : }
2259 :
2260 5548228 : FOR( i = num_dmx; i < num_ch; i++ )
2261 : {
2262 17126472 : FOR( j = num_dmx; j < num_ch; j++ )
2263 : {
2264 13170210 : cov_uu_re[i - num_dmx][j - num_dmx] = postpred_cov_re[i][j]; // q_postpred_cov_re
2265 13170210 : move32();
2266 : }
2267 : }
2268 1591966 : q_cov_uu_re = q_postpred_cov_re;
2269 1591966 : move16();
2270 :
2271 1591966 : IF( EQ_16( dtx_vad, 1 ) )
2272 : {
2273 3608884 : FOR( i = 1; i < num_dmx; i++ )
2274 : {
2275 6440568 : FOR( j = 1; j < num_dmx; j++ )
2276 : {
2277 4403472 : cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; // q_postpred_cov_re
2278 4403472 : move32();
2279 : }
2280 : }
2281 1571788 : q_cov_dd_re = q_postpred_cov_re;
2282 1571788 : move16();
2283 :
2284 1571788 : Word16 q_C_re = pSparMd->band_coeffs[b_ts_idx].q_C_re_fx;
2285 1571788 : move16();
2286 :
2287 1571788 : IF( EQ_16( num_dmx, 2 ) )
2288 : {
2289 : Word32 re1, re2;
2290 :
2291 464160 : W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], cov_dd_re[0][0] ); /*q_cov_dd_re+ pSparMd->band_coeffs[b_ts_idx].q_C_re_fx*/
2292 464160 : q_tmp1 = W_norm( W_tmp );
2293 464160 : re1 = W_extract_h( W_shl( W_tmp, q_tmp1 ) ); /*q_cov_dd_re+ q_C_re+q_tmp1-32*/
2294 464160 : q_tmp1 = sub( add( add( q_C_re, q_tmp1 ), q_cov_dd_re ), 32 );
2295 464160 : if ( W_tmp == 0 )
2296 : {
2297 45420 : q_tmp1 = 31;
2298 45420 : move16();
2299 : }
2300 464160 : W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], cov_dd_re[0][0] ); /*q_cov_dd_re+ q_C_re*/
2301 464160 : q_tmp = W_norm( W_tmp );
2302 464160 : re2 = W_extract_h( W_shl( W_tmp, q_tmp ) ); /*q_cov_dd_re+ q_C_re+q_tmp-32*/
2303 464160 : q_tmp = sub( add( add( q_C_re, q_tmp ), q_cov_dd_re ), 32 );
2304 464160 : if ( W_tmp == 0 )
2305 : {
2306 92540 : q_tmp = 31;
2307 92540 : move16();
2308 : }
2309 :
2310 464160 : W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re1 ); // q_tmp1+q_C_re
2311 464160 : q_recon_uu_re[0][0] = W_norm( W_tmp );
2312 464160 : move16();
2313 464160 : recon_uu_re[0][0] = W_extract_h( W_shl( W_tmp, q_recon_uu_re[0][0] ) ); // q_tmp1+q_C_re+q_recon_uu_re[0][0]-32
2314 464160 : move32();
2315 464160 : q_recon_uu_re[0][0] = sub( add( add( q_C_re, q_recon_uu_re[0][0] ), q_tmp1 ), 32 );
2316 464160 : move16();
2317 464160 : if ( W_tmp == 0 )
2318 : {
2319 45420 : q_recon_uu_re[0][0] = 31;
2320 45420 : move16();
2321 : }
2322 :
2323 464160 : W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], re1 ); // q_C_re+q_tmp1
2324 464160 : q_recon_uu_re[0][1] = W_norm( W_tmp );
2325 464160 : move16();
2326 464160 : recon_uu_re[0][1] = W_extract_h( W_shl( W_tmp, q_recon_uu_re[0][1] ) ); // q_C_re+q_tmp1+q_recon_uu_re[0][1]-32
2327 464160 : move32();
2328 464160 : q_recon_uu_re[0][1] = sub( add( add( q_C_re, q_recon_uu_re[0][1] ), q_tmp1 ), 32 );
2329 464160 : move16();
2330 464160 : if ( W_tmp == 0 )
2331 : {
2332 94712 : q_recon_uu_re[0][1] = 31;
2333 94712 : move16();
2334 : }
2335 :
2336 464160 : W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re2 ); // q_C_re+q_tmp
2337 464160 : q_recon_uu_re[1][0] = W_norm( W_tmp );
2338 464160 : move16();
2339 464160 : recon_uu_re[1][0] = W_extract_h( W_shl( W_tmp, q_recon_uu_re[1][0] ) ); // q_C_re+q_tmp+q_recon_uu_re[1][0]-32
2340 464160 : move32();
2341 464160 : q_recon_uu_re[1][0] = sub( add( add( q_C_re, q_recon_uu_re[1][0] ), q_tmp ), 32 );
2342 464160 : move16();
2343 464160 : if ( W_tmp == 0 )
2344 : {
2345 94712 : q_recon_uu_re[1][0] = 31;
2346 94712 : move16();
2347 : }
2348 :
2349 464160 : W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], re2 ); // q_C_re+q_tmp
2350 464160 : q_recon_uu_re[1][1] = W_norm( W_tmp );
2351 464160 : move16();
2352 464160 : recon_uu_re[1][1] = W_extract_h( W_shl( W_tmp, q_recon_uu_re[1][1] ) ); // q_C_re+q_tmp+q_recon_uu_re[1][1]-32
2353 464160 : move32();
2354 464160 : q_recon_uu_re[1][1] = sub( add( add( q_C_re, q_recon_uu_re[1][1] ), q_tmp ), 32 );
2355 464160 : move16();
2356 464160 : if ( W_tmp == 0 )
2357 : {
2358 92540 : q_recon_uu_re[1][1] = 31;
2359 92540 : move16();
2360 : }
2361 :
2362 464160 : q_tmp = 31;
2363 464160 : move16();
2364 1392480 : FOR( i = 0; i < 2; i++ )
2365 : {
2366 2784960 : FOR( j = 0; j < 2; j++ )
2367 : {
2368 1856640 : q_tmp = s_min( q_tmp, q_recon_uu_re[i][j] );
2369 : }
2370 : }
2371 464160 : q_tmp = sub( s_min( q_tmp, q_cov_uu_re ), 1 );
2372 :
2373 1392480 : FOR( i = 0; i < 2; i++ )
2374 : {
2375 2784960 : FOR( j = 0; j < 2; j++ )
2376 : {
2377 1856640 : cov_uu_re[i][j] = L_sub( L_shr( cov_uu_re[i][j], sub( q_cov_uu_re, q_tmp ) ), L_shr( recon_uu_re[i][j], sub( q_recon_uu_re[i][j], q_tmp ) ) ); // q_tmp
2378 1856640 : move32();
2379 : }
2380 : }
2381 464160 : q_cov_uu_re = q_tmp;
2382 464160 : move16();
2383 : }
2384 1107628 : ELSE IF( EQ_16( num_dmx, 3 ) )
2385 : {
2386 : Word32 re1[2], re2;
2387 : Word16 q_re1[2];
2388 389748 : set32_fx( re1, 0, 2 );
2389 389748 : set16_fx( q_re1, 31, 2 );
2390 :
2391 1169244 : FOR( j = 0; j < 2; j++ )
2392 : {
2393 2338488 : FOR( k = 0; k < 2; k++ )
2394 : {
2395 : Word32 re;
2396 1558992 : W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][k], cov_dd_re[k][j] ); // q_C_re+q_cov_dd_re
2397 1558992 : q_tmp = sub( W_norm( W_tmp ), 1 );
2398 1558992 : re = W_extract_h( W_shl( W_tmp, q_tmp ) ); // q_C_re+q_cov_dd_re+q_tmp-32
2399 1558992 : q_tmp = sub( add( add( q_C_re, q_tmp ), q_cov_dd_re ), 32 );
2400 1558992 : if ( W_tmp == 0 )
2401 : {
2402 279963 : q_tmp = 31;
2403 279963 : move16();
2404 : }
2405 :
2406 1558992 : IF( LT_16( q_tmp, q_re1[j] ) )
2407 : {
2408 693200 : re1[j] = L_shr( re1[j], sub( q_re1[j], q_tmp ) ); // q_tmp
2409 693200 : move32();
2410 693200 : q_re1[j] = q_tmp;
2411 693200 : move16();
2412 : }
2413 : ELSE
2414 : {
2415 865792 : re = L_shr( re, sub( q_tmp, q_re1[j] ) ); // q_re1[j]
2416 : }
2417 1558992 : re1[j] = L_add( re1[j], re ); // q_re1[j]
2418 1558992 : move32();
2419 : }
2420 : }
2421 :
2422 389748 : W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re1[0] ); // q_C_re+q_re1[0]
2423 389748 : q_tmp = sub( W_norm( W_tmp ), 1 );
2424 389748 : re2 = W_extract_h( W_shl( W_tmp, q_tmp ) ); // q_C_re+q_re1[0]+q_tmp-32
2425 389748 : q_tmp = sub( add( add( q_C_re, q_tmp ), q_re1[0] ), 32 );
2426 389748 : if ( W_tmp == 0 )
2427 : {
2428 72526 : q_tmp = 31;
2429 72526 : move16();
2430 : }
2431 389748 : recon_uu_re[0][0] = re2; // q_C_re+q_re1[0]+q_tmp-32
2432 389748 : move32();
2433 :
2434 389748 : W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][1], re1[1] ); // q_C_re+q_re1[1]
2435 389748 : q_tmp1 = sub( W_norm( W_tmp ), 1 );
2436 389748 : re2 = W_extract_h( W_shl( W_tmp, q_tmp1 ) ); // q_C_re+q_re1[1]+q_tmp1-32
2437 389748 : q_tmp1 = sub( add( add( q_C_re, q_tmp1 ), q_re1[1] ), 32 );
2438 389748 : if ( W_tmp == 0 )
2439 : {
2440 59726 : q_tmp1 = 31;
2441 59726 : move16();
2442 : }
2443 :
2444 389748 : IF( LT_16( q_tmp, q_tmp1 ) )
2445 : {
2446 168033 : re2 = L_shr( re2, sub( q_tmp1, q_tmp ) ); // q_tmp
2447 : }
2448 : ELSE
2449 : {
2450 221715 : recon_uu_re[0][0] = L_shr( recon_uu_re[0][0], sub( q_tmp, q_tmp1 ) ); // q_tmp1
2451 221715 : move32();
2452 221715 : q_tmp = q_tmp1;
2453 221715 : move16();
2454 : }
2455 :
2456 389748 : recon_uu_re[0][0] = L_add( recon_uu_re[0][0], re2 ); // q_tmp
2457 389748 : move32();
2458 :
2459 389748 : IF( LT_16( q_cov_uu_re, q_tmp ) )
2460 : {
2461 328838 : recon_uu_re[0][0] = L_shr( recon_uu_re[0][0], sub( q_tmp, q_cov_uu_re ) ); // q_cov_uu_re
2462 328838 : move32();
2463 : }
2464 : ELSE
2465 : {
2466 121820 : FOR( i = num_dmx; i < num_ch; i++ )
2467 : {
2468 121820 : FOR( j = num_dmx; j < num_ch; j++ )
2469 : {
2470 60910 : cov_uu_re[i - num_dmx][j - num_dmx] = L_shr( cov_uu_re[i - num_dmx][j - num_dmx], sub( q_cov_uu_re, q_tmp ) ); // q_tmp
2471 60910 : move32();
2472 : }
2473 : }
2474 60910 : q_cov_uu_re = q_tmp;
2475 60910 : move16();
2476 : }
2477 :
2478 389748 : IF( recon_uu_re[0][0] != 0 )
2479 : {
2480 331520 : test();
2481 331520 : IF( W_norm( recon_uu_re[0][0] ) == 0 || W_norm( cov_uu_re[0][0] ) == 0 )
2482 : {
2483 128 : FOR( i = num_dmx; i < num_ch; i++ )
2484 : {
2485 128 : FOR( j = num_dmx; j < num_ch; j++ )
2486 : {
2487 64 : cov_uu_re[i - num_dmx][j - num_dmx] = L_shr( cov_uu_re[i - num_dmx][j - num_dmx], 1 ); // q_cov_uu_re-1
2488 64 : move32();
2489 : }
2490 : }
2491 64 : q_cov_uu_re = sub( q_cov_uu_re, 1 );
2492 64 : recon_uu_re[0][0] = L_shr( recon_uu_re[0][0], 1 ); // q_cov_uu_re
2493 64 : move32();
2494 : }
2495 : }
2496 :
2497 389748 : cov_uu_re[0][0] = L_sub( cov_uu_re[0][0], recon_uu_re[0][0] ); // q_cov_uu_re
2498 389748 : move32();
2499 : }
2500 717880 : ELSE IF( EQ_16( num_dmx, 4 ) )
2501 : {
2502 : /* Step 1: Multiply C * cov_dd * C' */
2503 : Word32 re1[3], re;
2504 : Word16 q_re1[3];
2505 :
2506 1490880 : FOR( i = 0; i < num_ch - num_dmx; i++ )
2507 : {
2508 1226400 : set32_fx( re1, 0, 3 );
2509 1226400 : set16_fx( q_re1, 31, 3 );
2510 1226400 : set16_fx( q_recon_uu_re[i], 31, IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS );
2511 4905600 : FOR( m = 0; m < num_dmx - 1; m++ )
2512 : {
2513 14716800 : FOR( k = 0; k < num_dmx - 1; k++ )
2514 : {
2515 11037600 : W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[i][k], cov_dd_re[k][m] ); // q_C_re+q_cov_dd_re
2516 11037600 : q_tmp = sub( W_norm( W_tmp ), 2 );
2517 11037600 : re = W_extract_h( W_shl( W_tmp, q_tmp ) ); // q_C_re+q_cov_dd_re+q_tmp-32
2518 11037600 : q_tmp = sub( add( add( q_C_re, q_tmp ), q_cov_dd_re ), 32 );
2519 11037600 : if ( W_tmp == 0 )
2520 : {
2521 1198684 : q_tmp = 31;
2522 1198684 : move16();
2523 : }
2524 :
2525 11037600 : IF( LT_16( q_tmp, q_re1[m] ) )
2526 : {
2527 5052247 : re1[m] = L_shr( re1[m], sub( q_re1[m], q_tmp ) ); // q_tmp
2528 5052247 : move32();
2529 5052247 : q_re1[m] = q_tmp;
2530 5052247 : move16();
2531 : }
2532 : ELSE
2533 : {
2534 5985353 : re = L_shr( re, sub( q_tmp, q_re1[m] ) ); // q_re1[m]
2535 : }
2536 11037600 : IF( re != 0 )
2537 : {
2538 9838896 : test();
2539 9838896 : IF( W_norm( re ) == 0 || W_norm( re1[m] ) == 0 )
2540 : {
2541 3337912 : re1[m] = L_shr( re1[m], 1 ); // q_re1[m]-1
2542 3337912 : move32();
2543 3337912 : q_re1[m] = sub( q_re1[m], 1 );
2544 3337912 : move16();
2545 3337912 : re = L_shr( re, 1 ); // q_re1[m]
2546 : }
2547 : }
2548 :
2549 11037600 : re1[m] = L_add( re1[m], re ); // q_re1[m]
2550 11037600 : move32();
2551 : }
2552 : }
2553 7932720 : FOR( j = 0; j < num_ch - num_dmx; j++ )
2554 : {
2555 26825280 : FOR( m = 0; m < num_dmx - 1; m++ )
2556 : {
2557 20118960 : W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[j][m], re1[m] ); // q_C_re+q_re1[m]
2558 20118960 : q_tmp = sub( W_norm( W_tmp ), 2 );
2559 20118960 : re = W_extract_h( W_shl( W_tmp, q_tmp ) ); // q_C_re+q_re1[m]+q_tmp-32
2560 20118960 : q_tmp = sub( add( add( q_C_re, q_tmp ), q_re1[m] ), 32 );
2561 20118960 : if ( W_tmp == 0 )
2562 : {
2563 2460892 : q_tmp = 31;
2564 2460892 : move16();
2565 : }
2566 :
2567 20118960 : IF( LT_16( q_tmp, q_recon_uu_re[i][j] ) )
2568 : {
2569 8540740 : recon_uu_re[i][j] = L_shr( recon_uu_re[i][j], sub( q_recon_uu_re[i][j], q_tmp ) ); // q_tmp
2570 8540740 : move32();
2571 8540740 : q_recon_uu_re[i][j] = q_tmp;
2572 8540740 : move16();
2573 : }
2574 : ELSE
2575 : {
2576 11578220 : re = L_shr( re, sub( q_tmp, q_recon_uu_re[i][j] ) ); // q_recon_uu_re[i][j]
2577 : }
2578 20118960 : IF( re != 0 )
2579 : {
2580 17658024 : test();
2581 17658024 : IF( W_norm( re ) == 0 || W_norm( recon_uu_re[i][j] ) == 0 )
2582 : {
2583 5986546 : recon_uu_re[i][j] = L_shr( recon_uu_re[i][j], 1 ); // q_recon_uu_re[i][j] - 1
2584 5986546 : move32();
2585 5986546 : q_recon_uu_re[i][j] = sub( q_recon_uu_re[i][j], 1 );
2586 5986546 : move16();
2587 5986546 : re = L_shr( re, 1 ); // q_recon_uu_re[i][j]
2588 : }
2589 : }
2590 20118960 : recon_uu_re[i][j] = L_add( recon_uu_re[i][j], re ); // q_recon_uu_re[i][j]
2591 20118960 : move32();
2592 : }
2593 : }
2594 : }
2595 :
2596 264480 : q_tmp = 31;
2597 264480 : move16();
2598 1490880 : FOR( i = 0; i < num_ch - num_dmx; i++ )
2599 : {
2600 7932720 : FOR( j = 0; j < num_ch - num_dmx; j++ )
2601 : {
2602 6706320 : q_tmp = s_min( q_tmp, q_recon_uu_re[i][j] );
2603 : }
2604 : }
2605 264480 : q_tmp = sub( s_min( q_tmp, q_cov_uu_re ), 1 );
2606 :
2607 : /* Step 2: cov_uu - recon_uu */
2608 1490880 : FOR( i = 0; i < sub( num_ch, num_dmx ); i++ )
2609 : {
2610 7932720 : FOR( j = 0; j < num_ch - num_dmx; j++ )
2611 : {
2612 6706320 : cov_uu_re[i][j] = L_sub( L_shr( cov_uu_re[i][j], sub( q_cov_uu_re, q_tmp ) ), L_shr( recon_uu_re[i][j], sub( q_recon_uu_re[i][j], q_tmp ) ) ); // q_tmp
2613 6706320 : move32();
2614 : }
2615 : }
2616 264480 : q_cov_uu_re = q_tmp;
2617 264480 : move16();
2618 : }
2619 : }
2620 :
2621 1591966 : p_norm_scaling = IVAS_P_NORM_SCALING_FX; // q31
2622 1591966 : move32();
2623 :
2624 1591966 : test();
2625 1591966 : if ( ( dtx_vad == 0 ) && EQ_16( num_dmx, 1 ) )
2626 : {
2627 11238 : p_norm_scaling = IVAS_P_NORM_SCALING_DTX_FX; // q31
2628 11238 : move32();
2629 : }
2630 :
2631 1591966 : trace = 0;
2632 1591966 : move64();
2633 :
2634 5548228 : FOR( i = num_dmx; i < num_ch; i++ )
2635 : {
2636 3956262 : trace = W_add( trace, W_deposit32_l( L_abs( cov_uu_re[i - num_dmx][i - num_dmx] ) ) ); // q_cov_uu_re
2637 : }
2638 :
2639 1591966 : factor = postpred_cov_re[0][0]; // q_postpred_cov_re
2640 1591966 : move32();
2641 1591966 : q_factor = q_postpred_cov_re;
2642 1591966 : move16();
2643 1591966 : IF( trace != 0 )
2644 : {
2645 1557458 : q_factor = W_norm( trace );
2646 1557458 : tmp = Mpy_32_32( p_norm_scaling, W_extract_h( W_shl( trace, q_factor ) ) ); // q_cov_uu_re+q_factor-32
2647 1557458 : q_factor = sub( add( q_cov_uu_re, q_factor ), 32 );
2648 1557458 : IF( GT_16( q_factor, q_postpred_cov_re ) )
2649 : {
2650 1286041 : tmp = L_shr( tmp, sub( q_factor, q_postpred_cov_re ) ); // q_postpred_cov_re
2651 1286041 : q_factor = q_postpred_cov_re;
2652 1286041 : move16();
2653 : }
2654 : ELSE
2655 : {
2656 271417 : factor = L_shr( factor, sub( q_postpred_cov_re, q_factor ) ); // q_factor
2657 : }
2658 1557458 : factor = L_max( factor, tmp ); // q_factor
2659 : }
2660 :
2661 1591966 : tmp = L_shl_sat( 189 /* 1e-20 in Q74 */, sub( q_factor, 74 ) );
2662 :
2663 1591966 : Word16 factor_exp = 0;
2664 1591966 : move16();
2665 1591966 : IF( LE_32( factor, tmp ) )
2666 : {
2667 3573 : factor = 22204; // (1 / 1e-20) in Q(-52)
2668 3573 : factor_exp = Q15 - ( -52 );
2669 3573 : move32();
2670 3573 : move16();
2671 : }
2672 : ELSE
2673 : {
2674 1588393 : factor = BASOP_Util_Divide3232_Scale( 1, factor, &factor_exp ); // q=15-(factor_exp+31-(31-q_factor))
2675 1588393 : factor_exp = add( factor_exp, q_factor );
2676 : }
2677 :
2678 : /* normalise Hermitian (except for rounding) cov_uu */
2679 5548228 : FOR( i = num_dmx; i < num_ch; i++ )
2680 : {
2681 17126472 : FOR( j = num_dmx; j < num_ch; j++ )
2682 : {
2683 13170210 : IF( EQ_16( i, j ) )
2684 : {
2685 : /* force diagonal to be real */
2686 3956262 : W_tmp = W_mult0_32_32( cov_uu_re[i - num_dmx][j - num_dmx], factor ); /*q_cov_uu_re+15-factor_exp*/
2687 3956262 : q_tmp = 32;
2688 3956262 : move16();
2689 3956262 : if ( W_tmp != 0 )
2690 : {
2691 3754086 : q_tmp = W_norm( W_tmp );
2692 : }
2693 3956262 : cov_uu_re[i - num_dmx][j - num_dmx] = W_extract_h( W_shl( W_tmp, q_tmp ) ); /*q_cov_uu_re+15-factor_exp+q_tmp-32*/
2694 3956262 : move32();
2695 3956262 : q_cov_uu_re_per_value[i - num_dmx][j - num_dmx] = sub( add( add( q_cov_uu_re, sub( 15, factor_exp ) ), q_tmp ), 32 );
2696 3956262 : move16();
2697 : }
2698 : ELSE
2699 : {
2700 : /* set off-diag elements to zero */
2701 9213948 : cov_uu_re[i - num_dmx][j - num_dmx] = 0;
2702 9213948 : move32();
2703 9213948 : q_cov_uu_re_per_value[i - num_dmx][j - num_dmx] = 0;
2704 9213948 : move16();
2705 : }
2706 : }
2707 : }
2708 :
2709 : Word16 cov_uu_re_exp;
2710 1591966 : q_tmp = 31;
2711 1591966 : move16();
2712 : /* take sqrt of max of diags and zero */
2713 5548228 : FOR( i = num_dmx; i < num_ch; i++ )
2714 : {
2715 3956262 : cov_uu_re_exp = sub( 31, q_cov_uu_re_per_value[i - num_dmx][i - num_dmx] );
2716 3956262 : cov_uu_re[i - num_dmx][i - num_dmx] = Sqrt32( L_max( 0, cov_uu_re[i - num_dmx][i - num_dmx] ), &cov_uu_re_exp ); // q=31-cov_uu_re_exp
2717 3956262 : move32();
2718 3956262 : q_cov_uu_re_per_value[i - num_dmx][i - num_dmx] = sub( 31, cov_uu_re_exp );
2719 3956262 : move16();
2720 3956262 : q_tmp = s_min( q_tmp, q_cov_uu_re_per_value[i - num_dmx][i - num_dmx] );
2721 : }
2722 :
2723 : /* save into MD struct */
2724 5548228 : FOR( i = num_dmx; i < num_ch; i++ )
2725 : {
2726 17126472 : FOR( j = num_dmx; j < num_ch; j++ )
2727 : {
2728 13170210 : IF( EQ_16( i, j ) )
2729 : {
2730 3956262 : pSparMd->band_coeffs[b_ts_idx].P_re_fx[j - num_dmx] = L_shr( cov_uu_re[i - num_dmx][j - num_dmx], sub( q_cov_uu_re_per_value[i - num_dmx][j - num_dmx], Q28 ) ); // Q28
2731 3956262 : move32();
2732 : }
2733 : }
2734 : }
2735 1591966 : pSparMd->band_coeffs[b_ts_idx].q_P_re_fx = Q28;
2736 1591966 : move16();
2737 : }
2738 :
2739 1591966 : return;
2740 : }
2741 :
2742 1718458 : static void ivas_calc_p_coeffs_per_band_fx(
2743 : ivas_spar_md_t *pSparMd,
2744 : const Word16 i_ts,
2745 : Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], // q_postpred_cov_re
2746 : Word16 q_postpred_cov_re,
2747 : const Word16 num_ch,
2748 : const Word16 dtx_vad,
2749 : const Word16 num_dmx,
2750 : const Word16 band_idx )
2751 : {
2752 : Word16 i, j, k;
2753 : Word16 m;
2754 : Word32 factor;
2755 : Word32 recon_uu_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS];
2756 : Word32 trace;
2757 : Word32 p_norm_scaling;
2758 : Word16 q_cov_uu_re;
2759 : Word32 cov_dd_re[IVAS_SPAR_MAX_CH - 1][IVAS_SPAR_MAX_CH - 1];
2760 : Word32 cov_uu_re[IVAS_SPAR_MAX_CH - 1][IVAS_SPAR_MAX_CH - 1];
2761 : Word16 b_ts_idx;
2762 : Word16 tmp;
2763 :
2764 1718458 : b_ts_idx = add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) );
2765 :
2766 1718458 : IF( NE_16( num_dmx, num_ch ) )
2767 : {
2768 1718458 : set32_fx( pSparMd->band_coeffs[b_ts_idx].P_re_fx, 0, IVAS_SPAR_MAX_CH - 1 );
2769 1718458 : pSparMd->band_coeffs[b_ts_idx].q_P_re_fx = 0;
2770 1718458 : move16();
2771 13747664 : FOR( i = 0; i < sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ); i++ )
2772 : {
2773 12029206 : set32_fx( recon_uu_re[i], 0, sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ) );
2774 : }
2775 :
2776 5024812 : FOR( i = num_dmx; i < num_ch; i++ )
2777 : {
2778 10663516 : FOR( j = num_dmx; j < num_ch; j++ )
2779 : {
2780 7357162 : cov_uu_re[i - num_dmx][j - num_dmx] = postpred_cov_re[i][j]; // q=q_postpred_cov_re
2781 7357162 : move32();
2782 : }
2783 : }
2784 1718458 : q_cov_uu_re = q_postpred_cov_re;
2785 1718458 : move16();
2786 :
2787 1718458 : IF( EQ_16( dtx_vad, 1 ) )
2788 : {
2789 3551338 : FOR( i = 1; i < num_dmx; i++ )
2790 : {
2791 4821560 : FOR( j = 1; j < num_dmx; j++ )
2792 : {
2793 2978850 : cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; // q=q_postpred_cov_re
2794 2978850 : move32();
2795 : }
2796 : }
2797 :
2798 1708628 : Word16 q_C_re = pSparMd->band_coeffs[b_ts_idx].q_C_re_fx;
2799 1708628 : move16();
2800 :
2801 1708628 : IF( EQ_16( num_dmx, 2 ) )
2802 : {
2803 : Word32 re1, re2;
2804 :
2805 706570 : re1 = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], cov_dd_re[0][0] ), q_C_re ) ); // q_cov_uu_re
2806 706570 : re2 = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], cov_dd_re[0][0] ), q_C_re ) ); // q_cov_uu_re
2807 :
2808 706570 : recon_uu_re[0][0] = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re1 ), q_C_re ) ); // q_cov_uu_re
2809 706570 : recon_uu_re[0][1] = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], re1 ), q_C_re ) ); // q_cov_uu_re
2810 706570 : recon_uu_re[1][0] = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re2 ), q_C_re ) ); // q_cov_uu_re
2811 706570 : recon_uu_re[1][1] = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], re2 ), q_C_re ) ); // q_cov_uu_re
2812 706570 : move32();
2813 706570 : move32();
2814 706570 : move32();
2815 706570 : move32();
2816 :
2817 2119710 : FOR( i = 0; i < 2; i++ )
2818 : {
2819 4239420 : FOR( j = 0; j < 2; j++ )
2820 : {
2821 2826280 : cov_uu_re[i][j] = L_sub( cov_uu_re[i][j], recon_uu_re[i][j] ); // q_cov_uu_re
2822 2826280 : move32();
2823 : }
2824 : }
2825 : }
2826 1002058 : ELSE IF( EQ_16( num_dmx, 3 ) )
2827 : {
2828 : Word32 re1[2], re2;
2829 568070 : set32_fx( re1, 0, 2 );
2830 :
2831 1704210 : FOR( j = 0; j < 2; j++ )
2832 : {
2833 3408420 : FOR( k = 0; k < 2; k++ )
2834 : {
2835 : Word32 re;
2836 2272280 : re = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][k], cov_dd_re[k][j] ), q_C_re ) ); // q_cov_uu_re
2837 2272280 : re1[j] = L_add( re1[j], re ); // q_cov_uu_re
2838 2272280 : move32();
2839 : }
2840 : }
2841 :
2842 568070 : re2 = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re1[0] ), q_C_re ) ); // q_cov_uu_re
2843 568070 : recon_uu_re[0][0] = re2; // q_cov_uu_re
2844 568070 : move32();
2845 568070 : re2 = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][1], re1[1] ), q_C_re ) ); // q_cov_uu_re
2846 568070 : recon_uu_re[0][0] = L_add( recon_uu_re[0][0], re2 ); // q_cov_uu_re
2847 568070 : move32();
2848 :
2849 568070 : cov_uu_re[0][0] = L_sub( cov_uu_re[0][0], recon_uu_re[0][0] ); // q_cov_uu_re
2850 568070 : move32();
2851 : }
2852 433988 : ELSE IF( EQ_16( num_dmx, 4 ) )
2853 : {
2854 : /* Step 1: Multiply C * cov_dd * C' */
2855 : Word32 re1[3], re;
2856 :
2857 0 : FOR( i = 0; i < num_ch - num_dmx; i++ )
2858 : {
2859 0 : set32_fx( re1, 0, 3 );
2860 0 : FOR( m = 0; m < num_dmx - 1; m++ )
2861 : {
2862 0 : FOR( k = 0; k < num_dmx - 1; k++ )
2863 : {
2864 0 : re = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[i][k], cov_dd_re[k][m] ), q_C_re ) ); // q_cov_uu_re
2865 0 : re1[m] = L_add( re1[m], re ); // q_cov_uu_re
2866 0 : move32();
2867 : }
2868 : }
2869 0 : FOR( j = 0; j < num_ch - num_dmx; j++ )
2870 : {
2871 0 : FOR( m = 0; m < num_dmx - 1; m++ )
2872 : {
2873 0 : re = W_extract_l( W_shr( W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[j][m], re1[m] ), q_C_re ) ); // q_cov_uu_re
2874 0 : recon_uu_re[i][j] = L_add( recon_uu_re[i][j], re ); // q_cov_uu_re
2875 0 : move32();
2876 : }
2877 : }
2878 : }
2879 :
2880 : /* Step 2: cov_uu - recon_uu */
2881 0 : FOR( i = 0; i < sub( num_ch, num_dmx ); i++ )
2882 : {
2883 0 : FOR( j = 0; j < num_ch - num_dmx; j++ )
2884 : {
2885 0 : cov_uu_re[i][j] = L_sub( cov_uu_re[i][j], recon_uu_re[i][j] ); // q_cov_uu_re
2886 0 : move32();
2887 : }
2888 : }
2889 : }
2890 : }
2891 :
2892 1718458 : p_norm_scaling = IVAS_P_NORM_SCALING_FX; /*q31*/
2893 1718458 : move32();
2894 :
2895 1718458 : test();
2896 1718458 : if ( ( dtx_vad == 0 ) && EQ_16( num_dmx, 1 ) )
2897 : {
2898 3520 : p_norm_scaling = IVAS_P_NORM_SCALING_DTX_FX; /*q31*/
2899 3520 : move32();
2900 : }
2901 :
2902 1718458 : trace = 0;
2903 1718458 : move32();
2904 :
2905 5024812 : FOR( i = num_dmx; i < num_ch; i++ )
2906 : {
2907 3306354 : trace = L_add( trace, L_abs( cov_uu_re[i - num_dmx][i - num_dmx] ) ); // q_cov_uu_re
2908 : }
2909 :
2910 1718458 : factor = L_max( IVAS_FIX_EPS, postpred_cov_re[0][0] ); // q=q_postpred_cov_re
2911 1718458 : factor = L_max( factor, Mpy_32_32( p_norm_scaling, trace ) ); // q=q_postpred_cov_re
2912 :
2913 1718458 : Word16 factor_exp = 0;
2914 1718458 : move16();
2915 1718458 : factor = BASOP_Util_Divide3232_Scale( L_shl( 1, q_postpred_cov_re ), factor, &factor_exp ); // q=15-factor_exp
2916 1718458 : tmp = sub( 15, factor_exp );
2917 :
2918 : /* normalise Hermitian (except for rounding) cov_uu */
2919 5024812 : FOR( i = num_dmx; i < num_ch; i++ )
2920 : {
2921 10663516 : FOR( j = num_dmx; j < num_ch; j++ )
2922 : {
2923 7357162 : IF( EQ_16( i, j ) )
2924 : {
2925 : /* force diagonal to be real */
2926 3306354 : cov_uu_re[i - num_dmx][j - num_dmx] = W_extract_l( W_shr( W_mult0_32_32( cov_uu_re[i - num_dmx][j - num_dmx], factor ), tmp ) ); // q_cov_uu_re
2927 3306354 : move32();
2928 : }
2929 : ELSE
2930 : {
2931 : /* set off-diag elements to zero */
2932 4050808 : cov_uu_re[i - num_dmx][j - num_dmx] = 0;
2933 4050808 : move32();
2934 : }
2935 : }
2936 : }
2937 :
2938 : Word16 cov_uu_re_exp;
2939 : /* take sqrt of max of diags and zero */
2940 5024812 : FOR( i = num_dmx; i < num_ch; i++ )
2941 : {
2942 3306354 : cov_uu_re_exp = sub( 31, q_cov_uu_re );
2943 3306354 : cov_uu_re[i - num_dmx][i - num_dmx] = Sqrt32( L_max( 0, cov_uu_re[i - num_dmx][i - num_dmx] ), &cov_uu_re_exp ); // q=31-cov_uu_re_exp
2944 3306354 : cov_uu_re[i - num_dmx][i - num_dmx] = L_shl( cov_uu_re[i - num_dmx][i - num_dmx], sub( q_cov_uu_re, sub( 31, cov_uu_re_exp ) ) ); // q_cov_uu_re
2945 3306354 : move32();
2946 3306354 : move32();
2947 : }
2948 :
2949 : /* save into MD struct */
2950 5024812 : FOR( i = num_dmx; i < num_ch; i++ )
2951 : {
2952 10663516 : FOR( j = num_dmx; j < num_ch; j++ )
2953 : {
2954 7357162 : IF( EQ_16( i, j ) )
2955 : {
2956 3306354 : pSparMd->band_coeffs[b_ts_idx].P_re_fx[j - num_dmx] = cov_uu_re[i - num_dmx][j - num_dmx]; // q_cov_uu_re
2957 3306354 : move32();
2958 : }
2959 : }
2960 : }
2961 1718458 : pSparMd->band_coeffs[b_ts_idx].q_P_re_fx = q_cov_uu_re;
2962 1718458 : move16();
2963 : }
2964 :
2965 1718458 : return;
2966 : }
2967 :
2968 :
2969 : /*-----------------------------------------------------------------------------------------*
2970 : * Function ivas_calc_c_coeffs_per_band()
2971 : *
2972 : * Calculate C coeffs per band
2973 : *-----------------------------------------------------------------------------------------*/
2974 :
2975 1966132 : static void ivas_calc_c_coeffs_per_band_enc_fx(
2976 : ivas_spar_md_t *pSparMd,
2977 : const Word16 i_ts,
2978 : Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], // q_post_pred_cov_re
2979 : Word16 q_post_pred_cov_re,
2980 : const Word16 num_ch,
2981 : const Word16 num_dmx,
2982 : const Word16 band_idx,
2983 : const Word16 dtx_vad )
2984 : {
2985 : Word16 i, j, k;
2986 :
2987 : /* worst case for cov_ud is actually 12 x 3 */
2988 : Word32 cov_ud_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1];
2989 : Word32 cov_dd_re[FOA_CHANNELS - 1][FOA_CHANNELS - 1];
2990 : Word32 cov_dd_re_inv[FOA_CHANNELS - 1][FOA_CHANNELS - 1];
2991 : Word16 q_cov_dd_re_inv;
2992 : Word32 trace_cov_dd_re, max_val;
2993 : Word16 q_tmp;
2994 : Word32 abs_trace;
2995 : Word16 b_ts_idx;
2996 :
2997 1966132 : b_ts_idx = add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) );
2998 :
2999 1966132 : IF( dtx_vad == 0 )
3000 : {
3001 11920 : set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, imult1616( sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ), sub( IVAS_SPAR_MAX_DMX_CHS, 1 ) ) );
3002 11920 : pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = 0;
3003 11920 : move16();
3004 11920 : return;
3005 : }
3006 :
3007 6607936 : FOR( i = num_dmx; i < num_ch; i++ )
3008 : {
3009 14862628 : FOR( j = 1; j < num_dmx; j++ )
3010 : {
3011 10208904 : cov_ud_re[i - num_dmx][j - 1] = postpred_cov_re[i][j]; // q_post_pred_cov_re
3012 10208904 : move32();
3013 : }
3014 : }
3015 :
3016 1954212 : max_val = 0;
3017 1954212 : move32();
3018 :
3019 5615924 : FOR( i = 1; i < num_dmx; i++ )
3020 : {
3021 11796344 : FOR( j = 1; j < num_dmx; j++ )
3022 : {
3023 8134632 : IF( EQ_16( i, j ) )
3024 : {
3025 3661712 : max_val = L_max( max_val, postpred_cov_re[i][j] ); // q_post_pred_cov_re
3026 : }
3027 8134632 : cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; // q_post_pred_cov_re
3028 8134632 : move32();
3029 : }
3030 : }
3031 :
3032 1954212 : trace_cov_dd_re = 0;
3033 1954212 : move32();
3034 :
3035 5615924 : FOR( i = 0; i < sub( num_dmx, 1 ); i++ )
3036 : {
3037 3661712 : trace_cov_dd_re = L_add( trace_cov_dd_re, Mpy_32_32( cov_dd_re[i][i], 10737418 /* 0.005f in Q31*/ ) ); // q_post_pred_cov_re
3038 : }
3039 :
3040 1954212 : abs_trace = L_abs( trace_cov_dd_re ); // q_post_pred_cov_re
3041 :
3042 1954212 : IF( LE_32( abs_trace, IVAS_FIX_EPS ) )
3043 : {
3044 : /* protection from cases when variance of residual channels is very small */
3045 30683 : set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, imult1616( sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ), sub( IVAS_SPAR_MAX_DMX_CHS, 1 ) ) );
3046 30683 : pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = 0;
3047 30683 : move16();
3048 : }
3049 : ELSE
3050 : {
3051 1923529 : q_tmp = 1;
3052 1923529 : move16();
3053 1923529 : if ( norm_l( max_val ) > 0 )
3054 : {
3055 1830161 : q_tmp = 0;
3056 1830161 : move16();
3057 : }
3058 1923529 : trace_cov_dd_re = L_shr( trace_cov_dd_re, q_tmp ); // q_post_pred_cov_re - q_tmp
3059 5529684 : FOR( i = 0; i < sub( num_dmx, 1 ); i++ )
3060 : {
3061 11622042 : FOR( j = 0; j < sub( num_dmx, 1 ); j++ )
3062 : {
3063 8015887 : cov_dd_re[i][j] = L_shr( cov_dd_re[i][j], q_tmp ); // q_post_pred_cov_re - q_tmp
3064 8015887 : move32();
3065 : }
3066 : }
3067 :
3068 5529684 : FOR( i = 0; i < sub( num_dmx, 1 ); i++ )
3069 : {
3070 3606155 : cov_dd_re[i][i] = L_add( trace_cov_dd_re, cov_dd_re[i][i] ); // q_post_pred_cov_re - q_tmp
3071 3606155 : move32();
3072 : }
3073 1923529 : test();
3074 1923529 : IF( EQ_16( ivas_is_mat_inv_fx( cov_dd_re, q_post_pred_cov_re, sub( num_dmx, 1 ) ), 1 ) && LT_16( num_dmx, FOA_CHANNELS ) )
3075 : {
3076 204 : set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, imult1616( sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ), sub( IVAS_SPAR_MAX_DMX_CHS, 1 ) ) );
3077 204 : pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = 0;
3078 204 : move16();
3079 : }
3080 : ELSE
3081 : {
3082 1923325 : ivas_calc_mat_inv_fx( cov_dd_re, sub( q_post_pred_cov_re, q_tmp ), sub( num_dmx, 1 ), cov_dd_re_inv, &q_cov_dd_re_inv );
3083 :
3084 : Word16 tmp;
3085 1923325 : Word64 W_max_val = 1;
3086 1923325 : move64();
3087 : Word64 C_re_fx[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1];
3088 :
3089 6520113 : FOR( i = 0; i < sub( num_ch, num_dmx ); i++ )
3090 : {
3091 14696638 : FOR( j = 0; j < sub( num_dmx, 1 ); j++ )
3092 : {
3093 10099850 : C_re_fx[i][j] = 0;
3094 10099850 : move64();
3095 36070944 : FOR( k = 0; k < sub( num_dmx, 1 ); k++ )
3096 : {
3097 25971094 : C_re_fx[i][j] = W_add_nosat( C_re_fx[i][j], W_mult0_32_32( cov_ud_re[i][k], cov_dd_re_inv[k][j] ) ); // q_post_pred_cov_re+q_cov_dd_re_inv
3098 25971094 : move64();
3099 : }
3100 10099850 : if ( LT_64( W_max_val, W_abs( C_re_fx[i][j] ) ) )
3101 : {
3102 3219213 : W_max_val = W_abs( C_re_fx[i][j] ); // q_post_pred_cov_re+q_cov_dd_re_inv
3103 : }
3104 : }
3105 : }
3106 :
3107 1923325 : tmp = s_max( sub( 32, W_norm( W_max_val ) ), 0 );
3108 :
3109 6520113 : FOR( i = 0; i < sub( num_ch, num_dmx ); i++ )
3110 : {
3111 14696638 : FOR( j = 0; j < sub( num_dmx, 1 ); j++ )
3112 : {
3113 10099850 : pSparMd->band_coeffs[b_ts_idx].C_re_fx[i][j] = W_extract_l( W_shr( C_re_fx[i][j], tmp ) ); // q_post_pred_cov_re+q_cov_dd_re_inv-tmp
3114 10099850 : move32();
3115 : }
3116 : }
3117 1923325 : pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = sub( add( q_cov_dd_re_inv, q_post_pred_cov_re ), tmp );
3118 1923325 : move16();
3119 : }
3120 : }
3121 :
3122 1954212 : return;
3123 : }
3124 :
3125 1280950 : static void ivas_calc_c_coeffs_per_band_fx(
3126 : ivas_spar_md_t *pSparMd,
3127 : const Word16 i_ts,
3128 : Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_post_pred_cov_re*/
3129 : Word16 q_post_pred_cov_re,
3130 : const Word16 num_ch,
3131 : const Word16 num_dmx,
3132 : const Word16 band_idx,
3133 : const Word16 dtx_vad )
3134 : {
3135 : Word16 i, j, k;
3136 :
3137 : /* worst case for cov_ud is actually 12 x 3 */
3138 : Word32 cov_ud_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1];
3139 : Word32 cov_dd_re[FOA_CHANNELS - 1][FOA_CHANNELS - 1];
3140 : Word32 cov_dd_re_inv[FOA_CHANNELS - 1][FOA_CHANNELS - 1];
3141 : Word16 q_cov_dd_re_inv;
3142 : Word32 trace_cov_dd_re;
3143 : Word32 abs_trace;
3144 : Word16 b_ts_idx;
3145 :
3146 1280950 : b_ts_idx = add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) );
3147 :
3148 1280950 : IF( dtx_vad == 0 )
3149 : {
3150 6310 : set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, imult1616( sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ), sub( IVAS_SPAR_MAX_DMX_CHS, 1 ) ) );
3151 6310 : pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = 0;
3152 6310 : move16();
3153 6310 : return;
3154 : }
3155 :
3156 3255850 : FOR( i = num_dmx; i < num_ch; i++ )
3157 : {
3158 4530490 : FOR( j = 1; j < num_dmx; j++ )
3159 : {
3160 2549280 : cov_ud_re[i - num_dmx][j - 1] = postpred_cov_re[i][j]; // q_post_pred_cov_re
3161 2549280 : move32();
3162 : }
3163 : }
3164 :
3165 3117350 : FOR( i = 1; i < num_dmx; i++ )
3166 : {
3167 4821560 : FOR( j = 1; j < num_dmx; j++ )
3168 : {
3169 2978850 : cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; // q_post_pred_cov_re
3170 2978850 : move32();
3171 : }
3172 : }
3173 :
3174 1274640 : trace_cov_dd_re = 0;
3175 1274640 : move32();
3176 :
3177 3117350 : FOR( i = 0; i < num_dmx - 1; i++ )
3178 : {
3179 1842710 : trace_cov_dd_re = L_add( trace_cov_dd_re, cov_dd_re[i][i] ); // q_post_pred_cov_re
3180 : }
3181 1274640 : trace_cov_dd_re = Mpy_32_32( trace_cov_dd_re, 10737418 /* 0.005f in Q31*/ ); // q_post_pred_cov_re
3182 :
3183 1274640 : abs_trace = L_abs( trace_cov_dd_re ); // q_post_pred_cov_re
3184 :
3185 1274640 : IF( LE_32( abs_trace, IVAS_FIX_EPS ) )
3186 : {
3187 : /* protection from cases when variance of residual channels is very small */
3188 86990 : set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, imult1616( sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ), sub( IVAS_SPAR_MAX_DMX_CHS, 1 ) ) );
3189 86990 : pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = 0;
3190 86990 : move16();
3191 : }
3192 : ELSE
3193 : {
3194 2898135 : FOR( i = 0; i < sub( num_dmx, 1 ); i++ )
3195 : {
3196 1710485 : cov_dd_re[i][i] = L_add( trace_cov_dd_re, cov_dd_re[i][i] ); // q_post_pred_cov_re
3197 1710485 : move32();
3198 : }
3199 1187650 : test();
3200 1187650 : IF( EQ_16( ivas_is_mat_inv_fx( cov_dd_re, q_post_pred_cov_re, sub( num_dmx, 1 ) ), 1 ) && LT_16( num_dmx, FOA_CHANNELS ) )
3201 : {
3202 0 : set32_fx( &pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], 0, imult1616( sub( IVAS_SPAR_MAX_CH, IVAS_SPAR_MAX_DMX_CHS ), sub( IVAS_SPAR_MAX_DMX_CHS, 1 ) ) );
3203 0 : pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = 0;
3204 0 : move16();
3205 : }
3206 : ELSE
3207 : {
3208 1187650 : ivas_calc_mat_inv_fx( cov_dd_re, q_post_pred_cov_re, sub( num_dmx, 1 ), cov_dd_re_inv, &q_cov_dd_re_inv );
3209 :
3210 : Word16 tmp;
3211 1187650 : Word64 max_val = 1;
3212 1187650 : move64();
3213 : Word64 C_re_fx[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1];
3214 :
3215 3040115 : FOR( i = 0; i < sub( num_ch, num_dmx ); i++ )
3216 : {
3217 4227765 : FOR( j = 0; j < sub( num_dmx, 1 ); j++ )
3218 : {
3219 2375300 : C_re_fx[i][j] = 0;
3220 2375300 : move64();
3221 5796270 : FOR( k = 0; k < sub( num_dmx, 1 ); k++ )
3222 : {
3223 3420970 : C_re_fx[i][j] = W_add_nosat( C_re_fx[i][j], W_mult0_32_32( cov_ud_re[i][k], cov_dd_re_inv[k][j] ) ); // q_post_pred_cov_re+q_cov_dd_re_inv
3224 3420970 : move64();
3225 : }
3226 2375300 : if ( LT_64( max_val, W_abs( C_re_fx[i][j] ) ) )
3227 : {
3228 1278659 : max_val = W_abs( C_re_fx[i][j] ); // q_post_pred_cov_re+q_cov_dd_re_inv
3229 : }
3230 : }
3231 : }
3232 :
3233 1187650 : tmp = s_max( sub( 32, W_norm( max_val ) ), 0 );
3234 :
3235 3040115 : FOR( i = 0; i < sub( num_ch, num_dmx ); i++ )
3236 : {
3237 4227765 : FOR( j = 0; j < sub( num_dmx, 1 ); j++ )
3238 : {
3239 2375300 : pSparMd->band_coeffs[b_ts_idx].C_re_fx[i][j] = W_extract_l( W_shr( C_re_fx[i][j], tmp ) ); // q_post_pred_cov_re+q_cov_dd_re_inv-tmp
3240 2375300 : move32();
3241 : }
3242 : }
3243 1187650 : pSparMd->band_coeffs[b_ts_idx].q_C_re_fx = sub( add( q_cov_dd_re_inv, q_post_pred_cov_re ), tmp );
3244 1187650 : move16();
3245 : }
3246 : }
3247 :
3248 1274640 : return;
3249 : }
3250 :
3251 :
3252 : /*-----------------------------------------------------------------------------------------*
3253 : * Function ivas_calc_c_p_coeffs()
3254 : *
3255 : * Calculation of C and P coeffs
3256 : *-----------------------------------------------------------------------------------------*/
3257 :
3258 :
3259 2430770 : void ivas_calc_c_p_coeffs_enc_fx(
3260 : ivas_spar_md_t *pSparMd,
3261 : Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
3262 : Word16 *q_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
3263 : const Word16 i_ts,
3264 : Word32 ***mixer_mat, /*q_mixer_mat*/
3265 : Word16 q_mixer_mat,
3266 : const Word16 num_ch,
3267 : const Word16 num_dmx,
3268 : const Word16 band_idx,
3269 : const Word16 dtx_vad,
3270 : const Word16 compute_p_flag,
3271 : const Word16 dyn_active_w_flag )
3272 : {
3273 : Word16 i, j, q_postpred_cov_re;
3274 : Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
3275 :
3276 2430770 : q_postpred_cov_re = 0;
3277 2430770 : move16();
3278 :
3279 29169240 : FOR( i = 0; i < IVAS_SPAR_MAX_CH; i++ )
3280 : {
3281 26738470 : set_zero_fx( postpred_cov_re[i], IVAS_SPAR_MAX_CH );
3282 : }
3283 2430770 : IF( NE_16( num_dmx, num_ch ) )
3284 : {
3285 2430770 : ivas_calc_post_pred_per_band_enc_fx( cov_real, q_cov_real, mixer_mat, q_mixer_mat, num_ch, band_idx, postpred_cov_re, &q_postpred_cov_re );
3286 :
3287 2430770 : IF( NE_16( num_dmx, 1 ) )
3288 : {
3289 1966132 : ivas_calc_c_coeffs_per_band_enc_fx( pSparMd, i_ts, postpred_cov_re, q_postpred_cov_re, num_ch, num_dmx, band_idx, dtx_vad );
3290 : }
3291 :
3292 2430770 : IF( dyn_active_w_flag )
3293 : {
3294 0 : FOR( i = 0; i < sub( num_ch, num_dmx ); i++ )
3295 : {
3296 0 : FOR( j = 0; j < sub( num_dmx, 1 ); j++ )
3297 : {
3298 0 : pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].C_re_fx[i][j] = 0;
3299 0 : move32();
3300 : }
3301 : }
3302 0 : pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].q_C_re_fx = 0;
3303 0 : move16();
3304 : }
3305 2430770 : IF( EQ_16( compute_p_flag, 1 ) )
3306 : {
3307 1591966 : ivas_calc_p_coeffs_per_band_enc_fx( pSparMd, i_ts, postpred_cov_re, q_postpred_cov_re, num_ch, dtx_vad, num_dmx, band_idx );
3308 : }
3309 :
3310 2430770 : IF( dyn_active_w_flag )
3311 : {
3312 0 : FOR( i = num_dmx; i < num_ch; i++ )
3313 : {
3314 0 : pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].P_re_fx[i - num_dmx] = 0;
3315 0 : move32();
3316 : }
3317 0 : pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].q_P_re_fx = 0;
3318 0 : move16();
3319 : }
3320 : }
3321 :
3322 2430770 : return;
3323 : }
3324 :
3325 1718458 : void ivas_calc_c_p_coeffs_fx(
3326 : ivas_spar_md_t *pSparMd,
3327 : Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
3328 : Word16 q_cov_real,
3329 : const Word16 i_ts,
3330 : Word32 ***mixer_mat, /*q_mixer_mat*/
3331 : Word16 q_mixer_mat,
3332 : const Word16 num_ch,
3333 : const Word16 num_dmx,
3334 : const Word16 band_idx,
3335 : const Word16 dtx_vad,
3336 : const Word16 compute_p_flag,
3337 : const Word16 dyn_active_w_flag )
3338 : {
3339 : Word16 i, j, q_postpred_cov_re;
3340 : Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
3341 :
3342 1718458 : IF( NE_16( num_dmx, num_ch ) )
3343 : {
3344 1718458 : ivas_calc_post_pred_per_band_fx( cov_real, q_cov_real, mixer_mat, q_mixer_mat, num_ch, band_idx, postpred_cov_re, &q_postpred_cov_re );
3345 :
3346 1718458 : IF( NE_16( num_dmx, 1 ) )
3347 : {
3348 1280950 : ivas_calc_c_coeffs_per_band_fx( pSparMd, i_ts, postpred_cov_re, q_postpred_cov_re, num_ch, num_dmx, band_idx, dtx_vad );
3349 : }
3350 :
3351 1718458 : IF( dyn_active_w_flag )
3352 : {
3353 0 : FOR( i = 0; i < sub( num_ch, num_dmx ); i++ )
3354 : {
3355 0 : FOR( j = 0; j < sub( num_dmx, 1 ); j++ )
3356 : {
3357 0 : pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].C_re_fx[i][j] = 0;
3358 0 : move32();
3359 : }
3360 : }
3361 0 : pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].q_C_re_fx = 0;
3362 0 : move16();
3363 : }
3364 1718458 : IF( EQ_16( compute_p_flag, 1 ) )
3365 : {
3366 1718458 : ivas_calc_p_coeffs_per_band_fx( pSparMd, i_ts, postpred_cov_re, q_postpred_cov_re, num_ch, dtx_vad, num_dmx, band_idx );
3367 : }
3368 :
3369 1718458 : IF( dyn_active_w_flag )
3370 : {
3371 0 : FOR( i = num_dmx; i < num_ch; i++ )
3372 : {
3373 0 : pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].P_re_fx[i - num_dmx] = 0;
3374 0 : move32();
3375 : }
3376 0 : pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].q_P_re_fx = 0;
3377 0 : move16();
3378 : }
3379 : }
3380 :
3381 1718458 : return;
3382 : }
3383 :
3384 :
3385 9494356 : static void ivas_calc_mat_det_fx(
3386 : Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM], /*q_in_re*/
3387 : Word16 q_in_re,
3388 : const Word16 dim,
3389 : Word64 *det_re, /*q_det_re*/
3390 : Word16 *q_det_re )
3391 : {
3392 9494356 : IF( EQ_16( dim, IVAS_MAT_DIM_3 ) )
3393 : {
3394 : Word64 re1, re2, re;
3395 1044480 : re1 = W_mult0_32_32( in_re[1][1], in_re[2][2] ); /* 2*q_in_re */
3396 1044480 : re2 = W_mult0_32_32( in_re[1][2], in_re[2][1] ); /* 2*q_in_re */
3397 1044480 : re = W_sub_nosat( re1, re2 ); /* 2*q_in_re */
3398 :
3399 1044480 : re1 = W_mult0_32_32( in_re[0][0], W_extract_h( re ) ); /* 3*q_in_re - 32 */
3400 :
3401 1044480 : *det_re = re1; /* 3*q_in_re - 32 */
3402 1044480 : move64();
3403 :
3404 1044480 : re1 = W_mult0_32_32( in_re[1][0], in_re[2][2] ); /* 2*q_in_re */
3405 1044480 : re2 = W_mult0_32_32( in_re[1][2], in_re[2][0] ); /* 2*q_in_re */
3406 1044480 : re = W_sub_nosat( re1, re2 ); /* 2*q_in_re */
3407 :
3408 1044480 : re1 = W_mult0_32_32( in_re[0][1], W_extract_h( re ) ); /* 3*q_in_re - 32 */
3409 :
3410 1044480 : *det_re = W_sub_nosat( *det_re, re1 ); /* 3*q_in_re - 32 */
3411 1044480 : move64();
3412 :
3413 1044480 : re1 = W_mult0_32_32( in_re[1][0], in_re[2][1] ); /* 2*q_in_re */
3414 1044480 : re2 = W_mult0_32_32( in_re[1][1], in_re[2][0] ); /* 2*q_in_re */
3415 1044480 : re = W_sub_nosat( re1, re2 ); /* 2*q_in_re */
3416 :
3417 1044480 : re1 = W_mult0_32_32( in_re[0][2], W_extract_h( re ) ); /* 3*q_in_re - 32 */
3418 :
3419 1044480 : *det_re = W_add_nosat( *det_re, re1 ); /* 3*q_in_re - 32 */
3420 1044480 : move64();
3421 :
3422 1044480 : *q_det_re = add( q_in_re, sub( add( q_in_re, q_in_re ), 32 ) );
3423 1044480 : move16();
3424 : }
3425 8449876 : ELSE IF( EQ_16( dim, IVAS_MAT_DIM_2 ) )
3426 : {
3427 : Word64 re1, re2;
3428 7021918 : re1 = W_mult0_32_32( in_re[0][0], in_re[1][1] ); /* 2*q_in_re */
3429 7021918 : re2 = W_mult0_32_32( in_re[0][1], in_re[1][0] ); /* 2*q_in_re */
3430 7021918 : *det_re = W_sub_nosat( re1, re2 ); /* 2*q_in_re */
3431 7021918 : move64();
3432 7021918 : *q_det_re = add( q_in_re, q_in_re );
3433 7021918 : move16();
3434 : }
3435 1427958 : ELSE IF( EQ_16( dim, IVAS_MAT_DIM_1 ) )
3436 : {
3437 1427958 : *det_re = in_re[0][0]; /*q_in_re*/
3438 1427958 : move32();
3439 1427958 : *q_det_re = q_in_re;
3440 1427958 : move16();
3441 : }
3442 : ELSE
3443 : {
3444 0 : assert( !"matrix dimention not supported!" );
3445 : }
3446 :
3447 9494356 : return;
3448 : }
3449 :
3450 :
3451 : /*-----------------------------------------------------------------------------------------*
3452 : * Function ivas_get_mat_cofactor()
3453 : *
3454 : * Calculate cofactor for invert matrix
3455 : *-----------------------------------------------------------------------------------------*/
3456 :
3457 :
3458 4700160 : static void ivas_get_mat_cofactor_fx(
3459 : Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM], /*qx*/
3460 : Word32 out_re[MAX_MAT_DIM][MAX_MAT_DIM], /*qx*/
3461 : const Word16 row,
3462 : const Word16 col )
3463 : {
3464 : Word16 i, j;
3465 4700160 : Word16 r = 0, c = 0;
3466 4700160 : move16();
3467 4700160 : move16();
3468 :
3469 18800640 : FOR( i = 0; i < MAX_MAT_DIM; i++ )
3470 : {
3471 56401920 : FOR( j = 0; j < MAX_MAT_DIM; j++ )
3472 : {
3473 42301440 : test();
3474 42301440 : IF( NE_16( i, row ) && NE_16( j, col ) )
3475 : {
3476 18800640 : out_re[r][c] = in_re[i][j]; /*qx*/
3477 18800640 : move64();
3478 18800640 : c = add( c, 1 );
3479 : }
3480 : }
3481 14100480 : IF( EQ_16( c, 2 ) )
3482 : {
3483 9400320 : r = add( r, 1 );
3484 9400320 : c = 0;
3485 9400320 : move16();
3486 : }
3487 : }
3488 :
3489 4700160 : return;
3490 : }
3491 :
3492 :
3493 : /*-----------------------------------------------------------------------------------------*
3494 : * Function ivas_calc_mat_inv()
3495 : *
3496 : * Calculate Invert of a matrix
3497 : *-----------------------------------------------------------------------------------------*/
3498 :
3499 :
3500 3110975 : static void ivas_calc_mat_inv_fx(
3501 : Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM], /*q_in_re*/
3502 : Word16 q_in_re,
3503 : const Word16 dim,
3504 : Word32 out_re[MAX_MAT_DIM][MAX_MAT_DIM], /*q_out_re*/
3505 : Word16 *q_out_re )
3506 : {
3507 : Word64 det;
3508 : Word16 one_by_det, q_one_by_det;
3509 : Word16 i, j, q_tmp;
3510 :
3511 3110975 : IF( EQ_16( dim, IVAS_MAT_DIM_1 ) )
3512 : {
3513 1427958 : det = W_mult0_32_32( in_re[0][0], in_re[0][0] ); /* 2*q_in_re */
3514 : /* assert to catch cases when input is singular matrix*/
3515 1427958 : assert( det > 0 );
3516 :
3517 : // det = (dbl_in_re[0][0] * dbl_in_re[0][0]);
3518 : // det = 1 / det = 1 / (dbl_in_re[0][0] * dbl_in_re[0][0]);
3519 : // dbl_out_re[0][0] = dbl_in_re[0][0] * det = dbl_in_re[0][0] * (1 / (dbl_in_re[0][0] * dbl_in_re[0][0]));
3520 : // dbl_out_re[0][0] = 1 / dbl_in_re[0][0];
3521 :
3522 1427958 : one_by_det = BASOP_Util_Divide3232_Scale( 1, in_re[0][0], &q_tmp ); /*q=15-(q_tmp-(0-q_in_re))*/
3523 1427958 : q_one_by_det = sub( 15, add( q_tmp, q_in_re ) );
3524 :
3525 1427958 : out_re[0][0] = one_by_det; /*q=q_one_by_det*/
3526 1427958 : move32();
3527 1427958 : *q_out_re = q_one_by_det;
3528 1427958 : move16();
3529 : }
3530 1683017 : ELSE IF( EQ_16( dim, IVAS_MAT_DIM_2 ) )
3531 : {
3532 : Word64 det_re;
3533 : Word16 q_det_re;
3534 :
3535 1160777 : ivas_calc_mat_det_fx( in_re, q_in_re, dim, &det_re, &q_det_re );
3536 1160777 : q_tmp = W_norm( det_re );
3537 1160777 : q_tmp = s_max( sub( 32, q_tmp ), 0 );
3538 :
3539 1160777 : det_re = W_shr( det_re, q_tmp ); /*q_det_re-q_tmp*/
3540 1160777 : q_det_re = sub( q_det_re, q_tmp );
3541 :
3542 1160777 : det = W_mult0_32_32( W_extract_l( det_re ), W_extract_l( det_re ) ); /* 2*q_det_re */
3543 : /* assert to catch cases when input is singular matrix*/
3544 1160777 : assert( det > 0 );
3545 :
3546 1160777 : one_by_det = BASOP_Util_Divide3232_Scale( 1, W_extract_l( det_re ), &q_tmp ); // Q = (15 - (q_tmp + q_det_re))
3547 :
3548 1160777 : out_re[0][0] = Mpy_32_16_1( in_re[1][1], one_by_det ); /*q_in_re+(15 - (q_tmp + q_det_re)) -15=>q_in_re-(q_tmp + q_det_re)*/
3549 :
3550 1160777 : out_re[0][1] = L_negate( Mpy_32_16_1( in_re[0][1], one_by_det ) ); /*q_in_re-(q_tmp + q_det_re)*/
3551 :
3552 1160777 : out_re[1][0] = L_negate( Mpy_32_16_1( in_re[1][0], one_by_det ) ); /*q_in_re-(q_tmp + q_det_re)*/
3553 :
3554 1160777 : out_re[1][1] = Mpy_32_16_1( in_re[0][0], one_by_det ); /*q_in_re-(q_tmp + q_det_re)*/
3555 1160777 : move32();
3556 1160777 : move32();
3557 1160777 : move32();
3558 1160777 : move32();
3559 :
3560 1160777 : *q_out_re = sub( q_in_re, add( q_tmp, q_det_re ) ); // Q = (15-(q_tmp + q_det_re)) + q_in_re - 15
3561 1160777 : move16();
3562 : }
3563 522240 : ELSE IF( EQ_16( dim, IVAS_MAT_DIM_3 ) )
3564 : {
3565 : Word32 fac_re[IVAS_MAT_DIM_3][IVAS_MAT_DIM_3];
3566 : Word64 det_re, W_tmp;
3567 522240 : Word16 q_det_re, q_W_tmp = 0;
3568 522240 : move16();
3569 522240 : Word16 sign = 1;
3570 522240 : move16();
3571 :
3572 522240 : ivas_calc_mat_det_fx( in_re, q_in_re, dim, &det_re, &q_det_re );
3573 522240 : q_tmp = W_norm( det_re );
3574 522240 : q_tmp = s_max( sub( 32, q_tmp ), 0 );
3575 :
3576 522240 : det_re = W_shr( det_re, q_tmp ); /*q_det_re-q_tmp*/
3577 522240 : q_det_re = sub( q_det_re, q_tmp );
3578 :
3579 522240 : if ( det_re == 0 )
3580 : {
3581 226 : det_re = 1;
3582 226 : move64();
3583 : }
3584 :
3585 522240 : one_by_det = BASOP_Util_Divide3232_Scale( 1, W_extract_l( det_re ), &q_tmp ); /*15-(q_tmp-(0-q_det_re))*/
3586 522240 : q_one_by_det = sub( 15, add( q_tmp, q_det_re ) );
3587 :
3588 2088960 : FOR( i = 0; i < dim; i++ )
3589 : {
3590 6266880 : FOR( j = 0; j < dim; j++ )
3591 : {
3592 4700160 : ivas_get_mat_cofactor_fx( in_re, fac_re, i, j );
3593 4700160 : ivas_calc_mat_det_fx( fac_re, q_in_re, IVAS_MAT_DIM_2, &W_tmp, &q_W_tmp );
3594 :
3595 4700160 : out_re[j][i] = Mpy_32_16_1( W_extract_h( W_tmp ), one_by_det ); /*q_W_tmp-32+q_one_by_det-15*/
3596 4700160 : move32();
3597 4700160 : out_re[j][i] = W_extract_l( W_mult0_32_32( out_re[j][i], sign ) ); /*q_W_tmp-32+q_one_by_det-15*/
3598 4700160 : move32();
3599 :
3600 4700160 : IF( s_and( add( i, j ), 1 ) == 0 )
3601 : {
3602 2611200 : sign = -1;
3603 2611200 : move16();
3604 : }
3605 : ELSE
3606 : {
3607 2088960 : sign = 1;
3608 2088960 : move16();
3609 : }
3610 : }
3611 : }
3612 522240 : *q_out_re = sub( add( sub( q_W_tmp, 32 ), q_one_by_det ), 15 );
3613 522240 : move16();
3614 : }
3615 : ELSE
3616 : {
3617 0 : assert( !"matrix dimension not supported!" );
3618 : }
3619 :
3620 3110975 : return;
3621 : }
3622 :
3623 :
3624 : /*-----------------------------------------------------------------------------------------*
3625 : * Function ivas_is_mat_inv()
3626 : *
3627 : * Check if matrix is invertible or not by checking if determinant is 0 or very close to 0
3628 : *-----------------------------------------------------------------------------------------*/
3629 :
3630 :
3631 3111179 : static Word16 ivas_is_mat_inv_fx(
3632 : Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM], /*q_in_re*/
3633 : Word16 q_in_re,
3634 : const Word16 dim )
3635 : {
3636 3111179 : Word16 is_det_zero = 0, q_det_re = 0, tmp;
3637 3111179 : move16();
3638 3111179 : move16();
3639 : Word64 det, det_re;
3640 :
3641 3111179 : ivas_calc_mat_det_fx( in_re, q_in_re, dim, &det_re, &q_det_re );
3642 :
3643 3111179 : tmp = W_norm( det_re );
3644 3111179 : tmp = s_max( sub( 32, tmp ), 0 );
3645 :
3646 3111179 : det_re = W_shr( det_re, tmp ); /*q_det_re-tmp*/
3647 3111179 : q_det_re = sub( q_det_re, tmp );
3648 :
3649 3111179 : det = W_mult0_32_32( W_extract_l( det_re ), W_extract_l( det_re ) ); /*2*q_det_re*/
3650 :
3651 3111179 : if ( LE_64( det, IVAS_FIX_EPS ) )
3652 : {
3653 430 : is_det_zero = 1;
3654 430 : move16();
3655 : }
3656 :
3657 3111179 : return is_det_zero;
3658 : }
3659 :
3660 :
3661 : /*-----------------------------------------------------------------------------------------*
3662 : * Function ivas_compute_spar_params()
3663 : *
3664 : *
3665 : *-----------------------------------------------------------------------------------------*/
3666 :
3667 :
3668 305060 : void ivas_compute_spar_params_enc_fx(
3669 : Word32 *cov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
3670 : Word16 *q_cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],
3671 : Word32 dm_fv_re_fx[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_dm_fv_re*/
3672 : Word16 *q_dm_fv_re,
3673 : const Word16 i_ts,
3674 : Word32 ***mixer_mat_fx, /*q_mixer_mat*/
3675 : Word16 *q_mixer_mat,
3676 : const Word16 start_band,
3677 : const Word16 end_band,
3678 : const Word16 dtx_vad,
3679 : const Word16 num_ch,
3680 : const Word16 bands_bw,
3681 : const Word16 active_w,
3682 : const Word16 active_w_vlbr,
3683 : ivas_spar_md_com_cfg *hSparCfg,
3684 : ivas_spar_md_t *hSparMd,
3685 : Word32 *pWscale, /*q_Wscale*/
3686 : Word16 *q_Wscale,
3687 : const Word16 from_dirac,
3688 : const Word16 dyn_active_w_flag )
3689 : {
3690 : Word16 b, i, ndm;
3691 : Word16 q_pred_coeffs_re;
3692 : Word32 pred_coeffs_re_fx[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
3693 :
3694 305060 : ivas_get_pred_coeffs_enc_fx( cov_real_fx, q_cov_real, pred_coeffs_re_fx, &q_pred_coeffs_re, dm_fv_re_fx, q_dm_fv_re, num_ch, start_band, end_band, active_w, active_w_vlbr, dtx_vad, from_dirac, dyn_active_w_flag, hSparMd->res_ind );
3695 :
3696 305060 : ivas_create_fullr_dmx_mat_fx( pred_coeffs_re_fx, q_pred_coeffs_re, dm_fv_re_fx, *q_dm_fv_re, mixer_mat_fx, q_mixer_mat, num_ch, start_band, end_band, active_w, hSparCfg );
3697 :
3698 305060 : ivas_get_Wscaling_factor_enc_fx( cov_real_fx, q_cov_real, pred_coeffs_re_fx, q_pred_coeffs_re, mixer_mat_fx, *q_mixer_mat, start_band, end_band, dtx_vad, num_ch, hSparCfg->num_dmx_chans_per_band, bands_bw, active_w, active_w_vlbr, pWscale, q_Wscale, dyn_active_w_flag );
3699 :
3700 2222866 : FOR( b = start_band; b < end_band; b++ )
3701 : {
3702 : Word16 tmp_exp, q_tmp, tmp;
3703 1917806 : IF( pWscale[b] == 0 )
3704 : {
3705 0 : pWscale[b] = 1;
3706 0 : move32();
3707 0 : q_Wscale[b] = Q31;
3708 0 : move16();
3709 : }
3710 :
3711 1917806 : Word16 onebyscale_fx = BASOP_Util_Divide3232_Scale( 1, pWscale[b], &tmp_exp ); /*q=15-(tmp_exp+(15-(15-q_Wscale)))=>15-(tmp_exp+q_Wscale)*/
3712 1917806 : q_tmp = sub( sub( 15, tmp_exp ), q_Wscale[b] );
3713 :
3714 1917806 : tmp = sub( add( q_pred_coeffs_re, q_tmp ), 15 );
3715 8897624 : FOR( i = 0; i < sub( num_ch, 1 ); i++ )
3716 : {
3717 6979818 : hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i] = L_shl( Mpy_32_16_1( pred_coeffs_re_fx[i][b], onebyscale_fx ), sub( Q28, tmp ) ); // Q28
3718 6979818 : move32();
3719 : }
3720 : // hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].q_pred_re_fx = sub(add(q_pred_coeffs, q_tmp), 15);
3721 1917806 : hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_pred_re_fx = Q28;
3722 1917806 : move16();
3723 :
3724 10815430 : FOR( i = 0; i < num_ch; i++ )
3725 : {
3726 8897624 : mixer_mat_fx[0][i][b] = W_extract_l( W_shr( W_mult0_32_32( mixer_mat_fx[0][i][b], pWscale[b] ), q_Wscale[b] ) ); /*q_mixer_mat*/
3727 8897624 : move32();
3728 : }
3729 : }
3730 :
3731 2222866 : FOR( b = start_band; b < end_band; b++ )
3732 : {
3733 1917806 : ndm = hSparCfg->num_dmx_chans_per_band[( b * bands_bw )];
3734 1917806 : move16();
3735 :
3736 1917806 : IF( NE_16( ndm, num_ch ) )
3737 : {
3738 1591966 : ivas_calc_c_p_coeffs_enc_fx( hSparMd, cov_real_fx, q_cov_real, i_ts, mixer_mat_fx, *q_mixer_mat, num_ch, ndm, b, dtx_vad, 1, dyn_active_w_flag );
3739 : }
3740 : }
3741 :
3742 305060 : return;
3743 : }
3744 :
3745 :
3746 584711 : void ivas_compute_spar_params_fx(
3747 : Word32 *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], /*q_cov_real*/
3748 : Word16 q_cov_real,
3749 : Word32 dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], /*q_dm_fv_re*/
3750 : Word16 *q_dm_fv_re,
3751 : const Word16 i_ts,
3752 : Word32 ***mixer_mat_fx, /*q_mixer_mat*/
3753 : Word16 *q_mixer_mat,
3754 : const Word16 start_band,
3755 : const Word16 end_band,
3756 : const Word16 dtx_vad,
3757 : const Word16 num_ch,
3758 : const Word16 bands_bw,
3759 : const Word16 active_w,
3760 : const Word16 active_w_vlbr,
3761 : ivas_spar_md_com_cfg *hSparCfg,
3762 : ivas_spar_md_t *hSparMd,
3763 : Word32 *pWscale_fx, /*q_pWscale*/
3764 : Word16 *q_pWscale,
3765 : const Word16 from_dirac,
3766 : const Word16 dyn_active_w_flag )
3767 : {
3768 : Word32 pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
3769 :
3770 : Word16 b, i, ndm, j;
3771 : Word16 q_pred_coeffs;
3772 :
3773 584711 : ivas_get_pred_coeffs_fx( cov_real, pred_coeffs_re, dm_fv_re, num_ch, start_band, end_band, active_w, active_w_vlbr, dtx_vad, from_dirac, dyn_active_w_flag, hSparMd->res_ind, &q_pred_coeffs, q_dm_fv_re );
3774 :
3775 584711 : ivas_create_fullr_dmx_mat_fx( pred_coeffs_re, q_pred_coeffs, dm_fv_re, *q_dm_fv_re, mixer_mat_fx, q_mixer_mat, num_ch, start_band, end_band, active_w, hSparCfg );
3776 :
3777 584711 : ivas_get_Wscaling_factor_fx( cov_real, q_cov_real, pred_coeffs_re, q_pred_coeffs, mixer_mat_fx, *q_mixer_mat, start_band, end_band, dtx_vad, num_ch, hSparCfg->num_dmx_chans_per_band, bands_bw, active_w, active_w_vlbr, pWscale_fx, q_pWscale, dyn_active_w_flag );
3778 :
3779 2820619 : FOR( b = start_band; b < end_band; b++ )
3780 : {
3781 : Word16 tmp_exp, q_tmp, tmp;
3782 2235908 : Word16 onebyscale_fx = BASOP_Util_Divide3232_Scale( 1, pWscale_fx[b], &tmp_exp ); /*15-(tmp_exp+q_pWscale[b])*/
3783 2235908 : q_tmp = sub( sub( 15, tmp_exp ), q_pWscale[b] );
3784 :
3785 2235908 : tmp = sub( add( q_pred_coeffs, q_tmp ), 15 );
3786 8943632 : FOR( i = 0; i < sub( num_ch, 1 ); i++ )
3787 : {
3788 6707724 : hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i] = Mpy_32_16_1( pred_coeffs_re[i][b], onebyscale_fx ); // q=tmp
3789 6707724 : move32();
3790 6707724 : IF( tmp < 0 )
3791 : {
3792 0 : tmp = negate( tmp );
3793 0 : hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i] = L_shl( hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i], add( tmp, 22 ) ); // q22
3794 0 : move32();
3795 : }
3796 : ELSE
3797 : {
3798 6707724 : hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i] = L_shr_r( hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i], sub( tmp, 22 ) ); // q22
3799 6707724 : move32();
3800 : }
3801 : }
3802 : // hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].q_pred_re_fx = sub(add(q_pred_coeffs, q_tmp), 15);
3803 2235908 : hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_pred_re_fx = Q22;
3804 2235908 : move16();
3805 :
3806 11179540 : FOR( i = 0; i < num_ch; i++ )
3807 : {
3808 8943632 : mixer_mat_fx[0][i][b] = W_extract_l( W_shr( W_mult0_32_32( mixer_mat_fx[0][i][b], pWscale_fx[b] ), q_pWscale[b] ) ); /*q_mixer_mat*/
3809 8943632 : move32();
3810 : }
3811 : }
3812 :
3813 2820619 : FOR( b = start_band; b < end_band; b++ )
3814 : {
3815 2235908 : ndm = hSparCfg->num_dmx_chans_per_band[b * bands_bw];
3816 2235908 : move16();
3817 :
3818 2235908 : IF( NE_16( ndm, num_ch ) )
3819 : {
3820 1718458 : ivas_calc_c_p_coeffs_fx( hSparMd, cov_real, q_cov_real, i_ts, mixer_mat_fx, *q_mixer_mat, num_ch, ndm, b, dtx_vad, 1, dyn_active_w_flag );
3821 :
3822 1718458 : Word16 q_tmp = hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_C_re_fx;
3823 1718458 : IF( NE_16( ndm, 1 ) )
3824 : {
3825 3274780 : FOR( i = 0; i < ( num_ch - ndm ); i++ )
3826 : {
3827 4555730 : FOR( j = 0; j < sub( ndm, 1 ); j++ )
3828 : {
3829 2561900 : hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].C_re_fx[i][j] = L_shr( hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].C_re_fx[i][j], sub( q_tmp, 22 ) ); // q22
3830 2561900 : move32();
3831 : }
3832 : }
3833 1280950 : hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_C_re_fx = Q22;
3834 1280950 : move16();
3835 : }
3836 :
3837 1718458 : q_tmp = hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_P_re_fx;
3838 1718458 : move16();
3839 :
3840 18903038 : FOR( j = 0; j < sub( IVAS_SPAR_MAX_CH, 1 ); j++ )
3841 : {
3842 17184580 : hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].P_re_fx[j] = L_shr( hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].P_re_fx[j], sub( q_tmp, 22 ) ); // q22
3843 17184580 : move32();
3844 : }
3845 1718458 : hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_P_re_fx = Q22;
3846 1718458 : move16();
3847 : }
3848 : }
3849 :
3850 584711 : return;
3851 : }
3852 :
3853 :
3854 : /*-----------------------------------------------------------------------------------------*
3855 : * Function ivas_get_spar_md_from_dirac_fx()
3856 : *
3857 : *
3858 : *-----------------------------------------------------------------------------------------*/
3859 : Word32 diff_norm_order1_table[4] = { 0, 805306368, 402653184, 268435456 }; // q28
3860 : Word32 diff_norm_order2_table[6] = { 0, 1342177280, 671088640, 447392416, 335544320, 268435456 }; // q28
3861 : Word32 diff_norm_order3_table[8] = { 0, 1879048192, 939524096, 626349376, 469762048, 375809632, 313174688, 268435456 }; // q28
3862 : #define EPSILON_FX_THR 70
3863 : #define ONE_BY_THREE_Q31 715827882
3864 : #define ONE_BY_FIVE_Q31 429496729
3865 : #define ONE_BY_SEVEN_Q31 306783378
3866 :
3867 147560 : void ivas_get_spar_md_from_dirac_enc_fx(
3868 : Word32 azi_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], // Q22
3869 : Word32 ele_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], // Q22
3870 : Word32 diffuseness_fx[IVAS_MAX_NUM_BANDS], // Q30
3871 : const Word16 n_ts,
3872 : Word32 ***mixer_mat_fx, /*q_mixer_mat_fx*/
3873 : Word16 *q_mixer_mat_fx,
3874 : ivas_spar_md_t *hSpar_md,
3875 : ivas_spar_md_com_cfg *hSpar_md_cfg,
3876 : const Word16 start_band,
3877 : const Word16 end_band,
3878 : const Word16 order,
3879 : const Word16 dtx_vad,
3880 : Word32 Wscale_d[IVAS_MAX_NUM_BANDS], // Q29
3881 : const UWord8 useLowerRes,
3882 : const Word16 active_w_vlbr,
3883 : const Word16 dyn_active_w_flag )
3884 : {
3885 :
3886 : Word16 num_ch, band, i, j;
3887 : Word16 block, ch;
3888 : Word16 azimuth, elevation;
3889 :
3890 : Word32 response_avg_fx[MAX_OUTPUT_CHANNELS];
3891 : Word32 response_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MAX_OUTPUT_CHANNELS];
3892 : Word32 cov_real_dirac_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS];
3893 : Word16 q_cov_real_dirac_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS];
3894 : Word32 *pCov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
3895 : Word16 *p_q_Cov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
3896 : Word32 dm_fv_re_fx[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
3897 147560 : Word16 q_dm_fv_re_fx = 0;
3898 : Word16 q_Wscale[IVAS_MAX_NUM_BANDS];
3899 : Word32 Wscale_fx[IVAS_MAX_NUM_BANDS];
3900 : Word32 mixer_mat_local_fx[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH][IVAS_MAX_NUM_BANDS];
3901 : Word32 **ppMixer_mat_fx[IVAS_MAX_FB_MIXER_OUT_CH];
3902 : Word32 *pMixer_mat_fx[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH];
3903 147560 : Word16 q_ppMixer_mat = 0;
3904 : Word32 en_ratio_fac_fx, diff_norm_order1_fx, diff_norm_order2_fx, diff_norm_order3_fx;
3905 : Word16 active_w;
3906 147560 : move16();
3907 147560 : move16();
3908 :
3909 : Word16 ndm, foa_ch, hoa2_ch;
3910 : Word32 P_dir_fact_fx[IVAS_SPAR_MAX_CH - 1];
3911 : const Word16 *remix_order;
3912 :
3913 147560 : set16_fx( q_Wscale, 0, IVAS_MAX_NUM_BANDS );
3914 147560 : set32_fx( Wscale_fx, 0, IVAS_MAX_NUM_BANDS );
3915 147560 : remix_order = remix_order_set[hSpar_md_cfg->remix_unmix_order];
3916 :
3917 147560 : num_ch = ivas_sba_get_nchan_metadata_fx( order, IVAS_256k /*dummy value as order is always 1 in this function*/ );
3918 :
3919 147560 : hoa2_ch = ivas_sba_get_nchan_metadata_fx( SBA_HOA2_ORDER, IVAS_256k /*dummy value as order is always 1 in this function*/ );
3920 147560 : foa_ch = FOA_CHANNELS;
3921 147560 : move16();
3922 147560 : diff_norm_order1_fx = 3;
3923 147560 : move32();
3924 147560 : diff_norm_order2_fx = 5;
3925 147560 : move32();
3926 147560 : diff_norm_order3_fx = 7;
3927 147560 : move32();
3928 :
3929 1770720 : FOR( i = 0; i < IVAS_MAX_FB_MIXER_OUT_CH; i++ )
3930 : {
3931 19477920 : FOR( j = 0; j < IVAS_MAX_SPAR_FB_MIXER_IN_CH; j++ )
3932 : {
3933 17854760 : pMixer_mat_fx[i][j] = mixer_mat_local_fx[i][j];
3934 : }
3935 1623160 : ppMixer_mat_fx[i] = pMixer_mat_fx[i];
3936 : }
3937 :
3938 147560 : test();
3939 147560 : test();
3940 147560 : test();
3941 147560 : test();
3942 147560 : test();
3943 147560 : test();
3944 147560 : IF( ( GE_16( start_band, 6 ) && LE_16( hSpar_md_cfg->nchan_transport, 2 ) && ( EQ_16( dtx_vad, 1 ) ) ) || ( useLowerRes && GE_16( start_band, 3 ) && LE_16( hSpar_md_cfg->nchan_transport, 2 ) && ( EQ_16( dtx_vad, 1 ) ) ) )
3945 : {
3946 : Word32 P_norm_fx[3];
3947 : Word16 idx;
3948 :
3949 80698 : ndm = hSpar_md_cfg->num_dmx_chans_per_band[start_band - 1];
3950 80698 : move16();
3951 80698 : P_norm_fx[0] = 0;
3952 80698 : move32();
3953 80698 : Word16 len = s_max( 0, sub( foa_ch, ndm ) );
3954 284112 : FOR( i = 0; i < len; i++ )
3955 : {
3956 203414 : P_norm_fx[0] = L_add( P_norm_fx[0], Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ) ); // 2*q_P_re - 31
3957 203414 : move32();
3958 : }
3959 80698 : P_norm_fx[0] = Mpy_32_32( L_shl( P_norm_fx[0], 3 ), diff_norm_order1_table[min( diff_norm_order1_fx, max( 0, sub( foa_ch, ndm ) ) )] ); // 2*q_P_re - 31
3960 80698 : move32();
3961 :
3962 80698 : P_norm_fx[1] = 0;
3963 80698 : move32();
3964 80698 : len = s_max( 0, sub( s_min( num_ch, hoa2_ch ), ndm ) );
3965 80698 : FOR( ; i < len; i++ ) // max( 0, ( min( num_ch, hoa2_ch ) - ndm ) )
3966 : {
3967 0 : P_norm_fx[1] = L_add( P_norm_fx[1], Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ) ); // 2*q_P_re - 31
3968 0 : move32();
3969 : }
3970 80698 : P_norm_fx[1] = Mpy_32_32( L_shl( P_norm_fx[1], 3 ), diff_norm_order2_table[min( diff_norm_order2_fx, max( 0, ( min( num_ch, hoa2_ch ) - ndm ) ) )] ); // 2*q_P_re - 31
3971 80698 : move32();
3972 :
3973 80698 : P_norm_fx[2] = 0;
3974 80698 : move32();
3975 80698 : FOR( ; i < ( num_ch - ndm ); i++ )
3976 : {
3977 0 : P_norm_fx[2] = L_add( P_norm_fx[2], Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ) ); // 2*q_P_re - 31
3978 0 : move32();
3979 : }
3980 80698 : P_norm_fx[2] = Mpy_32_32( L_shl( P_norm_fx[2], 3 ), diff_norm_order3_table[min( diff_norm_order3_fx, max( 0, ( num_ch - ndm ) ) )] ); // 2*q_P_re - 31
3981 80698 : move32();
3982 80698 : len = s_max( 0, sub( foa_ch, ndm ) );
3983 284112 : FOR( i = 0; i < len; i++ ) // i < max( 0, ( foa_ch - ndm ) )
3984 : {
3985 203414 : idx = sub( remix_order[i + ndm], ndm );
3986 203414 : P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); // 2*q_P_re - 31
3987 203414 : move32();
3988 203414 : IF( P_dir_fact_fx[idx] != 0 )
3989 : {
3990 151924 : P_dir_fact_fx[idx] = divide3232( P_dir_fact_fx[idx], L_max( P_norm_fx[0], IVAS_FIX_EPS ) ); // q15
3991 151924 : move32();
3992 151924 : P_dir_fact_fx[idx] = L_shl( P_dir_fact_fx[idx], 15 ); // q30
3993 151924 : move32();
3994 : }
3995 : }
3996 80698 : len = s_max( 0, sub( s_min( num_ch, hoa2_ch ), ndm ) );
3997 80698 : FOR( ; i < len; i++ ) // i < max( 0, ( min( num_ch, hoa2_ch ) - ndm ) )
3998 : {
3999 0 : idx = sub( remix_order[i + ndm], ndm );
4000 0 : P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); // 2*q_P_re - 31
4001 0 : IF( P_dir_fact_fx[idx] != 0 )
4002 : {
4003 0 : P_dir_fact_fx[idx] = divide3232( P_dir_fact_fx[idx], L_max( P_norm_fx[1], IVAS_FIX_EPS ) ); // q15
4004 0 : move32();
4005 0 : P_dir_fact_fx[idx] = L_shl( P_dir_fact_fx[idx], 15 ); // q30
4006 0 : move32();
4007 : }
4008 : }
4009 :
4010 80698 : FOR( ; i < ( num_ch - ndm ); i++ )
4011 : {
4012 0 : idx = sub( remix_order[i + ndm], ndm );
4013 0 : P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); // 2*q_P_re - 31
4014 0 : move32();
4015 0 : IF( P_dir_fact_fx[idx] != 0 )
4016 : {
4017 0 : P_dir_fact_fx[idx] = divide3232( P_dir_fact_fx[idx], L_max( P_norm_fx[2], IVAS_FIX_EPS ) ); // q15
4018 0 : move32();
4019 0 : P_dir_fact_fx[idx] = L_shl( P_dir_fact_fx[idx], 15 ); // q30
4020 0 : move32();
4021 : }
4022 : }
4023 : }
4024 :
4025 295120 : FOR( Word16 i_ts = 0; i_ts < n_ts; i_ts++ )
4026 : {
4027 788200 : FOR( band = start_band; band < end_band; band++ )
4028 : {
4029 640640 : ndm = hSpar_md_cfg->num_dmx_chans_per_band[band];
4030 640640 : move16();
4031 :
4032 : /*SPAR from DirAC*/
4033 640640 : set32_fx( response_avg_fx, 0, MAX_OUTPUT_CHANNELS );
4034 :
4035 640640 : IF( GT_16( n_ts, 1 ) )
4036 : {
4037 0 : IF( ele_dirac_fx[band][i_ts] < 0 )
4038 : {
4039 0 : elevation = negate( extract_l( L_shr( L_negate( ele_dirac_fx[band][i_ts] ), Q22 ) ) ); // q0
4040 : }
4041 : ELSE
4042 : {
4043 0 : elevation = extract_l( L_shr( ele_dirac_fx[band][i_ts], Q22 ) ); // q0
4044 : }
4045 0 : IF( azi_dirac_fx[band][i_ts] < 0 )
4046 : {
4047 0 : azimuth = negate( extract_l( L_shr( L_negate( azi_dirac_fx[band][i_ts] ), Q22 ) ) ); // q0
4048 : }
4049 : ELSE
4050 : {
4051 0 : azimuth = extract_l( L_shr( azi_dirac_fx[band][i_ts], Q22 ) ); // q0
4052 : }
4053 0 : ivas_dirac_dec_get_response_fx( azimuth, elevation, response_avg_fx, order, Q30 );
4054 : }
4055 640640 : ELSE IF( useLowerRes )
4056 : {
4057 53292 : IF( ele_dirac_fx[band][0] < 0 )
4058 : {
4059 12774 : elevation = negate( extract_l( L_shr( L_negate( ele_dirac_fx[band][0] ), Q22 ) ) ); // q0
4060 : }
4061 : ELSE
4062 : {
4063 40518 : elevation = extract_l( L_shr( ele_dirac_fx[band][0], Q22 ) ); // q0
4064 : }
4065 53292 : IF( azi_dirac_fx[band][0] < 0 )
4066 : {
4067 31196 : azimuth = negate( extract_l( L_shr( L_negate( azi_dirac_fx[band][0] ), Q22 ) ) ); // q0
4068 : }
4069 : ELSE
4070 : {
4071 22096 : azimuth = extract_l( L_shr( azi_dirac_fx[band][0], Q22 ) ); // q0
4072 : }
4073 53292 : ivas_dirac_dec_get_response_fx( azimuth, elevation, response_avg_fx, order, Q30 );
4074 : }
4075 : ELSE
4076 : {
4077 2936740 : FOR( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
4078 : {
4079 2349392 : IF( ele_dirac_fx[band][block] < 0 )
4080 : {
4081 481924 : elevation = negate( extract_l( L_shr( L_negate( ele_dirac_fx[band][block] ), Q22 ) ) ); // q0
4082 : }
4083 : ELSE
4084 : {
4085 1867468 : elevation = extract_l( L_shr( ele_dirac_fx[band][block], Q22 ) ); // q0
4086 : }
4087 2349392 : IF( azi_dirac_fx[band][block] < 0 )
4088 : {
4089 1130804 : azimuth = negate( extract_l( L_shr( L_negate( azi_dirac_fx[band][block] ), Q22 ) ) ); // q0
4090 : }
4091 : ELSE
4092 : {
4093 1218588 : azimuth = extract_l( L_shr( azi_dirac_fx[band][block], Q22 ) ); // q0
4094 : }
4095 2349392 : ivas_dirac_dec_get_response_fx( azimuth, elevation, &( response_fx[block][0] ), order, Q30 );
4096 : }
4097 :
4098 : /* average responses in all subframes*/
4099 : {
4100 : Word32 norm_fx;
4101 : Word16 norm_q;
4102 : Word16 num_ch_order, hoa2_ch_order;
4103 :
4104 587348 : num_ch_order = ivas_sba_get_nchan_fx( order, 0 );
4105 587348 : hoa2_ch_order = ivas_sba_get_nchan_fx( SBA_HOA2_ORDER, 0 );
4106 :
4107 2936740 : FOR( ch = 0; ch < num_ch_order; ch++ )
4108 : {
4109 2349392 : Word64 temp = 0;
4110 2349392 : move64();
4111 11746960 : FOR( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
4112 : {
4113 9397568 : temp = W_add( temp, W_deposit32_l( response_fx[block][ch] ) ); // q30
4114 : }
4115 2349392 : response_avg_fx[ch] = W_extract_l( W_shr( temp, 2 ) ); // q30
4116 2349392 : move32();
4117 : }
4118 :
4119 : /*normalize 1st order*/
4120 587348 : norm_fx = 0;
4121 587348 : move32();
4122 587348 : norm_q = 0;
4123 587348 : move16();
4124 2349392 : FOR( ch = 1; ch < foa_ch; ch++ )
4125 : {
4126 1762044 : norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29
4127 : }
4128 :
4129 587348 : norm_q = sub( 31, ( sub( add( 30, 30 ), 31 ) ) );
4130 587348 : IF( norm_fx )
4131 : {
4132 582780 : norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q
4133 : }
4134 : ELSE
4135 : {
4136 4568 : norm_fx = EPSILON_FX;
4137 4568 : move32();
4138 : }
4139 587348 : IF( norm_q <= 0 )
4140 : {
4141 542843 : norm_fx = L_shr( norm_fx, ( negate( norm_q ) ) ); // q=31
4142 542843 : norm_q = 0;
4143 542843 : move16();
4144 : }
4145 587348 : norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30
4146 2349392 : FOR( ch = 1; ch < foa_ch; ch++ )
4147 : {
4148 1762044 : IF( LT_32( norm_fx, EPSILON_FX_THR ) )
4149 : {
4150 13704 : IF( response_avg_fx[ch] != 0 )
4151 : {
4152 13171 : response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15
4153 13171 : move32();
4154 : }
4155 13704 : response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
4156 13704 : move32();
4157 : }
4158 1748340 : ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) )
4159 : {
4160 63133 : response_avg_fx[ch] = ONE_IN_Q30; // 1 q30
4161 63133 : move32();
4162 : }
4163 : ELSE
4164 : {
4165 1685207 : response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15
4166 1685207 : move32();
4167 1685207 : response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
4168 1685207 : move32();
4169 : }
4170 : }
4171 :
4172 : /*normalize 2nd order*/
4173 587348 : norm_fx = 0;
4174 587348 : move32();
4175 587348 : Word16 min_ch_order = s_min( hoa2_ch_order, num_ch_order );
4176 587348 : FOR( ch = foa_ch; ch < min_ch_order; ch++ )
4177 : {
4178 0 : norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29
4179 : }
4180 587348 : norm_q = sub( 31, ( sub( add( 29, 29 ), 31 ) ) );
4181 587348 : IF( norm_fx )
4182 : {
4183 0 : norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q
4184 : }
4185 : ELSE
4186 : {
4187 587348 : norm_fx = EPSILON_FX;
4188 587348 : move32();
4189 : }
4190 587348 : IF( norm_q < 0 )
4191 : {
4192 0 : norm_fx = L_shr( norm_fx, negate( norm_q ) ); // q31
4193 0 : norm_q = 0;
4194 0 : move16();
4195 : }
4196 587348 : norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30
4197 587348 : min_ch_order = s_min( hoa2_ch_order, num_ch_order );
4198 587348 : FOR( ch = foa_ch; ch < min_ch_order; ch++ )
4199 : {
4200 0 : IF( LT_32( norm_fx, EPSILON_FX_THR ) )
4201 : {
4202 0 : response_avg_fx[ch] = response_avg_fx[ch]; // q30
4203 0 : response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15
4204 0 : response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
4205 0 : move32();
4206 0 : move32();
4207 0 : move32();
4208 : }
4209 0 : ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) )
4210 : {
4211 0 : response_avg_fx[ch] = ONE_IN_Q30; // q30
4212 0 : move32();
4213 : }
4214 : ELSE
4215 : {
4216 0 : response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15
4217 0 : response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
4218 0 : move32();
4219 0 : move32();
4220 : }
4221 : }
4222 :
4223 : /*normalize 3rd order*/
4224 587348 : norm_fx = 0;
4225 587348 : move32();
4226 587348 : FOR( ch = hoa2_ch_order; ch < num_ch_order; ch++ )
4227 : {
4228 0 : norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29
4229 : }
4230 587348 : norm_q = sub( 31, ( sub( add( 29, 29 ), 31 ) ) );
4231 587348 : IF( norm_fx )
4232 : {
4233 0 : norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q
4234 : }
4235 : ELSE
4236 : {
4237 587348 : norm_fx = EPSILON_FX;
4238 587348 : move32();
4239 : }
4240 587348 : IF( norm_q < 0 )
4241 : {
4242 0 : norm_fx = L_shr( norm_fx, negate( norm_q ) ); // q31
4243 0 : norm_q = 0;
4244 0 : move16();
4245 : }
4246 587348 : norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30
4247 587348 : FOR( ch = hoa2_ch_order; ch < num_ch_order; ch++ )
4248 : {
4249 0 : IF( LT_32( norm_fx, EPSILON_FX_THR ) )
4250 : {
4251 0 : response_avg_fx[ch] = response_avg_fx[ch]; // q30
4252 0 : response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15
4253 0 : response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
4254 0 : move32();
4255 0 : move32();
4256 0 : move32();
4257 : }
4258 0 : ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) )
4259 : {
4260 0 : response_avg_fx[ch] = ONE_IN_Q30; // 1 q30
4261 0 : move32();
4262 : }
4263 : ELSE
4264 : {
4265 0 : response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15
4266 0 : move32();
4267 0 : response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
4268 0 : move32();
4269 : }
4270 : }
4271 : }
4272 : }
4273 :
4274 640640 : FOR( i = add( FOA_CHANNELS, 1 ); i < num_ch; i++ )
4275 : {
4276 0 : response_avg_fx[i] = response_avg_fx[HOA_keep_ind[i]]; // q30
4277 0 : move32();
4278 : }
4279 :
4280 :
4281 640640 : en_ratio_fac_fx = L_shl( L_sub( ONE_IN_Q30 - EPSILON_FX /* Guard to prevent overflow if diffuseness_fx is 0 */, diffuseness_fx[band] ), 1 ); // assuming q of dissusion 30=>q31
4282 640640 : en_ratio_fac_fx = L_max( en_ratio_fac_fx, 0 ); // q31
4283 :
4284 3203200 : FOR( i = 0; i < num_ch; i++ )
4285 : {
4286 12812800 : FOR( j = 0; j < num_ch; j++ )
4287 : {
4288 10250240 : IF( EQ_16( i, j ) )
4289 : {
4290 2562560 : IF( i == 0 )
4291 : {
4292 640640 : cov_real_dirac_fx[i][i][band] = ONE_IN_Q30; // 1 q30
4293 640640 : move32();
4294 : }
4295 : ELSE
4296 : {
4297 1921920 : Word32 en_ratio_fac_sq = 0;
4298 1921920 : move32();
4299 1921920 : cov_real_dirac_fx[i][j][band] = Mpy_32_32( L_shl_sat( Mpy_32_32( en_ratio_fac_fx, response_avg_fx[i] ), 1 ), response_avg_fx[j] ); // q30
4300 1921920 : move32();
4301 :
4302 1921920 : IF( LE_16( hSpar_md_cfg->nchan_transport, 2 ) )
4303 : {
4304 1008732 : cov_real_dirac_fx[i][j][band] = Mpy_32_32( cov_real_dirac_fx[i][j][band], en_ratio_fac_fx ); // q30
4305 1008732 : move32();
4306 1008732 : test();
4307 1008732 : IF( ( GE_16( i, ndm ) ) && ( EQ_16( dtx_vad, 1 ) ) )
4308 : {
4309 813656 : en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx ); // q31
4310 813656 : cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_sq ), P_dir_fact_fx[i - ndm] ) ); // q30
4311 813656 : move32();
4312 : }
4313 : ELSE
4314 : {
4315 195076 : IF( LT_16( i, foa_ch ) )
4316 : {
4317 195076 : en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx ); // q31
4318 195076 : Word32 temp = Mpy_32_32( L_sub( ONE_IN_Q31 /*1 q31*/, en_ratio_fac_sq ), ONE_BY_THREE_Q31 /*1/3 q31*/ ); // q31
4319 195076 : cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( temp, 1 ) ); // q30
4320 195076 : move32();
4321 : }
4322 0 : ELSE IF( LT_16( i, hoa2_ch ) )
4323 : {
4324 0 : en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx ); // q31
4325 0 : Word32 temp = Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_sq ), ONE_BY_FIVE_Q31 /*1/5 q31*/ ); // q31
4326 0 : cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( temp, 1 ) ); // q30
4327 0 : move32();
4328 : }
4329 : ELSE
4330 : {
4331 0 : en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx ); // q31
4332 0 : Word32 temp = Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_sq ), ONE_BY_SEVEN_Q31 /*1/7 q31*/ ); // q31
4333 0 : cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( temp, 1 ) ); // q30
4334 0 : move32();
4335 : }
4336 : }
4337 : }
4338 : ELSE
4339 : {
4340 913188 : IF( LT_16( i, foa_ch ) )
4341 : {
4342 913188 : cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_fx ), ONE_BY_THREE_Q31 /*1/3 q31*/ ), 1 ) ); // q30
4343 913188 : move32();
4344 : }
4345 0 : ELSE IF( LT_16( i, hoa2_ch ) )
4346 : {
4347 0 : cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_fx ), ONE_BY_FIVE_Q31 /*1/5 q31*/ ), 1 ) ); // q30
4348 0 : move32();
4349 : }
4350 : ELSE
4351 : {
4352 0 : cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_fx ), ONE_BY_SEVEN_Q31 /*1/7 q31*/ ), 1 ) ); // q30
4353 0 : move32();
4354 : }
4355 : }
4356 : }
4357 : }
4358 : ELSE
4359 : {
4360 7687680 : cov_real_dirac_fx[i][j][band] = L_shl( Mpy_32_32( Mpy_32_32( en_ratio_fac_fx, response_avg_fx[i] ), response_avg_fx[j] ), 1 ); // q30
4361 7687680 : move32();
4362 : }
4363 : }
4364 : }
4365 : }
4366 :
4367 737800 : FOR( i = 0; i < num_ch; i++ )
4368 : {
4369 2951200 : FOR( j = 0; j < num_ch; j++ )
4370 : {
4371 2360960 : pCov_real_fx[i][j] = cov_real_dirac_fx[i][j]; // q30
4372 2360960 : p_q_Cov_real_fx[i][j] = q_cov_real_dirac_fx[i][j]; // q30
4373 2360960 : set16_fx( q_cov_real_dirac_fx[i][j], Q30, IVAS_MAX_NUM_BANDS );
4374 : }
4375 : }
4376 :
4377 147560 : test();
4378 147560 : active_w = ( EQ_16( dyn_active_w_flag, 1 ) ) || ( EQ_16( hSpar_md_cfg->active_w, 1 ) );
4379 147560 : ivas_compute_spar_params_enc_fx( pCov_real_fx, p_q_Cov_real_fx, dm_fv_re_fx, &q_dm_fv_re_fx, i_ts, ppMixer_mat_fx, &q_ppMixer_mat, start_band, end_band, dtx_vad, num_ch, 1, active_w, active_w_vlbr, hSpar_md_cfg, hSpar_md, Wscale_fx, q_Wscale, 1, dyn_active_w_flag );
4380 :
4381 147560 : IF( mixer_mat_fx != NULL )
4382 : {
4383 147560 : if ( *q_mixer_mat_fx == 0 )
4384 : {
4385 164 : *q_mixer_mat_fx = q_ppMixer_mat;
4386 164 : move16();
4387 : }
4388 788200 : FOR( band = start_band; band < end_band; band++ )
4389 : {
4390 640640 : ndm = hSpar_md_cfg->num_dmx_chans_per_band[band];
4391 640640 : move16();
4392 :
4393 2225232 : FOR( i = 0; i < ndm; i++ )
4394 : {
4395 7922960 : FOR( j = 0; j < num_ch; j++ )
4396 : {
4397 6338368 : mixer_mat_fx[i][j][band + ( i_ts * IVAS_MAX_NUM_BANDS )] = L_shl( ppMixer_mat_fx[i][j][band], sub( *q_mixer_mat_fx, q_ppMixer_mat ) ); // q_mixer_mat_fx
4398 6338368 : move32();
4399 : }
4400 : }
4401 :
4402 1618608 : FOR( i = ndm; i < num_ch; i++ )
4403 : {
4404 4889840 : FOR( j = 0; j < num_ch; j++ )
4405 : {
4406 3911872 : mixer_mat_fx[i][j][band + ( i_ts * IVAS_MAX_NUM_BANDS )] = 0;
4407 3911872 : move32();
4408 : }
4409 : }
4410 :
4411 640640 : test();
4412 640640 : IF( ( EQ_16( ndm, 1 ) ) && ( Wscale_d != NULL ) )
4413 : {
4414 877820 : FOR( j = 0; j < num_ch; j++ )
4415 : {
4416 702256 : mixer_mat_fx[0][j][band + ( i_ts * IVAS_MAX_NUM_BANDS )] = Mpy_32_32( L_shl( mixer_mat_fx[0][j][band + ( i_ts * IVAS_MAX_NUM_BANDS )], 2 ), Wscale_d[band] ); // q_mixer_mat_fx
4417 702256 : move32();
4418 : }
4419 : }
4420 : }
4421 : }
4422 : }
4423 :
4424 147560 : return;
4425 : }
4426 :
4427 :
4428 224486 : void ivas_get_spar_md_from_dirac_fx(
4429 : Word32 azi_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], // Q22
4430 : Word32 ele_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], // Q22
4431 : Word32 diffuseness_fx[IVAS_MAX_NUM_BANDS], // Q30
4432 : const Word16 n_ts,
4433 : Word32 ***mixer_mat_fx, /*q_mixer_mat_fx*/
4434 : Word16 *q_mixer_mat_fx,
4435 : ivas_spar_md_t *hSpar_md,
4436 : ivas_spar_md_com_cfg *hSpar_md_cfg,
4437 : const Word16 start_band,
4438 : const Word16 end_band,
4439 : const Word16 order,
4440 : const Word16 dtx_vad,
4441 : Word32 Wscale_d[IVAS_MAX_NUM_BANDS], // Q29
4442 : const UWord8 useLowerRes,
4443 : const Word16 active_w_vlbr,
4444 : const Word16 dyn_active_w_flag )
4445 : {
4446 :
4447 : Word16 num_ch, band, i, j;
4448 : Word16 block, ch;
4449 : Word16 azimuth, elevation;
4450 :
4451 : Word32 response_avg_fx[MAX_OUTPUT_CHANNELS];
4452 : Word32 response_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MAX_OUTPUT_CHANNELS];
4453 : Word32 cov_real_dirac_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS];
4454 : Word32 *pCov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH];
4455 : Word32 dm_fv_re_fx[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS];
4456 224486 : Word16 q_dm_fv_re_fx = 0;
4457 : Word16 q_Wscale[IVAS_MAX_NUM_BANDS];
4458 : Word32 Wscale_fx[IVAS_MAX_NUM_BANDS];
4459 : Word32 mixer_mat_local_fx[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH][IVAS_MAX_NUM_BANDS];
4460 : Word32 **ppMixer_mat_fx[IVAS_MAX_FB_MIXER_OUT_CH];
4461 : Word32 *pMixer_mat_fx[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH];
4462 224486 : Word16 q_ppMixer_mat = 0;
4463 : Word32 en_ratio_fac_fx, diff_norm_order1_fx, diff_norm_order2_fx, diff_norm_order3_fx;
4464 : Word16 active_w;
4465 224486 : move16();
4466 224486 : move16();
4467 :
4468 : Word16 ndm, foa_ch, hoa2_ch;
4469 : Word32 P_dir_fact_fx[IVAS_SPAR_MAX_CH - 1];
4470 : const Word16 *remix_order;
4471 :
4472 224486 : set16_fx( q_Wscale, 0, IVAS_MAX_NUM_BANDS );
4473 224486 : set32_fx( Wscale_fx, 0, IVAS_MAX_NUM_BANDS );
4474 224486 : remix_order = remix_order_set[hSpar_md_cfg->remix_unmix_order];
4475 :
4476 224486 : num_ch = ivas_sba_get_nchan_metadata_fx( order, IVAS_256k /*dummy value as order is always 1 in this function*/ );
4477 :
4478 224486 : hoa2_ch = ivas_sba_get_nchan_metadata_fx( SBA_HOA2_ORDER, IVAS_256k /*dummy value as order is always 1 in this function*/ );
4479 224486 : foa_ch = FOA_CHANNELS;
4480 224486 : move16();
4481 224486 : diff_norm_order1_fx = 3;
4482 224486 : move32();
4483 224486 : diff_norm_order2_fx = 5;
4484 224486 : move32();
4485 224486 : diff_norm_order3_fx = 7;
4486 224486 : move32();
4487 :
4488 2693832 : FOR( i = 0; i < IVAS_MAX_FB_MIXER_OUT_CH; i++ )
4489 : {
4490 29632152 : FOR( j = 0; j < IVAS_MAX_SPAR_FB_MIXER_IN_CH; j++ )
4491 : {
4492 27162806 : pMixer_mat_fx[i][j] = mixer_mat_local_fx[i][j];
4493 : }
4494 2469346 : ppMixer_mat_fx[i] = pMixer_mat_fx[i];
4495 : }
4496 :
4497 224486 : test();
4498 224486 : test();
4499 224486 : test();
4500 224486 : test();
4501 224486 : test();
4502 224486 : test();
4503 224486 : IF( ( GE_16( start_band, 6 ) && LE_16( hSpar_md_cfg->nchan_transport, 2 ) && ( EQ_16( dtx_vad, 1 ) ) ) || ( useLowerRes && GE_16( start_band, 3 ) && LE_16( hSpar_md_cfg->nchan_transport, 2 ) && ( EQ_16( dtx_vad, 1 ) ) ) )
4504 : {
4505 : Word32 P_norm_fx[3];
4506 : Word16 idx;
4507 :
4508 110533 : ndm = hSpar_md_cfg->num_dmx_chans_per_band[start_band - 1];
4509 110533 : move16();
4510 110533 : P_norm_fx[0] = 0;
4511 110533 : move32();
4512 110533 : Word16 len = s_max( 0, sub( foa_ch, ndm ) );
4513 368954 : FOR( i = 0; i < len; i++ ) // i < max( 0, sub( foa_ch, ndm ) )
4514 : {
4515 258421 : P_norm_fx[0] = L_add( P_norm_fx[0], Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ) ); // 2*q_P_re - 31
4516 258421 : move32();
4517 : }
4518 110533 : P_norm_fx[0] = Mpy_32_32( L_shl( P_norm_fx[0], 3 ), diff_norm_order1_table[min( diff_norm_order1_fx, max( 0, sub( foa_ch, ndm ) ) )] ); // 2*q_P_re - 31
4519 110533 : move32();
4520 :
4521 110533 : P_norm_fx[1] = 0;
4522 110533 : move32();
4523 110533 : len = s_max( 0, sub( s_min( num_ch, hoa2_ch ), ndm ) );
4524 110533 : FOR( ; i < len; i++ ) // i < max( 0, ( min( num_ch, hoa2_ch ) - ndm ) )
4525 : {
4526 0 : P_norm_fx[1] = L_add( P_norm_fx[1], Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ) ); // 2*q_P_re - 31
4527 0 : move32();
4528 : }
4529 110533 : P_norm_fx[1] = Mpy_32_32( L_shl( P_norm_fx[1], 3 ), diff_norm_order2_table[min( diff_norm_order2_fx, max( 0, ( min( num_ch, hoa2_ch ) - ndm ) ) )] ); // 2*q_P_re - 31
4530 110533 : move32();
4531 :
4532 110533 : P_norm_fx[2] = 0;
4533 110533 : move32();
4534 110533 : FOR( ; i < ( num_ch - ndm ); i++ )
4535 : {
4536 0 : P_norm_fx[2] = L_add( P_norm_fx[2], Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ) ); // 2*q_P_re - 31
4537 0 : move32();
4538 : }
4539 110533 : P_norm_fx[2] = Mpy_32_32( L_shl( P_norm_fx[2], 3 ), diff_norm_order3_table[min( diff_norm_order3_fx, max( 0, ( num_ch - ndm ) ) )] ); // 2*q_P_re - 31
4540 110533 : move32();
4541 110533 : len = s_max( 0, sub( foa_ch, ndm ) );
4542 368954 : FOR( i = 0; i < len; i++ ) // i < max( 0, ( foa_ch - ndm ) )
4543 : {
4544 258421 : idx = sub( remix_order[i + ndm], ndm );
4545 258421 : P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); // 2*q_P_re - 31
4546 258421 : move32();
4547 258421 : IF( P_dir_fact_fx[idx] != 0 )
4548 : {
4549 228748 : P_dir_fact_fx[idx] = divide3232( P_dir_fact_fx[idx], L_max( P_norm_fx[0], IVAS_FIX_EPS ) ); // q15
4550 228748 : move32();
4551 228748 : P_dir_fact_fx[idx] = L_shl( P_dir_fact_fx[idx], 15 ); // q30
4552 228748 : move32();
4553 : }
4554 : }
4555 110533 : len = s_max( 0, sub( s_min( num_ch, hoa2_ch ), ndm ) );
4556 110533 : FOR( ; i < len; i++ ) // i < max( 0, ( min( num_ch, hoa2_ch ) - ndm ) )
4557 : {
4558 0 : idx = sub( remix_order[i + ndm], ndm );
4559 0 : P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); // 2*q_P_re - 31
4560 0 : IF( P_dir_fact_fx[idx] != 0 )
4561 : {
4562 0 : P_dir_fact_fx[idx] = divide3232( P_dir_fact_fx[idx], L_max( P_norm_fx[1], IVAS_FIX_EPS ) ); // q15
4563 0 : move32();
4564 0 : P_dir_fact_fx[idx] = L_shl( P_dir_fact_fx[idx], 15 ); // q30
4565 0 : move32();
4566 : }
4567 : }
4568 110533 : FOR( ; i < ( num_ch - ndm ); i++ )
4569 : {
4570 0 : idx = sub( remix_order[i + ndm], ndm );
4571 0 : P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[start_band - 1].P_re_fx[i], hSpar_md->band_coeffs[start_band - 1].P_re_fx[i] ); // 2*q_P_re - 31
4572 0 : move32();
4573 0 : IF( P_dir_fact_fx[idx] != 0 )
4574 : {
4575 0 : P_dir_fact_fx[idx] = divide3232( P_dir_fact_fx[idx], L_max( P_norm_fx[2], IVAS_FIX_EPS ) ); // q15
4576 0 : move32();
4577 0 : P_dir_fact_fx[idx] = L_shl( P_dir_fact_fx[idx], 15 ); // q30
4578 0 : move32();
4579 : }
4580 : }
4581 : }
4582 :
4583 809197 : FOR( Word16 i_ts = 0; i_ts < n_ts; i_ts++ )
4584 : {
4585 2820619 : FOR( band = start_band; band < end_band; band++ )
4586 : {
4587 2235908 : ndm = hSpar_md_cfg->num_dmx_chans_per_band[band];
4588 2235908 : move16();
4589 :
4590 : /*SPAR from DirAC*/
4591 2235908 : set32_fx( response_avg_fx, 0, MAX_OUTPUT_CHANNELS );
4592 :
4593 2235908 : IF( GT_16( n_ts, 1 ) )
4594 : {
4595 1832368 : IF( ele_dirac_fx[band][i_ts] < 0 )
4596 : {
4597 377461 : elevation = negate( extract_l( L_shr( L_negate( ele_dirac_fx[band][i_ts] ), Q22 ) ) ); // q0
4598 : }
4599 : ELSE
4600 : {
4601 1454907 : elevation = extract_l( L_shr( ele_dirac_fx[band][i_ts], Q22 ) ); // q0
4602 : }
4603 1832368 : IF( azi_dirac_fx[band][i_ts] < 0 )
4604 : {
4605 0 : azimuth = negate( extract_l( L_shr( L_negate( azi_dirac_fx[band][i_ts] ), Q22 ) ) ); // q0
4606 : }
4607 : ELSE
4608 : {
4609 1832368 : azimuth = extract_l( L_shr( azi_dirac_fx[band][i_ts], Q22 ) ); // q0
4610 : }
4611 1832368 : ivas_dirac_dec_get_response_fx( azimuth, elevation, response_avg_fx, order, Q30 );
4612 : }
4613 403540 : ELSE IF( useLowerRes )
4614 : {
4615 43860 : IF( ele_dirac_fx[band][0] < 0 )
4616 : {
4617 10376 : elevation = negate( extract_l( L_shr( L_negate( ele_dirac_fx[band][0] ), Q22 ) ) ); // q0
4618 : }
4619 : ELSE
4620 : {
4621 33484 : elevation = extract_l( L_shr( ele_dirac_fx[band][0], Q22 ) ); // q0
4622 : }
4623 43860 : IF( azi_dirac_fx[band][0] < 0 )
4624 : {
4625 0 : azimuth = negate( extract_l( L_shr( L_negate( azi_dirac_fx[band][0] ), Q22 ) ) ); // q0
4626 : }
4627 : ELSE
4628 : {
4629 43860 : azimuth = extract_l( L_shr( azi_dirac_fx[band][0], Q22 ) ); // q0
4630 : }
4631 43860 : ivas_dirac_dec_get_response_fx( azimuth, elevation, response_avg_fx, order, Q30 );
4632 : }
4633 : ELSE
4634 : {
4635 1798400 : FOR( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
4636 : {
4637 1438720 : IF( ele_dirac_fx[band][block] < 0 )
4638 : {
4639 296521 : elevation = negate( extract_l( L_shr( L_negate( ele_dirac_fx[band][block] ), Q22 ) ) ); // q0
4640 : }
4641 : ELSE
4642 : {
4643 1142199 : elevation = extract_l( L_shr( ele_dirac_fx[band][block], Q22 ) ); // q0
4644 : }
4645 1438720 : IF( azi_dirac_fx[band][block] < 0 )
4646 : {
4647 0 : azimuth = negate( extract_l( L_shr( L_negate( azi_dirac_fx[band][block] ), Q22 ) ) ); // q0
4648 : }
4649 : ELSE
4650 : {
4651 1438720 : azimuth = extract_l( L_shr( azi_dirac_fx[band][block], Q22 ) ); // q0
4652 : }
4653 1438720 : ivas_dirac_dec_get_response_fx( azimuth, elevation, &( response_fx[block][0] ), order, Q30 );
4654 : }
4655 :
4656 : /* average responses in all subframes*/
4657 : {
4658 : Word32 norm_fx;
4659 : Word16 norm_q;
4660 : Word16 num_ch_order, hoa2_ch_order;
4661 :
4662 359680 : num_ch_order = ivas_sba_get_nchan_fx( order, 0 );
4663 359680 : hoa2_ch_order = ivas_sba_get_nchan_fx( SBA_HOA2_ORDER, 0 );
4664 :
4665 1798400 : FOR( ch = 0; ch < num_ch_order; ch++ )
4666 : {
4667 1438720 : Word64 temp = 0;
4668 1438720 : move64();
4669 7193600 : FOR( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
4670 : {
4671 5754880 : temp = W_add( temp, W_deposit32_l( response_fx[block][ch] ) ); // q30
4672 : }
4673 1438720 : response_avg_fx[ch] = W_extract_l( W_shr( temp, 2 ) ); // q30
4674 1438720 : move32();
4675 : }
4676 :
4677 : /*normalize 1st order*/
4678 359680 : norm_fx = 0;
4679 359680 : move32();
4680 359680 : norm_q = 0;
4681 359680 : move16();
4682 1438720 : FOR( ch = 1; ch < foa_ch; ch++ )
4683 : {
4684 1079040 : norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29
4685 : }
4686 :
4687 359680 : norm_q = sub( 31, ( sub( add( 30, 30 ), 31 ) ) );
4688 359680 : IF( norm_fx )
4689 : {
4690 356845 : norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q
4691 : }
4692 : ELSE
4693 : {
4694 2835 : norm_fx = EPSILON_FX;
4695 2835 : move32();
4696 : }
4697 359680 : IF( norm_q <= 0 )
4698 : {
4699 332085 : norm_fx = L_shr( norm_fx, ( negate( norm_q ) ) ); // q=31
4700 332085 : norm_q = 0;
4701 332085 : move16();
4702 : }
4703 359680 : norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30
4704 1438720 : FOR( ch = 1; ch < foa_ch; ch++ )
4705 : {
4706 1079040 : IF( LT_32( norm_fx, EPSILON_FX_THR ) )
4707 : {
4708 8505 : IF( response_avg_fx[ch] != 0 )
4709 : {
4710 8124 : response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15
4711 8124 : move32();
4712 : }
4713 8505 : response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
4714 8505 : move32();
4715 : }
4716 1070535 : ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) )
4717 : {
4718 24989 : response_avg_fx[ch] = ONE_IN_Q30; // 1 q30
4719 24989 : move32();
4720 : }
4721 : ELSE
4722 : {
4723 1045546 : response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15
4724 1045546 : move32();
4725 1045546 : response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
4726 1045546 : move32();
4727 : }
4728 : }
4729 :
4730 : /*normalize 2nd order*/
4731 359680 : norm_fx = 0;
4732 359680 : move32();
4733 359680 : Word16 min_ch_order = s_min( hoa2_ch_order, num_ch_order );
4734 359680 : FOR( ch = foa_ch; ch < min_ch_order; ch++ )
4735 : {
4736 0 : norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29
4737 : }
4738 359680 : norm_q = sub( 31, ( sub( add( 29, 29 ), 31 ) ) );
4739 359680 : IF( norm_fx )
4740 : {
4741 0 : norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q
4742 : }
4743 : ELSE
4744 : {
4745 359680 : norm_fx = EPSILON_FX;
4746 359680 : move32();
4747 : }
4748 359680 : IF( norm_q < 0 )
4749 : {
4750 0 : norm_fx = L_shr( norm_fx, negate( norm_q ) ); // q31
4751 0 : norm_q = 0;
4752 0 : move16();
4753 : }
4754 359680 : norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30
4755 359680 : min_ch_order = s_min( hoa2_ch_order, num_ch_order );
4756 359680 : FOR( ch = foa_ch; ch < min_ch_order; ch++ )
4757 : {
4758 0 : IF( LT_32( norm_fx, EPSILON_FX_THR ) )
4759 : {
4760 0 : response_avg_fx[ch] = response_avg_fx[ch]; // q30
4761 0 : response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15
4762 0 : response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
4763 0 : move32();
4764 0 : move32();
4765 0 : move32();
4766 : }
4767 0 : ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) )
4768 : {
4769 0 : response_avg_fx[ch] = ONE_IN_Q30; // q30
4770 0 : move32();
4771 : }
4772 : ELSE
4773 : {
4774 0 : response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15
4775 0 : response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
4776 0 : move32();
4777 0 : move32();
4778 : }
4779 : }
4780 :
4781 : /*normalize 3rd order*/
4782 359680 : norm_fx = 0;
4783 359680 : move32();
4784 359680 : FOR( ch = hoa2_ch_order; ch < num_ch_order; ch++ )
4785 : {
4786 0 : norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29
4787 : }
4788 359680 : norm_q = sub( 31, ( sub( add( 29, 29 ), 31 ) ) );
4789 359680 : IF( norm_fx )
4790 : {
4791 0 : norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q
4792 : }
4793 : ELSE
4794 : {
4795 359680 : norm_fx = EPSILON_FX;
4796 359680 : move32();
4797 : }
4798 359680 : IF( norm_q < 0 )
4799 : {
4800 0 : norm_fx = L_shr( norm_fx, negate( norm_q ) ); // q31
4801 0 : norm_q = 0;
4802 0 : move16();
4803 : }
4804 359680 : norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30
4805 359680 : FOR( ch = hoa2_ch_order; ch < num_ch_order; ch++ )
4806 : {
4807 0 : IF( LT_32( norm_fx, EPSILON_FX_THR ) )
4808 : {
4809 0 : response_avg_fx[ch] = response_avg_fx[ch]; // q30
4810 0 : response_avg_fx[ch] = divide3232( response_avg_fx[ch], EPSILON_FX_THR ); // q15
4811 0 : response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
4812 0 : move32();
4813 0 : move32();
4814 0 : move32();
4815 : }
4816 0 : ELSE IF( GT_32( response_avg_fx[ch], norm_fx ) )
4817 : {
4818 0 : response_avg_fx[ch] = ONE_IN_Q30; // 1 q30
4819 0 : move32();
4820 : }
4821 : ELSE
4822 : {
4823 0 : response_avg_fx[ch] = divide3232( response_avg_fx[ch], norm_fx ); // q15
4824 0 : move32();
4825 0 : response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30
4826 0 : move32();
4827 : }
4828 : }
4829 : }
4830 : }
4831 :
4832 2235908 : FOR( i = add( FOA_CHANNELS, 1 ); i < num_ch; i++ )
4833 : {
4834 0 : response_avg_fx[i] = response_avg_fx[HOA_keep_ind[i]]; // q30
4835 0 : move32();
4836 : }
4837 :
4838 :
4839 2235908 : en_ratio_fac_fx = L_shl( L_sub( ONE_IN_Q30 - EPSILON_FX /* Guard to prevent overflow if diffuseness_fx is 0 */, diffuseness_fx[band] ), 1 ); // assuming q of dissusion 30=>q31
4840 2235908 : en_ratio_fac_fx = L_max( en_ratio_fac_fx, 0 ); // q31
4841 :
4842 11179540 : FOR( i = 0; i < num_ch; i++ )
4843 : {
4844 44718160 : FOR( j = 0; j < num_ch; j++ )
4845 : {
4846 35774528 : IF( EQ_16( i, j ) )
4847 : {
4848 8943632 : IF( i == 0 )
4849 : {
4850 2235908 : cov_real_dirac_fx[i][i][band] = ONE_IN_Q30; // 1 q30
4851 2235908 : move32();
4852 : }
4853 : ELSE
4854 : {
4855 6707724 : Word32 en_ratio_fac_sq = 0;
4856 6707724 : move32();
4857 6707724 : cov_real_dirac_fx[i][j][band] = Mpy_32_32( L_shl( Mpy_32_32( en_ratio_fac_fx, response_avg_fx[i] ), 1 ), response_avg_fx[j] ); // q30
4858 6707724 : move32();
4859 :
4860 6707724 : IF( LE_16( hSpar_md_cfg->nchan_transport, 2 ) )
4861 : {
4862 3451164 : cov_real_dirac_fx[i][j][band] = Mpy_32_32( cov_real_dirac_fx[i][j][band], en_ratio_fac_fx ); // q30
4863 3451164 : move32();
4864 3451164 : test();
4865 3451164 : IF( ( GE_16( i, ndm ) ) && ( EQ_16( dtx_vad, 1 ) ) )
4866 : {
4867 2715104 : en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx ); // q31
4868 2715104 : cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_sq ), P_dir_fact_fx[i - ndm] ) ); // q30
4869 2715104 : move32();
4870 : }
4871 : ELSE
4872 : {
4873 736060 : IF( LT_16( i, foa_ch ) )
4874 : {
4875 736060 : en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx ); // q31
4876 736060 : Word32 temp = Mpy_32_32( L_sub( ONE_IN_Q31 /*1 q31*/, en_ratio_fac_sq ), ONE_BY_THREE_Q31 /*1/3 q31*/ ); // q31
4877 736060 : cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( temp, 1 ) ); // q30
4878 736060 : move32();
4879 : }
4880 0 : ELSE IF( LT_16( i, hoa2_ch ) )
4881 : {
4882 0 : en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx ); // q31
4883 0 : Word32 temp = Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_sq ), ONE_BY_FIVE_Q31 /*1/5 q31*/ ); // q31
4884 0 : cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( temp, 1 ) ); // q30
4885 0 : move32();
4886 : }
4887 : ELSE
4888 : {
4889 0 : en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx ); // q31
4890 0 : Word32 temp = Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_sq ), ONE_BY_SEVEN_Q31 /*1/7 q31*/ ); // q31
4891 0 : cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( temp, 1 ) ); // q30
4892 0 : move32();
4893 : }
4894 : }
4895 : }
4896 : ELSE
4897 : {
4898 3256560 : IF( LT_16( i, foa_ch ) )
4899 : {
4900 3256560 : cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_fx ), ONE_BY_THREE_Q31 /*1/3 q31*/ ), 1 ) ); // q30
4901 3256560 : move32();
4902 : }
4903 0 : ELSE IF( LT_16( i, hoa2_ch ) )
4904 : {
4905 0 : cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_fx ), ONE_BY_FIVE_Q31 /*1/5 q31*/ ), 1 ) ); // q30
4906 0 : move32();
4907 : }
4908 : ELSE
4909 : {
4910 0 : cov_real_dirac_fx[i][j][band] = L_add( cov_real_dirac_fx[i][j][band], L_shr( Mpy_32_32( L_sub( ONE_IN_Q31, en_ratio_fac_fx ), ONE_BY_SEVEN_Q31 /*1/7 q31*/ ), 1 ) ); // q30
4911 0 : move32();
4912 : }
4913 : }
4914 : }
4915 : }
4916 : ELSE
4917 : {
4918 26830896 : cov_real_dirac_fx[i][j][band] = L_shl( Mpy_32_32( Mpy_32_32( en_ratio_fac_fx, response_avg_fx[i] ), response_avg_fx[j] ), 1 ); // q30
4919 26830896 : move32();
4920 : }
4921 : }
4922 : }
4923 : }
4924 :
4925 2923555 : FOR( i = 0; i < num_ch; i++ )
4926 : {
4927 11694220 : FOR( j = 0; j < num_ch; j++ )
4928 : {
4929 9355376 : pCov_real_fx[i][j] = cov_real_dirac_fx[i][j]; // q30
4930 9355376 : move32();
4931 : }
4932 : }
4933 :
4934 584711 : test();
4935 584711 : active_w = ( EQ_16( dyn_active_w_flag, 1 ) ) || ( EQ_16( hSpar_md_cfg->active_w, 1 ) );
4936 584711 : ivas_compute_spar_params_fx( pCov_real_fx, Q30, dm_fv_re_fx, &q_dm_fv_re_fx, i_ts, ppMixer_mat_fx, &q_ppMixer_mat, start_band, end_band, dtx_vad, num_ch, 1, active_w, active_w_vlbr, hSpar_md_cfg, hSpar_md, Wscale_fx, q_Wscale, 1, dyn_active_w_flag );
4937 :
4938 584711 : IF( mixer_mat_fx != NULL )
4939 : {
4940 0 : if ( *q_mixer_mat_fx == 0 )
4941 : {
4942 0 : *q_mixer_mat_fx = q_ppMixer_mat;
4943 0 : move16();
4944 : }
4945 0 : FOR( band = start_band; band < end_band; band++ )
4946 : {
4947 0 : ndm = hSpar_md_cfg->num_dmx_chans_per_band[band];
4948 0 : move16();
4949 :
4950 0 : FOR( i = 0; i < ndm; i++ )
4951 : {
4952 0 : FOR( j = 0; j < num_ch; j++ )
4953 : {
4954 0 : mixer_mat_fx[i][j][band + ( i_ts * IVAS_MAX_NUM_BANDS )] = L_shl( ppMixer_mat_fx[i][j][band], sub( *q_mixer_mat_fx, q_ppMixer_mat ) ); // q_mixer_mat_fx
4955 0 : move32();
4956 : }
4957 : }
4958 :
4959 0 : FOR( i = ndm; i < num_ch; i++ )
4960 : {
4961 0 : FOR( j = 0; j < num_ch; j++ )
4962 : {
4963 0 : mixer_mat_fx[i][j][band + ( i_ts * IVAS_MAX_NUM_BANDS )] = 0;
4964 0 : move32();
4965 : }
4966 : }
4967 :
4968 0 : test();
4969 0 : IF( ( EQ_16( ndm, 1 ) ) && ( Wscale_d != NULL ) )
4970 : {
4971 0 : FOR( j = 0; j < num_ch; j++ )
4972 : {
4973 0 : mixer_mat_fx[0][j][band + ( i_ts * IVAS_MAX_NUM_BANDS )] = Mpy_32_32( L_shl( mixer_mat_fx[0][j][band + ( i_ts * IVAS_MAX_NUM_BANDS )], 2 ), Wscale_d[band] ); // q_mixer_mat_fx
4974 0 : move32();
4975 : }
4976 : }
4977 : }
4978 : }
4979 : }
4980 :
4981 224486 : return;
4982 : }
4983 :
4984 : /*-------------------------------------------------------------------------
4985 : * ivas_dirac_dec_get_response_fx()
4986 : *
4987 : * Block Q of 29 is maintained
4988 : * calculate reponse, 1 degree resolution
4989 : * Input azimuth and elevation are expected in Q0
4990 : *------------------------------------------------------------------------*/
4991 :
4992 : Word32 local_result_table[91][9] /*q30*/ = {
4993 : {
4994 : -1518500224,
4995 : 0,
4996 : 1518500224,
4997 : 0,
4998 : 0,
4999 : -1518500224,
5000 : 0,
5001 : 0,
5002 : 0,
5003 : },
5004 : {
5005 : -1518268928,
5006 : 18739168,
5007 : 1517806336,
5008 : -32452256,
5009 : 283224,
5010 : -1517112832,
5011 : 45883920,
5012 : -633213,
5013 : 4512,
5014 : },
5015 : {
5016 : -1517575296,
5017 : 37472840,
5018 : 1515726208,
5019 : -64865308,
5020 : 1132567,
5021 : -1512954368,
5022 : 91649576,
5023 : -2530954,
5024 : 36081,
5025 : },
5026 : {
5027 : -1516419072,
5028 : 56195504,
5029 : 1512261120,
5030 : -97200048,
5031 : 2547029,
5032 : -1506034816,
5033 : 137178960,
5034 : -5687523,
5035 : 121687,
5036 : },
5037 : {
5038 : -1514801280,
5039 : 74899824,
5040 : 1507416960,
5041 : -129414272,
5042 : 4524729,
5043 : -1496374144,
5044 : 182350416,
5045 : -10092950,
5046 : 288126,
5047 : },
5048 : {
5049 : -1512721920,
5050 : 93582472,
5051 : 1501198336,
5052 : -161472816,
5053 : 7063499,
5054 : -1483994752,
5055 : 227052672,
5056 : -15734350,
5057 : 561983,
5058 : },
5059 : {
5060 : -1510181888,
5061 : 112236512,
5062 : 1493612928,
5063 : -193334368,
5064 : 10160129,
5065 : -1468930304,
5066 : 271167360,
5067 : -22594280,
5068 : 969488,
5069 : },
5070 : {
5071 : -1507181440,
5072 : 130856376,
5073 : 1484670848,
5074 : -224960416,
5075 : 13810849,
5076 : -1451219200,
5077 : 314580448,
5078 : -30651802,
5079 : 1536471,
5080 : },
5081 : {
5082 : -1503722368,
5083 : 149436080,
5084 : 1474381824,
5085 : -256312016,
5086 : 18011172,
5087 : -1430907520,
5088 : 357179712,
5089 : -39882252,
5090 : 2288268,
5091 : },
5092 : {
5093 : -1499805056,
5094 : 167970048,
5095 : 1462759808,
5096 : -287350848,
5097 : 22755934,
5098 : -1408048256,
5099 : 398855200,
5100 : -50257348,
5101 : 3249646,
5102 : },
5103 : {
5104 : -1495430784,
5105 : 186453552,
5106 : 1449817472,
5107 : -318040608,
5108 : 28039610,
5109 : -1382698496,
5110 : 439501280,
5111 : -61745920,
5112 : 4444797,
5113 : },
5114 : {
5115 : -1490601216,
5116 : 204879712,
5117 : 1435571584,
5118 : -348342304,
5119 : 33855484,
5120 : -1354926336,
5121 : 479011360,
5122 : -74312248,
5123 : 5897082,
5124 : },
5125 : {
5126 : -1485317248,
5127 : 223243280,
5128 : 1420039296,
5129 : -378219040,
5130 : 40196448,
5131 : -1324801792,
5132 : 517284416,
5133 : -87917840,
5134 : 7629140,
5135 : },
5136 : {
5137 : -1479581312,
5138 : 241539296,
5139 : 1403239552,
5140 : -407635936,
5141 : 47055084,
5142 : -1292403328,
5143 : 554224000,
5144 : -102521616,
5145 : 9662823,
5146 : },
5147 : {
5148 : -1473394304,
5149 : 259761664,
5150 : 1385192192,
5151 : -436555904,
5152 : 54422836,
5153 : -1257814016,
5154 : 589734528,
5155 : -118078312,
5156 : 12018922,
5157 : },
5158 : {
5159 : -1466758528,
5160 : 277904896,
5161 : 1365919872,
5162 : -464943936,
5163 : 62290712,
5164 : -1221123072,
5165 : 623725376,
5166 : -134540160,
5167 : 14717325,
5168 : },
5169 : {
5170 : -1459675904,
5171 : 295963392,
5172 : 1345445888,
5173 : -492765408,
5174 : 70649128,
5175 : -1182425216,
5176 : 656109568,
5177 : -151856528,
5178 : 17776824,
5179 : },
5180 : {
5181 : -1452148992,
5182 : 313931616,
5183 : 1323795328,
5184 : -519986432,
5185 : 79487904,
5186 : -1141820288,
5187 : 686806528,
5188 : -169973952,
5189 : 21215122,
5190 : },
5191 : {
5192 : -1444179456,
5193 : 331804576,
5194 : 1300994176,
5195 : -546574464,
5196 : 88796448,
5197 : -1099412096,
5198 : 715738304,
5199 : -188836864,
5200 : 25048834,
5201 : },
5202 : {
5203 : -1435770240,
5204 : 349576096,
5205 : 1277071104,
5206 : -572495872,
5207 : 98563056,
5208 : -1055310848,
5209 : 742831168,
5210 : -208386384,
5211 : 29293104,
5212 : },
5213 : {
5214 : -1426923392,
5215 : 367241408,
5216 : 1252053888,
5217 : -597720320,
5218 : 108776240,
5219 : -1009627456,
5220 : 768018944,
5221 : -228562448,
5222 : 33962144,
5223 : },
5224 : {
5225 : -1417641984,
5226 : 384794496,
5227 : 1225974400,
5228 : -622216320,
5229 : 119423168,
5230 : -962481536,
5231 : 791238528,
5232 : -249301712,
5233 : 39068520,
5234 : },
5235 : {
5236 : -1407929088,
5237 : 402230560,
5238 : 1198863744,
5239 : -645953856,
5240 : 130491136,
5241 : -913992384,
5242 : 812432896,
5243 : -270540160,
5244 : 44623688,
5245 : },
5246 : {
5247 : -1397786880,
5248 : 419544320,
5249 : 1170754432,
5250 : -668905408,
5251 : 141966720,
5252 : -864283712,
5253 : 831550336,
5254 : -292211648,
5255 : 50637684,
5256 : },
5257 : {
5258 : -1387219200,
5259 : 436730112,
5260 : 1141681280,
5261 : -691041088,
5262 : 153835648,
5263 : -813483968,
5264 : 848545344,
5265 : -314247680,
5266 : 57118880,
5267 : },
5268 : {
5269 : -1376228736,
5270 : 453783040,
5271 : 1111679744,
5272 : -712335552,
5273 : 166083808,
5274 : -761721216,
5275 : 863377472,
5276 : -336579712,
5277 : 64074440,
5278 : },
5279 : {
5280 : -1364819072,
5281 : 470697504,
5282 : 1080786560,
5283 : -732761408,
5284 : 178695840,
5285 : -709128192,
5286 : 876011648,
5287 : -359136416,
5288 : 71509840,
5289 : },
5290 : {
5291 : -1352993664,
5292 : 487468704,
5293 : 1049038720,
5294 : -752295232,
5295 : 191656864,
5296 : -655838272,
5297 : 886421184,
5298 : -381847712,
5299 : 79429264,
5300 : },
5301 : {
5302 : -1340756224,
5303 : 504091296,
5304 : 1016475840,
5305 : -770911616,
5306 : 204950624,
5307 : -601987264,
5308 : 894582912,
5309 : -404640384,
5310 : 87835088,
5311 : },
5312 : {
5313 : -1328110336,
5314 : 520560224,
5315 : 983137344,
5316 : -788589376,
5317 : 218561056,
5318 : -547711936,
5319 : 900480064,
5320 : -427441888,
5321 : 96728224,
5322 : },
5323 : {
5324 : -1315059712,
5325 : 536870912,
5326 : 949062848,
5327 : -805306304,
5328 : 232471968,
5329 : -493147392,
5330 : 904103488,
5331 : -450179904,
5332 : 106108432,
5333 : },
5334 : {
5335 : -1301608576,
5336 : 553017920,
5337 : 914294592,
5338 : -821041856,
5339 : 246665952,
5340 : -438433216,
5341 : 905449280,
5342 : -472780672,
5343 : 115973296,
5344 : },
5345 : {
5346 : -1287761024,
5347 : 568996608,
5348 : 878874816,
5349 : -835777472,
5350 : 261126064,
5351 : -383705856,
5352 : 904519040,
5353 : -495171488,
5354 : 126319176,
5355 : },
5356 : {
5357 : -1273521536,
5358 : 584801792,
5359 : 842847360,
5360 : -849494592,
5361 : 275834208,
5362 : -329104384,
5363 : 901322112,
5364 : -517278496,
5365 : 137140640,
5366 : },
5367 : {
5368 : -1258893952,
5369 : 600428672,
5370 : 806255552,
5371 : -862177024,
5372 : 290772768,
5373 : -274764416,
5374 : 895873408,
5375 : -539030016,
5376 : 148430976,
5377 : },
5378 : {
5379 : -1243882624,
5380 : 615873088,
5381 : 769143424,
5382 : -873808640,
5383 : 305923776,
5384 : -220820592,
5385 : 888192128,
5386 : -560354240,
5387 : 160182032,
5388 : },
5389 : {
5390 : -1228492672,
5391 : 631129536,
5392 : 731557056,
5393 : -884375872,
5394 : 321268192,
5395 : -167408576,
5396 : 878306816,
5397 : -581179712,
5398 : 172383520,
5399 : },
5400 : {
5401 : -1212728192,
5402 : 646193920,
5403 : 693541568,
5404 : -893865664,
5405 : 336788032,
5406 : -114659368,
5407 : 866249088,
5408 : -601437056,
5409 : 185024416,
5410 : },
5411 : {
5412 : -1196594560,
5413 : 661061376,
5414 : 655143872,
5415 : -902266304,
5416 : 352463776,
5417 : -62704428,
5418 : 852058240,
5419 : -621057088,
5420 : 198091488,
5421 : },
5422 : {
5423 : -1180096256,
5424 : 675727744,
5425 : 616410112,
5426 : -909567168,
5427 : 368276832,
5428 : -11670283,
5429 : 835778240,
5430 : -639973248,
5431 : 211570704,
5432 : },
5433 : {
5434 : -1163238528,
5435 : 690187904,
5436 : 577388480,
5437 : -915760192,
5438 : 384207328,
5439 : 38316972,
5440 : 817459904,
5441 : -658119040,
5442 : 225445952,
5443 : },
5444 : {
5445 : -1146026752,
5446 : 704437888,
5447 : 538126144,
5448 : -920838016,
5449 : 400236128,
5450 : 87136208,
5451 : 797158016,
5452 : -675430976,
5453 : 239700208,
5454 : },
5455 : {
5456 : -1128465792,
5457 : 718473536,
5458 : 498670016,
5459 : -924793792,
5460 : 416343968,
5461 : 134670400,
5462 : 774934400,
5463 : -691848064,
5464 : 254315376,
5465 : },
5466 : {
5467 : -1110560896,
5468 : 732290176,
5469 : 459069056,
5470 : -927622464,
5471 : 432511008,
5472 : 180804176,
5473 : 750854336,
5474 : -707309760,
5475 : 269271168,
5476 : },
5477 : {
5478 : -1092317568,
5479 : 745883904,
5480 : 419370880,
5481 : -929321088,
5482 : 448717696,
5483 : 225428032,
5484 : 724989312,
5485 : -721759040,
5486 : 284546880,
5487 : },
5488 : {
5489 : -1073741823,
5490 : 759250176,
5491 : 379625056,
5492 : -929887680,
5493 : 464943936,
5494 : 268435456,
5495 : 697415552,
5496 : -735140736,
5497 : 300119968,
5498 : },
5499 : {
5500 : -1054839104,
5501 : 772385152,
5502 : 339879232,
5503 : -929321088,
5504 : 481170176,
5505 : 309726208,
5506 : 668213824,
5507 : -747403200,
5508 : 315967200,
5509 : },
5510 : {
5511 : -1035614656,
5512 : 785285184,
5513 : 300180928,
5514 : -927622464,
5515 : 497376864,
5516 : 349204928,
5517 : 637467712,
5518 : -758496960,
5519 : 332064416,
5520 : },
5521 : {
5522 : -1016075072,
5523 : 797945664,
5524 : 260580400,
5525 : -924793792,
5526 : 513543616,
5527 : 386779488,
5528 : 605268032,
5529 : -768375104,
5530 : 348385536,
5531 : },
5532 : {
5533 : -996225600,
5534 : 810363264,
5535 : 221124000,
5536 : -920838016,
5537 : 529651744,
5538 : 422366560,
5539 : 571706432,
5540 : -776995008,
5541 : 364904864,
5542 : },
5543 : {
5544 : -976073088,
5545 : 822533888,
5546 : 181861520,
5547 : -915760768,
5548 : 545680512,
5549 : 455884896,
5550 : 536880512,
5551 : -784315776,
5552 : 381594208,
5553 : },
5554 : {
5555 : -955623040,
5556 : 834454272,
5557 : 142839376,
5558 : -909567168,
5559 : 561611328,
5560 : 487262400,
5561 : 500889568,
5562 : -790300992,
5563 : 398426144,
5564 : },
5565 : {
5566 : -934881920,
5567 : 846120128,
5568 : 104106176,
5569 : -902266304,
5570 : 577424064,
5571 : 516431136,
5572 : 463836896,
5573 : -794917120,
5574 : 415371168,
5575 : },
5576 : {
5577 : -913856384,
5578 : 857528256,
5579 : 65708784,
5580 : -893865664,
5581 : 593099520,
5582 : 543330048,
5583 : 425828896,
5584 : -798133760,
5585 : 432399904,
5586 : },
5587 : {
5588 : -892551936,
5589 : 868675520,
5590 : 27693010,
5591 : -884375872,
5592 : 608619648,
5593 : 567905408,
5594 : 386972736,
5595 : -799925440,
5596 : 449482624,
5597 : },
5598 : {
5599 : -870975872,
5600 : 879557760,
5601 : -9893141,
5602 : -873808640,
5603 : 623964096,
5604 : 590108032,
5605 : 347380800,
5606 : -800268608,
5607 : 466587840,
5608 : },
5609 : {
5610 : -849134336,
5611 : 890172352,
5612 : -47005296,
5613 : -862177024,
5614 : 639115008,
5615 : 609897856,
5616 : 307164128,
5617 : -799144896,
5618 : 483684960,
5619 : },
5620 : {
5621 : -827034624,
5622 : 900515712,
5623 : -83597168,
5624 : -849494592,
5625 : 654053696,
5626 : 627240256,
5627 : 266438224,
5628 : -796539136,
5629 : 500742080,
5630 : },
5631 : {
5632 : -804682624,
5633 : 910584576,
5634 : -119624760,
5635 : -835777472,
5636 : 668762048,
5637 : 642107520,
5638 : 225317632,
5639 : -792439552,
5640 : 517727488,
5641 : },
5642 : {
5643 : -782085312,
5644 : 920376512,
5645 : -155044640,
5646 : -821041856,
5647 : 683222080,
5648 : 654480128,
5649 : 183918624,
5650 : -786839296,
5651 : 534609632,
5652 : },
5653 : {
5654 : -759250304,
5655 : 929887616,
5656 : -189812384,
5657 : -805306304,
5658 : 697415936,
5659 : 664343872,
5660 : 142359552,
5661 : -779734528,
5662 : 551355584,
5663 : },
5664 : {
5665 : -736183296,
5666 : 939115776,
5667 : -223886912,
5668 : -788589376,
5669 : 711326720,
5670 : 671693120,
5671 : 100756408,
5672 : -771125696,
5673 : 567933632,
5674 : },
5675 : {
5676 : -712892608,
5677 : 948057792,
5678 : -257225888,
5679 : -770911616,
5680 : 724937152,
5681 : 676528896,
5682 : 59227880,
5683 : -761017408,
5684 : 584311680,
5685 : },
5686 : {
5687 : -689384832,
5688 : 956710976,
5689 : -289788768,
5690 : -752295232,
5691 : 738231168,
5692 : 678858752,
5693 : 17890716,
5694 : -749417856,
5695 : 600457728,
5696 : },
5697 : {
5698 : -665666624,
5699 : 965072704,
5700 : -321536480,
5701 : -732761408,
5702 : 751191936,
5703 : 678698240,
5704 : -23139272,
5705 : -736339008,
5706 : 616340032,
5707 : },
5708 : {
5709 : -641745984,
5710 : 973140608,
5711 : -352429632,
5712 : -712335552,
5713 : 763803968,
5714 : 676069440,
5715 : -63745280,
5716 : -721797248,
5717 : 631926912,
5718 : },
5719 : {
5720 : -617629760,
5721 : 980911936,
5722 : -382431072,
5723 : -691041088,
5724 : 776052160,
5725 : 671001088,
5726 : -103813880,
5727 : -705812224,
5728 : 647187904,
5729 : },
5730 : {
5731 : -593325248,
5732 : 988384512,
5733 : -411504000,
5734 : -668905408,
5735 : 787920960,
5736 : 663529280,
5737 : -143232048,
5738 : -688407552,
5739 : 662091712,
5740 : },
5741 : {
5742 : -568840192,
5743 : 995556160,
5744 : -439613248,
5745 : -645954560,
5746 : 799396736,
5747 : 653696896,
5748 : -181889024,
5749 : -669611072,
5750 : 676608512,
5751 : },
5752 : {
5753 : -544181696,
5754 : 1002424320,
5755 : -466724288,
5756 : -622216320,
5757 : 810464576,
5758 : 641552832,
5759 : -219676144,
5760 : -649453696,
5761 : 690709312,
5762 : },
5763 : {
5764 : -519357600,
5765 : 1008987328,
5766 : -492803904,
5767 : -597720256,
5768 : 821111744,
5769 : 627153216,
5770 : -256487184,
5771 : -627969792,
5772 : 704364160,
5773 : },
5774 : {
5775 : -494375232,
5776 : 1015242880,
5777 : -517820864,
5778 : -572495872,
5779 : 831324672,
5780 : 610560128,
5781 : -292219008,
5782 : -605198016,
5783 : 717546496,
5784 : },
5785 : {
5786 : -469242400,
5787 : 1021189056,
5788 : -541744064,
5789 : -546574272,
5790 : 841091328,
5791 : 591841984,
5792 : -326770816,
5793 : -581179840,
5794 : 730228608,
5795 : },
5796 : {
5797 : -443966464,
5798 : 1026824384,
5799 : -564545152,
5800 : -519986624,
5801 : 850399808,
5802 : 571072896,
5803 : -360046304,
5804 : -555960000,
5805 : 742384384,
5806 : },
5807 : {
5808 : -418555424,
5809 : 1032146880,
5810 : -586195904,
5811 : -492765472,
5812 : 859238720,
5813 : 548332736,
5814 : -391952064,
5815 : -529586400,
5816 : 753988416,
5817 : },
5818 : {
5819 : -393016736,
5820 : 1037154944,
5821 : -606669696,
5822 : -464943776,
5823 : 867597120,
5824 : 523707360,
5825 : -422398496,
5826 : -502110496,
5827 : 765017472,
5828 : },
5829 : {
5830 : -367358464,
5831 : 1041847104,
5832 : -625942016,
5833 : -436555712,
5834 : 875464896,
5835 : 497287264,
5836 : -451300416,
5837 : -473585952,
5838 : 775447168,
5839 : },
5840 : {
5841 : -341588128,
5842 : 1046221952,
5843 : -643989248,
5844 : -407635840,
5845 : 882832768,
5846 : 469168768,
5847 : -478576512,
5848 : -444069824,
5849 : 785256768,
5850 : },
5851 : {
5852 : -315714112,
5853 : 1050278016,
5854 : -660789184,
5855 : -378219488,
5856 : 889691264,
5857 : 439452448,
5858 : -504150464,
5859 : -413621792,
5860 : 794425024,
5861 : },
5862 : {
5863 : -289743520,
5864 : 1054014208,
5865 : -676321600,
5866 : -348342080,
5867 : 896032512,
5868 : 408242848,
5869 : -527951296,
5870 : -382302944,
5871 : 802933568,
5872 : },
5873 : {
5874 : -263684816,
5875 : 1057429248,
5876 : -690567552,
5877 : -318040352,
5878 : 901848320,
5879 : 375649632,
5880 : -549911936,
5881 : -350177888,
5882 : 810763520,
5883 : },
5884 : {
5885 : -237545680,
5886 : 1060522240,
5887 : -703509440,
5888 : -287351040,
5889 : 907131648,
5890 : 341785696,
5891 : -569970496,
5892 : -317312864,
5893 : 817899072,
5894 : },
5895 : {
5896 : -211334384,
5897 : 1063292288,
5898 : -715132096,
5899 : -256311760,
5900 : 911876928,
5901 : 306768160,
5902 : -588071424,
5903 : -283776384,
5904 : 824324416,
5905 : },
5906 : {
5907 : -185058560,
5908 : 1065738240,
5909 : -725420672,
5910 : -224960096,
5911 : 916077184,
5912 : 270716544,
5913 : -604163840,
5914 : -249638288,
5915 : 830026560,
5916 : },
5917 : {
5918 : -158726560,
5919 : 1067859776,
5920 : -734362944,
5921 : -193334624,
5922 : 919727616,
5923 : 233754128,
5924 : -618202944,
5925 : -214970528,
5926 : 834993024,
5927 : },
5928 : {
5929 : -132346048,
5930 : 1069655936,
5931 : -741948032,
5932 : -161473376,
5933 : 922824448,
5934 : 196005872,
5935 : -630149440,
5936 : -179845728,
5937 : 839213568,
5938 : },
5939 : {
5940 : -105925224,
5941 : 1071126272,
5942 : -748166720,
5943 : -129415376,
5944 : 925363072,
5945 : 157599216,
5946 : -639969344,
5947 : -144338352,
5948 : 842679232,
5949 : },
5950 : {
5951 : -79472136,
5952 : 1072270272,
5953 : -753011392,
5954 : -97199672,
5955 : 927340864,
5956 : 118664000,
5957 : -647635776,
5958 : -108523640,
5959 : 845382016,
5960 : },
5961 : {
5962 : -52994836,
5963 : 1073087808,
5964 : -756475840,
5965 : -64865616,
5966 : 928755264,
5967 : 79330888,
5968 : -653127424,
5969 : -72477792,
5970 : 847316864,
5971 : },
5972 : {
5973 : -26501398,
5974 : 1073578432,
5975 : -758556288,
5976 : -32452510,
5977 : 929604544,
5978 : 39731924,
5979 : -656428672,
5980 : -36277476,
5981 : 848479808,
5982 : },
5983 : {
5984 : -66,
5985 : 1073741823,
5986 : -759250112,
5987 : -81,
5988 : 929887872,
5989 : 99,
5990 : -657529856,
5991 : -90,
5992 : 848867456,
5993 : }
5994 : };
5995 :
5996 : Word32 local_result_table_2[91][9] /*q30*/ = {
5997 : {
5998 : -1073741823,
5999 : 0,
6000 : 1073741823,
6001 : 0,
6002 : 0,
6003 : -1073741823,
6004 : 0,
6005 : 0,
6006 : 0,
6007 : },
6008 : {
6009 : -1073578304,
6010 : 13250594,
6011 : 1073251200,
6012 : -22947212,
6013 : 200270,
6014 : -1072760832,
6015 : 32444832,
6016 : -447749,
6017 : 3190,
6018 : },
6019 : {
6020 : -1073087808,
6021 : 26497302,
6022 : 1071780288,
6023 : -45866700,
6024 : 800846,
6025 : -1069820288,
6026 : 64806036,
6027 : -1789655,
6028 : 25513,
6029 : },
6030 : {
6031 : -1072270272,
6032 : 39736224,
6033 : 1069330112,
6034 : -68730816,
6035 : 1801021,
6036 : -1064927488,
6037 : 97000176,
6038 : -4021686,
6039 : 86045,
6040 : },
6041 : {
6042 : -1071126272,
6043 : 52962176,
6044 : 1065904768,
6045 : -91509712,
6046 : 3199466,
6047 : -1058096320,
6048 : 128941216,
6049 : -7136793,
6050 : 203735,
6051 : },
6052 : {
6053 : -1069655936,
6054 : 66172804,
6055 : 1061507520,
6056 : -114178536,
6057 : 4994649,
6058 : -1049342784,
6059 : 160550480,
6060 : -11125865,
6061 : 397382,
6062 : },
6063 : {
6064 : -1067859840,
6065 : 79363208,
6066 : 1056143808,
6067 : -136708048,
6068 : 7184296,
6069 : -1038690624,
6070 : 191744288,
6071 : -15976569,
6072 : 685532,
6073 : },
6074 : {
6075 : -1065738240,
6076 : 92529440,
6077 : 1049820800,
6078 : -159071040,
6079 : 9765746,
6080 : -1026166912,
6081 : 222441968,
6082 : -21674096,
6083 : 1086449,
6084 : },
6085 : {
6086 : -1063292288,
6087 : 105667272,
6088 : 1042545408,
6089 : -181239968,
6090 : 12735822,
6091 : -1011804416,
6092 : 252564208,
6093 : -28201010,
6094 : 1618050,
6095 : },
6096 : {
6097 : -1060522368,
6098 : 118772768,
6099 : 1034327424,
6100 : -203187744,
6101 : 16090877,
6102 : -995640448,
6103 : 282033216,
6104 : -35537312,
6105 : 2297847,
6106 : },
6107 : {
6108 : -1057429248,
6109 : 131842576,
6110 : 1025175744,
6111 : -224888688,
6112 : 19827000,
6113 : -977715456,
6114 : 310774336,
6115 : -43660960,
6116 : 3142946,
6117 : },
6118 : {
6119 : -1054014208,
6120 : 144871840,
6121 : 1015102400,
6122 : -246315216,
6123 : 23939442,
6124 : -958077632,
6125 : 338712160,
6126 : -52546696,
6127 : 4169866,
6128 : },
6129 : {
6130 : -1050277888,
6131 : 157856848,
6132 : 1004119424,
6133 : -267441264,
6134 : 28423184,
6135 : -936776384,
6136 : 365775328,
6137 : -62167296,
6138 : 5394616,
6139 : },
6140 : {
6141 : -1046221952,
6142 : 170794080,
6143 : 992240192,
6144 : -288242144,
6145 : 33272972,
6146 : -913867136,
6147 : 391895552,
6148 : -72493728,
6149 : 6832647,
6150 : },
6151 : {
6152 : -1041847104,
6153 : 183679248,
6154 : 979478784,
6155 : -308691648,
6156 : 38482756,
6157 : -889408832,
6158 : 417005280,
6159 : -83493976,
6160 : 8498661,
6161 : },
6162 : {
6163 : -1037154944,
6164 : 196508448,
6165 : 965851264,
6166 : -328765024,
6167 : 44046188,
6168 : -863464384,
6169 : 441040416,
6170 : -95134256,
6171 : 10406720,
6172 : },
6173 : {
6174 : -1032146752,
6175 : 209277728,
6176 : 951373888,
6177 : -348437760,
6178 : 49956480,
6179 : -836100864,
6180 : 463939520,
6181 : -107378776,
6182 : 12570113,
6183 : },
6184 : {
6185 : -1026824448,
6186 : 221983184,
6187 : 936064704,
6188 : -367685952,
6189 : 56206436,
6190 : -807388864,
6191 : 485645568,
6192 : -120189736,
6193 : 15001357,
6194 : },
6195 : {
6196 : -1021189120,
6197 : 234621280,
6198 : 919941824,
6199 : -386486528,
6200 : 62788576,
6201 : -777401728,
6202 : 506103424,
6203 : -133527832,
6204 : 17712200,
6205 : },
6206 : {
6207 : -1015242880,
6208 : 247187648,
6209 : 903025664,
6210 : -404815744,
6211 : 69694608,
6212 : -746217472,
6213 : 525260928,
6214 : -147351424,
6215 : 20713352,
6216 : },
6217 : {
6218 : -1008987264,
6219 : 259678912,
6220 : 885335808,
6221 : -422652128,
6222 : 76916424,
6223 : -713914432,
6224 : 543071424,
6225 : -161618048,
6226 : 24014862,
6227 : },
6228 : {
6229 : -1002424320,
6230 : 272090816,
6231 : 866894784,
6232 : -439973408,
6233 : 84444936,
6234 : -680577216,
6235 : 559490112,
6236 : -176282928,
6237 : 27625616,
6238 : },
6239 : {
6240 : -995556224,
6241 : 284419968,
6242 : 847724672,
6243 : -456758400,
6244 : 92271176,
6245 : -646290240,
6246 : 574476800,
6247 : -191300784,
6248 : 31553712,
6249 : },
6250 : {
6251 : -988384640,
6252 : 296662656,
6253 : 827848384,
6254 : -472987584,
6255 : 100385640,
6256 : -611140864,
6257 : 587994880,
6258 : -206624832,
6259 : 35806248,
6260 : },
6261 : {
6262 : -980912128,
6263 : 308814848,
6264 : 807290624,
6265 : -488639872,
6266 : 108778240,
6267 : -575220032,
6268 : 600012160,
6269 : -222206672,
6270 : 40389148,
6271 : },
6272 : {
6273 : -973140672,
6274 : 320873088,
6275 : 786076288,
6276 : -503697312,
6277 : 117438992,
6278 : -538618240,
6279 : 610500032,
6280 : -237997792,
6281 : 45307472,
6282 : },
6283 : {
6284 : -965072832,
6285 : 332833408,
6286 : 764231552,
6287 : -518140608,
6288 : 126357048,
6289 : -501429376,
6290 : 619433792,
6291 : -253947792,
6292 : 50565096,
6293 : },
6294 : {
6295 : -956710976,
6296 : 344692448,
6297 : 741782400,
6298 : -531953120,
6299 : 135521872,
6300 : -463747712,
6301 : 626794432,
6302 : -270007104,
6303 : 56164972,
6304 : },
6305 : {
6306 : -948057792,
6307 : 356446400,
6308 : 718756992,
6309 : -545116864,
6310 : 144921984,
6311 : -425669280,
6312 : 632565632,
6313 : -286123936,
6314 : 62108788,
6315 : },
6316 : {
6317 : -939115840,
6318 : 368091680,
6319 : 695183104,
6320 : -557616896,
6321 : 154546016,
6322 : -387290848,
6323 : 636735552,
6324 : -302247040,
6325 : 68397184,
6326 : },
6327 : {
6328 : -929887616,
6329 : 379625088,
6330 : 671088768,
6331 : -569437568,
6332 : 164382512,
6333 : -348707872,
6334 : 639297728,
6335 : -318325280,
6336 : 75029992,
6337 : },
6338 : {
6339 : -920376256,
6340 : 391042752,
6341 : 646503936,
6342 : -580564288,
6343 : 174419184,
6344 : -310019104,
6345 : 640249344,
6346 : -334306432,
6347 : 82005504,
6348 : },
6349 : {
6350 : -910584576,
6351 : 402341376,
6352 : 621458368,
6353 : -590983936,
6354 : 184644016,
6355 : -271321024,
6356 : 639591552,
6357 : -350139136,
6358 : 89321144,
6359 : },
6360 : {
6361 : -900515712,
6362 : 413517344,
6363 : 595983104,
6364 : -600683392,
6365 : 195044256,
6366 : -232711952,
6367 : 637331008,
6368 : -365771136,
6369 : 96973080,
6370 : },
6371 : {
6372 : -890172480,
6373 : 424567200,
6374 : 570108800,
6375 : -609651264,
6376 : 205607392,
6377 : -194287792,
6378 : 633478144,
6379 : -381151776,
6380 : 104956552,
6381 : },
6382 : {
6383 : -879557888,
6384 : 435488064,
6385 : 543866560,
6386 : -617876032,
6387 : 216320784,
6388 : -156143744,
6389 : 628046656,
6390 : -396230272,
6391 : 113265800,
6392 : },
6393 : {
6394 : -868675520,
6395 : 446276000,
6396 : 517288960,
6397 : -625348224,
6398 : 227170944,
6399 : -118375744,
6400 : 621056704,
6401 : -410956128,
6402 : 121893560,
6403 : },
6404 : {
6405 : -857528320,
6406 : 456928128,
6407 : 490407968,
6408 : -632058496,
6409 : 238145120,
6410 : -81076416,
6411 : 612530560,
6412 : -425280224,
6413 : 130832024,
6414 : },
6415 : {
6416 : -846120128,
6417 : 467441024,
6418 : 463256672,
6419 : -637998656,
6420 : 249229552,
6421 : -44338728,
6422 : 602496192,
6423 : -439153664,
6424 : 140071840,
6425 : },
6426 : {
6427 : -834454080,
6428 : 477811712,
6429 : 435867776,
6430 : -643161152,
6431 : 260411056,
6432 : -8252136,
6433 : 590984448,
6434 : -452529440,
6435 : 149603072,
6436 : },
6437 : {
6438 : -822533888,
6439 : 488036576,
6440 : 408275296,
6441 : -647540288,
6442 : 271675616,
6443 : 27094190,
6444 : 578031424,
6445 : -465360448,
6446 : 159414368,
6447 : },
6448 : {
6449 : -810363264,
6450 : 498112832,
6451 : 380512640,
6452 : -651130816,
6453 : 283009696,
6454 : 61614604,
6455 : 563675840,
6456 : -477601824,
6457 : 169493648,
6458 : },
6459 : {
6460 : -797945792,
6461 : 508037536,
6462 : 352612960,
6463 : -653928000,
6464 : 294399648,
6465 : 95226360,
6466 : 547961344,
6467 : -489210464,
6468 : 179828128,
6469 : },
6470 : {
6471 : -785285184,
6472 : 517807392,
6473 : 324610848,
6474 : -655928192,
6475 : 305831488,
6476 : 127847864,
6477 : 530934208,
6478 : -500143520,
6479 : 190403472,
6480 : },
6481 : {
6482 : -772385152,
6483 : 527419616,
6484 : 296540000,
6485 : -657129280,
6486 : 317291360,
6487 : 159401696,
6488 : 512644864,
6489 : -510360704,
6490 : 201205024,
6491 : },
6492 : {
6493 : -759250176,
6494 : 536870976,
6495 : 268435456,
6496 : -657529920,
6497 : 328765024,
6498 : 189812544,
6499 : 493147264,
6500 : -519823008,
6501 : 212216864,
6502 : },
6503 : {
6504 : -745883904,
6505 : 546158784,
6506 : 240330912,
6507 : -657129280,
6508 : 340238720,
6509 : 219009504,
6510 : 472498528,
6511 : -528493856,
6512 : 223422560,
6513 : },
6514 : {
6515 : -732290176,
6516 : 555280512,
6517 : 212259968,
6518 : -655928192,
6519 : 351698592,
6520 : 246925184,
6521 : 450757760,
6522 : -536338336,
6523 : 234805008,
6524 : },
6525 : {
6526 : -718473600,
6527 : 564232832,
6528 : 184258176,
6529 : -653928000,
6530 : 363130208,
6531 : 273494400,
6532 : 427989120,
6533 : -543323264,
6534 : 246345792,
6535 : },
6536 : {
6537 : -704437888,
6538 : 573013376,
6539 : 156358288,
6540 : -651130816,
6541 : 374520352,
6542 : 298658272,
6543 : 404257472,
6544 : -549418432,
6545 : 258026704,
6546 : },
6547 : {
6548 : -690187904,
6549 : 581619328,
6550 : 128595512,
6551 : -647540736,
6552 : 385854432,
6553 : 322359296,
6554 : 379631872,
6555 : -554595008,
6556 : 269827872,
6557 : },
6558 : {
6559 : -675727552,
6560 : 590048320,
6561 : 101002688,
6562 : -643161152,
6563 : 397119232,
6564 : 344546560,
6565 : 354182432,
6566 : -558827200,
6567 : 281729824,
6568 : },
6569 : {
6570 : -661061376,
6571 : 598297344,
6572 : 73614184,
6573 : -637998656,
6574 : 408300512,
6575 : 365171968,
6576 : 327982208,
6577 : -562091264,
6578 : 293711776,
6579 : },
6580 : {
6581 : -646194048,
6582 : 606364096,
6583 : 46463128,
6584 : -632058496,
6585 : 419384736,
6586 : 384192352,
6587 : 301106496,
6588 : -564365760,
6589 : 305752896,
6590 : },
6591 : {
6592 : -631129536,
6593 : 614246400,
6594 : 19581916,
6595 : -625348224,
6596 : 430359136,
6597 : 401569792,
6598 : 273631040,
6599 : -565632704,
6600 : 317832192,
6601 : },
6602 : {
6603 : -615872960,
6604 : 621941312,
6605 : -6995507,
6606 : -617876032,
6607 : 441209248,
6608 : 417269376,
6609 : 245635312,
6610 : -565875392,
6611 : 329927424,
6612 : },
6613 : {
6614 : -600428672,
6615 : 629446976,
6616 : -33237764,
6617 : -609651264,
6618 : 451922592,
6619 : 431262912,
6620 : 217197840,
6621 : -565080768,
6622 : 342016896,
6623 : },
6624 : {
6625 : -584801792,
6626 : 636760832,
6627 : -59112128,
6628 : -600683392,
6629 : 462485824,
6630 : 443525824,
6631 : 188400272,
6632 : -563238208,
6633 : 354078112,
6634 : },
6635 : {
6636 : -568996544,
6637 : 643880576,
6638 : -84587480,
6639 : -590983936,
6640 : 472886208,
6641 : 454038592,
6642 : 159323616,
6643 : -560339392,
6644 : 366088608,
6645 : },
6646 : {
6647 : -553017856,
6648 : 650804544,
6649 : -109633120,
6650 : -580564288,
6651 : 483110976,
6652 : 462787328,
6653 : 130050112,
6654 : -556379392,
6655 : 378026112,
6656 : },
6657 : {
6658 : -536871040,
6659 : 657529856,
6660 : -134217624,
6661 : -569437568,
6662 : 493147552,
6663 : 469762048,
6664 : 100663400,
6665 : -551355584,
6666 : 389867264,
6667 : },
6668 : {
6669 : -520560224,
6670 : 664055168,
6671 : -158311952,
6672 : -557616896,
6673 : 502983968,
6674 : 474958752,
6675 : 71245536,
6676 : -545268160,
6677 : 401589760,
6678 : },
6679 : {
6680 : -504091200,
6681 : 670378112,
6682 : -181886176,
6683 : -545116864,
6684 : 512608032,
6685 : 478378176,
6686 : 41880432,
6687 : -538120576,
6688 : 413170752,
6689 : },
6690 : {
6691 : -487468704,
6692 : 676496896,
6693 : -204911600,
6694 : -531953120,
6695 : 522008320,
6696 : 480025632,
6697 : 12650646,
6698 : -529918464,
6699 : 424587712,
6700 : },
6701 : {
6702 : -470697376,
6703 : 682409472,
6704 : -227360640,
6705 : -518140608,
6706 : 531172928,
6707 : 479912128,
6708 : -16361936,
6709 : -520670304,
6710 : 435818208,
6711 : },
6712 : {
6713 : -453782944,
6714 : 688114368,
6715 : -249205392,
6716 : -503697312,
6717 : 540091008,
6718 : 478053280,
6719 : -45074720,
6720 : -510387712,
6721 : 446839808,
6722 : },
6723 : {
6724 : -436730208,
6725 : 693609536,
6726 : -270419616,
6727 : -488639872,
6728 : 548751808,
6729 : 474469440,
6730 : -73407496,
6731 : -499084608,
6732 : 457630944,
6733 : },
6734 : {
6735 : -419544320,
6736 : 698893440,
6737 : -290977280,
6738 : -472987584,
6739 : 557144256,
6740 : 469186080,
6741 : -101280352,
6742 : -486777664,
6743 : 468169568,
6744 : },
6745 : {
6746 : -402230784,
6747 : 703964544,
6748 : -310853504,
6749 : -456758880,
6750 : 565258880,
6751 : 462233504,
6752 : -128614952,
6753 : -473486528,
6754 : 478434464,
6755 : },
6756 : {
6757 : -384794592,
6758 : 708821056,
6759 : -330023904,
6760 : -439973408,
6761 : 573084992,
6762 : 453646368,
6763 : -155334496,
6764 : -459233120,
6765 : 488405216,
6766 : },
6767 : {
6768 : -367241280,
6769 : 713461824,
6770 : -348464992,
6771 : -422652096,
6772 : 580613696,
6773 : 443464288,
6774 : -181363824,
6775 : -444041664,
6776 : 498060704,
6777 : },
6778 : {
6779 : -349576096,
6780 : 717885184,
6781 : -366154656,
6782 : -404815744,
6783 : 587835392,
6784 : 431731200,
6785 : -206630032,
6786 : -427939616,
6787 : 507382016,
6788 : },
6789 : {
6790 : -331804480,
6791 : 722089728,
6792 : -383070912,
6793 : -386486400,
6794 : 594741440,
6795 : 418495488,
6796 : -231061856,
6797 : -410956224,
6798 : 516349600,
6799 : },
6800 : {
6801 : -313931712,
6802 : 726074560,
6803 : -399193696,
6804 : -367686080,
6805 : 601323520,
6806 : 403809504,
6807 : -254591184,
6808 : -393123104,
6809 : 524945024,
6810 : },
6811 : {
6812 : -295963392,
6813 : 729838080,
6814 : -414503104,
6815 : -348437824,
6816 : 607573568,
6817 : 387729792,
6818 : -277151968,
6819 : -374474112,
6820 : 533150336,
6821 : },
6822 : {
6823 : -277904800,
6824 : 733379328,
6825 : -428980256,
6826 : -328764896,
6827 : 613483840,
6828 : 370317024,
6829 : -298680832,
6830 : -355045728,
6831 : 540949056,
6832 : },
6833 : {
6834 : -259761664,
6835 : 736697216,
6836 : -442607872,
6837 : -308691520,
6838 : 619047232,
6839 : 351635200,
6840 : -319117568,
6841 : -334875840,
6842 : 548323968,
6843 : },
6844 : {
6845 : -241539296,
6846 : 739790656,
6847 : -455369184,
6848 : -288242080,
6849 : 624257088,
6850 : 331752416,
6851 : -338404704,
6852 : -314004800,
6853 : 555260352,
6854 : },
6855 : {
6856 : -223243600,
6857 : 742658752,
6858 : -467248512,
6859 : -267441568,
6860 : 629106752,
6861 : 310739808,
6862 : -356488192,
6863 : -292474784,
6864 : 561743360,
6865 : },
6866 : {
6867 : -204879600,
6868 : 745300672,
6869 : -478231616,
6870 : -246315056,
6871 : 633590720,
6872 : 288671296,
6873 : -373317920,
6874 : -270328992,
6875 : 567759744,
6876 : },
6877 : {
6878 : -186453328,
6879 : 747715456,
6880 : -488305024,
6881 : -224888512,
6882 : 637703104,
6883 : 265624400,
6884 : -388846464,
6885 : -247613152,
6886 : 573296384,
6887 : },
6888 : {
6889 : -167970160,
6890 : 749902528,
6891 : -497456320,
6892 : -203187888,
6893 : 641438976,
6894 : 241678992,
6895 : -403030016,
6896 : -224374080,
6897 : 578342016,
6898 : },
6899 : {
6900 : -149435984,
6901 : 751861248,
6902 : -505674752,
6903 : -181239792,
6904 : 644794368,
6905 : 216917856,
6906 : -415829312,
6907 : -200660208,
6908 : 582885376,
6909 : },
6910 : {
6911 : -130856168,
6912 : 753590784,
6913 : -512949888,
6914 : -159070816,
6915 : 647764480,
6916 : 191425504,
6917 : -427208320,
6918 : -176520928,
6919 : 586917440,
6920 : },
6921 : {
6922 : -112236624,
6923 : 755090944,
6924 : -519273024,
6925 : -136708240,
6926 : 650345664,
6927 : 165289136,
6928 : -437135488,
6929 : -152007120,
6930 : 590429248,
6931 : },
6932 : {
6933 : -93582792,
6934 : 756361024,
6935 : -524636480,
6936 : -114178928,
6937 : 652535424,
6938 : 138597088,
6939 : -445582912,
6940 : -127170136,
6941 : 593413568,
6942 : },
6943 : {
6944 : -74900448,
6945 : 757400704,
6946 : -529033792,
6947 : -91510496,
6948 : 654330560,
6949 : 111439480,
6950 : -452526688,
6951 : -102062624,
6952 : 595864192,
6953 : },
6954 : {
6955 : -56195288,
6956 : 758209600,
6957 : -532459456,
6958 : -68730552,
6959 : 655729088,
6960 : 83908120,
6961 : -457947648,
6962 : -76737800,
6963 : 597775360,
6964 : },
6965 : {
6966 : -37473008,
6967 : 758787712,
6968 : -534909184,
6969 : -45866920,
6970 : 656729216,
6971 : 56095408,
6972 : -461830816,
6973 : -51249536,
6974 : 599143488,
6975 : },
6976 : {
6977 : -18739318,
6978 : 759134656,
6979 : -536380320,
6980 : -22947390,
6981 : 657329728,
6982 : 28094712,
6983 : -464165184,
6984 : -25652050,
6985 : 599965824,
6986 : },
6987 : {
6988 : -46,
6989 : 759250176,
6990 : -536870912,
6991 : -57,
6992 : 657530048,
6993 : 70,
6994 : -464943808,
6995 : -64,
6996 : 600239936,
6997 : }
6998 : };
6999 14551491 : void ivas_dirac_dec_get_response_fx(
7000 : const Word16 azimuth,
7001 : const Word16 elevation,
7002 : Word32 *response_fx, /*Q_out*/
7003 : const Word16 ambisonics_order,
7004 : Word16 Q_out )
7005 : {
7006 : Word16 index_azimuth, index_elevation;
7007 : Word16 el, e, az, q_diff;
7008 : Word32 cos_1_fx, cos_2_fx, sin_1_fx, cos_az_fx[3];
7009 : Word32 sin_az_fx[3];
7010 : Word32 f_fx;
7011 : Word32 c_fx_better;
7012 : Word16 l, m;
7013 : Word16 b, b1, b_2, b1_2, a;
7014 :
7015 14551491 : index_azimuth = add( azimuth, 180 ) % 360;
7016 14551491 : move16();
7017 14551491 : index_elevation = add( elevation, 90 );
7018 :
7019 14551491 : e = 1;
7020 14551491 : move16();
7021 :
7022 14551491 : if ( GT_16( index_elevation, 90 ) )
7023 : {
7024 4620019 : e = -1;
7025 : }
7026 :
7027 14551491 : el = index_elevation;
7028 14551491 : move16();
7029 :
7030 14551491 : if ( GT_16( index_elevation, 90 ) )
7031 : {
7032 4620019 : el = sub( 180, index_elevation );
7033 : }
7034 :
7035 14551491 : az = index_azimuth;
7036 14551491 : move16();
7037 :
7038 14551491 : if ( GT_16( index_azimuth, 180 ) )
7039 : {
7040 4971281 : az = sub( 360, index_azimuth );
7041 : }
7042 :
7043 14551491 : f_fx = 1;
7044 14551491 : move16();
7045 :
7046 14551491 : if ( GT_16( index_azimuth, 180 ) )
7047 : {
7048 4971281 : f_fx = -1;
7049 : }
7050 :
7051 14551491 : cos_1_fx = L_shr( dirac_gains_trg_term_fx[az][0], 1 ); // q30
7052 14551491 : cos_2_fx = L_shl( Mpy_32_32( cos_1_fx, cos_1_fx ), 1 ); // q30
7053 14551491 : sin_1_fx = L_shr( dirac_gains_trg_term_fx[az][1], 1 ); // q30
7054 :
7055 14551491 : if ( EQ_32( f_fx, -1 ) )
7056 : {
7057 4971281 : sin_1_fx = L_negate( sin_1_fx ); // q30
7058 : }
7059 14551491 : cos_az_fx[0] = cos_1_fx; // q30
7060 14551491 : move32();
7061 14551491 : cos_az_fx[1] = L_shl( L_sub( cos_2_fx, ONE_IN_Q29 /*0.5 q30*/ ), 1 ); /*q30*/
7062 14551491 : move32();
7063 14551491 : cos_az_fx[2] = L_sub( L_shl( Mpy_32_32( cos_1_fx, cos_az_fx[1] ), 2 ), cos_az_fx[0] /* cos_az_fx[0] q30*/ ); /*q30*/
7064 14551491 : move32();
7065 14551491 : sin_az_fx[0] = sin_1_fx; /*q30*/
7066 14551491 : move32();
7067 14551491 : sin_az_fx[1] = L_shl( Mpy_32_32( sin_1_fx, cos_1_fx ), 2 ); /*q30*/
7068 14551491 : move32();
7069 14551491 : sin_az_fx[2] = L_shl( Mpy_32_32( sin_1_fx, L_sub( cos_2_fx, ONE_IN_Q28 /*1/4 q30*/ ) ), 3 ); /*q30*/
7070 14551491 : move32();
7071 :
7072 14551491 : response_fx[0] = L_shl_sat( 1, Q_out ); // Q_out
7073 14551491 : move32();
7074 :
7075 14551491 : q_diff = sub( Q_out, 29 );
7076 :
7077 44724286 : FOR( l = 1; l <= ambisonics_order; l++ )
7078 : {
7079 30172795 : b_2 = imult1616( l, l );
7080 30172795 : b1_2 = add( b_2, shl( l, 1 ) );
7081 68016758 : FOR( m = 0; m < l; m += 2 )
7082 : {
7083 37843963 : b = b_2 + m;
7084 37843963 : a = dirac_gains_P_idx[b];
7085 :
7086 37843963 : c_fx_better = local_result_table[el][a]; // q30
7087 37843963 : move32();
7088 37843963 : response_fx[b] = L_shl( Mpy_32_32( c_fx_better, sin_az_fx[l - m - 1] ), q_diff ); // Q_out
7089 37843963 : move32();
7090 :
7091 37843963 : b1 = b1_2 - m;
7092 37843963 : response_fx[b1] = L_shl( Mpy_32_32( c_fx_better, cos_az_fx[l - m - 1] ), q_diff ); // Q_out
7093 37843963 : move32();
7094 : }
7095 :
7096 45794099 : FOR( m = 1; m < l; m += 2 )
7097 : {
7098 15621304 : b = b_2 + m;
7099 15621304 : a = dirac_gains_P_idx[b];
7100 15621304 : c_fx_better = local_result_table[el][a]; // q30
7101 15621304 : move32();
7102 15621304 : if ( EQ_16( e, -1 ) )
7103 : {
7104 5689986 : c_fx_better = L_negate( c_fx_better ); // q30
7105 : }
7106 15621304 : response_fx[b] = L_shl( Mpy_32_32( c_fx_better, sin_az_fx[l - m - 1] ), q_diff ); // Q_out
7107 15621304 : move32();
7108 :
7109 15621304 : b1 = b1_2 - m;
7110 15621304 : response_fx[b1] = L_shl( Mpy_32_32( c_fx_better, cos_az_fx[l - m - 1] ), q_diff ); // Q_out
7111 15621304 : move32();
7112 : }
7113 :
7114 30172795 : b = add( b_2, l );
7115 30172795 : a = dirac_gains_P_idx[b];
7116 30172795 : c_fx_better = local_result_table_2[el][a]; // q30
7117 30172795 : move32();
7118 30172795 : IF( EQ_16( s_and( l, 0x01 ), 1 ) )
7119 : {
7120 22222659 : if ( EQ_16( e, -1 ) )
7121 : {
7122 7410948 : c_fx_better = L_negate( c_fx_better ); // q30
7123 : }
7124 : }
7125 30172795 : response_fx[b] = L_shl( c_fx_better, sub( Q_out, 30 ) ); // Q_out
7126 30172795 : move32();
7127 : }
7128 :
7129 14551491 : return;
7130 : }
7131 :
7132 : #ifdef FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx
7133 : /*This is a derivate to ivas_dirac_dec_get_response_fx with fixed Q_out=29*/
7134 62931969 : void ivas_dirac_dec_get_response_fx_29(
7135 : const Word16 azimuth,
7136 : const Word16 elevation,
7137 : Word32 *response_fx, /*Q_out*/
7138 : const Word16 ambisonics_order )
7139 : {
7140 : Word16 index_azimuth, index_elevation;
7141 : Word16 el, az;
7142 : Word32 cos_1_fx, cos_2_fx, sin_1_fx, cos_az_fx[3];
7143 : Word32 sin_az_fx[3];
7144 : Word32 f_fx;
7145 : Word32 c_fx_better;
7146 : Word16 l, m;
7147 : Word16 b, b1, b_2, b1_2;
7148 : // Word16 Q_out = 29;
7149 :
7150 62931969 : index_azimuth = add( azimuth, 180 ) % 360;
7151 62931969 : move16();
7152 62931969 : index_elevation = add( elevation, 90 );
7153 :
7154 62931969 : Word32 e_fac = L_add( 0x7FFFFFFF, 0 );
7155 :
7156 62931969 : if ( GT_16( index_elevation, 90 ) )
7157 : {
7158 18624352 : e_fac = MIN_32;
7159 : }
7160 :
7161 :
7162 62931969 : el = index_elevation;
7163 62931969 : move16();
7164 :
7165 62931969 : if ( GT_16( index_elevation, 90 ) )
7166 : {
7167 18624352 : el = sub( 180, index_elevation );
7168 : }
7169 :
7170 62931969 : az = index_azimuth;
7171 62931969 : move16();
7172 :
7173 62931969 : if ( GT_16( index_azimuth, 180 ) )
7174 : {
7175 25589493 : az = sub( 360, index_azimuth );
7176 : }
7177 :
7178 62931969 : f_fx = 1;
7179 62931969 : move16();
7180 :
7181 62931969 : if ( GT_16( index_azimuth, 180 ) )
7182 : {
7183 25589493 : f_fx = -1;
7184 : }
7185 :
7186 62931969 : cos_1_fx = L_shr( dirac_gains_trg_term_fx[az][0], 1 ); // q30
7187 62931969 : cos_2_fx = L_shl( Mpy_32_32( cos_1_fx, cos_1_fx ), 1 ); // q30
7188 62931969 : sin_1_fx = L_shr( dirac_gains_trg_term_fx[az][1], 1 ); // q30
7189 :
7190 62931969 : if ( EQ_32( f_fx, -1 ) )
7191 : {
7192 25589493 : sin_1_fx = L_negate( sin_1_fx ); // q30
7193 : }
7194 62931969 : cos_az_fx[0] = cos_1_fx; // q30
7195 62931969 : move32();
7196 62931969 : cos_az_fx[1] = L_shl( L_sub( cos_2_fx, ONE_IN_Q29 /*0.5 q30*/ ), 1 ); /*q30*/
7197 62931969 : move32();
7198 62931969 : cos_az_fx[2] = L_sub( L_shl( Mpy_32_32( cos_1_fx, cos_az_fx[1] ), 2 ), cos_az_fx[0] /* cos_az_fx[0] q30*/ ); /*q30*/
7199 62931969 : move32();
7200 62931969 : sin_az_fx[0] = sin_1_fx; /*q30*/
7201 62931969 : move32();
7202 62931969 : sin_az_fx[1] = L_shl( Mpy_32_32( sin_1_fx, cos_1_fx ), 2 ); /*q30*/
7203 62931969 : move32();
7204 62931969 : sin_az_fx[2] = L_shl( Mpy_32_32( sin_1_fx, L_sub( cos_2_fx, ONE_IN_Q28 /*1/4 q30*/ ) ), 3 ); /*q30*/
7205 62931969 : move32();
7206 :
7207 62931969 : response_fx[0] = 0x20000000;
7208 62931969 : move32();
7209 :
7210 244383178 : FOR( l = 1; l <= ambisonics_order; l++ )
7211 : {
7212 : Word16 a;
7213 181451209 : b_2 = imult1616( l, l );
7214 181451209 : b1_2 = add( b_2, shl( l, 1 ) );
7215 418771138 : FOR( m = 0; m < l; m += 2 )
7216 : {
7217 237319929 : b = b_2 + m;
7218 237319929 : a = dirac_gains_P_idx[b];
7219 :
7220 237319929 : c_fx_better = local_result_table[el][a]; // q30
7221 237319929 : move32();
7222 237319929 : response_fx[b] = Mpy_32_32( c_fx_better, sin_az_fx[l - m - 1] ); // Q_out
7223 237319929 : move32();
7224 :
7225 237319929 : b1 = b1_2 - m;
7226 237319929 : response_fx[b1] = Mpy_32_32( c_fx_better, cos_az_fx[l - m - 1] ); // Q_out
7227 237319929 : move32();
7228 : }
7229 :
7230 299970449 : FOR( m = 1; m < l; m += 2 )
7231 : {
7232 118519240 : b = b_2 + m;
7233 118519240 : a = dirac_gains_P_idx[b];
7234 118519240 : c_fx_better = local_result_table[el][a]; // q30
7235 118519240 : move32();
7236 118519240 : c_fx_better = Mpy_32_32( c_fx_better, e_fac ); // q30
7237 118519240 : response_fx[b] = Mpy_32_32( c_fx_better, sin_az_fx[l - m - 1] ); // Q_out
7238 118519240 : move32();
7239 :
7240 118519240 : b1 = b1_2 - m;
7241 118519240 : response_fx[b1] = Mpy_32_32( c_fx_better, cos_az_fx[l - m - 1] ); // Q_out
7242 118519240 : move32();
7243 : }
7244 :
7245 181451209 : b = add( b_2, l );
7246 181451209 : a = dirac_gains_P_idx[b];
7247 181451209 : c_fx_better = local_result_table_2[el][a]; // q30
7248 181451209 : move32();
7249 181451209 : if ( s_and( l, 0x01 ) )
7250 : {
7251 118800689 : c_fx_better = Mpy_32_32( c_fx_better, e_fac ); // q30
7252 : }
7253 181451209 : response_fx[b] = L_shl( c_fx_better, -1 ); // Q_out
7254 181451209 : move32();
7255 : }
7256 62931969 : return;
7257 : }
7258 : #endif /*FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx*/
7259 : /*-----------------------------------------------------------------------------------------*
7260 : * Function ivas_get_bits_to_encode
7261 : *
7262 : * Get number of bits required to encode the input value
7263 : *-----------------------------------------------------------------------------------------*/
7264 :
7265 264366 : Word16 ivas_get_bits_to_encode(
7266 : Word32 val )
7267 : {
7268 264366 : Word16 bits_req = 0;
7269 264366 : move16();
7270 :
7271 264366 : assert( val >= 0 );
7272 :
7273 535504 : WHILE( val )
7274 : {
7275 271138 : bits_req = add( bits_req, 1 );
7276 271138 : val = L_shr( val, 1 );
7277 : }
7278 :
7279 264366 : return bits_req;
7280 : }
7281 :
7282 :
7283 : /*-----------------------------------------------------------------------------------------*
7284 : * Function ivas_spar_set_bitrate_config()
7285 : *
7286 : * Set SPAR bitrate config
7287 : *-----------------------------------------------------------------------------------------*/
7288 :
7289 5183 : void ivas_spar_set_bitrate_config_fx(
7290 : ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */
7291 : const Word16 table_idx, /* i : config. table index */
7292 : const Word16 num_bands, /* i : number of bands */
7293 : const Word16 dirac2spar_md_flag,
7294 : const Word16 enc_flag,
7295 : const Word16 pca_flag,
7296 : const Word16 agc_flag )
7297 : {
7298 : Word32 ivas_total_brate;
7299 : Word16 i, total_bits, max_bits, code, length;
7300 : Word16 sba_order;
7301 : Word16 md_coding_bits_header;
7302 : Word16 agc_bits, pca_bits, num_PR_bits_dirac_bands;
7303 : Word16 bits_PR, bits_C, bits_P;
7304 : Word16 wc_coarse_strat;
7305 : Word16 n_input, n_dmx, n_dec;
7306 : Word16 quant_strat;
7307 : Word16 bands_bw;
7308 :
7309 5183 : pSpar_md_cfg->nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport;
7310 5183 : move16();
7311 :
7312 16958 : FOR( i = 0; i < pSpar_md_cfg->nchan_transport; i++ )
7313 : {
7314 11775 : pSpar_md_cfg->max_freq_per_chan[i] = ivas_spar_br_table_consts[table_idx].fpcs;
7315 11775 : move16();
7316 : }
7317 :
7318 5183 : pSpar_md_cfg->active_w = ivas_spar_br_table_consts[table_idx].active_w;
7319 5183 : move16();
7320 5183 : pSpar_md_cfg->agc_bits_ch_idx = ivas_spar_br_table_consts[table_idx].agc_bits_ch_idx;
7321 5183 : move16();
7322 :
7323 5183 : ivas_spar_get_uniform_quant_strat_fx( pSpar_md_cfg, table_idx );
7324 :
7325 5183 : pSpar_md_cfg->quant_strat_bits = ivas_get_bits_to_encode( MAX_QUANT_STRATS );
7326 5183 : move16();
7327 :
7328 : /* BLOCK: getEntropyCoderModels */
7329 :
7330 5183 : pSpar_md_cfg->remix_unmix_order = ivas_spar_br_table_consts[table_idx].dmx_str;
7331 5183 : move16();
7332 :
7333 : /* bits per block*/
7334 5183 : total_bits = 0;
7335 5183 : move16();
7336 5183 : max_bits = 0;
7337 5183 : move16();
7338 :
7339 5183 : ivas_total_brate = ivas_spar_br_table_consts[table_idx].ivas_total_brate;
7340 5183 : move32();
7341 5183 : sba_order = ivas_spar_br_table_consts[table_idx].sba_order;
7342 5183 : move16();
7343 5183 : ivas_get_spar_table_idx_fx( ivas_total_brate, sba_order, ivas_spar_br_table_consts[table_idx].bwidth, &length, &code );
7344 : Word16 temp;
7345 : Word16 div1;
7346 16958 : FOR( i = 0; i < pSpar_md_cfg->nchan_transport; i++ )
7347 : {
7348 11775 : total_bits = add( total_bits, extract_l( Mpy_32_32( ivas_spar_br_table_consts[table_idx].core_brs[i][0], ONE_BY_FRAMES_PER_SEC_Q31 ) ) );
7349 11775 : max_bits = add( max_bits, extract_l( Mpy_32_32( ivas_spar_br_table_consts[table_idx].core_brs[i][1], ONE_BY_FRAMES_PER_SEC_Q31 ) ) );
7350 : }
7351 :
7352 : /* (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ) */
7353 5183 : div1 = extract_l( Mpy_32_32( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 /*1/FRAMES_PER_SEC Q31*/ ) ); /*31-31=>0*/
7354 5183 : pSpar_md_cfg->tgt_bits_per_blk = sub( div1, add( add( add( add( add( IVAS_FORMAT_SIGNALING_NBITS_EXTENDED, SBA_PLANAR_BITS ), 0 ), SBA_ORDER_BITS ), length ), total_bits ) );
7355 5183 : pSpar_md_cfg->max_bits_per_blk = sub( div1, add( add( add( add( add( IVAS_FORMAT_SIGNALING_NBITS_EXTENDED, SBA_PLANAR_BITS ), 0 ), SBA_ORDER_BITS ), length ), max_bits ) );
7356 5183 : move16();
7357 5183 : move16();
7358 :
7359 5183 : md_coding_bits_header = add( SPAR_NUM_CODING_STRAT_BITS, pSpar_md_cfg->quant_strat_bits );
7360 :
7361 5183 : pSpar_md_cfg->tgt_bits_per_blk = sub( pSpar_md_cfg->tgt_bits_per_blk, md_coding_bits_header );
7362 5183 : pSpar_md_cfg->max_bits_per_blk = sub( pSpar_md_cfg->max_bits_per_blk, md_coding_bits_header );
7363 5183 : move16();
7364 5183 : move16();
7365 :
7366 5183 : IF( LT_32( ivas_total_brate, IVAS_24k4 ) )
7367 : {
7368 1029 : bands_bw = 2;
7369 1029 : move16();
7370 : }
7371 : ELSE
7372 : {
7373 4154 : bands_bw = 1;
7374 4154 : move16();
7375 : }
7376 :
7377 5183 : pSpar_md_cfg->tgt_bits_per_blk = extract_l( Mpy_32_32( i_mult( pSpar_md_cfg->tgt_bits_per_blk, num_bands ), 178956971 /* 1 / IVAS_MAX_NUM_BANDS in Q31 */ ) ); /*Q0*/
7378 5183 : pSpar_md_cfg->max_bits_per_blk = extract_l( Mpy_32_32( i_mult( pSpar_md_cfg->max_bits_per_blk, num_bands ), 178956971 /* 1 / IVAS_MAX_NUM_BANDS in Q31 */ ) ); /*Q0*/
7379 :
7380 5183 : pSpar_md_cfg->tgt_bits_per_blk = add( pSpar_md_cfg->tgt_bits_per_blk, md_coding_bits_header );
7381 5183 : pSpar_md_cfg->max_bits_per_blk = add( pSpar_md_cfg->max_bits_per_blk, md_coding_bits_header );
7382 5183 : move16();
7383 5183 : move16();
7384 5183 : move16();
7385 5183 : move16();
7386 :
7387 5183 : IF( enc_flag )
7388 : {
7389 : /*calculate the actual worst case bits*/
7390 3419 : IF( GE_32( ivas_total_brate, BRATE_SPAR_Q_STRAT ) )
7391 : {
7392 672 : quant_strat = QUANT_STRAT_0;
7393 672 : move16();
7394 : }
7395 : ELSE
7396 : {
7397 2747 : quant_strat = QUANT_STRAT_2;
7398 2747 : move16();
7399 : }
7400 :
7401 3419 : IF( EQ_16( dirac2spar_md_flag, 1 ) )
7402 : {
7403 3229 : num_PR_bits_dirac_bands = sub( num_bands, SPAR_DIRAC_SPLIT_START_BAND );
7404 3229 : move16();
7405 : }
7406 : ELSE
7407 : {
7408 190 : num_PR_bits_dirac_bands = 0;
7409 190 : move16();
7410 : }
7411 3419 : div1 = BASOP_Util_Divide3232_Scale( num_PR_bits_dirac_bands, bands_bw, &temp ); /*15-temp*/
7412 3419 : num_PR_bits_dirac_bands = shr( div1, sub( 15, temp ) ); /*q0*/
7413 3419 : num_PR_bits_dirac_bands = s_max( 0, num_PR_bits_dirac_bands );
7414 3419 : num_PR_bits_dirac_bands = i_mult( num_PR_bits_dirac_bands, DIRAC_TO_SPAR_HBR_PRED_CHS );
7415 :
7416 3419 : n_input = ivas_sba_get_nchan_metadata_fx( sba_order, ivas_total_brate );
7417 3419 : n_dmx = ivas_spar_br_table_consts[table_idx].nchan_transport;
7418 3419 : move16();
7419 3419 : n_dec = sub( n_input, n_dmx );
7420 3419 : bits_PR = ivas_spar_br_table_consts_fx[table_idx].q_lvls[quant_strat][0];
7421 3419 : move16();
7422 3419 : num_PR_bits_dirac_bands = i_mult( num_PR_bits_dirac_bands, bits_PR );
7423 3419 : bits_PR = i_mult( bits_PR, sub( n_input, 1 ) );
7424 3419 : bits_C = i_mult( ivas_spar_br_table_consts_fx[table_idx].q_lvls[quant_strat][1], i_mult( sub( n_dmx, 1 ), n_dec ) );
7425 3419 : bits_P = i_mult( ivas_spar_br_table_consts_fx[table_idx].q_lvls[quant_strat][2], n_dec );
7426 :
7427 3419 : wc_coarse_strat = add( add( bits_PR, bits_C ), bits_P );
7428 3419 : wc_coarse_strat = i_mult( wc_coarse_strat, num_bands );
7429 3419 : div1 = BASOP_Util_Divide3232_Scale( wc_coarse_strat, bands_bw, &temp ); // q=15-temp
7430 3419 : wc_coarse_strat = shr( div1, sub( 15, temp ) ); // q0
7431 3419 : wc_coarse_strat = sub( wc_coarse_strat, num_PR_bits_dirac_bands );
7432 3419 : wc_coarse_strat = add( wc_coarse_strat, md_coding_bits_header );
7433 :
7434 3419 : if ( LT_16( pSpar_md_cfg->max_bits_per_blk, wc_coarse_strat ) )
7435 : {
7436 0 : assert( 0 );
7437 : }
7438 :
7439 3419 : IF( agc_flag )
7440 : {
7441 1217 : IF( EQ_16( pSpar_md_cfg->nchan_transport, 1 ) )
7442 : {
7443 1217 : agc_bits = AGC_BITS_PER_CH;
7444 1217 : move16();
7445 : }
7446 : ELSE
7447 : {
7448 0 : agc_bits = add( i_mult( AGC_BITS_PER_CH, pSpar_md_cfg->nchan_transport ), AGC_SIGNALLING_BITS );
7449 : }
7450 : }
7451 : ELSE
7452 : {
7453 2202 : agc_bits = AGC_SIGNALLING_BITS;
7454 2202 : move16();
7455 : }
7456 :
7457 3419 : test();
7458 3419 : IF( EQ_32( ivas_total_brate, PCA_BRATE ) && EQ_32( sba_order, SBA_FOA_ORDER ) )
7459 : {
7460 66 : pca_bits = 1;
7461 66 : move16();
7462 66 : IF( pca_flag )
7463 : {
7464 8 : pca_bits = add( pca_bits, sub( add( IVAS_PCA_QBITS, IVAS_PCA_QBITS ), 1 ) );
7465 : }
7466 : }
7467 : ELSE
7468 : {
7469 3353 : pca_bits = 0;
7470 3353 : move16();
7471 : }
7472 :
7473 3419 : pSpar_md_cfg->max_md_bits_spar = add( add( pSpar_md_cfg->max_bits_per_blk, agc_bits ), pca_bits );
7474 3419 : move16();
7475 : }
7476 :
7477 5183 : return;
7478 : }
7479 : /*-----------------------------------------------------------------------------------------*
7480 : * Function ivas_spar_bitrate_dist()
7481 : *
7482 : * Set SPAR bitrate distribution
7483 : *-----------------------------------------------------------------------------------------*/
7484 :
7485 24650 : void ivas_spar_bitrate_dist_fx(
7486 : Word32 core_brates_act[], /* o : bitrates per core-coder */
7487 : const Word16 nAvailBits, /* i : number of available bits */
7488 : const Word32 ivas_total_brate, /* i : IVAS total bitrate */
7489 : const Word16 sba_order, /* i : Ambisonic (SBA) order */
7490 : const Word16 bwidth /* i : audio bandwidth */
7491 : )
7492 : {
7493 : Word16 i, nchan_transport, table_idx, bitlen;
7494 : Word16 core_bits_act[FOA_CHANNELS], core_range_bits[FOA_CHANNELS];
7495 : Word16 sum_core_act_bits, residual_bits, overflow_bits;
7496 :
7497 24650 : table_idx = ivas_get_spar_table_idx_fx( ivas_total_brate, sba_order, bwidth, &bitlen, NULL );
7498 :
7499 24650 : nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport;
7500 24650 : move16();
7501 :
7502 24650 : sum_core_act_bits = 0;
7503 24650 : move16();
7504 123250 : FOR( i = 0; i < nchan_transport; i++ )
7505 : {
7506 98600 : core_bits_act[i] = extract_l( Mpy_32_16_1( ivas_spar_br_table_consts[table_idx].core_brs[i][0], INV_FRAME_PER_SEC_Q15 /*1/FRAMES_PER_SEC Q15*/ ) ); /*q0*/
7507 98600 : move16();
7508 :
7509 98600 : sum_core_act_bits = add( sum_core_act_bits, core_bits_act[i] );
7510 : }
7511 :
7512 24650 : residual_bits = sub( nAvailBits, sum_core_act_bits );
7513 :
7514 : /* First compute core-coder bits as per bitrate distribution table and MD bitrate*/
7515 24650 : IF( residual_bits > 0 )
7516 : {
7517 2200 : FOR( i = 0; i < nchan_transport; i++ )
7518 : {
7519 2200 : core_range_bits[i] = extract_l( Mpy_32_16_1( L_sub( ivas_spar_br_table_consts[table_idx].core_brs[i][2], ivas_spar_br_table_consts[table_idx].core_brs[i][0] ), INV_FRAME_PER_SEC_Q15 /*1/FRAMES_PER_SEC Q15*/ ) ); /*q0*/
7520 2200 : move16();
7521 2200 : core_bits_act[i] = add( core_bits_act[i], s_min( residual_bits, core_range_bits[i] ) );
7522 2200 : move16();
7523 2200 : residual_bits = sub( residual_bits, core_range_bits[i] );
7524 :
7525 2200 : if ( residual_bits <= 0 )
7526 : {
7527 1835 : BREAK;
7528 : }
7529 : }
7530 : }
7531 : ELSE
7532 : {
7533 114075 : FOR( i = 0; i < nchan_transport; i++ )
7534 : {
7535 91260 : core_range_bits[i] = extract_l( Mpy_32_16_1( L_sub( ivas_spar_br_table_consts[table_idx].core_brs[i][0], ivas_spar_br_table_consts[table_idx].core_brs[i][1] ), INV_FRAME_PER_SEC_Q15 /*1/FRAMES_PER_SEC Q15*/ ) ); /*q0*/
7536 91260 : move16();
7537 : }
7538 :
7539 22815 : overflow_bits = negate( residual_bits );
7540 :
7541 108718 : FOR( i = 0; i < nchan_transport; i++ )
7542 : {
7543 87969 : core_bits_act[nchan_transport - 1 - i] = sub( core_bits_act[nchan_transport - 1 - i], s_min( overflow_bits, core_range_bits[nchan_transport - 1 - i] ) );
7544 87969 : move16();
7545 87969 : overflow_bits = sub( overflow_bits, core_range_bits[nchan_transport - 1 - i] );
7546 :
7547 87969 : if ( overflow_bits <= 0 )
7548 : {
7549 2066 : BREAK;
7550 : }
7551 : }
7552 :
7553 22815 : IF( overflow_bits > 0 )
7554 : {
7555 : Word16 overflow_bits_ch;
7556 20749 : overflow_bits_ch = idiv1616( overflow_bits, nchan_transport );
7557 :
7558 103745 : FOR( i = 0; i < nchan_transport; i++ )
7559 : {
7560 82996 : core_bits_act[i] = sub( core_bits_act[i], overflow_bits_ch );
7561 82996 : move16();
7562 82996 : overflow_bits = sub( overflow_bits, overflow_bits_ch );
7563 : }
7564 :
7565 20749 : core_bits_act[nchan_transport - 1] = sub( core_bits_act[nchan_transport - 1], s_max( 0, overflow_bits ) );
7566 20749 : move16();
7567 : }
7568 : }
7569 :
7570 123250 : FOR( i = 0; i < nchan_transport; i++ )
7571 : {
7572 98600 : core_brates_act[i] = L_mult0( core_bits_act[i], FRAMES_PER_SEC );
7573 98600 : move32();
7574 : }
7575 :
7576 24650 : return;
7577 : }
|