Commit 32180c9b authored by Nicolas Roussin's avatar Nicolas Roussin
Browse files

Implement ivas_iir_2_filter_fx.

parent d4e14c83
Loading
Loading
Loading
Loading
Loading
+83 −95
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ void ivas_filters_init_fx(
            filter_state->den_q[IVAS_FILTER_STAGE_0][i] = Q30;
            move16();
            move16();
            // #else FIXME
#else
            filter_state->num_e[IVAS_FILTER_STAGE_0][i] = 1;
            filter_state->den_e[IVAS_FILTER_STAGE_0][i] = 1;
            move16();
@@ -81,13 +81,13 @@ void ivas_filters_init_fx(
        }

#ifdef OPT_2239_IVAS_FILTER_PROCESS
        filter_state->state64_fx[IVAS_FILTER_STAGE_0][0] = 0;
        filter_state->state64_fx[IVAS_FILTER_STAGE_0][1] = 0;
        filter_state->state64_fx[IVAS_FILTER_STAGE_0][2] = 0;
        filter_state->state_fx[IVAS_FILTER_STAGE_0][0] = 0;
        filter_state->state_fx[IVAS_FILTER_STAGE_0][1] = 0;
        filter_state->state_fx[IVAS_FILTER_STAGE_0][2] = 0;
        move64();
        move64();
        move64();
        // #else FIXME
#else
        filter_state->state_fx[IVAS_FILTER_STAGE_0][0] = 0;
        filter_state->state_fx[IVAS_FILTER_STAGE_0][1] = 0;
        filter_state->state_fx[IVAS_FILTER_STAGE_0][2] = 0;
@@ -126,7 +126,7 @@ void ivas_filters_init_fx(
            move16();
            move16();
            move16();
            // #else FIXME
#else
            filter_state->num_e[IVAS_FILTER_STAGE_0][i] = filt_coeff_e[i];
            filter_state->den_e[IVAS_FILTER_STAGE_0][i] = filt_coeff_e[i + IVAS_BIQUAD_FILT_LEN];
            filter_state->num_e[IVAS_FILTER_STAGE_1][i] = filt_coeff_e[i + IVAS_BIQUAD_FILT_LEN * 2];
@@ -139,19 +139,19 @@ void ivas_filters_init_fx(
        }

#ifdef OPT_2239_IVAS_FILTER_PROCESS
        filter_state->state64_fx[IVAS_FILTER_STAGE_0][0] = 0;
        filter_state->state64_fx[IVAS_FILTER_STAGE_0][1] = 0;
        filter_state->state64_fx[IVAS_FILTER_STAGE_0][2] = 0;
        filter_state->state64_fx[IVAS_FILTER_STAGE_1][0] = 0;
        filter_state->state64_fx[IVAS_FILTER_STAGE_1][1] = 0;
        filter_state->state64_fx[IVAS_FILTER_STAGE_1][2] = 0;
        filter_state->state_fx[IVAS_FILTER_STAGE_0][0] = 0;
        filter_state->state_fx[IVAS_FILTER_STAGE_0][1] = 0;
        filter_state->state_fx[IVAS_FILTER_STAGE_0][2] = 0;
        filter_state->state_fx[IVAS_FILTER_STAGE_1][0] = 0;
        filter_state->state_fx[IVAS_FILTER_STAGE_1][1] = 0;
        filter_state->state_fx[IVAS_FILTER_STAGE_1][2] = 0;
        move64();
        move64();
        move64();
        move64();
        move64();
        move64();
        // #else FIXME
#else
        filter_state->state_fx[IVAS_FILTER_STAGE_0][0] = 0;
        filter_state->state_fx[IVAS_FILTER_STAGE_0][1] = 0;
        filter_state->state_fx[IVAS_FILTER_STAGE_0][2] = 0;
@@ -183,8 +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 ivas_iir_2_filter_fx( ivas_filters_process_state_t *filter_state, const Word16 stage, const Word64 in );
static Word64 Mpy_64_32( Word64 W_var1, Word32 L_var2 );

/*-----------------------------------------------------------------------------------------*
@@ -212,48 +211,39 @@ static Word64 Mpy_64_32( Word64 W_var1, Word32 L_var2 )
}

/*-----------------------------------------------------------------------------------------*
 * Function ivas_iir_2_filter_fx32()
 * Function ivas_iir_2_filter_fx()
 *
 * Process call for filtering a signal
 * Process call for filtering a sample
 *-----------------------------------------------------------------------------------------*/

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

    FOR( i = 0; i < length; i++ )
    const Word16 stage,
    const Word64 in )
{
        in = W_deposit32_h( pIn_Out_fx[i] );
        move32();
    Word64 tmp_prod, tmp, out;
    Word16 j, 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 );

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

    FOR( j = 1; j < filter_state->filt_len; j++ )
    {
        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 );
        tmp = W_add( filter_state->state_fx[stage][j], tmp_prod );

        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 );
        filter_state->state_fx[stage][j - 1] = W_sub( tmp, tmp_prod );
        move32();
    }
    }

    return;
    return out;
}

