Loading lib_dec/ivas_svd_dec.c +142 −116 Original line number Diff line number Diff line Loading @@ -56,7 +56,7 @@ #define FIX_1010_OPT_GIVENS #define FIX_1010_OPT_GIVENS_INV #define FIX_1010_OPT_GIVENS_AMAX_BMIN //#define FIX_1010_OPT_GIVENS_AMAX_BMIN #endif /*-----------------------------------------------------------------------* Loading Loading @@ -291,8 +291,10 @@ static void matrixFx2Fl( const int adim1, const int adim2 ) { for (int i1=0; i1<adim1; i1++) { for (int i2=0; i2<adim2; i2++) { for ( int i1 = 0; i1 < adim1; i1++ ) { for ( int i2 = 0; i2 < adim2; i2++ ) { r[i1][i2] = (float) a[i1][i2] * powf( 2.f, a_e[i2] - 31 ); } } Loading @@ -309,10 +311,13 @@ static void matrixProduct( { assert( adim2 == bdim1 ); for (int i1=0; i1<adim1; i1++) { for (int i2=0; i2<bdim2; i2++) { for ( int i1 = 0; i1 < adim1; i1++ ) { for ( int i2 = 0; i2 < bdim2; i2++ ) { r[i1][i2] = 0.f; for (int i3=0; i3<bdim1; i3++) { for ( int i3 = 0; i3 < bdim1; i3++ ) { r[i1][i2] += a[i1][i3] * b[i3][i2]; } } Loading @@ -325,8 +330,10 @@ static void matrixTranspose( const int adim1, const int adim2 ) { for (int i1=0; i1<adim1; i1++) { for (int i2=0; i2<adim2; i2++) { for ( int i1 = 0; i1 < adim1; i1++ ) { for ( int i2 = 0; i2 < adim2; i2++ ) { r[i2][i1] = a[i1][i2]; } } Loading @@ -337,8 +344,10 @@ static void matrixDiagonal( const float a[MAX_MATRIX], const int dim ) { for (int i1=0; i1<dim; i1++) { for (int i2=0; i2<dim; i2++) { for ( int i1 = 0; i1 < dim; i1++ ) { for ( int i2 = 0; i2 < dim; i2++ ) { r[i1][i2] = 0; } r[i1][i1] = a[i1]; Loading @@ -353,8 +362,10 @@ static float matrixDifference( { float r = 0.f; for (int i1=0; i1<dim1; i1++) { for (int i2=0; i2<dim2; i2++) { for ( int i1 = 0; i1 < dim1; i1++ ) { for ( int i2 = 0; i2 < dim2; i2++ ) { r += fabsf( ( b[i1][i2] - a[i1][i2] ) / a[i1][i2] ); } } Loading @@ -369,8 +380,10 @@ static void matrixPrint( const char *name ) { printf( "Matrix %s[%d][%d] = \n", name, dim1, dim2 ); for (int i1=0; i1<dim1; i1++) { for (int i2=0; i2<dim2; i2++) { for ( int i1 = 0; i1 < dim1; i1++ ) { for ( int i2 = 0; i2 < dim2; i2++ ) { printf( "%f, ", a[i1][i2] ); } printf( "\n" ); Loading @@ -383,11 +396,16 @@ static float matrixTestIdentity( { float r = 0.f; for (int i1=0; i1<dim; i1++) { for (int i2=0; i2<dim; i2++) { if (i1 == i2) { for ( int i1 = 0; i1 < dim; i1++ ) { for ( int i2 = 0; i2 < dim; i2++ ) { if ( i1 == i2 ) { r += fabsf( 1.f - a[i1][i2] ); } else { } else { r += fabsf( 0.f - a[i1][i2] ); } } Loading Loading @@ -422,11 +440,13 @@ static void svd_accuracy_test_fx( int dimSingular; /* Convert to float and Create singular values matrix from signular values vector */ for (int x=0; x<MAX_MATRIX; x++) singularValuesFx2_e[x] = InputMatrixFx_e; for ( int x = 0; x < MAX_MATRIX; x++ ) singularValuesFx2_e[x] = InputMatrixFx_e; matrixFx2Fl( InputMatrix, InputMatrixFx, singularValuesFx2_e, nChannelsL, nChannelsC ); dimSingular = min( nChannelsL, nChannelsC ); matrixFx2Fl( singularValues, singularValuesFx, singularValuesFx_e, 1, nChannelsC ); for (int x=0; x<MAX_MATRIX; x++) singularValuesFx2_e[x] = 0 ; for ( int x = 0; x < MAX_MATRIX; x++ ) singularValuesFx2_e[x] = 0; matrixFx2Fl( singularVectors_Left, singularVectors_LeftFx, singularValuesFx2_e, nChannelsL, nChannelsC ); matrixFx2Fl( singularVectors_Right, singularVectors_RightFx, singularValuesFx2_e, nChannelsC, nChannelsC ); matrixDiagonal( singularValuesMatrix, singularValues, dimSingular ); /* CxC */ Loading Loading @@ -468,7 +488,6 @@ static void svd_accuracy_test_fx( matrixPrint( tmp2, nChannelsL, nChannelsC, "U*S*V\'" ); #endif printf( "U * S * V' difference to M is %f\n", result ); } #endif Loading Loading @@ -589,8 +608,7 @@ Word16 svd_fx( singularVectors_Right_fx, singularValues_fx_e, nChannelsL, nChannelsC ); nChannelsC ); #endif return ( errorMessage ); } Loading Loading @@ -1779,8 +1797,10 @@ static void get_alpha_beta(Word32 p, Word16 p_e, Word32 q, Word16 q_e, Word32 *a { static int init = 0; if (init == 0) { for (int i=0; i<NUM_REGIONS; i++) { if ( init == 0 ) { for ( int i = 0; i < NUM_REGIONS; i++ ) { double thetaS, thetaE, thetaM; thetaS = M_PI / 4. * (double) i / (double) NUM_REGIONS; Loading Loading @@ -1838,10 +1858,13 @@ static void GivensRotation2_fx( ax = L_abs( x ); az = L_abs( z ); IF (BASOP_Util_Cmp_Mant32Exp(ax, x_e, az, z_e) > 0) { IF( BASOP_Util_Cmp_Mant32Exp( ax, x_e, az, z_e ) > 0 ) { get_alpha_beta( ax, x_e, az, z_e, &a, &b ); r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( ax, a ), x_e, Mpy_32_32( az, b ), z_e, out_e ); } ELSE { } ELSE { get_alpha_beta( az, z_e, ax, x_e, &a, &b ); r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( az, a ), z_e, Mpy_32_32( ax, b ), x_e, out_e ); } Loading Loading @@ -1894,10 +1917,13 @@ static Word32 GivensRotation_fx( ax = L_abs( x ); az = L_abs( z ); IF (BASOP_Util_Cmp_Mant32Exp(ax, x_e, az, z_e) > 0) { IF( BASOP_Util_Cmp_Mant32Exp( ax, x_e, az, z_e ) > 0 ) { get_alpha_beta( ax, x_e, az, z_e, &a, &b ); r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( ax, a ), x_e, Mpy_32_32( az, b ), z_e, out_e ); } ELSE { } ELSE { get_alpha_beta( az, z_e, ax, x_e, &a, &b ); r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( az, a ), z_e, Mpy_32_32( ax, b ), x_e, out_e ); } Loading Loading
lib_dec/ivas_svd_dec.c +142 −116 Original line number Diff line number Diff line Loading @@ -56,7 +56,7 @@ #define FIX_1010_OPT_GIVENS #define FIX_1010_OPT_GIVENS_INV #define FIX_1010_OPT_GIVENS_AMAX_BMIN //#define FIX_1010_OPT_GIVENS_AMAX_BMIN #endif /*-----------------------------------------------------------------------* Loading Loading @@ -291,8 +291,10 @@ static void matrixFx2Fl( const int adim1, const int adim2 ) { for (int i1=0; i1<adim1; i1++) { for (int i2=0; i2<adim2; i2++) { for ( int i1 = 0; i1 < adim1; i1++ ) { for ( int i2 = 0; i2 < adim2; i2++ ) { r[i1][i2] = (float) a[i1][i2] * powf( 2.f, a_e[i2] - 31 ); } } Loading @@ -309,10 +311,13 @@ static void matrixProduct( { assert( adim2 == bdim1 ); for (int i1=0; i1<adim1; i1++) { for (int i2=0; i2<bdim2; i2++) { for ( int i1 = 0; i1 < adim1; i1++ ) { for ( int i2 = 0; i2 < bdim2; i2++ ) { r[i1][i2] = 0.f; for (int i3=0; i3<bdim1; i3++) { for ( int i3 = 0; i3 < bdim1; i3++ ) { r[i1][i2] += a[i1][i3] * b[i3][i2]; } } Loading @@ -325,8 +330,10 @@ static void matrixTranspose( const int adim1, const int adim2 ) { for (int i1=0; i1<adim1; i1++) { for (int i2=0; i2<adim2; i2++) { for ( int i1 = 0; i1 < adim1; i1++ ) { for ( int i2 = 0; i2 < adim2; i2++ ) { r[i2][i1] = a[i1][i2]; } } Loading @@ -337,8 +344,10 @@ static void matrixDiagonal( const float a[MAX_MATRIX], const int dim ) { for (int i1=0; i1<dim; i1++) { for (int i2=0; i2<dim; i2++) { for ( int i1 = 0; i1 < dim; i1++ ) { for ( int i2 = 0; i2 < dim; i2++ ) { r[i1][i2] = 0; } r[i1][i1] = a[i1]; Loading @@ -353,8 +362,10 @@ static float matrixDifference( { float r = 0.f; for (int i1=0; i1<dim1; i1++) { for (int i2=0; i2<dim2; i2++) { for ( int i1 = 0; i1 < dim1; i1++ ) { for ( int i2 = 0; i2 < dim2; i2++ ) { r += fabsf( ( b[i1][i2] - a[i1][i2] ) / a[i1][i2] ); } } Loading @@ -369,8 +380,10 @@ static void matrixPrint( const char *name ) { printf( "Matrix %s[%d][%d] = \n", name, dim1, dim2 ); for (int i1=0; i1<dim1; i1++) { for (int i2=0; i2<dim2; i2++) { for ( int i1 = 0; i1 < dim1; i1++ ) { for ( int i2 = 0; i2 < dim2; i2++ ) { printf( "%f, ", a[i1][i2] ); } printf( "\n" ); Loading @@ -383,11 +396,16 @@ static float matrixTestIdentity( { float r = 0.f; for (int i1=0; i1<dim; i1++) { for (int i2=0; i2<dim; i2++) { if (i1 == i2) { for ( int i1 = 0; i1 < dim; i1++ ) { for ( int i2 = 0; i2 < dim; i2++ ) { if ( i1 == i2 ) { r += fabsf( 1.f - a[i1][i2] ); } else { } else { r += fabsf( 0.f - a[i1][i2] ); } } Loading Loading @@ -422,11 +440,13 @@ static void svd_accuracy_test_fx( int dimSingular; /* Convert to float and Create singular values matrix from signular values vector */ for (int x=0; x<MAX_MATRIX; x++) singularValuesFx2_e[x] = InputMatrixFx_e; for ( int x = 0; x < MAX_MATRIX; x++ ) singularValuesFx2_e[x] = InputMatrixFx_e; matrixFx2Fl( InputMatrix, InputMatrixFx, singularValuesFx2_e, nChannelsL, nChannelsC ); dimSingular = min( nChannelsL, nChannelsC ); matrixFx2Fl( singularValues, singularValuesFx, singularValuesFx_e, 1, nChannelsC ); for (int x=0; x<MAX_MATRIX; x++) singularValuesFx2_e[x] = 0 ; for ( int x = 0; x < MAX_MATRIX; x++ ) singularValuesFx2_e[x] = 0; matrixFx2Fl( singularVectors_Left, singularVectors_LeftFx, singularValuesFx2_e, nChannelsL, nChannelsC ); matrixFx2Fl( singularVectors_Right, singularVectors_RightFx, singularValuesFx2_e, nChannelsC, nChannelsC ); matrixDiagonal( singularValuesMatrix, singularValues, dimSingular ); /* CxC */ Loading Loading @@ -468,7 +488,6 @@ static void svd_accuracy_test_fx( matrixPrint( tmp2, nChannelsL, nChannelsC, "U*S*V\'" ); #endif printf( "U * S * V' difference to M is %f\n", result ); } #endif Loading Loading @@ -589,8 +608,7 @@ Word16 svd_fx( singularVectors_Right_fx, singularValues_fx_e, nChannelsL, nChannelsC ); nChannelsC ); #endif return ( errorMessage ); } Loading Loading @@ -1779,8 +1797,10 @@ static void get_alpha_beta(Word32 p, Word16 p_e, Word32 q, Word16 q_e, Word32 *a { static int init = 0; if (init == 0) { for (int i=0; i<NUM_REGIONS; i++) { if ( init == 0 ) { for ( int i = 0; i < NUM_REGIONS; i++ ) { double thetaS, thetaE, thetaM; thetaS = M_PI / 4. * (double) i / (double) NUM_REGIONS; Loading Loading @@ -1838,10 +1858,13 @@ static void GivensRotation2_fx( ax = L_abs( x ); az = L_abs( z ); IF (BASOP_Util_Cmp_Mant32Exp(ax, x_e, az, z_e) > 0) { IF( BASOP_Util_Cmp_Mant32Exp( ax, x_e, az, z_e ) > 0 ) { get_alpha_beta( ax, x_e, az, z_e, &a, &b ); r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( ax, a ), x_e, Mpy_32_32( az, b ), z_e, out_e ); } ELSE { } ELSE { get_alpha_beta( az, z_e, ax, x_e, &a, &b ); r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( az, a ), z_e, Mpy_32_32( ax, b ), x_e, out_e ); } Loading Loading @@ -1894,10 +1917,13 @@ static Word32 GivensRotation_fx( ax = L_abs( x ); az = L_abs( z ); IF (BASOP_Util_Cmp_Mant32Exp(ax, x_e, az, z_e) > 0) { IF( BASOP_Util_Cmp_Mant32Exp( ax, x_e, az, z_e ) > 0 ) { get_alpha_beta( ax, x_e, az, z_e, &a, &b ); r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( ax, a ), x_e, Mpy_32_32( az, b ), z_e, out_e ); } ELSE { } ELSE { get_alpha_beta( az, z_e, ax, x_e, &a, &b ); r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( az, a ), z_e, Mpy_32_32( ax, b ), x_e, out_e ); } Loading