Loading lib_dec/ivas_svd_dec_fx.c +151 −1 Original line number Diff line number Diff line Loading @@ -66,6 +66,25 @@ static void HouseholderReduction_fx( Word32 *eps_x_fx, /* exp(eps_x_fx_e) */ Word16 *eps_x_fx_e ); static void biDiagonalReductionLeft_64_fx( Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ Word16 singularVectors2_e[][MAX_OUTPUT_CHANNELS], Word32 singularValues[MAX_OUTPUT_CHANNELS], /* exp(singularValues_e) */ Word16 singularValues_e[MAX_OUTPUT_CHANNELS], Word32 secDiag[MAX_OUTPUT_CHANNELS], /* exp(secDiag_e) */ Word16 secDiag_e[MAX_OUTPUT_CHANNELS], const Word16 nChannelsL, /* Q0 */ const Word16 nChannelsC, /* Q0 */ const Word16 currChannel, /* Q0 */ Word64 g ); static void biDiagonalReductionLeft_fx( Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ Word32 singularValues[MAX_OUTPUT_CHANNELS], /* exp(singularValues_e) */ Loading Loading @@ -842,6 +861,9 @@ static void HouseholderReduction_fx( /* Bidiagonal Reduction for every channel */ FOR( nCh = 0; nCh < nChannelsC; nCh++ ) /* nChannelsC */ { biDiagonalReductionLeft_64_fx(singularVectors_Left_fx, singularVectors_Left_fx_e, singularValues_fx, singularValues_fx_e, secDiag_fx, secDiag_fx_e, nChannelsL, nChannelsC, nCh, W_deposit32_l(g_fx) ); biDiagonalReductionLeft_fx( singularVectors_Left_fx, singularValues_fx, secDiag_fx, singularVectors_Left_fx_e, singularValues_fx_e, secDiag_fx_e, nChannelsL, nChannelsC, nCh, &sig_x_fx, &sig_x_fx_e, &g_fx ); biDiagonalReductionRight_fx( singularVectors_Left_fx, secDiag_fx, singularVectors_Left_fx_e, secDiag_fx_e, nChannelsL, nChannelsC, nCh, &sig_x_fx, &sig_x_fx_e, &g_fx ); Loading Loading @@ -871,6 +893,120 @@ static void HouseholderReduction_fx( * *-------------------------------------------------------------------------*/ static void biDiagonalReductionLeft_64_fx( Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ Word16 singularVectors2_e[][MAX_OUTPUT_CHANNELS], Word32 singularValues[MAX_OUTPUT_CHANNELS], /* exp(singularValues_e) */ Word16 singularValues_e[MAX_OUTPUT_CHANNELS], Word32 secDiag[MAX_OUTPUT_CHANNELS], /* exp(secDiag_e) */ Word16 secDiag_e[MAX_OUTPUT_CHANNELS], const Word16 nChannelsL, /* Q0 */ const Word16 nChannelsC, /* Q0 */ const Word16 currChannel, /* Q0 */ Word64 g ) #define CONVERT_64( x_64, y_fx, y_e ) \ { \ Word16 norm; \ norm = W_norm( x_64 ); \ y_fx = W_extract_h( W_shl( x_64, norm ) ); \ y_e = sub( 63, norm ); \ } { Word64 norm_64; Word16 norm_64_e; Word16 iCh, jCh; CONVERT_64(g, secDiag[currChannel], secDiag_e[currChannel] ); // TODO: can be moved one function up g=0; move64(); norm_64=0; move64(); norm_64_e=0; move16(); for (jCh = currChannel; jCh<nChannelsL; jCh++) { norm_64=W_add(norm_64, W_mult0_32_32(singularVectors[jCh][currChannel], singularVectors[jCh][currChannel] ) ); norm_64_e=add(norm_e, singularVectors2_e[jCh][currChannel]); } IF (norm_64) { Word32 tmp; Word16 tmp_e; Word64 r; Word32 r_x; Word16 r_e; CONVERT_64( norm_64, tmp, tmp_e); tmp_e+=8; tmp=Sqrt32(tmp,&tmp_e); g=W_shl(W_deposit32_l(tmp),tmp_e); printf("tmp:%08X<%2x\n",tmp,tmp_e); IF (singularVectors[currChannel][currChannel]>=0) { g = W_neg(g); tmp = L_negate(tmp); } // r=W_sub( W_mult0_32_32( tmp,singularVectors[currChannel][currChannel]) , norm_64); r=W_sub( norm_64, W_mult0_32_32( tmp,singularVectors[currChannel][currChannel]) ); printf("r=%016llX\n",r); printf("sing:%08X<%2x +%08X<%2x --> ",singularVectors[currChannel][currChannel],singularVectors2_e[currChannel][currChannel],tmp,tmp_e); singularVectors[currChannel][currChannel]=BASOP_Util_Add_Mant32Exp(singularVectors[currChannel][currChannel],singularVectors2_e[currChannel][currChannel], L_negate(tmp), tmp_e, &singularVectors2_e[currChannel][currChannel]); printf("sing:%08X<%2x\n",singularVectors[currChannel][currChannel],singularVectors2_e[currChannel][currChannel]); CONVERT_64(r, r_x, r_e); //// SAME AS FLOATING POINT UNTIL HERE for (iCh=currChannel+1; iCh<nChannelsC; iCh++) { Word32 f; Word16 f_e; Word32 n; Word16 n_e; norm_64=0; move64(); for (jCh=currChannel;jCh<nChannelsL;jCh++) { norm_64=W_add(norm_64, W_mult0_32_32(singularVectors[jCh][currChannel], singularVectors[jCh][iCh] ) ); } CONVERT_64(norm_64,n,n_e); f=BASOP_Util_Divide3232_Scale_newton(n,r_x, &f_e); for (jCh=currChannel;jCh<nChannelsL;jCh++) { Word64 tmp64; tmp64=W_mult0_32_32( f,singularVectors[jCh][currChannel]); CONVERT_64(tmp64, tmp, tmp_e); singularVectors[jCh][iCh]=BASOP_Util_Add_Mant32Exp(singularVectors[jCh][iCh],singularVectors2_e[jCh][iCh], tmp, tmp_e, &singularVectors2_e[jCh][iCh]); } } } CONVERT_64(g,singularValues[currChannel],singularValues_e[currChannel]); { int i; int j; for (i=0;i<MAX_OUTPUT_CHANNELS;i++) { for (j=0;j<MAX_OUTPUT_CHANNELS;j++) { printf("%08X<%2x ",singularVectors[i][j], singularVectors2_e[i][j]); } printf("\n"); } exit(0); } return; } static void biDiagonalReductionLeft_fx( Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ Word32 singularValues[MAX_OUTPUT_CHANNELS], /* exp(singularValues_e) */ Loading Loading @@ -931,6 +1067,7 @@ static void biDiagonalReductionLeft_fx( move16(); norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][currChannel] ), shl( singularVectors2_e[jCh][currChannel], 1 ), &norm_x_e ); /* exp(norm_x_e) */ } printf("NORM: %08X %016llX\n",norm_x,(signed long long)norm_x*(signed long long)*sig_x*(signed long long)*sig_x); IF( GT_16( norm_x_e, 0 ) ) { norm_x = MAX_32; Loading @@ -941,6 +1078,7 @@ static void biDiagonalReductionLeft_fx( L_temp_e = norm_x_e; move16(); L_temp = Sqrt32( norm_x, &L_temp_e ); printf("\nSQRT: %08X<%2x %016llX\n",norm_x,L_temp_e,(signed long long)norm_x*(signed long long)(*sig_x)); L_temp = L_shl_r( L_temp, L_temp_e ); // Q31 //( *g ) = L_negate( GE_32( singularVectors[currChannel][idx], 0 ) ? L_temp : L_negate( L_temp ) ); if ( singularVectors[currChannel][idx] >= 0 ) Loading Loading @@ -993,6 +1131,19 @@ static void biDiagonalReductionLeft_fx( singularValues_e[currChannel] = *sig_x_e; move16(); } { int i; int j; for (i=0;i<MAX_OUTPUT_CHANNELS;i++) { for (j=0;j<MAX_OUTPUT_CHANNELS;j++) { printf("%08X<%2x ",singularVectors[i][j], singularVectors2_e[i][j]); } printf("\n"); } exit(0); } return; } Loading Loading @@ -1123,7 +1274,6 @@ static void biDiagonalReductionRight_fx( return; } /*------------------------------------------------------------------------- * singularVectorsAccumulationLeft() * Loading Loading
lib_dec/ivas_svd_dec_fx.c +151 −1 Original line number Diff line number Diff line Loading @@ -66,6 +66,25 @@ static void HouseholderReduction_fx( Word32 *eps_x_fx, /* exp(eps_x_fx_e) */ Word16 *eps_x_fx_e ); static void biDiagonalReductionLeft_64_fx( Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ Word16 singularVectors2_e[][MAX_OUTPUT_CHANNELS], Word32 singularValues[MAX_OUTPUT_CHANNELS], /* exp(singularValues_e) */ Word16 singularValues_e[MAX_OUTPUT_CHANNELS], Word32 secDiag[MAX_OUTPUT_CHANNELS], /* exp(secDiag_e) */ Word16 secDiag_e[MAX_OUTPUT_CHANNELS], const Word16 nChannelsL, /* Q0 */ const Word16 nChannelsC, /* Q0 */ const Word16 currChannel, /* Q0 */ Word64 g ); static void biDiagonalReductionLeft_fx( Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ Word32 singularValues[MAX_OUTPUT_CHANNELS], /* exp(singularValues_e) */ Loading Loading @@ -842,6 +861,9 @@ static void HouseholderReduction_fx( /* Bidiagonal Reduction for every channel */ FOR( nCh = 0; nCh < nChannelsC; nCh++ ) /* nChannelsC */ { biDiagonalReductionLeft_64_fx(singularVectors_Left_fx, singularVectors_Left_fx_e, singularValues_fx, singularValues_fx_e, secDiag_fx, secDiag_fx_e, nChannelsL, nChannelsC, nCh, W_deposit32_l(g_fx) ); biDiagonalReductionLeft_fx( singularVectors_Left_fx, singularValues_fx, secDiag_fx, singularVectors_Left_fx_e, singularValues_fx_e, secDiag_fx_e, nChannelsL, nChannelsC, nCh, &sig_x_fx, &sig_x_fx_e, &g_fx ); biDiagonalReductionRight_fx( singularVectors_Left_fx, secDiag_fx, singularVectors_Left_fx_e, secDiag_fx_e, nChannelsL, nChannelsC, nCh, &sig_x_fx, &sig_x_fx_e, &g_fx ); Loading Loading @@ -871,6 +893,120 @@ static void HouseholderReduction_fx( * *-------------------------------------------------------------------------*/ static void biDiagonalReductionLeft_64_fx( Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ Word16 singularVectors2_e[][MAX_OUTPUT_CHANNELS], Word32 singularValues[MAX_OUTPUT_CHANNELS], /* exp(singularValues_e) */ Word16 singularValues_e[MAX_OUTPUT_CHANNELS], Word32 secDiag[MAX_OUTPUT_CHANNELS], /* exp(secDiag_e) */ Word16 secDiag_e[MAX_OUTPUT_CHANNELS], const Word16 nChannelsL, /* Q0 */ const Word16 nChannelsC, /* Q0 */ const Word16 currChannel, /* Q0 */ Word64 g ) #define CONVERT_64( x_64, y_fx, y_e ) \ { \ Word16 norm; \ norm = W_norm( x_64 ); \ y_fx = W_extract_h( W_shl( x_64, norm ) ); \ y_e = sub( 63, norm ); \ } { Word64 norm_64; Word16 norm_64_e; Word16 iCh, jCh; CONVERT_64(g, secDiag[currChannel], secDiag_e[currChannel] ); // TODO: can be moved one function up g=0; move64(); norm_64=0; move64(); norm_64_e=0; move16(); for (jCh = currChannel; jCh<nChannelsL; jCh++) { norm_64=W_add(norm_64, W_mult0_32_32(singularVectors[jCh][currChannel], singularVectors[jCh][currChannel] ) ); norm_64_e=add(norm_e, singularVectors2_e[jCh][currChannel]); } IF (norm_64) { Word32 tmp; Word16 tmp_e; Word64 r; Word32 r_x; Word16 r_e; CONVERT_64( norm_64, tmp, tmp_e); tmp_e+=8; tmp=Sqrt32(tmp,&tmp_e); g=W_shl(W_deposit32_l(tmp),tmp_e); printf("tmp:%08X<%2x\n",tmp,tmp_e); IF (singularVectors[currChannel][currChannel]>=0) { g = W_neg(g); tmp = L_negate(tmp); } // r=W_sub( W_mult0_32_32( tmp,singularVectors[currChannel][currChannel]) , norm_64); r=W_sub( norm_64, W_mult0_32_32( tmp,singularVectors[currChannel][currChannel]) ); printf("r=%016llX\n",r); printf("sing:%08X<%2x +%08X<%2x --> ",singularVectors[currChannel][currChannel],singularVectors2_e[currChannel][currChannel],tmp,tmp_e); singularVectors[currChannel][currChannel]=BASOP_Util_Add_Mant32Exp(singularVectors[currChannel][currChannel],singularVectors2_e[currChannel][currChannel], L_negate(tmp), tmp_e, &singularVectors2_e[currChannel][currChannel]); printf("sing:%08X<%2x\n",singularVectors[currChannel][currChannel],singularVectors2_e[currChannel][currChannel]); CONVERT_64(r, r_x, r_e); //// SAME AS FLOATING POINT UNTIL HERE for (iCh=currChannel+1; iCh<nChannelsC; iCh++) { Word32 f; Word16 f_e; Word32 n; Word16 n_e; norm_64=0; move64(); for (jCh=currChannel;jCh<nChannelsL;jCh++) { norm_64=W_add(norm_64, W_mult0_32_32(singularVectors[jCh][currChannel], singularVectors[jCh][iCh] ) ); } CONVERT_64(norm_64,n,n_e); f=BASOP_Util_Divide3232_Scale_newton(n,r_x, &f_e); for (jCh=currChannel;jCh<nChannelsL;jCh++) { Word64 tmp64; tmp64=W_mult0_32_32( f,singularVectors[jCh][currChannel]); CONVERT_64(tmp64, tmp, tmp_e); singularVectors[jCh][iCh]=BASOP_Util_Add_Mant32Exp(singularVectors[jCh][iCh],singularVectors2_e[jCh][iCh], tmp, tmp_e, &singularVectors2_e[jCh][iCh]); } } } CONVERT_64(g,singularValues[currChannel],singularValues_e[currChannel]); { int i; int j; for (i=0;i<MAX_OUTPUT_CHANNELS;i++) { for (j=0;j<MAX_OUTPUT_CHANNELS;j++) { printf("%08X<%2x ",singularVectors[i][j], singularVectors2_e[i][j]); } printf("\n"); } exit(0); } return; } static void biDiagonalReductionLeft_fx( Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ Word32 singularValues[MAX_OUTPUT_CHANNELS], /* exp(singularValues_e) */ Loading Loading @@ -931,6 +1067,7 @@ static void biDiagonalReductionLeft_fx( move16(); norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][currChannel] ), shl( singularVectors2_e[jCh][currChannel], 1 ), &norm_x_e ); /* exp(norm_x_e) */ } printf("NORM: %08X %016llX\n",norm_x,(signed long long)norm_x*(signed long long)*sig_x*(signed long long)*sig_x); IF( GT_16( norm_x_e, 0 ) ) { norm_x = MAX_32; Loading @@ -941,6 +1078,7 @@ static void biDiagonalReductionLeft_fx( L_temp_e = norm_x_e; move16(); L_temp = Sqrt32( norm_x, &L_temp_e ); printf("\nSQRT: %08X<%2x %016llX\n",norm_x,L_temp_e,(signed long long)norm_x*(signed long long)(*sig_x)); L_temp = L_shl_r( L_temp, L_temp_e ); // Q31 //( *g ) = L_negate( GE_32( singularVectors[currChannel][idx], 0 ) ? L_temp : L_negate( L_temp ) ); if ( singularVectors[currChannel][idx] >= 0 ) Loading Loading @@ -993,6 +1131,19 @@ static void biDiagonalReductionLeft_fx( singularValues_e[currChannel] = *sig_x_e; move16(); } { int i; int j; for (i=0;i<MAX_OUTPUT_CHANNELS;i++) { for (j=0;j<MAX_OUTPUT_CHANNELS;j++) { printf("%08X<%2x ",singularVectors[i][j], singularVectors2_e[i][j]); } printf("\n"); } exit(0); } return; } Loading Loading @@ -1123,7 +1274,6 @@ static void biDiagonalReductionRight_fx( return; } /*------------------------------------------------------------------------- * singularVectorsAccumulationLeft() * Loading