Commit 1e92c06d authored by Jiaquan Huo's avatar Jiaquan Huo
Browse files

restructure lfeplc_lev_dur main loop

parent 3412f68f
Loading
Loading
Loading
Loading
+72 −1
Original line number Diff line number Diff line
@@ -64,7 +64,7 @@
#define EPS_STOP          1e-5
#endif


#if 0
#ifndef NONE_BE_FIX_816_LFE_PLC_FLOAT
/*------------------------------------------------------------------------------------------*
 * Static function declarations
@@ -290,6 +290,77 @@ static int16_t lfeplc_lev_dur(

    return ( flag );
}
#else
/*---------------------------------------------------------------------*
 * lfeplc_lev_dur()
 *
 * Wiener-Levinson-Durbin algorithm to compute LP parameters from the autocorrelations
 * of input signal
 *---------------------------------------------------------------------*/

/*! r: stability flag */
static int16_t lfeplc_lev_dur(
    float *a_out,   /* o  : LP coefficients (a[0] = 1.0) */
    const float *r, /* i  : vector of autocorrelations   */
    const int16_t m /* i  : order of LP filter           */
)
{
    int16_t i, j, l;
    float buf[TCXLTP_LTP_ORDER];
    float *rc; /* reflection coefficients  0,...,m-1 */
    float s, at, err;
    float a[LFE_PLC_LPCORD + 1] = { 0.0f };

    set_f( a_out, 0.f, LFE_PLC_LPCORD + 1);
    rc = &buf[0];
    a[0] = 1.f;
    err = r[0];
    a_out[0] = a[0];
    rc[0] = ( -r[1] ) / r[0];
    s = r[1];
    a[1] = rc[0];
    a_out[1] = a[1];
    err += rc[0] * s;
    s += r[2] * a[1];
    rc[1] = ( -s ) / err;

    i = 2;
    while ( i < m )
    {
        for ( j = 1; j <= i / 2; j++ )
        {
            l = i - j;
            at = a[j] + rc[i - 1] * a[l];
            a[l] += rc[i - 1] * a[j];
            a[j] = at;
        }

        a[i] = rc[i - 1];
        err += rc[i - 1] * s;
        s = 0.f;
        i++;
        for ( j = 0; j < i; j++ )
        {
            s += r[i - j] * a[j];
        }
        rc[i - 1] = ( -s ) / err;
        if ( fabsf( rc[i - 1] ) > 0.99945f )
        {
            return 1;
        }
        else
        {
            for ( j = 0; j <= m; j++ )
            {
                a_out[j] = a[j];
            }
        }
    }

    return 0;
}

#endif

#ifndef NONE_BE_FIX_816_LFE_PLC_FLOAT
/*-------------------------------------------------------------------*