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

📄 phdisp.c

📁 ITU-T在1996年3月公布了G.729建议的8Kbit/s共轭结构代数码激励线性预测(CS-ACELP)语音编码方案
💻 C
字号:
/*
    ITU-T G.729 Annex I  - Reference C code for fixed point
                         implementation of G.729 Annex I
                         Version 1.1 of October 1999
*/
/*
 File : phdisp.c
 */

/* extracted from filterd.c G729 Annex D Version 1.2  Last modified: May 1998 */

#include "typedef.h"
#include "basic_op.h"
#include "ld8k.h"
#include "ld8cp.h"
#include "tab_ld8k.h"
#include "tabld8cp.h"
/*--------------------------------------------------------*
 *         Static memory allocation.                      *
 *--------------------------------------------------------*/
static Word16 gainMem[6] = {0, 0, 0, 0, 0, 0};
static Word16 prevState = 0;
static Word16 prevCbGain = 0;
static Word16 onset = 0;
/*-----------------------------------------------------------*
* Update_PhDisp- Updates state machine for phase dispersion     *
* in 6.4 kbps mode, when running in others modes.          *
*-----------------------------------------------------------*/
void Update_PhDisp(
                   Word16 ltpGain,   /* (i) Q14 : pitch gain                  */
                   Word16 cbGain     /* (i) Q1  : codebook gain               */
                   )
{
    Word16 i;
    for (i = 5; i > 0; i--) gainMem[i] = gainMem[i-1];
    gainMem[0] = ltpGain;
    
    prevState = 2;
    prevCbGain = cbGain;
    onset = 0;
    
    return;
}

/*-----------------------------------------------------------*
* PhDisp - phase dispersion  in 6.4 kbps mode               *
*-----------------------------------------------------------*/
void PhDisp(
            Word16 x[],     /* (i)   Q0  : excitation signal                */
            Word16 x_phdisp[],/*(o)  Q0  : excitation signal after phase dispersion */
            Word16 cbGain,  /* (i)   Q1  : Codebook gain                    */
            Word16 ltpGain, /* (i)   Q14 : LTP gain                         */
            Word16 inno[]   /* (i)   Q13 : Innovation vector                */
            )
{
    Word16 i;
    Word16 tmp1;
    Word16 ScaledLtpEx[L_SUBFR];
    Word16 inno_sav[L_SUBFR];
    Word16 ps_poss[L_SUBFR];
    Word16 nze, iii, nPulse, i1, j1, i2, j2, ppos;
    Word16 dState, testState;
    
    /* phase dispersion: ph_imp_low[] and ph_imp_mid[] are given in
    tab_ld8c.c and All-Pass filter ph_imp_high[] is calculated here */
    Word16 *ph_imp;   /* Pointer to phase dispersion filter */
    Word16 ph_imp_high[L_SUBFR];
    ph_imp_high[0]=32767;
    for (i = 1; i < L_SUBFR;  i++) ph_imp_high[i] = 0;
    
    for (i = 0; i < L_SUBFR;  i++) {
        /* ScaledLtpEx[i] = x[i] - cbGain*inno[i] */
        tmp1 = round(L_shl(L_mult(cbGain, inno[i]), 1));
        ScaledLtpEx[i] = sub(x[i], tmp1);
        inno_sav[i] = inno[i];
        inno[i] = 0;
    }
    
    nze=0;
    for (iii=0; iii<L_SUBFR; iii++) {
        if (inno_sav[iii] != 0) ps_poss[nze++] = iii;
    }
    
    if (sub(ltpGain, 14745) < 0) {    /* if (ltpGain < 0.9) */
        if (sub(ltpGain, 9830) > 0) { /* if (ltpGain > 0.6 */
            dState = 1;
        }
        else {
            dState = 0;
        }
    }
    else {
        dState = 2;
    }
    
    for (i = 5; i > 0; i--) gainMem[i] = gainMem[i-1];
    gainMem[0] = ltpGain;
    
    if (sub(shr(cbGain, 1), prevCbGain) > 0)
        onset = 2;
    else {
        onset--;
        if (onset < 0) onset = 0;
    }
    
    i1 = 0;
    for (i = 0; i < 6; i++) {
        if (sub(gainMem[i], 9830) < 0) i1 += 1;
    }
    if (sub(i1, 2) > 0)
        if (!onset) dState = 0;
        
    testState = add(prevState, 1);
    if (sub(dState, testState) > 0)
        if (!onset) dState -= 1;
        
    if (onset)
        if (sub(dState, 2) < 0) dState++;
        
    prevState = dState;
    prevCbGain = cbGain;
        
    if (sub(dState, 2) < 0) {
        if (dState) {
            ph_imp = ph_imp_mid;
        }
        else {
            ph_imp = ph_imp_low;
        }
    }
    else {
        ph_imp = ph_imp_high;
    }
                
    for (nPulse=0; nPulse<nze; nPulse++) {
        ppos = ps_poss[nPulse];
        
        for (i1=ppos, j1=0; i1<L_SUBFR; i1++, j1++) {
            /* inno[i1] += inno_sav[ppos] * ph_imp[i1-ppos] */
            tmp1 = mult(inno_sav[ppos], ph_imp[j1]);
            inno[i1] = add(inno[i1], tmp1);
        }
        j2=sub(L_SUBFR, ppos);
        for (i2=0; i2 < ppos; i2++, j2++) {
            /* inno[i2] += inno_sav[ppos] * ph_imp[L_SUBFR-ppos+i2] */
            tmp1 = mult(inno_sav[ppos], ph_imp[L_SUBFR-ppos+i2]);
            inno[i2] = add(inno[i2], tmp1);
        }
    }
    for (i = 0; i < L_SUBFR;  i++) {
        /* newTotEx[i] = ScaledLtpEx[i] + cbGain*inno[i]; */
        tmp1 = round(L_shl(L_mult(cbGain, inno[i]), 1));
        x_phdisp[i] = add(ScaledLtpEx[i], tmp1);
    }
                
    return;
}

⌨️ 快捷键说明

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