Loading lib_dec/ivas_svd_dec_fx.c +15 −13 Original line number Diff line number Diff line Loading @@ -1003,9 +1003,10 @@ static void biDiagonalReductionLeft_64( Word16 *g_e ) { #define HEADROOM_LEFT_1 1 #define HEADROOM_LEFT_1 2 #define HEADROOM_LEFT_2 2 #define HEADROOM_LEFT_3 2 #define HEADROOM_LEFT_3 15 #define HEADROOM_LEFT_4 15 Word16 iCh, jCh; Word32 norm_x; Loading Loading @@ -1075,17 +1076,17 @@ static void biDiagonalReductionLeft_64( norm_64 = 0; for ( jCh = currChannel; jCh < nChannelsL; jCh++ ) { factor1 = W_extract_l( W_shr( singularVectors_Left_64[jCh][currChannel], HEADROOM_LEFT_2 ) ); factor2 = W_extract_l( W_shr( singularVectors_Left_64[jCh][iCh], HEADROOM_LEFT_2 ) ); factor1 = W_extract_l( W_shr( singularVectors_Left_64[jCh][currChannel], HEADROOM_LEFT_3 ) ); factor2 = W_extract_l( W_shr( singularVectors_Left_64[jCh][iCh], HEADROOM_LEFT_3 ) ); norm_64 = W_add( norm_64, W_mult0_32_32( factor1, factor2 ) ); } norm_x_e = W_norm( norm_64 ); norm_x = W_extract_h( W_shl( norm_64, norm_x_e ) ); f = Mpy_32_32( norm_x, invVal ); magic_shift = norm_x_e - r_e + ( 28 - HEADROOM_LEFT_3 ); // works with headroom_left: 1,2,2 magic_shift = norm_x_e - r_e + ( 32 + 2*HEADROOM_LEFT_1 - HEADROOM_LEFT_2 -2*HEADROOM_LEFT_3 - HEADROOM_LEFT_4 ); FOR( jCh = currChannel; jCh < nChannelsL; jCh++ ) { factor1 = W_extract_h( W_shl( singularVectors_Left_64[jCh][currChannel], 32 - HEADROOM_LEFT_3 ) ); factor1 = W_extract_h( W_shl( singularVectors_Left_64[jCh][currChannel], 32 - HEADROOM_LEFT_4 ) ); singularVectors_Left_64[jCh][iCh] = W_add( singularVectors_Left_64[jCh][iCh], W_shr( W_mult0_32_32( f, factor1 ), magic_shift ) ); } } Loading Loading @@ -1114,7 +1115,8 @@ static void biDiagonalReductionRight_64( #define HEADROOM_RIGHT_1 2 #define HEADROOM_RIGHT_2 2 #define HEADROOM_RIGHT_3 2 #define HEADROOM_RIGHT_3 15 #define HEADROOM_RIGHT_4 15 ( *g ) = 0; Loading Loading @@ -1159,8 +1161,8 @@ static void biDiagonalReductionRight_64( } move32(); move16(); factor2 = W_extract_l( W_shr( singularVectors_Left_64[currChannel][idx], HEADROOM_RIGHT_1 ) ); tmp_e = sub( HEADROOM_RIGHT_1, *g_e ); factor2 = W_extract_l( W_shr( singularVectors_Left_64[currChannel][idx], HEADROOM_RIGHT_2 ) ); tmp_e = sub( HEADROOM_RIGHT_2, *g_e ); tmpmul = W_mult0_32_32( *g, factor2 ); tmpmul = W_shr( tmpmul, tmp_e ); r_64 = W_sub( tmpmul, norm_64 ); Loading @@ -1181,19 +1183,19 @@ static void biDiagonalReductionRight_64( move64(); FOR( jCh = idx; jCh < nChannelsC; jCh++ ) { factor1 = W_extract_l( W_shr( singularVectors_Left_64[iCh][jCh], HEADROOM_RIGHT_2 ) ); factor2 = W_extract_l( W_shr( singularVectors_Left_64[currChannel][jCh], HEADROOM_RIGHT_2 ) ); factor1 = W_extract_l( W_shr( singularVectors_Left_64[iCh][jCh], HEADROOM_RIGHT_3 ) ); factor2 = W_extract_l( W_shr( singularVectors_Left_64[currChannel][jCh], HEADROOM_RIGHT_3 ) ); norm_64 = W_add( norm_64, W_mult0_32_32( factor1, factor2 ) ); } norm_x_e = W_norm( norm_64 ); norm_x = W_extract_h( W_shl( norm_64, norm_x_e ) ); f = Mpy_32_32( norm_x, invVal ); magic_shift = norm_x_e - r_e + 29 - ( HEADROOM_RIGHT_3 ); // works with headroom_right: 2,2,2 magic_shift = norm_x_e - r_e + ( 32 + 2*HEADROOM_RIGHT_1 - HEADROOM_RIGHT_2 -2*HEADROOM_RIGHT_3 - HEADROOM_RIGHT_4 ); FOR( jCh = idx; jCh < nChannelsC; jCh++ ) { factor2 = W_extract_h( W_shl( singularVectors_Left_64[currChannel][jCh], 32 - HEADROOM_RIGHT_3 ) ); factor2 = W_extract_h( W_shl( singularVectors_Left_64[currChannel][jCh], 32 - HEADROOM_RIGHT_4 ) ); singularVectors_Left_64[iCh][jCh] = W_add( singularVectors_Left_64[iCh][jCh], W_shr( W_mult0_32_32( f, factor2 ), magic_shift ) ); } } Loading Loading
lib_dec/ivas_svd_dec_fx.c +15 −13 Original line number Diff line number Diff line Loading @@ -1003,9 +1003,10 @@ static void biDiagonalReductionLeft_64( Word16 *g_e ) { #define HEADROOM_LEFT_1 1 #define HEADROOM_LEFT_1 2 #define HEADROOM_LEFT_2 2 #define HEADROOM_LEFT_3 2 #define HEADROOM_LEFT_3 15 #define HEADROOM_LEFT_4 15 Word16 iCh, jCh; Word32 norm_x; Loading Loading @@ -1075,17 +1076,17 @@ static void biDiagonalReductionLeft_64( norm_64 = 0; for ( jCh = currChannel; jCh < nChannelsL; jCh++ ) { factor1 = W_extract_l( W_shr( singularVectors_Left_64[jCh][currChannel], HEADROOM_LEFT_2 ) ); factor2 = W_extract_l( W_shr( singularVectors_Left_64[jCh][iCh], HEADROOM_LEFT_2 ) ); factor1 = W_extract_l( W_shr( singularVectors_Left_64[jCh][currChannel], HEADROOM_LEFT_3 ) ); factor2 = W_extract_l( W_shr( singularVectors_Left_64[jCh][iCh], HEADROOM_LEFT_3 ) ); norm_64 = W_add( norm_64, W_mult0_32_32( factor1, factor2 ) ); } norm_x_e = W_norm( norm_64 ); norm_x = W_extract_h( W_shl( norm_64, norm_x_e ) ); f = Mpy_32_32( norm_x, invVal ); magic_shift = norm_x_e - r_e + ( 28 - HEADROOM_LEFT_3 ); // works with headroom_left: 1,2,2 magic_shift = norm_x_e - r_e + ( 32 + 2*HEADROOM_LEFT_1 - HEADROOM_LEFT_2 -2*HEADROOM_LEFT_3 - HEADROOM_LEFT_4 ); FOR( jCh = currChannel; jCh < nChannelsL; jCh++ ) { factor1 = W_extract_h( W_shl( singularVectors_Left_64[jCh][currChannel], 32 - HEADROOM_LEFT_3 ) ); factor1 = W_extract_h( W_shl( singularVectors_Left_64[jCh][currChannel], 32 - HEADROOM_LEFT_4 ) ); singularVectors_Left_64[jCh][iCh] = W_add( singularVectors_Left_64[jCh][iCh], W_shr( W_mult0_32_32( f, factor1 ), magic_shift ) ); } } Loading Loading @@ -1114,7 +1115,8 @@ static void biDiagonalReductionRight_64( #define HEADROOM_RIGHT_1 2 #define HEADROOM_RIGHT_2 2 #define HEADROOM_RIGHT_3 2 #define HEADROOM_RIGHT_3 15 #define HEADROOM_RIGHT_4 15 ( *g ) = 0; Loading Loading @@ -1159,8 +1161,8 @@ static void biDiagonalReductionRight_64( } move32(); move16(); factor2 = W_extract_l( W_shr( singularVectors_Left_64[currChannel][idx], HEADROOM_RIGHT_1 ) ); tmp_e = sub( HEADROOM_RIGHT_1, *g_e ); factor2 = W_extract_l( W_shr( singularVectors_Left_64[currChannel][idx], HEADROOM_RIGHT_2 ) ); tmp_e = sub( HEADROOM_RIGHT_2, *g_e ); tmpmul = W_mult0_32_32( *g, factor2 ); tmpmul = W_shr( tmpmul, tmp_e ); r_64 = W_sub( tmpmul, norm_64 ); Loading @@ -1181,19 +1183,19 @@ static void biDiagonalReductionRight_64( move64(); FOR( jCh = idx; jCh < nChannelsC; jCh++ ) { factor1 = W_extract_l( W_shr( singularVectors_Left_64[iCh][jCh], HEADROOM_RIGHT_2 ) ); factor2 = W_extract_l( W_shr( singularVectors_Left_64[currChannel][jCh], HEADROOM_RIGHT_2 ) ); factor1 = W_extract_l( W_shr( singularVectors_Left_64[iCh][jCh], HEADROOM_RIGHT_3 ) ); factor2 = W_extract_l( W_shr( singularVectors_Left_64[currChannel][jCh], HEADROOM_RIGHT_3 ) ); norm_64 = W_add( norm_64, W_mult0_32_32( factor1, factor2 ) ); } norm_x_e = W_norm( norm_64 ); norm_x = W_extract_h( W_shl( norm_64, norm_x_e ) ); f = Mpy_32_32( norm_x, invVal ); magic_shift = norm_x_e - r_e + 29 - ( HEADROOM_RIGHT_3 ); // works with headroom_right: 2,2,2 magic_shift = norm_x_e - r_e + ( 32 + 2*HEADROOM_RIGHT_1 - HEADROOM_RIGHT_2 -2*HEADROOM_RIGHT_3 - HEADROOM_RIGHT_4 ); FOR( jCh = idx; jCh < nChannelsC; jCh++ ) { factor2 = W_extract_h( W_shl( singularVectors_Left_64[currChannel][jCh], 32 - HEADROOM_RIGHT_3 ) ); factor2 = W_extract_h( W_shl( singularVectors_Left_64[currChannel][jCh], 32 - HEADROOM_RIGHT_4 ) ); singularVectors_Left_64[iCh][jCh] = W_add( singularVectors_Left_64[iCh][jCh], W_shr( W_mult0_32_32( f, factor2 ), magic_shift ) ); } } Loading