Commit 6bf9dac2 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Fix for dct calculation in fixed encoder

parent d5b49974
Loading
Loading
Loading
Loading
Loading
+19 −32
Original line number Diff line number Diff line
@@ -6542,7 +6542,6 @@ void ivas_omasa_encode_masa_to_total_fx(
    Word16 q_idx[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_FREQUENCY_BANDS];
    Word32 dct_data_tmp[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_FREQUENCY_BANDS];
    Word32 dct_data[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_FREQUENCY_BANDS];
    Word16 dct_data_e = 0, dct_data_tmp_e, q_dct_data_e;
    Word16 bits_pos, nb_bits;
    Word16 n_streams, len_stream, tmp_e;
    Word32 L_tmp;
@@ -6558,7 +6557,7 @@ void ivas_omasa_encode_masa_to_total_fx(
    {
        FOR( j = 0; j < nblocks; j++ )
        {
            data[k] = masa_to_total_energy_ratio[j][i];
            data[k] = L_shr( masa_to_total_energy_ratio[j][i], Q5 );
            move32();
            k = add( k, 1 );
        }
@@ -6571,42 +6570,42 @@ void ivas_omasa_encode_masa_to_total_fx(
    SWITCH( len_stream )
    {
        case 4:
            matrix_product_mant_exp_fx( dct4_fx, 0 /* Q31 */, nblocks, nblocks, 0, data, 1 /* Q30*/, 1, nblocks, 1, dct_data, &dct_data_e );
            matrix_product_q30_fx( dct4_fx, nblocks, nblocks, 0, data, 1, nblocks, 1, dct_data );
            n_streams = 1;
            len_stream = 4;
            move16();
            BREAK;
        case 5:
            matrix_product_mant_exp_fx( dct5_fx, 0 /* Q31 */, nbands, nbands, 0, data, 1 /* Q30 */, 1, nbands, 1, dct_data, &dct_data_e );
            matrix_product_q30_fx( dct5_fx, nbands, nbands, 0, data, 1, nbands, 1, dct_data );
            n_streams = 1;
            len_stream = nbands;
            move16();
            move16();
            BREAK;
        case 8:
            matrix_product_mant_exp_fx( dct8_fx, 0 /* Q31 */, nbands, nbands, 0, data, 1 /* Q30 */, 1, nbands, 1, dct_data, &dct_data_e );
            matrix_product_q30_fx( dct8_fx, nbands, nbands, 0, data, 1, nbands, 1, dct_data );
            n_streams = 1;
            len_stream = nbands;
            move16();
            BREAK;
        case 12:
            matrix_product_mant_exp_fx( dct12_fx, 0 /* Q31 */, nbands, nbands, 0, data, 1 /* Q30 */, 1, nbands, 1, dct_data, &dct_data_e );
            matrix_product_q30_fx( dct12_fx, nbands, nbands, 0, data, 1, nbands, 1, dct_data );
            n_streams = 1;
            len_stream = nbands;
            move16();
            move16();
            BREAK;
        case 20:
            matrix_product_mant_exp_fx( dct5_fx, 0 /* Q31 */, nbands, nbands, 0, data, 1 /* Q30 */, nblocks, nbands, 1, dct_data_tmp, &dct_data_e );
            matrix_product_mant_exp_fx( dct_data_tmp, dct_data_e, nbands, nblocks, 0, dct4_fx, 0 /* Q31 */, nblocks, nblocks, 1, dct_data, &dct_data_e );
            matrix_product_fx( dct5_fx, nbands, nbands, 0, data, nblocks, nbands, 1, dct_data_tmp );
            matrix_product_q30_fx( dct_data_tmp, nbands, nblocks, 0, dct4_fx, nblocks, nblocks, 1, dct_data );
            n_streams = 1;
            len_stream = imult1616( nbands, nblocks );
            move16();
            move16();
            BREAK;
        case 32:
            matrix_product_mant_exp_fx( dct8_fx, 0 /* Q31 */, nbands, nbands, 0, data, 1 /* Q30 */, nblocks, nbands, 1, dct_data_tmp, &dct_data_e );
            matrix_product_mant_exp_fx( dct_data_tmp, dct_data_e, nbands, nblocks, 0, dct4_fx, 0 /* Q31 */, nblocks, nblocks, 1, dct_data, &dct_data_e );
            matrix_product_fx( dct8_fx, nbands, nbands, 0, data, nblocks, nbands, 1, dct_data_tmp );
            matrix_product_q30_fx( dct_data_tmp, nbands, nblocks, 0, dct4_fx, nblocks, nblocks, 1, dct_data );
            n_streams = nblocks;
            len_stream = nbands;
            move16();
@@ -6622,7 +6621,7 @@ void ivas_omasa_encode_masa_to_total_fx(
        j = imult1616( k, len_stream );
        /* quantize with fixed common step */
        L_tmp = BASOP_Util_Divide3232_Scale_cadence( dct_data[j], step, &tmp_e );
        tmp_e = add( tmp_e, dct_data_e );
        tmp_e = add( tmp_e, Q1 );
        q_idx[j] = rint_new_fx( L_shr( L_tmp, sub( 15, tmp_e ) ) /* Q16 */ ); // Q0
        move16();

@@ -6645,7 +6644,7 @@ void ivas_omasa_encode_masa_to_total_fx(
            FOR( i = 1; i < len_stream; i++ )
            {
                L_tmp = BASOP_Util_Divide3232_Scale_cadence( dct_data[j + i], step, &tmp_e );
                tmp_e = add( tmp_e, dct_data_e );
                tmp_e = add( tmp_e, Q1 );
                q_idx[j + i] = rint_new_fx( L_shr( L_tmp, sub( 15, tmp_e ) ) );
                move16();
                q_dct_data[j + i] = Mpy_32_16_1( step, shl( q_idx[j + i], 9 ) /* Q9 */ ); // Q25
@@ -6689,50 +6688,38 @@ void ivas_omasa_encode_masa_to_total_fx(
        }
    }

    q_dct_data_e = 6; // Q25
    move16();
    /* inverse DCT2 transform */
    SWITCH( len_stream )
    {
        case 4:
            matrix_product_mant_exp_fx( dct4_fx, 0 /* Q31 */, nblocks, nblocks, 1, q_dct_data, q_dct_data_e, nblocks, 1, 0, dct_data_tmp, &dct_data_tmp_e );
            matrix_product_q30_fx( dct4_fx, nblocks, nblocks, 1, q_dct_data, nblocks, 1, 0, dct_data_tmp );
            Copy32( dct_data_tmp, q_dct_data, nblocks );
            q_dct_data_e = dct_data_tmp_e;
            move16();
            BREAK;
        case 5:
            matrix_product_mant_exp_fx( dct5_fx, 0 /* Q31 */, nbands, nbands, 1, q_dct_data, q_dct_data_e, nbands, 1, 0, dct_data_tmp, &dct_data_tmp_e );
            matrix_product_q30_fx( dct5_fx, nbands, nbands, 1, q_dct_data, nbands, 1, 0, dct_data_tmp );
            Copy32( dct_data_tmp, q_dct_data, nbands );
            q_dct_data_e = dct_data_tmp_e;
            move16();
            BREAK;
        case 8:
            matrix_product_mant_exp_fx( dct8_fx, 0 /* Q31 */, nbands, nbands, 1, q_dct_data, q_dct_data_e, nbands, 1, 0, dct_data_tmp, &dct_data_tmp_e );
            matrix_product_q30_fx( dct8_fx, nbands, nbands, 1, q_dct_data, nbands, 1, 0, dct_data_tmp );
            Copy32( dct_data_tmp, q_dct_data, nbands );
            q_dct_data_e = dct_data_tmp_e;
            move16();
            BREAK;
        case 12:
            matrix_product_mant_exp_fx( dct12_fx, 0 /* Q31 */, nbands, nbands, 1, q_dct_data, q_dct_data_e, nbands, 1, 0, dct_data_tmp, &dct_data_tmp_e );
            matrix_product_q30_fx( dct12_fx, nbands, nbands, 1, q_dct_data, nbands, 1, 0, dct_data_tmp );
            Copy32( dct_data_tmp, q_dct_data, nbands );
            q_dct_data_e = dct_data_tmp_e;
            move16();
            BREAK;
        case 20:
            matrix_product_mant_exp_fx( dct5_fx, 0 /* Q31 */, nbands, nbands, 1, q_dct_data, q_dct_data_e, nbands, nblocks, 0, dct_data_tmp, &dct_data_tmp_e );
            matrix_product_mant_exp_fx( dct_data_tmp, dct_data_tmp_e, nbands, nblocks, 0, dct4_fx, 0 /* Q31 */, nblocks, nblocks, 0, q_dct_data, &q_dct_data_e ); /* reuse of variable*/
            matrix_product_fx( dct5_fx, nbands, nbands, 1, q_dct_data, nbands, nblocks, 0, dct_data_tmp );
            matrix_product_q30_fx( dct_data_tmp, nbands, nblocks, 0, dct4_fx, nblocks, nblocks, 0, q_dct_data ); /* reuse of variable*/
            BREAK;
        case 32:
            matrix_product_mant_exp_fx( dct8_fx, 0 /* Q31 */, nbands, nbands, 1, q_dct_data, q_dct_data_e, nbands, nblocks, 0, dct_data_tmp, &dct_data_tmp_e );
            matrix_product_mant_exp_fx( dct_data_tmp, dct_data_tmp_e, nbands, nblocks, 0, dct4_fx, 0 /* Q31 */, nblocks, nblocks, 0, q_dct_data, &q_dct_data_e );
            matrix_product_fx( dct8_fx, nbands, nbands, 1, q_dct_data, nbands, nblocks, 0, dct_data_tmp );
            matrix_product_q30_fx( dct_data_tmp, nbands, nblocks, 0, dct4_fx, nblocks, nblocks, 0, q_dct_data );
            BREAK;
        default:
            printf( "Incorrect number of coefficients for OMASA.\n" );
            BREAK;
    }

    scale_sig32( q_dct_data, MAX_PARAM_SPATIAL_SUBFRAMES * MASA_FREQUENCY_BANDS, sub( Q30, sub( 31, q_dct_data_e ) ) ); // Scaling to Q30

    k = 0;
    move16();
    FOR( i = 0; i < nblocks; i++ )