Commit dedd3823 authored by Nicolas Roussin's avatar Nicolas Roussin
Browse files

Increase precision in ivas_iir_2_filter_fx32.

parent 291b4903
Loading
Loading
Loading
Loading
+15 −22
Original line number Diff line number Diff line
@@ -183,6 +183,7 @@ void ivas_filters_init_fx(
}

#ifdef OPT_2239_IVAS_FILTER_PROCESS
static void ivas_iir_2_filter_fx32( ivas_filters_process_state_t *filter_state, Word32 *pIn_Out_fx, const Word16 length, const Word16 stage );
static void ivas_iir_2_filter_fx64( ivas_filters_process_state_t *filter_state, Word64 *pIn_Out_fx, const Word16 length, const Word16 stage );
static Word64 Mpy_64_32( Word64 W_var1, Word32 L_var2 );

@@ -215,38 +216,37 @@ static Word64 Mpy_64_32( Word64 W_var1, Word32 L_var2 )
 *
 * Process call for filtering a signal
 *-----------------------------------------------------------------------------------------*/
#if 0
static void ivas_iir_2_filter_fx32( ivas_filters_process_state_t *filter_state, Word32 *pIn_Out_fx, const Word16 length, const Word16 stage );

static void ivas_iir_2_filter_fx32(
    ivas_filters_process_state_t *filter_state,
    Word32 *pIn_Out_fx,
    const Word16 length,
    const Word16 stage )
{
    Word64 tmp_prod, tmp;
    Word32 in, out;
    Word64 tmp_prod, tmp, in, out;
    Word16 i, j, shift;

    FOR( i = 0; i < length; i++ )
    {
        in = pIn_Out_fx[i];
        in = W_deposit32_h( pIn_Out_fx[i] );
        move32();

        shift = sub( filter_state->num_q[stage][0], 31 ); // (num_q + q + 1) - (q + 32)
        tmp_prod = W_shr( W_mult_32_32( filter_state->num_fx[stage][0], in ), shift );
        shift = sub( filter_state->num_q[stage][0], 31 );
        tmp_prod = W_shr( Mpy_64_32( in, filter_state->num_fx[stage][0] ), shift );

        pIn_Out_fx[i] = out = W_extract_h( W_add( filter_state->state64_fx[stage][0], tmp_prod ) );
        out = W_add( filter_state->state64_fx[stage][0], tmp_prod );
        pIn_Out_fx[i] = W_extract_h( out );
        move32();

        FOR( j = 1; j < filter_state->filt_len; j++ )
        {
            shift = sub( filter_state->num_q[stage][j], 31 );
            tmp_prod = W_shr( W_mult_32_32( filter_state->num_fx[stage][j], in ), shift );
            tmp_prod = W_shr( Mpy_64_32( in, filter_state->num_fx[stage][j] ), shift );

            tmp = W_add( filter_state->state64_fx[stage][j], tmp_prod );

            shift = sub( filter_state->den_q[stage][j], 31 );
            tmp_prod = W_shr( W_mult_32_32( filter_state->den_fx[stage][j], out ), shift );
            tmp_prod = W_shr( Mpy_64_32( out, filter_state->den_fx[stage][j] ), shift );

            filter_state->state64_fx[stage][j - 1] = W_sub( tmp, tmp_prod );
            move32();
@@ -255,7 +255,6 @@ static void ivas_iir_2_filter_fx32(

    return;
}
#endif

/*-----------------------------------------------------------------------------------------*
 * Function ivas_filter_process_fx32()
@@ -266,12 +265,8 @@ static void ivas_iir_2_filter_fx32(
void ivas_filter_process_fx32(
    ivas_filters_process_state_t *filter_state, /* i/o: filter state handle             */
    Word32 *pIn_Out_fx,                         /* i/o: signal subject to filtering Q(q)   */
    const Word16 length,                        /* i  : filter order                    */
    Word16 q )
    const Word16 length )                       /* i  : filter order                    */
{
#if 1
    ivas_filter_process_fx( filter_state, pIn_Out_fx, length, q );
#else
    SWITCH( filter_state->order )
    {
        case IVAS_FILTER_ORDER_1:
@@ -284,7 +279,6 @@ void ivas_filter_process_fx32(
        default:
            BREAK;
    }
#endif

    return;
}
@@ -309,21 +303,20 @@ static void ivas_iir_2_filter_fx64(
        in = pIn_Out_fx[i];
        move32();

        shift = sub( filter_state->num_q[stage][0], 30 );
        shift = sub( filter_state->num_q[stage][0], 31 );
        tmp_prod = W_shr( Mpy_64_32( in, filter_state->num_fx[stage][0] ), shift );

        out = W_add( filter_state->state64_fx[stage][0], tmp_prod );
        pIn_Out_fx[i] = W_shl( out, 1 );
        pIn_Out_fx[i] = out = W_add( filter_state->state64_fx[stage][0], tmp_prod );
        move32();

        FOR( j = 1; j < filter_state->filt_len; j++ )
        {
            shift = sub( filter_state->num_q[stage][j], 30 );
            shift = sub( filter_state->num_q[stage][j], 31 );
            tmp_prod = W_shr( Mpy_64_32( in, filter_state->num_fx[stage][j] ), shift );

            tmp = W_add( filter_state->state64_fx[stage][j], tmp_prod );

            shift = sub( filter_state->den_q[stage][j], 30 );
            shift = sub( filter_state->den_q[stage][j], 31 );
            tmp_prod = W_shr( Mpy_64_32( out, filter_state->den_fx[stage][j] ), shift );

            filter_state->state64_fx[stage][j - 1] = W_sub( tmp, tmp_prod );
+1 −2
Original line number Diff line number Diff line
@@ -3807,8 +3807,7 @@ void ivas_lfe_enc_fx(
void ivas_filter_process_fx32(
    ivas_filters_process_state_t *filter_state,                 /* i/o: filter state handle                             */
    Word32 *pIn_Out_fx,                                         /* i  : signal subject to filtering                     */
    const Word16 length,                                        /* i  : filter order                                    */
    Word16 q 
    const Word16 length                                         /* i  : filter order                                    */
);

void ivas_filter_process_fx64(
+1 −1
Original line number Diff line number Diff line
@@ -409,7 +409,7 @@ void ivas_lfe_dec_fx(
    {
        /* Low Pass Filter */
#ifdef OPT_2239_IVAS_FILTER_PROCESS
        ivas_filter_process_fx32( &hLFE->filter_state, output_lfe_ch, output_frame, q_out );
        ivas_filter_process_fx32( &hLFE->filter_state, output_lfe_ch, output_frame );
#else
        ivas_filter_process_fx( &hLFE->filter_state, output_lfe_ch, output_frame, q_out );
#endif
+1 −1
Original line number Diff line number Diff line
@@ -685,7 +685,7 @@ void ivas_lfe_lpf_enc_apply_fx(
)
{
#ifdef OPT_2239_IVAS_FILTER_PROCESS
    ivas_filter_process_fx32( hLfeLpf, data_lfe_ch, input_frame, (Word16) Q11 );
    ivas_filter_process_fx32( hLfeLpf, data_lfe_ch, input_frame );
#else
    ivas_filter_process_fx( hLfeLpf, data_lfe_ch, input_frame, (Word16) Q11 );
#endif