Commit 09b85f48 authored by Nishant S Kulgod's avatar Nishant S Kulgod
Browse files

commit 3

parent 236f4d4b
Loading
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -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 */
);
+61 −41
Original line number Diff line number Diff line
@@ -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];
@@ -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 */

@@ -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;
        }
    }

@@ -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);
    }
    }*/



@@ -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;
        }
    }

@@ -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;
        }
    }

@@ -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
@@ -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
    }

@@ -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++ )
    {
@@ -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)
@@ -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];

@@ -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 */
@@ -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;
        }
    }

@@ -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 );
@@ -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 );
@@ -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
@@ -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;
@@ -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
    {
@@ -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 */
+46 −38
Original line number Diff line number Diff line
@@ -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                   */
@@ -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 */
)
@@ -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++)
@@ -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);
@@ -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);
@@ -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;
                }
            }
        }
@@ -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                   */
@@ -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 );
}