⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pitchcp.c

📁 语音压缩编码中的g729p编码程序
💻 C
📖 第 1 页 / 共 2 页
字号:
        
        for (i = -1; i <= 2; i++)
        {
            corr_int = interpol_3(&corr[lag], i);
            if(corr_int > max)
            {
                max = corr_int;
                frac = i;
            }
        }
    }
    
    
    /* limit the fraction value in the interval [-1,0,1] */
    
    if (frac == -2)
    {
        frac = 1;
        lag -= 1;
    }
    if (frac == 2)
    {
        frac = -1;
        lag += 1;
    }
    
    *pit_frac = frac;
    
    return lag;
}

/*----------------------------------------------------------------------------
* norm_corr - Find the normalized correlation between the target vector and
*             the filtered past excitation.
*----------------------------------------------------------------------------
*/
static void norm_corr(
    FLOAT exc[],           /* input : excitation buffer */
    FLOAT xn[],            /* input : target vector */
    FLOAT h[],             /* input : imp response of synth and weighting flt */
    int l_subfr,           /* input : Length of frame to compute pitch */
    int t_min,             /* input : minimum value of searched range */
    int t_max,             /* input : maximum value of search range */
    FLOAT corr_norm[]      /* output: normalized correlation (correlation 
                                       between target and filtered excitation 
                                       divided by the square root of energy of 
                                       filtered excitation) */
)
{
    int    i, j, k;
    FLOAT excf[L_SUBFR];     /* filtered past excitation */
    FLOAT  alp, s, norm;
    
    k = -t_min;
    
    /* compute the filtered excitation for the first delay t_min */
    convolve(&exc[k], h, excf, l_subfr);
    
    /* loop for every possible period */
    for (i = t_min; i <= t_max; i++)
    {
        /* Compute 1/sqrt(energie of excf[]) */
        alp = (F)0.01;
        for (j = 0; j < l_subfr; j++)
            alp += excf[j]*excf[j];
        
        norm = inv_sqrt(alp);
        
        /* Compute correlation between xn[] and excf[] */
        s = (F)0.0;
        for (j = 0; j < l_subfr; j++)  s += xn[j]*excf[j];
        
        /* Normalize correlation = correlation * (1/sqrt(energie)) */
        corr_norm[i] = s*norm;
        
        /* modify the filtered excitation excf[] for the next iteration */
        if (i != t_max)
        {
            k--;
            for (j = l_subfr-1; j > 0; j--)
                excf[j] = excf[j-1] + exc[k]*h[j];
            excf[0] = exc[k];
        }
    }
    
    return;
    
}
/*----------------------------------------------------------------------------
* g_pitch - compute adaptive codebook gain and compute <y1,y1> , -2<xn,y1>
*----------------------------------------------------------------------------
*/
FLOAT g_pitch(          /* output: pitch gain */
    FLOAT xn[],            /* input : target vector */
    FLOAT y1[],            /* input : filtered adaptive codebook vector */
    FLOAT g_coeff[],       /* output: <y1,y1> and -2<xn,y1> */
    int l_subfr            /* input : vector dimension */
)
{
    FLOAT xy, yy, gain;
    int   i;
    
    xy = (F)0.0;
    for (i = 0; i < l_subfr; i++) {
        xy += xn[i] * y1[i];
    }
    yy = (F)0.01;
    for (i = 0; i < l_subfr; i++) {
        yy += y1[i] * y1[i];          /* energy of filtered excitation */
    }
    g_coeff[0] = yy;
    g_coeff[1] = (F)-2.0*xy +(F)0.01;
    
    /* find pitch gain and bound it by [0,1.2] */
    gain = xy/yy;
    
    if (gain<(F)0.0)  gain = (F)0.0;
    if (gain>GAIN_PIT_MAX) gain = GAIN_PIT_MAX;
    
    return gain;
}

