diff --git a/lib_com/ivas_omasa_com.c b/lib_com/ivas_omasa_com.c index 31874a7b52b295b9224516cb327b3ee778d4d607..e49a2c8fe161c057d9441e2556f0c5b73bfef2fe 100644 --- a/lib_com/ivas_omasa_com.c +++ b/lib_com/ivas_omasa_com.c @@ -35,7 +35,9 @@ #include "ivas_cnst.h" #include "ivas_prot.h" #include "prot.h" +#include "prot_fx1.h" #include "ivas_rom_com.h" +#include "rom_com.h" #include /*--------------------------------------------------------------- @@ -58,6 +60,23 @@ #define GAMMA_ISM_MEDIUM_IMP4 1.0f #define GAMMA_ISM_HIGH_IMP4 1.2f +#ifdef IVAS_FLOAT_FIXED +#define GAMMA_ISM_LOW_IMP_FX 26215 /*0.8f in Q15*/ +#define GAMMA_ISM_MEDIUM_IMP_FX 39322 /*1.2f in Q15*/ +#define GAMMA_ISM_HIGH_IMP_FX 45876 /*1.4f in Q15*/ + +#define GAMMA_ISM_LOW_IMP2_FX 29492 /*0.9f in Q15*/ +#define GAMMA_ISM_MEDIUM_IMP2_FX 39322 /*1.2f in Q15*/ +#define GAMMA_ISM_HIGH_IMP2_FX 44237 /*1.35f in Q15*/ + +#define GAMMA_ISM_LOW_IMP3_FX 27853 /*0.85f in Q15*/ +#define GAMMA_ISM_MEDIUM_IMP3_FX 37684 /*1.15f in Q15*/ +#define GAMMA_ISM_HIGH_IMP3_FX 42599 /*1.3f in Q15*/ + +#define GAMMA_ISM_LOW_IMP4_FX 26215 /*0.8f in Q15*/ +#define GAMMA_ISM_MEDIUM_IMP4_FX 32768 /*1.0f in Q15*/ +#define GAMMA_ISM_HIGH_IMP4_FX 39322 /*1.2f in Q15*/ +#endif /*--------------------------------------------------------------- * ivas_omasa_ism_mode_select() @@ -67,6 +86,94 @@ * ---------------------------------------------------------------*/ /*! r : ISM format mode */ +#ifdef IVAS_FLOAT_FIXED +ISM_MODE ivas_omasa_ism_mode_select( + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word16 nchan_ism /* i : number of input ISM's */ +) +{ + ISM_MODE ism_mode = ISM_MODE_NONE; + move16(); + + SWITCH( nchan_ism ) + { + case 1: + IF( GE_32( ivas_total_brate, IVAS_24k4 ) ) + { + ism_mode = ISM_MASA_MODE_DISC; + move16(); + } + ELSE + { + ism_mode = ISM_MODE_NONE; + move16(); + } + BREAK; + case 2: + IF( GE_32( ivas_total_brate, IVAS_48k ) ) + { + ism_mode = ISM_MASA_MODE_DISC; + move16(); + } + ELSE IF( GE_32( ivas_total_brate, IVAS_32k ) ) + { + ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ; + move16(); + } + ELSE + { + ism_mode = ISM_MODE_NONE; + move16(); + } + BREAK; + case 3: + IF( GE_32( ivas_total_brate, IVAS_96k ) ) + { + ism_mode = ISM_MASA_MODE_DISC; + move16(); + } + ELSE IF( GE_32( ivas_total_brate, IVAS_64k ) ) + { + ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ; + move16(); + } + ELSE IF( GE_32( ivas_total_brate, IVAS_32k ) ) + { + ism_mode = ISM_MASA_MODE_MASA_ONE_OBJ; + move16(); + } + ELSE + { + ism_mode = ISM_MODE_NONE; + move16(); + } + BREAK; + case 4: + IF( GE_32( ivas_total_brate, IVAS_128k ) ) + { + ism_mode = ISM_MASA_MODE_DISC; + move16(); + } + ELSE IF( GE_32( ivas_total_brate, IVAS_64k ) ) + { + ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ; + move16(); + } + ELSE IF( GE_32( ivas_total_brate, IVAS_32k ) ) + { + ism_mode = ISM_MASA_MODE_MASA_ONE_OBJ; + move16(); + } + ELSE + { + ism_mode = ISM_MODE_NONE; + } + BREAK; + } + + return ism_mode; +} +#else ISM_MODE ivas_omasa_ism_mode_select( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const int16_t nchan_ism /* i : number of input ISM's */ @@ -140,7 +247,7 @@ ISM_MODE ivas_omasa_ism_mode_select( return ism_mode; } - +#endif /*--------------------------------------------------------------- * ivas_set_omasa_TC() @@ -148,6 +255,42 @@ ISM_MODE ivas_omasa_ism_mode_select( * set number of transport channels in OMASA format * ---------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_set_omasa_TC( + const ISM_MODE ism_mode, /* i : ISM mode */ + const Word16 nchan_ism, /* i : number of input ISMs */ + Word16 *nSCE, /* o : number of SCEs */ + Word16 *nCPE /* o : number of CPEs */ +) +{ + SWITCH( ism_mode ) + { + case ISM_MASA_MODE_MASA_ONE_OBJ: + case ISM_MASA_MODE_PARAM_ONE_OBJ: + *nCPE = 1; + move16(); + *nSCE = 1; + move16(); + BREAK; + case ISM_MASA_MODE_DISC: + *nCPE = 1; + move16(); + *nSCE = nchan_ism; + move16(); + BREAK; + case ISM_MODE_NONE: + *nCPE = 1; + move16(); + *nSCE = 0; + move16(); + BREAK; + default: + BREAK; + } + + return; +} +#else void ivas_set_omasa_TC( const ISM_MODE ism_mode, /* i : ISM mode */ const int16_t nchan_ism, /* i : number of input ISMs */ @@ -176,7 +319,7 @@ void ivas_set_omasa_TC( return; } - +#endif /*--------------------------------------------------------------- * ivas_interformat_brate() @@ -185,6 +328,149 @@ void ivas_set_omasa_TC( * ---------------------------------------------------------------*/ /*! r: adjusted bitrate */ +#ifdef IVAS_FLOAT_FIXED +Word32 ivas_interformat_brate( + const ISM_MODE ism_mode, /* i : ISM mode */ + const Word16 nchan_ism, /* i : number of ISM channels */ + const Word32 element_brate, /* i : element bitrate */ + const Word16 ism_imp, /* i : ISM importance flag */ + const Word16 limit_flag /* i : flag to limit the bitrate increase */ +) +{ + Word32 element_brate_out; + Word16 nBits, limit_low, limit_high; + + nBits = extract_l( div_l( element_brate, shr( FRAMES_PER_SEC, 1 ) ) ); + + IF( EQ_16( ism_imp, ISM_INACTIVE_IMP ) ) + { + nBits = BITS_ISM_INACTIVE; + move16(); + } + ELSE + { + IF( EQ_16( (Word16) ism_mode, (Word16) ISM_MASA_MODE_DISC ) && ( ( EQ_16( nchan_ism, 4 ) && EQ_32( element_brate, 24000 ) ) || ( EQ_16( nchan_ism, 3 ) && LE_32( element_brate, 24000 ) ) || ( EQ_16( nchan_ism, 2 ) && LE_32( element_brate, 11000 ) ) ) ) /* for border case in DISC mode */ + { + IF( EQ_16( limit_flag, 1 ) && ( ( EQ_16( nchan_ism, 4 ) && EQ_32( element_brate, 24000 ) ) || ( EQ_16( nchan_ism, 3 ) && EQ_32( element_brate, 20000 ) ) || ( EQ_16( nchan_ism, 2 ) && LE_32( element_brate, 11000 ) ) ) ) + { + return element_brate; + } + + IF( EQ_16( ism_imp, ISM_LOW_IMP ) ) + { + nBits = extract_l( Mpy_32_16_1( GAMMA_ISM_LOW_IMP4_FX, nBits ) ); + } + ELSE IF( EQ_16( ism_imp, ISM_MEDIUM_IMP ) ) + { + nBits = extract_l( Mpy_32_16_1( GAMMA_ISM_MEDIUM_IMP4_FX, nBits ) ); + IF( EQ_16( limit_flag, -1 ) ) + { + nBits = extract_l( Mpy_32_16_1( GAMMA_ISM_HIGH_IMP4_FX, nBits ) ); + } + } + ELSE /* ISM_HIGH_IMP */ + { + nBits = extract_l( Mpy_32_16_1( GAMMA_ISM_HIGH_IMP4_FX, nBits ) ); + IF( EQ_16( limit_flag, -1 ) ) + { + nBits = extract_l( Mpy_32_16_1( GAMMA_ISM_HIGH_IMP4_FX, nBits ) ); + } + } + } + ELSE IF( EQ_16( (Word16) ism_mode, (Word16) ISM_MASA_MODE_PARAM_ONE_OBJ ) || + ( EQ_16( (Word16) ism_mode, (Word16) ISM_MASA_MODE_DISC ) && EQ_32( element_brate, 9600 ) ) /* this condition corresponds to the ivas_total_brate = 24400 and 1 object */ + ) + { + IF( EQ_16( (Word16) ism_mode, (Word16) ISM_MASA_MODE_PARAM_ONE_OBJ ) && EQ_32( element_brate, IVAS_13k2 ) ) + { + IF( EQ_16( ism_imp, ISM_LOW_IMP ) ) + { + nBits = extract_l( Mpy_32_16_1( GAMMA_ISM_LOW_IMP3_FX, nBits ) ); + } + ELSE IF( EQ_16( ism_imp, ISM_MEDIUM_IMP ) ) + { + nBits = extract_l( Mpy_32_16_1( GAMMA_ISM_MEDIUM_IMP3_FX, nBits ) ); + } + ELSE /* ISM_HIGH_IMP */ + { + nBits = extract_l( Mpy_32_16_1( GAMMA_ISM_HIGH_IMP4_FX, nBits ) ); + } + } + ELSE + { + IF( EQ_16( ism_imp, ISM_LOW_IMP ) ) + { + nBits = extract_l( Mpy_32_16_1( GAMMA_ISM_LOW_IMP3_FX, nBits ) ); + } + ELSE IF( EQ_16( ism_imp, ISM_MEDIUM_IMP ) ) + { + nBits = extract_l( Mpy_32_16_1( GAMMA_ISM_MEDIUM_IMP3_FX, nBits ) ); + } + ELSE /* ISM_HIGH_IMP */ + { + nBits = extract_l( Mpy_32_16_1( GAMMA_ISM_HIGH_IMP3_FX, nBits ) ); + } + } + } + ELSE IF( EQ_16( (Word16) ism_mode, (Word16) ISM_MASA_MODE_MASA_ONE_OBJ ) && EQ_32( element_brate, 16000 ) ) + { + IF( EQ_16( ism_imp, ISM_LOW_IMP ) ) + { + nBits = extract_l( Mpy_32_16_1( GAMMA_ISM_LOW_IMP_FX, nBits ) ); + } + ELSE IF( EQ_16( ism_imp, ISM_MEDIUM_IMP ) ) + { + nBits = extract_l( Mpy_32_16_1( GAMMA_ISM_MEDIUM_IMP_FX, nBits ) ); + } + ELSE /* ISM_HIGH_IMP */ + { + nBits = extract_l( Mpy_32_16_1( GAMMA_ISM_HIGH_IMP3_FX, nBits ) ); + } + } + ELSE + { + IF( EQ_16( ism_imp, ISM_LOW_IMP ) ) + { + nBits = extract_l( Mpy_32_16_1( GAMMA_ISM_LOW_IMP_FX, nBits ) ); + } + ELSE IF( EQ_16( ism_imp, ISM_MEDIUM_IMP ) ) + { + nBits = extract_l( Mpy_32_16_1( GAMMA_ISM_MEDIUM_IMP_FX, nBits ) ); + } + ELSE /* ISM_HIGH_IMP */ + { + nBits = extract_l( Mpy_32_16_1( GAMMA_ISM_HIGH_IMP_FX, nBits ) ); + } + } + } + + limit_low = MIN_BRATE_SWB_BWE / FRAMES_PER_SEC; + IF( EQ_16( ism_imp, ISM_INACTIVE_IMP ) ) + { + limit_low = BITS_ISM_INACTIVE; + move16(); + } + ELSE IF( GE_32( element_brate, SCE_CORE_16k_LOW_LIMIT ) ) + { + limit_low = SCE_CORE_16k_LOW_LIMIT / FRAMES_PER_SEC; + move16(); + } + + limit_high = IVAS_512k / FRAMES_PER_SEC; + move16(); + IF( LE_32( element_brate, SCE_CORE_16k_LOW_LIMIT ) ) + { + limit_high = ACELP_12k8_HIGH_LIMIT / FRAMES_PER_SEC; + move16(); + } + + nBits = check_bounds_s( nBits, limit_low, limit_high ); + + element_brate_out = L_mult0( nBits, FRAMES_PER_SEC ); + + return element_brate_out; +} +#else int32_t ivas_interformat_brate( const ISM_MODE ism_mode, /* i : ISM mode */ const int16_t nchan_ism, /* i : number of ISM channels */ @@ -321,7 +607,7 @@ int32_t ivas_interformat_brate( return element_brate_out; } - +#endif /*--------------------------------------------------------------- * ivas_combined_format_brate_sanity() @@ -329,6 +615,64 @@ int32_t ivas_interformat_brate( * Sanity check in combined format coding * ---------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_combined_format_brate_sanity( + const Word32 element_brate, /* i : element bitrate */ + const Word16 core, /* i : core */ + const Word32 total_brate, /* i : total bitrate */ + Word32 *core_brate, /* i/o: core bitrate */ + Word16 *inactive_coder_type_flag, /* o : inactive coder_type flag */ + Word16 *diff_nBits /* o : number of differential bits */ +) +{ + Word16 limit_high, nBits; + Word32 brate_diff; + + brate_diff = L_sub( total_brate, *core_brate ); + + /* sanity check: at lowest IVAS bit-rates and one ISM channel coded by + low-rate core-coder mode, it can happen that the CPE (MASA) bit-budget + for ACELP core-coding @12.8 kHz is too high */ + + IF( LT_32( element_brate, ACELP_12k8_HIGH_LIMIT ) ) + { + limit_high = ACELP_12k8_HIGH_LIMIT / FRAMES_PER_SEC; + move16(); + nBits = extract_l( div_l( *core_brate, shr( FRAMES_PER_SEC, 1 ) ) ); + + *diff_nBits = sub( nBits, limit_high ); + IF( GT_16( *diff_nBits, 0 ) ) + { + IF( EQ_16( core, TCX_20_CORE ) || EQ_16( core, TCX_10_CORE ) ) + { + *diff_nBits = 0; + move16(); + } + ELSE /* ACELP core */ + { + *core_brate = L_sub( *core_brate, L_mult0( *diff_nBits, FRAMES_PER_SEC ) ); + } + } + } + + /*-----------------------------------------------------------------* + * set inactive coder_type flag in ACELP core + *-----------------------------------------------------------------*/ + + IF( EQ_16( core, ACELP_CORE ) ) + { + *inactive_coder_type_flag = 0; /* AVQ by default */ + move16(); + IF( LE_32( L_add( *core_brate, brate_diff ), MAX_GSC_INACTIVE_BRATE ) ) + { + *inactive_coder_type_flag = 1; /* GSC */ + move16(); + } + } + + return; +} +#else void ivas_combined_format_brate_sanity( const int32_t element_brate, /* i : element bitrate */ const int16_t core, /* i : core */ @@ -381,7 +725,7 @@ void ivas_combined_format_brate_sanity( return; } - +#endif /*--------------------------------------------------------------- * bits_index_ism_ratio() @@ -390,6 +734,38 @@ void ivas_combined_format_brate_sanity( * ---------------------------------------------------------------*/ /*!r : number of bits for ISM ratio index */ +#ifdef IVAS_FLOAT_FIXED +Word16 bits_index_ism_ratio( + const Word16 nchan_ism /* i : number of objects */ +) +{ + Word16 bits_index; + + bits_index = 0; + move16(); + IF( EQ_16( nchan_ism, 2 ) ) + { + bits_index = 3; + move16(); + } + ELSE IF( EQ_16( nchan_ism, 3 ) ) + { + bits_index = 6; + move16(); + } + ELSE IF( EQ_16( nchan_ism, 4 ) ) + { + bits_index = 7; + move16(); + } + ELSE + { + assert( ( nchan_ism >= 2 && nchan_ism <= 4 ) && "Wrong number of objects for MASA_ISM." ); + } + + return bits_index; +} +#else int16_t bits_index_ism_ratio( const int16_t nchan_ism /* i : number of objects */ ) @@ -416,7 +792,7 @@ int16_t bits_index_ism_ratio( return bits_index; } - +#endif /*--------------------------------------------------------------- * calculate_nbits_meta() @@ -424,6 +800,7 @@ int16_t bits_index_ism_ratio( * * ---------------------------------------------------------------*/ + void calculate_nbits_meta( const int16_t nchan_ism, float q_energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], @@ -476,12 +853,116 @@ void calculate_nbits_meta( } } bits_ism[obj] = bits_direction_masa[0] - (int16_t) ( ( 1 - ( (int16_t) ( priority[obj] * 1000.0f ) ) * 0.001f ) * 6 ); + // bits_ism[obj] = bits_direction_masa[0] - (int16_t) ( ( 1 - ( priority[obj] ) ) * 6 ); } return; } +#ifdef IVAS_FLOAT_FIXED +static Word16 get_bits_ism( Word32 val ) +{ + Word16 res; + IF( LE_32( val, 536870912 ) && GT_32( val, 447750340 ) ) + { + res = 0; + move16(); + } + ELSE IF( LE_32( val, 447750340 ) && GT_32( val, 358092897 ) ) + { + res = 1; + move16(); + } + ELSE IF( LE_32( val, 358092897 ) && GT_32( val, 268972326 ) ) + { + res = 2; + move16(); + } + ELSE IF( LE_32( val, 268972326 ) && GT_32( val, 179314884 ) ) + { + res = 3; + move16(); + } + ELSE IF( LE_32( val, 179314884 ) && GT_32( val, 89657442 ) ) + { + res = 4; + move16(); + } + ELSE IF( LE_32( val, 89657442 ) && GT_32( val, 536870 ) ) + { + res = 5; + move16(); + } + ELSE + { + res = 6; + move16(); + } + return res; +} +void calculate_nbits_meta_fx( + const Word16 nchan_ism, + Word32 q_energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], // Qx + Word32 masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], // Qx + const Word16 numSf, + const Word16 numCodingBands, + Word16 *bits_ism, + const Word16 idx_sep_obj, + const Word16 ism_imp ) +{ + Word16 sf, band, obj; + Word32 priority[MAX_NUM_OBJECTS], max_p; + + IF( GT_16( nchan_ism, 1 ) ) + { + set32_fx( priority, 0, nchan_ism ); + FOR( sf = 0; sf < numSf; sf++ ) + { + FOR( band = 0; band < numCodingBands; band++ ) + { + FOR( obj = 0; obj < nchan_ism; obj++ ) + { + priority[obj] = max( priority[obj], ( Mpy_32_32( q_energy_ratio_ism[sf][band][obj], L_sub( 1073741824, masa_to_total_energy_ratio[sf][band] ) ) ) ); // Qx - 1 + move32(); + } + } + } + } + ELSE + { + priority[0] = 536870912; + } + + /* decide parameters for ISM metadata quantization */ + maximum_32_fx( priority, nchan_ism, &max_p ); + FOR( obj = 0; obj < nchan_ism; obj++ ) + { + IF( EQ_16( obj, idx_sep_obj ) ) + { + IF( EQ_16( ism_imp, 3 ) ) + { + priority[obj] = 536870912; + move32(); + } + ELSE IF( EQ_16( ism_imp, 2 ) ) + { + priority[obj] = L_shr( L_add( 536870912, max_p ), 1 ); + move32(); + } + ELSE + { + priority[obj] = max_p; + move32(); + } + } + bits_ism[obj] = sub( bits_direction_masa[0], get_bits_ism( priority[obj] ) ); + move16(); + } + return; +} +#endif + /*--------------------------------------------------------------- * ivas_get_stereo_panning_gains() * @@ -525,6 +1006,149 @@ void ivas_get_stereo_panning_gains( return; } +#ifdef IVAS_FLOAT_FIXED + +#define SIN_NEG_30_DEGREES_Q15 ( (Word16) 0xC000 ) +#define SIN_30_DEGREES_Q15 ( (Word16) 0x4000 ) + +static void get_panning_gain( + const Word16 sinAngleMapped, + Word16 *panningGains ) +{ + Word16 tbl_len = 601; + Word16 idx = shr( tbl_len, 1 ); + const Word16 *ptr_sin = &ivas_sine_panning_tbl_fx[0]; + const Word16 *ptr_tan_0 = ivas_tan_panning_gain_tbl_fx; + + Word16 lim_l = 0; + move16(); + Word16 lim_r = tbl_len; + move16(); + + WHILE( 1 ) + { + idx = shr( add( lim_l, lim_r ), 1 ); + IF( GE_16( idx, tbl_len ) ) + { + panningGains[0] = ptr_tan_0[tbl_len - 1]; + move16(); + panningGains[1] = ptr_tan_0[0]; + move16(); + BREAK; + } + ELSE IF( LT_16( idx, 0 ) ) + { + panningGains[0] = ptr_tan_0[0]; + move16(); + panningGains[1] = ptr_tan_0[tbl_len - 1]; + move16(); + BREAK; + } + ELSE IF( LE_16( sinAngleMapped, ptr_sin[idx + 1] ) && GE_16( sinAngleMapped, ptr_sin[idx] ) ) + { + IF( EQ_16( sinAngleMapped, ptr_sin[idx + 1] ) ) + { + panningGains[0] = ptr_tan_0[idx + 1]; + move16(); + panningGains[1] = ptr_tan_0[tbl_len - idx - 2]; + move16(); + BREAK; + } + ELSE IF( EQ_16( sinAngleMapped, ptr_sin[idx] ) ) + { + panningGains[0] = ptr_tan_0[idx]; + move16(); + panningGains[1] = ptr_tan_0[tbl_len - idx - 1]; + move16(); + BREAK; + } + ELSE + { + Word16 mid = extract_l( L_shr( L_add( L_deposit_l( ptr_sin[idx] ), L_deposit_l( ptr_sin[idx + 1] ) ), 1 ) ); + IF( LE_16( sinAngleMapped, mid ) ) + { + panningGains[0] = ptr_tan_0[idx]; + move16(); + panningGains[1] = ptr_tan_0[tbl_len - idx - 1]; + move16(); + } + ELSE + { + panningGains[0] = ptr_tan_0[idx + 1]; + move16(); + panningGains[1] = ptr_tan_0[tbl_len - idx - 2]; + move16(); + } + BREAK; + } + } + ELSE IF( GT_16( sinAngleMapped, ptr_sin[idx] ) ) + { + lim_l = add( idx, 1 ); + move16(); + } + ELSE IF( LT_16( sinAngleMapped, ptr_sin[idx] ) ) + { + lim_r = sub( idx, 1 ); + move16(); + } + } +} + + +void ivas_get_stereo_panning_gains_fx( + const Word16 aziDeg, + const Word16 eleDeg, + Word16 panningGains[2] ) +{ + /* Convert azi and ele to an azi value of the cone of confusion */ + Word16 azAddEl = add( aziDeg, eleDeg ); + Word16 azSubEl = sub( aziDeg, eleDeg ); + + const Word16 *ptr_sin_az = ivas_sin_az_fx; + + WHILE( GT_16( azAddEl, 180 ) ) + { + azAddEl = sub( azAddEl, 360 ); + } + WHILE( LT_16( azAddEl, -180 ) ) + { + azAddEl = add( azAddEl, 360 ); + } + WHILE( GT_16( azSubEl, 180 ) ) + { + azSubEl = sub( azSubEl, 360 ); + } + WHILE( LT_16( azSubEl, -180 ) ) + { + azSubEl = sub( azSubEl, 360 ); + } + // sin_az_cos_el = (ptr_sin_az[azAddEl] + ptr_sin_az[azSubEl])/2; + Word16 sin_az_cos_el = extract_l( L_shr( L_add( L_deposit_l( ptr_sin_az[azAddEl] ), L_deposit_l( ptr_sin_az[azSubEl] ) ), 1 ) ); + + IF( GE_16( sin_az_cos_el, SIN_30_DEGREES_Q15 ) ) + { /* Left side */ + panningGains[0] = (Word16) 0x7fff; + move16(); + panningGains[1] = 0; + move16(); + } + ELSE IF( LE_16( sin_az_cos_el, SIN_NEG_30_DEGREES_Q15 ) ) + { /* Right side */ + panningGains[0] = 0; + move16(); + panningGains[1] = (Word16) 0x7fff; + move16(); + } + ELSE /* Tangent panning law */ + { + get_panning_gain( sin_az_cos_el, panningGains ); + } + + return; +} +#endif + /*--------------------------------------------------------------- * calculate_brate_limit_flag() @@ -533,6 +1157,52 @@ void ivas_get_stereo_panning_gains( *---------------------------------------------------------------*/ /*! r: limitation flag */ +#ifdef IVAS_FLOAT_FIXED +Word16 calculate_brate_limit_flag( + const Word16 ism_imp[], /* i : ISM importance flags */ + const Word16 nchan_ism /* i : number of objects */ +) +{ + Word16 n; + Word16 brate_limit_flag; + Word16 nzeros; + Word16 nchan_ism_sat; + + brate_limit_flag = 0; + move16(); + nzeros = 0; + move16(); + FOR( n = 0; n < nchan_ism; n++ ) + { + brate_limit_flag = add( brate_limit_flag, ism_imp[n] ); + IF( EQ_16( ism_imp[n], 0 ) ) + { + nzeros = add( nzeros, 1 ); + } + } + nchan_ism_sat = nchan_ism; + IF( EQ_16( nchan_ism & 1, 1 ) ) + { + nchan_ism_sat = sub( nchan_ism, 1 ); + } + + IF( GE_16( i_mult( 2, brate_limit_flag ), add( i_mult( 4, nchan_ism ), nchan_ism_sat ) ) ) + { + brate_limit_flag = 1; + move16(); + } + ELSE + { + IF( GE_16( i_mult( 2, nzeros ), nchan_ism ) ) + { + brate_limit_flag = -1; /* there is no limitation, on the contrary */ + move16(); + } + } + + return brate_limit_flag; +} +#else int16_t calculate_brate_limit_flag( const int16_t ism_imp[], /* i : ISM importance flags */ const int16_t nchan_ism /* i : number of objects */ @@ -567,3 +1237,4 @@ int16_t calculate_brate_limit_flag( return brate_limit_flag; } +#endif \ No newline at end of file diff --git a/lib_com/prot_fx2.h b/lib_com/prot_fx2.h index d827fe3cd93e9179693621e899d209de17dd8c6a..092a2e9963cd7c250a9c9979a3ed46a9fa60c6c6 100644 --- a/lib_com/prot_fx2.h +++ b/lib_com/prot_fx2.h @@ -8127,4 +8127,18 @@ void save_synthesis_hq_fec_fx( const Word16 output_frame, /* i : decoded synthesis */ CPE_DEC_HANDLE hCPE /* i : CPE decoder structure */ ); +void calculate_nbits_meta_fx( + const Word16 nchan_ism, + Word32 q_energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], // Qx + Word32 masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], // Qx + const Word16 numSf, + const Word16 numCodingBands, + Word16 *bits_ism, + const Word16 idx_sep_obj, + const Word16 ism_imp ); + +void ivas_get_stereo_panning_gains_fx( + const Word16 aziDeg, + const Word16 eleDeg, + Word16 panningGains[2] ); #endif diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c index 290647252bd92abfd80cd206e5e60bc14c859d35..68d4815ea973556770c4f353f075cf0271776cef 100644 --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -10190,10 +10190,10 @@ const Word16 bpf_weights_16_ivas_fx[16] = }; const Word32 bpf_weights_16_ivas_fx_32[16] = { - 1073784774/*0.999969f Q15*/, 754369130/*0.702561f Q15*/, 224238095/*0.208838f Q15*/, 1667521/*0.001553f Q15*/, - 1908039/*0.001777f Q15*/, 1435593/*0.001370f Q15*/, 994285/*0.000926f Q15*/, 594853/*0.000554f Q15*/, - 289910/*0.000270f Q15*/, 85899/*0.000080f Q15*/, 32212/*0.000030f Q15*/, 88047/*0.000082f Q15*/, - 86973/*0.000081f Q15*/, 55835/*0.000052f Q15*/, 18254/*0.000017f Q15*/, 17179/*0.000016f Q15*/ + 1073784774/*1.000040f Q30*/, 754369130/*0.702561f Q30*/, 224238095/*0.208838f Q30*/, 1667521/*0.001553f Q30*/, + 1908039/*0.001777f Q30*/, 1435593/*0.001370f Q30*/, 994285/*0.000926f Q30*/, 594853/*0.000554f Q30*/, + 289910/*0.000270f Q30*/, 85899/*0.000080f Q30*/, 32212/*0.000030f Q30*/, 88047/*0.000082f Q30*/, + 86973/*0.000081f Q30*/, 55835/*0.000052f Q30*/, 18254/*0.000017f Q30*/, 17179/*0.000016f Q30*/ }; @@ -39906,3 +39906,212 @@ const Word32 tbl_two_pow_shift_by_4[35] = { 16777216, 14107901, 11863283, 9975792, 8388608, 7053950, 5931641, 4987896, 4194304, 3526975, 2965820 }; + + +const Word16 ivas_tan_panning_gain_tbl_fx[601] = { + SHC( 0x0000 ), SHC( 0x0042 ), SHC( 0x0084 ), SHC( 0x00c6 ), SHC( 0x0109 ), SHC( 0x014b ), SHC( 0x018e ), SHC( 0x01d1 ), + SHC( 0x0214 ), SHC( 0x0257 ), SHC( 0x029b ), SHC( 0x02de ), SHC( 0x0322 ), SHC( 0x0365 ), SHC( 0x03a9 ), SHC( 0x03ed ), + SHC( 0x0431 ), SHC( 0x0475 ), SHC( 0x04ba ), SHC( 0x04fe ), SHC( 0x0543 ), SHC( 0x0588 ), SHC( 0x05cd ), SHC( 0x0612 ), + SHC( 0x0657 ), SHC( 0x069c ), SHC( 0x06e1 ), SHC( 0x0727 ), SHC( 0x076d ), SHC( 0x07b2 ), SHC( 0x07f8 ), SHC( 0x083e ), + SHC( 0x0885 ), SHC( 0x08cb ), SHC( 0x0911 ), SHC( 0x0958 ), SHC( 0x099f ), SHC( 0x09e6 ), SHC( 0x0a2d ), SHC( 0x0a74 ), + SHC( 0x0abb ), SHC( 0x0b02 ), SHC( 0x0b4a ), SHC( 0x0b91 ), SHC( 0x0bd9 ), SHC( 0x0c21 ), SHC( 0x0c69 ), SHC( 0x0cb1 ), + SHC( 0x0cf9 ), SHC( 0x0d42 ), SHC( 0x0d8a ), SHC( 0x0dd3 ), SHC( 0x0e1c ), SHC( 0x0e65 ), SHC( 0x0eae ), SHC( 0x0ef7 ), + SHC( 0x0f40 ), SHC( 0x0f89 ), SHC( 0x0fd3 ), SHC( 0x101d ), SHC( 0x1066 ), SHC( 0x10b0 ), SHC( 0x10fa ), SHC( 0x1144 ), + SHC( 0x118f ), SHC( 0x11d9 ), SHC( 0x1223 ), SHC( 0x126e ), SHC( 0x12b9 ), SHC( 0x1304 ), SHC( 0x134f ), SHC( 0x139a ), + SHC( 0x13e5 ), SHC( 0x1430 ), SHC( 0x147c ), SHC( 0x14c7 ), SHC( 0x1513 ), SHC( 0x155f ), SHC( 0x15aa ), SHC( 0x15f6 ), + SHC( 0x1643 ), SHC( 0x168f ), SHC( 0x16db ), SHC( 0x1728 ), SHC( 0x1774 ), SHC( 0x17c1 ), SHC( 0x180e ), SHC( 0x185a ), + SHC( 0x18a7 ), SHC( 0x18f5 ), SHC( 0x1942 ), SHC( 0x198f ), SHC( 0x19dd ), SHC( 0x1a2a ), SHC( 0x1a78 ), SHC( 0x1ac5 ), + SHC( 0x1b13 ), SHC( 0x1b61 ), SHC( 0x1baf ), SHC( 0x1bfd ), SHC( 0x1c4c ), SHC( 0x1c9a ), SHC( 0x1ce8 ), SHC( 0x1d37 ), + SHC( 0x1d86 ), SHC( 0x1dd4 ), SHC( 0x1e23 ), SHC( 0x1e72 ), SHC( 0x1ec1 ), SHC( 0x1f10 ), SHC( 0x1f5f ), SHC( 0x1faf ), + SHC( 0x1ffe ), SHC( 0x204d ), SHC( 0x209d ), SHC( 0x20ed ), SHC( 0x213c ), SHC( 0x218c ), SHC( 0x21dc ), SHC( 0x222c ), + SHC( 0x227c ), SHC( 0x22cc ), SHC( 0x231c ), SHC( 0x236d ), SHC( 0x23bd ), SHC( 0x240e ), SHC( 0x245e ), SHC( 0x24af ), + SHC( 0x24ff ), SHC( 0x2550 ), SHC( 0x25a1 ), SHC( 0x25f2 ), SHC( 0x2643 ), SHC( 0x2694 ), SHC( 0x26e5 ), SHC( 0x2736 ), + SHC( 0x2787 ), SHC( 0x27d9 ), SHC( 0x282a ), SHC( 0x287b ), SHC( 0x28cd ), SHC( 0x291e ), SHC( 0x2970 ), SHC( 0x29c2 ), + SHC( 0x2a13 ), SHC( 0x2a65 ), SHC( 0x2ab7 ), SHC( 0x2b09 ), SHC( 0x2b5b ), SHC( 0x2bad ), SHC( 0x2bff ), SHC( 0x2c51 ), + SHC( 0x2ca3 ), SHC( 0x2cf5 ), SHC( 0x2d47 ), SHC( 0x2d99 ), SHC( 0x2dec ), SHC( 0x2e3e ), SHC( 0x2e90 ), SHC( 0x2ee3 ), + SHC( 0x2f35 ), SHC( 0x2f87 ), SHC( 0x2fda ), SHC( 0x302c ), SHC( 0x307f ), SHC( 0x30d2 ), SHC( 0x3124 ), SHC( 0x3177 ), + SHC( 0x31c9 ), SHC( 0x321c ), SHC( 0x326f ), SHC( 0x32c1 ), SHC( 0x3314 ), SHC( 0x3367 ), SHC( 0x33ba ), SHC( 0x340c ), + SHC( 0x345f ), SHC( 0x34b2 ), SHC( 0x3505 ), SHC( 0x3557 ), SHC( 0x35aa ), SHC( 0x35fd ), SHC( 0x3650 ), SHC( 0x36a2 ), + SHC( 0x36f5 ), SHC( 0x3748 ), SHC( 0x379b ), SHC( 0x37ed ), SHC( 0x3840 ), SHC( 0x3893 ), SHC( 0x38e6 ), SHC( 0x3938 ), + SHC( 0x398b ), SHC( 0x39de ), SHC( 0x3a30 ), SHC( 0x3a83 ), SHC( 0x3ad6 ), SHC( 0x3b28 ), SHC( 0x3b7b ), SHC( 0x3bcd ), + SHC( 0x3c20 ), SHC( 0x3c72 ), SHC( 0x3cc5 ), SHC( 0x3d17 ), SHC( 0x3d69 ), SHC( 0x3dbc ), SHC( 0x3e0e ), SHC( 0x3e60 ), + SHC( 0x3eb2 ), SHC( 0x3f04 ), SHC( 0x3f57 ), SHC( 0x3fa9 ), SHC( 0x3ffb ), SHC( 0x404c ), SHC( 0x409e ), SHC( 0x40f0 ), + SHC( 0x4142 ), SHC( 0x4194 ), SHC( 0x41e5 ), SHC( 0x4237 ), SHC( 0x4288 ), SHC( 0x42da ), SHC( 0x432b ), SHC( 0x437c ), + SHC( 0x43ce ), SHC( 0x441f ), SHC( 0x4470 ), SHC( 0x44c1 ), SHC( 0x4512 ), SHC( 0x4563 ), SHC( 0x45b3 ), SHC( 0x4604 ), + SHC( 0x4654 ), SHC( 0x46a5 ), SHC( 0x46f5 ), SHC( 0x4746 ), SHC( 0x4796 ), SHC( 0x47e6 ), SHC( 0x4836 ), SHC( 0x4886 ), + SHC( 0x48d5 ), SHC( 0x4925 ), SHC( 0x4975 ), SHC( 0x49c4 ), SHC( 0x4a13 ), SHC( 0x4a63 ), SHC( 0x4ab2 ), SHC( 0x4b01 ), + SHC( 0x4b50 ), SHC( 0x4b9e ), SHC( 0x4bed ), SHC( 0x4c3b ), SHC( 0x4c8a ), SHC( 0x4cd8 ), SHC( 0x4d26 ), SHC( 0x4d74 ), + SHC( 0x4dc2 ), SHC( 0x4e10 ), SHC( 0x4e5d ), SHC( 0x4eab ), SHC( 0x4ef8 ), SHC( 0x4f45 ), SHC( 0x4f92 ), SHC( 0x4fdf ), + SHC( 0x502c ), SHC( 0x5078 ), SHC( 0x50c4 ), SHC( 0x5111 ), SHC( 0x515d ), SHC( 0x51a9 ), SHC( 0x51f4 ), SHC( 0x5240 ), + SHC( 0x528b ), SHC( 0x52d7 ), SHC( 0x5322 ), SHC( 0x536d ), SHC( 0x53b8 ), SHC( 0x5402 ), SHC( 0x544d ), SHC( 0x5497 ), + SHC( 0x54e1 ), SHC( 0x552b ), SHC( 0x5574 ), SHC( 0x55be ), SHC( 0x5607 ), SHC( 0x5650 ), SHC( 0x5699 ), SHC( 0x56e2 ), + SHC( 0x572b ), SHC( 0x5773 ), SHC( 0x57bb ), SHC( 0x5803 ), SHC( 0x584b ), SHC( 0x5893 ), SHC( 0x58da ), SHC( 0x5921 ), + SHC( 0x5968 ), SHC( 0x59af ), SHC( 0x59f5 ), SHC( 0x5a3c ), SHC( 0x5a82 ), SHC( 0x5ac8 ), SHC( 0x5b0e ), SHC( 0x5b53 ), + SHC( 0x5b98 ), SHC( 0x5bde ), SHC( 0x5c22 ), SHC( 0x5c67 ), SHC( 0x5cab ), SHC( 0x5cf0 ), SHC( 0x5d34 ), SHC( 0x5d77 ), + SHC( 0x5dbb ), SHC( 0x5dfe ), SHC( 0x5e41 ), SHC( 0x5e84 ), SHC( 0x5ec7 ), SHC( 0x5f09 ), SHC( 0x5f4b ), SHC( 0x5f8d ), + SHC( 0x5fcf ), SHC( 0x6010 ), SHC( 0x6051 ), SHC( 0x6092 ), SHC( 0x60d3 ), SHC( 0x6113 ), SHC( 0x6153 ), SHC( 0x6193 ), + SHC( 0x61d3 ), SHC( 0x6213 ), SHC( 0x6252 ), SHC( 0x6291 ), SHC( 0x62cf ), SHC( 0x630e ), SHC( 0x634c ), SHC( 0x638a ), + SHC( 0x63c8 ), SHC( 0x6405 ), SHC( 0x6442 ), SHC( 0x647f ), SHC( 0x64bc ), SHC( 0x64f8 ), SHC( 0x6534 ), SHC( 0x6570 ), + SHC( 0x65ac ), SHC( 0x65e7 ), SHC( 0x6622 ), SHC( 0x665d ), SHC( 0x6698 ), SHC( 0x66d2 ), SHC( 0x670c ), SHC( 0x6746 ), + SHC( 0x677f ), SHC( 0x67b8 ), SHC( 0x67f1 ), SHC( 0x682a ), SHC( 0x6862 ), SHC( 0x689a ), SHC( 0x68d2 ), SHC( 0x690a ), + SHC( 0x6941 ), SHC( 0x6978 ), SHC( 0x69af ), SHC( 0x69e5 ), SHC( 0x6a1c ), SHC( 0x6a52 ), SHC( 0x6a87 ), SHC( 0x6abd ), + SHC( 0x6af2 ), SHC( 0x6b26 ), SHC( 0x6b5b ), SHC( 0x6b8f ), SHC( 0x6bc3 ), SHC( 0x6bf7 ), SHC( 0x6c2a ), SHC( 0x6c5d ), + SHC( 0x6c90 ), SHC( 0x6cc3 ), SHC( 0x6cf5 ), SHC( 0x6d27 ), SHC( 0x6d59 ), SHC( 0x6d8a ), SHC( 0x6dbb ), SHC( 0x6dec ), + SHC( 0x6e1d ), SHC( 0x6e4d ), SHC( 0x6e7d ), SHC( 0x6ead ), SHC( 0x6edc ), SHC( 0x6f0b ), SHC( 0x6f3a ), SHC( 0x6f69 ), + SHC( 0x6f97 ), SHC( 0x6fc5 ), SHC( 0x6ff3 ), SHC( 0x7020 ), SHC( 0x704e ), SHC( 0x707a ), SHC( 0x70a7 ), SHC( 0x70d3 ), + SHC( 0x70ff ), SHC( 0x712b ), SHC( 0x7157 ), SHC( 0x7182 ), SHC( 0x71ad ), SHC( 0x71d7 ), SHC( 0x7202 ), SHC( 0x722c ), + SHC( 0x7255 ), SHC( 0x727f ), SHC( 0x72a8 ), SHC( 0x72d1 ), SHC( 0x72fa ), SHC( 0x7322 ), SHC( 0x734a ), SHC( 0x7372 ), + SHC( 0x7399 ), SHC( 0x73c0 ), SHC( 0x73e7 ), SHC( 0x740e ), SHC( 0x7434 ), SHC( 0x745a ), SHC( 0x7480 ), SHC( 0x74a6 ), + SHC( 0x74cb ), SHC( 0x74f0 ), SHC( 0x7515 ), SHC( 0x7539 ), SHC( 0x755d ), SHC( 0x7581 ), SHC( 0x75a5 ), SHC( 0x75c8 ), + SHC( 0x75eb ), SHC( 0x760e ), SHC( 0x7630 ), SHC( 0x7652 ), SHC( 0x7674 ), SHC( 0x7696 ), SHC( 0x76b7 ), SHC( 0x76d9 ), + SHC( 0x76f9 ), SHC( 0x771a ), SHC( 0x773a ), SHC( 0x775a ), SHC( 0x777a ), SHC( 0x779a ), SHC( 0x77b9 ), SHC( 0x77d8 ), + SHC( 0x77f6 ), SHC( 0x7815 ), SHC( 0x7833 ), SHC( 0x7851 ), SHC( 0x786e ), SHC( 0x788c ), SHC( 0x78a9 ), SHC( 0x78c6 ), + SHC( 0x78e2 ), SHC( 0x78ff ), SHC( 0x791b ), SHC( 0x7937 ), SHC( 0x7952 ), SHC( 0x796d ), SHC( 0x7988 ), SHC( 0x79a3 ), + SHC( 0x79be ), SHC( 0x79d8 ), SHC( 0x79f2 ), SHC( 0x7a0c ), SHC( 0x7a25 ), SHC( 0x7a3e ), SHC( 0x7a57 ), SHC( 0x7a70 ), + SHC( 0x7a89 ), SHC( 0x7aa1 ), SHC( 0x7ab9 ), SHC( 0x7ad1 ), SHC( 0x7ae8 ), SHC( 0x7aff ), SHC( 0x7b16 ), SHC( 0x7b2d ), + SHC( 0x7b44 ), SHC( 0x7b5a ), SHC( 0x7b70 ), SHC( 0x7b86 ), SHC( 0x7b9b ), SHC( 0x7bb1 ), SHC( 0x7bc6 ), SHC( 0x7bdb ), + SHC( 0x7bef ), SHC( 0x7c04 ), SHC( 0x7c18 ), SHC( 0x7c2c ), SHC( 0x7c40 ), SHC( 0x7c53 ), SHC( 0x7c66 ), SHC( 0x7c79 ), + SHC( 0x7c8c ), SHC( 0x7c9e ), SHC( 0x7cb1 ), SHC( 0x7cc3 ), SHC( 0x7cd5 ), SHC( 0x7ce6 ), SHC( 0x7cf8 ), SHC( 0x7d09 ), + SHC( 0x7d1a ), SHC( 0x7d2b ), SHC( 0x7d3b ), SHC( 0x7d4c ), SHC( 0x7d5c ), SHC( 0x7d6b ), SHC( 0x7d7b ), SHC( 0x7d8b ), + SHC( 0x7d9a ), SHC( 0x7da9 ), SHC( 0x7db8 ), SHC( 0x7dc6 ), SHC( 0x7dd5 ), SHC( 0x7de3 ), SHC( 0x7df1 ), SHC( 0x7dff ), + SHC( 0x7e0c ), SHC( 0x7e19 ), SHC( 0x7e27 ), SHC( 0x7e34 ), SHC( 0x7e40 ), SHC( 0x7e4d ), SHC( 0x7e59 ), SHC( 0x7e65 ), + SHC( 0x7e71 ), SHC( 0x7e7d ), SHC( 0x7e89 ), SHC( 0x7e94 ), SHC( 0x7e9f ), SHC( 0x7eaa ), SHC( 0x7eb5 ), SHC( 0x7ebf ), + SHC( 0x7eca ), SHC( 0x7ed4 ), SHC( 0x7ede ), SHC( 0x7ee8 ), SHC( 0x7ef1 ), SHC( 0x7efb ), SHC( 0x7f04 ), SHC( 0x7f0d ), + SHC( 0x7f16 ), SHC( 0x7f1f ), SHC( 0x7f27 ), SHC( 0x7f30 ), SHC( 0x7f38 ), SHC( 0x7f40 ), SHC( 0x7f48 ), SHC( 0x7f4f ), + SHC( 0x7f57 ), SHC( 0x7f5e ), SHC( 0x7f65 ), SHC( 0x7f6c ), SHC( 0x7f73 ), SHC( 0x7f79 ), SHC( 0x7f80 ), SHC( 0x7f86 ), + SHC( 0x7f8c ), SHC( 0x7f92 ), SHC( 0x7f98 ), SHC( 0x7f9d ), SHC( 0x7fa3 ), SHC( 0x7fa8 ), SHC( 0x7fad ), SHC( 0x7fb2 ), + SHC( 0x7fb7 ), SHC( 0x7fbb ), SHC( 0x7fc0 ), SHC( 0x7fc4 ), SHC( 0x7fc8 ), SHC( 0x7fcc ), SHC( 0x7fd0 ), SHC( 0x7fd4 ), + SHC( 0x7fd7 ), SHC( 0x7fdb ), SHC( 0x7fde ), SHC( 0x7fe1 ), SHC( 0x7fe4 ), SHC( 0x7fe7 ), SHC( 0x7fe9 ), SHC( 0x7fec ), + SHC( 0x7fee ), SHC( 0x7ff0 ), SHC( 0x7ff2 ), SHC( 0x7ff4 ), SHC( 0x7ff6 ), SHC( 0x7ff7 ), SHC( 0x7ff9 ), SHC( 0x7ffa ), + SHC( 0x7ffb ), SHC( 0x7ffc ), SHC( 0x7ffd ), SHC( 0x7ffe ), SHC( 0x7ffe ), SHC( 0x7fff ), SHC( 0x7fff ), SHC( 0x7fff ), + SHC( 0x7fff ) +}; + +const Word16 ivas_sine_panning_tbl_fx[601] = { + SHC( 0xc001 ), SHC( 0xc032 ), SHC( 0xc064 ), SHC( 0xc095 ), SHC( 0xc0c7 ), SHC( 0xc0f9 ), SHC( 0xc12b ), SHC( 0xc15c ), + SHC( 0xc18e ), SHC( 0xc1c0 ), SHC( 0xc1f2 ), SHC( 0xc224 ), SHC( 0xc256 ), SHC( 0xc289 ), SHC( 0xc2bb ), SHC( 0xc2ed ), + SHC( 0xc31f ), SHC( 0xc352 ), SHC( 0xc384 ), SHC( 0xc3b6 ), SHC( 0xc3e9 ), SHC( 0xc41b ), SHC( 0xc44e ), SHC( 0xc481 ), + SHC( 0xc4b3 ), SHC( 0xc4e6 ), SHC( 0xc519 ), SHC( 0xc54b ), SHC( 0xc57e ), SHC( 0xc5b1 ), SHC( 0xc5e4 ), SHC( 0xc617 ), + SHC( 0xc64a ), SHC( 0xc67d ), SHC( 0xc6b0 ), SHC( 0xc6e3 ), SHC( 0xc717 ), SHC( 0xc74a ), SHC( 0xc77d ), SHC( 0xc7b1 ), + SHC( 0xc7e4 ), SHC( 0xc817 ), SHC( 0xc84b ), SHC( 0xc87e ), SHC( 0xc8b2 ), SHC( 0xc8e6 ), SHC( 0xc919 ), SHC( 0xc94d ), + SHC( 0xc981 ), SHC( 0xc9b4 ), SHC( 0xc9e8 ), SHC( 0xca1c ), SHC( 0xca50 ), SHC( 0xca84 ), SHC( 0xcab8 ), SHC( 0xcaec ), + SHC( 0xcb20 ), SHC( 0xcb54 ), SHC( 0xcb88 ), SHC( 0xcbbc ), SHC( 0xcbf1 ), SHC( 0xcc25 ), SHC( 0xcc59 ), SHC( 0xcc8d ), + SHC( 0xccc2 ), SHC( 0xccf6 ), SHC( 0xcd2b ), SHC( 0xcd5f ), SHC( 0xcd94 ), SHC( 0xcdc8 ), SHC( 0xcdfd ), SHC( 0xce32 ), + SHC( 0xce66 ), SHC( 0xce9b ), SHC( 0xced0 ), SHC( 0xcf05 ), SHC( 0xcf3a ), SHC( 0xcf6e ), SHC( 0xcfa3 ), SHC( 0xcfd8 ), + SHC( 0xd00d ), SHC( 0xd042 ), SHC( 0xd078 ), SHC( 0xd0ad ), SHC( 0xd0e2 ), SHC( 0xd117 ), SHC( 0xd14c ), SHC( 0xd181 ), + SHC( 0xd1b7 ), SHC( 0xd1ec ), SHC( 0xd221 ), SHC( 0xd257 ), SHC( 0xd28c ), SHC( 0xd2c2 ), SHC( 0xd2f7 ), SHC( 0xd32d ), + SHC( 0xd362 ), SHC( 0xd398 ), SHC( 0xd3ce ), SHC( 0xd403 ), SHC( 0xd439 ), SHC( 0xd46f ), SHC( 0xd4a5 ), SHC( 0xd4db ), + SHC( 0xd510 ), SHC( 0xd546 ), SHC( 0xd57c ), SHC( 0xd5b2 ), SHC( 0xd5e8 ), SHC( 0xd61e ), SHC( 0xd654 ), SHC( 0xd68a ), + SHC( 0xd6c0 ), SHC( 0xd6f7 ), SHC( 0xd72d ), SHC( 0xd763 ), SHC( 0xd799 ), SHC( 0xd7d0 ), SHC( 0xd806 ), SHC( 0xd83c ), + SHC( 0xd873 ), SHC( 0xd8a9 ), SHC( 0xd8df ), SHC( 0xd916 ), SHC( 0xd94c ), SHC( 0xd983 ), SHC( 0xd9ba ), SHC( 0xd9f0 ), + SHC( 0xda27 ), SHC( 0xda5d ), SHC( 0xda94 ), SHC( 0xdacb ), SHC( 0xdb02 ), SHC( 0xdb38 ), SHC( 0xdb6f ), SHC( 0xdba6 ), + SHC( 0xdbdd ), SHC( 0xdc14 ), SHC( 0xdc4b ), SHC( 0xdc81 ), SHC( 0xdcb8 ), SHC( 0xdcef ), SHC( 0xdd26 ), SHC( 0xdd5d ), + SHC( 0xdd95 ), SHC( 0xddcc ), SHC( 0xde03 ), SHC( 0xde3a ), SHC( 0xde71 ), SHC( 0xdea8 ), SHC( 0xdee0 ), SHC( 0xdf17 ), + SHC( 0xdf4e ), SHC( 0xdf85 ), SHC( 0xdfbd ), SHC( 0xdff4 ), SHC( 0xe02b ), SHC( 0xe063 ), SHC( 0xe09a ), SHC( 0xe0d2 ), + SHC( 0xe109 ), SHC( 0xe141 ), SHC( 0xe178 ), SHC( 0xe1b0 ), SHC( 0xe1e7 ), SHC( 0xe21f ), SHC( 0xe257 ), SHC( 0xe28e ), + SHC( 0xe2c6 ), SHC( 0xe2fe ), SHC( 0xe335 ), SHC( 0xe36d ), SHC( 0xe3a5 ), SHC( 0xe3dd ), SHC( 0xe414 ), SHC( 0xe44c ), + SHC( 0xe484 ), SHC( 0xe4bc ), SHC( 0xe4f4 ), SHC( 0xe52c ), SHC( 0xe564 ), SHC( 0xe59c ), SHC( 0xe5d4 ), SHC( 0xe60c ), + SHC( 0xe644 ), SHC( 0xe67c ), SHC( 0xe6b4 ), SHC( 0xe6ec ), SHC( 0xe724 ), SHC( 0xe75c ), SHC( 0xe794 ), SHC( 0xe7cc ), + SHC( 0xe804 ), SHC( 0xe83d ), SHC( 0xe875 ), SHC( 0xe8ad ), SHC( 0xe8e5 ), SHC( 0xe91e ), SHC( 0xe956 ), SHC( 0xe98e ), + SHC( 0xe9c6 ), SHC( 0xe9ff ), SHC( 0xea37 ), SHC( 0xea6f ), SHC( 0xeaa8 ), SHC( 0xeae0 ), SHC( 0xeb19 ), SHC( 0xeb51 ), + SHC( 0xeb8a ), SHC( 0xebc2 ), SHC( 0xebfa ), SHC( 0xec33 ), SHC( 0xec6b ), SHC( 0xeca4 ), SHC( 0xecdd ), SHC( 0xed15 ), + SHC( 0xed4e ), SHC( 0xed86 ), SHC( 0xedbf ), SHC( 0xedf7 ), SHC( 0xee30 ), SHC( 0xee69 ), SHC( 0xeea1 ), SHC( 0xeeda ), + SHC( 0xef13 ), SHC( 0xef4b ), SHC( 0xef84 ), SHC( 0xefbd ), SHC( 0xeff6 ), SHC( 0xf02e ), SHC( 0xf067 ), SHC( 0xf0a0 ), + SHC( 0xf0d9 ), SHC( 0xf111 ), SHC( 0xf14a ), SHC( 0xf183 ), SHC( 0xf1bc ), SHC( 0xf1f5 ), SHC( 0xf22e ), SHC( 0xf266 ), + SHC( 0xf29f ), SHC( 0xf2d8 ), SHC( 0xf311 ), SHC( 0xf34a ), SHC( 0xf383 ), SHC( 0xf3bc ), SHC( 0xf3f5 ), SHC( 0xf42e ), + SHC( 0xf467 ), SHC( 0xf4a0 ), SHC( 0xf4d9 ), SHC( 0xf512 ), SHC( 0xf54b ), SHC( 0xf584 ), SHC( 0xf5bd ), SHC( 0xf5f6 ), + SHC( 0xf62f ), SHC( 0xf668 ), SHC( 0xf6a1 ), SHC( 0xf6da ), SHC( 0xf713 ), SHC( 0xf74c ), SHC( 0xf785 ), SHC( 0xf7be ), + SHC( 0xf7f7 ), SHC( 0xf830 ), SHC( 0xf869 ), SHC( 0xf8a2 ), SHC( 0xf8db ), SHC( 0xf914 ), SHC( 0xf94e ), SHC( 0xf987 ), + SHC( 0xf9c0 ), SHC( 0xf9f9 ), SHC( 0xfa32 ), SHC( 0xfa6b ), SHC( 0xfaa4 ), SHC( 0xfadd ), SHC( 0xfb17 ), SHC( 0xfb50 ), + SHC( 0xfb89 ), SHC( 0xfbc2 ), SHC( 0xfbfb ), SHC( 0xfc34 ), SHC( 0xfc6e ), SHC( 0xfca7 ), SHC( 0xfce0 ), SHC( 0xfd19 ), + SHC( 0xfd52 ), SHC( 0xfd8b ), SHC( 0xfdc5 ), SHC( 0xfdfe ), SHC( 0xfe37 ), SHC( 0xfe70 ), SHC( 0xfea9 ), SHC( 0xfee3 ), + SHC( 0xff1c ), SHC( 0xff55 ), SHC( 0xff8e ), SHC( 0xffc7 ), SHC( 0x0000 ), SHC( 0x0039 ), SHC( 0x0072 ), SHC( 0x00ab ), + SHC( 0x00e4 ), SHC( 0x011d ), SHC( 0x0157 ), SHC( 0x0190 ), SHC( 0x01c9 ), SHC( 0x0202 ), SHC( 0x023b ), SHC( 0x0275 ), + SHC( 0x02ae ), SHC( 0x02e7 ), SHC( 0x0320 ), SHC( 0x0359 ), SHC( 0x0392 ), SHC( 0x03cc ), SHC( 0x0405 ), SHC( 0x043e ), + SHC( 0x0477 ), SHC( 0x04b0 ), SHC( 0x04e9 ), SHC( 0x0523 ), SHC( 0x055c ), SHC( 0x0595 ), SHC( 0x05ce ), SHC( 0x0607 ), + SHC( 0x0640 ), SHC( 0x0679 ), SHC( 0x06b2 ), SHC( 0x06ec ), SHC( 0x0725 ), SHC( 0x075e ), SHC( 0x0797 ), SHC( 0x07d0 ), + SHC( 0x0809 ), SHC( 0x0842 ), SHC( 0x087b ), SHC( 0x08b4 ), SHC( 0x08ed ), SHC( 0x0926 ), SHC( 0x095f ), SHC( 0x0998 ), + SHC( 0x09d1 ), SHC( 0x0a0a ), SHC( 0x0a43 ), SHC( 0x0a7c ), SHC( 0x0ab5 ), SHC( 0x0aee ), SHC( 0x0b27 ), SHC( 0x0b60 ), + SHC( 0x0b99 ), SHC( 0x0bd2 ), SHC( 0x0c0b ), SHC( 0x0c44 ), SHC( 0x0c7d ), SHC( 0x0cb6 ), SHC( 0x0cef ), SHC( 0x0d28 ), + SHC( 0x0d61 ), SHC( 0x0d9a ), SHC( 0x0dd2 ), SHC( 0x0e0b ), SHC( 0x0e44 ), SHC( 0x0e7d ), SHC( 0x0eb6 ), SHC( 0x0eef ), + SHC( 0x0f27 ), SHC( 0x0f60 ), SHC( 0x0f99 ), SHC( 0x0fd2 ), SHC( 0x100a ), SHC( 0x1043 ), SHC( 0x107c ), SHC( 0x10b5 ), + SHC( 0x10ed ), SHC( 0x1126 ), SHC( 0x115f ), SHC( 0x1197 ), SHC( 0x11d0 ), SHC( 0x1209 ), SHC( 0x1241 ), SHC( 0x127a ), + SHC( 0x12b2 ), SHC( 0x12eb ), SHC( 0x1323 ), SHC( 0x135c ), SHC( 0x1395 ), SHC( 0x13cd ), SHC( 0x1406 ), SHC( 0x143e ), + SHC( 0x1476 ), SHC( 0x14af ), SHC( 0x14e7 ), SHC( 0x1520 ), SHC( 0x1558 ), SHC( 0x1591 ), SHC( 0x15c9 ), SHC( 0x1601 ), + SHC( 0x163a ), SHC( 0x1672 ), SHC( 0x16aa ), SHC( 0x16e2 ), SHC( 0x171b ), SHC( 0x1753 ), SHC( 0x178b ), SHC( 0x17c3 ), + SHC( 0x17fc ), SHC( 0x1834 ), SHC( 0x186c ), SHC( 0x18a4 ), SHC( 0x18dc ), SHC( 0x1914 ), SHC( 0x194c ), SHC( 0x1984 ), + SHC( 0x19bc ), SHC( 0x19f4 ), SHC( 0x1a2c ), SHC( 0x1a64 ), SHC( 0x1a9c ), SHC( 0x1ad4 ), SHC( 0x1b0c ), SHC( 0x1b44 ), + SHC( 0x1b7c ), SHC( 0x1bb4 ), SHC( 0x1bec ), SHC( 0x1c23 ), SHC( 0x1c5b ), SHC( 0x1c93 ), SHC( 0x1ccb ), SHC( 0x1d02 ), + SHC( 0x1d3a ), SHC( 0x1d72 ), SHC( 0x1da9 ), SHC( 0x1de1 ), SHC( 0x1e19 ), SHC( 0x1e50 ), SHC( 0x1e88 ), SHC( 0x1ebf ), + SHC( 0x1ef7 ), SHC( 0x1f2e ), SHC( 0x1f66 ), SHC( 0x1f9d ), SHC( 0x1fd5 ), SHC( 0x200c ), SHC( 0x2043 ), SHC( 0x207b ), + SHC( 0x20b2 ), SHC( 0x20e9 ), SHC( 0x2120 ), SHC( 0x2158 ), SHC( 0x218f ), SHC( 0x21c6 ), SHC( 0x21fd ), SHC( 0x2234 ), + SHC( 0x226b ), SHC( 0x22a3 ), SHC( 0x22da ), SHC( 0x2311 ), SHC( 0x2348 ), SHC( 0x237f ), SHC( 0x23b5 ), SHC( 0x23ec ), + SHC( 0x2423 ), SHC( 0x245a ), SHC( 0x2491 ), SHC( 0x24c8 ), SHC( 0x24fe ), SHC( 0x2535 ), SHC( 0x256c ), SHC( 0x25a3 ), + SHC( 0x25d9 ), SHC( 0x2610 ), SHC( 0x2646 ), SHC( 0x267d ), SHC( 0x26b4 ), SHC( 0x26ea ), SHC( 0x2721 ), SHC( 0x2757 ), + SHC( 0x278d ), SHC( 0x27c4 ), SHC( 0x27fa ), SHC( 0x2830 ), SHC( 0x2867 ), SHC( 0x289d ), SHC( 0x28d3 ), SHC( 0x2909 ), + SHC( 0x2940 ), SHC( 0x2976 ), SHC( 0x29ac ), SHC( 0x29e2 ), SHC( 0x2a18 ), SHC( 0x2a4e ), SHC( 0x2a84 ), SHC( 0x2aba ), + SHC( 0x2af0 ), SHC( 0x2b25 ), SHC( 0x2b5b ), SHC( 0x2b91 ), SHC( 0x2bc7 ), SHC( 0x2bfd ), SHC( 0x2c32 ), SHC( 0x2c68 ), + SHC( 0x2c9e ), SHC( 0x2cd3 ), SHC( 0x2d09 ), SHC( 0x2d3e ), SHC( 0x2d74 ), SHC( 0x2da9 ), SHC( 0x2ddf ), SHC( 0x2e14 ), + SHC( 0x2e49 ), SHC( 0x2e7f ), SHC( 0x2eb4 ), SHC( 0x2ee9 ), SHC( 0x2f1e ), SHC( 0x2f53 ), SHC( 0x2f88 ), SHC( 0x2fbe ), + SHC( 0x2ff3 ), SHC( 0x3028 ), SHC( 0x305d ), SHC( 0x3092 ), SHC( 0x30c6 ), SHC( 0x30fb ), SHC( 0x3130 ), SHC( 0x3165 ), + SHC( 0x319a ), SHC( 0x31ce ), SHC( 0x3203 ), SHC( 0x3238 ), SHC( 0x326c ), SHC( 0x32a1 ), SHC( 0x32d5 ), SHC( 0x330a ), + SHC( 0x333e ), SHC( 0x3373 ), SHC( 0x33a7 ), SHC( 0x33db ), SHC( 0x340f ), SHC( 0x3444 ), SHC( 0x3478 ), SHC( 0x34ac ), + SHC( 0x34e0 ), SHC( 0x3514 ), SHC( 0x3548 ), SHC( 0x357c ), SHC( 0x35b0 ), SHC( 0x35e4 ), SHC( 0x3618 ), SHC( 0x364c ), + SHC( 0x367f ), SHC( 0x36b3 ), SHC( 0x36e7 ), SHC( 0x371a ), SHC( 0x374e ), SHC( 0x3782 ), SHC( 0x37b5 ), SHC( 0x37e9 ), + SHC( 0x381c ), SHC( 0x384f ), SHC( 0x3883 ), SHC( 0x38b6 ), SHC( 0x38e9 ), SHC( 0x391d ), SHC( 0x3950 ), SHC( 0x3983 ), + SHC( 0x39b6 ), SHC( 0x39e9 ), SHC( 0x3a1c ), SHC( 0x3a4f ), SHC( 0x3a82 ), SHC( 0x3ab5 ), SHC( 0x3ae7 ), SHC( 0x3b1a ), + SHC( 0x3b4d ), SHC( 0x3b7f ), SHC( 0x3bb2 ), SHC( 0x3be5 ), SHC( 0x3c17 ), SHC( 0x3c4a ), SHC( 0x3c7c ), SHC( 0x3cae ), + SHC( 0x3ce1 ), SHC( 0x3d13 ), SHC( 0x3d45 ), SHC( 0x3d77 ), SHC( 0x3daa ), SHC( 0x3ddc ), SHC( 0x3e0e ), SHC( 0x3e40 ), + SHC( 0x3e72 ), SHC( 0x3ea4 ), SHC( 0x3ed5 ), SHC( 0x3f07 ), SHC( 0x3f39 ), SHC( 0x3f6b ), SHC( 0x3f9c ), SHC( 0x3fce ), + SHC( 0x3fff ) +}; + +const Word16 ivas_sin_az_fx[361] = { + SHC( 0x0000 ), SHC( 0xfdc5 ), SHC( 0xfb89 ), SHC( 0xf94e ), SHC( 0xf713 ), SHC( 0xf4d9 ), SHC( 0xf29f ), SHC( 0xf067 ), + SHC( 0xee30 ), SHC( 0xebfa ), SHC( 0xe9c6 ), SHC( 0xe794 ), SHC( 0xe564 ), SHC( 0xe335 ), SHC( 0xe109 ), SHC( 0xdee0 ), + SHC( 0xdcb8 ), SHC( 0xda94 ), SHC( 0xd873 ), SHC( 0xd654 ), SHC( 0xd439 ), SHC( 0xd221 ), SHC( 0xd00d ), SHC( 0xcdfd ), + SHC( 0xcbf1 ), SHC( 0xc9e8 ), SHC( 0xc7e4 ), SHC( 0xc5e4 ), SHC( 0xc3e9 ), SHC( 0xc1f2 ), SHC( 0xc001 ), SHC( 0xbe14 ), + SHC( 0xbc2c ), SHC( 0xba4a ), SHC( 0xb86d ), SHC( 0xb696 ), SHC( 0xb4c4 ), SHC( 0xb2f8 ), SHC( 0xb133 ), SHC( 0xaf73 ), + SHC( 0xadba ), SHC( 0xac07 ), SHC( 0xaa5a ), SHC( 0xa8b5 ), SHC( 0xa716 ), SHC( 0xa57e ), SHC( 0xa3ed ), SHC( 0xa264 ), + SHC( 0xa0e1 ), SHC( 0x9f66 ), SHC( 0x9df3 ), SHC( 0x9c87 ), SHC( 0x9b23 ), SHC( 0x99c7 ), SHC( 0x9873 ), SHC( 0x9727 ), + SHC( 0x95e3 ), SHC( 0x94a7 ), SHC( 0x9374 ), SHC( 0x9249 ), SHC( 0x9127 ), SHC( 0x900d ), SHC( 0x8efc ), SHC( 0x8df4 ), + SHC( 0x8cf5 ), SHC( 0x8bff ), SHC( 0x8b11 ), SHC( 0x8a2d ), SHC( 0x8953 ), SHC( 0x8881 ), SHC( 0x87b9 ), SHC( 0x86fa ), + SHC( 0x8644 ), SHC( 0x8598 ), SHC( 0x84f6 ), SHC( 0x845d ), SHC( 0x83ce ), SHC( 0x8348 ), SHC( 0x82cd ), SHC( 0x825b ), + SHC( 0x81f2 ), SHC( 0x8194 ), SHC( 0x813f ), SHC( 0x80f5 ), SHC( 0x80b4 ), SHC( 0x807d ), SHC( 0x8050 ), SHC( 0x802d ), + SHC( 0x8014 ), SHC( 0x8005 ), SHC( 0x8000 ), SHC( 0x8005 ), SHC( 0x8014 ), SHC( 0x802d ), SHC( 0x8050 ), SHC( 0x807d ), + SHC( 0x80b4 ), SHC( 0x80f5 ), SHC( 0x813f ), SHC( 0x8194 ), SHC( 0x81f2 ), SHC( 0x825b ), SHC( 0x82cd ), SHC( 0x8348 ), + SHC( 0x83ce ), SHC( 0x845d ), SHC( 0x84f6 ), SHC( 0x8598 ), SHC( 0x8644 ), SHC( 0x86fa ), SHC( 0x87b9 ), SHC( 0x8881 ), + SHC( 0x8953 ), SHC( 0x8a2d ), SHC( 0x8b11 ), SHC( 0x8bff ), SHC( 0x8cf5 ), SHC( 0x8df4 ), SHC( 0x8efc ), SHC( 0x900d ), + SHC( 0x9127 ), SHC( 0x9249 ), SHC( 0x9374 ), SHC( 0x94a7 ), SHC( 0x95e3 ), SHC( 0x9727 ), SHC( 0x9873 ), SHC( 0x99c7 ), + SHC( 0x9b23 ), SHC( 0x9c87 ), SHC( 0x9df3 ), SHC( 0x9f66 ), SHC( 0xa0e1 ), SHC( 0xa264 ), SHC( 0xa3ed ), SHC( 0xa57e ), + SHC( 0xa716 ), SHC( 0xa8b5 ), SHC( 0xaa5a ), SHC( 0xac07 ), SHC( 0xadba ), SHC( 0xaf73 ), SHC( 0xb133 ), SHC( 0xb2f8 ), + SHC( 0xb4c4 ), SHC( 0xb696 ), SHC( 0xb86d ), SHC( 0xba4a ), SHC( 0xbc2c ), SHC( 0xbe14 ), SHC( 0xc001 ), SHC( 0xc1f2 ), + SHC( 0xc3e9 ), SHC( 0xc5e4 ), SHC( 0xc7e4 ), SHC( 0xc9e8 ), SHC( 0xcbf1 ), SHC( 0xcdfd ), SHC( 0xd00d ), SHC( 0xd221 ), + SHC( 0xd439 ), SHC( 0xd654 ), SHC( 0xd873 ), SHC( 0xda94 ), SHC( 0xdcb8 ), SHC( 0xdee0 ), SHC( 0xe109 ), SHC( 0xe335 ), + SHC( 0xe564 ), SHC( 0xe794 ), SHC( 0xe9c6 ), SHC( 0xebfa ), SHC( 0xee30 ), SHC( 0xf067 ), SHC( 0xf29f ), SHC( 0xf4d9 ), + SHC( 0xf713 ), SHC( 0xf94e ), SHC( 0xfb89 ), SHC( 0xfdc5 ), SHC( 0x0000 ), SHC( 0x023b ), SHC( 0x0477 ), SHC( 0x06b2 ), + SHC( 0x08ed ), SHC( 0x0b27 ), SHC( 0x0d61 ), SHC( 0x0f99 ), SHC( 0x11d0 ), SHC( 0x1406 ), SHC( 0x163a ), SHC( 0x186c ), + SHC( 0x1a9c ), SHC( 0x1ccb ), SHC( 0x1ef7 ), SHC( 0x2120 ), SHC( 0x2348 ), SHC( 0x256c ), SHC( 0x278d ), SHC( 0x29ac ), + SHC( 0x2bc7 ), SHC( 0x2ddf ), SHC( 0x2ff3 ), SHC( 0x3203 ), SHC( 0x340f ), SHC( 0x3618 ), SHC( 0x381c ), SHC( 0x3a1c ), + SHC( 0x3c17 ), SHC( 0x3e0e ), SHC( 0x3fff ), SHC( 0x41ec ), SHC( 0x43d4 ), SHC( 0x45b6 ), SHC( 0x4793 ), SHC( 0x496a ), + SHC( 0x4b3c ), SHC( 0x4d08 ), SHC( 0x4ecd ), SHC( 0x508d ), SHC( 0x5246 ), SHC( 0x53f9 ), SHC( 0x55a6 ), SHC( 0x574b ), + SHC( 0x58ea ), SHC( 0x5a82 ), SHC( 0x5c13 ), SHC( 0x5d9c ), SHC( 0x5f1f ), SHC( 0x609a ), SHC( 0x620d ), SHC( 0x6379 ), + SHC( 0x64dd ), SHC( 0x6639 ), SHC( 0x678d ), SHC( 0x68d9 ), SHC( 0x6a1d ), SHC( 0x6b59 ), SHC( 0x6c8c ), SHC( 0x6db7 ), + SHC( 0x6ed9 ), SHC( 0x6ff3 ), SHC( 0x7104 ), SHC( 0x720c ), SHC( 0x730b ), SHC( 0x7401 ), SHC( 0x74ef ), SHC( 0x75d3 ), + SHC( 0x76ad ), SHC( 0x777f ), SHC( 0x7847 ), SHC( 0x7906 ), SHC( 0x79bc ), SHC( 0x7a68 ), SHC( 0x7b0a ), SHC( 0x7ba3 ), + SHC( 0x7c32 ), SHC( 0x7cb8 ), SHC( 0x7d33 ), SHC( 0x7da5 ), SHC( 0x7e0e ), SHC( 0x7e6c ), SHC( 0x7ec1 ), SHC( 0x7f0b ), + SHC( 0x7f4c ), SHC( 0x7f83 ), SHC( 0x7fb0 ), SHC( 0x7fd3 ), SHC( 0x7fec ), SHC( 0x7ffb ), SHC( 0x7fff ), SHC( 0x7ffb ), + SHC( 0x7fec ), SHC( 0x7fd3 ), SHC( 0x7fb0 ), SHC( 0x7f83 ), SHC( 0x7f4c ), SHC( 0x7f0b ), SHC( 0x7ec1 ), SHC( 0x7e6c ), + SHC( 0x7e0e ), SHC( 0x7da5 ), SHC( 0x7d33 ), SHC( 0x7cb8 ), SHC( 0x7c32 ), SHC( 0x7ba3 ), SHC( 0x7b0a ), SHC( 0x7a68 ), + SHC( 0x79bc ), SHC( 0x7906 ), SHC( 0x7847 ), SHC( 0x777f ), SHC( 0x76ad ), SHC( 0x75d3 ), SHC( 0x74ef ), SHC( 0x7401 ), + SHC( 0x730b ), SHC( 0x720c ), SHC( 0x7104 ), SHC( 0x6ff3 ), SHC( 0x6ed9 ), SHC( 0x6db7 ), SHC( 0x6c8c ), SHC( 0x6b59 ), + SHC( 0x6a1d ), SHC( 0x68d9 ), SHC( 0x678d ), SHC( 0x6639 ), SHC( 0x64dd ), SHC( 0x6379 ), SHC( 0x620d ), SHC( 0x609a ), + SHC( 0x5f1f ), SHC( 0x5d9c ), SHC( 0x5c13 ), SHC( 0x5a82 ), SHC( 0x58ea ), SHC( 0x574b ), SHC( 0x55a6 ), SHC( 0x53f9 ), + SHC( 0x5246 ), SHC( 0x508d ), SHC( 0x4ecd ), SHC( 0x4d08 ), SHC( 0x4b3c ), SHC( 0x496a ), SHC( 0x4793 ), SHC( 0x45b6 ), + SHC( 0x43d4 ), SHC( 0x41ec ), SHC( 0x3fff ), SHC( 0x3e0e ), SHC( 0x3c17 ), SHC( 0x3a1c ), SHC( 0x381c ), SHC( 0x3618 ), + SHC( 0x340f ), SHC( 0x3203 ), SHC( 0x2ff3 ), SHC( 0x2ddf ), SHC( 0x2bc7 ), SHC( 0x29ac ), SHC( 0x278d ), SHC( 0x256c ), + SHC( 0x2348 ), SHC( 0x2120 ), SHC( 0x1ef7 ), SHC( 0x1ccb ), SHC( 0x1a9c ), SHC( 0x186c ), SHC( 0x163a ), SHC( 0x1406 ), + SHC( 0x11d0 ), SHC( 0x0f99 ), SHC( 0x0d61 ), SHC( 0x0b27 ), SHC( 0x08ed ), SHC( 0x06b2 ), SHC( 0x0477 ), SHC( 0x023b ), + SHC( 0x0000 ) + +}; \ No newline at end of file diff --git a/lib_com/rom_com.h b/lib_com/rom_com.h index db63ef4f94417aad98f77c8799cfa2241abb02c8..37765eb5bd90913a338c71248b0b1ed1f4380593 100644 --- a/lib_com/rom_com.h +++ b/lib_com/rom_com.h @@ -2053,4 +2053,8 @@ extern const Word16 pow_tilt_32k[64]; /* Q7 */ //ivas_lfe_dec_fx.c extern const Word32 tbl_two_pow_shift_by_4[35]; /* Q30 */ + +extern const Word16 ivas_tan_panning_gain_tbl_fx[601]; +extern const Word16 ivas_sine_panning_tbl_fx[601]; +extern const Word16 ivas_sin_az_fx[361]; #endif diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index f37963740260f0239286610e968fb66f889cc0a7..0fdf8ee20ad3e0db7c5a5d4496974e8882993aa7 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -3169,6 +3169,9 @@ static int16_t ivas_decode_masaism_metadata( { int16_t sf, band, dir, nbands, nblocks, obj, i; float energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; +#ifdef IVAS_FLOAT_FIXED + Word32 energy_ratio_ism_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; +#endif int16_t *band_mapping; int16_t b; int16_t bits_ism[MAX_NUM_OBJECTS], index; @@ -3195,7 +3198,6 @@ static int16_t ivas_decode_masaism_metadata( hMasaIsmData->masa_to_total_energy_ratio[k][j] = (float) hMasaIsmData->masa_to_total_energy_ratio_fx[k][j] / (float) ( 1 << q ); } } - #else ivas_omasa_decode_masa_to_total( bit_stream, next_bit_pos, hMasaIsmData->masa_to_total_energy_ratio, nbands, nblocks ); #endif @@ -3221,8 +3223,22 @@ static int16_t ivas_decode_masaism_metadata( } /* read ISM metadata */ +#ifdef IVAS_FLOAT_FIXED + for ( int lp = 0; lp < MAX_PARAM_SPATIAL_SUBFRAMES; lp++ ) + { + for ( int lp2 = 0; lp2 < MASA_FREQUENCY_BANDS; lp2++ ) + { + hMasaIsmData->masa_to_total_energy_ratio_fx[lp][lp2] = (Word32) ( hMasaIsmData->masa_to_total_energy_ratio[lp][lp2] * ( 1u << 30 ) ); + for ( int lp3 = 0; lp3 < MAX_NUM_OBJECTS; lp3++ ) + { + energy_ratio_ism_fx[lp][lp2][lp3] = (Word32) ( energy_ratio_ism[lp][lp2][lp3] * ( 1u << 30 ) ); + } + } + } + calculate_nbits_meta_fx( nchan_ism, energy_ratio_ism_fx, hMasaIsmData->masa_to_total_energy_ratio_fx, nblocks, nbands, bits_ism, idx_separated_object, ism_imp ); +#else calculate_nbits_meta( nchan_ism, energy_ratio_ism, hMasaIsmData->masa_to_total_energy_ratio, nblocks, nbands, bits_ism, idx_separated_object, ism_imp ); - +#endif for ( obj = 0; obj < nchan_ism; obj++ ) { index = 0; diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 9897756c965e869067fd78ee31d24f1110e2b936..5a183dc2b4c35ed48c8a8d2408f225d874f5e896 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -35,6 +35,7 @@ #include #include #include "prot.h" +#include "prot_fx2.h" #include "ivas_prot.h" #include "ivas_prot_rend.h" #include "ivas_cnst.h" @@ -2457,6 +2458,10 @@ void ivas_omasa_preProcessStereoTransportsForMovedObjects( { float panGainsOut[2]; float panGainsIn[2]; +#ifdef IVAS_FLOAT_FIXED + Word16 panGainsOut_fx[2]; + Word16 panGainsIn_fx[2]; +#endif float ratio_float; float panEnesOut[2]; float panEnesIn[2]; @@ -2467,15 +2472,31 @@ void ivas_omasa_preProcessStereoTransportsForMovedObjects( ismRatioAcc += ratio_float; /* Get input and output panning gains */ +#ifdef IVAS_FLOAT_FIXED + ivas_get_stereo_panning_gains_fx( hMasaIsmData->azimuth_ism[ismDirIndex][dirac_read_idx], + hMasaIsmData->elevation_ism[ismDirIndex][dirac_read_idx], + panGainsIn_fx ); + panGainsIn[0] = (float) panGainsIn_fx[0] / 32767; + panGainsIn[1] = (float) panGainsIn_fx[1] / 32767; +#else ivas_get_stereo_panning_gains( hMasaIsmData->azimuth_ism[ismDirIndex][dirac_read_idx], hMasaIsmData->elevation_ism[ismDirIndex][dirac_read_idx], panGainsIn ); +#endif if ( hMasaIsmData->ism_is_edited[ismDirIndex] ) { +#ifdef IVAS_FLOAT_FIXED + ivas_get_stereo_panning_gains_fx( hMasaIsmData->azimuth_ism_edited[ismDirIndex], + hMasaIsmData->elevation_ism_edited[ismDirIndex], + panGainsOut_fx ); + panGainsOut[0] = (float) panGainsOut_fx[0] / 32767; + panGainsOut[1] = (float) panGainsOut_fx[1] / 32767; +#else ivas_get_stereo_panning_gains( hMasaIsmData->azimuth_ism_edited[ismDirIndex], hMasaIsmData->elevation_ism_edited[ismDirIndex], panGainsOut ); +#endif } else {