www.pudn.com > AVS_M_ver10.rar > 3gpp_mod.c


#include  
#include  
#include "../lib_amr/typedef.h" 
#include "../lib_amr/enc_util.h" 
#include "../include/int3gpp.h" 
#define L_FRAME16k   320        /* Frame size at 16kHz */ 
#define M16k         20         /* Order of LP filter */ 
#define L_WINDOW_PLUS 512       /* 448 low rate, 512 using EXTENSION_VA */ 
void E_LPC_isf_reorderPlus(float *isf, float min_dist, int n) 
{ 
    int i; 
    float isf_min; 
    isf_min = min_dist; 
    for (i = 0; i < n - 1; i++) 
    { 
        if (isf[i] < isf_min) 
        { 
            isf[i] = isf_min; 
        } 
        isf_min = isf[i] + min_dist; 
    } 
    return; 
} 
void E_UTIL_synthesisPlus(Float32 a[], Word32 m, Float32 x[], Float32 y[], Word32 l, Float32 mem[], Word32 update_m) 
{ 
    Float32 buf[L_FRAME16k + M16k];     /* temporary synthesis buffer */ 
    Float32 s; 
    Float32 *yy; 
    Word32 i, j; 
    /* copy initial filter states into synthesis buffer */ 
    memcpy(buf, mem, m * sizeof(Float32)); 
    yy = &buf[m]; 
    for (i = 0; i < l; i++) 
    { 
        s = x[i]; 
        for (j = 1; j <= m; j++) 
        { 
            s -= a[j] * yy[i - j]; 
        } 
        yy[i] = s; 
        y[i] = s; 
    } 
    /* Update memory if required */ 
    if (update_m) 
    { 
        memcpy(mem, &yy[l - m], m * sizeof(Float32)); 
    } 
    return; 
} 
void E_UTIL_residuPlus(Float32 * a, Word32 m, Float32 * x, Float32 * y, Word32 l) 
{ 
    Float32 s; 
    Word32 i, j; 
    for (i = 0; i < l; i++) 
    { 
        s = x[i]; 
        for (j = 1; j <= m; j++) 
        { 
            s += a[j] * x[i - j]; 
        } 
        y[i] = s; 
    } 
    return; 
} 
void E_UTIL_autocorrPlus(float *x,      /* input : input signal */ 
                         float *r,      /* output: autocorrelations vector */ 
                         int m, /* input : order of LP filter */ 
                         int n, /* input : window size */ 
                         float *fh      /* input : analysis window */ 
    ) 
{ 
    float t[L_WINDOW_PLUS]; 
    float s; 
    Word16 i, j; 
    for (i = 0; i < n; i++) 
    { 
        t[i] = x[i] * fh[i]; 
    } 
    for (i = 0; i <= m; i++) 
    { 
        s = 0.0; 
        for (j = 0; j < n - i; j++) 
        { 
            s += t[j] * t[j + i]; 
        } 
        r[i] = s; 
    } 
    if (r[0] < 1.0) 
    { 
        r[0] = 1.0; 
    } 
    return; 
}