/*----------------------------------------------------------------------*
*    Function enc_lag3cp()                                             *
*             ~~~~~~~~~~                                               *
*   Encoding of fractional pitch lag with 1/3 resolution.              *
*----------------------------------------------------------------------*
* The pitch range for the first subframe is divided as follows:        *
*   19 1/3  to   84 2/3   resolution 1/3                               *
*   85      to   143      resolution 1                                 *
*                                                                      *
* The period in the first subframe is encoded with 8 bits.             *
* For the range with fractions:                                        *
*   index = (T-19)*3 + frac - 1;   where T=[19..85] and frac=[-1,0,1]  *
* and for the integer only range                                       *
*   index = (T - 85) + 197;        where T=[86..143]                   *
*----------------------------------------------------------------------*
* For the second subframe a resolution of 1/3 is always used, and the  *
* search range is relative to the lag in the first subframe.           *
* If t0 is the lag in the first subframe then                          *
*  t_min=t0-5   and  t_max=t0+4   and  the range is given by           *
*       t_min - 2/3   to  t_max + 2/3                                  *
*                                                                      *
* The period in the 2nd subframe is encoded with 5 bits:               *
*   index = (T-(t_min-1))*3 + frac - 1;    where T[t_min-1 .. t_max+1] *
*----------------------------------------------------------------------*/
int  enc_lag3cp(    /* output: Return index of encoding */
    int  T0,         /* input : Pitch delay              */
    int  T0_frac,    /* input : Fractional pitch delay   */
    int  *T0_min,    /* in/out: Minimum search delay     */
    int  *T0_max,    /* in/out: Maximum search delay     */
    int  pit_min,    /* input : Minimum pitch delay      */
    int  pit_max,    /* input : Maximum pitch delay      */
    int  pit_flag,   /* input : Flag for 1st subframe    */
    int  rate
)
{
    int index;
    
    if (pit_flag == 0)   /* if 1st subframe */
    {
        /* encode pitch delay (with fraction) */
        
        if (T0 <= 85)
            index = T0*3 - 58 + T0_frac;
        else
            index = T0 + 112;
        
        /* find T0_min and T0_max for second subframe */
        
        *T0_min = T0 - 5;
        if (*T0_min < pit_min) *T0_min = pit_min;
        *T0_max = *T0_min + 9;
        if (*T0_max > pit_max)
        {
            *T0_max = pit_max;
            *T0_min = *T0_max - 9;
        }
    }
    
    else                    /* second subframe */
    {
        if (rate == G729D) {      /* 4 bits in 2nd subframe (6.4 kbps) */
            if (T0 < *T0_min + 3)
                index = T0 - *T0_min;
            else if (T0 < *T0_min + 7)
                index = (T0 - (*T0_min + 3)) * 3 + T0_frac + 3;
            else
                index = (T0 - (*T0_min + 7)) + 13;
        }
        else {
            index = T0 - *T0_min;
            index = index*3 + 2 + T0_frac;
        }
        
    }
    return index;
}

/*----------------------------------------------------------------------------
* interpol_3 - For interpolating the normalized correlation
*----------------------------------------------------------------------------
*/
static FLOAT interpol_3(   /* output: interpolated value */
    FLOAT *x,              /* input : function to be interpolated */
    int frac               /* input : fraction value to evaluate */
)
{
    int i;
    FLOAT s, *x1, *x2, *c1, *c2;
    
    if (frac < 0) {
        frac += UP_SAMP;
        x--;
    }
    x1 = &x[0];
    x2 = &x[1];
    c1 = &inter_3[frac];
    c2 = &inter_3[UP_SAMP-frac];
    
    s = (F)0.0;
    for(i=0; i< L_INTER4; i++, c1+=UP_SAMP, c2+=UP_SAMP)
        s+= (*x1--) * (*c1) + (*x2++) * (*c2);
    
    return s;
}

/*----------------------------------------------------------------------------
* inv_sqrt - compute y = 1 / sqrt(x)
*----------------------------------------------------------------------------
*/
static FLOAT inv_sqrt(         /* output: 1/sqrt(x) */
    FLOAT x                /* input : value of x */
)
{
    return ((F)1.0 / (FLOAT)sqrt((double)x) );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -