Loading lib_com/ivas_prot.h +4 −3 Original line number Diff line number Diff line Loading @@ -4960,9 +4960,10 @@ Word16 computeMixingMatricesResidual_fx( Word16 svd_fx( Word32 InputMatrix[][MAX_OUTPUT_CHANNELS], /* i : matrix to be decomposed (M) */ Word16 InputMatrix_e, float singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) */ float singularValues[MAX_OUTPUT_CHANNELS], /* o : singular values vector (S) */ float singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) */ Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) */ Word32 singularValues[MAX_OUTPUT_CHANNELS], /* o : singular values vector (S) */ Word32 singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) */ Word16 *singularValues_fx_e, const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed */ const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed */ ); Loading lib_dec/ivas_dirac_output_synthesis_cov.c +61 −41 Original line number Diff line number Diff line Loading @@ -1516,22 +1516,22 @@ Word16 computeMixingMatrices_fx( int16_t lengthCx = num_inputs; int16_t lengthCy = num_outputs; //float svd_in_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; float svd_u_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; float svd_s_buffer[MAX_OUTPUT_CHANNELS]; float svd_v_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; //float svd_u_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; //float svd_s_buffer[MAX_OUTPUT_CHANNELS]; //float svd_v_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 svd_in_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 mat_mult_buffer1_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; Word32 mat_mult_buffer2_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; Word32 Cx_fx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; Word32 Cy_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; Word32 svd_u_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 svd_v_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 svd_u_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; //Q31 out Word32 svd_v_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; //Q31 out //Word16 mat_mult_buffer1_fx_e; Word16 Cx_fx_e; Word16 Cy_fx_e; Word16 svd_u_buffer_fx_e[MAX_OUTPUT_CHANNELS]; Word16 svd_v_buffer_fx_e[MAX_OUTPUT_CHANNELS]; //Word16 svd_u_buffer_fx_e[MAX_OUTPUT_CHANNELS]; //Word16 svd_v_buffer_fx_e[MAX_OUTPUT_CHANNELS]; Word32 svd_s_buffer_fx[MAX_OUTPUT_CHANNELS]; Word16 svd_s_buffer_e[MAX_OUTPUT_CHANNELS]; Loading Loading @@ -1619,14 +1619,14 @@ Word16 computeMixingMatrices_fx( me2f_buf( ( svd_in_buffer_fx[g] ), Cy_fx_e, ( svd_in_buffer[g] ), lengthCy ); }*/ svd_fx(svd_in_buffer_fx, Cy_fx_e, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCy, lengthCy ); svd_fx(svd_in_buffer_fx, Cy_fx_e, svd_u_buffer_fx, svd_s_buffer_fx, svd_v_buffer_fx, &svd_s_buffer_fx_e, lengthCy, lengthCy ); f2me_buf(svd_s_buffer, svd_s_buffer_fx, &svd_s_buffer_fx_e, lengthCy); /*f2me_buf(svd_s_buffer, svd_s_buffer_fx, &svd_s_buffer_fx_e, lengthCy); FOR(Word32 g = 0; g < lengthCy; g++) { f2me_buf((svd_u_buffer[g]), (svd_u_buffer_fx[g]), &svd_u_buffer_fx_e[g], lengthCy); f2me_buf((svd_v_buffer[g]), (svd_v_buffer_fx[g]), &svd_v_buffer_fx_e[g], lengthCy); } }*/ /* Computing Ky */ Loading @@ -1639,7 +1639,7 @@ Word16 computeMixingMatrices_fx( tmp_e = svd_s_buffer_fx_e; L_tmp = Sqrt32(svd_s_buffer_fx[j], &tmp_e); Ky_fx[i + j * lengthCy] = Mpy_32_32( svd_u_buffer_fx[i][j], L_tmp ); Ky_fx_e[i + j * lengthCy] = svd_u_buffer_fx_e[i] + tmp_e; Ky_fx_e[i + j * lengthCy] = + tmp_e; } } Loading Loading @@ -1670,13 +1670,13 @@ Word16 computeMixingMatrices_fx( }*/ svd_fx( svd_in_buffer_fx, Cx_fx_e, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCx, lengthCx ); f2me_buf(svd_s_buffer, svd_s_buffer_fx, &svd_s_buffer_fx_e, lengthCx); svd_fx( svd_in_buffer_fx, Cx_fx_e, svd_u_buffer_fx, svd_s_buffer_fx, svd_v_buffer_fx, &svd_s_buffer_fx_e, lengthCx, lengthCx ); /*f2me_buf(svd_s_buffer, svd_s_buffer_fx, &svd_s_buffer_fx_e, lengthCx); FOR(Word32 g = 0; g < lengthCy; g++) { f2me_buf((svd_u_buffer[g]), (svd_u_buffer_fx[g]), &svd_u_buffer_fx_e[g], lengthCx); f2me_buf((svd_v_buffer[g]), (svd_v_buffer_fx[g]), &svd_v_buffer_fx_e[g], lengthCx); } }*/ Loading @@ -1687,7 +1687,7 @@ Word16 computeMixingMatrices_fx( tmp_e = svd_s_buffer_fx_e; L_tmp = Sqrt32(svd_s_buffer_fx[j], &tmp_e); Kx_fx[i + j * lengthCx] = Mpy_32_32( svd_u_buffer_fx[i][j], L_tmp ); Kx_fx_e[i + j * lengthCx] = svd_u_buffer_fx_e[i] + tmp_e; Kx_fx_e[i + j * lengthCx] = tmp_e; } } Loading Loading @@ -1776,7 +1776,7 @@ Word16 computeMixingMatrices_fx( FOR ( j = 0; j < lengthCx; ++j ) { Kx_reg_inv_fx[i + j * lengthCx] = Mpy_32_16_1(svd_u_buffer_fx[j][i], reg_fac_fx ); Kx_reg_inv_e[i + j * lengthCx] = svd_u_buffer_fx_e[j] + scale; Kx_reg_inv_e[i + j * lengthCx] = scale; } } Loading Loading @@ -1916,7 +1916,7 @@ Word16 computeMixingMatrices_fx( nC = lengthCx; move16(); svd_fx(svd_in_buffer_fx, mat_mult_buffer1_e, svd_v_buffer, svd_s_buffer, svd_u_buffer, nL, nC ); svd_fx(svd_in_buffer_fx, mat_mult_buffer1_e, svd_v_buffer_fx, svd_s_buffer_fx, svd_u_buffer_fx, &svd_s_buffer_fx_e, nL, nC ); #endif } ELSE Loading @@ -1934,7 +1934,7 @@ Word16 computeMixingMatrices_fx( nC = lengthCy; move16(); svd_fx( svd_in_buffer_fx, mat_mult_buffer1_e, svd_u_buffer, svd_s_buffer, svd_v_buffer, nL, nC ); svd_fx( svd_in_buffer_fx, mat_mult_buffer1_e, svd_u_buffer_fx, svd_s_buffer_fx, svd_v_buffer_fx, &svd_s_buffer_fx_e, nL, nC ); #endif } Loading @@ -1943,7 +1943,7 @@ Word16 computeMixingMatrices_fx( /* can be skipped: lambda is always column-truncated identity matrix, so this operation just truncates V to num_input_channel columns */ Word16 min_q = -1; /*Word16 min_q = -1; move16(); FOR ( Word32 g = 0; g < lengthCy; g++ ) { Loading Loading @@ -1984,12 +1984,12 @@ Word16 computeMixingMatrices_fx( } } svd_u_buffer_fx_e[0] = min_q; move16(); move16();*/ svdMat2mat_fx( svd_v_buffer_fx, mat_mult_buffer1_fx, lengthCy, lengthCx ); svdMat2mat_fx( svd_u_buffer_fx, mat_mult_buffer2_fx, lengthCx, lengthCx ); mat_mult_buffer1_e = svd_v_buffer_fx_e[0]; mat_mult_buffer2_e = svd_u_buffer_fx_e[0]; mat_mult_buffer1_e = 0; mat_mult_buffer2_e = 0; guard_bits = find_guarded_bits_fx(lengthCx + 1); FOR(i = 0; i < lengthCx * lengthCy; ++i) Loading Loading @@ -2365,18 +2365,18 @@ Word16 computeMixingMatricesResidual_fx( #ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED //float svd_in_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; float svd_u_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; float svd_s_buffer[MAX_OUTPUT_CHANNELS]; float svd_v_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; //float svd_u_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; //float svd_s_buffer[MAX_OUTPUT_CHANNELS]; //float svd_v_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; #endif Word32 svd_in_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 mat_mult_buffer2_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; Word32 svd_u_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 svd_v_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 svd_u_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; //Q31 out Word32 svd_v_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; //Q31 out Word16 svd_u_buffer_fx_e[MAX_OUTPUT_CHANNELS]; Word16 svd_v_buffer_fx_e[MAX_OUTPUT_CHANNELS]; //Word16 svd_u_buffer_fx_e[MAX_OUTPUT_CHANNELS]; //Word16 svd_v_buffer_fx_e[MAX_OUTPUT_CHANNELS]; Word16 mat_mult_buffer1_buff_e[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; Loading Loading @@ -2434,13 +2434,13 @@ Word16 computeMixingMatricesResidual_fx( me2f_buf( ( svd_in_buffer_fx[g] ), Cy_fx_e, ( svd_in_buffer[g] ), lengthCy ); }*/ svd_fx( svd_in_buffer_fx, Cy_fx_e, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCy, lengthCy ); f2me_buf(svd_s_buffer, svd_s_buffer_fx, &svd_s_buffer_fx_e, lengthCy); svd_fx( svd_in_buffer_fx, Cy_fx_e, svd_u_buffer_fx, svd_s_buffer_fx, svd_v_buffer_fx, &svd_s_buffer_fx_e, lengthCy, lengthCy ); /*f2me_buf(svd_s_buffer, svd_s_buffer_fx, &svd_s_buffer_fx_e, lengthCy); FOR(Word32 g = 0; g < lengthCy; g++) { f2me_buf((svd_u_buffer[g]), (svd_u_buffer_fx[g]), &svd_u_buffer_fx_e[g], lengthCy); f2me_buf((svd_v_buffer[g]), (svd_v_buffer_fx[g]), &svd_v_buffer_fx_e[g], lengthCy); } }*/ #endif /* Computing Ky */ Loading @@ -2451,7 +2451,7 @@ Word16 computeMixingMatricesResidual_fx( tmp_e = svd_s_buffer_fx_e; L_tmp = Sqrt32(svd_s_buffer_fx[j], &tmp_e); Ky_fx[i + j * lengthCy] = Mpy_32_32( svd_u_buffer_fx[i][j], L_tmp ); Ky_fx_e[i + j * lengthCy] = svd_u_buffer_fx_e[i] + tmp_e; Ky_fx_e[i + j * lengthCy] = tmp_e; } } Loading Loading @@ -2652,10 +2652,10 @@ Word16 computeMixingMatricesResidual_fx( }*/ #ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED svd_fx( svd_in_buffer_fx, mat_mult_buffer1_e, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCx, lengthCy ); svd_fx( svd_in_buffer_fx, mat_mult_buffer1_e, svd_u_buffer_fx, svd_s_buffer_fx, svd_v_buffer_fx, &svd_s_buffer_fx_e, lengthCx, lengthCy ); /* Actually Processing P */ Word16 min_q = -1; /*Word16 min_q = -1; FOR ( Word32 g = 0; g < lengthCy; g++ ) { f2me_buf( svd_v_buffer[g], svd_v_buffer_fx[g], &svd_v_buffer_fx_e[g], lengthCx ); Loading Loading @@ -2694,13 +2694,13 @@ Word16 computeMixingMatricesResidual_fx( } } svd_u_buffer_fx_e[0] = min_q; move16(); move16();*/ #endif svdMat2mat_fx( svd_v_buffer_fx, mat_mult_buffer1_fx, lengthCy, lengthCx ); svdMat2mat_fx( svd_u_buffer_fx, mat_mult_buffer2_fx, lengthCx, lengthCx ); mat_mult_buffer2_e = svd_u_buffer_fx_e[0]; mat_mult_buffer2_e = 0; move16(); mat_mult_buffer1_e = svd_v_buffer_fx_e[0]; mat_mult_buffer1_e = 0; move16(); Word16 guard_bits = find_guarded_bits_fx( lengthCx + 1 ); Loading Loading @@ -2728,7 +2728,7 @@ Word16 computeMixingMatricesResidual_fx( matrix_product_fx( mat_mult_buffer1_fx, lengthCy, lengthCx, 0, mat_mult_buffer2_fx, lengthCx, lengthCx, 1, mat_mult_buffer3_fx ); mat_mult_buffer3_e = svd_v_buffer_fx_e[0] + svd_u_buffer_fx_e[0]; mat_mult_buffer3_e = 0; /*-----------------------------------------------------------------* * Formulate M Loading Loading @@ -2887,6 +2887,8 @@ int16_t computeMixingMatricesISM( Word32 svd_in_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 svd_u_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 svd_s_buffer_fx[MAX_OUTPUT_CHANNELS]; Word16 svd_s_buffer_fx_e; Word32 svd_v_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word16 mat_mult_buffer1_fx_e; Loading Loading @@ -3045,7 +3047,16 @@ int16_t computeMixingMatricesISM( nL = num_responses; nC = lengthCx; svd_fx( svd_in_buffer_fx, mat_mult_buffer1_fx_e, svd_v_buffer, svd_s_buffer, svd_u_buffer, nL, nC ); svd_fx( svd_in_buffer_fx, mat_mult_buffer1_fx_e, svd_v_buffer_fx, svd_s_buffer_fx, svd_u_buffer_fx, &svd_s_buffer_fx_e, nL, nC ); //local fix2float: to be removed for ( i = 0; i < nL; i++) { me2f_buf(svd_v_buffer_fx[i], 0, svd_v_buffer[i], nC); } for ( i = 0; i < nC; i++) { me2f_buf(svd_u_buffer_fx[i], 0, svd_u_buffer[i], nC); } me2f_buf(svd_s_buffer_fx, svd_s_buffer_fx_e, svd_s_buffer, nC); } else { Loading @@ -3063,7 +3074,16 @@ int16_t computeMixingMatricesISM( nL = lengthCx; nC = num_responses; svd_fx(svd_in_buffer_fx, mat_mult_buffer1_fx_e, svd_u_buffer, svd_s_buffer, svd_v_buffer, nL, nC ); svd_fx(svd_in_buffer_fx, mat_mult_buffer1_fx_e, svd_u_buffer_fx, svd_s_buffer_fx, svd_v_buffer_fx, &svd_s_buffer_fx_e, nL, nC ); //local fix2float: to be removed for ( i = 0; i < nL; i++) { me2f_buf(svd_u_buffer_fx[i], 0, svd_u_buffer[i], nC); } for ( i = 0; i < nC; i++) { me2f_buf(svd_v_buffer_fx[i], 0, svd_v_buffer[i], nC); } me2f_buf(svd_s_buffer_fx, svd_s_buffer_fx_e, svd_s_buffer, nC); } /* Actually Processing P */ Loading lib_dec/ivas_svd_dec.c +46 −38 Original line number Diff line number Diff line Loading @@ -152,10 +152,6 @@ static Word32 maxWithSign_fx( // const Word16 n ); static Word16 BidagonalDiagonalisation_fx( float singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) */ float singularValues[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ float singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) */ float secDiag[MAX_OUTPUT_CHANNELS], /* i/o: */ Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) Q31 */ Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) Q31 */ Loading Loading @@ -383,9 +379,10 @@ void svdMat2mat( Word16 svd_fx( Word32 InputMatrix[][MAX_OUTPUT_CHANNELS], /* i : matrix to be decomposed (M) */ Word16 InputMatrix_e, float singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) */ float singularValues[MAX_OUTPUT_CHANNELS], /* o : singular values vector (S) */ float singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) */ Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) (Q31) */ Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* o : singular values vector (S) */ Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) (Q31) */ Word16 *singularValues_fx_e, const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed */ const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed */ ) Loading @@ -394,18 +391,14 @@ Word16 svd_fx( int16_t lengthSingularValues; int16_t errorMessage, condition; //int16_t max_length = ((nChannelsL > nChannelsC) ? nChannelsL : nChannelsC); float secDiag[MAX_OUTPUT_CHANNELS]; Word32 secDiag_fx[MAX_OUTPUT_CHANNELS]; float /*eps_x = 0.0f,*/ temp; Word32 eps_x_fx = 0;//, temp_fx; Word32 eps_x_fx = 0, temp_fx; Word16 eps_x_fx_e = 0; push_wmops("svd"); push_wmops("svd_fx"); set_zero(secDiag, MAX_OUTPUT_CHANNELS); set32_fx(secDiag_fx, 0, MAX_OUTPUT_CHANNELS); /* Collecting Values */ Word32 singularVectors_Left_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS] = {0};//to be removed for (iCh = 0; iCh < nChannelsL; iCh++) { for (jCh = 0; jCh < nChannelsC; jCh++) Loading @@ -414,11 +407,11 @@ Word16 svd_fx( } } Word32 singularValues_fx[MAX_OUTPUT_CHANNELS] = { 0 }, singularVectors_Right_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS] = { 0 };// to be removed Word16 singularValues_fx_e = 0, secDiag_fx_e = 0;// to be removed Word16 secDiag_fx_e = 0;// to be removed *singularValues_fx_e = 0; /* Householder reduction */ HouseholderReduction_fx(singularVectors_Left_fx, singularValues_fx, singularVectors_Right_fx, secDiag_fx, InputMatrix_e, &singularValues_fx_e, &secDiag_fx_e, nChannelsL, nChannelsC, &eps_x_fx, &eps_x_fx_e); HouseholderReduction_fx(singularVectors_Left_fx, singularValues_fx, singularVectors_Right_fx, secDiag_fx, InputMatrix_e, singularValues_fx_e, &secDiag_fx_e, nChannelsL, nChannelsC, &eps_x_fx, &eps_x_fx_e); /* Set extremely small values to zero if needed */ //flushToZeroArray(singularValues, max_length); Loading @@ -426,7 +419,7 @@ Word16 svd_fx( //flushToZeroMat(singularVectors_Right, nChannelsC, nChannelsC); /* BidagonalDiagonalisation */ errorMessage = BidagonalDiagonalisation_fx(singularVectors_Left, singularValues, singularVectors_Right, secDiag, singularVectors_Left_fx, singularValues_fx, singularVectors_Right_fx, secDiag_fx, &singularValues_fx_e, &secDiag_fx_e, nChannelsL, nChannelsC, eps_x_fx, eps_x_fx_e); errorMessage = BidagonalDiagonalisation_fx( singularVectors_Left_fx, singularValues_fx, singularVectors_Right_fx, secDiag_fx, singularValues_fx_e, &secDiag_fx_e, nChannelsL, nChannelsC, eps_x_fx, eps_x_fx_e); /* Sort the singular values descending order */ lengthSingularValues = min(nChannelsL, nChannelsC); Loading @@ -436,25 +429,25 @@ Word16 svd_fx( condition = 0; for (iCh = 0; iCh < lengthSingularValues - 1; iCh++) { if (singularValues[iCh] < singularValues[iCh + 1]) if (singularValues_fx[iCh] < singularValues_fx[iCh + 1]) { condition = 1; temp = singularValues[iCh]; singularValues[iCh] = singularValues[iCh + 1]; singularValues[iCh + 1] = temp; temp_fx = singularValues_fx[iCh]; singularValues_fx[iCh] = singularValues_fx[iCh + 1]; singularValues_fx[iCh + 1] = temp_fx; for (jCh = 0; jCh < nChannelsL; ++jCh) { temp = singularVectors_Left[jCh][iCh]; singularVectors_Left[jCh][iCh] = singularVectors_Left[jCh][iCh + 1]; singularVectors_Left[jCh][iCh + 1] = temp; temp_fx = singularVectors_Left_fx[jCh][iCh]; singularVectors_Left_fx[jCh][iCh] = singularVectors_Left_fx[jCh][iCh + 1]; singularVectors_Left_fx[jCh][iCh + 1] = temp_fx; } for (jCh = 0; jCh < nChannelsC; ++jCh) { temp = singularVectors_Right[jCh][iCh]; singularVectors_Right[jCh][iCh] = singularVectors_Right[jCh][iCh + 1]; singularVectors_Right[jCh][iCh + 1] = temp; temp_fx = singularVectors_Right_fx[jCh][iCh]; singularVectors_Right_fx[jCh][iCh] = singularVectors_Right_fx[jCh][iCh + 1]; singularVectors_Right_fx[jCh][iCh + 1] = temp_fx; } } } Loading Loading @@ -553,10 +546,6 @@ int16_t svd( *-------------------------------------------------------------------------*/ static Word16 BidagonalDiagonalisation_fx( float singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) */ float singularValues[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ float singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) */ float secDiag[MAX_OUTPUT_CHANNELS], /* i/o: */ Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) Q31 */ Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) Q31 */ Loading Loading @@ -685,19 +674,38 @@ static Word16 BidagonalDiagonalisation_fx( } } //rescaling block Word16 max_exp = -31; for (iCh = 0; iCh < nChannelsC; iCh++) { if (singularValues_fx[iCh]) { max_exp = s_max(max_exp,singularValues_new_e[iCh]); } } *singularValues_fx_e = max_exp; for (iCh = 0; iCh < nChannelsC; iCh++) { singularValues_fx[iCh] = L_shr_r(singularValues_fx[iCh], sub(*singularValues_fx_e, singularValues_new_e[iCh])); } max_exp = -31; for (iCh = 0; iCh < nChannelsC; iCh++) { if (secDiag_fx[iCh]) { max_exp = s_max(max_exp, secDiag_new_e[iCh]); } } *secDiag_fx_e = max_exp; for (iCh = 0; iCh < nChannelsC; iCh++) { secDiag_fx[iCh] = L_shr_r(secDiag_fx[iCh], sub(*secDiag_fx_e, secDiag_new_e[iCh])); } //local fix2float: to be removed for (int i = 0; i < nChannelsL; i++) { /*for (int i = 0; i < nChannelsL; i++) { me2f_buf(singularVectors_Left_fx[i], 0, singularVectors_Left[i], nChannelsC); } for (int i = 0; i < nChannelsC; i++) { me2f_buf(singularVectors_Right_fx[i], 0, singularVectors_Right[i], nChannelsC); } for (int i = 0; i < nChannelsC; i++) { singularValues[i] = me2f(singularValues_fx[i], singularValues_new_e[i]); } for (int i = 0; i < nChannelsC; i++) { secDiag[i] = me2f(secDiag_fx[i], secDiag_new_e[i]); } me2f_buf(singularValues_fx, *singularValues_fx_e, singularValues, nChannelsC); me2f_buf(secDiag_fx, *secDiag_fx_e, secDiag, nChannelsC);*/ return ( error ); } Loading Loading
lib_com/ivas_prot.h +4 −3 Original line number Diff line number Diff line Loading @@ -4960,9 +4960,10 @@ Word16 computeMixingMatricesResidual_fx( Word16 svd_fx( Word32 InputMatrix[][MAX_OUTPUT_CHANNELS], /* i : matrix to be decomposed (M) */ Word16 InputMatrix_e, float singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) */ float singularValues[MAX_OUTPUT_CHANNELS], /* o : singular values vector (S) */ float singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) */ Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) */ Word32 singularValues[MAX_OUTPUT_CHANNELS], /* o : singular values vector (S) */ Word32 singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) */ Word16 *singularValues_fx_e, const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed */ const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed */ ); Loading
lib_dec/ivas_dirac_output_synthesis_cov.c +61 −41 Original line number Diff line number Diff line Loading @@ -1516,22 +1516,22 @@ Word16 computeMixingMatrices_fx( int16_t lengthCx = num_inputs; int16_t lengthCy = num_outputs; //float svd_in_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; float svd_u_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; float svd_s_buffer[MAX_OUTPUT_CHANNELS]; float svd_v_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; //float svd_u_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; //float svd_s_buffer[MAX_OUTPUT_CHANNELS]; //float svd_v_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 svd_in_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 mat_mult_buffer1_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; Word32 mat_mult_buffer2_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; Word32 Cx_fx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; Word32 Cy_fx[MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; Word32 svd_u_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 svd_v_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 svd_u_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; //Q31 out Word32 svd_v_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; //Q31 out //Word16 mat_mult_buffer1_fx_e; Word16 Cx_fx_e; Word16 Cy_fx_e; Word16 svd_u_buffer_fx_e[MAX_OUTPUT_CHANNELS]; Word16 svd_v_buffer_fx_e[MAX_OUTPUT_CHANNELS]; //Word16 svd_u_buffer_fx_e[MAX_OUTPUT_CHANNELS]; //Word16 svd_v_buffer_fx_e[MAX_OUTPUT_CHANNELS]; Word32 svd_s_buffer_fx[MAX_OUTPUT_CHANNELS]; Word16 svd_s_buffer_e[MAX_OUTPUT_CHANNELS]; Loading Loading @@ -1619,14 +1619,14 @@ Word16 computeMixingMatrices_fx( me2f_buf( ( svd_in_buffer_fx[g] ), Cy_fx_e, ( svd_in_buffer[g] ), lengthCy ); }*/ svd_fx(svd_in_buffer_fx, Cy_fx_e, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCy, lengthCy ); svd_fx(svd_in_buffer_fx, Cy_fx_e, svd_u_buffer_fx, svd_s_buffer_fx, svd_v_buffer_fx, &svd_s_buffer_fx_e, lengthCy, lengthCy ); f2me_buf(svd_s_buffer, svd_s_buffer_fx, &svd_s_buffer_fx_e, lengthCy); /*f2me_buf(svd_s_buffer, svd_s_buffer_fx, &svd_s_buffer_fx_e, lengthCy); FOR(Word32 g = 0; g < lengthCy; g++) { f2me_buf((svd_u_buffer[g]), (svd_u_buffer_fx[g]), &svd_u_buffer_fx_e[g], lengthCy); f2me_buf((svd_v_buffer[g]), (svd_v_buffer_fx[g]), &svd_v_buffer_fx_e[g], lengthCy); } }*/ /* Computing Ky */ Loading @@ -1639,7 +1639,7 @@ Word16 computeMixingMatrices_fx( tmp_e = svd_s_buffer_fx_e; L_tmp = Sqrt32(svd_s_buffer_fx[j], &tmp_e); Ky_fx[i + j * lengthCy] = Mpy_32_32( svd_u_buffer_fx[i][j], L_tmp ); Ky_fx_e[i + j * lengthCy] = svd_u_buffer_fx_e[i] + tmp_e; Ky_fx_e[i + j * lengthCy] = + tmp_e; } } Loading Loading @@ -1670,13 +1670,13 @@ Word16 computeMixingMatrices_fx( }*/ svd_fx( svd_in_buffer_fx, Cx_fx_e, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCx, lengthCx ); f2me_buf(svd_s_buffer, svd_s_buffer_fx, &svd_s_buffer_fx_e, lengthCx); svd_fx( svd_in_buffer_fx, Cx_fx_e, svd_u_buffer_fx, svd_s_buffer_fx, svd_v_buffer_fx, &svd_s_buffer_fx_e, lengthCx, lengthCx ); /*f2me_buf(svd_s_buffer, svd_s_buffer_fx, &svd_s_buffer_fx_e, lengthCx); FOR(Word32 g = 0; g < lengthCy; g++) { f2me_buf((svd_u_buffer[g]), (svd_u_buffer_fx[g]), &svd_u_buffer_fx_e[g], lengthCx); f2me_buf((svd_v_buffer[g]), (svd_v_buffer_fx[g]), &svd_v_buffer_fx_e[g], lengthCx); } }*/ Loading @@ -1687,7 +1687,7 @@ Word16 computeMixingMatrices_fx( tmp_e = svd_s_buffer_fx_e; L_tmp = Sqrt32(svd_s_buffer_fx[j], &tmp_e); Kx_fx[i + j * lengthCx] = Mpy_32_32( svd_u_buffer_fx[i][j], L_tmp ); Kx_fx_e[i + j * lengthCx] = svd_u_buffer_fx_e[i] + tmp_e; Kx_fx_e[i + j * lengthCx] = tmp_e; } } Loading Loading @@ -1776,7 +1776,7 @@ Word16 computeMixingMatrices_fx( FOR ( j = 0; j < lengthCx; ++j ) { Kx_reg_inv_fx[i + j * lengthCx] = Mpy_32_16_1(svd_u_buffer_fx[j][i], reg_fac_fx ); Kx_reg_inv_e[i + j * lengthCx] = svd_u_buffer_fx_e[j] + scale; Kx_reg_inv_e[i + j * lengthCx] = scale; } } Loading Loading @@ -1916,7 +1916,7 @@ Word16 computeMixingMatrices_fx( nC = lengthCx; move16(); svd_fx(svd_in_buffer_fx, mat_mult_buffer1_e, svd_v_buffer, svd_s_buffer, svd_u_buffer, nL, nC ); svd_fx(svd_in_buffer_fx, mat_mult_buffer1_e, svd_v_buffer_fx, svd_s_buffer_fx, svd_u_buffer_fx, &svd_s_buffer_fx_e, nL, nC ); #endif } ELSE Loading @@ -1934,7 +1934,7 @@ Word16 computeMixingMatrices_fx( nC = lengthCy; move16(); svd_fx( svd_in_buffer_fx, mat_mult_buffer1_e, svd_u_buffer, svd_s_buffer, svd_v_buffer, nL, nC ); svd_fx( svd_in_buffer_fx, mat_mult_buffer1_e, svd_u_buffer_fx, svd_s_buffer_fx, svd_v_buffer_fx, &svd_s_buffer_fx_e, nL, nC ); #endif } Loading @@ -1943,7 +1943,7 @@ Word16 computeMixingMatrices_fx( /* can be skipped: lambda is always column-truncated identity matrix, so this operation just truncates V to num_input_channel columns */ Word16 min_q = -1; /*Word16 min_q = -1; move16(); FOR ( Word32 g = 0; g < lengthCy; g++ ) { Loading Loading @@ -1984,12 +1984,12 @@ Word16 computeMixingMatrices_fx( } } svd_u_buffer_fx_e[0] = min_q; move16(); move16();*/ svdMat2mat_fx( svd_v_buffer_fx, mat_mult_buffer1_fx, lengthCy, lengthCx ); svdMat2mat_fx( svd_u_buffer_fx, mat_mult_buffer2_fx, lengthCx, lengthCx ); mat_mult_buffer1_e = svd_v_buffer_fx_e[0]; mat_mult_buffer2_e = svd_u_buffer_fx_e[0]; mat_mult_buffer1_e = 0; mat_mult_buffer2_e = 0; guard_bits = find_guarded_bits_fx(lengthCx + 1); FOR(i = 0; i < lengthCx * lengthCy; ++i) Loading Loading @@ -2365,18 +2365,18 @@ Word16 computeMixingMatricesResidual_fx( #ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED //float svd_in_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; float svd_u_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; float svd_s_buffer[MAX_OUTPUT_CHANNELS]; float svd_v_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; //float svd_u_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; //float svd_s_buffer[MAX_OUTPUT_CHANNELS]; //float svd_v_buffer[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; #endif Word32 svd_in_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 mat_mult_buffer2_fx[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; Word32 svd_u_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 svd_v_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 svd_u_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; //Q31 out Word32 svd_v_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; //Q31 out Word16 svd_u_buffer_fx_e[MAX_OUTPUT_CHANNELS]; Word16 svd_v_buffer_fx_e[MAX_OUTPUT_CHANNELS]; //Word16 svd_u_buffer_fx_e[MAX_OUTPUT_CHANNELS]; //Word16 svd_v_buffer_fx_e[MAX_OUTPUT_CHANNELS]; Word16 mat_mult_buffer1_buff_e[MAX_OUTPUT_CHANNELS * MAX_OUTPUT_CHANNELS]; Loading Loading @@ -2434,13 +2434,13 @@ Word16 computeMixingMatricesResidual_fx( me2f_buf( ( svd_in_buffer_fx[g] ), Cy_fx_e, ( svd_in_buffer[g] ), lengthCy ); }*/ svd_fx( svd_in_buffer_fx, Cy_fx_e, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCy, lengthCy ); f2me_buf(svd_s_buffer, svd_s_buffer_fx, &svd_s_buffer_fx_e, lengthCy); svd_fx( svd_in_buffer_fx, Cy_fx_e, svd_u_buffer_fx, svd_s_buffer_fx, svd_v_buffer_fx, &svd_s_buffer_fx_e, lengthCy, lengthCy ); /*f2me_buf(svd_s_buffer, svd_s_buffer_fx, &svd_s_buffer_fx_e, lengthCy); FOR(Word32 g = 0; g < lengthCy; g++) { f2me_buf((svd_u_buffer[g]), (svd_u_buffer_fx[g]), &svd_u_buffer_fx_e[g], lengthCy); f2me_buf((svd_v_buffer[g]), (svd_v_buffer_fx[g]), &svd_v_buffer_fx_e[g], lengthCy); } }*/ #endif /* Computing Ky */ Loading @@ -2451,7 +2451,7 @@ Word16 computeMixingMatricesResidual_fx( tmp_e = svd_s_buffer_fx_e; L_tmp = Sqrt32(svd_s_buffer_fx[j], &tmp_e); Ky_fx[i + j * lengthCy] = Mpy_32_32( svd_u_buffer_fx[i][j], L_tmp ); Ky_fx_e[i + j * lengthCy] = svd_u_buffer_fx_e[i] + tmp_e; Ky_fx_e[i + j * lengthCy] = tmp_e; } } Loading Loading @@ -2652,10 +2652,10 @@ Word16 computeMixingMatricesResidual_fx( }*/ #ifdef IVAS_FLOAT_FIXED_TO_BE_REMOVED svd_fx( svd_in_buffer_fx, mat_mult_buffer1_e, svd_u_buffer, svd_s_buffer, svd_v_buffer, lengthCx, lengthCy ); svd_fx( svd_in_buffer_fx, mat_mult_buffer1_e, svd_u_buffer_fx, svd_s_buffer_fx, svd_v_buffer_fx, &svd_s_buffer_fx_e, lengthCx, lengthCy ); /* Actually Processing P */ Word16 min_q = -1; /*Word16 min_q = -1; FOR ( Word32 g = 0; g < lengthCy; g++ ) { f2me_buf( svd_v_buffer[g], svd_v_buffer_fx[g], &svd_v_buffer_fx_e[g], lengthCx ); Loading Loading @@ -2694,13 +2694,13 @@ Word16 computeMixingMatricesResidual_fx( } } svd_u_buffer_fx_e[0] = min_q; move16(); move16();*/ #endif svdMat2mat_fx( svd_v_buffer_fx, mat_mult_buffer1_fx, lengthCy, lengthCx ); svdMat2mat_fx( svd_u_buffer_fx, mat_mult_buffer2_fx, lengthCx, lengthCx ); mat_mult_buffer2_e = svd_u_buffer_fx_e[0]; mat_mult_buffer2_e = 0; move16(); mat_mult_buffer1_e = svd_v_buffer_fx_e[0]; mat_mult_buffer1_e = 0; move16(); Word16 guard_bits = find_guarded_bits_fx( lengthCx + 1 ); Loading Loading @@ -2728,7 +2728,7 @@ Word16 computeMixingMatricesResidual_fx( matrix_product_fx( mat_mult_buffer1_fx, lengthCy, lengthCx, 0, mat_mult_buffer2_fx, lengthCx, lengthCx, 1, mat_mult_buffer3_fx ); mat_mult_buffer3_e = svd_v_buffer_fx_e[0] + svd_u_buffer_fx_e[0]; mat_mult_buffer3_e = 0; /*-----------------------------------------------------------------* * Formulate M Loading Loading @@ -2887,6 +2887,8 @@ int16_t computeMixingMatricesISM( Word32 svd_in_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 svd_u_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word32 svd_s_buffer_fx[MAX_OUTPUT_CHANNELS]; Word16 svd_s_buffer_fx_e; Word32 svd_v_buffer_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS]; Word16 mat_mult_buffer1_fx_e; Loading Loading @@ -3045,7 +3047,16 @@ int16_t computeMixingMatricesISM( nL = num_responses; nC = lengthCx; svd_fx( svd_in_buffer_fx, mat_mult_buffer1_fx_e, svd_v_buffer, svd_s_buffer, svd_u_buffer, nL, nC ); svd_fx( svd_in_buffer_fx, mat_mult_buffer1_fx_e, svd_v_buffer_fx, svd_s_buffer_fx, svd_u_buffer_fx, &svd_s_buffer_fx_e, nL, nC ); //local fix2float: to be removed for ( i = 0; i < nL; i++) { me2f_buf(svd_v_buffer_fx[i], 0, svd_v_buffer[i], nC); } for ( i = 0; i < nC; i++) { me2f_buf(svd_u_buffer_fx[i], 0, svd_u_buffer[i], nC); } me2f_buf(svd_s_buffer_fx, svd_s_buffer_fx_e, svd_s_buffer, nC); } else { Loading @@ -3063,7 +3074,16 @@ int16_t computeMixingMatricesISM( nL = lengthCx; nC = num_responses; svd_fx(svd_in_buffer_fx, mat_mult_buffer1_fx_e, svd_u_buffer, svd_s_buffer, svd_v_buffer, nL, nC ); svd_fx(svd_in_buffer_fx, mat_mult_buffer1_fx_e, svd_u_buffer_fx, svd_s_buffer_fx, svd_v_buffer_fx, &svd_s_buffer_fx_e, nL, nC ); //local fix2float: to be removed for ( i = 0; i < nL; i++) { me2f_buf(svd_u_buffer_fx[i], 0, svd_u_buffer[i], nC); } for ( i = 0; i < nC; i++) { me2f_buf(svd_v_buffer_fx[i], 0, svd_v_buffer[i], nC); } me2f_buf(svd_s_buffer_fx, svd_s_buffer_fx_e, svd_s_buffer, nC); } /* Actually Processing P */ Loading
lib_dec/ivas_svd_dec.c +46 −38 Original line number Diff line number Diff line Loading @@ -152,10 +152,6 @@ static Word32 maxWithSign_fx( // const Word16 n ); static Word16 BidagonalDiagonalisation_fx( float singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) */ float singularValues[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ float singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) */ float secDiag[MAX_OUTPUT_CHANNELS], /* i/o: */ Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) Q31 */ Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) Q31 */ Loading Loading @@ -383,9 +379,10 @@ void svdMat2mat( Word16 svd_fx( Word32 InputMatrix[][MAX_OUTPUT_CHANNELS], /* i : matrix to be decomposed (M) */ Word16 InputMatrix_e, float singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) */ float singularValues[MAX_OUTPUT_CHANNELS], /* o : singular values vector (S) */ float singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) */ Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) (Q31) */ Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* o : singular values vector (S) */ Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) (Q31) */ Word16 *singularValues_fx_e, const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed */ const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed */ ) Loading @@ -394,18 +391,14 @@ Word16 svd_fx( int16_t lengthSingularValues; int16_t errorMessage, condition; //int16_t max_length = ((nChannelsL > nChannelsC) ? nChannelsL : nChannelsC); float secDiag[MAX_OUTPUT_CHANNELS]; Word32 secDiag_fx[MAX_OUTPUT_CHANNELS]; float /*eps_x = 0.0f,*/ temp; Word32 eps_x_fx = 0;//, temp_fx; Word32 eps_x_fx = 0, temp_fx; Word16 eps_x_fx_e = 0; push_wmops("svd"); push_wmops("svd_fx"); set_zero(secDiag, MAX_OUTPUT_CHANNELS); set32_fx(secDiag_fx, 0, MAX_OUTPUT_CHANNELS); /* Collecting Values */ Word32 singularVectors_Left_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS] = {0};//to be removed for (iCh = 0; iCh < nChannelsL; iCh++) { for (jCh = 0; jCh < nChannelsC; jCh++) Loading @@ -414,11 +407,11 @@ Word16 svd_fx( } } Word32 singularValues_fx[MAX_OUTPUT_CHANNELS] = { 0 }, singularVectors_Right_fx[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS] = { 0 };// to be removed Word16 singularValues_fx_e = 0, secDiag_fx_e = 0;// to be removed Word16 secDiag_fx_e = 0;// to be removed *singularValues_fx_e = 0; /* Householder reduction */ HouseholderReduction_fx(singularVectors_Left_fx, singularValues_fx, singularVectors_Right_fx, secDiag_fx, InputMatrix_e, &singularValues_fx_e, &secDiag_fx_e, nChannelsL, nChannelsC, &eps_x_fx, &eps_x_fx_e); HouseholderReduction_fx(singularVectors_Left_fx, singularValues_fx, singularVectors_Right_fx, secDiag_fx, InputMatrix_e, singularValues_fx_e, &secDiag_fx_e, nChannelsL, nChannelsC, &eps_x_fx, &eps_x_fx_e); /* Set extremely small values to zero if needed */ //flushToZeroArray(singularValues, max_length); Loading @@ -426,7 +419,7 @@ Word16 svd_fx( //flushToZeroMat(singularVectors_Right, nChannelsC, nChannelsC); /* BidagonalDiagonalisation */ errorMessage = BidagonalDiagonalisation_fx(singularVectors_Left, singularValues, singularVectors_Right, secDiag, singularVectors_Left_fx, singularValues_fx, singularVectors_Right_fx, secDiag_fx, &singularValues_fx_e, &secDiag_fx_e, nChannelsL, nChannelsC, eps_x_fx, eps_x_fx_e); errorMessage = BidagonalDiagonalisation_fx( singularVectors_Left_fx, singularValues_fx, singularVectors_Right_fx, secDiag_fx, singularValues_fx_e, &secDiag_fx_e, nChannelsL, nChannelsC, eps_x_fx, eps_x_fx_e); /* Sort the singular values descending order */ lengthSingularValues = min(nChannelsL, nChannelsC); Loading @@ -436,25 +429,25 @@ Word16 svd_fx( condition = 0; for (iCh = 0; iCh < lengthSingularValues - 1; iCh++) { if (singularValues[iCh] < singularValues[iCh + 1]) if (singularValues_fx[iCh] < singularValues_fx[iCh + 1]) { condition = 1; temp = singularValues[iCh]; singularValues[iCh] = singularValues[iCh + 1]; singularValues[iCh + 1] = temp; temp_fx = singularValues_fx[iCh]; singularValues_fx[iCh] = singularValues_fx[iCh + 1]; singularValues_fx[iCh + 1] = temp_fx; for (jCh = 0; jCh < nChannelsL; ++jCh) { temp = singularVectors_Left[jCh][iCh]; singularVectors_Left[jCh][iCh] = singularVectors_Left[jCh][iCh + 1]; singularVectors_Left[jCh][iCh + 1] = temp; temp_fx = singularVectors_Left_fx[jCh][iCh]; singularVectors_Left_fx[jCh][iCh] = singularVectors_Left_fx[jCh][iCh + 1]; singularVectors_Left_fx[jCh][iCh + 1] = temp_fx; } for (jCh = 0; jCh < nChannelsC; ++jCh) { temp = singularVectors_Right[jCh][iCh]; singularVectors_Right[jCh][iCh] = singularVectors_Right[jCh][iCh + 1]; singularVectors_Right[jCh][iCh + 1] = temp; temp_fx = singularVectors_Right_fx[jCh][iCh]; singularVectors_Right_fx[jCh][iCh] = singularVectors_Right_fx[jCh][iCh + 1]; singularVectors_Right_fx[jCh][iCh + 1] = temp_fx; } } } Loading Loading @@ -553,10 +546,6 @@ int16_t svd( *-------------------------------------------------------------------------*/ static Word16 BidagonalDiagonalisation_fx( float singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) */ float singularValues[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ float singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) */ float secDiag[MAX_OUTPUT_CHANNELS], /* i/o: */ Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) Q31 */ Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) Q31 */ Loading Loading @@ -685,19 +674,38 @@ static Word16 BidagonalDiagonalisation_fx( } } //rescaling block Word16 max_exp = -31; for (iCh = 0; iCh < nChannelsC; iCh++) { if (singularValues_fx[iCh]) { max_exp = s_max(max_exp,singularValues_new_e[iCh]); } } *singularValues_fx_e = max_exp; for (iCh = 0; iCh < nChannelsC; iCh++) { singularValues_fx[iCh] = L_shr_r(singularValues_fx[iCh], sub(*singularValues_fx_e, singularValues_new_e[iCh])); } max_exp = -31; for (iCh = 0; iCh < nChannelsC; iCh++) { if (secDiag_fx[iCh]) { max_exp = s_max(max_exp, secDiag_new_e[iCh]); } } *secDiag_fx_e = max_exp; for (iCh = 0; iCh < nChannelsC; iCh++) { secDiag_fx[iCh] = L_shr_r(secDiag_fx[iCh], sub(*secDiag_fx_e, secDiag_new_e[iCh])); } //local fix2float: to be removed for (int i = 0; i < nChannelsL; i++) { /*for (int i = 0; i < nChannelsL; i++) { me2f_buf(singularVectors_Left_fx[i], 0, singularVectors_Left[i], nChannelsC); } for (int i = 0; i < nChannelsC; i++) { me2f_buf(singularVectors_Right_fx[i], 0, singularVectors_Right[i], nChannelsC); } for (int i = 0; i < nChannelsC; i++) { singularValues[i] = me2f(singularValues_fx[i], singularValues_new_e[i]); } for (int i = 0; i < nChannelsC; i++) { secDiag[i] = me2f(secDiag_fx[i], secDiag_new_e[i]); } me2f_buf(singularValues_fx, *singularValues_fx_e, singularValues, nChannelsC); me2f_buf(secDiag_fx, *secDiag_fx_e, secDiag, nChannelsC);*/ return ( error ); } Loading