Commit 9975eec7 authored by thomas dettbarn's avatar thomas dettbarn
Browse files

first draft of the improvement.

parent 08641917
Loading
Loading
Loading
Loading
Loading
+100 −2
Original line number Diff line number Diff line
@@ -171,6 +171,103 @@ static Word16 sns_1st_cod_fx(
    return index;
}

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_add(sns_fx[i], L_negate( tmp ) );
        move32();
    }

    index = 0;
    move16();
    FOR( Word16 split = 0; split < 2; ++split )
    {
        const Word16 *cdbk_ptr;
        Word16 j0, j1;
	Word16 dist_split;
	Word64 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 = 0x7fffffffffffffffull;
        dist_split = 0;
	FOR( Word16 i = 0; i < 32; ++i )
	{
		Word64 dist_fx = 0;
		move64();
		FOR( Word16 j = j0; j < j1; ++j )
		{
			Word32 dist;
			Word32 tmp_1 = L_mult( ( *cdbk_ptr++ ), cdbk_fix ); // Q16
			move16();
			dist = ( L_add(snsq_fx[j], L_negate( tmp_1 ) ) );
			dist_fx = W_mac_32_32( dist_fx, dist, dist );
		}

		if ( LT_64( 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()
 *
@@ -276,7 +373,7 @@ void sns_avq_cod_fx(
    Word16 indxt[256], nbits, nbt, nit;
    Word32 snsmid_q0_fx[M];

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

        index[0] = sns_1st_cod_fx( snsmid_fx, exp_snsmid, L_frame, core, snsmid_q_fx );
        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 );
        move16();
        nit = 1 + 2;
        move16();