/*-----------------------------------------------------------------------------------------*
@@ -267,61 +257,38 @@ void ivas_filter_process_fx32(
    Word32 *pIn_Out_fx,                         /* i/o: signal subject to filtering Q(q)   */
    const Word16 length )                       /* i  : filter order                    */
{
    Word64 in, out;
    Word16 i;

    SWITCH( filter_state->order )
    {
        case IVAS_FILTER_ORDER_1:
            ivas_iir_2_filter_fx32( filter_state, pIn_Out_fx, length, IVAS_FILTER_STAGE_0 );
            BREAK;
        case IVAS_FILTER_ORDER_4:
            ivas_iir_2_filter_fx32( filter_state, pIn_Out_fx, length, IVAS_FILTER_STAGE_0 );
            ivas_iir_2_filter_fx32( filter_state, pIn_Out_fx, length, IVAS_FILTER_STAGE_1 );
            BREAK;
        default:
            BREAK;
    }

    return;
}

/*-----------------------------------------------------------------------------------------*
 * Function ivas_iir_2_filter_fx64()
 *
 * Process call for filtering a signal
 *-----------------------------------------------------------------------------------------*/

static void ivas_iir_2_filter_fx64(
    ivas_filters_process_state_t *filter_state,
    Word64 *pIn_Out_fx,
    const Word16 length,
    const Word16 stage )
{
    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 );
        tmp_prod = W_shr( Mpy_64_32( in, filter_state->num_fx[stage][0] ), shift );
                out = ivas_iir_2_filter_fx( filter_state, IVAS_FILTER_STAGE_0, in );

        pIn_Out_fx[i] = 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++ )
            }
            BREAK;
        case IVAS_FILTER_ORDER_4:
            FOR( i = 0; i < length; i++ )
            {
            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 );
                in = W_deposit32_h( pIn_Out_fx[i] );
                move32();

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

            filter_state->state64_fx[stage][j - 1] = W_sub( tmp, tmp_prod );
                pIn_Out_fx[i] = W_extract_h( out );
                move32();
            }
            BREAK;
        default:
            BREAK;
    }

    return;
@@ -339,14 +306,35 @@ void ivas_filter_process_fx64(
    const Word16 length )                       /* i  : filter order                    */

{
    Word64 in, out;
    Word16 i;

    SWITCH( filter_state->order )
    {
        case IVAS_FILTER_ORDER_1:
            ivas_iir_2_filter_fx64( filter_state, pIn_Out_fx, length, IVAS_FILTER_STAGE_0 );
            FOR( i = 0; i < length; i++ )
            {
                in = pIn_Out_fx[i];
                move64();

                out = ivas_iir_2_filter_fx( filter_state, IVAS_FILTER_STAGE_0, in );

                pIn_Out_fx[i] = out;
                move64();
            }
            BREAK;
        case IVAS_FILTER_ORDER_4:
            ivas_iir_2_filter_fx64( filter_state, pIn_Out_fx, length, IVAS_FILTER_STAGE_0 );
            ivas_iir_2_filter_fx64( filter_state, pIn_Out_fx, length, IVAS_FILTER_STAGE_1 );
            FOR( i = 0; i < length; i++ )
            {
                in = pIn_Out_fx[i];
                move64();

                out = ivas_iir_2_filter_fx( filter_state, IVAS_FILTER_STAGE_0, in );
                out = ivas_iir_2_filter_fx( filter_state, IVAS_FILTER_STAGE_1, out );

                pIn_Out_fx[i] = out;
                move64();
            }
            BREAK;
        default:
            BREAK;
@@ -355,7 +343,7 @@ void ivas_filter_process_fx64(
    return;
}

// #else FIXME
#else
static void ivas_iir_2_filter_fx( ivas_filters_process_state_t *filter_state, Word32 *pIn_Out_fx, const Word16 length, const Word16 stage, Word16 *pIn_Out_e );

/*-----------------------------------------------------------------------------------------*
+1 −1
Original line number Diff line number Diff line
@@ -3815,7 +3815,7 @@ void ivas_filter_process_fx64(
    Word64 *pIn_Out_fx,                                         /* i  : signal subject to filtering                     */
    const Word16 length                                         /* i  : filter order                                    */
);
// #else FIXME
#else
void ivas_filter_process_fx(
    ivas_filters_process_state_t *filter_state,                 /* i/o: filter state handle                             */
    Word32 *pIn_Out_fx,                                         /* i  : signal subject to filtering                     */
+2 −2
Original line number Diff line number Diff line
@@ -657,10 +657,10 @@ typedef struct ivas_filters_process_state_t
    Word32 num_fx[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN];
    Word32 den_fx[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN];
#ifdef OPT_2239_IVAS_FILTER_PROCESS
    Word64 state64_fx[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN];
    Word64 state_fx[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN];
    Word16 num_q[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN];
    Word16 den_q[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN];
    // #else FIXME
#else
    Word32 state_fx[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN];
    Word16 num_e[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN];
    Word16 den_e[IVAS_FILTER_MAX_STAGES][IVAS_BIQUAD_FILT_LEN];