From a9832a36cfb67cb68396ff3b13adceedf27e8917 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 28 Oct 2024 16:22:12 +0530 Subject: [PATCH] SBA path function integration, dirac enc cleanup, Q-info updates [x] spar_md_enc_process integration and cleanup [x] ivas_dirac_enc_cleanup [x] Q-info_updates --- lib_com/bitallocsum_fx.c | 10 +- lib_com/bits_alloc_fx.c | 197 ++-- lib_com/bitstream.c | 17 +- lib_com/bitstream_fx.c | 110 +- lib_com/ivas_dirac_com.c | 4 +- lib_com/ivas_prot.h | 119 +-- lib_com/ivas_qmetadata_com.c | 3 +- lib_com/ivas_spar_com.c | 1551 ++-------------------------- lib_com/ivas_spar_com_quant_util.c | 87 +- lib_com/ivas_stat_com.h | 26 +- lib_dec/gain_dec_fx.c | 442 ++++---- lib_dec/gaus_dec_fx.c | 44 +- lib_enc/ivas_dirac_enc.c | 534 ++++------ lib_enc/ivas_enc.c | 28 +- lib_enc/ivas_init_enc.c | 61 +- lib_enc/ivas_masa_enc.c | 19 - lib_enc/ivas_mct_enc.c | 26 - lib_enc/ivas_spar_encoder.c | 105 +- lib_enc/ivas_spar_md_enc.c | 361 +++---- lib_enc/ivas_stat_enc.h | 26 +- 20 files changed, 1096 insertions(+), 2674 deletions(-) diff --git a/lib_com/bitallocsum_fx.c b/lib_com/bitallocsum_fx.c index c8ad205e1..fa71c92f8 100644 --- a/lib_com/bitallocsum_fx.c +++ b/lib_com/bitallocsum_fx.c @@ -25,12 +25,12 @@ void bitallocsum_fx( Word16 total, tmp; Word16 diff; - total = (Word16) 0; + total = 0; move16(); FOR( i = 0; i < nb_sfm; i++ ) { - tmp = extract_l( L_mult0( R[i], sfmsize[i] ) ); - Rsubband[i] = shl( tmp, 3 ); + tmp = extract_l( L_mult0( R[i], sfmsize[i] ) ); // Q0 + Rsubband[i] = shl( tmp, 3 ); // Q3 move16(); total = add( total, tmp ); } @@ -40,7 +40,7 @@ void bitallocsum_fx( IF( LE_16( length, L_FRAME32k ) ) { diff = sub( num_bits, *sum ); - i = (Word16) 0; + i = 0; move16(); WHILE( diff > 0 ) { @@ -55,7 +55,7 @@ void bitallocsum_fx( i = add( i, 1 ); if ( GE_16( i, nb_sfm ) ) { - i = (Word16) 0; + i = 0; move16(); } } diff --git a/lib_com/bits_alloc_fx.c b/lib_com/bits_alloc_fx.c index 2e0c018c8..1c247a9fb 100644 --- a/lib_com/bits_alloc_fx.c +++ b/lib_com/bits_alloc_fx.c @@ -51,14 +51,10 @@ void BITS_ALLOC_init_config_acelp( { Word8 rate_mode_index; - - move16(); - move16(); - move16(); rate_mode_index = (Word8) GT_32( bit_rate, ACELP_9k60 ); pConfigAcelp->mode_index = rate_mode_index; - + move16(); /*LPC: midLpc should be swithced off?*/ pConfigAcelp->midLpc_enable = 1; @@ -155,7 +151,8 @@ Word16 BITS_ALLOC_config_acelp( } } - IF( L_and( EQ_16( band_index, 1 ), EQ_16( nb_subfr, 4 ) ) ) + test(); + IF( EQ_16( band_index, 1 ) && EQ_16( nb_subfr, 4 ) ) { IF( coder_type == INACTIVE ) { @@ -239,7 +236,8 @@ Word16 BITS_ALLOC_config_acelp( move16(); pConfigAcelp->ltf_bits = ACELP_LTF_BITS[pConfigAcelp->ltf_mode]; - IF( L_and( EQ_16( nb_subfr, 5 ), EQ_16( pConfigAcelp->ltf_bits, 4 ) ) ) + test(); + IF( EQ_16( nb_subfr, 5 ) && EQ_16( pConfigAcelp->ltf_bits, 4 ) ) { pConfigAcelp->ltf_bits = add( pConfigAcelp->ltf_bits, 1 ); move16(); @@ -369,14 +367,15 @@ static Word16 BITS_ALLOC_adjust_generic( bits_currsubframe = sub( add( i_mult2( sfr, bits_subframe2 ), bits_subframe2 ), bitsused ); /* try increasing mode while below threshold */ - WHILE( ( LT_16( k, sub( pulseconfig_size, 1 ) ) ) && ( LE_16( i_mult2( pulseconfigbits[k + 1], nb_subfr ), bits_currsubframe ) ) ) + test(); + WHILE( ( ( k < sub( pulseconfig_size, 1 ) ) ) && ( ( i_mult2( pulseconfigbits[k + 1], nb_subfr ) <= bits_currsubframe ) ) ) { test(); k = add( k, 1 ); } /* try decreasing mode until below threshold */ - WHILE( GT_16( i_mult2( pulseconfigbits[k], nb_subfr ), bits_currsubframe ) ) + WHILE( ( i_mult2( pulseconfigbits[k], nb_subfr ) > bits_currsubframe ) ) { k = sub( k, 1 ); @@ -442,7 +441,7 @@ static Word16 fcb_table( static ivas_error acelp_FCB_allocator( Word16 *nBits, /* i/o: available bit-budget */ - Word16 fixed_cdk_index[], /* o : codebook index */ + Word16 fixed_cdk_index[], /* o : codebook index Q0 */ Word16 nb_subfr, /* i : number of subframes */ const Word16 L_subfr, /* i : subframe length */ const Word16 coder_type, /* i : coder type */ @@ -464,7 +463,6 @@ static ivas_error acelp_FCB_allocator( move16(); p_fixed_cdk_index = fixed_cdk_index; - move16(); /* TRANSITION coding: first subframe bit-budget was already fixed, glottal pulse not in the first subframe */ test(); @@ -531,7 +529,6 @@ static ivas_error acelp_FCB_allocator( IF( cdbk >= 0 ) { nBits_tmp = fcb_table( cdbk, L_subfr ); - move16(); } ELSE { @@ -545,7 +542,7 @@ static ivas_error acelp_FCB_allocator( IF( LT_16( cdbk, ACELP_FIXED_CDK_NB - 1 ) ) { step = sub( fcb_table( add( cdbk, 1 ), L_subfr ), nBits_tmp ); - WHILE( GE_16( *nBits, step ) ) + WHILE( *nBits >= step ) { ( *p_fixed_cdk_index )++; *nBits = sub( *nBits, step ); @@ -558,14 +555,16 @@ static ivas_error acelp_FCB_allocator( test(); IF( GE_16( *nBits, step ) && cdbk >= 0 ) { - fixed_cdk_index[sfr]++; + fixed_cdk_index[sfr] = add( fixed_cdk_index[sfr], 1 ); + move16(); *nBits = sub( *nBits, step ); move16(); test(); IF( GE_16( *nBits, step ) && EQ_16( fixed_cdk_index[sfr + 1], sub( fixed_cdk_index[sfr], 1 ) ) ) { - sfr++; - fixed_cdk_index[sfr]++; + sfr = add( sfr, 1 ); + fixed_cdk_index[sfr] = add( fixed_cdk_index[sfr], 1 ); + move16(); *nBits = sub( *nBits, step ); move16(); } @@ -581,7 +580,7 @@ static ivas_error acelp_FCB_allocator( /* TRANSITION coding: allocate second highest FCBQ bit-budget to the last subframe */ IF( idiv1616( tc_subfr, L_SUBFR ) < sub( nb_subfr, 1 ) ) { - SWAP( fixed_cdk_index[sub( tc_subfr, L_SUBFR ) / L_SUBFR], fixed_cdk_index[nb_subfr - 1] ); + SWAP( fixed_cdk_index[( tc_subfr - L_SUBFR ) / L_SUBFR], fixed_cdk_index[nb_subfr - 1] ); } } @@ -603,7 +602,7 @@ static ivas_error acelp_FCB_allocator( static ivas_error acelp_FCB_allocator_ivas( Word16 *nBits, /* i/o: available bit-budget */ - Word16 fixed_cdk_index[], /* o : codebook index */ + Word16 fixed_cdk_index[], /* o : codebook index Q0 */ Word16 nb_subfr, /* i : number of subframes */ const Word16 L_subfr, /* i : subframe length */ const Word16 coder_type, /* i : coder type */ @@ -625,7 +624,6 @@ static ivas_error acelp_FCB_allocator_ivas( move16(); p_fixed_cdk_index = fixed_cdk_index; - move16(); /* TRANSITION coding: first subframe bit-budget was already fixed, glottal pulse not in the first subframe */ test(); @@ -681,7 +679,6 @@ static ivas_error acelp_FCB_allocator_ivas( IF( cdbk >= 0 ) { nBits_tmp = fcb_table( cdbk, L_subfr ); - move16(); } ELSE { @@ -695,7 +692,7 @@ static ivas_error acelp_FCB_allocator_ivas( IF( LT_16( cdbk, ACELP_FIXED_CDK_NB - 1 ) ) { step = sub( fcb_table( add( cdbk, 1 ), L_subfr ), nBits_tmp ); - WHILE( GE_16( *nBits, step ) ) + WHILE( *nBits >= step ) { ( *p_fixed_cdk_index )++; *nBits = sub( *nBits, step ); @@ -710,14 +707,16 @@ static ivas_error acelp_FCB_allocator_ivas( test(); IF( GE_16( *nBits, step ) && cdbk >= 0 ) { - fixed_cdk_index[sfr]++; + fixed_cdk_index[sfr] = add( fixed_cdk_index[sfr], 1 ); + move16(); *nBits = sub( *nBits, step ); move16(); test(); IF( GE_16( *nBits, step ) && EQ_16( fixed_cdk_index[sfr + 1], sub( fixed_cdk_index[sfr], 1 ) ) ) { - sfr++; - fixed_cdk_index[sfr]++; + sfr = add( sfr, 1 ); + fixed_cdk_index[sfr] = add( fixed_cdk_index[sfr], 1 ); + move16(); *nBits = sub( *nBits, step ); move16(); } @@ -732,7 +731,7 @@ static ivas_error acelp_FCB_allocator_ivas( SWAP( fixed_cdk_index[0], fixed_cdk_index[tc_subfr / L_SUBFR] ); /* TRANSITION coding: allocate second highest FCBQ bit-budget to the last subframe */ - IF( idiv1616( tc_subfr, L_SUBFR ) < sub( nb_subfr, 1 ) ) + IF( LT_16( idiv1616( tc_subfr, L_SUBFR ), sub( nb_subfr, 1 ) ) ) { SWAP( fixed_cdk_index[sub( tc_subfr, L_SUBFR ) / L_SUBFR], fixed_cdk_index[nb_subfr - 1] ); } @@ -879,7 +878,7 @@ ivas_error config_acelp1( i = 0; move16(); - WHILE( LT_16( i, SIZE_BRATE_INTERMED_TBL ) ) + WHILE( i < SIZE_BRATE_INTERMED_TBL ) { IF( EQ_32( core_brate_inp, brate_intermed_tbl[i] ) ) { @@ -895,14 +894,14 @@ ivas_error config_acelp1( BREAK; } - i++; + i = add( i, 1 ); } test(); test(); test(); - if ( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( coder_type, AUDIO ) && - LE_32( core_brate_inp, STEREO_GSC_BIT_RATE_ALLOC ) && EQ_32( brate_intermed_tbl[i], ACELP_9k60 ) ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */ + IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( coder_type, AUDIO ) && + LE_32( core_brate_inp, STEREO_GSC_BIT_RATE_ALLOC ) && EQ_32( brate_intermed_tbl[i], ACELP_9k60 ) ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */ { i = sub( i, 1 ); } @@ -910,14 +909,14 @@ ivas_error config_acelp1( core_brate = brate_intermed_tbl[i]; move32(); - if ( GT_16( element_mode, EVS_MONO ) ) + if ( element_mode > EVS_MONO ) { flag_hardcoded = 0; /* use automatic and flexible ACELP bit-budget allocation */ move16(); } test(); - if ( NE_16( core, ACELP_CORE ) && EQ_16( element_mode, EVS_MONO ) ) /* needed for mode1 core switching in EVS mono */ + if ( ( core != ACELP_CORE ) && ( element_mode == EVS_MONO ) ) /* needed for mode1 core switching in EVS mono */ { flag_hardcoded = 1; move16(); @@ -931,11 +930,11 @@ ivas_error config_acelp1( IF( !( EQ_16( coder_type, TRANSITION ) && NE_16( tc_subfr, -1 ) ) || EQ_16( enc_dec, DEC ) ) { /* Set the bit-budget */ - bits = extract_l( Mpy_32_32( core_brate_inp, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + bits = extract_l( Mpy_32_32( core_brate_inp, ONE_BY_FRAMES_PER_SEC_Q31 ) ); // Q0 test(); test(); - if ( EQ_16( coder_type, TRANSITION ) && EQ_16( enc_dec, DEC ) && EQ_16( tc_call, 1 ) ) + IF( EQ_16( coder_type, TRANSITION ) && EQ_16( enc_dec, DEC ) && EQ_16( tc_call, 1 ) ) { bits = add( bits, *nBits_es_Pred ); /* equalize for 4th signaling bit estimated at the encoder in TC_0_192 */ } @@ -947,7 +946,7 @@ ivas_error config_acelp1( { bits = sub( bits, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ); - if ( EQ_16( tdm_LRTD_flag, 1 ) ) + IF( EQ_16( tdm_LRTD_flag, 1 ) ) { bits = add( bits, STEREO_BITS_TCA ); } @@ -959,7 +958,7 @@ ivas_error config_acelp1( test(); test(); test(); - if ( extl_brate > 0 && ( EQ_16( extl, WB_TBE ) || EQ_16( extl, SWB_TBE ) || EQ_16( extl, FB_TBE ) || EQ_16( extl, WB_BWE ) || EQ_16( extl, SWB_BWE ) || EQ_16( extl, FB_BWE ) ) ) + IF( extl_brate > 0 && ( EQ_16( extl, WB_TBE ) || EQ_16( extl, SWB_TBE ) || EQ_16( extl, FB_TBE ) || EQ_16( extl, WB_BWE ) || EQ_16( extl, SWB_BWE ) || EQ_16( extl, FB_BWE ) ) ) { bits = sub( bits, 1 ); } @@ -976,7 +975,7 @@ ivas_error config_acelp1( test(); test(); test(); - if ( extl_brate > 0 && ( EQ_16( extl, WB_TBE ) || EQ_16( extl, SWB_TBE ) || EQ_16( extl, FB_TBE ) || EQ_16( extl, WB_BWE ) || EQ_16( extl, SWB_BWE ) || EQ_16( extl, FB_BWE ) ) ) + IF( extl_brate > 0 && ( EQ_16( extl, WB_TBE ) || EQ_16( extl, SWB_TBE ) || EQ_16( extl, FB_TBE ) || EQ_16( extl, WB_BWE ) || EQ_16( extl, SWB_BWE ) || EQ_16( extl, FB_BWE ) ) ) { /* extension layer signalling bit is counted in the extension layer bitbudget */ bits = add( bits, 1 ); @@ -1139,7 +1138,7 @@ ivas_error config_acelp1( test(); test(); - if ( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) && NE_16( coder_type, VOICED ) ) + IF( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) && NE_16( coder_type, VOICED ) ) { bits = sub( bits, FEC_BITS_CLS ); } @@ -1151,7 +1150,7 @@ ivas_error config_acelp1( acelp_cfg->FEC_mode = 2; move16(); test(); - if ( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) ) + IF( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) ) { bits = sub( bits, FEC_BITS_ENR ); } @@ -1163,7 +1162,7 @@ ivas_error config_acelp1( move16(); test(); - if ( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) ) + IF( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) ) { bits = sub( bits, FEC_BITS_POS ); } @@ -1190,7 +1189,7 @@ ivas_error config_acelp1( acelp_cfg->ltf_mode = FULL_BAND; move16(); } - ELSE IF( ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) ) && core_brate < ACELP_11k60 ) + ELSE IF( ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) ) && LT_32( core_brate, ACELP_11k60 ) ) { acelp_cfg->ltf_mode = LOW_PASS; move16(); @@ -1208,7 +1207,7 @@ ivas_error config_acelp1( { acelp_cfg->ltf_mode = NORMAL_OPERATION; move16(); - if ( coder_type != TRANSITION ) + IF( coder_type != TRANSITION ) { bits = sub( bits, nb_subfr ); } @@ -1229,11 +1228,11 @@ ivas_error config_acelp1( test(); test(); test(); - if ( ( ( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) || ( coder_type == INACTIVE && LE_32( core_brate, ACELP_9k60 ) ) ) && ( idchan == 0 || element_mode == EVS_MONO ) ) + IF( ( ( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) || ( coder_type == INACTIVE && LE_32( core_brate, ACELP_9k60 ) ) ) && ( idchan == 0 || element_mode == EVS_MONO ) ) { bits = sub( bits, NBITS_NOISENESS ); /* noiseness */ } - if ( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) + IF( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) { bits = sub( bits, 3 * NB_SUBFR ); /* tilt factor */ } @@ -1257,55 +1256,55 @@ ivas_error config_acelp1( { IF( EQ_16( tc_subfr, TC_0_0 ) ) { - if ( EQ_16( enc_dec, ENC ) ) + IF( enc_dec == ENC ) { bits = sub( bits, 1 ); /* TC signalling */ } - if ( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) + IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) { bits = sub( bits, 3 ); /* LP filtering flag */ } } ELSE IF( EQ_16( tc_subfr, TC_0_64 ) ) { - if ( EQ_16( enc_dec, ENC ) ) + IF( enc_dec == ENC ) { bits = sub( bits, 4 ); /* TC signalling */ } - if ( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) + IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) { bits = sub( bits, 3 ); /* LP filtering flag */ } } ELSE IF( EQ_16( tc_subfr, TC_0_128 ) ) { - if ( EQ_16( enc_dec, ENC ) ) + IF( enc_dec == ENC ) { bits = sub( bits, 4 ); /* TC signalling */ } - if ( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) + IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) { bits = sub( bits, 2 ); /* LP filtering flag */ } } ELSE IF( EQ_16( tc_subfr, TC_0_192 ) ) { - if ( EQ_16( enc_dec, ENC ) ) + IF( enc_dec == ENC ) { bits = sub( bits, 3 ); /* TC signalling */ } - if ( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) + IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) { bits = sub( bits, 1 ); /* LP filtering flag */ } } ELSE IF( EQ_16( tc_subfr, L_SUBFR ) ) { - if ( EQ_16( enc_dec, ENC ) ) + IF( enc_dec == ENC ) { bits = sub( bits, 3 ); /* TC signalling */ } @@ -1317,7 +1316,7 @@ ivas_error config_acelp1( } ELSE { - if ( EQ_16( enc_dec, ENC ) ) + IF( enc_dec == ENC ) { bits = sub( bits, 4 ); /* TC signalling */ } @@ -1330,7 +1329,7 @@ ivas_error config_acelp1( } ELSE /* L_frame == L_FRAME16k */ { - IF( EQ_16( enc_dec, ENC ) ) + IF( enc_dec == ENC ) { IF( LE_16( tc_subfr, 2 * L_SUBFR ) ) { @@ -1342,7 +1341,8 @@ ivas_error config_acelp1( } } - bits -= ( L_FRAME16k - tc_subfr - L_SUBFR ) / L_SUBFR; /* LP filtering flag */ + // bits -= ( L_FRAME16k - tc_subfr - L_SUBFR ) / L_SUBFR; /* LP filtering flag */ + bits = sub( bits, idiv1616_1( sub( L_FRAME16k - L_SUBFR, tc_subfr ), L_SUBFR ) ); /* LP filtering flag */ } /* glottal-shape codebook bits */ @@ -1371,7 +1371,7 @@ ivas_error config_acelp1( test(); test(); test(); - IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( tdm_low_rate_mode, 1 ) && NE_16( coder_type, INACTIVE ) && NE_16( coder_type, UNVOICED ) ) /* GENERIC low rate mode for secondary channel */ + IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( tdm_low_rate_mode, 1 ) && ( coder_type != INACTIVE ) && NE_16( coder_type, UNVOICED ) ) /* GENERIC low rate mode for secondary channel */ { set16_fx( acelp_cfg->pitch_bits, 0, NB_SUBFR16k ); set16_fx( acelp_cfg->gains_mode, 0, NB_SUBFR16k ); @@ -1387,6 +1387,7 @@ ivas_error config_acelp1( bits = sub( bits, acelp_cfg->pitch_bits[i] ); } acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX_fx( ACELP_7k20, GENERIC, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_fx( tc_subfr ) )]; + move16(); bits = sub( bits, acelp_cfg->gains_mode[i] ); } acelp_cfg->fcb_mode = 1; @@ -1422,6 +1423,7 @@ ivas_error config_acelp1( { IF( EQ_16( L_frame, L_FRAME ) ) { + test(); IF( EQ_16( tdm_Pitch_reuse_flag, 1 ) && EQ_16( idchan, 1 ) ) { acelp_cfg->pitch_bits[i] = 0; @@ -1501,8 +1503,7 @@ ivas_error config_acelp1( IF( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) { i = idiv1616( bits, NB_SUBFR ); - move16(); - if ( i % 2 == 0 ) + IF( s_and( i, 1 ) == 0 ) { i = sub( i, 1 ); /* must be odd */ } @@ -1571,7 +1572,7 @@ ivas_error config_acelp1( move16(); } } - ELSE IF( element_mode != IVAS_CPE_TD && GSC_IVAS_mode > 0 && EQ_16( L_frame, L_FRAME16k ) ) + ELSE IF( NE_16( element_mode, IVAS_CPE_TD ) && GSC_IVAS_mode > 0 && EQ_16( L_frame, L_FRAME16k ) ) { bits = 100; /* 9 kbps for fcb */ move16(); @@ -1606,7 +1607,7 @@ ivas_error config_acelp1( test(); test(); - if ( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && LE_32( core_brate_inp, MAX_BRATE_AVQ_EXC_TD ) && EQ_16( coder_type, GENERIC ) ) + IF( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && LE_32( core_brate_inp, MAX_BRATE_AVQ_EXC_TD ) && EQ_16( coder_type, GENERIC ) ) { /* harm. flag ACELP AVQ */ bits = sub( bits, 1 ); @@ -1729,6 +1730,8 @@ ivas_error config_acelp1( test(); IF( flag_hardcoded && NE_32( core_brate, PPP_NELP_2k80 ) ) { + test(); + test(); /* unused bits */ IF( EQ_16( coder_type, AUDIO ) || ( coder_type == INACTIVE && LE_32( core_brate, ACELP_24k40 ) ) ) { @@ -1997,20 +2000,20 @@ ivas_error config_acelp1_IVAS( i = 0; move16(); - WHILE( LT_16( i, SIZE_BRATE_INTERMED_TBL ) ) + WHILE( i < SIZE_BRATE_INTERMED_TBL ) { IF( EQ_32( core_brate_inp, brate_intermed_tbl[i] ) ) { flag_hardcoded = 1; move16(); - break; + BREAK; } IF( LT_32( core_brate_inp, brate_intermed_tbl[i] ) ) { flag_hardcoded = 0; move16(); - break; + BREAK; } i = add( i, 1 ); @@ -2054,7 +2057,7 @@ ivas_error config_acelp1_IVAS( test(); test(); - if ( EQ_16( coder_type, TRANSITION ) && EQ_16( enc_dec, DEC ) && EQ_16( tc_call, 1 ) ) + IF( EQ_16( coder_type, TRANSITION ) && EQ_16( enc_dec, DEC ) && EQ_16( tc_call, 1 ) ) { bits = add( bits, *nBits_es_Pred ); /* equalize for 4th signaling bit estimated at the encoder in TC_0_192 */ } @@ -2066,7 +2069,7 @@ ivas_error config_acelp1_IVAS( { bits = sub( bits, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ); - if ( EQ_16( tdm_LRTD_flag, 1 ) ) + IF( EQ_16( tdm_LRTD_flag, 1 ) ) { bits = add( bits, STEREO_BITS_TCA ); } @@ -2078,7 +2081,7 @@ ivas_error config_acelp1_IVAS( test(); test(); /* subtract TBE/BWE flag */ - if ( extl_brate > 0 && ( EQ_16( extl, WB_TBE ) || EQ_16( extl, SWB_TBE ) || EQ_16( extl, FB_TBE ) || EQ_16( extl, WB_BWE ) || EQ_16( extl, SWB_BWE ) || EQ_16( extl, FB_BWE ) ) ) + IF( extl_brate > 0 && ( EQ_16( extl, WB_TBE ) || EQ_16( extl, SWB_TBE ) || EQ_16( extl, FB_TBE ) || EQ_16( extl, WB_BWE ) || EQ_16( extl, SWB_BWE ) || EQ_16( extl, FB_BWE ) ) ) { bits = sub( bits, 1 ); } @@ -2095,7 +2098,7 @@ ivas_error config_acelp1_IVAS( test(); test(); test(); - if ( extl_brate > 0 && ( EQ_16( extl, WB_TBE ) || EQ_16( extl, SWB_TBE ) || EQ_16( extl, FB_TBE ) || EQ_16( extl, WB_BWE ) || EQ_16( extl, SWB_BWE ) || EQ_16( extl, FB_BWE ) ) ) + IF( extl_brate > 0 && ( EQ_16( extl, WB_TBE ) || EQ_16( extl, SWB_TBE ) || EQ_16( extl, FB_TBE ) || EQ_16( extl, WB_BWE ) || EQ_16( extl, SWB_BWE ) || EQ_16( extl, FB_BWE ) ) ) { /* extension layer signaling bit is counted in the extension layer bitbudget */ bits = add( bits, 1 ); @@ -2196,7 +2199,7 @@ ivas_error config_acelp1_IVAS( test(); test(); /* gain Q bit-budget - part 1 */ - IF( ( NE_16( coder_type, UNVOICED ) && NE_16( coder_type, AUDIO ) && NE_16( coder_type, INACTIVE ) && !( LE_32( core_brate, ACELP_8k00 ) && NE_16( coder_type, TRANSITION ) ) ) || ( EQ_16( coder_type, INACTIVE ) && GT_32( total_brate, MAX_GSC_INACTIVE_BRATE ) ) ) + IF( ( NE_16( coder_type, UNVOICED ) && NE_16( coder_type, AUDIO ) && ( coder_type != INACTIVE ) && !( LE_32( core_brate, ACELP_8k00 ) && NE_16( coder_type, TRANSITION ) ) ) || ( ( coder_type == INACTIVE ) && GT_32( total_brate, MAX_GSC_INACTIVE_BRATE ) ) ) { *nBits_es_Pred = Es_pred_bits_tbl[BIT_ALLOC_IDX( core_brate, coder_type, -1, -1 )]; move16(); @@ -2272,7 +2275,7 @@ ivas_error config_acelp1_IVAS( move16(); test(); - if ( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) ) + IF( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) ) { bits = sub( bits, FEC_BITS_ENR ); } @@ -2284,7 +2287,7 @@ ivas_error config_acelp1_IVAS( move16(); test(); - if ( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) ) + IF( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) ) { bits = sub( bits, FEC_BITS_POS ); } @@ -2351,12 +2354,12 @@ ivas_error config_acelp1_IVAS( test(); test(); test(); - if ( ( ( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) || ( coder_type == INACTIVE && LE_32( core_brate, ACELP_9k60 ) ) ) && ( idchan == 0 || element_mode == EVS_MONO ) ) + IF( ( ( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) || ( coder_type == INACTIVE && LE_32( core_brate, ACELP_9k60 ) ) ) && ( idchan == 0 || element_mode == EVS_MONO ) ) { bits = sub( bits, NBITS_NOISENESS ); /* noiseness */ } test(); - if ( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) + IF( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) { bits = sub( bits, ( 3 * NB_SUBFR ) ); /* tilt factor */ } @@ -2380,55 +2383,55 @@ ivas_error config_acelp1_IVAS( { IF( EQ_16( tc_subfr, TC_0_0 ) ) { - if ( enc_dec == ENC ) + IF( enc_dec == ENC ) { bits = sub( bits, 1 ); /* TC signaling */ } - if ( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) + IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) { bits = sub( bits, 3 ); /* LP filtering flag */ } } ELSE IF( EQ_16( tc_subfr, TC_0_64 ) ) { - if ( enc_dec == ENC ) + IF( enc_dec == ENC ) { bits = sub( bits, 4 ); /* TC signaling */ } - if ( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) + IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) { bits = sub( bits, 3 ); /* LP filtering flag */ } } ELSE IF( EQ_16( tc_subfr, TC_0_128 ) ) { - if ( enc_dec == ENC ) + IF( enc_dec == ENC ) { bits = sub( bits, 4 ); /* TC signaling */ } - if ( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) + IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) { bits = sub( bits, 2 ); /* LP filtering flag */ } } ELSE IF( EQ_16( tc_subfr, TC_0_192 ) ) { - if ( enc_dec == ENC ) + IF( enc_dec == ENC ) { bits = sub( bits, 3 ); /* TC signaling */ } - if ( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) + IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) { bits = sub( bits, 1 ); /* LP filtering flag */ } } ELSE IF( EQ_16( tc_subfr, L_SUBFR ) ) { - if ( enc_dec == ENC ) + IF( enc_dec == ENC ) { bits = sub( bits, 3 ); /* TC signaling */ } @@ -2441,7 +2444,7 @@ ivas_error config_acelp1_IVAS( } ELSE { - if ( enc_dec == ENC ) + IF( enc_dec == ENC ) { bits = sub( bits, 4 ); /* TC signaling */ } @@ -2455,7 +2458,7 @@ ivas_error config_acelp1_IVAS( } ELSE /* L_frame == L_FRAME16k */ { - if ( enc_dec == ENC ) + IF( enc_dec == ENC ) { IF( LE_16( tc_subfr, 2 * L_SUBFR ) ) { @@ -2568,10 +2571,10 @@ ivas_error config_acelp1_IVAS( } ELSE { - acelp_cfg->pitch_bits[i] = ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( core_brate, coder_type, i * L_SUBFR, TC_SUBFR2IDX_16KHZ( tc_subfr ) )]; + acelp_cfg->pitch_bits[i] = ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ( tc_subfr ) )]; move16(); } - acelp_cfg->gains_mode[i] = gain_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( core_brate, coder_type_sw, i * L_SUBFR, TC_SUBFR2IDX_16KHZ( tc_subfr ) )]; + acelp_cfg->gains_mode[i] = gain_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( core_brate, coder_type_sw, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ( tc_subfr ) )]; move16(); } @@ -2607,12 +2610,12 @@ ivas_error config_acelp1_IVAS( { IF( EQ_16( L_frame, L_FRAME ) ) { - acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX( core_brate, coder_type, i * L_SUBFR, TC_SUBFR2IDX( tc_subfr ) )]; + acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX( tc_subfr ) )]; move16(); } ELSE /* L_frame == L_FRAME16k */ { - acelp_cfg->fixed_cdk_index[i] = FCB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( core_brate, coder_type, i * L_SUBFR, TC_SUBFR2IDX_16KHZ( tc_subfr ) )]; + acelp_cfg->fixed_cdk_index[i] = FCB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ( tc_subfr ) )]; move16(); } bits = sub( bits, acelp_cfg->fixed_cdk_index[i] ); @@ -2624,7 +2627,7 @@ ivas_error config_acelp1_IVAS( IF( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) { i = idiv1616( bits, NB_SUBFR ); - if ( i % 2 == 0 ) + IF( s_and( i, 1 ) == 0 ) { i = sub( i, 1 ); /* must be odd */ } @@ -2708,7 +2711,7 @@ ivas_error config_acelp1_IVAS( { IF( flag_hardcoded ) { - acelp_cfg->AVQ_cdk_bits[i] = AVQ_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( core_brate, coder_type, i * L_SUBFR, TC_SUBFR2IDX_16KHZ( tc_subfr ) )]; + acelp_cfg->AVQ_cdk_bits[i] = AVQ_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ( tc_subfr ) )]; move16(); { bits = sub( bits, acelp_cfg->AVQ_cdk_bits[i] ); @@ -2720,7 +2723,7 @@ ivas_error config_acelp1_IVAS( test(); test(); - if ( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && LE_32( core_brate_inp, MAX_BRATE_AVQ_EXC_TD ) && EQ_16( coder_type, GENERIC ) ) + IF( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && LE_32( core_brate_inp, MAX_BRATE_AVQ_EXC_TD ) && EQ_16( coder_type, GENERIC ) ) { /* harm. flag ACELP AVQ */ bits = sub( bits, 1 ); @@ -2806,18 +2809,18 @@ ivas_error config_acelp1_IVAS( { IF( EQ_16( L_frame, L_FRAME16k ) ) { - acelp_cfg->pitch_bits[i] = ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( Pitch_BR, Pitch_CT, i * L_SUBFR, 0 )]; + acelp_cfg->pitch_bits[i] = ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ( Pitch_BR, Pitch_CT, i_mult( i, L_SUBFR ), 0 )]; move16(); - acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX( Local_BR, LOCAL_CT, i * L_SUBFR, 0 )]; + acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX( Local_BR, LOCAL_CT, i_mult( i, L_SUBFR ), 0 )]; move16(); } ELSE { - acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX( Pitch_BR, Pitch_CT, i * L_SUBFR, 0 )]; + acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX( Pitch_BR, Pitch_CT, i_mult( i, L_SUBFR ), 0 )]; move16(); - acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX( Local_BR, LOCAL_CT, i * L_SUBFR, 0 )]; + acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX( Local_BR, LOCAL_CT, i_mult( i, L_SUBFR ), 0 )]; move16(); - acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX( ACELP_7k20, LOCAL_CT, i * L_SUBFR, 0 )]; + acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX( ACELP_7k20, LOCAL_CT, i_mult( i, L_SUBFR ), 0 )]; move16(); } } @@ -3098,7 +3101,7 @@ Word16 set_ACELP_flag( test(); test(); test(); - IF( EQ_16( element_mode, IVAS_CPE_DFT ) && ( idchan == 0 ) && LE_32( total_brate, SID_2k40 ) && EQ_16( bwidth, WB ) && EQ_16( cng_type, LP_CNG ) ) + IF( EQ_16( element_mode, IVAS_CPE_DFT ) && ( idchan == 0 ) && LE_32( total_brate, SID_2k40 ) && EQ_16( bwidth, WB ) && ( cng_type == LP_CNG ) ) { return 1; } @@ -3230,7 +3233,7 @@ Word16 set_ACELP_flag_IVAS( test(); test(); test(); - IF( EQ_16( element_mode, IVAS_CPE_DFT ) && ( idchan == 0 ) && LE_32( total_brate, SID_2k40 ) && EQ_16( bwidth, WB ) && EQ_16( cng_type, LP_CNG ) ) + IF( EQ_16( element_mode, IVAS_CPE_DFT ) && ( idchan == 0 ) && LE_32( total_brate, SID_2k40 ) && EQ_16( bwidth, WB ) && ( cng_type == LP_CNG ) ) { return 1; } diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 7d892f8c8..584013e2b 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -698,6 +698,8 @@ Word16 get_ivas_max_num_indices_fx( const Word32 ivas_total_brate /* i : IVAS total bitrate */ ) { + test(); + test(); IF( EQ_16( ivas_format, STEREO_FORMAT ) ) { IF( LE_32( ivas_total_brate, IVAS_16k4 ) ) @@ -1179,6 +1181,7 @@ Word16 get_ivas_max_num_indices_metadata_fx( ) { /* set the maximum required number of metadata indices */ + test(); IF( EQ_16( ivas_format, MONO_FORMAT ) ) { return 0; @@ -1418,7 +1421,7 @@ ivas_error check_ind_list_limits( { /* reallocate the buffer of indices with increased limit */ - IF( ( error = ind_list_realloc( *hBstr->ivas_ind_list_zero, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES, hBstr->st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ind_list_realloc( *hBstr->ivas_ind_list_zero, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES, hBstr->st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -1440,7 +1443,7 @@ ivas_error check_ind_list_limits( { /* no available empty slot -> need to re-allocate the buffer */ - IF( ( error = ind_list_realloc( *hBstr->ivas_ind_list_zero, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES, hBstr->st_ivas ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ind_list_realloc( *hBstr->ivas_ind_list_zero, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES, hBstr->st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -1532,7 +1535,7 @@ ivas_error push_indice( move32(); /* check the limits of the list of indices */ - IF( ( error = check_ind_list_limits( hBstr ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) { return IVAS_ERROR( error, "Error occured in push_indice() while re-allocating the list of indices (frame %d) !\n" ); } @@ -1540,8 +1543,10 @@ ivas_error push_indice( /* find the location in the list of indices based on ID */ i = hBstr->nb_ind_tot; move16(); - WHILE( i > 0 && LT_16( id, hBstr->ind_list[i - 1].id ) ) + test(); + WHILE( i > 0 && ( id < hBstr->ind_list[i - 1].id ) ) { + test(); i = sub( i, 1 ); } @@ -1649,7 +1654,7 @@ ivas_error push_next_indice( /* check the limits of the list of indices */ - IF( ( error = check_ind_list_limits( hBstr ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = check_ind_list_limits( hBstr ) ), IVAS_ERR_OK ) ) { return error; } @@ -2102,7 +2107,7 @@ UWord16 get_indice_st( FOR( i = 0; i < nb_bits; i++ ) { value = shl( value, 1 ); - value = add( value, st->bit_stream[add( pos, i )] ); + value = add( value, st->bit_stream[pos + i] ); } return value; diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c index 7ca1ddf81..7d7fa3fdd 100644 --- a/lib_com/bitstream_fx.c +++ b/lib_com/bitstream_fx.c @@ -176,7 +176,7 @@ static Word16 rate2AMRWB_IOmode( Word32 brate /* i: bitrate */ ) { - switch ( brate ) + SWITCH( brate ) { /* EVS AMR-WB IO modes */ case SID_1k75: @@ -289,7 +289,7 @@ void push_indice_fx( /* new indice - find an empty slot in the list */ i = id; move16(); - WHILE( NE_16( hBstr->ind_list[i].nb_bits, -1 ) ) + WHILE( hBstr->ind_list[i].nb_bits != -1 ) { i = add( i, 1 ); } @@ -506,7 +506,7 @@ UWord16 get_indice_fx( /* o : value of the indice */ FOR( i = 0; i < nb_bits; i++ ) { value = lshl( value, 1 ); - value = add( value, st_fx->bit_stream[add( pos, i )] ); + value = add( value, st_fx->bit_stream[pos + i] ); } return value; @@ -703,62 +703,65 @@ void write_indices_buf_fx( UWord8 header; Word16 isAmrWb = 0; - if ( st_fx->bitstreamformat == G192 ) + IF( st_fx->bitstreamformat == G192 ) { /*-----------------------------------------------------------------* * Encode Sync Header and Frame Length *-----------------------------------------------------------------*/ pt_stream = stream; - for ( i = 0; i < ( 2 + MAX_BITS_PER_FRAME ); ++i ) + FOR( i = 0; i < ( 2 + MAX_BITS_PER_FRAME ); ++i ) { stream[i] = 0; + move16(); } //*pt_stream++ = (Word16) SYNC_GOOD_FRAME; //*pt_stream++ = hBstr->nb_bits_tot; *num_bits = hBstr->nb_bits_tot; - + move16(); /*----------------------------------------------------------------* * Bitstream packing (conversion of individual indices into a serial stream) * Writing the serial stream into file *----------------------------------------------------------------*/ - for ( i = 0; i < MAX_NUM_INDICES; i++ ) + FOR( i = 0; i < MAX_NUM_INDICES; i++ ) { - if ( hBstr->ind_list[i].nb_bits != -1 ) + IF( NE_16( hBstr->ind_list[i].nb_bits, -1 ) ) { /* mask from MSB to LSB */ - mask = 1 << ( hBstr->ind_list[i].nb_bits - 1 ); + mask = L_shl( 1, ( sub( hBstr->ind_list[i].nb_bits, 1 ) ) ); /* write bit by bit */ - for ( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) + FOR( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) { - if ( hBstr->ind_list[i].value & mask ) + IF( L_and( hBstr->ind_list[i].value, mask ) ) { //*pt_stream++ = G192_BIN1; *pt_stream++ = 1; + move16(); } - else + ELSE { //*pt_stream++ = G192_BIN0; *pt_stream++ = 0; + move16(); } - mask >>= 1; + mask = L_shr( mask, 1 ); } } } } - else + ELSE { /* Create and write ToC header */ /* qbit always set to 1 on encoder side for AMRWBIO , no qbit in use for EVS, but set to 0(bad) */ - header = (UWord8) ( st_fx->Opt_AMR_WB << 5 | st_fx->Opt_AMR_WB << 4 | rate2EVSmode( hBstr->nb_bits_tot * 50, &isAmrWb ) ); + header = (UWord8) ( s_or( s_or( shl( st_fx->Opt_AMR_WB, 5 ), shl( st_fx->Opt_AMR_WB, 4 ) ), rate2EVSmode( i_mult( hBstr->nb_bits_tot, 50 ), &isAmrWb ) ) ); // fwrite(&header, sizeof(UWord8), 1, file); memcpy( out_buf, &header, sizeof( UWord8 ) ); *num_bits += sizeof( UWord8 ); /* Write speech bits */ // fwrite(pFrame, sizeof(UWord8), (pFrame_size + 7) >> 3, file); - memcpy( out_buf, pFrame, sizeof( UWord8 ) * ( ( pFrame_size + 7 ) >> 3 ) ); - *num_bits += sizeof( UWord8 ) * ( ( pFrame_size + 7 ) >> 3 ); + memcpy( out_buf, pFrame, sizeof( UWord8 ) * ( shr( add( pFrame_size, 7 ), 3 ) ) ); + *num_bits += sizeof( UWord8 ) * ( shr( ( add( pFrame_size, 7 ) ), 3 ) ); } /* Clearing of indices */ @@ -769,7 +772,7 @@ void write_indices_buf_fx( } - if ( st_fx->bitstreamformat == G192 ) + IF( st_fx->bitstreamformat == G192 ) { /* write the serial stream into file */ // fwrite(stream, sizeof(unsigned short), 2 + stream[1], file); @@ -783,6 +786,9 @@ void write_indices_buf_fx( hBstr->nb_bits_tot = 0; hBstr->next_ind_fx = 0; hBstr->last_ind_fx = -1; + move16(); + move16(); + move16(); return; } @@ -920,7 +926,7 @@ void indices_to_serial_generic( FOR( k = 0; k < ind_list[i].nb_bits; k++ ) { pack_bit( ind_list[i].value & mask, &pt_pFrame, &omask ); - j++; + j = add( j, 1 ); mask = L_shr( mask, 1 ); } nb_bits_tot = add( nb_bits_tot, ind_list[i].nb_bits ); @@ -1194,7 +1200,7 @@ void decision_matrix_core_dec( move16(); } /* SC-VBR */ - ELSE IF( st->total_brate == PPP_NELP_2k80 ) + ELSE IF( EQ_32( st->total_brate, PPP_NELP_2k80 ) ) { st->core = ACELP_CORE; move16(); @@ -1232,7 +1238,7 @@ void decision_matrix_core_dec( /* find the section in the ACELP signalling table corresponding to bitrate */ start_idx = 0; move16(); - WHILE( NE_32( acelp_sig_tbl[start_idx], st->total_brate ) ) + WHILE( acelp_sig_tbl[start_idx] != st->total_brate ) { start_idx = add( start_idx, 1 ); } @@ -1245,7 +1251,7 @@ void decision_matrix_core_dec( start_idx = add( start_idx, 1 ); /* retrieve the signalling indice */ - ind = acelp_sig_tbl[add( start_idx, get_next_indice_fx( st, nBits ) )]; + ind = acelp_sig_tbl[start_idx + get_next_indice_fx( st, nBits )]; st->bwidth = extract_l( L_and( L_shr( ind, 3 ), 0x7 ) ); move16(); @@ -1573,6 +1579,8 @@ Word16 read_indices_fx( /* o : 1 = reading OK, 0 = problem /* read the Sync Header field from the bitstream */ /* in case rew_flag is set, read until first good frame is encountered */ + test(); + test(); DO { /* read the Sync header */ @@ -1647,9 +1655,8 @@ Word16 read_indices_fx( /* o : 1 = reading OK, 0 = problem fprintf( stderr, "\nError, invalid number of bits read ! Exiting ! \n" ); exit( -1 ); } - test(); } - WHILE( rew_flag && ( st->bfi || LT_32( total_brate, 2800 ) ) ); + WHILE( rew_flag && ( st->bfi || ( total_brate < 2800 ) ) ); /* G.192 RX DTX handler*/ IF( !rew_flag ) @@ -1807,8 +1814,8 @@ Word16 read_indices_fx( /* o : 1 = reading OK, 0 = problem test(); test(); test(); - if ( ( ( st->CNG_fx != 0 ) && ( ( speech_bad != 0 ) || ( speech_lost != 0 ) ) ) || /* SP_BAD or SPEECH_LOST) --> stay in CNG */ - ( sid_upd_bad != 0 ) ) /* SID_UPD_BAD --> start CNG */ + IF( ( ( st->CNG_fx != 0 ) && ( ( speech_bad != 0 ) || ( speech_lost != 0 ) ) ) || /* SP_BAD or SPEECH_LOST) --> stay in CNG */ + ( sid_upd_bad != 0 ) ) /* SID_UPD_BAD --> start CNG */ { st->bfi = 0; move16(); @@ -1844,7 +1851,7 @@ Word16 read_indices_fx( /* o : 1 = reading OK, 0 = problem { rewind( file ); st->total_brate = total_brate; - move16(); + move32(); return 1; } @@ -1938,7 +1945,7 @@ static Word32 read_indices_mime_handle_dtx( /* SID_UPDATE check */ test(); - IF( total_brate == SID_1k75 || total_brate == SID_2k40 ) + IF( EQ_32( total_brate, SID_1k75 ) || EQ_32( total_brate, SID_2k40 ) ) { IF( st->bfi == 0 ) { @@ -2210,7 +2217,6 @@ Word16 read_indices_mime( /* o : 1 = reading OK, 0 = problem isAMRWB_IOmode = 1; move16(); qbit = s_and( shr( header, 2 ), 0x01 ); /* b2 bit (b7 is the F bit ) */ - move16(); st->bfi = !qbit; move16(); core_mode = s_and( shr( header, 3 ), 0x0F ); /* b6..b3 */ @@ -2382,8 +2388,14 @@ Word16 read_indices_mime( /* o : 1 = reading OK, 0 = problem IF( st->bfi == 0 ) { /* select MODE1 or MODE2 in MIME */ - decoder_selectCodec( st, total_brate, *st->bit_stream ? G192_BIN1 : G192_BIN0 ); - + IF( *st->bit_stream ) + { + decoder_selectCodec( st, total_brate, G192_BIN1 ); + } + ELSE + { + decoder_selectCodec( st, total_brate, G192_BIN0 ); + } /* a change of the total bitrate should not be known to the decoder, if the received frame was truly lost */ st->total_brate = total_brate; move32(); @@ -2523,9 +2535,9 @@ void get_rfFlag( /* find the section in the ACELP signalling table corresponding to bitrate */ start_idx = 0; move16(); - WHILE( NE_32( acelp_sig_tbl[start_idx], st->total_brate ) ) + WHILE( acelp_sig_tbl[start_idx] != st->total_brate ) { - start_idx++; + start_idx = add( start_idx, 1 ); assert( ( start_idx < MAX_ACELP_SIG ) && "ERROR: start_idx larger than acelp_sig_tbl[].\n" ); } @@ -2725,12 +2737,12 @@ void get_NextCoderType_fx( FOR( k = 0; k < ACELP_13k20 / 50; k++ ) { - bit_stream[k] = (UWord8) s_and( shr( bitsteam[k / 8], sub( 7, ( k % 8 ) ) ), 0x1 ); + bit_stream[k] = (UWord8) s_and( shr( bitsteam[k / 8], sub( 7, s_and( k, 7 ) ) ), 0x1 ); move16(); } start_idx = 0; move16(); - WHILE( NE_32( acelp_sig_tbl[start_idx], ACELP_13k20 ) ) + WHILE( acelp_sig_tbl[start_idx] != ACELP_13k20 ) { start_idx = add( start_idx, 1 ); assert( ( start_idx < MAX_ACELP_SIG ) && "ERROR: start_idx larger than acelp_sig_tbl[].\n" ); @@ -2741,7 +2753,7 @@ void get_NextCoderType_fx( tmp = 0; move16(); - nBits_tmp = (Word16) acelp_sig_tbl[start_idx++]; + nBits_tmp = extract_l( acelp_sig_tbl[start_idx++] ); move16(); FOR( k = 0; k < nBits_tmp; k++ ) { @@ -2749,7 +2761,7 @@ void get_NextCoderType_fx( tmp = add( tmp, bit_stream[k] ); } /* retrieve the signalling indice */ - *next_coder_type = s_and( (Word16) acelp_sig_tbl[add( start_idx, tmp )], 0x7 ); + *next_coder_type = s_and( extract_l( acelp_sig_tbl[start_idx + tmp] ), 0x7 ); move16(); } @@ -2806,7 +2818,6 @@ void read_indices_from_djb_fx( move16(); no_data = st->CNG_fx != 0; move16(); - move16(); } test(); @@ -2833,7 +2844,7 @@ void read_indices_from_djb_fx( FOR( k = 0; k < num_bits; k++ ) { test(); - IF( st->bitstreamformat == VOIP_RTPDUMP && isAMRWB_IOmode ) + IF( EQ_16( st->bitstreamformat, VOIP_RTPDUMP ) && isAMRWB_IOmode ) { st->bit_stream[sort_ptr[core_mode][k]] = unpack_bit( &pt_stream, &mask ); move16(); @@ -2877,7 +2888,15 @@ void read_indices_from_djb_fx( IF( NE_16( st->bfi, 1 ) ) { /* select Mode 1 or Mode 2 */ - decoder_selectCodec( st, total_brate, *st->bit_stream ? G192_BIN1 : G192_BIN0 ); + IF( *st->bit_stream ) + { + decoder_selectCodec( st, total_brate, G192_BIN1 ); + } + ELSE + { + decoder_selectCodec( st, total_brate, G192_BIN0 ); + } + /* a change of the total bitrate should not be known to the decoder, if the received frame was truly lost */ st->total_brate = total_brate; @@ -2908,7 +2927,7 @@ static UWord16 get_indice_preview( bitstreamShortPtr = bitstreamShort; FOR( i = 0; i < bitstreamSize; i++ ) { - *bitstreamShortPtr++ = s_and( shr( bitstream[i / 8], sub( 7, ( i % 8 ) ) ), 0x1 ); + *bitstreamShortPtr++ = s_and( shr( bitstream[i / 8], sub( 7, ( s_and( i, 7 ) ) ) ), 0x1 ); move16(); } @@ -2918,7 +2937,7 @@ static UWord16 get_indice_preview( FOR( i = 0; i < nb_bits; i++ ) { value = shl( value, 1 ); - value = add( value, bitstreamShort[add( pos, i )] ); + value = add( value, bitstreamShort[pos + i] ); } return value; } @@ -2952,7 +2971,7 @@ void evs_dec_previewFrame( /* find the section in the ACELP signalling table corresponding to bitrate */ start_idx = 0; move16(); - WHILE( NE_32( acelp_sig_tbl[start_idx], total_brate ) ) + WHILE( acelp_sig_tbl[start_idx] != total_brate ) { start_idx = add( start_idx, 1 ); assert( ( start_idx < MAX_ACELP_SIG ) && "ERROR: start_idx larger than acelp_sig_tbl[].\n" ); @@ -2961,11 +2980,10 @@ void evs_dec_previewFrame( /* skip the bitrate */ start_idx = add( start_idx, 1 ); /* retrieve the number of bits */ - nBits = (Word16) acelp_sig_tbl[start_idx++]; - move16(); + nBits = extract_l( acelp_sig_tbl[start_idx++] ); /* retrieve the signalling indice */ - ind = acelp_sig_tbl[add( start_idx, get_indice_preview( bitstream, bitstreamSize, 0, nBits ) )]; + ind = acelp_sig_tbl[( start_idx + get_indice_preview( bitstream, bitstreamSize, 0, nBits ) )]; move32(); /* convert signalling indice into RF flag. */ diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 01a6d4828..2b696a4b1 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -2156,8 +2156,7 @@ void calculate_hodirac_sector_parameters_fx( return; } -#endif - +#else void calculate_hodirac_sector_parameters( DIRAC_ENC_HANDLE hDirAC, /* i : DirAC handle */ float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector (L+1)^2 x N_bins, real part */ @@ -2350,6 +2349,7 @@ void calculate_hodirac_sector_parameters( return; } +#endif /*-----------------------------------------------------------------------* diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index a2aada6a9..75c7d206f 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -4934,19 +4934,47 @@ void ivas_sba2mc_cldfb_fixed( * DirAC prototypes *----------------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_dirac_enc_open_fx( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +); +#else ivas_error ivas_dirac_enc_open( Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ); +#endif ivas_error ivas_dirac_enc_reconfigure( Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ); +#ifdef IVAS_FLOAT_FIXED +void ivas_dirac_enc_close_fx( + DIRAC_ENC_HANDLE *hDirAC, /* i/o: encoder DirAC handle */ + const Word32 input_Fs /* i : input sampling_rate */ +); +#else void ivas_dirac_enc_close( DIRAC_ENC_HANDLE *hDirAC, /* i/o: encoder DirAC handle */ const int32_t input_Fs /* i : input sampling_rate */ ); +#endif +#ifdef IVAS_FLOAT_FIXED +ivas_error ivas_dirac_enc_fx( + DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ + Word32 *data_f[], /* i/o: SBA channels */ + Word32 **ppIn_FR_real, /* o : real freq domain values */ + Word32 **ppIn_FR_imag, /* o : imag freq domain values */ + Word16 pp_fr_q, + const int16_t input_frame, /* i : input frame length */ + const int16_t dtx_vad, /* i : DTX vad flag */ + const IVAS_FORMAT ivas_format, /* i : ivas format */ + const int16_t hodirac_flag /* i : hodirac flag */ +); +#else ivas_error ivas_dirac_enc( DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ @@ -4959,6 +4987,7 @@ ivas_error ivas_dirac_enc( const IVAS_FORMAT ivas_format, /* i : ivas format */ const int16_t hodirac_flag /* i : hodirac flag */ ); +#endif ivas_error ivas_dirac_config( void *st_ivas, /* i/o: IVAS encoder/decoder state structure */ @@ -5179,8 +5208,7 @@ void calculate_hodirac_sector_parameters_fx( Word32 *ene_fx, /* o : array of sector energy values, flat */ Word16 *ene_exp /* o : array of sector energy exponents, flat */ ); -#endif - +#else void calculate_hodirac_sector_parameters( DIRAC_ENC_HANDLE hDirAC, float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX],/* i : signal vector (L+1)^2 x N_bins, real part */ @@ -5194,6 +5222,7 @@ void calculate_hodirac_sector_parameters( float *diff, /* o : array of sector diffuseness values, flat */ float *ene /* o : array of sector energy values, flat */ ); +#endif #ifdef IVAS_FLOAT_FIXED void ivas_mc_paramupmix_enc_fx( @@ -6239,19 +6268,17 @@ void ivas_spar_md_enc_close( ivas_error ivas_spar_md_enc_process_fx( ivas_spar_md_enc_state_t *hMdEnc, /* i/o: SPAR MD encoder handle */ const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ - float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], Word32 *cov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], Word16 *cov_real_q[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], Word32 *cov_dtx_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], Word16 *cov_dtx_real_q[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ - const int16_t dtx_vad, - const int16_t nchan_inp, - const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const Word16 dtx_vad, + const Word16 nchan_inp, + const Word16 sba_order, /* i : Ambisonic (SBA) order */ float *prior_mixer[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH], /* i : prior mixer_matrix */ - const int16_t dyn_active_w_flag, /* i : flag to indicate dynamic active W */ - const int16_t dirac_mono_flag /* i : flag to indicate mono only mode in SBA */ + const Word16 dyn_active_w_flag, /* i : flag to indicate dynamic active W */ + const Word16 dirac_mono_flag /* i : flag to indicate mono only mode in SBA */ ); #else ivas_error ivas_spar_md_enc_process( @@ -6268,35 +6295,6 @@ ivas_error ivas_spar_md_enc_process( const int16_t dirac_mono_flag /* i : flag to indicate mono only mode in SBA */ ); #endif -void ivas_compute_spar_params( - float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], - const int16_t i_ts, - float ***mixer_mat, - const int16_t start_band, - const int16_t end_band, - const int16_t dtx_vad, - const int16_t num_ch, - const int16_t bands_bw, - const int16_t active_w, - const int16_t active_w_vlbr, - ivas_spar_md_com_cfg *hSparCfg, - ivas_spar_md_t *hSparMd, - float *pWscale, - const int16_t from_dirac, - const int16_t dyn_active_w_flag -); - -void ivas_create_fullr_dmx_mat( - float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], - float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], - float ***mixer_mat, - const int16_t in_chans, - const int16_t start_band, - const int16_t end_band, - const int16_t active_w, - ivas_spar_md_com_cfg *hMdCfg -); #ifdef IVAS_FLOAT_FIXED void ivas_create_fullr_dmx_mat_fx( @@ -6314,19 +6312,6 @@ void ivas_create_fullr_dmx_mat_fx( ); #endif // IVAS_FLOAT_FIXED - -void ivas_calc_c_p_coeffs( - ivas_spar_md_t *pSparMd, - float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - const int16_t i_ts, - float ***mixer_mat, - const int16_t num_ch, - const int16_t num_dmx, - const int16_t band_idx, - const int16_t dtx_vad, - const int16_t compute_p_flag, - const int16_t dyn_active_w_flag -); #ifdef IVAS_FLOAT_FIXED void ivas_get_spar_md_from_dirac_fx( Word32 azi_dirac_fx[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], // Q22 @@ -6347,23 +6332,6 @@ void ivas_get_spar_md_from_dirac_fx( const Word16 dyn_active_w_flag ); #endif -void ivas_get_spar_md_from_dirac( - float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - float diffuseness[IVAS_MAX_NUM_BANDS], - const int16_t n_ts, - float ***mixer_mat, - ivas_spar_md_t *hSpar_md, - ivas_spar_md_com_cfg *hSpar_md_cfg, - const int16_t start_band, - const int16_t end_band, - const int16_t order, - const int16_t dtx_vad, - float Wscale_d[IVAS_MAX_NUM_BANDS], - const uint8_t useLowerRes, - const int16_t active_w_vlbr, - const int16_t dyn_active_w_flag -); /*! r: number of MD subframes */ #ifdef IVAS_FLOAT_FIXED @@ -7044,6 +7012,16 @@ void ivas_quantise_real_values_fx( Word32 *quant_fx, const Word16 dim); +void ivas_quantise_real_values_enc_fx_varq( + const Word32 *values_fx, + const Word16 q_levels, + const Word32 min_value_fx, + const Word32 max_value_fx, + Word16 *index, + Word32 *quant_fx, + const Word16 dim, + Word16 inp_q ); + void ivas_quantise_real_values_enc_fx( const Word32 *values_fx,//Q28 const Word16 q_levels, @@ -7102,11 +7080,6 @@ void ivas_copy_band_coeffs_idx_to_arr( ); #endif -void ivas_clear_band_coeffs( - ivas_band_coeffs_t *pband_coeffs, - const uint16_t num_bands -); - void ivas_clear_band_coeffs_fx( ivas_band_coeffs_t *pband_coeffs, const UWord16 num_bands); diff --git a/lib_com/ivas_qmetadata_com.c b/lib_com/ivas_qmetadata_com.c index 3bb90ec8d..a16a4be54 100644 --- a/lib_com/ivas_qmetadata_com.c +++ b/lib_com/ivas_qmetadata_com.c @@ -192,9 +192,10 @@ ivas_error ivas_qmetadata_allocate_memory( set32_fx( hQMetaData->q_direction[dir].band_data[j].q_azimuth_fx, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); #endif #endif - set_zero( hQMetaData->q_direction[dir].band_data[j].energy_ratio, MAX_PARAM_SPATIAL_SUBFRAMES ); #ifdef IVAS_FLOAT_FIXED set32_fx( hQMetaData->q_direction[dir].band_data[j].energy_ratio_fx, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); +#else + set_zero( hQMetaData->q_direction[dir].band_data[j].energy_ratio, MAX_PARAM_SPATIAL_SUBFRAMES ); #endif } } diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 9d21cfbb4..f70a74d6e 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -154,17 +154,6 @@ static void ivas_calc_post_pred_per_band_fx( Word32 *cov_real[IVAS_SPAR_MAX_CH][ static Word16 ivas_is_mat_inv_fx( Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM], Word16 q_in_re, const Word16 dim ); static void ivas_calc_mat_inv_fx( Word32 in_re[MAX_MAT_DIM][MAX_MAT_DIM], Word16 q_in_re, const Word16 dim, Word32 out_re[MAX_MAT_DIM][MAX_MAT_DIM], Word16 *q_out_re ); #endif -static void ivas_get_pred_coeffs( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], float ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], const int16_t in_chans, const int16_t start_band, const int16_t end_band, const int16_t active_w, const int16_t active_w_vlbr, const int16_t dtx_vad, const int16_t from_dirac, const int16_t dyn_active_w_flag, const int16_t res_ind ); - -static void ivas_reorder_array( float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS], const int16_t in_chans, const int16_t order[IVAS_SPAR_MAX_CH], float ***mixer_mat, const int16_t start_band, const int16_t end_band ); - -static void ivas_get_Wscaling_factor( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], float ***mixer_mat, const int16_t start_band, const int16_t end_band, const int16_t dtx_vad, const int16_t num_ch, const int16_t *pNum_dmx, const int16_t bands_bw, const int16_t active_w, const int16_t active_w_vlbr, float *pWscale, const int16_t dyn_active_w_flag ); - -static void ivas_calc_post_pred_per_band( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float ***mixer_mat, const int16_t num_ch, const int16_t band_idx, float postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] ); - -static int16_t ivas_is_mat_inv( float in_re[MAX_MAT_DIM][MAX_MAT_DIM], const int16_t dim ); - -static void ivas_calc_mat_inv( float in_re[MAX_MAT_DIM][MAX_MAT_DIM], const int16_t dim, float out_re[MAX_MAT_DIM][MAX_MAT_DIM] ); /*-----------------------------------------------------------------------------------------* * Function ivas_get_bw_idx_from_sample_rate() @@ -528,212 +517,6 @@ Word16 ivas_get_sba_num_TCs_fx( * Calculation of prediction coefficients *-----------------------------------------------------------------------------------------*/ -static void ivas_get_pred_coeffs( - float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - float ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], - float ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], - const int16_t in_chans, - const int16_t start_band, - const int16_t end_band, - const int16_t active_w, - const int16_t active_w_vlbr, - const int16_t dtx_vad, - const int16_t from_dirac, - const int16_t dyn_active_w_flag, - const int16_t res_ind ) -{ - int16_t i, j, k, b; - float abs_value; - float w_norm_fac; - float div_factor[IVAS_MAX_NUM_BANDS]; - int16_t pred_dim = in_chans - 1; - - w_norm_fac = ( from_dirac == 1 ) ? 1.0f : 3.0f; - - if ( active_w == 0 ) - { - float pPred_temp[IVAS_MAX_NUM_BANDS]; - - set_zero( pPred_temp, IVAS_MAX_NUM_BANDS ); - for ( k = start_band; k < end_band; k++ ) - { - div_factor[k] = max( 1e-20f, cov_real[0][0][k] ); - div_factor[k] = 1 / div_factor[k]; - } - - for ( i = 0; i < pred_dim; i++ ) - { - for ( k = start_band; k < end_band; k++ ) - { - ppPred_coeffs_re[i][k] = cov_real[i + 1][0][k] * div_factor[k]; - - IVAS_CALCULATE_SQ_ABS_N( ppPred_coeffs_re[i][k], abs_value ); - - pPred_temp[k] += abs_value; - } - } - - for ( k = start_band; k < end_band; k++ ) - { - pPred_temp[k] = sqrtf( pPred_temp[k] ); - div_factor[k] = max( 1.0f, pPred_temp[k] ); - div_factor[k] = 1 / div_factor[k]; - } - - for ( i = 0; i < pred_dim; i++ ) - { - for ( k = start_band; k < end_band; k++ ) - { - ppPred_coeffs_re[i][k] = ppPred_coeffs_re[i][k] * div_factor[k]; - ppDM_Fv_re[i][k] = 0; - } - } - } - else - { - float dm_alpha[IVAS_MAX_NUM_BANDS], dm_v_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; - float real[IVAS_SPAR_MAX_CH - 1], dm_beta_re = 0, dm_g[IVAS_MAX_NUM_BANDS]; - float dm_f_local, dm_w, dm_y, DM_F[IVAS_MAX_NUM_BANDS]; - float num_f, den_f, passive_g; - float activew_quad_thresh, g_th_sq; - - if ( dyn_active_w_flag == 1 ) - { - activew_quad_thresh = 1.0f; - } - else - { - activew_quad_thresh = IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH; - } - g_th_sq = activew_quad_thresh * activew_quad_thresh; - - set_zero( dm_alpha, IVAS_MAX_NUM_BANDS ); - - for ( i = 1; i < in_chans; i++ ) - { - for ( k = start_band; k < end_band; k++ ) - { - IVAS_CALCULATE_SQ_ABS_N( cov_real[i][0][k], abs_value ); - dm_alpha[k] += abs_value; - } - } - - for ( k = start_band; k < end_band; k++ ) - { - dm_alpha[k] = sqrtf( dm_alpha[k] ); - div_factor[k] = max( dm_alpha[k], 1e-20f ); - div_factor[k] = 1 / div_factor[k]; - } - - for ( i = 0; i < pred_dim; i++ ) - { - for ( k = start_band; k < end_band; k++ ) - { - dm_v_re[i][k] = cov_real[i + 1][0][k] * div_factor[k]; - } - } - - if ( dtx_vad == 0 ) - { - dm_f_local = IVAS_ACTIVEW_DM_F_DTX; - } - else - { - dm_f_local = ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_VLBR : IVAS_ACTIVEW_DM_F; - } - - for ( b = start_band; b < end_band; b++ ) - { - set_zero( real, pred_dim ); - - for ( j = 0; j < pred_dim; j++ ) - { - for ( k = 1; k < in_chans; k++ ) - { - float re; - - IVAS_RMULT_FLOAT( cov_real[j + 1][k][b], dm_v_re[k - 1][b], re ); - real[j] += re; - } - } - dm_beta_re = 0; - for ( k = 0; k < pred_dim; k++ ) - { - float re; - IVAS_RMULT_FLOAT( real[k], dm_v_re[k][b], re ); - dm_beta_re += re; - } - - dm_w = cov_real[0][0][b]; - den_f = max( dm_w, 1e-20f ); - passive_g = dm_alpha[b] / den_f; - - if ( dyn_active_w_flag == 1 ) - { - dm_alpha[b] = 0.0f; - dm_w = 0.0f; - for ( i = 0; i < pred_dim; i++ ) - { - dm_v_re[i][b] = 0.0f; - } - dm_v_re[res_ind - 1][b] = 1.0f; - passive_g = activew_quad_thresh; - } - - if ( passive_g < activew_quad_thresh ) - { - /*linear activeW*/ - dm_y = 0; - - for ( k = 1; k < in_chans; k++ ) - { - dm_y += cov_real[k][k][b]; - } - den_f = max( dm_y, 1e-20f ); - den_f = max( den_f, w_norm_fac * dm_w ); - DM_F[b] = ( dm_f_local * dm_alpha[b] ) / den_f; - DM_F[b] = min( 1.0f, DM_F[b] ); - - den_f = dm_w + ( 2 * dm_alpha[b] * DM_F[b] ) + ( DM_F[b] * DM_F[b] * dm_beta_re ); - den_f = max( den_f, 1e-20f ); - - dm_g[b] = ( dm_alpha[b] + ( DM_F[b] * dm_beta_re ) ) / den_f; - } - else - { - float sqrt_val; - - /* quadratic activeW */ - - num_f = ( dm_beta_re - ( 2 * dm_alpha[b] * activew_quad_thresh ) ); - - sqrt_val = 4 * dm_alpha[b] * dm_alpha[b] * g_th_sq; - sqrt_val += dm_beta_re * dm_beta_re; - sqrt_val -= 4 * dm_beta_re * g_th_sq * dm_w; - sqrt_val = sqrtf( sqrt_val ); - num_f += sqrt_val; - - den_f = 2 * dm_beta_re * g_th_sq; - den_f = max( den_f, 1e-20f ); - dm_g[b] = activew_quad_thresh; - DM_F[b] = ( dm_g[b] * num_f ) / den_f; - } - } - - for ( i = 0; i < pred_dim; i++ ) - { - for ( b = start_band; b < end_band; b++ ) - { - ppPred_coeffs_re[i][b] = dm_v_re[i][b] * dm_g[b]; - - ppDM_Fv_re[i][b] = dm_v_re[i][b] * DM_F[b]; - } - } - } - - return; -} - #ifdef IVAS_FLOAT_FIXED /*-----------------------------------------------------------------------------------------* * Function ivas_get_pred_coeffs_fx() @@ -801,13 +584,13 @@ static void ivas_get_pred_coeffs_enc_fx( { FOR( k = start_band; k < end_band; k++ ) { - tmp64 = W_mult_32_16( cov_real[add( i, 1 )][0][k], div_factor[k] ); + tmp64 = W_mult_32_16( cov_real[i + 1][0][k], div_factor[k] ); tmp_shift = W_norm( tmp64 ); IF( tmp64 != 0 ) { 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 move32(); - q_ppPred_coeffs_re[i][k] = add( sub( add( q_cov_real[add( i, 1 )][0][k], tmp_shift ), div_factor_e[k] ), 1 + 15 - 32 ); + 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 ); move16(); } ELSE @@ -996,13 +779,13 @@ static void ivas_get_pred_coeffs_enc_fx( { FOR( k = start_band; k < end_band; k++ ) { - tmp64 = W_mult_32_16( cov_real[add( i, 1 )][0][k], div_factor[k] ); + tmp64 = W_mult_32_16( cov_real[i + 1][0][k], div_factor[k] ); tmp_shift = W_norm( tmp64 ); IF( tmp64 != 0 ) { 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 move32(); - dm_v_re_q[i][k] = add( sub( add( q_cov_real[add( i, 1 )][0][k], tmp_shift ), div_factor_e[k] ), 1 + 15 - 32 ); + 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 ); move16(); } ELSE @@ -1044,11 +827,11 @@ static void ivas_get_pred_coeffs_enc_fx( FOR( k = 1; k < in_chans; k++ ) { // IVAS_RMULT_FLOAT( cov_real[j + 1][k][b], dm_v_re[k - 1][b], re ); - re = W_mult0_32_32( cov_real[add( j, 1 )][k][b], dm_v_re[sub( k, 1 )][b] ); + re = W_mult0_32_32( cov_real[j + 1][k][b], dm_v_re[k - 1][b] ); tmp_shift = W_norm( re ); IF( re != 0 ) { - q_tmp = sub( add( add( q_cov_real[add( j, 1 )][k][b], dm_v_re_q[sub( k, 1 )][b] ), tmp_shift ), 32 ); + q_tmp = sub( add( add( q_cov_real[j + 1][k][b], dm_v_re_q[k - 1][b] ), tmp_shift ), 32 ); } ELSE { @@ -1146,7 +929,7 @@ static void ivas_get_pred_coeffs_enc_fx( dm_v_re_q[i][b] = 31; move16(); } - dm_v_re[sub( res_ind, 1 )][b] = MAX_32; + dm_v_re[res_ind - 1][b] = MAX_32; move32(); dm_v_re_q[i][b] = 31; move16(); @@ -1525,7 +1308,7 @@ static void ivas_get_pred_coeffs_fx( { FOR( k = start_band; k < end_band; k++ ) { - ppPred_coeffs_re[i][k] = Mpy_32_32( cov_real[add( i, 1 )][0][k], div_factor[k] ); // Q30 + temp_shift - 31 => tmp_shift - 1 + ppPred_coeffs_re[i][k] = Mpy_32_32( cov_real[i + 1][0][k], div_factor[k] ); // Q30 + temp_shift - 31 => tmp_shift - 1 move32(); // IVAS_CALCULATE_SQ_ABS_N( ppPred_coeffs_re[i][k], abs_value ); @@ -1751,8 +1534,8 @@ static void ivas_get_pred_coeffs_fx( Word32 re; // IVAS_RMULT_FLOAT( cov_real[j + 1][k][b], dm_v_re[k - 1][b], re ); - re = Mpy_32_32( cov_real[add( j, 1 )][k][b], dm_v_re[sub( k, 1 )][b] ); // Q30 + Q_div_factor - 1 - 31 - real[j] = L_add( real[j], re ); // tmp_shift - 2 + re = Mpy_32_32( cov_real[j + 1][k][b], dm_v_re[k - 1][b] ); // Q30 + Q_div_factor - 1 - 31 + real[j] = L_add( real[j], re ); // tmp_shift - 2 move32(); } } @@ -1788,12 +1571,12 @@ static void ivas_get_pred_coeffs_fx( } IF( NE_16( sub( tmp_shift, 1 ), 31 ) ) { - dm_v_re[sub( res_ind, 1 )][b] = L_shl( 1, sub( tmp_shift, 1 ) ); + dm_v_re[res_ind - 1][b] = L_shl( 1, sub( tmp_shift, 1 ) ); move32(); } ELSE { - dm_v_re[sub( res_ind, 1 )][b] = MAX_32; + dm_v_re[res_ind - 1][b] = MAX_32; move32(); } passive_g = activew_quad_thresh; @@ -1917,71 +1700,6 @@ static void ivas_get_pred_coeffs_fx( * Calculation of scaling factor for post predicted W channel *-----------------------------------------------------------------------------------------*/ -static void ivas_get_Wscaling_factor( - float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], - float ***mixer_mat, - const int16_t start_band, - const int16_t end_band, - const int16_t dtx_vad, - const int16_t num_ch, - const int16_t *pNum_dmx, - const int16_t bands_bw, - const int16_t active_w, - const int16_t active_w_vlbr, - float *pWscale, - const int16_t dyn_active_w_flag ) -{ - int16_t b, ch; - float dm_f_local, abs_val; - float postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; - - for ( ch = 0; ch < IVAS_SPAR_MAX_CH; ch++ ) - { - set_zero( postpred_cov_re[ch], IVAS_SPAR_MAX_CH ); - } - - if ( dtx_vad == 0 ) - { - dm_f_local = IVAS_ACTIVEW_DM_F_SCALE_DTX; - } - else - { - dm_f_local = ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR : IVAS_ACTIVEW_DM_F_SCALE; - } - - for ( b = start_band; b < end_band; b++ ) - { - pWscale[b] = 1; - - if ( ( active_w == 1 ) && ( dyn_active_w_flag == 0 ) ) - { - float Gw_sq, g_sq = 0; - - if ( num_ch != pNum_dmx[b * bands_bw] ) - { - ivas_calc_post_pred_per_band( cov_real, mixer_mat, num_ch, b, postpred_cov_re ); - } - - Gw_sq = cov_real[0][0][b] / max( postpred_cov_re[0][0], IVAS_FLT_EPS ); - - for ( ch = 0; ch < num_ch - 1; ch++ ) - { - IVAS_CALCULATE_SQ_ABS_N( pred_coeffs_re[ch][b], abs_val ); - - g_sq += abs_val; - } - - pWscale[b] = sqrtf( Gw_sq ); - pWscale[b] = pWscale[b] + sqrtf( Gw_sq + ( 4 * dm_f_local * g_sq ) ); - pWscale[b] *= 0.5f; - } - } - - return; -} - - #ifdef IVAS_FLOAT_FIXED static void ivas_get_Wscaling_factor_enc_fx( @@ -2033,9 +1751,9 @@ static void ivas_get_Wscaling_factor_enc_fx( FOR( b = start_band; b < end_band; b++ ) { - pWscale[b] = 1; + pWscale[b] = ONE_IN_Q31; move32(); - q_pWscale[b] = 0; + q_pWscale[b] = Q31; move16(); test(); @@ -2047,7 +1765,7 @@ static void ivas_get_Wscaling_factor_enc_fx( g_sq = 0; move32(); - IF( NE_16( num_ch, pNum_dmx[i_mult( b, bands_bw )] ) ) + IF( NE_16( num_ch, pNum_dmx[b * bands_bw] ) ) { 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 ); } @@ -2159,7 +1877,7 @@ static void ivas_get_Wscaling_factor_fx( g_sq = 0; move32(); - IF( NE_16( num_ch, pNum_dmx[i_mult( b, bands_bw )] ) ) + IF( NE_16( num_ch, pNum_dmx[b * bands_bw] ) ) { 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 ); } @@ -2217,111 +1935,6 @@ static void ivas_get_Wscaling_factor_fx( * Calculation of downmix matrix *-----------------------------------------------------------------------------------------*/ -void ivas_create_fullr_dmx_mat( - float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], - float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], - float ***mixer_mat, - const int16_t in_chans, - const int16_t start_band, - const int16_t end_band, - const int16_t active_w, - ivas_spar_md_com_cfg *hMdCfg ) -{ - int16_t i, j, k, b; - const int16_t *order; - float tmp_p1_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; - float tmp_p2_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; - float down_mix_mat1_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; - int16_t remix_unmix_order; - int16_t nbands; - nbands = end_band - start_band; - remix_unmix_order = hMdCfg->remix_unmix_order; - - order = remix_order_set[remix_unmix_order]; - - for ( i = 0; i < in_chans; i++ ) - { - for ( j = 0; j < in_chans; j++ ) - { - set_zero( &tmp_p1_re[i][j][start_band], nbands ); - set_zero( &tmp_p2_re[i][j][start_band], nbands ); - set_zero( &down_mix_mat1_re[i][j][start_band], nbands ); - } - } - - for ( j = 0; j < in_chans; j++ ) - { - for ( b = start_band; b < end_band; b++ ) - { - tmp_p2_re[j][j][b] = 1.0f; - } - } - - for ( j = 1; j < in_chans; j++ ) - { - for ( b = start_band; b < end_band; b++ ) - { - tmp_p2_re[j][0][b] = -pred_coeffs_re[j - 1][b]; - } - } - - if ( active_w == 1 ) - { - for ( j = 0; j < in_chans; j++ ) - { - for ( b = start_band; b < end_band; b++ ) - { - tmp_p1_re[j][j][b] = 1.0f; - } - } - - for ( j = 1; j < in_chans; j++ ) - { - for ( b = start_band; b < end_band; b++ ) - { - tmp_p1_re[0][j][b] = dm_fv_re[j - 1][b]; - } - } - - /* 4x4 mult */ - for ( i = 0; i < in_chans; i++ ) - { - for ( j = 0; j < in_chans; j++ ) - { - for ( k = 0; k < in_chans; k++ ) - { - for ( b = start_band; b < end_band; b++ ) - { - float tmp_re; - IVAS_RMULT_FLOAT( tmp_p2_re[i][k][b], tmp_p1_re[k][j][b], tmp_re ); - down_mix_mat1_re[i][j][b] += tmp_re; - } - } - } - } - } - else - { - for ( j = 0; j < in_chans; j++ ) - { - for ( k = 0; k < in_chans; k++ ) - { - for ( b = start_band; b < end_band; b++ ) - { - down_mix_mat1_re[j][k][b] = tmp_p2_re[j][k][b]; - } - } - } - } - - if ( remix_unmix_order != 3 ) - { - ivas_reorder_array( down_mix_mat1_re, in_chans, order, mixer_mat, start_band, end_band ); - } - - return; -} - #ifdef IVAS_FLOAT_FIXED void ivas_create_fullr_dmx_mat_fx( @@ -2380,7 +1993,7 @@ void ivas_create_fullr_dmx_mat_fx( { FOR( b = start_band; b < end_band; b++ ) { - tmp_p2_re[j][0][b] = L_negate( pred_coeffs_re[sub( j, 1 )][b] ); + tmp_p2_re[j][0][b] = L_negate( pred_coeffs_re[j - 1][b] ); move32(); max_val_tmp_p2 = L_max( max_val_tmp_p2, L_abs( tmp_p2_re[j][0][b] ) ); } @@ -2408,7 +2021,7 @@ void ivas_create_fullr_dmx_mat_fx( { FOR( b = start_band; b < end_band; b++ ) { - tmp_p1_re[0][j][b] = dm_fv_re[sub( j, 1 )][b]; + tmp_p1_re[0][j][b] = dm_fv_re[j - 1][b]; move32(); max_val = L_max( max_val, L_abs( tmp_p1_re[0][j][b] ) ); } @@ -2469,32 +2082,6 @@ void ivas_create_fullr_dmx_mat_fx( * reorders the input matrix based on order *-----------------------------------------------------------------------------------------*/ -static void ivas_reorder_array( - float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS], - const int16_t in_chans, - const int16_t order[IVAS_SPAR_MAX_CH], - float ***mixer_mat, - const int16_t start_band, - const int16_t end_band ) -{ - int16_t i, j, b, idx; - - for ( i = 0; i < in_chans; i++ ) - { - idx = order[i]; - - for ( j = 0; j < in_chans; j++ ) - { - for ( b = start_band; b < end_band; b++ ) - { - mixer_mat[i][j][b] = in_re[idx][j][b]; - } - } - } - - return; -} - #ifdef IVAS_FLOAT_FIXED static void ivas_reorder_array_fx( Word32 in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS], @@ -2531,70 +2118,6 @@ static void ivas_reorder_array_fx( * Calculate post pred mat per band *-----------------------------------------------------------------------------------------*/ -static void ivas_calc_post_pred_per_band( - float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - float ***mixer_mat, - const int16_t num_ch, - const int16_t band_idx, - float postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] ) -{ - int16_t i, j, k; - float dmx_mat_conj[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; - float temp_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; - float tmp_re; - - for ( i = 0; i < num_ch; i++ ) - { - for ( j = 0; j < num_ch; j++ ) - { - dmx_mat_conj[i][j] = mixer_mat[j][i][band_idx]; - } - } - - for ( i = 0; i < num_ch; i++ ) - { - set_zero( postpred_cov_re[i], num_ch ); - } - - /* num_ch x num_ch mult */ - for ( i = 0; i < num_ch; i++ ) - { - for ( j = 0; j < num_ch; j++ ) - { - temp_mat[i][j] = 0; - for ( k = 0; k < num_ch; k++ ) - { - IVAS_RMULT_FLOAT( cov_real[i][k][band_idx], dmx_mat_conj[k][j], tmp_re ); - temp_mat[i][j] += tmp_re; - } - } - } - - /* num_ch x num_ch mult */ - for ( i = 0; i < num_ch; i++ ) - { - for ( j = i; j < num_ch; j++ ) - { - for ( k = 0; k < num_ch; k++ ) - { - IVAS_RMULT_FLOAT( mixer_mat[i][k][band_idx], temp_mat[k][j], tmp_re ); - postpred_cov_re[i][j] += tmp_re; - } - } - } - - for ( i = 0; i < num_ch; i++ ) - { - for ( j = 0; j < i; j++ ) - { - postpred_cov_re[i][j] = postpred_cov_re[j][i]; - } - } - - return; -} - - #ifdef IVAS_FLOAT_FIXED static void ivas_calc_post_pred_per_band_enc_fx( @@ -2879,198 +2402,9 @@ static void ivas_calc_post_pred_per_band_fx( * * Calculate P coeffs per band *-----------------------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED -static void ivas_calc_p_coeffs_per_band( - ivas_spar_md_t *pSparMd, - const int16_t i_ts, - float postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - const int16_t num_ch, - const int16_t dtx_vad, - const int16_t num_dmx, - const int16_t band_idx ) -{ - int16_t i, j, k; - int16_t m; - float factor = 0; - float recon_uu_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS]; - float trace = 0; - float p_norm_scaling = 0; - float cov_dd_re[IVAS_SPAR_MAX_CH - 1][IVAS_SPAR_MAX_CH - 1]; - float cov_uu_re[IVAS_SPAR_MAX_CH - 1][IVAS_SPAR_MAX_CH - 1]; - int16_t b_ts_idx; - - b_ts_idx = band_idx + i_ts * IVAS_MAX_NUM_BANDS; - - if ( num_dmx != num_ch ) - { - set_zero( pSparMd->band_coeffs[b_ts_idx].P_re, IVAS_SPAR_MAX_CH - 1 ); - set32_fx( pSparMd->band_coeffs[b_ts_idx].P_re_fx, 0, IVAS_SPAR_MAX_CH - 1 ); - for ( i = 0; i < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; i++ ) - { - set_zero( recon_uu_re[i], IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ); - } - - for ( i = num_dmx; i < num_ch; i++ ) - { - for ( j = num_dmx; j < num_ch; j++ ) - { - cov_uu_re[i - num_dmx][j - num_dmx] = postpred_cov_re[i][j]; - } - } - - if ( dtx_vad == 1 ) - { - for ( i = 1; i < num_dmx; i++ ) - { - for ( j = 1; j < num_dmx; j++ ) - { - cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; - } - } - - if ( num_dmx == 2 ) - { - float re1, re2; - - IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[0][0], cov_dd_re[0][0], re1 ); - IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[1][0], cov_dd_re[0][0], re2 ); - IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[0][0], re1, recon_uu_re[0][0] ); - IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[1][0], re1, recon_uu_re[0][1] ); - IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[0][0], re2, recon_uu_re[1][0] ); - IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[1][0], re2, recon_uu_re[1][1] ); - - for ( i = 0; i < 2; i++ ) - { - for ( j = 0; j < 2; j++ ) - { - cov_uu_re[i][j] -= recon_uu_re[i][j]; - } - } - } - else if ( num_dmx == 3 ) - { - float re1[2], re2; - set_f( re1, 0, 2 ); - - for ( j = 0; j < 2; j++ ) - { - for ( k = 0; k < 2; k++ ) - { - float re; - - IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[0][k], cov_dd_re[k][j], re ); - re1[j] += re; - } - } - - IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[0][0], re1[0], re2 ); - recon_uu_re[0][0] = re2; - IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[0][1], re1[1], re2 ); - recon_uu_re[0][0] += re2; - - cov_uu_re[0][0] -= recon_uu_re[0][0]; - } - else if ( num_dmx == 4 ) - { - /* Step 1: Multiply C * cov_dd * C' */ - float re1[3], re; - - for ( i = 0; i < num_ch - num_dmx; i++ ) - { - set_f( re1, 0, 3 ); - for ( m = 0; m < num_dmx - 1; m++ ) - { - for ( k = 0; k < num_dmx - 1; k++ ) - { - IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[i][k], cov_dd_re[k][m], re ); - re1[m] += re; - } - } - for ( j = 0; j < num_ch - num_dmx; j++ ) - { - for ( m = 0; m < num_dmx - 1; m++ ) - { - IVAS_RMULT_FLOAT( pSparMd->band_coeffs[b_ts_idx].C_re[j][m], re1[m], re ); - recon_uu_re[i][j] += re; - } - } - } - - /* Step 2: cov_uu - recon_uu */ - for ( i = 0; i < num_ch - num_dmx; i++ ) - { - for ( j = 0; j < num_ch - num_dmx; j++ ) - { - cov_uu_re[i][j] -= recon_uu_re[i][j]; - } - } - } - } - - p_norm_scaling = IVAS_P_NORM_SCALING; - - if ( ( dtx_vad == 0 ) && ( num_dmx == 1 ) ) - { - p_norm_scaling = IVAS_P_NORM_SCALING_DTX; - } - - trace = 0.0f; - - for ( i = num_dmx; i < num_ch; i++ ) - { - float tmp_out; - IVAS_CALCULATE_RABS( cov_uu_re[i - num_dmx][i - num_dmx], tmp_out ); - trace += tmp_out; - } - - factor = max( 1e-20f, postpred_cov_re[0][0] ); - factor = max( factor, ( p_norm_scaling * trace ) ); - factor = 1 / factor; - - /* normalise Hermitian (except for rounding) cov_uu */ - for ( i = num_dmx; i < num_ch; i++ ) - { - for ( j = num_dmx; j < num_ch; j++ ) - { - if ( i == j ) - { - /* force diagonal to be real */ - cov_uu_re[i - num_dmx][j - num_dmx] *= factor; - } - else - { - /* set off-diag elements to zero */ - cov_uu_re[i - num_dmx][j - num_dmx] = 0; - } - } - } - - /* take sqrt of max of diags and zero */ - for ( i = num_dmx; i < num_ch; i++ ) - { - cov_uu_re[i - num_dmx][i - num_dmx] = sqrtf( max( 0.0f, cov_uu_re[i - num_dmx][i - num_dmx] ) ); - /* cov_uu_im[i - num_dmx][i - num_dmx] = 0; */ - } - - /* save into MD struct */ - for ( i = num_dmx; i < num_ch; i++ ) - { - for ( j = num_dmx; j < num_ch; j++ ) - { - if ( i == j ) - { - pSparMd->band_coeffs[b_ts_idx].P_re[j - num_dmx] = cov_uu_re[i - num_dmx][j - num_dmx]; - } - } - } - } - - return; -} - -#ifdef IVAS_FLOAT_FIXED - -static void ivas_calc_p_coeffs_per_band_enc_fx( +static void ivas_calc_p_coeffs_per_band_enc_fx( ivas_spar_md_t *pSparMd, const Word16 i_ts, Word32 postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], @@ -3111,7 +2445,7 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( { FOR( j = num_dmx; j < num_ch; j++ ) { - cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )] = postpred_cov_re[i][j]; + cov_uu_re[i - num_dmx][j - num_dmx] = postpred_cov_re[i][j]; move32(); } } @@ -3124,7 +2458,7 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( { FOR( j = 1; j < num_dmx; j++ ) { - cov_dd_re[sub( i, 1 )][sub( j, 1 )] = postpred_cov_re[i][j]; + cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; move32(); } } @@ -3317,7 +2651,7 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( { FOR( j = num_dmx; j < num_ch; j++ ) { - cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )] = L_shr( cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )], sub( q_cov_uu_re, q_tmp ) ); + 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 ) ); move32(); } } @@ -3334,7 +2668,7 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( { FOR( j = num_dmx; j < num_ch; j++ ) { - cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )] = L_shr( cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )], 1 ); + cov_uu_re[i - num_dmx][j - num_dmx] = L_shr( cov_uu_re[i - num_dmx][j - num_dmx], 1 ); move32(); } } @@ -3483,7 +2817,7 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( FOR( i = num_dmx; i < num_ch; i++ ) { - trace = W_add( trace, W_deposit32_l( L_abs( cov_uu_re[sub( i, num_dmx )][sub( i, num_dmx )] ) ) ); + trace = W_add( trace, W_deposit32_l( L_abs( cov_uu_re[i - num_dmx][i - num_dmx] ) ) ); } factor = L_max( IVAS_FIX_EPS, postpred_cov_re[0][0] ); @@ -3520,24 +2854,24 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( IF( EQ_16( i, j ) ) { /* force diagonal to be real */ - W_tmp = W_mult0_32_32( cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )], factor ); + W_tmp = W_mult0_32_32( cov_uu_re[i - num_dmx][j - num_dmx], factor ); q_tmp = 32; move16(); if ( W_tmp != 0 ) { q_tmp = W_norm( W_tmp ); } - cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )] = W_extract_h( W_shl( W_mult0_32_32( cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )], factor ), q_tmp ) ); + cov_uu_re[i - num_dmx][j - num_dmx] = W_extract_h( W_shl( W_mult0_32_32( cov_uu_re[i - num_dmx][j - num_dmx], factor ), q_tmp ) ); move32(); - q_cov_uu_re_per_value[sub( i, num_dmx )][sub( j, num_dmx )] = sub( add( add( q_cov_uu_re, sub( 15, factor_exp ) ), q_tmp ), 32 ); + 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 ); move16(); } ELSE { /* set off-diag elements to zero */ - cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )] = 0; + cov_uu_re[i - num_dmx][j - num_dmx] = 0; move32(); - q_cov_uu_re_per_value[sub( i, num_dmx )][sub( j, num_dmx )] = 0; + q_cov_uu_re_per_value[i - num_dmx][j - num_dmx] = 0; move16(); } } @@ -3549,12 +2883,12 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( /* take sqrt of max of diags and zero */ FOR( i = num_dmx; i < num_ch; i++ ) { - cov_uu_re_exp = sub( 31, q_cov_uu_re_per_value[sub( i, num_dmx )][sub( i, num_dmx )] ); - cov_uu_re[sub( i, num_dmx )][sub( i, num_dmx )] = Sqrt32( L_max( 0, cov_uu_re[sub( i, num_dmx )][sub( i, num_dmx )] ), &cov_uu_re_exp ); + cov_uu_re_exp = sub( 31, q_cov_uu_re_per_value[i - num_dmx][i - num_dmx] ); + 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 ); move32(); - q_cov_uu_re_per_value[sub( i, num_dmx )][sub( i, num_dmx )] = sub( 31, cov_uu_re_exp ); + q_cov_uu_re_per_value[i - num_dmx][i - num_dmx] = sub( 31, cov_uu_re_exp ); move16(); - q_tmp = s_min( q_tmp, q_cov_uu_re_per_value[sub( i, num_dmx )][sub( i, num_dmx )] ); + q_tmp = s_min( q_tmp, q_cov_uu_re_per_value[i - num_dmx][i - num_dmx] ); } /* save into MD struct */ @@ -3564,12 +2898,12 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( { IF( EQ_16( i, j ) ) { - pSparMd->band_coeffs[b_ts_idx].P_re_fx[sub( j, num_dmx )] = L_shr( cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )], sub( q_cov_uu_re_per_value[sub( i, num_dmx )][sub( j, num_dmx )], q_tmp ) ); + 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 ) ); move32(); } } } - pSparMd->band_coeffs[b_ts_idx].q_P_re_fx = q_tmp; + pSparMd->band_coeffs[b_ts_idx].q_P_re_fx = Q28; move16(); } @@ -3614,7 +2948,7 @@ static void ivas_calc_p_coeffs_per_band_fx( { FOR( j = num_dmx; j < num_ch; j++ ) { - cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )] = postpred_cov_re[i][j]; + cov_uu_re[i - num_dmx][j - num_dmx] = postpred_cov_re[i][j]; move32(); } } @@ -3627,7 +2961,7 @@ static void ivas_calc_p_coeffs_per_band_fx( { FOR( j = 1; j < num_dmx; j++ ) { - cov_dd_re[sub( i, 1 )][sub( j, 1 )] = postpred_cov_re[i][j]; + cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; move32(); } } @@ -3741,7 +3075,7 @@ static void ivas_calc_p_coeffs_per_band_fx( FOR( i = num_dmx; i < num_ch; i++ ) { - trace = L_add( trace, L_abs( cov_uu_re[sub( i, num_dmx )][sub( i, num_dmx )] ) ); + trace = L_add( trace, L_abs( cov_uu_re[i - num_dmx][i - num_dmx] ) ); } factor = L_max( IVAS_FIX_EPS, postpred_cov_re[0][0] ); @@ -3760,7 +3094,7 @@ static void ivas_calc_p_coeffs_per_band_fx( IF( EQ_16( i, j ) ) { /* force diagonal to be real */ - cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )] = W_extract_l( W_shr( W_mult0_32_32( cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )], factor ), tmp ) ); + 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 ) ); move32(); } ELSE @@ -3777,8 +3111,8 @@ static void ivas_calc_p_coeffs_per_band_fx( FOR( i = num_dmx; i < num_ch; i++ ) { cov_uu_re_exp = sub( 31, q_cov_uu_re ); - cov_uu_re[sub( i, num_dmx )][sub( i, num_dmx )] = Sqrt32( L_max( 0, cov_uu_re[sub( i, num_dmx )][sub( i, num_dmx )] ), &cov_uu_re_exp ); - cov_uu_re[sub( i, num_dmx )][sub( i, num_dmx )] = L_shl( cov_uu_re[sub( i, num_dmx )][sub( i, num_dmx )], sub( q_cov_uu_re, sub( 31, cov_uu_re_exp ) ) ); + 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 ); + 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 ) ) ); move32(); move32(); } @@ -3790,7 +3124,7 @@ static void ivas_calc_p_coeffs_per_band_fx( { IF( EQ_16( i, j ) ) { - pSparMd->band_coeffs[b_ts_idx].P_re_fx[sub( j, num_dmx )] = cov_uu_re[sub( i, num_dmx )][sub( j, num_dmx )]; + pSparMd->band_coeffs[b_ts_idx].P_re_fx[j - num_dmx] = cov_uu_re[i - num_dmx][j - num_dmx]; move32(); } } @@ -3810,96 +3144,6 @@ static void ivas_calc_p_coeffs_per_band_fx( * * Calculate C coeffs per band *-----------------------------------------------------------------------------------------*/ - -static void ivas_calc_c_coeffs_per_band( - ivas_spar_md_t *pSparMd, - const int16_t i_ts, - float postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - const int16_t num_ch, - const int16_t num_dmx, - const int16_t band_idx, - const int16_t dtx_vad ) -{ - int16_t i, j, k; - - /* worst case for cov_ud is actually 12 x 3 */ - float cov_ud_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1]; - float cov_dd_re[FOA_CHANNELS - 1][FOA_CHANNELS - 1]; - float cov_dd_re_inv[FOA_CHANNELS - 1][FOA_CHANNELS - 1]; - float trace_cov_dd_re = 0; - float abs_trace; - float re; - int16_t b_ts_idx; - - b_ts_idx = band_idx + i_ts * IVAS_MAX_NUM_BANDS; - - if ( dtx_vad == 0 ) - { - set_zero( &pSparMd->band_coeffs[b_ts_idx].C_re[0][0], ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ) * ( IVAS_SPAR_MAX_DMX_CHS - 1 ) ); - return; - } - - for ( i = num_dmx; i < num_ch; i++ ) - { - for ( j = 1; j < num_dmx; j++ ) - { - cov_ud_re[i - num_dmx][j - 1] = postpred_cov_re[i][j]; - } - } - - for ( i = 1; i < num_dmx; i++ ) - { - for ( j = 1; j < num_dmx; j++ ) - { - cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; - } - } - - for ( i = 0; i < num_dmx - 1; i++ ) - { - trace_cov_dd_re += cov_dd_re[i][i]; - } - trace_cov_dd_re *= 0.005f; - - IVAS_CALCULATE_RABS( trace_cov_dd_re, abs_trace ); - - if ( abs_trace < IVAS_FLT_EPS ) - { - /* protection from cases when variance of residual channels is very small */ - set_zero( &pSparMd->band_coeffs[b_ts_idx].C_re[0][0], ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ) * ( IVAS_SPAR_MAX_DMX_CHS - 1 ) ); - } - else - { - for ( i = 0; i < num_dmx - 1; i++ ) - { - cov_dd_re[i][i] += trace_cov_dd_re; - } - if ( ivas_is_mat_inv( cov_dd_re, num_dmx - 1 ) && ( num_dmx < FOA_CHANNELS ) ) - { - set_zero( &pSparMd->band_coeffs[b_ts_idx].C_re[0][0], ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ) * ( IVAS_SPAR_MAX_DMX_CHS - 1 ) ); - } - else - { - ivas_calc_mat_inv( cov_dd_re, num_dmx - 1, cov_dd_re_inv ); - - for ( i = 0; i < num_ch - num_dmx; i++ ) - { - for ( j = 0; j < num_dmx - 1; j++ ) - { - pSparMd->band_coeffs[b_ts_idx].C_re[i][j] = 0; - for ( k = 0; k < num_dmx - 1; k++ ) - { - IVAS_RMULT_FLOAT( cov_ud_re[i][k], cov_dd_re_inv[k][j], re ); - pSparMd->band_coeffs[b_ts_idx].C_re[i][j] += re; - } - } - } - } - } - - return; -} - #ifdef IVAS_FLOAT_FIXED static void ivas_calc_c_coeffs_per_band_enc_fx( @@ -3938,7 +3182,7 @@ static void ivas_calc_c_coeffs_per_band_enc_fx( { FOR( j = 1; j < num_dmx; j++ ) { - cov_ud_re[sub( i, num_dmx )][sub( j, 1 )] = postpred_cov_re[i][j]; + cov_ud_re[i - num_dmx][j - 1] = postpred_cov_re[i][j]; move32(); } } @@ -3954,7 +3198,7 @@ static void ivas_calc_c_coeffs_per_band_enc_fx( { max_val = L_max( max_val, postpred_cov_re[i][j] ); } - cov_dd_re[sub( i, 1 )][sub( j, 1 )] = postpred_cov_re[i][j]; + cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; move32(); } } @@ -4087,7 +3331,7 @@ static void ivas_calc_c_coeffs_per_band_fx( { FOR( j = 1; j < num_dmx; j++ ) { - cov_ud_re[sub( i, num_dmx )][sub( j, 1 )] = postpred_cov_re[i][j]; + cov_ud_re[i - num_dmx][j - 1] = postpred_cov_re[i][j]; move32(); } } @@ -4096,7 +3340,7 @@ static void ivas_calc_c_coeffs_per_band_fx( { FOR( j = 1; j < num_dmx; j++ ) { - cov_dd_re[sub( i, 1 )][sub( j, 1 )] = postpred_cov_re[i][j]; + cov_dd_re[i - 1][j - 1] = postpred_cov_re[i][j]; move32(); } } @@ -4187,57 +3431,6 @@ static void ivas_calc_c_coeffs_per_band_fx( * Calculation of C and P coeffs *-----------------------------------------------------------------------------------------*/ -void ivas_calc_c_p_coeffs( - ivas_spar_md_t *pSparMd, - float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - const int16_t i_ts, - float ***mixer_mat, - const int16_t num_ch, - const int16_t num_dmx, - const int16_t band_idx, - const int16_t dtx_vad, - const int16_t compute_p_flag, - const int16_t dyn_active_w_flag ) -{ - int16_t i, j; - float postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; - - if ( num_dmx != num_ch ) - { - ivas_calc_post_pred_per_band( cov_real, mixer_mat, num_ch, band_idx, postpred_cov_re ); - - if ( num_dmx != 1 ) - { - ivas_calc_c_coeffs_per_band( pSparMd, i_ts, postpred_cov_re, num_ch, num_dmx, band_idx, dtx_vad ); - } - - if ( dyn_active_w_flag ) - { - for ( i = 0; i < num_ch - num_dmx; i++ ) - { - for ( j = 0; j < num_dmx - 1; j++ ) - { - pSparMd->band_coeffs[band_idx + i_ts * IVAS_MAX_NUM_BANDS].C_re[i][j] = 0.0f; - } - } - } - if ( compute_p_flag == 1 ) - { - ivas_calc_p_coeffs_per_band( pSparMd, i_ts, postpred_cov_re, num_ch, dtx_vad, num_dmx, band_idx ); - } - - if ( dyn_active_w_flag ) - { - for ( i = num_dmx; i < num_ch; i++ ) - { - pSparMd->band_coeffs[band_idx + i_ts * IVAS_MAX_NUM_BANDS].P_re[i - num_dmx] = 0; - } - } - } - - return; -} - #ifdef IVAS_FLOAT_FIXED void ivas_calc_c_p_coeffs_enc_fx( @@ -4272,11 +3465,11 @@ void ivas_calc_c_p_coeffs_enc_fx( { FOR( j = 0; j < sub( num_dmx, 1 ); j++ ) { - pSparMd->band_coeffs[add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].C_re_fx[i][j] = 0; + pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].C_re_fx[i][j] = 0; move32(); } } - pSparMd->band_coeffs[add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].q_C_re_fx = 0; + pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].q_C_re_fx = 0; move16(); } IF( EQ_16( compute_p_flag, 1 ) ) @@ -4288,10 +3481,10 @@ void ivas_calc_c_p_coeffs_enc_fx( { FOR( i = num_dmx; i < num_ch; i++ ) { - pSparMd->band_coeffs[add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].P_re_fx[sub( i, num_dmx )] = 0; + pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].P_re_fx[i - num_dmx] = 0; move32(); } - pSparMd->band_coeffs[add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].q_P_re_fx = 0; + pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].q_P_re_fx = 0; move16(); } } @@ -4331,11 +3524,11 @@ void ivas_calc_c_p_coeffs_fx( { FOR( j = 0; j < sub( num_dmx, 1 ); j++ ) { - pSparMd->band_coeffs[add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].C_re_fx[i][j] = 0; + pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].C_re_fx[i][j] = 0; move32(); } } - pSparMd->band_coeffs[add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].q_C_re_fx = 0; + pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].q_C_re_fx = 0; move16(); } IF( EQ_16( compute_p_flag, 1 ) ) @@ -4347,10 +3540,10 @@ void ivas_calc_c_p_coeffs_fx( { FOR( i = num_dmx; i < num_ch; i++ ) { - pSparMd->band_coeffs[add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].P_re_fx[sub( i, num_dmx )] = 0; + pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].P_re_fx[i - num_dmx] = 0; move32(); } - pSparMd->band_coeffs[add( band_idx, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].q_P_re_fx = 0; + pSparMd->band_coeffs[band_idx + ( i_ts * IVAS_MAX_NUM_BANDS )].q_P_re_fx = 0; move16(); } } @@ -4360,58 +3553,6 @@ void ivas_calc_c_p_coeffs_fx( #endif // IVAS_FLOAT_FIXED - -static void ivas_calc_mat_det( - double in_re[MAX_MAT_DIM][MAX_MAT_DIM], - const int16_t dim, - double *det_re ) -{ - if ( dim == IVAS_MAT_DIM_3 ) - { - double re1, re2, re; - IVAS_RMULT_DOUBLE( in_re[1][1], in_re[2][2], re1 ); - IVAS_RMULT_DOUBLE( in_re[1][2], in_re[2][1], re2 ); - re = re1 - re2; - - IVAS_RMULT_DOUBLE( in_re[0][0], re, re1 ); - - *det_re = re1; - - IVAS_RMULT_DOUBLE( in_re[1][0], in_re[2][2], re1 ); - IVAS_RMULT_DOUBLE( in_re[1][2], in_re[2][0], re2 ); - re = re1 - re2; - - IVAS_RMULT_DOUBLE( in_re[0][1], re, re1 ); - - *det_re -= re1; - - IVAS_RMULT_DOUBLE( in_re[1][0], in_re[2][1], re1 ); - IVAS_RMULT_DOUBLE( in_re[1][1], in_re[2][0], re2 ); - re = re1 - re2; - - IVAS_RMULT_DOUBLE( in_re[0][2], re, re1 ); - - *det_re += re1; - } - else if ( dim == IVAS_MAT_DIM_2 ) - { - double re1, re2; - IVAS_RMULT_DOUBLE( in_re[0][0], in_re[1][1], re1 ); - IVAS_RMULT_DOUBLE( in_re[0][1], in_re[1][0], re2 ); - *det_re = re1 - re2; - } - else if ( dim == IVAS_MAT_DIM_1 ) - { - *det_re = in_re[0][0]; - } - else - { - assert( !"matrix dimention not supported!" ); - } - - return; -} - #ifdef IVAS_FLOAT_FIXED static void ivas_calc_mat_det_fx( @@ -4488,36 +3629,6 @@ static void ivas_calc_mat_det_fx( * Calculate cofactor for invert matrix *-----------------------------------------------------------------------------------------*/ -static void ivas_get_mat_cofactor( - double in_re[MAX_MAT_DIM][MAX_MAT_DIM], - double out_re[MAX_MAT_DIM][MAX_MAT_DIM], - const int16_t row, - const int16_t col ) -{ - int16_t i, j; - int16_t r = 0, c = 0; - - for ( i = 0; i < MAX_MAT_DIM; i++ ) - { - for ( j = 0; j < MAX_MAT_DIM; j++ ) - { - if ( i != row && j != col ) - { - - out_re[r][c++] = in_re[i][j]; - } - } - if ( c == 2 ) - { - r++; - c = 0; - } - } - - return; -} - - #ifdef IVAS_FLOAT_FIXED static void ivas_get_mat_cofactor_fx( @@ -4563,99 +3674,6 @@ static void ivas_get_mat_cofactor_fx( * Calculate Invert of a matrix *-----------------------------------------------------------------------------------------*/ -static void ivas_calc_mat_inv( - float in_re[MAX_MAT_DIM][MAX_MAT_DIM], - const int16_t dim, - float out_re[MAX_MAT_DIM][MAX_MAT_DIM] ) -{ - double det; - int16_t i, j; - double dbl_in_re[MAX_MAT_DIM][MAX_MAT_DIM]; - double dbl_out_re[MAX_MAT_DIM][MAX_MAT_DIM]; - - for ( i = 0; i < dim; i++ ) - { - for ( j = 0; j < dim; j++ ) - { - dbl_in_re[i][j] = in_re[i][j]; - } - } - - if ( dim == IVAS_MAT_DIM_1 ) - { - det = ( dbl_in_re[0][0] * dbl_in_re[0][0] ); - /* assert to catch cases when input is singular matrix*/ - assert( det > 0 ); - det = 1 / det; - dbl_out_re[0][0] = dbl_in_re[0][0] * det; - } - else if ( dim == IVAS_MAT_DIM_2 ) - { - double det_re; - double re; - - ivas_calc_mat_det( dbl_in_re, dim, &det_re ); - det = ( det_re * det_re ); - /* assert to catch cases when input is singular matrix*/ - assert( det > 0 ); - det = 1 / det; - - IVAS_RMULT_DOUBLE( det_re, dbl_in_re[1][1], re ); - dbl_out_re[0][0] = re * det; - - IVAS_RMULT_DOUBLE( det_re, dbl_in_re[0][1], re ); - dbl_out_re[0][1] = -re * det; - - IVAS_RMULT_DOUBLE( det_re, dbl_in_re[1][0], re ); - dbl_out_re[1][0] = -re * det; - - IVAS_RMULT_DOUBLE( det_re, dbl_in_re[0][0], re ); - dbl_out_re[1][1] = re * det; - } - else if ( dim == IVAS_MAT_DIM_3 ) - { - double fac_re[IVAS_MAT_DIM_3][IVAS_MAT_DIM_3]; - double det_re; - int16_t sign = 1; - - ivas_calc_mat_det( dbl_in_re, dim, &det_re ); - det = det_re > 0 ? 1 / max( IVAS_DBL_EPS, det_re ) : min( det_re, -IVAS_DBL_EPS ); - - for ( i = 0; i < dim; i++ ) - { - for ( j = 0; j < dim; j++ ) - { - ivas_get_mat_cofactor( dbl_in_re, fac_re, i, j ); - ivas_calc_mat_det( fac_re, IVAS_MAT_DIM_2, &dbl_out_re[j][i] ); - dbl_out_re[j][i] = dbl_out_re[j][i] * det * sign; - - if ( ( ( i + j ) & 1 ) == 0 ) - { - sign = -1; - } - else - { - sign = 1; - } - } - } - } - else - { - assert( !"matrix dimension not supported!" ); - } - - for ( i = 0; i < dim; i++ ) - { - for ( j = 0; j < dim; j++ ) - { - out_re[i][j] = (float) dbl_out_re[i][j]; - } - } - - return; -} - #ifdef IVAS_FLOAT_FIXED static void ivas_calc_mat_inv_fx( @@ -4790,35 +3808,6 @@ static void ivas_calc_mat_inv_fx( * Check if matrix is invertible or not by checking if determinant is 0 or very close to 0 *-----------------------------------------------------------------------------------------*/ -static int16_t ivas_is_mat_inv( - float in_re[MAX_MAT_DIM][MAX_MAT_DIM], - const int16_t dim ) -{ - int16_t is_det_zero = 0; - double det, det_re; - int16_t i, j; - double dbl_in_re[MAX_MAT_DIM][MAX_MAT_DIM]; - - for ( i = 0; i < dim; i++ ) - { - for ( j = 0; j < dim; j++ ) - { - dbl_in_re[i][j] = in_re[i][j]; - } - } - - ivas_calc_mat_det( dbl_in_re, dim, &det_re ); - - det = ( det_re * det_re ); - - if ( det < IVAS_DBL_EPS ) - { - is_det_zero = 1; - } - - return is_det_zero; -} - #ifdef IVAS_FLOAT_FIXED static Word16 ivas_is_mat_inv_fx( @@ -4858,60 +3847,6 @@ static Word16 ivas_is_mat_inv_fx( * *-----------------------------------------------------------------------------------------*/ -void ivas_compute_spar_params( - float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], - const int16_t i_ts, - float ***mixer_mat, - const int16_t start_band, - const int16_t end_band, - const int16_t dtx_vad, - const int16_t num_ch, - const int16_t bands_bw, - const int16_t active_w, - const int16_t active_w_vlbr, - ivas_spar_md_com_cfg *hSparCfg, - ivas_spar_md_t *hSparMd, - float *pWscale, - const int16_t from_dirac, - const int16_t dyn_active_w_flag ) -{ - float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; - int16_t b, i, ndm; - - ivas_get_pred_coeffs( 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 ); - - ivas_create_fullr_dmx_mat( pred_coeffs_re, dm_fv_re, mixer_mat, num_ch, start_band, end_band, active_w, hSparCfg ); - - ivas_get_Wscaling_factor( cov_real, pred_coeffs_re, mixer_mat, start_band, end_band, dtx_vad, num_ch, hSparCfg->num_dmx_chans_per_band, bands_bw, active_w, active_w_vlbr, pWscale, dyn_active_w_flag ); - - for ( b = start_band; b < end_band; b++ ) - { - float onebyscale = 1.0f / pWscale[b]; - for ( i = 0; i < num_ch - 1; i++ ) - { - hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re[i] = pred_coeffs_re[i][b] * onebyscale; - } - - for ( i = 0; i < num_ch; i++ ) - { - mixer_mat[0][i][b] *= pWscale[b]; - } - } - - for ( b = start_band; b < end_band; b++ ) - { - ndm = hSparCfg->num_dmx_chans_per_band[b * bands_bw]; - - if ( ndm != num_ch ) - { - ivas_calc_c_p_coeffs( hSparMd, cov_real, i_ts, mixer_mat, num_ch, ndm, b, dtx_vad, 1, dyn_active_w_flag ); - } - } - - return; -} - #ifdef IVAS_FLOAT_FIXED void ivas_compute_spar_params_enc_fx( @@ -4963,11 +3898,11 @@ void ivas_compute_spar_params_enc_fx( tmp = sub( add( q_pred_coeffs_re, q_tmp ), 15 ); FOR( i = 0; i < sub( num_ch, 1 ); i++ ) { - hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].pred_re_fx[i] = Mpy_32_16_1( pred_coeffs_re_fx[i][b], onebyscale_fx ); + 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 ) ); move32(); } // hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].q_pred_re_fx = sub(add(q_pred_coeffs, q_tmp), 15); - hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].q_pred_re_fx = tmp; + hSparMd->band_coeffs[( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )].q_pred_re_fx = Q28; move16(); FOR( i = 0; i < num_ch; i++ ) @@ -4979,7 +3914,7 @@ void ivas_compute_spar_params_enc_fx( FOR( b = start_band; b < end_band; b++ ) { - ndm = hSparCfg->num_dmx_chans_per_band[imult1616( b, bands_bw )]; + ndm = hSparCfg->num_dmx_chans_per_band[( b * bands_bw )]; move16(); IF( NE_16( ndm, num_ch ) ) @@ -5034,22 +3969,22 @@ void ivas_compute_spar_params_fx( tmp = sub( add( q_pred_coeffs, q_tmp ), 15 ); FOR( i = 0; i < sub( num_ch, 1 ); i++ ) { - hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].pred_re_fx[i] = Mpy_32_16_1( pred_coeffs_re[i][b], onebyscale_fx ); + 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 ); move32(); IF( tmp < 0 ) { tmp = negate( tmp ); - hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].pred_re_fx[i] = L_shl( hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].pred_re_fx[i], add( tmp, 22 ) ); + 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 ) ); move32(); } ELSE { - hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].pred_re_fx[i] = L_shr( hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].pred_re_fx[i], sub( tmp, 22 ) ); + hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i] = L_shr( hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].pred_re_fx[i], sub( tmp, 22 ) ); move32(); } } // hSparMd->band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].q_pred_re_fx = sub(add(q_pred_coeffs, q_tmp), 15); - hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].q_pred_re_fx = Q22; + hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_pred_re_fx = Q22; move16(); FOR( i = 0; i < num_ch; i++ ) @@ -5061,14 +3996,14 @@ void ivas_compute_spar_params_fx( FOR( b = start_band; b < end_band; b++ ) { - ndm = hSparCfg->num_dmx_chans_per_band[imult1616( b, bands_bw )]; + ndm = hSparCfg->num_dmx_chans_per_band[b * bands_bw]; move16(); IF( NE_16( ndm, num_ch ) ) { 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 ); - Word16 q_tmp = hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].q_C_re_fx; + Word16 q_tmp = hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_C_re_fx; IF( NE_16( ndm, 1 ) ) { #ifdef MSAN_FIX @@ -5076,7 +4011,7 @@ void ivas_compute_spar_params_fx( { FOR( Word16 j = 0; j < sub( ndm, 1 ); j++ ) { - hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].C_re_fx[i][j] = L_shr( hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].C_re_fx[i][j], sub( q_tmp, 22 ) ); + 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 ) ); move32(); } } @@ -5089,19 +4024,19 @@ void ivas_compute_spar_params_fx( } } #endif - hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].q_C_re_fx = Q22; + hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_C_re_fx = Q22; move16(); } - q_tmp = hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].q_P_re_fx; + q_tmp = hSparMd->band_coeffs[b + ( i_ts * IVAS_MAX_NUM_BANDS )].q_P_re_fx; move16(); FOR( Word16 j = 0; j < sub( IVAS_SPAR_MAX_CH, 1 ); j++ ) { - hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].P_re_fx[j] = L_shr( hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].P_re_fx[j], sub( q_tmp, 22 ) ); + 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 ) ); move32(); } - hSparMd->band_coeffs[add( b, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )].q_P_re_fx = Q22; + hSparMd->band_coeffs[b + imult1616( i_ts, IVAS_MAX_NUM_BANDS )].q_P_re_fx = Q22; move16(); } } @@ -5206,13 +4141,13 @@ void ivas_get_spar_md_from_dirac_fx( Word32 P_norm_fx[3]; Word16 idx; - ndm = hSpar_md_cfg->num_dmx_chans_per_band[sub( start_band, 1 )]; + ndm = hSpar_md_cfg->num_dmx_chans_per_band[start_band - 1]; move16(); P_norm_fx[0] = 0; move32(); FOR( i = 0; i < max( 0, sub( foa_ch, ndm ) ); i++ ) { - P_norm_fx[0] = L_add( P_norm_fx[0], Mpy_32_32( hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i], hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i] ) ); + 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] ) ); move32(); } 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 ) ) )] ); @@ -5222,7 +4157,7 @@ void ivas_get_spar_md_from_dirac_fx( move32(); FOR( ; i < max( 0, sub( min( num_ch, hoa2_ch ), ndm ) ); i++ ) { - P_norm_fx[1] = L_add( P_norm_fx[1], Mpy_32_32( hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i], hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i] ) ); + 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] ) ); move32(); } 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, sub( min( num_ch, hoa2_ch ), ndm ) ) )] ); @@ -5232,7 +4167,7 @@ void ivas_get_spar_md_from_dirac_fx( move32(); FOR( ; i < sub( num_ch, ndm ); i++ ) { - P_norm_fx[2] = L_add( P_norm_fx[2], Mpy_32_32( hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i], hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i] ) ); + 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] ) ); move32(); } 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, sub( num_ch, ndm ) ) )] ); @@ -5240,8 +4175,8 @@ void ivas_get_spar_md_from_dirac_fx( FOR( i = 0; i < max( 0, sub( foa_ch, ndm ) ); i++ ) { - idx = sub( remix_order[add( i, ndm )], ndm ); - P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i], hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i] ); + idx = sub( remix_order[i + ndm], ndm ); + 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] ); move32(); IF( P_dir_fact_fx[idx] == 0 ) { @@ -5258,8 +4193,8 @@ void ivas_get_spar_md_from_dirac_fx( } FOR( ; i < max( 0, sub( min( num_ch, hoa2_ch ), ndm ) ); i++ ) { - idx = sub( remix_order[add( i, ndm )], ndm ); - P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i], hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i] ); + idx = sub( remix_order[i + ndm], ndm ); + 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] ); IF( P_dir_fact_fx[idx] == 0 ) { P_dir_fact_fx[idx] = 0; @@ -5275,8 +4210,8 @@ void ivas_get_spar_md_from_dirac_fx( } FOR( ; i < sub( num_ch, ndm ); i++ ) { - idx = sub( remix_order[add( i, ndm )], ndm ); - P_dir_fact_fx[idx] = Mpy_32_32( hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i], hSpar_md->band_coeffs[sub( start_band, 1 )].P_re_fx[i] ); + idx = sub( remix_order[i + ndm], ndm ); + 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] ); move32(); IF( P_dir_fact_fx[idx] == 0 ) { @@ -5574,7 +4509,7 @@ void ivas_get_spar_md_from_dirac_fx( IF( ( GE_16( i, ndm ) ) && ( EQ_16( dtx_vad, 1 ) ) ) { en_ratio_fac_sq = Mpy_32_32( en_ratio_fac_fx, en_ratio_fac_fx ); - 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[sub( i, ndm )] ) ); + 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] ) ); move32(); } ELSE @@ -5660,7 +4595,7 @@ void ivas_get_spar_md_from_dirac_fx( { FOR( j = 0; j < num_ch; j++ ) { - mixer_mat_fx[i][j][add( band, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )] = L_shl( ppMixer_mat_fx[i][j][band], sub( *q_mixer_mat_fx, q_ppMixer_mat ) ); + 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 ) ); move32(); } } @@ -5669,7 +4604,7 @@ void ivas_get_spar_md_from_dirac_fx( { FOR( j = 0; j < num_ch; j++ ) { - mixer_mat_fx[i][j][add( band, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )] = 0; + mixer_mat_fx[i][j][band + ( i_ts * IVAS_MAX_NUM_BANDS )] = 0; move32(); } } @@ -5679,7 +4614,7 @@ void ivas_get_spar_md_from_dirac_fx( { FOR( j = 0; j < num_ch; j++ ) { - mixer_mat_fx[0][j][add( band, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )] = Mpy_32_32( L_shl( mixer_mat_fx[0][j][add( band, imult1616( i_ts, IVAS_MAX_NUM_BANDS ) )], 2 ), Wscale_d[band] ); + 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] ); move32(); } } @@ -5690,312 +4625,6 @@ void ivas_get_spar_md_from_dirac_fx( return; } #endif -/*-----------------------------------------------------------------------------------------* - * Function ivas_get_spar_md_from_dirac() - * - * - *-----------------------------------------------------------------------------------------*/ - -void ivas_get_spar_md_from_dirac( - float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - float diffuseness[IVAS_MAX_NUM_BANDS], - const int16_t n_ts, - float ***mixer_mat, - ivas_spar_md_t *hSpar_md, - ivas_spar_md_com_cfg *hSpar_md_cfg, - const int16_t start_band, - const int16_t end_band, - const int16_t order, - const int16_t dtx_vad, - float Wscale_d[IVAS_MAX_NUM_BANDS], - const uint8_t useLowerRes, - const int16_t active_w_vlbr, - const int16_t dyn_active_w_flag ) -{ - int16_t num_ch, band, i, j; - int16_t block, ch; - float response_avg[MAX_OUTPUT_CHANNELS]; - float response[MAX_PARAM_SPATIAL_SUBFRAMES][MAX_OUTPUT_CHANNELS]; - float cov_real_dirac[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; - float *pCov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; - float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; - float Wscale[IVAS_MAX_NUM_BANDS]; - float mixer_mat_local[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH][IVAS_MAX_NUM_BANDS]; - float **ppMixer_mat[IVAS_MAX_FB_MIXER_OUT_CH]; - float *pMixer_mat[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH]; - float en_ratio_fac, diff_norm_order1, diff_norm_order2, diff_norm_order3; - int16_t active_w; - - int16_t ndm, foa_ch, hoa2_ch; - float P_dir_fact[IVAS_SPAR_MAX_CH - 1]; - const int16_t *remix_order; - - remix_order = remix_order_set[hSpar_md_cfg->remix_unmix_order]; - - num_ch = ivas_sba_get_nchan_metadata( order, IVAS_256k /*dummy value as order is always 1 in this function*/ ); - - hoa2_ch = ivas_sba_get_nchan_metadata( SBA_HOA2_ORDER, IVAS_256k /*dummy value as order is always 1 in this function*/ ); - - foa_ch = FOA_CHANNELS; - diff_norm_order1 = 3.0f; - diff_norm_order2 = 5.0f; - diff_norm_order3 = 7.0f; - - for ( i = 0; i < IVAS_MAX_FB_MIXER_OUT_CH; i++ ) - { - for ( j = 0; j < IVAS_MAX_SPAR_FB_MIXER_IN_CH; j++ ) - { - pMixer_mat[i][j] = mixer_mat_local[i][j]; - } - ppMixer_mat[i] = pMixer_mat[i]; - } - - if ( ( start_band >= 6 && hSpar_md_cfg->nchan_transport <= 2 && ( dtx_vad == 1 ) ) || ( useLowerRes && start_band >= 3 && hSpar_md_cfg->nchan_transport <= 2 && ( dtx_vad == 1 ) ) ) - { - float P_norm[3]; - int16_t idx; - - ndm = hSpar_md_cfg->num_dmx_chans_per_band[start_band - 1]; - P_norm[0] = 0.0f; - for ( i = 0; i < max( 0, foa_ch - ndm ); i++ ) - { - P_norm[0] += hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; - } - P_norm[0] *= diff_norm_order1 / min( diff_norm_order1, max( 0, foa_ch - ndm ) ); - - P_norm[1] = 0.0f; - for ( ; i < max( 0, min( num_ch, hoa2_ch ) - ndm ); i++ ) - { - P_norm[1] += hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; - } - P_norm[1] *= diff_norm_order2 / min( diff_norm_order2, max( 0, min( num_ch, hoa2_ch ) - ndm ) ); - - P_norm[2] = 0.0f; - for ( ; i < num_ch - ndm; i++ ) - { - P_norm[2] += hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; - } - P_norm[2] *= diff_norm_order3 / min( diff_norm_order3, max( 0, num_ch - ndm ) ); - - for ( i = 0; i < max( 0, foa_ch - ndm ); i++ ) - { - idx = remix_order[i + ndm] - ndm; - P_dir_fact[idx] = hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; - P_dir_fact[idx] = P_dir_fact[idx] / max( IVAS_FLT_EPS, P_norm[0] ); - } - for ( ; i < max( 0, min( num_ch, hoa2_ch ) - ndm ); i++ ) - { - idx = remix_order[i + ndm] - ndm; - P_dir_fact[idx] = hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; - P_dir_fact[idx] = P_dir_fact[idx] / max( IVAS_FLT_EPS, P_norm[1] ); - } - for ( ; i < num_ch - ndm; i++ ) - { - idx = remix_order[i + ndm] - ndm; - P_dir_fact[idx] = hSpar_md->band_coeffs[start_band - 1].P_re[i] * hSpar_md->band_coeffs[start_band - 1].P_re[i]; - P_dir_fact[idx] = P_dir_fact[idx] / max( IVAS_FLT_EPS, P_norm[2] ); - } - } - - for ( int16_t i_ts = 0; i_ts < n_ts; i_ts++ ) - { - for ( band = start_band; band < end_band; band++ ) - { - ndm = hSpar_md_cfg->num_dmx_chans_per_band[band]; - - /*SPAR from DirAC*/ - set_f( response_avg, 0.0f, MAX_OUTPUT_CHANNELS ); - - if ( n_ts > 1 ) - { - ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][i_ts], (int16_t) ele_dirac[band][i_ts], response_avg, order ); - } - else if ( useLowerRes ) - { - ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][0], (int16_t) ele_dirac[band][0], response_avg, order ); - } - else - { - for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) - { - ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][block], (int16_t) ele_dirac[band][block], &( response[block][0] ), order ); - } - - /* average responses in all subframes*/ - { - float norm; - int16_t num_ch_order, hoa2_ch_order; - - num_ch_order = ivas_sba_get_nchan( order, 0 ); - hoa2_ch_order = ivas_sba_get_nchan( SBA_HOA2_ORDER, 0 ); - - for ( ch = 0; ch < num_ch_order; ch++ ) - { - for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) - { - response_avg[ch] += response[block][ch]; - } - response_avg[ch] /= MAX_PARAM_SPATIAL_SUBFRAMES; - } - - /*normalize 1st order*/ - norm = 0.0f; - for ( ch = 1; ch < foa_ch; ch++ ) - { - norm += response_avg[ch] * response_avg[ch]; - } - norm = max( EPSILON, sqrtf( norm ) ); - for ( ch = 1; ch < foa_ch; ch++ ) - { - response_avg[ch] /= norm; - } - - /*normalize 2nd order*/ - norm = 0.0f; - for ( ch = foa_ch; ch < min( hoa2_ch_order, num_ch_order ); ch++ ) - { - norm += response_avg[ch] * response_avg[ch]; - } - norm = max( EPSILON, sqrtf( norm ) ); - for ( ch = foa_ch; ch < min( hoa2_ch_order, num_ch_order ); ch++ ) - { - response_avg[ch] /= norm; - } - - /*normalize 3rd order*/ - norm = 0.0f; - for ( ch = hoa2_ch_order; ch < num_ch_order; ch++ ) - { - norm += response_avg[ch] * response_avg[ch]; - } - norm = max( EPSILON, sqrtf( norm ) ); - for ( ch = hoa2_ch_order; ch < num_ch_order; ch++ ) - { - response_avg[ch] /= norm; - } - } - } - - for ( i = FOA_CHANNELS + 1; i < num_ch; i++ ) - { - response_avg[i] = response_avg[HOA_keep_ind[i]]; - } - - en_ratio_fac = ( 1.0f - diffuseness[band] ); - - for ( i = 0; i < num_ch; i++ ) - { - for ( j = 0; j < num_ch; j++ ) - { - if ( i == j ) - { - if ( i == 0 ) - { - cov_real_dirac[i][i][band] = 1.0f; - } - else - { - cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j]; - - if ( hSpar_md_cfg->nchan_transport <= 2 ) - { - - cov_real_dirac[i][j][band] *= en_ratio_fac; - if ( ( i >= ndm ) && ( dtx_vad == 1 ) ) - { - cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) * P_dir_fact[i - ndm]; - } - else - { - if ( i < foa_ch ) - { - cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order1; - } - else if ( i < hoa2_ch ) - { - cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order2; - } - else - { - cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order3; - } - } - } - else - { - if ( i < foa_ch ) - { - cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order1; - } - else if ( i < hoa2_ch ) - { - cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order2; - } - else - { - cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order3; - } - } - } - } - else - { - cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j]; - } - } - } - } - - for ( i = 0; i < num_ch; i++ ) - { - for ( j = 0; j < num_ch; j++ ) - { - pCov_real[i][j] = cov_real_dirac[i][j]; - } - } - - - active_w = ( dyn_active_w_flag == 1 ) || ( hSpar_md_cfg->active_w == 1 ); - - ivas_compute_spar_params( pCov_real, dm_fv_re, i_ts, ppMixer_mat, start_band, end_band, dtx_vad, num_ch, 1, active_w, active_w_vlbr, hSpar_md_cfg, hSpar_md, Wscale, 1, dyn_active_w_flag ); - - if ( mixer_mat != NULL ) - { - for ( band = start_band; band < end_band; band++ ) - { - ndm = hSpar_md_cfg->num_dmx_chans_per_band[band]; - - for ( i = 0; i < ndm; i++ ) - { - for ( j = 0; j < num_ch; j++ ) - { - mixer_mat[i][j][band + i_ts * IVAS_MAX_NUM_BANDS] = ppMixer_mat[i][j][band]; - } - } - - for ( i = ndm; i < num_ch; i++ ) - { - for ( j = 0; j < num_ch; j++ ) - { - mixer_mat[i][j][band + i_ts * IVAS_MAX_NUM_BANDS] = 0.0f; - } - } - - if ( ( ndm == 1 ) && ( Wscale_d != NULL ) ) - { - for ( j = 0; j < num_ch; j++ ) - { - mixer_mat[0][j][band + i_ts * IVAS_MAX_NUM_BANDS] *= Wscale_d[band]; - } - } - } - } - } - - return; -} - /*------------------------------------------------------------------------- * ivas_dirac_dec_get_response() * @@ -8228,11 +6857,11 @@ void ivas_dirac_dec_get_response_fx( move16(); c_fx_better = local_result_table[el][a]; move32(); - response_fx[b] = L_shl_sat( Mpy_32_32( c_fx_better, sin_az_fx[sub( sub( l, m ), 1 )] ), sub( Q_out, 30 ) ); // Q_out + response_fx[b] = L_shl_sat( Mpy_32_32( c_fx_better, sin_az_fx[l - m - 1] ), sub( Q_out, 30 ) ); // Q_out move32(); b1 = sub( b1_2, m ); - response_fx[b1] = L_shl_sat( Mpy_32_32( c_fx_better, cos_az_fx[sub( sub( l, m ), 1 )] ), sub( Q_out, 30 ) ); // Q_out + response_fx[b1] = L_shl_sat( Mpy_32_32( c_fx_better, cos_az_fx[l - m - 1] ), sub( Q_out, 30 ) ); // Q_out move32(); } @@ -8247,10 +6876,10 @@ void ivas_dirac_dec_get_response_fx( { c_fx_better = L_negate( c_fx_better ); } - response_fx[b] = L_shl_sat( Mpy_32_32( c_fx_better, sin_az_fx[sub( sub( l, m ), 1 )] ), sub( Q_out, 30 ) ); // Q_out + response_fx[b] = L_shl_sat( Mpy_32_32( c_fx_better, sin_az_fx[l - m - 1] ), sub( Q_out, 30 ) ); // Q_out move32(); b1 = sub( b1_2, m ); - response_fx[b1] = L_shl_sat( Mpy_32_32( c_fx_better, cos_az_fx[sub( sub( l, m ), 1 )] ), sub( Q_out, 30 ) ); // Q_out + response_fx[b1] = L_shl_sat( Mpy_32_32( c_fx_better, cos_az_fx[l - m - 1] ), sub( Q_out, 30 ) ); // Q_out move32(); } @@ -8810,9 +7439,9 @@ void ivas_spar_bitrate_dist_fx( FOR( i = 0; i < nchan_transport; i++ ) { - core_bits_act[sub( sub( nchan_transport, 1 ), i )] = sub( core_bits_act[sub( sub( nchan_transport, 1 ), i )], min( overflow_bits, core_range_bits[sub( sub( nchan_transport, 1 ), i )] ) ); + core_bits_act[nchan_transport - 1 - i] = sub( core_bits_act[nchan_transport - 1 - i], min( overflow_bits, core_range_bits[nchan_transport - 1 - i] ) ); move16(); - overflow_bits = sub( overflow_bits, core_range_bits[sub( sub( nchan_transport, 1 ), i )] ); + overflow_bits = sub( overflow_bits, core_range_bits[nchan_transport - 1 - i] ); IF( overflow_bits <= 0 ) { @@ -8832,7 +7461,7 @@ void ivas_spar_bitrate_dist_fx( overflow_bits = sub( overflow_bits, overflow_bits_ch ); } - core_bits_act[sub( nchan_transport, 1 )] = sub( core_bits_act[sub( nchan_transport, 1 )], max( 0, overflow_bits ) ); + core_bits_act[nchan_transport - 1] = sub( core_bits_act[nchan_transport - 1], max( 0, overflow_bits ) ); move16(); } } diff --git a/lib_com/ivas_spar_com_quant_util.c b/lib_com/ivas_spar_com_quant_util.c index d26cd9bb8..3c7b4e620 100644 --- a/lib_com/ivas_spar_com_quant_util.c +++ b/lib_com/ivas_spar_com_quant_util.c @@ -90,6 +90,75 @@ void ivas_quantise_real_values( return; } +void ivas_quantise_real_values_enc_fx_varq( + const Word32 *values_fx, + const Word16 q_levels, + const Word32 min_value_fx, + const Word32 max_value_fx, + Word16 *index, + Word32 *quant_fx, + const Word16 dim, + Word16 inp_q ) +{ + Word16 i; + Word32 q_step_fx, one_by_q_step_fx; + test(); + IF( EQ_16( q_levels, 1 ) ) + { + FOR( i = 0; i < dim; i++ ) + { + quant_fx[i] = 0; + move32(); + index[i] = 0; + move16(); + } + } + ELSE IF( q_levels && NE_32( max_value_fx, min_value_fx ) ) + { + Word16 nor_q_level = norm_l( sub( q_levels, 1 ) ); + Word32 one_by_q_levels = divide3232( L_shl( 1, ( nor_q_level ) ), L_shl( sub( q_levels, 1 ), ( nor_q_level ) ) ); // Q15 + one_by_q_levels = L_shl( one_by_q_levels, 16 ); // Q31 + q_step_fx = Mpy_32_32( L_sub( max_value_fx, min_value_fx ), one_by_q_levels ); // Q28 + Word16 exp; + Word16 one_by_max_min = BASOP_Util_Divide3232_Scale( ONE_IN_Q28, L_sub( max_value_fx, min_value_fx ), &exp ); // Q(15-exp) + one_by_q_step_fx = L_mult0( sub( q_levels, 1 ), one_by_max_min ); // Q(15-exp) + Word32 val_fx; + IF( LT_16( inp_q, Q28 ) ) + { + FOR( i = 0; i < dim; i++ ) + { + val_fx = L_max( L_shr( min_value_fx, sub( Q28, inp_q ) ), L_min( values_fx[i], L_shr( max_value_fx, sub( Q28, inp_q ) ) ) ); // Q(inp_q) + val_fx = L_shl( val_fx, sub( Q28, inp_q ) ); // Q28 + index[i] = round_fx( L_shl( Mpy_32_32( one_by_q_step_fx, val_fx ), add( Q4, exp ) ) ); // Q0 + move16(); + quant_fx[i] = imult3216( q_step_fx, index[i] ); // Q28 + move32(); + } + } + ELSE + { + FOR( i = 0; i < dim; i++ ) + { + val_fx = L_max( min_value_fx, L_min( L_shr( values_fx[i], sub( inp_q, Q28 ) ), max_value_fx ) ); // Q28 + index[i] = round_fx( L_shl( Mpy_32_32( one_by_q_step_fx, val_fx ), add( Q4, exp ) ) ); // Q0 + move16(); + quant_fx[i] = imult3216( q_step_fx, index[i] ); // Q28 + move32(); + } + } + } + ELSE + { + FOR( i = 0; i < dim; i++ ) + { + quant_fx[i] = values_fx[i]; + move32(); + } + } + return; +} + + #ifdef IVAS_FLOAT_FIXED void ivas_quantise_real_values_fx( const Word32 *values_fx, @@ -640,24 +709,6 @@ void ivas_copy_band_coeffs_idx_to_arr( * * clear band coeffs array in SPAR MD *-----------------------------------------------------------------------------------------*/ -void ivas_clear_band_coeffs( - ivas_band_coeffs_t *pband_coeffs, - const uint16_t num_bands ) -{ - uint16_t i; - - for ( i = 0; i < num_bands; i++ ) - { - set_zero( (float *) pband_coeffs[i].C_re, ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ) * ( IVAS_SPAR_MAX_DMX_CHS - 1 ) ); - set_zero( (float *) pband_coeffs[i].P_re, ( IVAS_SPAR_MAX_CH - 1 ) ); - set_zero( (float *) pband_coeffs[i].C_quant_re, ( IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS ) * ( IVAS_SPAR_MAX_DMX_CHS - 1 ) ); - set_zero( (float *) pband_coeffs[i].P_quant_re, ( IVAS_SPAR_MAX_CH - 1 ) ); - set_zero( pband_coeffs[i].pred_re, ( IVAS_SPAR_MAX_CH - 1 ) ); - set_zero( pband_coeffs[i].pred_quant_re, ( IVAS_SPAR_MAX_CH - 1 ) ); - } - - return; -} #ifdef IVAS_FLOAT_FIXED void ivas_clear_band_coeffs_fx( diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 4fde550bd..bfe312557 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -191,22 +191,15 @@ typedef struct ivas_dirac_config_data_struct /* SPAR MD structures */ typedef struct ivas_band_coeffs_t { - float pred_re[IVAS_SPAR_MAX_CH - 1]; // 22 - float C_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1]; // 22 - float P_re[IVAS_SPAR_MAX_CH - 1]; // 22 - float pred_quant_re[IVAS_SPAR_MAX_CH - 1]; - float C_quant_re[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1]; - float P_quant_re[IVAS_SPAR_MAX_CH - 1]; - Word16 q_pred_re_fx; - Word32 pred_re_fx[IVAS_SPAR_MAX_CH - 1]; // Q28 + Word32 pred_re_fx[IVAS_SPAR_MAX_CH - 1]; // Q22 for dec Word16 q_C_re_fx; - Word32 C_re_fx[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1]; + Word32 C_re_fx[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1]; // Q22 for dec Word16 q_P_re_fx; - Word32 P_re_fx[IVAS_SPAR_MAX_CH - 1]; // Q28 - Word32 pred_quant_re_fx[IVAS_SPAR_MAX_CH - 1]; // Q28 + Word32 P_re_fx[IVAS_SPAR_MAX_CH - 1]; // Q22 for dec + Word32 pred_quant_re_fx[IVAS_SPAR_MAX_CH - 1]; Word32 C_quant_re_fx[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1]; - Word32 P_quant_re_fx[IVAS_SPAR_MAX_CH - 1]; // Q28 + Word32 P_quant_re_fx[IVAS_SPAR_MAX_CH - 1]; } ivas_band_coeffs_t; typedef struct ivas_band_coeffs_ind_t @@ -547,9 +540,10 @@ typedef struct ivas_qdirection_band_data_struct int16_t elevation_m_alphabet[MAX_PARAM_SPATIAL_SUBFRAMES]; int16_t azimuth_m_alphabet[MAX_PARAM_SPATIAL_SUBFRAMES]; - float energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES]; #ifdef IVAS_FLOAT_FIXED Word32 energy_ratio_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Q30 */ +#else + float energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES]; #endif uint8_t distance[MAX_PARAM_SPATIAL_SUBFRAMES]; @@ -562,8 +556,8 @@ typedef struct ivas_qdirection_band_data_struct float q_azimuth[MAX_PARAM_SPATIAL_SUBFRAMES]; float q_elevation[MAX_PARAM_SPATIAL_SUBFRAMES]; #else - Word32 q_azimuth_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Q22 */ - Word32 q_elevation_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Q22 */ + Word32 q_azimuth_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Q22 */ + Word32 q_elevation_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Q22 */ #endif } IVAS_QDIRECTION_BAND_DATA; @@ -619,7 +613,7 @@ typedef struct ivas_masa_qmetadata_frame_struct #ifndef IVAS_FLOAT_FIXED float dir_comp_ratio; #else - Word16 dir_comp_ratio_fx; /* Q15 */ + Word16 dir_comp_ratio_fx; /* Q15 */ #endif uint8_t is_masa_ivas_format; diff --git a/lib_dec/gain_dec_fx.c b/lib_dec/gain_dec_fx.c index 61ef5f11a..e118b787d 100644 --- a/lib_dec/gain_dec_fx.c +++ b/lib_dec/gain_dec_fx.c @@ -43,25 +43,25 @@ void Es_pred_dec_fx( SWITCH( nb_bits ) { case 5: - *Es_pred = Es_pred_qua_5b_fx[enr_idx]; + *Es_pred = Es_pred_qua_5b_fx[enr_idx]; /*Q8*/ move16(); BREAK; case 4: - *Es_pred = Es_pred_qua_4b_fx[enr_idx]; + *Es_pred = Es_pred_qua_4b_fx[enr_idx]; /*Q8*/ move16(); BREAK; case 3: - *Es_pred = Es_pred_qua_3b_fx[enr_idx]; + *Es_pred = Es_pred_qua_3b_fx[enr_idx]; /*Q8*/ break; default: - *Es_pred = Es_pred_qua_5b_fx[enr_idx]; + *Es_pred = Es_pred_qua_5b_fx[enr_idx]; /*Q8*/ move16(); BREAK; } } ELSE { - *Es_pred = Es_pred_qua_4b_no_ltp_fx[enr_idx]; + *Es_pred = Es_pred_qua_4b_no_ltp_fx[enr_idx]; /*Q8*/ move16(); } } @@ -116,7 +116,7 @@ void gain_dec_tc_fx( /*----------------------------------------------------------------* * find number of bits for gain dequantization *----------------------------------------------------------------*/ - nBits = st_fx->acelp_cfg.gains_mode[shr( i_subfr_fx, 6 )]; + nBits = st_fx->acelp_cfg.gains_mode[( i_subfr_fx / 64 )]; move16(); /*-----------------------------------------------------------------* * calculate the predicted gain code @@ -124,13 +124,13 @@ void gain_dec_tc_fx( /*Ecode = (dotp( code, code, L_SUBFR) + 0.01f) / L_SUBFR; *gain_inov = 1.0f / (float)sqrt( Ecode );*/ - L_tmp = Dot_product12( code_fx, code_fx, L_SUBFR, &expg ); - expg = sub( expg, 18 + 6 ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ + L_tmp = Dot_product12( code_fx, code_fx, L_SUBFR, &expg ); /*Q31 - expg*/ + expg = sub( expg, 18 + 6 ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ expg2 = expg; move16(); L_tmp1 = L_tmp; /* sets to 'L_tmp' in 1 clock */ move32(); - L_tmp = Isqrt_lc( L_tmp, &expg ); + L_tmp = Isqrt_lc( L_tmp, &expg ); /*Q31 - expg*/ *gain_inov_fx = extract_h( L_shl( L_tmp, sub( expg, 3 ) ) ); move16(); /* gain_inov in Q12 */ @@ -138,7 +138,7 @@ void gain_dec_tc_fx( /* Ei = 10 * (float)log10( Ecode );*/ e_tmp = norm_l( L_tmp1 ); - f_tmp = Log2_norm_lc( L_shl( L_tmp1, e_tmp ) ); + f_tmp = Log2_norm_lc( L_shl( L_tmp1, e_tmp ) ); /*Q15*/ e_tmp = sub( expg2, add( 1, e_tmp ) ); L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 12330 ); /* Q13 */ /* 10*log10(2) in Q12*/ Ei_fx = round_fx( L_shl( L_tmp1, 11 ) ); /* Q8 */ @@ -177,7 +177,7 @@ void gain_dec_tc_fx( } ELSE /* nBits == 3 */ { - wgain_code = tbl_gain_code_tc_fx[index]; + wgain_code = tbl_gain_code_tc_fx[index]; /*Q13*/ move16(); } @@ -188,18 +188,18 @@ void gain_dec_tc_fx( /* *gain_code *= gcode0;*/ L_tmp = L_mult( wgain_code, gcode0_fx ); /* Q13*Q0 -> Q14 */ #ifdef BASOP_NOGLOB - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 2 ) ); + *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 2 ) ); /*Q16*/ #else *gain_code_fx = L_shl( L_tmp, add( exp_gcode0, 2 ) ); #endif - move32(); /* Q14 -> Q16 */ + move32(); /**norm_gain_code = *gain_code / *gain_inov;*/ expg = sub( norm_s( *gain_inov_fx ), 1 ); expg = s_max( expg, 0 ); tmp_fx = div_s( shr( 8192, expg ), *gain_inov_fx ); - *norm_gain_code_fx = L_shr( Mult_32_16( *gain_code_fx, tmp_fx ), sub( 1, expg ) ); + *norm_gain_code_fx = L_shr( Mult_32_16( *gain_code_fx, tmp_fx ), sub( 1, expg ) ); /*Q16*/ move32(); return; @@ -256,7 +256,7 @@ void gain_dec_tc_ivas_fx( /*----------------------------------------------------------------* * find number of bits for gain dequantization *----------------------------------------------------------------*/ - nBits = st_fx->acelp_cfg.gains_mode[shr( i_subfr_fx, 6 )]; + nBits = st_fx->acelp_cfg.gains_mode[( i_subfr_fx / 64 )]; move16(); /*-----------------------------------------------------------------* * calculate the predicted gain code @@ -264,13 +264,13 @@ void gain_dec_tc_ivas_fx( /*Ecode = (dotp( code, code, L_SUBFR) + 0.01f) / L_SUBFR; *gain_inov = 1.0f / (float)sqrt( Ecode );*/ - L_tmp = Dot_product12( code_fx, code_fx, L_SUBFR, &expg ); - expg = sub( expg, 18 + 6 ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ + L_tmp = Dot_product12( code_fx, code_fx, L_SUBFR, &expg ); /*Q31 - expg*/ + expg = sub( expg, 18 + 6 ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ expg2 = expg; move16(); L_tmp1 = L_tmp; /* sets to 'L_tmp' in 1 clock */ move32(); - L_tmp = Isqrt_lc( L_tmp, &expg ); + L_tmp = Isqrt_lc( L_tmp, &expg ); /*Q31 - expg*/ *gain_inov_fx = extract_h( L_shl( L_tmp, sub( expg, 3 ) ) ); move16(); /* gain_inov in Q12 */ @@ -278,7 +278,7 @@ void gain_dec_tc_ivas_fx( /* Ei = 10 * (float)log10( Ecode );*/ e_tmp = norm_l( L_tmp1 ); - f_tmp = Log2_norm_lc( L_shl( L_tmp1, e_tmp ) ); + f_tmp = Log2_norm_lc( L_shl( L_tmp1, e_tmp ) ); /*Q15*/ e_tmp = sub( expg2, add( 1, e_tmp ) ); L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 12330 ); /* Q13 */ /* 10*log10(2) in Q12*/ Ei_fx = round_fx( L_shl( L_tmp1, 11 ) ); /* Q8 */ @@ -302,7 +302,7 @@ void gain_dec_tc_ivas_fx( *------------------------------------------------------------------------------------------*/ /* index = (Word16)get_indice( st_fx,"gain_code", i_subfr_fx, ACELP_CORE);move16();*/ - index = (Word16) get_next_indice_fx( st_fx, nBits ); + index = (Word16) get_next_indice_fx( st_fx, nBits ); /*Q0*/ IF( GT_16( nBits, 3 ) ) @@ -321,16 +321,16 @@ void gain_dec_tc_ivas_fx( *-----------------------------------------------------------------*/ /* *gain_code *= gcode0;*/ - L_tmp = L_mult( wgain_code, gcode0_fx ); /* Q12*Q0 -> Q13 */ - *gain_code_fx = L_shl( L_tmp, add( exp_gcode0, 3 ) ); - move32(); /* Q13 -> Q16 */ + L_tmp = L_mult( wgain_code, gcode0_fx ); /* Q12*Q0 -> Q13 */ + *gain_code_fx = L_shl( L_tmp, add( exp_gcode0, 3 ) ); /* Q13 -> Q16 */ + move32(); /**norm_gain_code = *gain_code / *gain_inov;*/ expg = sub( norm_s( *gain_inov_fx ), 1 ); expg = s_max( expg, 0 ); tmp_fx = div_s( shr( 8192, expg ), *gain_inov_fx ); - *norm_gain_code_fx = L_shr( Mult_32_16( *gain_code_fx, tmp_fx ), sub( 1, expg ) ); + *norm_gain_code_fx = L_shr( Mult_32_16( *gain_code_fx, tmp_fx ), sub( 1, expg ) ); /*Q16*/ move32(); return; @@ -388,7 +388,7 @@ void gain_dec_mless_fx( /*-----------------------------------------------------------------* * decode pitch gain *-----------------------------------------------------------------*/ - nBits = st_fx->acelp_cfg.gains_mode[shr( i_subfr_fx, 6 )]; + nBits = st_fx->acelp_cfg.gains_mode[( i_subfr_fx / 64 )]; move16(); test(); @@ -400,7 +400,7 @@ void gain_dec_mless_fx( ( EQ_16( tc_subfr_fx, 4 * L_SUBFR ) && EQ_16( i_subfr_fx, 4 * L_SUBFR ) && EQ_16( L_frame_fx, L_FRAME16k ) ) ) { /* decode pitch gain */ - index = (Word16) get_next_indice_fx( st_fx, shr( nBits, 1 ) ); + index = (Word16) get_next_indice_fx( st_fx, shr( nBits, 1 ) ); /*Q0*/ /*Ei = (G_PITCH_MAX_TC192 - G_PITCH_MIN_TC192) / ((1 << (nBits>>1)) - 1);*/ /* set quantization step */ tmp_fx = div_s( 1, sub( shl( 1, shr( nBits, 1 ) ), 1 ) ); /*Q15*/ @@ -413,20 +413,20 @@ void gain_dec_mless_fx( /* calculate the predicted gain code */ /*Ecode = (dotp( code, code, L_SUBFR) + 0.01f) / L_SUBFR; *gain_inov = 1.0f / (float)sqrt( Ecode );*/ - L_tmp = Dot_product12( code_fx, code_fx, L_SUBFR, &expg ); - expg = sub( expg, 18 + 6 ); /* exp: -18 (code in Q12), -6 (/L_SUBFR) */ + L_tmp = Dot_product12( code_fx, code_fx, L_SUBFR, &expg ); /*Q31 - expg*/ + expg = sub( expg, 18 + 6 ); /* exp: -18 (code in Q12), -6 (/L_SUBFR) */ expg2 = expg; move16(); L_tmp1 = L_tmp; /* sets to 'L_tmp' in 1 clock */ move32(); - L_tmp = Isqrt_lc( L_tmp, &expg ); + L_tmp = Isqrt_lc( L_tmp, &expg ); /*Q31 - expg*/ *gain_inov_fx = extract_h( L_shl( L_tmp, sub( expg, 3 ) ) ); /* gain_inov in Q12 */ move16(); /*Ei = 10 * (float)log10( Ecode );*/ e_tmp = norm_l( L_tmp1 ); - f_tmp = Log2_norm_lc( L_shl( L_tmp1, e_tmp ) ); + f_tmp = Log2_norm_lc( L_shl( L_tmp1, e_tmp ) ); /*Q15*/ e_tmp = sub( expg2, add( 1, e_tmp ) ); L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 12330 ); /* Q13 */ /* 10*log10(2) in Q12*/ Ei_fx = round_fx( L_shl( L_tmp1, 11 ) ); /* Q8 */ @@ -454,7 +454,7 @@ void gain_dec_mless_fx( /* decode normalized codebook gain */ /*index = (short)get_indice( st_fx, "gain_code", i_subfr_fx, ACELP_CORE );move16();*/ - index = (Word16) get_next_indice_fx( st_fx, shr( add( nBits, 1 ), 1 ) ); + index = (Word16) get_next_indice_fx( st_fx, shr( add( nBits, 1 ), 1 ) ); /*Q0*/ move16(); /**gain_code = gain_dequant( index, G_CODE_MIN_TC192, G_CODE_MAX_TC192, (nBits+1)>>1 );*/ @@ -463,11 +463,11 @@ void gain_dec_mless_fx( /**gain_code *= gcode0;*/ L_tmp = L_mult( gain_code16, gcode0_fx ); /*Q0*Q0 -> Q1*/ #ifdef BASOP_NOGLOB - *gain_code_fx = L_shl_sat( L_tmp, add( add( expg, exp_gcode0 ), 15 ) ); + *gain_code_fx = L_shl_sat( L_tmp, add( add( expg, exp_gcode0 ), 15 ) ); /*Q16*/ #else *gain_code_fx = L_shl( L_tmp, add( add( expg, exp_gcode0 ), 15 ) ); #endif - move32(); /*Q16*/ + move32(); } ELSE { @@ -475,27 +475,27 @@ void gain_dec_mless_fx( { case 7: { - qua_table_fx = gain_qua_mless_7b_fx; + qua_table_fx = gain_qua_mless_7b_fx; /*Q14*/ BREAK; } case 6: { - qua_table_fx = gain_qua_mless_6b_fx; + qua_table_fx = gain_qua_mless_6b_fx; /*Q14*/ if ( st_fx->element_mode > EVS_MONO ) { // PMT("gain_qua_mless_6b_stereo to fixed point") - qua_table_fx = gain_qua_mless_6b_stereo_fx; + qua_table_fx = gain_qua_mless_6b_stereo_fx; /*Q14*/ } BREAK; } case 5: { - qua_table_fx = gain_qua_mless_5b_fx; + qua_table_fx = gain_qua_mless_5b_fx; /*Q14*/ BREAK; } default: { - qua_table_fx = gain_qua_mless_6b_fx; + qua_table_fx = gain_qua_mless_6b_fx; /*Q14*/ BREAK; } } @@ -509,26 +509,26 @@ void gain_dec_mless_fx( index = (Word16) get_next_indice_fx( st_fx, nBits ); move16(); - *gain_pit_fx = qua_table_fx[index * 2]; + *gain_pit_fx = qua_table_fx[index * 2]; /*Q14*/ move16(); /*Ecode = (dotp( code, code, L_SUBFR) + 0.01f) / L_SUBFR; *gain_inov = 1.0f / (float)sqrt( Ecode );*/ - L_tmp = Dot_product12( code_fx, code_fx, L_SUBFR, &expg ); - expg = sub( expg, 18 + 6 ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ + L_tmp = Dot_product12( code_fx, code_fx, L_SUBFR, &expg ); /*Q31 - expg*/ + expg = sub( expg, 18 + 6 ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ expg2 = expg; move16(); L_tmp1 = L_tmp; /* sets to 'L_tmp' in 1 clock */ move32(); - L_tmp = Isqrt_lc( L_tmp, &expg ); + L_tmp = Isqrt_lc( L_tmp, &expg ); /*Q31 - expg*/ *gain_inov_fx = extract_h( L_shl( L_tmp, sub( expg, 3 ) ) ); /* gain_inov in Q12 */ move16(); /*Ei = 10 * (float)log10( Ecode );*/ e_tmp = norm_l( L_tmp1 ); - f_tmp = Log2_norm_lc( L_shl( L_tmp1, e_tmp ) ); + f_tmp = Log2_norm_lc( L_shl( L_tmp1, e_tmp ) ); /*Q15*/ e_tmp = sub( expg2, add( 1, e_tmp ) ); L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 12330 ); /* Q13 */ /* 10*log10(2) in Q12*/ Ei_fx = round_fx( L_shl( L_tmp1, 11 ) ); /* Q8 */ @@ -559,13 +559,13 @@ void gain_dec_mless_fx( *-----------------------------------------------------------------*/ /**gain_code = qua_table[index * 2 + 1] * gcode0;*/ - L_tmp = L_mult( qua_table_fx[add( shl( index, 1 ), 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ + L_tmp = L_mult( qua_table_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ #ifdef BASOP_NOGLOB - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); + *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /*Q16*/ #else *gain_code_fx = L_shl( L_tmp, add( exp_gcode0, 6 ) ); #endif - move32(); /* Q10 -> Q16*/ + move32(); } /**norm_gain_code = *gain_code / *gain_inov;*/ @@ -573,7 +573,7 @@ void gain_dec_mless_fx( expg = s_max( expg, 0 ); tmp_fx = div_s( shr( 8192, expg ), *gain_inov_fx ); - *norm_gain_code_fx = L_shr( Mult_32_16( *gain_code_fx, tmp_fx ), sub( 1, expg ) ); + *norm_gain_code_fx = L_shr( Mult_32_16( *gain_code_fx, tmp_fx ), sub( 1, expg ) ); /*Q16*/ move32(); return; @@ -614,8 +614,8 @@ void gain_dec_lbr_fx( Word32 *gain_code_fx, /* o : quantized codebook gain Q16*/ Word16 *gain_inov_fx, /* o : gain of the innovation (used for normalization) Q12*/ Word32 *norm_gain_code_fx, /* o : norm. gain of the codebook excitation Q16*/ - Word32 gc_mem[], /* i/o: gain_code from previous subframes */ - Word16 gp_mem[], /* i/o: gain_pitch from previous subframes */ + Word32 gc_mem[], /* i/o: gain_code from previous subframes Q16*/ + Word16 gp_mem[], /* i/o: gain_pitch from previous subframes Q14*/ const Word16 L_subfr /* i : subfr lenght */ ) { @@ -634,14 +634,14 @@ void gain_dec_lbr_fx( { shift_L_subfr = add( shift_L_subfr, 1 ); } - L_tmp = Dot_product12( code_fx, code_fx, L_subfr, &expg ); - expg = sub( expg, add( 18, shift_L_subfr ) ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ + L_tmp = Dot_product12( code_fx, code_fx, L_subfr, &expg ); /*Q31 - expg*/ + expg = sub( expg, add( 18, shift_L_subfr ) ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ expg2 = expg; move16(); L_tmp2 = L_tmp; /* sets to 'L_tmp' in 1 clock */ move32(); - L_tmp = Isqrt_lc( L_tmp, &expg ); + L_tmp = Isqrt_lc( L_tmp, &expg ); /*Q31 - expg*/ *gain_inov_fx = extract_h( L_shl_sat( L_tmp, sub( expg, 3 ) ) ); /* gain_inov in Q12 */ move16(); @@ -686,9 +686,9 @@ void gain_dec_lbr_fx( } /* calculate predicted gain */ - aux_fx[0] = 4096; + aux_fx[0] = 4096; /*Q12*/ move16(); - aux_fx[1] = shl( ctype, 12 ); + aux_fx[1] = shl( ctype, 12 ); /*Q12*/ move16(); /* gcode0 = (float)pow(10, dotp(b, aux, n_pred) - 0.5f * (float)log10(Ecode)); @@ -696,7 +696,7 @@ void gain_dec_lbr_fx( gcode0 = (float)pow(10, 0.05(20 * dotp(b, aux, n_pred) - 10 * (float)log10(Ecode))); */ e_tmp = norm_l( L_tmp2 ); - f_tmp = Log2_norm_lc( L_shl( L_tmp2, e_tmp ) ); + f_tmp = Log2_norm_lc( L_shl( L_tmp2, e_tmp ) ); /*Q15*/ e_tmp = sub( expg2, add( 1, e_tmp ) ); L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 12330 ); /* Q13 */ /* 10*log10(2) in Q12*/ @@ -724,33 +724,33 @@ void gain_dec_lbr_fx( /* retrieve the codebook index and calculate both gains */ /*index = (Word16)get_indice( st_fx,"gain", i_subfr, ACELP_CORE);move16();*/ - index = (Word16) get_next_indice_fx( st_fx, nBits ); + index = (Word16) get_next_indice_fx( st_fx, nBits ); /*Q0*/ move16(); - *gain_pit_fx = cdbk_fx[index * 2]; + *gain_pit_fx = cdbk_fx[index * 2]; /*Q14*/ move16(); - L_tmp = L_mult( cdbk_fx[add( shl( index, 1 ), 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ + L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ #ifdef BASOP_NOGLOB - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); + *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /* Q10 -> Q16*/ #else *gain_code_fx = L_shl( L_tmp, add( exp_gcode0, 6 ) ); #endif - move16(); /* Q10 -> Q16*/ + move16(); - gc_mem[0] = *gain_code_fx; - move32(); /*Q16*/ - gp_mem[0] = *gain_pit_fx; - move16(); /*Q14*/ + gc_mem[0] = *gain_code_fx; /*Q16*/ + move32(); + gp_mem[0] = *gain_pit_fx; /*Q14*/ + move16(); } ELSE IF( EQ_16( i_subfr, L_SUBFR ) || EQ_16( L_subfr, 2 * L_SUBFR ) ) { - b_fx = b_2sfr_fx; + b_fx = b_2sfr_fx; /*Q12*/ move16(); n_pred = 4; move16(); - cdbk_fx = gp_gamma_1sfr_6b_fx; + cdbk_fx = gp_gamma_1sfr_6b_fx; /*Q14/Q9 */ SWITCH( nBits ) { case 7: @@ -766,18 +766,18 @@ void gain_dec_lbr_fx( } /* calculate predicted gain */ - aux_fx[0] = 4096; + aux_fx[0] = 4096; /*Q12*/ move16(); - aux_fx[1] = shl( ctype, 12 ); + aux_fx[1] = shl( ctype, 12 ); /*Q12*/ move16(); /*aux_fx[2] = (float)log10(gc_mem[0]); = log2(gc_mem[0])*log10(2);*/ e_tmp = norm_l( gc_mem[0] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); /*Q15*/ + e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ + L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ + aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ move16(); aux_fx[3] = shr( gp_mem[0], 2 ); /*Q12*/ @@ -798,23 +798,23 @@ void gain_dec_lbr_fx( exp_gcode0 = sub( exp_gcode0, 14 ); /* retrieve the codebook index and calculate both gains */ - index = (Word16) get_next_indice_fx( st_fx, nBits ); + index = (Word16) get_next_indice_fx( st_fx, nBits ); /*Q0*/ move16(); - *gain_pit_fx = cdbk_fx[index * 2]; + *gain_pit_fx = cdbk_fx[index * 2]; /*Q14*/ move16(); - L_tmp = L_mult( cdbk_fx[add( shl( index, 1 ), 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ + L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ #ifdef BASOP_NOGLOB - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); + *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /*Q16*/ #else *gain_code_fx = L_shl( L_tmp, add( exp_gcode0, 6 ) ); #endif - move16(); /* Q10 -> Q16*/ + move16(); - gc_mem[1] = *gain_code_fx; + gc_mem[1] = *gain_code_fx; /*Q16*/ move32(); - gp_mem[1] = *gain_pit_fx; + gp_mem[1] = *gain_pit_fx; /*Q14*/ move16(); } ELSE IF( EQ_16( i_subfr, 2 * L_SUBFR ) ) @@ -824,41 +824,41 @@ void gain_dec_lbr_fx( n_pred = 6; move16(); - cdbk_fx = gp_gamma_3sfr_6b_fx; + cdbk_fx = gp_gamma_3sfr_6b_fx; /*Q14/Q9 */ if ( EQ_16( nBits, 7 ) ) { - cdbk_fx = gp_gamma_3sfr_7b_fx; + cdbk_fx = gp_gamma_3sfr_7b_fx; /*Q14*/ // PMT("verify if gp_gamma_3sfr_7b_fx is correct") } /* calculate predicted gain */ - aux_fx[0] = 4096; + aux_fx[0] = 4096; /*Q12*/ move16(); - aux_fx[1] = shl( ctype, 12 ); + aux_fx[1] = shl( ctype, 12 ); /*Q12*/ move16(); /*aux_fx[2] = (float)log10(gc_mem[0]); = log2(gc_mem[0])*log10(2);*/ e_tmp = norm_l( gc_mem[0] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); /*Q15*/ + e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ + L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ + aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ move16(); /*aux[3] = (float)log10(gc_mem[1]); = log2(gc_mem[1])*log10(2);*/ e_tmp = norm_l( gc_mem[1] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[1], e_tmp ) ); - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[1])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + f_tmp = Log2_norm_lc( L_shl( gc_mem[1], e_tmp ) ); /*Q15*/ + e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[1])=16*/ + L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ + aux_fx[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ move16(); - aux_fx[4] = shr( gp_mem[0], 2 ); + aux_fx[4] = shr( gp_mem[0], 2 ); /*Q12*/ move16(); - aux_fx[5] = shr( gp_mem[1], 2 ); + aux_fx[5] = shr( gp_mem[1], 2 ); /*Q12*/ move16(); /*-----------------------------------------------------------------* @@ -879,29 +879,29 @@ void gain_dec_lbr_fx( index = (Word16) get_next_indice_fx( st_fx, nBits ); move16(); - *gain_pit_fx = cdbk_fx[shl( index, 1 )]; + *gain_pit_fx = cdbk_fx[( index * 2 )]; /*Q14*/ move16(); - L_tmp = L_mult( cdbk_fx[add( shl( index, 1 ), 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ + L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ #ifdef BASOP_NOGLOB *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /* Q10 -> Q16*/ #else *gain_code_fx = L_shl( L_tmp, add( exp_gcode0, 6 ) ); /* Q10 -> Q16*/ #endif move32(); - gc_mem[2] = *gain_code_fx; + gc_mem[2] = *gain_code_fx; /*Q16*/ move32(); - gp_mem[2] = *gain_pit_fx; + gp_mem[2] = *gain_pit_fx; /*Q14*/ move16(); } ELSE IF( EQ_16( i_subfr, 3 * L_SUBFR ) ) { - b_fx = b_4sfr_fx; + b_fx = b_4sfr_fx; /*Q12*/ n_pred = 8; move16(); - cdbk_fx = gp_gamma_4sfr_6b_fx; + cdbk_fx = gp_gamma_4sfr_6b_fx; /*Q14*/ #ifdef IVAS_GAIN_MOD IF( EQ_16( nBits, 7 ) ) { @@ -911,36 +911,36 @@ void gain_dec_lbr_fx( #endif /* calculate predicted gain */ - aux_fx[0] = 4096; + aux_fx[0] = 4096; /*Q12*/ move16(); - aux_fx[1] = shl( ctype, 12 ); + aux_fx[1] = shl( ctype, 12 ); /*Q12*/ move16(); /*aux[2] = (float)log10(gc_mem[0]); = log2(gc_mem[0])*log10(2);*/ e_tmp = norm_l( gc_mem[0] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); /*Q15*/ + e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ + L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ + aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ move16(); /*aux[3] = (float)log10(gc_mem[1]); = log2(gc_mem[1])*log10(2);*/ e_tmp = norm_l( gc_mem[1] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[1], e_tmp ) ); - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[1])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + f_tmp = Log2_norm_lc( L_shl( gc_mem[1], e_tmp ) ); /*Q15*/ + e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[1])=16*/ + L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ + aux_fx[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ move16(); /*aux[4] = (float)log10(gc_mem[2]); = log2(gc_mem[2])*log10(2);*/ e_tmp = norm_l( gc_mem[2] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[2], e_tmp ) ); - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[2])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[4] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + f_tmp = Log2_norm_lc( L_shl( gc_mem[2], e_tmp ) ); /*Q15*/ + e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[2])=16*/ + L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ + aux_fx[4] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ move16(); aux_fx[5] = shr( gp_mem[0], 2 ); /*Q12*/ @@ -965,26 +965,26 @@ void gain_dec_lbr_fx( exp_gcode0 = sub( exp_gcode0, 14 ); /* retrieve the codebook index and calculate both gains */ - index = (Word16) get_next_indice_fx( st_fx, nBits ); + index = (Word16) get_next_indice_fx( st_fx, nBits ); /*Q0*/ move16(); - *gain_pit_fx = cdbk_fx[shl( index, 1 )]; + *gain_pit_fx = cdbk_fx[( index * 2 )]; /*Q14*/ move16(); - L_tmp = L_mult( cdbk_fx[add( shl( index, 1 ), 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ + L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ #ifdef BASOP_NOGLOB - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); + *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /*Q16*/ #else *gain_code_fx = L_shl( L_tmp, add( exp_gcode0, 6 ) ); #endif - move32(); /* Q10 -> Q16*/ + move32(); } /* *norm_gain_code = *gain_code / *gain_inov; */ expg = sub( norm_s( *gain_inov_fx ), 1 ); expg = s_max( expg, 0 ); - tmp_fx = div_s( shr( 8192, expg ), *gain_inov_fx ); - *norm_gain_code_fx = L_shr( Mult_32_16( *gain_code_fx, tmp_fx ), sub( 1, expg ) ); + tmp_fx = div_s( shr( 8192, expg ), *gain_inov_fx ); /*Q15*/ + *norm_gain_code_fx = L_shr( Mult_32_16( *gain_code_fx, tmp_fx ), sub( 1, expg ) ); /*Q16*/ move32(); return; @@ -1000,8 +1000,8 @@ void gain_dec_lbr_ivas_fx( Word32 *gain_code_fx, /* o : quantized codebook gain Q16*/ Word16 *gain_inov_fx, /* o : gain of the innovation (used for normalization) Q12*/ Word32 *norm_gain_code_fx, /* o : norm. gain of the codebook excitation Q16*/ - Word32 gc_mem[], /* i/o: gain_code from previous subframes */ - Word16 gp_mem[], /* i/o: gain_pitch from previous subframes */ + Word32 gc_mem[], /* i/o: gain_code from previous subframes Q16*/ + Word16 gp_mem[], /* i/o: gain_pitch from previous subframes Q14*/ const Word16 L_subfr /* i : subfr lenght */ ) { @@ -1020,14 +1020,14 @@ void gain_dec_lbr_ivas_fx( { shift_L_subfr = add( shift_L_subfr, 1 ); } - L_tmp = Dot_product12( code_fx, code_fx, L_subfr, &expg ); - expg = sub( expg, add( 18, shift_L_subfr ) ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ + L_tmp = Dot_product12( code_fx, code_fx, L_subfr, &expg ); /*Q31 - expg*/ + expg = sub( expg, add( 18, shift_L_subfr ) ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ expg2 = expg; move16(); L_tmp2 = L_tmp; /* sets to 'L_tmp' in 1 clock */ move32(); - L_tmp = Isqrt_lc( L_tmp, &expg ); + L_tmp = Isqrt_lc( L_tmp, &expg ); /*Q31 - expg*/ *gain_inov_fx = extract_h( L_shl_sat( L_tmp, sub( expg, 3 ) ) ); /* gain_inov in Q12 */ move16(); @@ -1048,11 +1048,11 @@ void gain_dec_lbr_ivas_fx( test(); IF( i_subfr == 0 ) { - b_fx = b_1sfr_fx; + b_fx = b_1sfr_fx; /*Q12*/ move16(); n_pred = 2; move16(); - cdbk_fx = gp_gamma_1sfr_6b_fx; + cdbk_fx = gp_gamma_1sfr_6b_fx; /*Q14*/ SWITCH( nBits ) { case 8: @@ -1073,9 +1073,9 @@ void gain_dec_lbr_ivas_fx( } /* calculate predicted gain */ - aux_fx[0] = 4096; + aux_fx[0] = 4096; /*Q12*/ move16(); - aux_fx[1] = shl( ctype, 12 ); + aux_fx[1] = shl( ctype, 12 ); /*Q12*/ move16(); /* gcode0 = (float)pow(10, dotp(b, aux, n_pred) - 0.5f * (float)log10(Ecode)); @@ -1083,7 +1083,7 @@ void gain_dec_lbr_ivas_fx( gcode0 = (float)pow(10, 0.05(20 * dotp(b, aux, n_pred) - 10 * (float)log10(Ecode))); */ e_tmp = norm_l( L_tmp2 ); - f_tmp = Log2_norm_lc( L_shl( L_tmp2, e_tmp ) ); + f_tmp = Log2_norm_lc( L_shl( L_tmp2, e_tmp ) ); /*Q15*/ e_tmp = sub( expg2, add( 1, e_tmp ) ); L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 12330 ); /* Q13 */ /* 10*log10(2) in Q12*/ @@ -1111,33 +1111,33 @@ void gain_dec_lbr_ivas_fx( /* retrieve the codebook index and calculate both gains */ /*index = (Word16)get_indice( st_fx,"gain", i_subfr, ACELP_CORE);move16();*/ - index = (Word16) get_next_indice_fx( st_fx, nBits ); + index = (Word16) get_next_indice_fx( st_fx, nBits ); /*Q0*/ move16(); - *gain_pit_fx = cdbk_fx[index * 2]; + *gain_pit_fx = cdbk_fx[index * 2]; /*Q14*/ move16(); - L_tmp = L_mult( cdbk_fx[add( shl( index, 1 ), 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ + L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ #ifdef BASOP_NOGLOB - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); + *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /*Q16*/ #else *gain_code_fx = L_shl( L_tmp, add( exp_gcode0, 6 ) ); #endif - move16(); /* Q10 -> Q16*/ + move16(); - gc_mem[0] = *gain_code_fx; - move32(); /*Q16*/ - gp_mem[0] = *gain_pit_fx; - move16(); /*Q14*/ + gc_mem[0] = *gain_code_fx; /*Q16*/ + move32(); + gp_mem[0] = *gain_pit_fx; /*Q14*/ + move16(); } ELSE IF( EQ_16( i_subfr, L_SUBFR ) || EQ_16( L_subfr, 2 * L_SUBFR ) ) { - b_fx = b_2sfr_fx; + b_fx = b_2sfr_fx; /*Q12*/ move16(); n_pred = 4; move16(); - cdbk_fx = gp_gamma_1sfr_6b_fx; + cdbk_fx = gp_gamma_1sfr_6b_fx; /*Q14*/ SWITCH( nBits ) { case 7: @@ -1153,18 +1153,18 @@ void gain_dec_lbr_ivas_fx( } /* calculate predicted gain */ - aux_fx[0] = 4096; + aux_fx[0] = 4096; /*Q12*/ move16(); - aux_fx[1] = shl( ctype, 12 ); + aux_fx[1] = shl( ctype, 12 ); /*Q12*/ move16(); /*aux_fx[2] = (float)log10(gc_mem[0]); = log2(gc_mem[0])*log10(2);*/ e_tmp = norm_l( gc_mem[0] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); /*Q15*/ + e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ + L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ + aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ move16(); aux_fx[3] = shr( gp_mem[0], 2 ); /*Q12*/ @@ -1185,67 +1185,67 @@ void gain_dec_lbr_ivas_fx( exp_gcode0 = sub( exp_gcode0, 14 ); /* retrieve the codebook index and calculate both gains */ - index = (Word16) get_next_indice_fx( st_fx, nBits ); + index = (Word16) get_next_indice_fx( st_fx, nBits ); /*Q0*/ move16(); - *gain_pit_fx = cdbk_fx[index * 2]; + *gain_pit_fx = cdbk_fx[index * 2]; /*Q14*/ move16(); - L_tmp = L_mult( cdbk_fx[add( shl( index, 1 ), 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ + L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ #ifdef BASOP_NOGLOB - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); + *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /*Q16*/ #else *gain_code_fx = L_shl( L_tmp, add( exp_gcode0, 6 ) ); #endif - move16(); /* Q10 -> Q16*/ + move16(); - gc_mem[1] = *gain_code_fx; + gc_mem[1] = *gain_code_fx; /*Q16*/ move32(); - gp_mem[1] = *gain_pit_fx; + gp_mem[1] = *gain_pit_fx; /*Q14*/ move16(); } ELSE IF( EQ_16( i_subfr, 2 * L_SUBFR ) ) { - b_fx = b_3sfr_fx; + b_fx = b_3sfr_fx; /*Q12*/ move16(); n_pred = 6; move16(); - cdbk_fx = gp_gamma_3sfr_6b_fx; + cdbk_fx = gp_gamma_3sfr_6b_fx; /*Q14/Q9 */ if ( EQ_16( nBits, 7 ) ) { - cdbk_fx = gp_gamma_3sfr_7b_fx; + cdbk_fx = gp_gamma_3sfr_7b_fx; /*Q14*/ // PMT("verify if gp_gamma_3sfr_7b_fx is correct") } /* calculate predicted gain */ - aux_fx[0] = 4096; + aux_fx[0] = 4096; /*Q12*/ move16(); - aux_fx[1] = shl( ctype, 12 ); + aux_fx[1] = shl( ctype, 12 ); /*Q12*/ move16(); /*aux_fx[2] = (float)log10(gc_mem[0]); = log2(gc_mem[0])*log10(2);*/ e_tmp = norm_l( gc_mem[0] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); /*Q15*/ + e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ + L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ + aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ move16(); /*aux[3] = (float)log10(gc_mem[1]); = log2(gc_mem[1])*log10(2);*/ e_tmp = norm_l( gc_mem[1] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[1], e_tmp ) ); - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[1])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + f_tmp = Log2_norm_lc( L_shl( gc_mem[1], e_tmp ) ); /*Q15*/ + e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[1])=16*/ + L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ + aux_fx[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ move16(); - aux_fx[4] = shr( gp_mem[0], 2 ); + aux_fx[4] = shr( gp_mem[0], 2 ); /*Q12*/ move16(); - aux_fx[5] = shr( gp_mem[1], 2 ); + aux_fx[5] = shr( gp_mem[1], 2 ); /*Q12*/ move16(); /*-----------------------------------------------------------------* @@ -1263,70 +1263,70 @@ void gain_dec_lbr_ivas_fx( exp_gcode0 = sub( exp_gcode0, 14 ); /* retrieve the codebook index and calculate both gains */ - index = (Word16) get_next_indice_fx( st_fx, nBits ); + index = (Word16) get_next_indice_fx( st_fx, nBits ); /*Q0*/ move16(); - *gain_pit_fx = cdbk_fx[shl( index, 1 )]; + *gain_pit_fx = cdbk_fx[( index * 2 )]; move16(); - L_tmp = L_mult( cdbk_fx[add( shl( index, 1 ), 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ + L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ #ifdef BASOP_NOGLOB *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /* Q10 -> Q16*/ #else *gain_code_fx = L_shl( L_tmp, add( exp_gcode0, 6 ) ); /* Q10 -> Q16*/ #endif move32(); - gc_mem[2] = *gain_code_fx; + gc_mem[2] = *gain_code_fx; /*Q16*/ move32(); - gp_mem[2] = *gain_pit_fx; + gp_mem[2] = *gain_pit_fx; /*Q14*/ move16(); } ELSE IF( EQ_16( i_subfr, 3 * L_SUBFR ) ) { - b_fx = b_4sfr_fx; + b_fx = b_4sfr_fx; /*Q12*/ n_pred = 8; move16(); - cdbk_fx = gp_gamma_4sfr_6b_fx; + cdbk_fx = gp_gamma_4sfr_6b_fx; /*Q14*/ IF( EQ_16( nBits, 7 ) ) { - cdbk_fx = gp_gamma_4sfr_7b_fx; + cdbk_fx = gp_gamma_4sfr_7b_fx; /*Q14*/ // PMT( "verify if gp_gamma_4sfr_7b_fx is correct" ) } /* calculate predicted gain */ - aux_fx[0] = 4096; + aux_fx[0] = 4096; /*Q12*/ move16(); - aux_fx[1] = shl( ctype, 12 ); + aux_fx[1] = shl( ctype, 12 ); /*Q12*/ move16(); /*aux[2] = (float)log10(gc_mem[0]); = log2(gc_mem[0])*log10(2);*/ e_tmp = norm_l( gc_mem[0] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); /*Q15*/ + e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ + L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ + aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ move16(); /*aux[3] = (float)log10(gc_mem[1]); = log2(gc_mem[1])*log10(2);*/ e_tmp = norm_l( gc_mem[1] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[1], e_tmp ) ); - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[1])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + f_tmp = Log2_norm_lc( L_shl( gc_mem[1], e_tmp ) ); /*Q15*/ + e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[1])=16*/ + L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ + aux_fx[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ move16(); /*aux[4] = (float)log10(gc_mem[2]); = log2(gc_mem[2])*log10(2);*/ e_tmp = norm_l( gc_mem[2] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[2], e_tmp ) ); - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[2])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[4] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ + f_tmp = Log2_norm_lc( L_shl( gc_mem[2], e_tmp ) ); /*Q15*/ + e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[2])=16*/ + L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ + aux_fx[4] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ move16(); aux_fx[5] = shr( gp_mem[0], 2 ); /*Q12*/ @@ -1353,24 +1353,24 @@ void gain_dec_lbr_ivas_fx( /* retrieve the codebook index and calculate both gains */ index = (Word16) get_next_indice_fx( st_fx, nBits ); move16(); - *gain_pit_fx = cdbk_fx[shl( index, 1 )]; + *gain_pit_fx = cdbk_fx[( index * 2 )]; /*Q14*/ move16(); - L_tmp = L_mult( cdbk_fx[add( shl( index, 1 ), 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ + L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ #ifdef BASOP_NOGLOB - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); + *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /*Q16*/ #else *gain_code_fx = L_shl( L_tmp, add( exp_gcode0, 6 ) ); #endif - move32(); /* Q10 -> Q16*/ + move32(); } /* *norm_gain_code = *gain_code / *gain_inov; */ expg = sub( norm_s( *gain_inov_fx ), 1 ); expg = s_max( expg, 0 ); - tmp_fx = div_s( shr( 8192, expg ), *gain_inov_fx ); - *norm_gain_code_fx = L_shr( Mult_32_16( *gain_code_fx, tmp_fx ), sub( 1, expg ) ); + tmp_fx = div_s( shr( 8192, expg ), *gain_inov_fx ); /*Q15*/ + *norm_gain_code_fx = L_shr( Mult_32_16( *gain_code_fx, tmp_fx ), sub( 1, expg ) ); /*Q15*/ move32(); return; @@ -1755,7 +1755,7 @@ void gain_dec_SQ_fx( * get number of bits *-----------------------------------------------------------------*/ - nBits = st_fx->acelp_cfg.gains_mode[shr( i_subfr, 6 )]; + nBits = st_fx->acelp_cfg.gains_mode[( i_subfr / 64 )]; move16(); /*-----------------------------------------------------------------* @@ -1786,7 +1786,7 @@ void gain_dec_SQ_fx( move16(); L_tmp1 = L_tmp; /* sets to 'L_tmp' in 1 clock */ move32(); - L_tmp = Isqrt_lc( L_tmp, &expg ); + L_tmp = Isqrt_lc( L_tmp, &expg ); /*Q31 - expg*/ *gain_inov = extract_h( L_shl( L_tmp, sub( expg, 3 ) ) ); /* gain_inov in Q12 */ move16(); @@ -1822,18 +1822,18 @@ void gain_dec_SQ_fx( L_tmp = L_mult( tmp16, gcode0 ); /* Q0*Q0 -> Q1*/ /**gain_code = L_shl(L_tmp,add(expg,15)); Q16*/ #ifdef BASOP_NOGLOB - *gain_code = L_shl_sat( L_tmp, add( add( expg, exp_gcode0 ), 15 ) ); + *gain_code = L_shl_sat( L_tmp, add( add( expg, exp_gcode0 ), 15 ) ); /*Q16*/ #else *gain_code = L_shl( L_tmp, add( add( expg, exp_gcode0 ), 15 ) ); #endif - move32(); /*Q16*/ + move32(); /**norm_gain_code = *gain_code / *gain_inov;*/ expg = sub( norm_s( *gain_inov ), 1 ); expg = s_max( expg, 0 ); - tmp16 = div_s( shr( 8192, expg ), *gain_inov ); - *norm_gain_code = L_shr( Mult_32_16( *gain_code, tmp16 ), sub( 1, expg ) ); + tmp16 = div_s( shr( 8192, expg ), *gain_inov ); /*Q15*/ + *norm_gain_code = L_shr( Mult_32_16( *gain_code, tmp16 ), sub( 1, expg ) ); /*Q16*/ move32(); return; @@ -1848,12 +1848,12 @@ void gain_dec_SQ_fx( void gain_dec_amr_wb_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word32 core_brate, /* i : core bitrate */ - Word16 *gain_pit, /* o : Quantized pitch gain */ - Word32 *gain_code, /* o : Quantized codeebook gain */ - Word16 *past_qua_en, /* i/o: gain quantization memory (4 words) */ - Word16 *gain_inov, /* o : unscaled innovation gain */ - const Word16 *code, /* i : algebraic code excitation */ - Word32 *norm_gain_code /* o : norm. gain of the codebook excitation */ + Word16 *gain_pit, /* o : Quantized pitch gain Q14*/ + Word32 *gain_code, /* o : Quantized codeebook gain Q16*/ + Word16 *past_qua_en, /* i/o: gain quantization memory (4 words) Q10*/ + Word16 *gain_inov, /* o : unscaled innovation gain Q12*/ + const Word16 *code, /* i : algebraic code excitation Q9*/ + Word32 *norm_gain_code /* o : norm. gain of the codebook excitation Q16*/ ) { Word16 i, index, index2; @@ -1871,9 +1871,9 @@ void gain_dec_amr_wb_fx( /**gain_inov = 1.0f/ (float)sqrt( ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR );*/ - L_tmp = Dot_product12( code, code, L_SUBFR, &expg ); - expg = sub( expg, 18 + 6 ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ - L_tmp = Isqrt_lc( L_tmp, &expg ); + L_tmp = Dot_product12( code, code, L_SUBFR, &expg ); /*Q31 - expg*/ + expg = sub( expg, 18 + 6 ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ + L_tmp = Isqrt_lc( L_tmp, &expg ); /*Q31 - expg*/ *gain_inov = extract_h( L_shl( L_tmp, sub( expg, 3 ) ) ); /* gain_inov in Q12 */ move16(); @@ -1939,23 +1939,23 @@ void gain_dec_amr_wb_fx( /*-----------------------------------------------------------------* * Decode code gain *-----------------------------------------------------------------*/ - qua_en = t_qua_gain[add( index2, 1 )]; + qua_en = t_qua_gain[( index2 + 1 )]; move16(); /* *gain_code = t_qua_gain[indice*2+1] * gcode0; */ - L_tmp = L_mult( qua_en, gcode0 ); /* Q11*Q0 -> Q12 */ - tmp = round_fx( L_tmp ); /* Q-4 */ - *gain_code = L_shl( L_tmp, add( exp_gcode0, 4 ) ); - move32(); /* Q12 -> Q16 */ + L_tmp = L_mult( qua_en, gcode0 ); /* Q11*Q0 -> Q12 */ + tmp = round_fx( L_tmp ); /* Q-4 */ + *gain_code = L_shl( L_tmp, add( exp_gcode0, 4 ) ); /* Q12 -> Q16 */ + move32(); /* adjust gain according to energy of code */ L_tmp = Mult_32_16( *gain_code, *gain_inov ); #ifdef BASOP_NOGLOB - *gain_code = L_shl_o( L_tmp, 3, &Overflow ); + *gain_code = L_shl_o( L_tmp, 3, &Overflow ); /* gcode_inov in Q12*/ #else *gain_code = L_shl( L_tmp, 3 ); #endif - move32(); /* gcode_inov in Q12*/ + move32(); /*-----------------------------------------------------------------* * update table of past quantized energies @@ -1989,8 +1989,8 @@ void gain_dec_amr_wb_fx( expg = sub( norm_s( *gain_inov ), 1 ); expg = s_max( expg, 0 ); - tmp = div_s( shr( 8192, expg ), *gain_inov ); - *norm_gain_code = L_shr( Mult_32_16( *gain_code, tmp ), sub( 1, expg ) ); + tmp = div_s( shr( 8192, expg ), *gain_inov ); /*Q15*/ + *norm_gain_code = L_shr( Mult_32_16( *gain_code, tmp ), sub( 1, expg ) ); /*Q16*/ move32(); return; diff --git a/lib_dec/gaus_dec_fx.c b/lib_dec/gaus_dec_fx.c index 5221e14f4..802cc3b41 100644 --- a/lib_dec/gaus_dec_fx.c +++ b/lib_dec/gaus_dec_fx.c @@ -53,7 +53,7 @@ void gaus_dec_fx( /*------------------------------------------------------------------------------------------* * Unvoiced : Gaussian codebook *------------------------------------------------------------------------------------------*/ - nb_bits = st_fx->acelp_cfg.fixed_cdk_index[shr( i_subfr, 6 )]; + nb_bits = st_fx->acelp_cfg.fixed_cdk_index[( i_subfr / 64 )]; move16(); gaus_dec2v_fx( st_fx, code, L_SUBFR, shr( nb_bits, 1 ) ); @@ -68,7 +68,7 @@ void gaus_dec_fx( *inv_gain_inov = extract_h( L_shl_sat( L_tmp, sub( exp, 3 ) ) ); /* inv_gain_inov in Q12 */ move16(); - nb_bits = st_fx->acelp_cfg.gains_mode[shr( i_subfr, 6 )]; + nb_bits = st_fx->acelp_cfg.gains_mode[( i_subfr / 64 )]; move16(); idx = (Word16) get_next_indice_fx( st_fx, nb_bits ); move16(); @@ -83,7 +83,7 @@ void gaus_dec_fx( move16(); } - *L_gain_code = gain_dec_gaus_fx( idx, nb_bits, -30, 190, *inv_gain_inov, L_norm_gain_code ); + *L_gain_code = gain_dec_gaus_fx( idx, nb_bits, -30, 190, *inv_gain_inov, L_norm_gain_code ); /*Q16*/ move32(); /* update LP filtered gains for the case of frame erasures */ @@ -102,7 +102,7 @@ void gaus_dec_fx( *tilt_code = 0; move16(); - *voice_fac = -32768; /* only unvoiced */ + *voice_fac = -32768; /* only unvoiced Q15 */ move16(); *gain_pit = 0; /* needed for BASS postfitler */ move16(); @@ -127,11 +127,11 @@ void gaus_dec_fx( L_SUBFR, L_SUBFR * 2, *L_gain_code, sQ_exc, sQsubfr, exc2, i_subfr, UNVOICED ); } - gain_code = round_fx( L_shl( *L_gain_code, *sQ_exc ) ); + gain_code = round_fx( L_shl( *L_gain_code, *sQ_exc ) ); /*sQ_exc*/ FOR( i = 0; i < L_SUBFR; i++ ) { L_tmp = L_shl( L_mult( gain_code, code[i] ), 6 /*3*/ ); - exc[add( i, i_subfr )] = round_fx( L_tmp ); + exc[( i + i_subfr )] = round_fx( L_tmp ); /*sQ_exc+3*/ move16(); } @@ -164,10 +164,10 @@ void gaus_dec2v_fx( const Word16 *pt1, *pt2; Word16 index_delta; - step = shr( 0x80, nb_bits ); + step = shr( 0x80, nb_bits ); /*Q0*/ - idx = (Word16) get_next_indice_fx( st_fx, add( shl( nb_bits, 1 ), 1 ) ); - index_delta = (Word16) get_next_indice_fx( st_fx, 3 ); + idx = (Word16) get_next_indice_fx( st_fx, add( shl( nb_bits, 1 ), 1 ) ); /*Q0*/ + index_delta = (Word16) get_next_indice_fx( st_fx, 3 ); /*Q0*/ move16(); move16(); @@ -175,7 +175,7 @@ void gaus_dec2v_fx( delta = shl( index_delta, STEP_DELTA_FX ); delta2 = mac_r( 16384 * 65536, shr( delta, 1 ), delta ); - inv_delta = div_s( 16384, delta2 ); + inv_delta = div_s( 16384, delta2 ); /*Q15*/ IF( delta > 0 ) { @@ -184,8 +184,8 @@ void gaus_dec2v_fx( FOR( i = 1; i < 190; i++ ) { /* gaus_dico2[i] = (gaus_dico_fx[i] - delta*gaus_dico_fx[i-1])/(1+delta*delta) */ - tmp16 = msu_r( L_deposit_h( gaus_dico_fx[i] ), delta, gaus_dico_fx[i - 1] ); - gaus_dico2_fx[i] = mult_r( tmp16, inv_delta ); + tmp16 = msu_r( L_deposit_h( gaus_dico_fx[i] ), delta, gaus_dico_fx[i - 1] ); /*Q12*/ + gaus_dico2_fx[i] = mult_r( tmp16, inv_delta ); /*Q12*/ move16(); } } @@ -198,14 +198,14 @@ void gaus_dec2v_fx( } } - pt1 = &gaus_dico2_fx[i_mult2( ind1, step )]; - pt2 = &gaus_dico2_fx[i_mult2( ind2, step )]; + pt1 = &gaus_dico2_fx[( ind1 * step )]; /*Q12*/ + pt2 = &gaus_dico2_fx[( ind2 * step )]; /*Q12*/ FOR( i = 0; i < lg; i++ ) { /* code is Q9, Gaussian codebook is Q12 */ /* code[i] = pt1[i] * sign1 + pt2[i] * sign2 */ - code[i] = add( mult( pt1[i], sign1 ), mult( pt2[i], sign2 ) ); + code[i] = add( mult( pt1[i], sign1 ), mult( pt2[i], sign2 ) ); /*Q12-exp*/ move16(); } @@ -242,9 +242,9 @@ static void dec_2pos_fx( index = shr( index, 1 ); - *ind1 = shr( index, log2_n ); + *ind1 = shr( index, log2_n ); /*Q0*/ move16(); - *ind2 = sub( index, shl( *ind1, log2_n ) ); + *ind2 = sub( index, shl( *ind1, log2_n ) ); /*Q0*/ move16(); *sign2 = *sign1; move16(); @@ -276,21 +276,21 @@ void gaus_L2_dec( Word32 tmp32; /*Generate white gaussian noise using central limit theorem method (N only 4 as E_util_random is not purely uniform)*/ - seed = *seed_acelp; + seed = *seed_acelp; /*Q0*/ move16(); FOR( i = 0; i < L_SUBFR; i++ ) { Random( &seed ); - tmp32 = L_mac( 0, seed, 1 << 9 ); + tmp32 = L_mac( 0, seed, 1 << 9 ); /*Q9*/ Random( &seed ); - tmp32 = L_mac( tmp32, seed, 1 << 9 ); + tmp32 = L_mac( tmp32, seed, 1 << 9 ); /*Q9*/ Random( &seed ); - code[i] = mac_r( tmp32, seed, 1 << 9 ); + code[i] = mac_r( tmp32, seed, 1 << 9 ); /*Q9*/ move16(); } - *seed_acelp = seed; + *seed_acelp = seed; /*Q0*/ move16(); /*Shape the gaussian excitation*/ diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index beeec44b7..45a008543 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -41,6 +41,7 @@ #include "ivas_prot_fx.h" #include "ivas_cnst.h" #include "ivas_rom_com.h" +#include "ivas_rom_com_fx.h" #include "wmc_auto.h" /*------------------------------------------------------------------------- @@ -65,80 +66,67 @@ static void computeIntensityVector_enc( DIRAC_ENC_HANDLE hDirAC, float Cldfb_Rea *------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -ivas_error ivas_dirac_enc_open( +ivas_error ivas_dirac_enc_open_fx( Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ) { - int16_t i, j; + Word16 i, j; DIRAC_ENC_HANDLE hDirAC; - int32_t dirac_slot_ns; + Word32 dirac_slot_ns; ivas_error error; error = IVAS_ERR_OK; + move16(); - if ( ( hDirAC = (DIRAC_ENC_HANDLE) malloc( sizeof( DIRAC_ENC_DATA ) ) ) == NULL ) + IF( ( hDirAC = (DIRAC_ENC_HANDLE) malloc( sizeof( DIRAC_ENC_DATA ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); } - if ( ( hDirAC->hConfig = (DIRAC_CONFIG_DATA_HANDLE) malloc( sizeof( DIRAC_CONFIG_DATA ) ) ) == NULL ) + IF( ( hDirAC->hConfig = (DIRAC_CONFIG_DATA_HANDLE) malloc( sizeof( DIRAC_CONFIG_DATA ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC Config\n" ) ); } hDirAC->firstrun_sector_params = 1; - set_zero( hDirAC->sec_I_vec_smth_x[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); - set_zero( hDirAC->sec_I_vec_smth_y[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); - set_zero( hDirAC->sec_I_vec_smth_z[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); - set_zero( hDirAC->azi_prev, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); - set_zero( hDirAC->ele_prev, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); - set_zero( hDirAC->energy_smth[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + move16(); + + set32_fx( hDirAC->sec_I_vec_smth_x_fx[0], 0, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set16_fx( hDirAC->sec_I_vec_smth_x_exp[0], 0, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set32_fx( hDirAC->sec_I_vec_smth_y_fx[0], 0, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set16_fx( hDirAC->sec_I_vec_smth_y_exp[0], 0, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set32_fx( hDirAC->sec_I_vec_smth_z_fx[0], 0, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set16_fx( hDirAC->sec_I_vec_smth_z_exp[0], 0, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set32_fx( hDirAC->energy_smth_fx[0], 0, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set16_fx( hDirAC->energy_smth_exp[0], 0, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set32_fx( hDirAC->ele_prev_fx, 0, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set32_fx( hDirAC->azi_prev_fx, 0, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); /*-----------------------------------------------------------------* * DirAC main configuration *-----------------------------------------------------------------*/ st_ivas->hDirAC = hDirAC; -#ifdef IVAS_FLOAT_FIXED IF( ( error = ivas_dirac_config_fx( (void *) st_ivas, ENC ) ) != IVAS_ERR_OK ) { return error; } -#else - if ( ( error = ivas_dirac_config( (void *) st_ivas, ENC ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif /* set FB config. */ hDirAC->hFbMixer = NULL; - for ( i = 0; i < DIRAC_MAX_NBANDS + 1; i++ ) + FOR( i = 0; i < DIRAC_MAX_NBANDS + 1; i++ ) { /* adapt band grouping to from CLDFB to MDFT bands */ - hDirAC->band_grouping[i] *= CLDFB_TO_MDFT_FAC; + hDirAC->band_grouping[i] = imult1616( hDirAC->band_grouping[i], CLDFB_TO_MDFT_FAC ); + move16(); } dirac_slot_ns = DIRAC_SLOT_ENC_NS; - + move16(); /* initialize delay for SPAR/DirAC delay synchronization */ /* intensity 3-dim */ - for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) { - if ( ( hDirAC->direction_vector_m[i] = (float **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) - { - if ( ( hDirAC->direction_vector_m[i][j] = (float *) malloc( DIRAC_MAX_NBANDS * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->direction_vector_m[i][j], 0.0f, DIRAC_MAX_NBANDS ); - } -#ifdef IVAS_FLOAT_FIXED IF( ( hDirAC->direction_vector_m_fx[i] = (Word32 **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( Word32 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); @@ -146,38 +134,22 @@ ivas_error ivas_dirac_enc_open( FOR( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) { - if ( ( hDirAC->direction_vector_m_fx[i][j] = (Word32 *) malloc( DIRAC_MAX_NBANDS * sizeof( Word32 ) ) ) == NULL ) + IF( ( hDirAC->direction_vector_m_fx[i][j] = (Word32 *) malloc( DIRAC_MAX_NBANDS * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); } set32_fx( hDirAC->direction_vector_m_fx[i][j], 0, DIRAC_MAX_NBANDS ); } -#endif } - hDirAC->no_col_avg_diff = (int16_t) ( DIRAC_NO_COL_AVG_DIFF_NS / dirac_slot_ns ); - for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) - { - if ( ( hDirAC->buffer_intensity_real[i] = (float **) malloc( hDirAC->no_col_avg_diff * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - for ( j = 0; j < hDirAC->no_col_avg_diff; j++ ) - { - if ( ( hDirAC->buffer_intensity_real[i][j] = (float *) malloc( DIRAC_MAX_NBANDS * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->buffer_intensity_real[i][j], 0.0f, DIRAC_MAX_NBANDS ); - } - } + Word16 tmp_e = 0; + move16(); + Word16 tmp = BASOP_Util_Divide3232_Scale( (Word32) DIRAC_NO_COL_AVG_DIFF_NS, dirac_slot_ns, &tmp_e ); + hDirAC->no_col_avg_diff = shr( tmp, sub( 15, tmp_e ) ); + + set16_fx( (Word16 *) hDirAC->buffer_energy_q, 0, DIRAC_NO_COL_AVG_DIFF * DIRAC_MAX_NBANDS ); + set16_fx( (Word16 *) hDirAC->buffer_intensity_real_q, 0, DIRAC_NUM_DIMS * DIRAC_NO_COL_AVG_DIFF * DIRAC_MAX_NBANDS ); - if ( ( hDirAC->buffer_energy = (float *) malloc( DIRAC_MAX_NBANDS * hDirAC->no_col_avg_diff * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->buffer_energy, 0.0f, DIRAC_MAX_NBANDS * hDirAC->no_col_avg_diff ); -#ifdef IVAS_FLOAT_FIXED FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) { IF( ( hDirAC->buffer_intensity_real_fx[i] = (Word32 **) malloc( hDirAC->no_col_avg_diff * sizeof( Word32 * ) ) ) == NULL ) @@ -191,6 +163,7 @@ ivas_error ivas_dirac_enc_open( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); } set32_fx( hDirAC->buffer_intensity_real_fx[i][j], 0, DIRAC_MAX_NBANDS ); + set16_fx( hDirAC->buffer_intensity_real_q[i][j], Q31, hDirAC->hConfig->nbands ); } } @@ -199,23 +172,28 @@ ivas_error ivas_dirac_enc_open( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); } set32_fx( hDirAC->buffer_energy_fx, 0, DIRAC_MAX_NBANDS * hDirAC->no_col_avg_diff ); -#endif + set16_fx( hDirAC->buffer_energy_q, Q31, DIRAC_MAX_NBANDS * hDirAC->no_col_avg_diff ); - if ( st_ivas->hQMetaData->useLowerRes ) + IF( st_ivas->hQMetaData->useLowerRes ) { hDirAC->block_grouping[0] = 0; hDirAC->block_grouping[1] = MAX_PARAM_SPATIAL_SUBFRAMES; + move16(); + move16(); } - else + ELSE { - mvs2s( DirAC_block_grouping_5ms_MDFT, hDirAC->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + Copy( DirAC_block_grouping_5ms_MDFT, hDirAC->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); } hDirAC->index_buffer_intensity = 0; hDirAC->mono_frame_count = 0; + move16(); + move16(); st_ivas->hDirAC = hDirAC; st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; + move16(); return error; } @@ -414,7 +392,66 @@ ivas_error ivas_dirac_enc_reconfigure( * * Close DirAC encoder handle *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_dirac_enc_close_fx( + DIRAC_ENC_HANDLE *hDirAC_out, /* i/o: encoder DirAC handle */ + const Word32 input_Fs /* i : input sampling rate */ +) +{ + Word16 i, j; + DIRAC_ENC_HANDLE hDirAC; + IF( hDirAC_out == NULL || *hDirAC_out == NULL ) + { + return; + } + + hDirAC = *hDirAC_out; + + IF( hDirAC->hFbMixer != NULL ) + { + ivas_FB_mixer_close( &hDirAC->hFbMixer, input_Fs, 0 ); + } + /* intensity 3-dim */ + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + FOR( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + free( hDirAC->direction_vector_m_fx[i][j] ); + hDirAC->direction_vector_m_fx[i][j] = NULL; + } + + FOR( j = 0; j < hDirAC->no_col_avg_diff; j++ ) + { + IF( hDirAC->buffer_intensity_real_fx[i][j] != 0 ) + { + free( hDirAC->buffer_intensity_real_fx[i][j] ); + hDirAC->buffer_intensity_real_fx[i][j] = NULL; + } + } + + free( hDirAC->buffer_intensity_real_fx[i] ); + hDirAC->buffer_intensity_real_fx[i] = NULL; + + free( hDirAC->direction_vector_m_fx[i] ); + hDirAC->direction_vector_m_fx[i] = NULL; + } + + free( hDirAC->buffer_energy_fx ); + hDirAC->buffer_energy_fx = NULL; + + IF( hDirAC->hConfig != NULL ) + { + free( hDirAC->hConfig ); + hDirAC->hConfig = NULL; + } + + free( *hDirAC_out ); + *hDirAC_out = NULL; + + return; +} +#else void ivas_dirac_enc_close( DIRAC_ENC_HANDLE *hDirAC_out, /* i/o: encoder DirAC handle */ const int32_t input_Fs /* i : input sampling rate */ @@ -439,14 +476,16 @@ void ivas_dirac_enc_close( { for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) { +#ifndef IVAS_FLOAT_FIXED free( hDirAC->direction_vector_m[i][j] ); hDirAC->direction_vector_m[i][j] = NULL; -#ifdef IVAS_FLOAT_FIXED +#else free( hDirAC->direction_vector_m_fx[i][j] ); hDirAC->direction_vector_m_fx[i][j] = NULL; #endif } +#ifndef IVAS_FLOAT_FIXED for ( j = 0; j < hDirAC->no_col_avg_diff; j++ ) { if ( hDirAC->buffer_intensity_real[i][j] != 0 ) @@ -459,7 +498,7 @@ void ivas_dirac_enc_close( free( hDirAC->buffer_intensity_real[i] ); hDirAC->buffer_intensity_real[i] = NULL; -#ifdef IVAS_FLOAT_FIXED +#else FOR( j = 0; j < hDirAC->no_col_avg_diff; j++ ) { IF( hDirAC->buffer_intensity_real_fx[i][j] != 0 ) @@ -473,16 +512,22 @@ void ivas_dirac_enc_close( hDirAC->buffer_intensity_real_fx[i] = NULL; #endif +#ifndef IVAS_FLOAT_FIXED free( hDirAC->direction_vector_m[i] ); hDirAC->direction_vector_m[i] = NULL; -#ifdef IVAS_FLOAT_FIXED +#else free( hDirAC->direction_vector_m_fx[i] ); hDirAC->direction_vector_m_fx[i] = NULL; #endif } +#ifndef IVAS_FLOAT_FIXED free( hDirAC->buffer_energy ); hDirAC->buffer_energy = NULL; +#else + free( hDirAC->buffer_energy_fx ); + hDirAC->buffer_energy_fx = NULL; +#endif if ( hDirAC->hConfig != NULL ) { @@ -495,7 +540,7 @@ void ivas_dirac_enc_close( return; } - +#endif /*------------------------------------------------------------------------- * ivas_dirac_enc() @@ -505,178 +550,30 @@ void ivas_dirac_enc_close( *------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -ivas_error ivas_dirac_enc( - DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ - float *data_f[], /* i/o: SBA channels */ - float **ppIn_FR_real, /* o : real freq domain values */ - float **ppIn_FR_imag, /* o : imag freq domain values */ - const int16_t input_frame, /* i : input frame length */ - const int16_t dtx_vad, /* i : DTX vad flag */ - const IVAS_FORMAT ivas_format, /* i : ivas format */ - const int16_t hodirac_flag /* i : hodirac flag */ +ivas_error ivas_dirac_enc_fx( + DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ + Word32 *data_f_fx[], /* i/o: SBA channels Qx */ + Word32 **pp_fr_real_fx, /* o : real freq domain values pp_fr_q */ + Word32 **pp_fr_imag_fx, /* o : imag freq domain values pp_fr_q */ + Word16 pp_fr_q, + const Word16 input_frame, /* i : input frame length Q0 */ + const Word16 dtx_vad, /* i : DTX vad flag Q0 */ + const IVAS_FORMAT ivas_format, /* i : ivas format */ + const Word16 hodirac_flag /* i : hodirac flag Q0 */ ) { - int16_t orig_dirac_bands; - float dir[3], avg_dir[3]; -#ifdef IVAS_FLOAT_FIXED + Word16 orig_dirac_bands; Word32 dir_fx[3], avg_dir_fx[3]; -#endif - float energySum, vecLen; - int16_t i, j, b, i_ts; + Word16 i, j, b, i_ts; ivas_error error; push_wmops( "ivas_dirac_enc" ); -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - /*---------------------------------------------- float to fixed ----------------------------------------------*/ - - set16_fx( (Word16 *) hDirAC->buffer_energy_q, 0, DIRAC_NO_COL_AVG_DIFF * DIRAC_MAX_NBANDS ); - set16_fx( (Word16 *) hDirAC->buffer_intensity_real_q, 0, DIRAC_NUM_DIMS * DIRAC_NO_COL_AVG_DIFF * DIRAC_MAX_NBANDS ); - Word16 block_m_idx; - Word16 band_m_idx; Word16 nchan_fb_in = hodirac_flag ? HOA2_CHANNELS : FOA_CHANNELS; - Word16 nblocks = hQMetaData->useLowerRes ? 1 : MAX_PARAM_SPATIAL_SUBFRAMES; - - /* Find Q-factor */ - Word16 pcm_q; - Word16 pp_fr_q; - float max_val = 0; - for ( i = 0; i < nchan_fb_in; i++ ) - { - for ( j = 0; j < input_frame; j++ ) - { - max_val = max( max_val, (float) fabs( data_f[i][j] ) ); - } - } - pcm_q = Q_factor_L( max_val ); - - max_val = 0; - for ( i = 0; i < nchan_fb_in; i++ ) - { - for ( j = 0; j < input_frame; j++ ) - { - max_val = max( max_val, (float) fabs( ppIn_FR_real[i][j] ) ); - max_val = max( max_val, (float) fabs( ppIn_FR_imag[i][j] ) ); - } - } - pp_fr_q = Q_factor_L( max_val ); - - Word32 fr_real_fx[DIRAC_MAX_ANA_CHANS][L_FRAME48k * 2]; - Word32 fr_imag_fx[DIRAC_MAX_ANA_CHANS][L_FRAME48k * 2]; - Word32 data_f_buf[DIRAC_MAX_ANA_CHANS][L_FRAME48k]; - Word32 *pp_fr_real_fx[DIRAC_MAX_ANA_CHANS]; - Word32 *pp_fr_imag_fx[DIRAC_MAX_ANA_CHANS]; - Word32 *data_f_fx[DIRAC_MAX_ANA_CHANS]; - for ( i = 0; i < nchan_fb_in; i++ ) - { - data_f_fx[i] = data_f_buf[i]; - pp_fr_real_fx[i] = fr_real_fx[i]; - pp_fr_imag_fx[i] = fr_imag_fx[i]; - for ( j = 0; j < input_frame; j++ ) - { - data_f_fx[i][j] = float_to_fix( data_f[i][j], pcm_q ); - pp_fr_real_fx[i][j] = float_to_fix( ppIn_FR_real[i][j], pp_fr_q ); - pp_fr_imag_fx[i][j] = float_to_fix( ppIn_FR_imag[i][j], pp_fr_q ); - } - } - - for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) - { - for ( j = 0; j < hDirAC->no_col_avg_diff; j++ ) - { - for ( int k = 0; k < hDirAC->hConfig->nbands; k++ ) - { - Word16 tmp; - f2me( hDirAC->buffer_intensity_real[i][j][k], &hDirAC->buffer_intensity_real_fx[i][j][k], &tmp ); - hDirAC->buffer_intensity_real_q[i][j][k] = 31 - tmp; - } - } - } - for ( i = 0; i < hDirAC->hConfig->nbands; i++ ) - { - for ( j = 0; j < hDirAC->no_col_avg_diff; j++ ) - { - Word16 tmp; - f2me( hDirAC->buffer_energy[i + j * hDirAC->hConfig->nbands], &hDirAC->buffer_energy_fx[i + j * hDirAC->hConfig->nbands], &tmp ); - hDirAC->buffer_energy_q[i + j * hDirAC->hConfig->nbands] = 31 - tmp; - } - } + move16(); - for ( i = 0; i < NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS; i++ ) - { - hDirAC->azi_prev_fx[i] = float_to_fix( hDirAC->azi_prev[i], Q23 ); - hDirAC->ele_prev_fx[i] = float_to_fix( hDirAC->ele_prev[i], Q23 ); - } - for ( i = 0; i < NUM_ANA_SECTORS; i++ ) - { - for ( j = 0; j < IVAS_MAX_NUM_BANDS; j++ ) - { - f2me( hDirAC->sec_I_vec_smth_x[i][j], &hDirAC->sec_I_vec_smth_x_fx[i][j], &hDirAC->sec_I_vec_smth_x_exp[i][j] ); - f2me( hDirAC->sec_I_vec_smth_y[i][j], &hDirAC->sec_I_vec_smth_y_fx[i][j], &hDirAC->sec_I_vec_smth_y_exp[i][j] ); - f2me( hDirAC->sec_I_vec_smth_z[i][j], &hDirAC->sec_I_vec_smth_z_fx[i][j], &hDirAC->sec_I_vec_smth_z_exp[i][j] ); - } - } -#endif ivas_dirac_param_est_enc( hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f_fx, pp_fr_real_fx, pp_fr_imag_fx, pp_fr_q, input_frame, ivas_format, hodirac_flag, nchan_fb_in, &( hDirAC->mono_frame_count ), &( hQMetaData->dirac_mono_flag ) ); -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - /*---------------------------------------------- fixed to float ----------------------------------------------*/ - for ( block_m_idx = 0; block_m_idx < nblocks; block_m_idx++ ) - { - for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) - { - if ( hodirac_flag ) - { - hQMetaData->q_direction[1].band_data[band_m_idx].energy_ratio[block_m_idx] = fix_to_float( hQMetaData->q_direction[1].band_data[band_m_idx].energy_ratio_fx[block_m_idx], Q30 ); - } - else - { - hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] = me2f( hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx], hDirAC->direction_vector_m_exp[block_m_idx] ); - hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] = me2f( hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx], hDirAC->direction_vector_m_exp[block_m_idx] ); - hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] = me2f( hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx], hDirAC->direction_vector_m_exp[block_m_idx] ); - } - } - } - const int N_bands = hDirAC->hConfig->nbands; - for ( int i_sec = 0; i_sec < NUM_ANA_SECTORS; i_sec++ ) - { - for ( int i_band = 0; i_band < IVAS_MAX_NUM_BANDS; i_band++ ) - { - hDirAC->sec_I_vec_smth_x[i_sec][i_band] = me2f( hDirAC->sec_I_vec_smth_x_fx[i_sec][i_band], hDirAC->sec_I_vec_smth_x_exp[i_sec][i_band] ); - hDirAC->sec_I_vec_smth_y[i_sec][i_band] = me2f( hDirAC->sec_I_vec_smth_y_fx[i_sec][i_band], hDirAC->sec_I_vec_smth_y_exp[i_sec][i_band] ); - hDirAC->sec_I_vec_smth_z[i_sec][i_band] = me2f( hDirAC->sec_I_vec_smth_z_fx[i_sec][i_band], hDirAC->sec_I_vec_smth_z_exp[i_sec][i_band] ); - hDirAC->azi_prev[i_sec * N_bands + i_band] = fix_to_float( hDirAC->azi_prev_fx[i_sec * N_bands + i_band], Q23 ); - hDirAC->ele_prev[i_sec * N_bands + i_band] = fix_to_float( hDirAC->ele_prev_fx[i_sec * N_bands + i_band], Q23 ); - } - for ( int i_band = hDirAC->hConfig->enc_param_start_band; i_band < N_bands; i_band++ ) - { - hDirAC->energy_smth[i_sec][i_band] = me2f( hDirAC->energy_smth_fx[i_sec][i_band], hDirAC->energy_smth_exp[i_sec][i_band] ); - } - } - for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) - { - hDirAC->diffuseness_m[band_m_idx] = me2f( hDirAC->diffuseness_m_fx[band_m_idx], hDirAC->diffuseness_m_exp[band_m_idx] ); - me2f_buf( hQMetaData->q_direction->band_data[band_m_idx].energy_ratio_fx, 1, hQMetaData->q_direction->band_data[band_m_idx].energy_ratio, hQMetaData->q_direction->cfg.nblocks ); - } - for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) - { - for ( j = 0; j < hDirAC->no_col_avg_diff; j++ ) - { - for ( int k = 0; k < N_bands; k++ ) - { - hDirAC->buffer_intensity_real[i][j][k] = me2f( hDirAC->buffer_intensity_real_fx[i][j][k], 31 - hDirAC->buffer_intensity_real_q[i][j][k] ); - } - } - } - for ( i = 0; i < hDirAC->hConfig->nbands; i++ ) - { - for ( j = 0; j < hDirAC->no_col_avg_diff; j++ ) - { - hDirAC->buffer_energy[i + j * hDirAC->hConfig->nbands] = me2f( hDirAC->buffer_energy_fx[i + j * hDirAC->hConfig->nbands], 31 - hDirAC->buffer_energy_q[i + j * hDirAC->hConfig->nbands] ); - } - } -#endif - IF( hQMetaData->q_direction->cfg.nbands > 0 ) { @@ -690,19 +587,18 @@ ivas_error ivas_dirac_enc( /* Set Energy Ratio to 0.0 if the mono flag is set, before the metadata is encoded */ IF( hQMetaData->dirac_mono_flag ) { -#ifdef IVAS_FLOAT_FIXED IF( EQ_16( dtx_vad, 1 ) ) { FOR( b = hQMetaData->q_direction->cfg.start_band; b < hQMetaData->q_direction->cfg.nbands; b++ ) { FOR( i_ts = 0; i_ts < hQMetaData->q_direction[0].cfg.nblocks; i_ts++ ) { -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - hQMetaData->q_direction[0].band_data[b].energy_ratio[i_ts] = 0.0f; -#endif hQMetaData->q_direction[0].band_data[b].energy_ratio_fx[i_ts] = 0; hQMetaData->q_direction[0].band_data[b].azimuth_fx[i_ts] = 0; hQMetaData->q_direction[0].band_data[b].elevation_fx[i_ts] = 0; + move32(); + move32(); + move32(); } } } @@ -712,136 +608,112 @@ ivas_error ivas_dirac_enc( { FOR( i_ts = 0; i_ts < 1; i_ts++ ) { -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - hQMetaData->q_direction[0].band_data[b].energy_ratio[i_ts] = 0.0f; -#endif hQMetaData->q_direction[0].band_data[b].energy_ratio_fx[i_ts] = 0; hQMetaData->q_direction[0].band_data[b].azimuth_fx[i_ts] = 0; hQMetaData->q_direction[0].band_data[b].elevation_fx[i_ts] = 0; + move32(); + move32(); + move32(); } } } - -#else - for ( b = hQMetaData->q_direction->cfg.start_band; b < hQMetaData->q_direction->cfg.nbands; b++ ) - { - for ( i_ts = 0; i_ts < ( ( dtx_vad == 1 ) ? hQMetaData->q_direction[0].cfg.nblocks : 1 ); i_ts++ ) - { - hQMetaData->q_direction[0].band_data[b].energy_ratio[i_ts] = 0.0f; - hQMetaData->q_direction[0].band_data[b].azimuth[i_ts] = 0.0f; - hQMetaData->q_direction[0].band_data[b].elevation[i_ts] = 0.0f; - } - } -#endif } -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - for ( i = 0; i < hQMetaData->no_directions; i++ ) - { - for ( j = hQMetaData->q_direction[0].cfg.start_band; j < hQMetaData->q_direction[0].cfg.nbands; ++j ) - { - floatToFixed_arrL( hQMetaData->q_direction[i].band_data[j].energy_ratio, hQMetaData->q_direction[i].band_data[j].energy_ratio_fx, Q30, MAX_PARAM_SPATIAL_SUBFRAMES ); -#ifndef MSAN_FIX - floatToFixed_arrL( hQMetaData->q_direction[i].band_data[j].q_azimuth, hQMetaData->q_direction[i].band_data[j].q_azimuth_fx, Q22, MAX_PARAM_SPATIAL_SUBFRAMES ); - floatToFixed_arrL( hQMetaData->q_direction[i].band_data[j].q_elevation, hQMetaData->q_direction[i].band_data[j].q_elevation_fx, Q22, MAX_PARAM_SPATIAL_SUBFRAMES ); -#endif - } - } -#endif IF( ( error = ivas_qmetadata_enc_encode_fx( hMetaData, hQMetaData, hodirac_flag ) ) != IVAS_ERR_OK ) { return error; } -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - for ( i = 0; i < hQMetaData->no_directions; i++ ) - { - for ( j = hQMetaData->q_direction[0].cfg.start_band; j < hQMetaData->q_direction[0].cfg.nbands; ++j ) - { - fixedToFloat_arrL( hQMetaData->q_direction[i].band_data[j].energy_ratio_fx, hQMetaData->q_direction[i].band_data[j].energy_ratio, Q30, MAX_PARAM_SPATIAL_SUBFRAMES ); - } - } -#endif } ELSE { hQMetaData->q_direction[0].cfg.nbands = DIRAC_DTX_BANDS; move16(); - /* compute directions */ - for ( i = 0; i < hQMetaData->q_direction[0].cfg.nblocks; i++ ) + FOR( i = 0; i < hQMetaData->q_direction[0].cfg.nblocks; i++ ) { - set_zero( dir, 3 ); - set_zero( avg_dir, 3 ); - energySum = 0.0f; + set32_fx( avg_dir_fx, 0, 3 ); + Word16 avg_dir_e = 0; + Word16 energySum_e = 0; + Word32 energySum_fx = 0; + move32(); + move16(); + move16(); /* combine all DirAC bands except the last one, handle last band separately, last band covers BW above WB */ - for ( j = 0; j < orig_dirac_bands - 1; j++ ) + FOR( j = 0; j < sub( orig_dirac_bands, 1 ); j++ ) { -#ifdef IVAS_FLOAT_FIXED ivas_qmetadata_azimuth_elevation_to_direction_vector_fx( hQMetaData->q_direction[0].band_data[j].azimuth_fx[i], hQMetaData->q_direction[0].band_data[j].elevation_fx[i], &dir_fx[0] ); - /*==========================================fix-2-flt======================================================*/ - fixedToFloat_arrL( dir_fx, dir, Q30, 3 ); - /*==========================================fix-2-flt======================================================*/ - -#else - ivas_qmetadata_azimuth_elevation_to_direction_vector( hQMetaData->q_direction[0].band_data[j].azimuth[i], hQMetaData->q_direction[0].band_data[j].elevation[i], &dir[0] ); -#endif - vecLen = hQMetaData->q_direction[0].band_data[j].energy_ratio[i] * hDirAC->buffer_energy[i * orig_dirac_bands + j]; - - avg_dir[0] += dir[0] * vecLen; - avg_dir[1] += dir[1] * vecLen; - avg_dir[2] += dir[2] * vecLen; - - energySum += hDirAC->buffer_energy[i * orig_dirac_bands + j]; + Word32 vecLen_fx = Mpy_32_32( hQMetaData->q_direction[0].band_data[j].energy_ratio_fx[i] /*Q30*/, hDirAC->buffer_energy_fx[i * orig_dirac_bands + j] ); + avg_dir_fx[0] = L_add( avg_dir_fx[0], Mpy_32_32( dir_fx[0], vecLen_fx ) ); // Q30 + hDirAC->buffer_energy_q[i * orig_dirac_bands + j] - 1 - 31 + avg_dir_fx[1] = L_add( avg_dir_fx[1], Mpy_32_32( dir_fx[1], vecLen_fx ) ); // Q30 + hDirAC->buffer_energy_q[i * orig_dirac_bands + j] - 1 - 31 + avg_dir_fx[2] = L_add( avg_dir_fx[2], Mpy_32_32( dir_fx[2], vecLen_fx ) ); // Q30 + hDirAC->buffer_energy_q[i * orig_dirac_bands + j] - 1 - 31 + move32(); + move32(); + move32(); + avg_dir_e = sub( 31, ( sub( add( Q30, hDirAC->buffer_energy_q[i * orig_dirac_bands + j] ), 1 - 31 ) ) ); + energySum_fx = BASOP_Util_Add_Mant32Exp( energySum_fx, energySum_e, hDirAC->buffer_energy_fx[i * orig_dirac_bands + j], sub( 31, hDirAC->buffer_energy_q[i * orig_dirac_bands + j] ), &energySum_e ); } -#ifdef IVAS_FLOAT_FIXED - /*==========================================flt-2-fix======================================================*/ - Word16 q_dir_e = 0; - f2me_buf( avg_dir, avg_dir_fx, &q_dir_e, 3 ); - Scale_sig32( avg_dir_fx, 3, -1 ); - /*==========================================flt-2-fix======================================================*/ + Word16 x = getScaleFactor32( avg_dir_fx, 3 ); + Scale_sig32( avg_dir_fx, 3, sub( x, 1 ) ); + avg_dir_e = sub( avg_dir_e, sub( x, 1 ) ); ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( &avg_dir_fx[0], Q30, &hQMetaData->q_direction[0].band_data[0].azimuth_fx[i], &hQMetaData->q_direction[0].band_data[0].elevation_fx[i] ); -#else - ivas_qmetadata_direction_vector_to_azimuth_elevation( &avg_dir[0], &hQMetaData->q_direction[0].band_data[0].azimuth[i], &hQMetaData->q_direction[0].band_data[0].elevation[i] ); -#endif - hQMetaData->q_direction[0].band_data[0].energy_ratio[i] = sqrtf( dotp( avg_dir, avg_dir, 3 ) ) / ( energySum + EPSILON ); -#ifdef IVAS_FLOAT_FIXED + Word32 tmp = dotp_fixed( avg_dir_fx, avg_dir_fx, 3 ); // 2*avg_dir_e + Word16 tmp_e = shl( avg_dir_e, 1 ); + tmp = Sqrt32( tmp, &tmp_e ); + Word16 er_tmp_e = 0; + move16(); + Word16 er_tmp = 0; + move16(); + Word16 denom_e = 0; + move16(); + Word32 denom = BASOP_Util_Add_Mant32Exp( energySum_fx, energySum_e, EPSILON_FX_M, EPSILON_FX_E, &denom_e ); + + er_tmp = BASOP_Util_Divide3232_Scale( tmp, denom, &er_tmp_e ); + er_tmp_e = add( er_tmp_e, sub( tmp_e, denom_e ) ); + er_tmp = shr( er_tmp, sub( 1, ( er_tmp_e ) ) ); // Q14 + + hQMetaData->q_direction[0].band_data[0].energy_ratio_fx[i] = L_deposit_h( er_tmp ); // Q30 hQMetaData->q_direction[0].band_data[1].azimuth_fx[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth_fx[i]; hQMetaData->q_direction[0].band_data[1].elevation_fx[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation_fx[i]; -#else - hQMetaData->q_direction[0].band_data[1].azimuth[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i]; - hQMetaData->q_direction[0].band_data[1].elevation[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i]; -#endif - hQMetaData->q_direction[0].band_data[1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i]; + hQMetaData->q_direction[0].band_data[1].energy_ratio_fx[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio_fx[i]; + move32(); + move32(); + move32(); + move32(); } /* 1 bit to indicate mode MD coding : temp solution*/ push_next_indice( hMetaData, 1, 1 ); /* encode SID parameters */ -#ifdef IVAS_FLOAT_FIXED ivas_qmetadata_enc_sid_encode_fx( hMetaData, hQMetaData, -1, SBA_FORMAT ); -#else - ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT ); -#endif } + Word16 len = 0; + move16(); + IF( EQ_16( dtx_vad, 1 ) ) + { + len = hQMetaData->q_direction[0].cfg.nblocks; + } + ELSE + { + len = 1; + } + move16(); FOR( b = hQMetaData->q_direction->cfg.start_band; b < hQMetaData->q_direction->cfg.nbands; b++ ) { - FOR( i_ts = 0; i_ts < ( ( dtx_vad == 1 ) ? hQMetaData->q_direction[0].cfg.nblocks : 1 ); i_ts++ ) + FOR( i_ts = 0; i_ts < len; i_ts++ ) { -#ifdef IVAS_FLOAT_FIXED hQMetaData->q_direction->band_data[b].azimuth_fx[i_ts] = hQMetaData->q_direction->band_data[b].q_azimuth_fx[i_ts]; hQMetaData->q_direction->band_data[b].elevation_fx[i_ts] = hQMetaData->q_direction->band_data[b].q_elevation_fx[i_ts]; -#else - hQMetaData->q_direction->band_data[b].azimuth[i_ts] = hQMetaData->q_direction->band_data[b].q_azimuth[i_ts]; - hQMetaData->q_direction->band_data[b].elevation[i_ts] = hQMetaData->q_direction->band_data[b].q_elevation[i_ts]; -#endif - hQMetaData->q_direction[0].band_data[b].energy_ratio[0] = 1.0f - diffuseness_reconstructions[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]]; + hQMetaData->q_direction[0].band_data[b].energy_ratio_fx[0] = L_sub( ONE_IN_Q30, diffuseness_reconstructions_fx[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]] ); + move32(); + move32(); + move32(); } } @@ -849,28 +721,24 @@ ivas_error ivas_dirac_enc( { FOR( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { -#ifdef IVAS_FLOAT_FIXED hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth_fx[i] = hQMetaData->q_direction[0].band_data[1].azimuth_fx[0]; hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation_fx[i] = hQMetaData->q_direction[0].band_data[1].elevation_fx[0]; -#else - hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; - hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i] = hQMetaData->q_direction[0].band_data[1].elevation[0]; -#endif - hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[1].energy_ratio[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio_fx[i] = hQMetaData->q_direction[0].band_data[1].energy_ratio_fx[0]; + move32(); + move32(); + move32(); } FOR( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { - FOR( j = orig_dirac_bands - 2; j >= 0; j-- ) + FOR( j = sub( orig_dirac_bands, 2 ); j >= 0; j-- ) { -#ifdef IVAS_FLOAT_FIXED hQMetaData->q_direction[0].band_data[j].azimuth_fx[i] = hQMetaData->q_direction[0].band_data[0].azimuth_fx[0]; hQMetaData->q_direction[0].band_data[j].elevation_fx[i] = hQMetaData->q_direction[0].band_data[0].elevation_fx[0]; -#else - hQMetaData->q_direction[0].band_data[j].azimuth[i] = hQMetaData->q_direction[0].band_data[0].azimuth[0]; - hQMetaData->q_direction[0].band_data[j].elevation[i] = hQMetaData->q_direction[0].band_data[0].elevation[0]; -#endif - hQMetaData->q_direction[0].band_data[j].energy_ratio[i] = hQMetaData->q_direction[0].band_data[0].energy_ratio[0]; + hQMetaData->q_direction[0].band_data[j].energy_ratio_fx[i] = hQMetaData->q_direction[0].band_data[0].energy_ratio_fx[0]; + move32(); + move32(); + move32(); } } diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index c41736176..c3b8c7cbc 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -888,19 +888,6 @@ ivas_error ivas_enc( { return error; } -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - if ( st_ivas->hQMetaData->q_direction ) - { - for ( int band = 0; band < st_ivas->hMasa->config.numCodingBands; band++ ) - { - fixedToFloat_arrL( st_ivas->hQMetaData->q_direction[0].band_data[band].energy_ratio_fx, st_ivas->hQMetaData->q_direction[0].band_data[band].energy_ratio, Q30, MAX_PARAM_SPATIAL_SUBFRAMES ); - if ( st_ivas->hQMetaData->no_directions == 2 ) - { - fixedToFloat_arrL( st_ivas->hQMetaData->q_direction[1].band_data[band].energy_ratio_fx, st_ivas->hQMetaData->q_direction[1].band_data[band].energy_ratio, Q30, MAX_PARAM_SPATIAL_SUBFRAMES ); - } - } - } -#endif // IVAS_FLOAT_FIXED_CONVERSIONS #else if ( ( error = ivas_masa_enc_config( st_ivas ) ) != IVAS_ERR_OK ) { @@ -1000,19 +987,6 @@ ivas_error ivas_enc( { return error; } -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - if ( st_ivas->hQMetaData->q_direction ) - { - for ( int band = 0; band < st_ivas->hMasa->config.numCodingBands; band++ ) - { - fixedToFloat_arrL( st_ivas->hQMetaData->q_direction[0].band_data[band].energy_ratio_fx, st_ivas->hQMetaData->q_direction[0].band_data[band].energy_ratio, Q30, MAX_PARAM_SPATIAL_SUBFRAMES ); - if ( st_ivas->hQMetaData->no_directions == 2 ) - { - fixedToFloat_arrL( st_ivas->hQMetaData->q_direction[1].band_data[band].energy_ratio_fx, st_ivas->hQMetaData->q_direction[1].band_data[band].energy_ratio, Q30, MAX_PARAM_SPATIAL_SUBFRAMES ); - } - } - } -#endif // IVAS_FLOAT_FIXED_CONVERSIONS #else if ( ( error = ivas_omasa_enc_config( st_ivas ) ) != IVAS_ERR_OK ) { @@ -1379,7 +1353,7 @@ ivas_error ivas_enc( { FOR( jj = 0; jj < nBlocks; jj++ ) { - st_ivas->hQMetaData->q_direction[0].band_data[ii].energy_ratio[jj] = fixedToFloat( st_ivas->hQMetaData->q_direction[0].band_data[ii].energy_ratio_fx[jj], Q31 ); + st_ivas->hQMetaData->q_direction[0].band_data[ii].energy_ratio_fx[jj] = L_shr( st_ivas->hQMetaData->q_direction[0].band_data[ii].energy_ratio_fx[jj], 1 ); // Q31 -> Q30 } } #endif diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index b40665a98..3114ae478 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -859,10 +859,17 @@ ivas_error ivas_init_encoder( return error; } +#ifdef IVAS_FLOAT_FIXED + IF( ( error = ivas_dirac_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = ivas_dirac_enc_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; } +#endif } else { @@ -1014,10 +1021,17 @@ ivas_error ivas_init_encoder( return error; } +#ifdef IVAS_FLOAT_FIXED + IF( ( error = ivas_dirac_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = ivas_dirac_enc_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; } +#endif if ( st_ivas->ism_mode == ISM_MODE_NONE ) { @@ -1207,22 +1221,8 @@ ivas_error ivas_init_encoder( { return error; } - -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - if ( st_ivas->hQMetaData->q_direction != NULL ) - { - for ( int band = 0; band < st_ivas->hMasa->config.numCodingBands; band++ ) - { - fixedToFloat_arrL( st_ivas->hQMetaData->q_direction[0].band_data[band].energy_ratio_fx, st_ivas->hQMetaData->q_direction[0].band_data[band].energy_ratio, Q30, MAX_PARAM_SPATIAL_SUBFRAMES ); - if ( st_ivas->hQMetaData->no_directions == 2 ) - { - fixedToFloat_arrL( st_ivas->hQMetaData->q_direction[1].band_data[band].energy_ratio_fx, st_ivas->hQMetaData->q_direction[1].band_data[band].energy_ratio, Q30, MAX_PARAM_SPATIAL_SUBFRAMES ); - } - } - } #endif -#endif // IVAS_FLOAT_FIXED_CONVERSIONS #ifndef IVAS_FLOAT_FIXED ivas_mcmasa_split_brate( st_ivas->hMcMasa->separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &brate_sce, &brate_cpe ); #else @@ -1530,11 +1530,17 @@ ivas_error ivas_init_encoder_fx( { return error; } - +#ifdef IVAS_FLOAT_FIXED + IF( ( error = ivas_dirac_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } +#else IF( ( error = ivas_dirac_enc_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; } +#endif } ELSE { @@ -1679,10 +1685,17 @@ ivas_error ivas_init_encoder_fx( return error; } +#ifdef IVAS_FLOAT_FIXED + IF( ( error = ivas_dirac_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = ivas_dirac_enc_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; } +#endif if ( st_ivas->ism_mode == ISM_MODE_NONE ) { @@ -1869,22 +1882,8 @@ ivas_error ivas_init_encoder_fx( { return error; } - -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - if ( st_ivas->hQMetaData->q_direction != NULL ) - { - for ( int band = 0; band < st_ivas->hMasa->config.numCodingBands; band++ ) - { - fixedToFloat_arrL( st_ivas->hQMetaData->q_direction[0].band_data[band].energy_ratio_fx, st_ivas->hQMetaData->q_direction[0].band_data[band].energy_ratio, Q30, MAX_PARAM_SPATIAL_SUBFRAMES ); - if ( st_ivas->hQMetaData->no_directions == 2 ) - { - fixedToFloat_arrL( st_ivas->hQMetaData->q_direction[1].band_data[band].energy_ratio_fx, st_ivas->hQMetaData->q_direction[1].band_data[band].energy_ratio, Q30, MAX_PARAM_SPATIAL_SUBFRAMES ); - } - } - } #endif -#endif // IVAS_FLOAT_FIXED_CONVERSIONS #ifndef IVAS_FLOAT_FIXED ivas_mcmasa_split_brate( st_ivas->hMcMasa->separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &brate_sce, &brate_cpe ); #else @@ -2196,7 +2195,11 @@ void ivas_destroy_enc( ivas_qmetadata_close( &( st_ivas->hQMetaData ) ); /* DirAC handle */ +#ifdef IVAS_FLOAT_FIXED + ivas_dirac_enc_close_fx( &( st_ivas->hDirAC ), st_ivas->hEncoderConfig->input_Fs ); +#else ivas_dirac_enc_close( &( st_ivas->hDirAC ), st_ivas->hEncoderConfig->input_Fs ); +#endif /* ParamISM handle */ ivas_param_ism_enc_close( &( st_ivas->hParamIsm ), st_ivas->hEncoderConfig->input_Fs ); diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 5438bc921..a8375d542 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -398,15 +398,6 @@ ivas_error ivas_masa_encode( Word16 guard_bits, tmp; guard_bits = find_guarded_bits_fx( 24 ); -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - for ( i = 0; i < hQMetaData->no_directions; i++ ) - { - for ( j = hQMetaData->q_direction[i].cfg.start_band; j < hQMetaData->q_direction[i].cfg.nbands; ++j ) - { - floatToFixed_arrL( hQMetaData->q_direction[i].band_data[j].energy_ratio, hQMetaData->q_direction[i].band_data[j].energy_ratio_fx, Q30, MAX_PARAM_SPATIAL_SUBFRAMES ); - } - } -#endif masa_sid_descriptor = -1; h_orig_metadata = NULL; @@ -859,16 +850,6 @@ ivas_error ivas_masa_encode( move16(); } -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - for ( i = 0; i < hQMetaData->no_directions; i++ ) - { - for ( j = hQMetaData->q_direction[0].cfg.start_band; j < hQMetaData->q_direction[0].cfg.nbands; ++j ) - { - fixedToFloat_arrL( hQMetaData->q_direction[i].band_data[j].energy_ratio_fx, hQMetaData->q_direction[i].band_data[j].energy_ratio, Q30, MAX_PARAM_SPATIAL_SUBFRAMES ); - } - } -#endif - return IVAS_ERR_OK; } #else diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index aaa3dd260..472043f02 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -1775,19 +1775,6 @@ static ivas_error ivas_mc_enc_reconfig( { return error; } -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - if ( st_ivas->hQMetaData->q_direction != NULL ) - { - for ( int band = 0; band < st_ivas->hMasa->config.numCodingBands; band++ ) - { - fixedToFloat_arrL( st_ivas->hQMetaData->q_direction[0].band_data[band].energy_ratio_fx, st_ivas->hQMetaData->q_direction[0].band_data[band].energy_ratio, Q30, MAX_PARAM_SPATIAL_SUBFRAMES ); - if ( st_ivas->hQMetaData->no_directions == 2 ) - { - fixedToFloat_arrL( st_ivas->hQMetaData->q_direction[1].band_data[band].energy_ratio_fx, st_ivas->hQMetaData->q_direction[1].band_data[band].energy_ratio, Q30, MAX_PARAM_SPATIAL_SUBFRAMES ); - } - } - } -#endif // IVAS_FLOAT_FIXED_CONVERSIONS #else if ( ( error = ivas_mcmasa_enc_open( st_ivas ) ) != IVAS_ERR_OK ) { @@ -1803,19 +1790,6 @@ static ivas_error ivas_mc_enc_reconfig( { return error; } -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - if ( st_ivas->hQMetaData->q_direction != NULL ) - { - for ( int band = 0; band < st_ivas->hMasa->config.numCodingBands; band++ ) - { - fixedToFloat_arrL( st_ivas->hQMetaData->q_direction[0].band_data[band].energy_ratio_fx, st_ivas->hQMetaData->q_direction[0].band_data[band].energy_ratio, Q30, MAX_PARAM_SPATIAL_SUBFRAMES ); - if ( st_ivas->hQMetaData->no_directions == 2 ) - { - fixedToFloat_arrL( st_ivas->hQMetaData->q_direction[1].band_data[band].energy_ratio_fx, st_ivas->hQMetaData->q_direction[1].band_data[band].energy_ratio, Q30, MAX_PARAM_SPATIAL_SUBFRAMES ); - } - } - } -#endif // IVAS_FLOAT_FIXED_CONVERSIONS #else if ( ( error = ivas_mcmasa_enc_reconfig( st_ivas ) ) != IVAS_ERR_OK ) { diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index d7857435a..454b2305f 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -705,7 +705,14 @@ static ivas_error ivas_spar_cov_md_process( } ELSE { - ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND, hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, hSpar->AGC_Enable ); + Word16 num_bands = SPAR_DIRAC_SPLIT_START_BAND; + move16(); + if ( hSpar->hMdEnc->spar_hoa_md_flag != 0 ) + { + num_bands = IVAS_MAX_NUM_BANDS; + move16(); + } + ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx, num_bands, hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, hSpar->AGC_Enable ); } } @@ -737,9 +744,9 @@ static ivas_error ivas_spar_cov_md_process( FOR( b = hSpar->hFbMixer->pFb->filterbank_num_bands; b < IVAS_MAX_NUM_BANDS; b++ ) { cov_real_fx[i][j][b] = 0; - move16(); + move32(); cov_dtx_real_fx[i][j][b] = 0; - move16(); + move32(); } } IF( ( q_cov_real[i] = (Word16 *) malloc( sizeof( Word16 ) * nchan_inp ) ) == NULL ) @@ -810,7 +817,7 @@ static ivas_error ivas_spar_cov_md_process( IF( hSpar->hMdEnc->spar_hoa_md_flag == 0 ) { - IF( NE_32( ( error = ivas_spar_md_enc_process_fx( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, cov_real_fx, hSpar->hCovEnc->pCov_state->q_cov_real_per_band, cov_dtx_real_fx, hSpar->hCovEnc->pCov_dtx_state->q_cov_real_per_band, hMetaData, dtx_vad, nchan_inp, sba_order, hSpar->hFbMixer->prior_mixer, *dyn_active_w_flag, hQMetaData->dirac_mono_flag ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_spar_md_enc_process_fx( hSpar->hMdEnc, hEncoderConfig, cov_real_fx, hSpar->hCovEnc->pCov_state->q_cov_real_per_band, cov_dtx_real_fx, hSpar->hCovEnc->pCov_dtx_state->q_cov_real_per_band, hMetaData, dtx_vad, nchan_inp, sba_order, hSpar->hFbMixer->prior_mixer, *dyn_active_w_flag, hQMetaData->dirac_mono_flag ) ), IVAS_ERR_OK ) ) { return error; } @@ -847,9 +854,6 @@ static ivas_error ivas_spar_cov_md_process( test(); IF( GE_16( d_start_band, 6 ) && EQ_16( dtx_vad, 1 ) ) { -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - mvr2r( hSpar->hMdEnc->spar_md.band_coeffs[d_start_band - 1].P_quant_re, hSpar->hMdEnc->spar_md.band_coeffs[d_start_band - 1].P_re, IVAS_SPAR_MAX_CH - 1 ); -#endif Copy32( hSpar->hMdEnc->spar_md.band_coeffs[d_start_band - 1].P_quant_re_fx, hSpar->hMdEnc->spar_md.band_coeffs[d_start_band - 1].P_re_fx, IVAS_SPAR_MAX_CH - 1 ); } @@ -928,26 +932,21 @@ static ivas_error ivas_spar_cov_md_process( #ifdef IVAS_FLOAT_FIXED_CONVERSIONS for ( b = 0; b < IVAS_MAX_NUM_BANDS; b++ ) { - for ( i = 0; i < num_ch; i++ ) + for ( i = 0; i < IVAS_SPAR_MAX_CH - 1; i++ ) { - for ( j = 0; j < num_ch; j++ ) - { - hSpar->hMdEnc->mixer_mat[i][j][b] = fixedToFloat_32( hSpar->hMdEnc->mixer_mat_fx[i][j][b], hSpar->hMdEnc->q_mixer_mat_fx ); - } + hSpar->hMdEnc->spar_md.band_coeffs[b].P_re_fx[i] = L_shl( hSpar->hMdEnc->spar_md.band_coeffs[b].P_re_fx[i], Q6 ); + hSpar->hMdEnc->spar_md.band_coeffs[b].pred_re_fx[i] = L_shl( hSpar->hMdEnc->spar_md.band_coeffs[b].pred_re_fx[i], Q6 ); } + hSpar->hMdEnc->spar_md.band_coeffs[b].q_P_re_fx = Q28; + hSpar->hMdEnc->spar_md.band_coeffs[b].q_pred_re_fx = Q28; } for ( b = 0; b < IVAS_MAX_NUM_BANDS; b++ ) { - for ( i = 0; i < IVAS_SPAR_MAX_CH - 1; i++ ) - { - hSpar->hMdEnc->spar_md.band_coeffs[b].P_re[i] = fixedToFloat_32( hSpar->hMdEnc->spar_md.band_coeffs[b].P_re_fx[i], hSpar->hMdEnc->spar_md.band_coeffs[b].q_P_re_fx ); - hSpar->hMdEnc->spar_md.band_coeffs[b].pred_re[i] = fixedToFloat_32( hSpar->hMdEnc->spar_md.band_coeffs[b].pred_re_fx[i], hSpar->hMdEnc->spar_md.band_coeffs[b].q_pred_re_fx ); - } - for ( i = 0; i < IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS; i++ ) + for ( i = 0; i < num_ch; i++ ) { - for ( j = 0; j < IVAS_SPAR_MAX_DMX_CHS - 1; j++ ) + for ( j = 0; j < num_ch; j++ ) { - hSpar->hMdEnc->spar_md.band_coeffs[b].C_re[i][j] = fixedToFloat_32( hSpar->hMdEnc->spar_md.band_coeffs[b].C_re_fx[i][j], hSpar->hMdEnc->spar_md.band_coeffs[b].q_C_re_fx ); + hSpar->hMdEnc->mixer_mat[i][j][b] = fixedToFloat_32( hSpar->hMdEnc->mixer_mat_fx[i][j][b], hSpar->hMdEnc->q_mixer_mat_fx ); } } } @@ -959,7 +958,7 @@ static ivas_error ivas_spar_cov_md_process( IF( hSpar->hMdEnc->spar_hoa_md_flag ) { - error = ivas_spar_md_enc_process_fx( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, cov_real_fx, hSpar->hCovEnc->pCov_state->q_cov_real_per_band, cov_dtx_real_fx, hSpar->hCovEnc->pCov_dtx_state->q_cov_real_per_band, hMetaData, dtx_vad, nchan_inp, sba_order, hSpar->hFbMixer->prior_mixer, *dyn_active_w_flag, hQMetaData->dirac_mono_flag ); + error = ivas_spar_md_enc_process_fx( hSpar->hMdEnc, hEncoderConfig, cov_real_fx, hSpar->hCovEnc->pCov_state->q_cov_real_per_band, cov_dtx_real_fx, hSpar->hCovEnc->pCov_dtx_state->q_cov_real_per_band, hMetaData, dtx_vad, nchan_inp, sba_order, hSpar->hFbMixer->prior_mixer, *dyn_active_w_flag, hQMetaData->dirac_mono_flag ); } return error; @@ -1273,10 +1272,62 @@ static ivas_error ivas_spar_enc_process( hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); #endif +#ifdef IVAS_FLOAT_FIXED +#ifdef IVAS_FLOAT_FIXED_CONVERSIONS + Word16 pcm_q; + Word16 pp_fr_q; + float max_val = 0.0f; + /* Find Q-factor */ + for ( i = 0; i < nchan_fb_in; i++ ) + { + for ( j = 0; j < input_frame; j++ ) + { + max_val = max( max_val, (float) fabs( data_f[i][j] ) ); + } + } + pcm_q = Q_factor_L( max_val ); + + max_val = 0; + for ( i = 0; i < nchan_fb_in; i++ ) + { + for ( j = 0; j < input_frame; j++ ) + { + max_val = max( max_val, (float) fabs( ppIn_FR_real[i][j] ) ); + max_val = max( max_val, (float) fabs( ppIn_FR_imag[i][j] ) ); + } + } + pp_fr_q = Q_factor_L( max_val ); + + Word32 fr_real_fx[DIRAC_MAX_ANA_CHANS][L_FRAME48k * 2]; + Word32 fr_imag_fx[DIRAC_MAX_ANA_CHANS][L_FRAME48k * 2]; + Word32 data_f_buf[DIRAC_MAX_ANA_CHANS][L_FRAME48k]; + Word32 *pp_fr_real_fx[DIRAC_MAX_ANA_CHANS]; + Word32 *pp_fr_imag_fx[DIRAC_MAX_ANA_CHANS]; + Word32 *data_f_fx[DIRAC_MAX_ANA_CHANS]; + for ( i = 0; i < nchan_fb_in; i++ ) + { + data_f_fx[i] = data_f_buf[i]; + pp_fr_real_fx[i] = fr_real_fx[i]; + pp_fr_imag_fx[i] = fr_imag_fx[i]; + for ( j = 0; j < input_frame; j++ ) + { + data_f_fx[i][j] = float_to_fix( data_f[i][j], pcm_q ); + pp_fr_real_fx[i][j] = float_to_fix( ppIn_FR_real[i][j], pp_fr_q ); + pp_fr_imag_fx[i][j] = float_to_fix( ppIn_FR_imag[i][j], pp_fr_q ); + } + } +#endif + IF( ( error = ivas_dirac_enc_fx( st_ivas->hDirAC, hQMetaData, hMetaData, data_f_fx, pp_fr_real_fx, pp_fr_imag_fx, pp_fr_q, input_frame, dtx_vad, hEncoderConfig->ivas_format, hodirac_flag ) ) != IVAS_ERR_OK ) + { + return error; + } +#else + if ( ( error = ivas_dirac_enc( st_ivas->hDirAC, hQMetaData, hMetaData, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, dtx_vad, hEncoderConfig->ivas_format, hodirac_flag ) ) != IVAS_ERR_OK ) { return error; } +#endif /* Set Energy Ratio to 0.0 if the mono flag has been set */ if ( hQMetaData->dirac_mono_flag ) @@ -1285,7 +1336,11 @@ static ivas_error ivas_spar_enc_process( { for ( i_ts = 0; i_ts < ( ( dtx_vad == 1 ) ? hQMetaData->q_direction[0].cfg.nblocks : 1 ); i_ts++ ) { +#ifndef IVAS_FLOAT_FIXED hQMetaData->q_direction[0].band_data[b].energy_ratio[i_ts] = 0.0f; +#else + hQMetaData->q_direction[0].band_data[b].energy_ratio_fx[i_ts] = 0; +#endif } } } @@ -1294,19 +1349,11 @@ static ivas_error ivas_spar_enc_process( * Covariance and MD processing *-----------------------------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED_CONVERSIONS - - for ( b = hSpar->enc_param_start_band; b < IVAS_MAX_NUM_BANDS; b++ ) - { - Word16 dirac_band_idx = hSpar->dirac_to_spar_md_bands[b] - hSpar->enc_param_start_band; - hQMetaData->q_direction->band_data[dirac_band_idx].energy_ratio_fx[0] = float_to_fix( hQMetaData->q_direction->band_data[dirac_band_idx].energy_ratio[0], Q30 ); - } -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS for ( int ch_idx = 0; ch_idx < nchan_fb_in; ch_idx++ ) { floatToFixed_arrL32( ppIn_FR_real[ch_idx], ppIn_FR_real_fx[ch_idx], Q14 - gb, input_frame ); floatToFixed_arrL32( ppIn_FR_imag[ch_idx], ppIn_FR_imag_fx[ch_idx], Q14 - gb, input_frame ); } -#endif #endif if ( ( error = ivas_spar_cov_md_process( hEncoderConfig, st_ivas->hSpar, st_ivas->hQMetaData, hMetaData, nchan_inp, sba_order, ppIn_FR_real_fx, ppIn_FR_imag_fx, transient_det, dtx_vad, nchan_transport, &dyn_active_w_flag, Q14 - gb ) ) != IVAS_ERR_OK ) diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 357e52230..1bfa16eaf 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -135,8 +135,7 @@ static void ivas_quant_p_per_band( ivas_band_coeffs_t *pband_coeffs, ivas_band_c #else static void ivas_quant_p_per_band_fx( ivas_band_coeffs_t *pband_coeffs, ivas_band_coeffs_ind_t *pBand_coeffs_idx, ivas_quant_strat_t *pQs, const Word16 num_ch ); #endif -static void ivas_quant_c_per_band( ivas_band_coeffs_t *pband_coeffs, ivas_band_coeffs_ind_t *pBand_coeffs_idx, ivas_quant_strat_t *pQs, const int16_t ndec, const int16_t ndm ); - +static void ivas_quant_c_per_band_fx( ivas_band_coeffs_t *pband_coeffs, ivas_band_coeffs_ind_t *pBand_coeffs_idx, ivas_quant_strat_t *pQs, const Word16 ndec, const Word16 ndm, const Word16 q_C ); #ifndef IVAS_FLOAT_FIXED static void ivas_quant_pred_coeffs_per_band( ivas_band_coeffs_t *pband_coeffs, ivas_band_coeffs_ind_t *pBand_coeffs_idx, ivas_quant_strat_t *pQs, const int16_t num_ch ); #else @@ -230,7 +229,7 @@ ivas_error ivas_spar_md_enc_open( hMdEnc->q_mixer_mat_fx = 0; #endif - if ( ( error = ivas_spar_md_enc_init( hMdEnc, hEncoderConfig, sba_order ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_spar_md_enc_init_fx( hMdEnc, hEncoderConfig, sba_order ) ) != IVAS_ERR_OK ) { return error; } @@ -438,8 +437,8 @@ ivas_error ivas_spar_md_enc_init( hMdEnc->spar_md.prior_dyn_active_w_flag = 0; - ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND, - hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, ivas_agc_enc_get_flag( ivas_spar_br_table_consts[table_idx].nchan_transport ) ); + ivas_spar_set_bitrate_config_fx( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND, + hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, ivas_agc_enc_get_flag( ivas_spar_br_table_consts[table_idx].nchan_transport ) ); /* get FB coefficients */ for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) @@ -498,7 +497,7 @@ ivas_error ivas_spar_md_enc_init( } #endif - ivas_clear_band_coeffs( hMdEnc->spar_md.band_coeffs, IVAS_MAX_NUM_BANDS ); + ivas_clear_band_coeffs_fx( hMdEnc->spar_md.band_coeffs, IVAS_MAX_NUM_BANDS ); ivas_clear_band_coeff_idx( hMdEnc->spar_md.band_coeffs_idx, IVAS_MAX_NUM_BANDS ); ivas_clear_band_coeff_idx( hMdEnc->spar_md_prior.band_coeffs_idx, IVAS_MAX_NUM_BANDS ); ivas_clear_band_coeff_idx( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, IVAS_MAX_NUM_BANDS ); @@ -578,6 +577,19 @@ ivas_error ivas_spar_md_enc_init_fx( } } } +#ifdef IVAS_FLOAT_FIXED_CONVERSIONS + FOR( i = 0; i < num_channels; i++ ) + { + FOR( j = 0; j < num_channels; j++ ) + { + FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMdEnc->mixer_mat[i][j][k] = 0.0f; + move32(); + } + } + } +#endif hMdEnc->q_mixer_mat_fx = 0; move16(); ivas_clear_band_coeffs_fx( hMdEnc->spar_md.band_coeffs, IVAS_MAX_NUM_BANDS ); @@ -775,21 +787,17 @@ static void ivas_band_mixing_fx( static void write_metadata_buffer( BSTR_ENC_HANDLE hMetaData_tmp, BSTR_ENC_HANDLE hMetaData, - const int16_t bit_pos_start, - const int16_t next_ind_start ) + const Word16 bit_pos_start, + const Word16 next_ind_start ) { - int16_t i; + Word16 i; - if ( hMetaData->nb_bits_tot > 0 ) + IF( hMetaData->nb_bits_tot > 0 ) { -#ifdef IVAS_FLOAT_FIXED restore_metadata_buffer_fx( hMetaData, next_ind_start, bit_pos_start ); -#else - restore_metadata_buffer( hMetaData, next_ind_start, bit_pos_start ); -#endif } - for ( i = 0; i < hMetaData_tmp->nb_ind_tot; i++ ) + FOR( i = 0; i < hMetaData_tmp->nb_ind_tot; i++ ) { push_next_indice( hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits ); } @@ -807,8 +815,6 @@ static void write_metadata_buffer( ivas_error ivas_spar_md_enc_process_fx( ivas_spar_md_enc_state_t *hMdEnc, /* i/o: SPAR MD encoder handle */ const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ - float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], Word32 *cov_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], Word16 *cov_real_q[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], Word32 *cov_dtx_real_fx[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], @@ -839,10 +845,6 @@ ivas_error ivas_spar_md_enc_process_fx( Word16 max_num_indices_tmp; Word32 Wscale_fx[IVAS_MAX_NUM_BANDS]; Word16 q_Wscale[IVAS_MAX_NUM_BANDS]; -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - float Wscale[IVAS_MAX_NUM_BANDS]; - float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; -#endif /*extra 16 bits for arithmetic coder as overshoot check is after a symbol is written*/ md_indices_allocated = add( hMdEnc->spar_md_cfg.max_bits_per_blk, IVAS_SPAR_ARITH_OVERSHOOT_BITS ); @@ -957,16 +959,6 @@ ivas_error ivas_spar_md_enc_process_fx( bands_bw = 1; move16(); } -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - for ( b = 0; b < num_bands; b++ ) - { - for ( int ii = 0; ii < num_ch - 1; ii++ ) - { - hMdEnc->spar_md.band_coeffs[b].pred_re_fx[ii] = float_to_fix( hMdEnc->spar_md.band_coeffs[b].pred_re[ii], Q28 ); - hMdEnc->spar_md.band_coeffs[b].P_re_fx[ii] = float_to_fix( hMdEnc->spar_md.band_coeffs[b].P_re[ii], Q28 ); - } - } -#endif test(); IF( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) { @@ -974,106 +966,13 @@ ivas_error ivas_spar_md_enc_process_fx( { FOR( i = 0; i < DIRAC_TO_SPAR_HBR_PRED_CHS; i++ ) { - pred_coeffs_re_local_fx[i][b] = hMdEnc->spar_md.band_coeffs[b].pred_re_fx[i]; + pred_coeffs_re_local_fx[i][b] = hMdEnc->spar_md.band_coeffs[b].pred_re_fx[i]; // Q28 move32(); } } } -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - FOR( i = 0; i < nchan_inp; i++ ) - { - FOR( j = 0; j < nchan_inp; j++ ) - { - FOR( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) - { - cov_real[i][j][k] = me2f( cov_real_fx[i][j][k], sub( Q31, cov_real_q[i][j][k] ) ); - cov_dtx_real[i][j][k] = me2f( cov_dtx_real_fx[i][j][k], sub( Q31, cov_dtx_real_q[i][j][k] ) ); - } - } - } -#endif - -#ifdef IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - - for ( i = 0; i < num_ch; i++ ) - { - for ( j = 0; j < num_ch; j++ ) - { - for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) - { - f2me( cov_real[i][j][k], &cov_real_fx[i][j][k], &cov_real_q[i][j][k] ); - cov_real_q[i][j][k] = 31 - cov_real_q[i][j][k]; - } - } - } - -#endif ivas_compute_spar_params_enc_fx( cov_real_fx, cov_real_q, dm_fv_re_fx, &q_dm_fv_re, 0, hMdEnc->mixer_mat_fx, &hMdEnc->q_mixer_mat_fx, 0, nB, dtx_vad, num_ch, bands_bw, active_w, active_w_vlbr, &hMdEnc->spar_md_cfg, &hMdEnc->spar_md, Wscale_fx, q_Wscale, 0, dyn_active_w_flag ); -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - for ( i = 0; i < num_ch - 1; i++ ) - { - for ( j = 0; j < nB; j++ ) - { - dm_fv_re[i][j] = fixedToFloat_32( dm_fv_re_fx[i][j], q_dm_fv_re ); - } - } - for ( i = 0; i < num_ch; i++ ) - { - for ( j = 0; j < num_ch; j++ ) - { - for ( b = 0; b < nB; b++ ) - { - hMdEnc->mixer_mat[i][j][b] = fixedToFloat_32( hMdEnc->mixer_mat_fx[i][j][b], hMdEnc->q_mixer_mat_fx ); - } - } - } - Word16 q_tmp; - for ( b = 0; b < nB; b++ ) - { - Wscale[b] = fixedToFloat_32( Wscale_fx[b], q_Wscale[b] ); - for ( i = 0; i < num_ch - 1; i++ ) - { - q_tmp = hMdEnc->spar_md.band_coeffs[b].q_pred_re_fx; - hMdEnc->spar_md.band_coeffs[b].pred_re[i] = fixedToFloat_32( hMdEnc->spar_md.band_coeffs[b].pred_re_fx[i], q_tmp ); - } - ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw]; - if ( ndm != num_ch ) - { - for ( i = 0; i < num_ch - ndm; i++ ) - { - q_tmp = hMdEnc->spar_md.band_coeffs[b].q_P_re_fx; - hMdEnc->spar_md.band_coeffs[b].P_re[i] = fixedToFloat_32( hMdEnc->spar_md.band_coeffs[b].P_re_fx[i], q_tmp ); - } - if ( ndm != 1 ) - { - for ( i = 0; i < num_ch - ndm; i++ ) - { - for ( j = 0; j < ndm - 1; j++ ) - { - q_tmp = hMdEnc->spar_md.band_coeffs[b].q_C_re_fx; - hMdEnc->spar_md.band_coeffs[b].C_re[i][j] = fixedToFloat_32( hMdEnc->spar_md.band_coeffs[b].C_re_fx[i][j], q_tmp ); - } - } - } - } - } -#endif -#else - ivas_compute_spar_params( cov_real, dm_fv_re, 0, hMdEnc->mixer_mat, 0, nB, dtx_vad, num_ch, bands_bw, active_w, active_w_vlbr, &hMdEnc->spar_md_cfg, &hMdEnc->spar_md, Wscale, 0, dyn_active_w_flag ); -#endif - -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - for ( b = 0; b < num_bands; b++ ) - { - for ( int ii = 0; ii < num_ch - 1; ii++ ) - { - hMdEnc->spar_md.band_coeffs[b].pred_re_fx[ii] = float_to_fix( hMdEnc->spar_md.band_coeffs[b].pred_re[ii], Q28 ); - hMdEnc->spar_md.band_coeffs[b].P_re_fx[ii] = float_to_fix( hMdEnc->spar_md.band_coeffs[b].P_re[ii], Q28 ); - } - } -#endif IF( dirac_mono_flag ) { Word16 i_ts; @@ -1091,7 +990,6 @@ ivas_error ivas_spar_md_enc_process_fx( { FOR( j = 0; j < ndm + ndec - 1; j++ ) { - hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re[j] = 0.0f; hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].pred_re_fx[j] = 0; move32(); } @@ -1099,7 +997,6 @@ ivas_error ivas_spar_md_enc_process_fx( { FOR( k = 0; k < ndm - 1; k++ ) { - hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].C_re[j][k] = 0.0f; hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].C_re_fx[j][k] = 0; move32(); } @@ -1107,7 +1004,6 @@ ivas_error ivas_spar_md_enc_process_fx( FOR( j = 0; j < ndec; j++ ) { - hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].P_re[j] = 0.0f; hMdEnc->spar_md.band_coeffs[b + i_ts * IVAS_MAX_NUM_BANDS].P_re_fx[j] = 0; move32(); } @@ -1119,12 +1015,6 @@ ivas_error ivas_spar_md_enc_process_fx( move16(); FOR( qsi = 0; qsi < num_quant_strats; qsi++ ) { -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - hMdEnc->spar_md_cfg.quant_strat[qsi].P_r.min_fx = float_to_fix( hMdEnc->spar_md_cfg.quant_strat[qsi].P_r.min, Q28 ); - hMdEnc->spar_md_cfg.quant_strat[qsi].P_r.max_fx = float_to_fix( hMdEnc->spar_md_cfg.quant_strat[qsi].P_r.max, Q28 ); - hMdEnc->spar_md_cfg.quant_strat[qsi].PR.min_fx = float_to_fix( hMdEnc->spar_md_cfg.quant_strat[qsi].PR.min, Q28 ); - hMdEnc->spar_md_cfg.quant_strat[qsi].PR.max_fx = float_to_fix( hMdEnc->spar_md_cfg.quant_strat[qsi].PR.max, Q28 ); -#endif FOR( b = 0; b < num_bands; b++ ) { ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw]; @@ -1172,7 +1062,7 @@ ivas_error ivas_spar_md_enc_process_fx( ivas_quant_strat_t qs; Word16 PR_step_e; qs = hMdEnc->spar_md_cfg.quant_strat[qsi]; - PR_uq = hMdEnc->spar_md.band_coeffs[b].pred_re_fx[i]; + PR_uq = hMdEnc->spar_md.band_coeffs[b].pred_re_fx[i]; // Q28 move32(); PR_step = BASOP_Util_Divide3216_Scale( L_sub( qs.PR.max_fx, qs.PR.min_fx ), sub( qs.PR.q_levels[0], 1 ), &PR_step_e ); PR_step_e = sub( PR_step_e, Q12 ); @@ -1205,47 +1095,11 @@ ivas_error ivas_spar_md_enc_process_fx( ivas_spar_quant_pred_coeffs_dtx_fx( &hMdEnc->spar_md, hMdEnc->spar_md.band_coeffs[b].pred_re_fx, ndm, hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re, sub( num_ch, 1 ), hMdEnc->spar_md.band_coeffs[b].pred_quant_re_fx ); } } -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - for ( b = 0; b < num_bands; b++ ) - { - for ( int ii = 0; ii < IVAS_SPAR_MAX_CH - 1; ii++ ) - { - hMdEnc->spar_md.band_coeffs[b].pred_quant_re[ii] = fix_to_float( hMdEnc->spar_md.band_coeffs[b].pred_quant_re_fx[ii], Q28 ); - hMdEnc->spar_md.band_coeffs[b].P_quant_re[ii] = fix_to_float( hMdEnc->spar_md.band_coeffs[b].P_quant_re_fx[ii], Q28 ); - } - } - Word16 Wscale_e, dm_fv_re_q = Q31, mixer_q = Q31; - f2me_buf( Wscale, Wscale_fx, &Wscale_e, (Word32) num_bands ); - - for ( i = 0; i < num_ch - 1; i++ ) - { - dm_fv_re_q = s_min( dm_fv_re_q, Q_factor_arrL( dm_fv_re[i], num_bands ) ); - } - for ( i = 0; i < num_ch; i++ ) - { - for ( j = 0; j < num_ch; j++ ) - { - mixer_q = s_min( mixer_q, Q_factor_arrL( hMdEnc->mixer_mat[i][j], num_bands ) ); - } - } - mixer_q = mixer_q - Wscale_e; // Important - for ( i = 0; i < num_ch; i++ ) - { - for ( j = 0; j < num_ch; j++ ) - { - floatToFixed_arrL32( hMdEnc->mixer_mat[i][j], hMdEnc->mixer_mat_fx[i][j], mixer_q, num_bands ); - } - } - for ( i = 0; i < num_ch - 1; i++ ) - { - floatToFixed_arrL32( dm_fv_re[i], dm_fv_re_fx[i], dm_fv_re_q, num_bands ); - } -#endif FOR( i = 0; i < num_ch - 1; i++ ) { FOR( b = 0; b < num_bands; b++ ) { - pred_coeffs_re_fx[i][b] = L_shl( Mpy_32_32( Wscale_fx[b], hMdEnc->spar_md.band_coeffs[b].pred_quant_re_fx[i] ), Wscale_e ); + pred_coeffs_re_fx[i][b] = L_shl( Mpy_32_32( Wscale_fx[b], hMdEnc->spar_md.band_coeffs[b].pred_quant_re_fx[i] ), sub( Q31, q_Wscale[b] ) ); // Q28 move32(); } } @@ -1261,7 +1115,6 @@ ivas_error ivas_spar_md_enc_process_fx( pred_coeffs_re_fx[i][b] = pred_coeffs_re_local_fx[i][b]; move32(); hMdEnc->spar_md.band_coeffs[b].pred_quant_re_fx[i] = 0; - hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i] = 0.0f; move32(); hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] = 0; move16(); @@ -1269,8 +1122,27 @@ ivas_error ivas_spar_md_enc_process_fx( } } - ivas_create_fullr_dmx_mat_fx( pred_coeffs_re_fx, Q28, dm_fv_re_fx, dm_fv_re_q, hMdEnc->mixer_mat_fx, &mixer_q, num_ch, 0, num_bands, active_w, &hMdEnc->spar_md_cfg ); - + ivas_create_fullr_dmx_mat_fx( pred_coeffs_re_fx, Q28, dm_fv_re_fx, q_dm_fv_re, hMdEnc->mixer_mat_fx, &hMdEnc->q_mixer_mat_fx, num_ch, 0, num_bands, active_w, &hMdEnc->spar_md_cfg ); + Word16 Wscale_e = Q31; + move16(); + /* Common q for Wscale buffer */ + FOR( b = 0; b < num_bands; b++ ) + { + if ( GT_16( Wscale_e, q_Wscale[b] ) ) + { + Wscale_e = q_Wscale[b]; + move16(); + } + } + FOR( b = 0; b < num_bands; b++ ) + { + Wscale_fx[b] = L_shr( Wscale_fx[b], sub( q_Wscale[b], Wscale_e ) ); // Q(Wscale_e) + move32(); + } + Wscale_e = sub( Q31, Wscale_e ); // Wscale_e is now exp of Wscale + /*mixer-q adjusted for Wscale multplication below */ + hMdEnc->q_mixer_mat_fx = sub( hMdEnc->q_mixer_mat_fx, Wscale_e ); + move16(); FOR( b = 0; b < num_bands; b++ ) { ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[b * bands_bw]; @@ -1280,16 +1152,18 @@ ivas_error ivas_spar_md_enc_process_fx( FOR( i = 0; i < num_ch; i++ ) { - hMdEnc->mixer_mat_fx[0][i][b] = L_shl( Mpy_32_32( hMdEnc->mixer_mat_fx[0][i][b], Wscale_fx[b] ), Wscale_e ); + hMdEnc->mixer_mat_fx[0][i][b] = Mpy_32_32( hMdEnc->mixer_mat_fx[0][i][b], Wscale_fx[b] ); move32(); -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - hMdEnc->mixer_mat[0][i][b] = fix_to_float( hMdEnc->mixer_mat_fx[0][i][b], mixer_q ); -#endif + FOR( j = 1; j < num_ch; j++ ) + { + hMdEnc->mixer_mat_fx[j][i][b] = L_shr( hMdEnc->mixer_mat_fx[j][i][b], Wscale_e ); // Q(hMdEnc->q_mixer_mat_fx) + move32(); + } } - + test(); IF( NE_16( ndm, num_ch ) && NE_16( ndm, 1 ) ) { - ivas_calc_c_p_coeffs( &hMdEnc->spar_md, cov_real, 0, hMdEnc->mixer_mat, num_ch, ndm, b, dtx_vad, 0, dyn_active_w_flag ); + ivas_calc_c_p_coeffs_enc_fx( &hMdEnc->spar_md, cov_real_fx, cov_real_q, 0, hMdEnc->mixer_mat_fx, hMdEnc->q_mixer_mat_fx, num_ch, ndm, b, dtx_vad, 0, dyn_active_w_flag ); IF( dirac_mono_flag ) { @@ -1301,13 +1175,13 @@ ivas_error ivas_spar_md_enc_process_fx( { FOR( k = 0; k < ndm - 1; k++ ) { - hMdEnc->spar_md.band_coeffs[b].C_re[j][k] = 0.0f; + hMdEnc->spar_md.band_coeffs[b].C_re_fx[j][k] = 0; + move32(); } } } - - ivas_quant_c_per_band( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b], - &hMdEnc->spar_md_cfg.quant_strat[qsi], ndec, ndm ); + ivas_quant_c_per_band_fx( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b], + &hMdEnc->spar_md_cfg.quant_strat[qsi], ndec, ndm, hMdEnc->spar_md.band_coeffs[b].q_C_re_fx ); } } @@ -1324,88 +1198,107 @@ ivas_error ivas_spar_md_enc_process_fx( { for ( j = 0; j < num_ch; j++ ) { - fixedToFloat_arrL32( hMdEnc->mixer_mat_fx[i][j], hMdEnc->mixer_mat[i][j], mixer_q, IVAS_MAX_NUM_BANDS ); + fixedToFloat_arrL32( hMdEnc->mixer_mat_fx[i][j], hMdEnc->mixer_mat[i][j], hMdEnc->q_mixer_mat_fx, IVAS_MAX_NUM_BANDS ); } } #endif IF( dtx_vad == 0 ) { -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - hMdEnc->spar_md.min_max_fx[0] = float_to_fix( hMdEnc->spar_md.min_max[0], Q28 ); - hMdEnc->spar_md.min_max_fx[1] = float_to_fix( hMdEnc->spar_md.min_max[1], Q28 ); -#endif ivas_write_parameter_bitstream_dtx_fx( &hMdEnc->spar_md, hMetaData, hMdEnc->spar_md_cfg.num_dmx_chans_per_band, hMdEnc->spar_md_cfg.num_decorr_per_band, num_bands ); BREAK; } -#ifdef IVAS_FLOAT_FIXED ivas_select_next_strat_fx( hMdEnc->spar_md_cfg.prior_strat, cs, dmx_switch, dtx_vad ); -#else - ivas_select_next_strat( hMdEnc->spar_md_cfg.prior_strat, cs, dmx_switch, dtx_vad ); -#endif - for ( i = 0; i < MAX_CODING_STRATS; i++ ) + FOR( i = 0; i < MAX_CODING_STRATS; i++ ) { strat = cs[i]; - if ( strat != NO_STRAT ) + move16(); + IF( NE_16( strat, NO_STRAT ) ) { reset_indices_enc( &hMetaData_tmp, md_indices_allocated ); -#ifdef IVAS_FLOAT_FIXED ivas_write_spar_md_bitstream_fx( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi ); -#else - ivas_write_spar_md_bitstream( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi ); -#endif /*write to main buffer if its a valid bitstream*/ - if ( hMetaData_tmp.nb_bits_tot > 0 ) + IF( hMetaData_tmp.nb_bits_tot > 0 ) { - if ( hMetaData->nb_bits_tot == bit_pos_start || hMetaData_tmp.nb_bits_tot < ( hMetaData->nb_bits_tot - bit_pos_start ) ) + test(); + IF( EQ_16( hMetaData->nb_bits_tot, bit_pos_start ) || LT_16( hMetaData_tmp.nb_bits_tot, sub( hMetaData->nb_bits_tot, bit_pos_start ) ) ) { write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start ); code_strat = strat; + move16(); } - - if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.tgt_bits_per_blk ) + Word16 add_bit; + test(); + IF( ( EQ_32( hEncoderConfig->ivas_total_brate, IVAS_256k ) && EQ_16( sba_order, SBA_FOA_ORDER ) ) ) + { + add_bit = 1; + move16(); + } + ELSE + { + add_bit = 0; + move16(); + } + IF( LE_16( add( sub( hMetaData->nb_bits_tot, bit_pos_start ), add_bit ), hMdEnc->spar_md_cfg.tgt_bits_per_blk ) ) { packed_ok = 1; - break; + move16(); + BREAK; } } } } - if ( packed_ok == 1 ) + IF( EQ_16( packed_ok, 1 ) ) { - break; + BREAK; } /*only if valid bitstream was written to main buffer*/ - if ( hMetaData->nb_bits_tot > bit_pos_start ) + IF( GT_16( hMetaData->nb_bits_tot, bit_pos_start ) ) { - if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.max_bits_per_blk ) + Word16 add_bit; + test(); + IF( EQ_32( hEncoderConfig->ivas_total_brate, IVAS_256k ) && EQ_16( sba_order, SBA_FOA_ORDER ) ) + { + add_bit = 1; + move16(); + } + ELSE + { + add_bit = 0; + move16(); + } + IF( LE_16( add( sub( hMetaData->nb_bits_tot, bit_pos_start ), add_bit ), hMdEnc->spar_md_cfg.max_bits_per_blk ) ) { packed_ok = 1; - break; + move16(); + BREAK; } } } /* Reuse mixer matrix values for unsent bands */ - if ( ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) && ( code_strat > 3 ) ) + test(); + IF( ( LT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) ) && GT_16( code_strat, 3 ) ) { - for ( b = 0; b < num_bands * bands_bw; b += 2 * bands_bw ) + FOR( b = 0; b < num_bands * bands_bw; b += 2 * bands_bw ) { - if ( ( b == 0 ) && ( code_strat % 2 == 0 ) ) + test(); + IF( ( b == 0 ) && ( s_and( code_strat, 1 ) == 0 ) ) { - b += 2; + b = add( b, 2 ); } - for ( i = 0; i < 1; i++ ) + FOR( i = 0; i < 1; i++ ) { - for ( j = 0; j < 4; j++ ) + FOR( j = 0; j < 4; j++ ) { + // TODO once fb-mixer changes are final hMdEnc->mixer_mat[i][j][b] = prior_mixer[i][j][b]; hMdEnc->mixer_mat[i][j][b + 1] = prior_mixer[i][j][b + 1]; } @@ -3188,34 +3081,38 @@ static void ivas_quant_pred_coeffs_per_band( * * Quantization of cross prediction c coeffs for each band *-----------------------------------------------------------------------------------------*/ - -static void ivas_quant_c_per_band( +static void ivas_quant_c_per_band_fx( ivas_band_coeffs_t *pband_coeffs, ivas_band_coeffs_ind_t *pBand_coeffs_idx, ivas_quant_strat_t *pQs, - const int16_t ndec, - const int16_t ndm ) + const Word16 ndec, + const Word16 ndm, + const Word16 q_C ) { - int16_t i; - int16_t j, k; - float C_re[IVAS_SPAR_MAX_C_COEFF]; + Word16 i; + Word16 j, k; + Word32 C_re[IVAS_SPAR_MAX_C_COEFF]; k = 0; - for ( i = 0; i < ndec; i++ ) + move16(); + FOR( i = 0; i < ndec; i++ ) { - for ( j = 0; j < ndm - 1; j++ ) + FOR( j = 0; j < ndm - 1; j++ ) { - C_re[k] = pband_coeffs->C_re[i][j]; - k++; + C_re[k] = pband_coeffs->C_re_fx[i][j]; + move32(); + k = add( k, 1 ); } } - ivas_quantise_real_values( C_re, pQs->C.q_levels[0], pQs->C.min, pQs->C.max, pBand_coeffs_idx->drct_index_re, C_re, ndec * ( ndm - 1 ) ); + ivas_quantise_real_values_enc_fx_varq( C_re, pQs->C.q_levels[0], pQs->C.min_fx, pQs->C.max_fx, pBand_coeffs_idx->drct_index_re, C_re, ndec * ( ndm - 1 ), q_C ); k = 0; - for ( i = 0; i < ndec; i++ ) + move16(); + FOR( i = 0; i < ndec; i++ ) { - for ( j = 0; j < ndm - 1; j++ ) + FOR( j = 0; j < ndm - 1; j++ ) { - pband_coeffs->C_quant_re[i][j] = C_re[k]; - k++; + pband_coeffs->C_quant_re_fx[i][j] = C_re[k]; + move32(); + k = add( k, 1 ); } } diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 8e8dc8f84..0286115d7 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -938,22 +938,20 @@ typedef struct ivas_dirac_enc_data_structure IVAS_FB_MIXER_HANDLE hFbMixer; /* DirAC parameter estimation */ - float **direction_vector[DIRAC_NUM_DIMS]; - float **direction_vector_m[DIRAC_NUM_DIMS]; /* Average direction vector */ - float diffuseness_m[DIRAC_MAX_NBANDS]; #ifdef IVAS_FLOAT_FIXED Word32 **direction_vector_m_fx[DIRAC_NUM_DIMS]; /* Average direction vector */ Word16 direction_vector_m_exp[MAX_PARAM_SPATIAL_SUBFRAMES]; // direction_vector_m_fx[i][j][k] will map to direction_vector_m_exp[j] exponent. Word32 diffuseness_m_fx[DIRAC_MAX_NBANDS]; Word16 diffuseness_m_exp[DIRAC_MAX_NBANDS]; +#else + float **direction_vector_m[DIRAC_NUM_DIMS]; /* Average direction vector */ + float **direction_vector[DIRAC_NUM_DIMS]; + float diffuseness_m[DIRAC_MAX_NBANDS]; #endif int16_t band_grouping[DIRAC_MAX_NBANDS + 1]; int16_t block_grouping[5]; int16_t firstrun_sector_params; - float sec_I_vec_smth_x[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; - float sec_I_vec_smth_y[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; - float sec_I_vec_smth_z[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; #ifdef IVAS_FLOAT_FIXED Word32 sec_I_vec_smth_x_fx[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; Word16 sec_I_vec_smth_x_exp[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; @@ -961,29 +959,35 @@ typedef struct ivas_dirac_enc_data_structure Word16 sec_I_vec_smth_y_exp[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; Word32 sec_I_vec_smth_z_fx[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; Word16 sec_I_vec_smth_z_exp[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; +#else + float sec_I_vec_smth_x[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + float sec_I_vec_smth_y[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + float sec_I_vec_smth_z[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; #endif - float energy_smth[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; - float azi_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; - float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; #ifdef IVAS_FLOAT_FIXED Word32 energy_smth_fx[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; Word16 energy_smth_exp[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; Word32 azi_prev_fx[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; Word32 ele_prev_fx[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; +#else + float energy_smth[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + float azi_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; + float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; #endif /* diffuseness */ int16_t index_buffer_intensity; int16_t no_col_avg_diff; - float **buffer_intensity_real[DIRAC_NUM_DIMS]; - float *buffer_energy; #ifdef IVAS_FLOAT_FIXED Word32 **buffer_intensity_real_fx[DIRAC_NUM_DIMS]; Word16 buffer_intensity_real_q[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF][DIRAC_MAX_NBANDS]; Word32 *buffer_energy_fx; Word16 buffer_energy_q[DIRAC_NO_COL_AVG_DIFF * DIRAC_MAX_NBANDS]; +#else + float **buffer_intensity_real[DIRAC_NUM_DIMS]; + float *buffer_energy; #endif /* Frame count for detecting mono */ -- GitLab