Commit f4c40432 authored by thomas dettbarn's avatar thomas dettbarn Committed by Manuel Jander
Browse files

merge candiate.

parent 78e3ae9c
Loading
Loading
Loading
Loading
+50 −209
Original line number Diff line number Diff line
@@ -59,7 +59,9 @@ static Word16 sns_1st_cod_fx(
    Word32 *snsq_fx /* o  : quantized sns    Q16 */
)
{
    Word16 index, i;
    IF( exp_sns == Q15)
    {
        Word16 index;
        const Word16 split_len = M / 2;
        move16();
        const Word16 *means;
@@ -81,62 +83,9 @@ static Word16 sns_1st_cod_fx(
            default:
                assert( !"illegal frame length in sns_1st_cod" );
        }
    Word16 exp_snsq_buffer[M] = { 0 }, exp_snsq = 0;
    move16();
    move16();
    FOR( i = 0; i < M; ++i )
    {
        Word32 tmp = L_mult( means[i], means_fix ); // Q16
        exp_snsq_buffer[i] = 0;
        move16();
        snsq_fx[i] = BASOP_Util_Add_Mant32Exp( sns_fx[i], exp_sns, L_negate( tmp ), 15, &exp_snsq_buffer[i] );
        move32();
    }
    FOR( i = 0; i < M; i++ )
    {
        exp_snsq = s_max( exp_snsq_buffer[i], exp_snsq );
    }
    FOR( i = 0; i < M; i++ )
    {
        snsq_fx[i] = L_shr( snsq_fx[i], exp_snsq - exp_snsq_buffer[i] );
        move32();
    }

    index = 0;
    move16();
    FOR( Word16 split = 0; split < 2; ++split )
    {
        const Word16 *cdbk_ptr;
        Word16 j0, j1, index_split;
        Word32 dist_min_fx;
        const Word16 cdbk_fix = 8; // 1.f / powf( 2, SNS_CDBKS_BITS_4_FRAC ) in Q15
        move16();
        const Word16 *const cdbk = &sns_1st_cdbk[split][core - 1][0];

        j0 = imult1616( split, split_len );
        j1 = add( j0, split_len );

        cdbk_ptr = cdbk;
        dist_min_fx = MAXVAL_WORD32;
        Word16 exp_dist_min = 31;
        index_split = 0;
        FOR( i = 0; i < 32; ++i )
        {
            case L_FRAME16k:
                means = &sns_1st_means_16k[core - 1][0]; // Q14
                break;
            case L_FRAME25_6k:
                means = &sns_1st_means_25k6[core - 1][0]; // Q14
                break;
            case L_FRAME32k:
                means = &sns_1st_means_32k[core - 1][0]; // Q14
                break;
            default:
                assert( !"illegal frame length in sns_1st_cod" );
        }
        FOR( Word16 i = 0; i < M; ++i )
        {
            Word32 tmp = L_mult( means[i], means_fix ); // Q14->Q16
            Word32 tmp = L_mult( means[i], means_fix ); // Q16
            snsq_fx[i] = L_sub( sns_fx[i], tmp ); // Q16
            move32();
        }
@@ -147,48 +96,49 @@ static Word16 sns_1st_cod_fx(
        {
            const Word16 *cdbk_ptr;
            Word16 j0, j1;
            Word16 index_split;
            Word16 dist_split;
            Word32 dist_min_fx;
            const Word16 cdbk_fix = 8; // 1.f / powf( 2, SNS_CDBKS_BITS_4_FRAC ) in Q15
            move16();
            const Word16 *const cdbk = &sns_1st_cdbk[split][core - 1][0]; // Q12
            const Word16 *const cdbk = &sns_1st_cdbk[split][core - 1][0];
    
            j0 = imult1616( split, split_len );
            j1 = add( j0, split_len );
    
            cdbk_ptr = cdbk;
            dist_min_fx = MAXVAL_WORD32;
            index_split = 0;
            dist_split = 0;
            move32();
            move16();
            FOR( Word16 i = 0; i < 32; ++i )
            {
                Word32 dist_fx = 0;
                move32();
                FOR( Word16 j = j0; j < j1; ++j ) // j1-j0=split_len. split_len=M/2. M=16
                FOR( Word16 j = j0; j < j1; ++j )
                {
                    Word32 tmp;
                    Word32 dist;
                    Word16 tmp2;
    
                    tmp = L_mult( *cdbk_ptr++, cdbk_fix ); // Q16
                    dist = L_sub( snsq_fx[j],  tmp );
                    dist = L_shr( dist, 4 ); // make sure that the next multiplication does not overflow
    
                    tmp = L_mult( *cdbk_ptr++, cdbk_fix ); // Q12->Q16
                    dist = L_sub( snsq_fx[j], tmp );       // Q16
                    dist = L_shl( dist, 11 );              // cdbk_ptr is a 16 bit LUT with 3.12 values, used as 3.16. assumption: snsq_fx has the same representation. thus, the subtraction results are in 4.16, which leaves 11 bit headroom.
                    dist = Mpy_32_32( dist, dist );
                    dist = L_shr( dist, 3 ); // make sure that the sum of 8 values does not overflow
                    tmp2 = extract_l( dist );
                    dist = L_mult( tmp2, tmp2 );
                    dist = L_shr( dist, 4 ); // make sure that the sum does not overflow
                    dist_fx = L_add( dist_fx, dist );
                }
    
                IF( LT_32( dist_fx, dist_min_fx ) )
                {
                    dist_min_fx = dist_fx;
                    move32();
                    index_split = i;
                    move16();
                    dist_split = i;
                }
            }
    
            /* set quantized vector */
            cdbk_ptr = &cdbk[imult1616( index_split, split_len )];
            cdbk_ptr = &cdbk[imult1616( dist_split, split_len )];
            FOR( Word16 j = j0; j < j1; ++j )
            {
                Word32 tmp_3 = L_mult( means[j], means_fix );    // Q16
@@ -200,15 +150,13 @@ static Word16 sns_1st_cod_fx(
            /* for second split shift by five bits to store both indices as one 10 bit value */
            if ( EQ_16( split, 1 ) )
            {
                index_split = shl( index_split, 5 );
                dist_split = shl( dist_split, 5 );
            }
    
            index = add( index, index_split );
            index = add( index, dist_split );
        }
        return index;
    }
    ELSE
    {
    } ELSE {
        Word16 index, i;
        const Word16 split_len = M / 2;
        move16();
@@ -321,112 +269,6 @@ static Word16 sns_1st_cod_fx(
    }
}

static Word16 sns_1st_cod_fx_q15(
    const Word32 *sns_fx, /* i  : vector to quantize                */
    const Word16 L_frame,
    const Word16 core,
    Word32 *snsq_fx /* o  : quantized sns    Q16 */
)
{
    Word16 index;
    const Word16 split_len = M / 2;
    move16();
    const Word16 *means;
    const Word16 means_fix = 2; // Q15
    push_wmops( "sns_1st_cod_fx_q15" );
    move16();
    /* remove means */
    means = NULL;
    SWITCH( L_frame )
    {
        case L_FRAME16k:
            means = &sns_1st_means_16k[core - 1][0];
            break;
        case L_FRAME25_6k:
            means = &sns_1st_means_25k6[core - 1][0];
            break;
        case L_FRAME32k:
            means = &sns_1st_means_32k[core - 1][0];
            break;
        default:
            assert( !"illegal frame length in sns_1st_cod" );
    }
    FOR( Word16 i = 0; i < M; ++i )
    {
        Word32 tmp = L_mult( means[i], means_fix ); // Q16
        snsq_fx[i] = L_sub( sns_fx[i], tmp ); // Q16
        move32();
    }

    index = 0;
    move16();
    FOR( Word16 split = 0; split < 2; ++split )
    {
        const Word16 *cdbk_ptr;
        Word16 j0, j1;
        Word16 dist_split;
        Word32 dist_min_fx;
        const Word16 cdbk_fix = 8; // 1.f / powf( 2, SNS_CDBKS_BITS_4_FRAC ) in Q15
        move16();
        const Word16 *const cdbk = &sns_1st_cdbk[split][core - 1][0];

        j0 = imult1616( split, split_len );
        j1 = add( j0, split_len );

        cdbk_ptr = cdbk;
        dist_min_fx = MAXVAL_WORD32;
        dist_split = 0;
        move32();
        move16();
        FOR( Word16 i = 0; i < 32; ++i )
        {
            Word32 dist_fx = 0;
            move32();
            FOR( Word16 j = j0; j < j1; ++j )
            {
                Word32 tmp;
                Word32 dist;
                Word16 tmp2;

                tmp = L_mult( *cdbk_ptr++, cdbk_fix ); // Q16
                dist = L_sub( snsq_fx[j],  tmp );
                dist = L_shr( dist, 4 ); // make sure that the next multiplication does not overflow

                tmp2 = extract_l( dist );
                dist = L_mult( tmp2, tmp2 );
                dist = L_shr( dist, 4 ); // make sure that the sum does not overflow
                dist_fx = L_add( dist_fx, dist );
            }

            IF( LT_32( dist_fx, dist_min_fx ) )
            {
                dist_min_fx = dist_fx;
                dist_split = i;
            }
        }

        /* set quantized vector */
        cdbk_ptr = &cdbk[imult1616( dist_split, split_len )];
        FOR( Word16 j = j0; j < j1; ++j )
        {
            Word32 tmp_3 = L_mult( means[j], means_fix );    // Q16
            Word32 tmp_4 = L_mult( *cdbk_ptr++, cdbk_fix ); // Q16
            snsq_fx[j] = L_add( tmp_4, tmp_3 );                 // Q16
            move32();
        }

        /* for second split shift by five bits to store both indices as one 10 bit value */
        if ( EQ_16( split, 1 ) )
        {
            dist_split = shl( dist_split, 5 );
        }

        index = add( index, dist_split );
    }
    pop_wmops();
    return index;
}

/*-------------------------------------------------------------------
 * sns_2st_cod()
 *
@@ -532,7 +374,7 @@ void sns_avq_cod_fx(
    Word16 indxt[256], nbits, nbt, nit;
    Word32 snsmid_q0_fx[M];

    index[0] = sns_1st_cod_fx_q15( sns_fx, L_frame, core, sns_q_fx );
    index[0] = sns_1st_cod_fx( sns_fx, exp_sns, L_frame, core, sns_q_fx );
    move16();
    nit = 1 + 2;
    move16();
@@ -559,8 +401,7 @@ void sns_avq_cod_fx(
    {
        index++;

        index[0] = sns_1st_cod_fx_q15( snsmid_fx, L_frame, core, snsmid_q_fx );
        //        index[0] = sns_1st_cod_fx( snsmid_fx, exp_snsmid, L_frame, core, snsmid_q_fx );
        index[0] = sns_1st_cod_fx( snsmid_fx, exp_snsmid, L_frame, core, snsmid_q_fx );
        move16();
        nit = 1 + 2;
        move16();