www.pudn.com > p_voice.rar > PHDISP.C


/* 
   ITU-T G.729 Annex C+ - Reference C code for floating point 
                         implementation of G.729 Annex C+ 
                         (integration of Annexes B, D and E) 
                          Version 2.1 of October 1999 
*/ 
 
/* 
 File : PHDISP.C 
 */ 
#include "typedef.h" 
#include "ld8k.h" 
#include "ld8cp.h" 
#include "tabld8cp.h" 
 
/*-----------------------------------------------------------* 
* Static memory allocation.                                 * 
*-----------------------------------------------------------*/ 
 
static int prevDispState = 0; 
static FLOAT gainMem[6]={(F)0.0, (F)0.0, (F)0.0, (F)0.0, (F)0.0, (F)0.0}; 
static FLOAT prevCbGain = (F)0.0; 
static int onset = 0; 
 
/*-----------------------------------------------------------* 
* Update_PhDisp- Updates state machine for phase dispersion     * 
* in 6.4 kbps mode, when running in others modes.          * 
*-----------------------------------------------------------*/ 
void Update_PhDisp( 
    FLOAT ltpGain,   /* (i)  : pitch gain                  */ 
    FLOAT cbGain     /* (i)  : codebook gain               */ 
) 
{ 
    int i; 
 
    for (i = 5; i > 0; i--) gainMem[i] = gainMem[i-1]; 
    gainMem[0] = ltpGain; 
    prevDispState = 2; 
    prevCbGain = cbGain; 
    onset = 0; 
 
    return; 
} 
 
/*-----------------------------------------------------------* 
* PhDisp - phase dispersion  in 6.4 kbps mode               * 
*-----------------------------------------------------------*/ 
void PhDisp( 
    FLOAT x[],       /* input : excitation signal                */ 
    FLOAT x_phdisp[],/* output : excitation signal after phase dispersion */ 
    FLOAT cbGain, 
    FLOAT ltpGainQ, 
    FLOAT inno[] 
) 
{ 
    int  i; 
 
    FLOAT ScaledLtpEx[L_SUBFR]; 
    FLOAT inno_sav[L_SUBFR]; 
    int ps_poss[L_SUBFR]; 
    int nze, nPulse, i1, i2, ppos; 
    int dispState; 
 
    /* anti-sparseness post-processing */ 
    for (i = 0; i < L_SUBFR;  i++) { 
        ScaledLtpEx[i] = x[i] - cbGain*inno[i]; 
        inno_sav[i] = inno[i]; 
        inno[i] = (F)0.0; 
    } 
 
    nze=0; 
    for (i=0; i (F)0.6)&&(ltpGainQ < (F)0.9) ) { 
        dispState = 1; 
    } 
    else { 
        dispState = 2; 
    } 
 
    for (i = 5; i > 0; i--) { 
        gainMem[i]=gainMem[i-1]; 
    } 
    gainMem[0] = ltpGainQ; 
     
    if (cbGain > (F)2.0 * prevCbGain) 
        onset = 2; 
    else { 
        if (onset) onset -= 1; 
    } 
 
    i1=0; 
    for (i = 0; i < 6; i++) { 
        if (gainMem[i] < (F)0.6) i1 += 1; 
    } 
    if (i1 > 2 && !onset) dispState = 0; 
 
    if (dispState - prevDispState > 1 && !onset) dispState -= 1; 
 
    if (onset) { 
        if (dispState < 2) dispState++; 
    } 
 
    prevDispState=dispState; 
    prevCbGain = cbGain; 
 
    if (dispState == 0) { 
        for (nPulse=0; nPulse