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

📄 encg729.c

📁 G.711,G.723.1,G.726,G.729,GSM CODEC C/C++ code
💻 C
📖 第 1 页 / 共 5 页
字号:
    ippsCopy_16s(&speechHistory[LP_FRAME_DIM], &speechHistory[0], SPEECH_BUF_DIM-LP_FRAME_DIM);
    ippsCopy_16s(&prevWgtSpeech[LP_FRAME_DIM], &prevWgtSpeech[0], MAX_PITCH_LAG);
    ippsCopy_16s(&prevExcitat[LP_FRAME_DIM], &prevExcitat[0], L_prevExcitat);
    encoderObj->prevLPmode = lpMode;

    encoderObj->betaPreFilter = betaPreFilter;
    if((encoderObj->codecType == G729_CODEC)&&(vadEnable != 1)) {
        anau = encoderObj->encPrm;
    } else if(encoderObj->codecType == G729E_CODEC) {
        anau = encoderObj->encPrm+2;
    } else {
        anau = encoderObj->encPrm+1;
    }
    if(encoderObj->codecType == G729_CODEC) {
        *frametype=3;
        dst[0] = anau[0] & 255;
        dst[1] = (anau[1] & 0x3ff) >> 2;
        dst[2] = ((anau[1] & 3) << 6) | ((anau[2]>>2)&0x3f) ;
        dst[3] = ((anau[2] & 3) << 6) | ((anau[3] & 1) << 5) | ((anau[4] & 8191) >> 8) ;
        dst[4] = anau[4] & 255;
        dst[5] = ((anau[5] & 15)<<4) | ((anau[6] & 127) >> 3);
        dst[6] = ((anau[6] & 7)<< 5) | (anau[7] & 31);
        dst[7] = (anau[8] & 8191) >> 5;
        dst[8] = ((anau[8] & 31) << 3) | ((anau[9] & 15) >> 1);
        dst[9] = ((anau[9] & 1) << 7) | (anau[10] & 127);
    } else if(encoderObj->codecType == G729D_CODEC) {
        *frametype=2;
        dst[0] = anau[0] & 255;
        dst[1] = (anau[1] & 0x3ff) >> 2;
        dst[2] = ((anau[1] & 3) << 6) | ((anau[2]>>2)&0x3f);
        dst[3] = ((anau[2] & 3) << 6) | ((anau[3]>>3)&0x3f);
        dst[4] = ((anau[3] & 7) << 5) | ((anau[4] & 3) << 3) | ((anau[5] >> 3)& 7);
        dst[5] = ((anau[5] & 7) << 5) | ((anau[6] & 15) << 1)| ((anau[7] >> 8)& 1);
        dst[6] = anau[7] & 255;
        dst[7] = (anau[8] & 3) << 6 | (anau[9] & 0x3f);
    } else if(encoderObj->codecType == G729E_CODEC) {
        *frametype=4;
        if(lpMode == 0) { /* forward */
            dst[0] = (anau[0] >> 2) & 0x3f;
            dst[1] = ((anau[0] & 3) << 6) | ((anau[1]>>4)&0x3f);
            dst[2] = ((anau[1] & 15) << 4) | ((anau[2]>>4)&15);
            dst[3] = ((anau[2] & 15) << 4) | ((anau[3]&1)<<3) | ((anau[4]>>4)&7);
            dst[4] = ((anau[4] & 15) << 4) | ((anau[5]>>3)&15);
            dst[5] = ((anau[5] & 7) << 5) | ((anau[6]>>2)&31);
            dst[6] = ((anau[6] & 3) << 6) | ((anau[7]>>1)&0x3f);
            dst[7] = ((anau[7]& 1) << 7)  | (anau[8]&127);
            dst[8] = ((anau[9]& 127) << 1) | ((anau[10]>>4)&1);
            dst[9] = ((anau[10] & 15) << 4) | ((anau[11]>>3)&15);
            dst[10] = ((anau[11] & 7) << 5) | ((anau[12]>>2)&31);
            dst[11] = ((anau[12] & 3) << 6) | ((anau[13]>>1)&0x3f);
            dst[12] = ((anau[13]& 1) << 7)  | (anau[14]&127);
            dst[13] = ((anau[15]& 127) << 1) | ((anau[16]>>6)&1);
            dst[14] = ((anau[16] & 0x3f) << 2);
        } else { /* backward */
            dst[0] = (3<<6) | ((anau[0] >> 2) & 0x3f);
            dst[1] = ((anau[0] & 3) << 6) | ((anau[1]&1)<<5) | ((anau[2]>>8)&31);
            dst[2] = anau[2] & 255;
            dst[3] = (anau[3] >> 2) & 255;
            dst[4] = ((anau[3] & 3) << 6) | ((anau[4]>>1)&0x3f);
            dst[5] = ((anau[4]& 1) << 7)  | (anau[5]&127);
            dst[6] = ((anau[6]& 127) << 1) | ((anau[7]>>6)&1);
            dst[7] = ((anau[7]&0x3f) << 2) | ((anau[8] >>3)&3);
            dst[8] = ((anau[8] & 7) << 5) | ((anau[9]>>8)&31);
            dst[9] = anau[9] & 255;
            dst[10] = (anau[10] >> 2) & 255;
            dst[11] = ((anau[10] & 3) << 6) | ((anau[11]>>1)&0x3f);
            dst[12] = ((anau[11]& 1) << 7)  | (anau[12]&127);
            dst[13] = ((anau[13]& 127) << 1) | ((anau[14]>>6)&1);
            dst[14] = ((anau[14] & 0x3f) << 2);
        }
    }
    CLEAR_SCRATCH_MEMORY(encoderObj);
    return APIG729_StsNoErr;
}

G729_CODECFUN(  APIG729_Status, apiG729EncodeVAD,
                (G729Encoder_Obj* encoderObj,const short *src, short *dst, G729Codec_Type codecType, int *frametype )) {
    LOCAL_ALIGN_ARRAY(32, short, pAp_t,(LPF_DIM+1)*2,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, pAq_t,(LPF_DIM+1)*2,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, rCoeff, LPF_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, newLSP, LPF_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, rhNBE, LPF_DIM+1,encoderObj);
    LOCAL_ALIGN_ARRAY(32, int, autoR, VAD_LPC_DIM +2,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, tmpvec, BWLPCF_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, val1, LP_SUBFRAME_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, newLSF, LPF_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, interpLSF, LPF_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, pAp1, BWLPCF1_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, pAp2, BWLPCF1_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, yVal, LP_WINDOW_DIM,encoderObj);
    LOCAL_ARRAY(short,LAR,4,encoderObj);
    LOCAL_ARRAY(short,wfact1,2,encoderObj);
    LOCAL_ARRAY(short,wfact2,2,encoderObj);
    short s,norma,Vad=1,tmp,lpMode;
    short *speechHistory = encoderObj->speechHistory;
    short *prevSubfrLSP = encoderObj->prevSubfrLSP;
    short  vadEnable = (encoderObj->objPrm.mode == G729Encode_VAD_Enabled);
    short *prevSubfrLSPquant = encoderObj->prevSubfrLSPquant;
    short *resFilMem0  = encoderObj->resFilMem0;
    short *prevWgtSpeech = encoderObj->prevWgtSpeech;
    short *wsp = prevWgtSpeech + MAX_PITCH_LAG;
    short *prevExcitat = encoderObj->prevExcitat;
    short *exc = prevExcitat + L_prevExcitat;
    short *pAna = encoderObj->encPrm,*anau;
    char *synFltw = encoderObj->synFltw;
    char *synFltw0 = encoderObj->synFltw0;
    short *resFilMem  = encoderObj->resFilMem;
    short *error  = resFilMem + BWLPCF_DIM;
    int   i;

    VADmemory* vM =  (VADmemory*)encoderObj->vadMem;
    if(NULL==encoderObj || NULL==src || NULL ==dst)
        return APIG729_StsBadArgErr;
    if(encoderObj->preProc == NULL)
        return APIG729_StsNotInitialized;
    if((codecType != G729_CODEC)&&(codecType != G729A_CODEC)
       &&(codecType != G729D_CODEC)&&(codecType != G729E_CODEC))
        return APIG729_StsBadCodecType;
    if(encoderObj->objPrm.objSize <= 0)
        return APIG729_StsNotInitialized;
    if(ENC_KEY != encoderObj->objPrm.key)
        return APIG729_StsBadCodecType;

    if(encoderObj->objPrm.codecType != G729I_CODEC) encoderObj->codecType = encoderObj->objPrm.codecType;
    else encoderObj->codecType = codecType;

    if((encoderObj->codecType == G729_CODEC)||(encoderObj->codecType == G729A_CODEC)) *frametype = 3;
    else if(encoderObj->codecType == G729D_CODEC) *frametype = 2;
    else if(encoderObj->codecType == G729E_CODEC) *frametype = 4;

    if(!vadEnable) return APIG729_StsNoErr;

    ippsCopy_16s(src,encoderObj->speechHistory + SPEECH_BUF_DIM - LP_FRAME_DIM,LP_FRAME_DIM);
    ippsHighPassFilter_G729_16s_ISfs(
                                    encoderObj->speechHistory + SPEECH_BUF_DIM - LP_FRAME_DIM,LP_FRAME_DIM,12,encoderObj->preProc);
    norma=1;
    ippsMul_NR_16s_Sfs(LPC_WINDOW,hammingWin,yVal,LP_WINDOW_DIM,15);
    while(ippsAutoCorr_NormE_16s32s(yVal,LP_WINDOW_DIM,autoR,VAD_LPC_DIM +1,&i)!=ippStsNoErr) {
        ippsRShiftC_16s_I(2,yVal,LP_WINDOW_DIM);
        norma+=4;
    }
    norma -= i;
    for(i=0; i<LPF_DIM+1; i++)
        rhNBE[i] = autoR[i] >> 16;
    ippsLagWindow_G729_32s_I(autoR+1,VAD_LPC_DIM );

    if(encoderObj->codecType == G729A_CODEC) {
        if(ippStsOverflow == ippsLevinsonDurbin_G729B(autoR, pAp_t,rCoeff,&s)) {
            ippsCopy_16s(encoderObj->prevSubfrLPC,pAp_t,LPF_DIM+1);
            rCoeff[0] = encoderObj->prevRC[0];
            rCoeff[1] = encoderObj->prevRC[1];
        } else {
            ippsCopy_16s(pAp_t,encoderObj->prevSubfrLPC,LPF_DIM+1);
            encoderObj->prevRC[0] = rCoeff[0];
            encoderObj->prevRC[1] = rCoeff[1];
        }

        ippsLPCToLSP_G729A_16s(pAp_t, prevSubfrLSP, newLSP);
        ippsLSPToLSF_Norm_G729_16s(newLSP, tmpvec);
        {
            LOCAL_ALIGN_ARRAY(32, short, tmp, VAD_LPC_DIM +1, encoderObj);
            VoiceActivityDetect_G729(LPC_WINDOW,tmpvec,autoR,norma,rCoeff[1],&Vad,encoderObj->vadMem, tmp);
            LOCAL_ALIGN_ARRAY_FREE(32, short, tmp, VAD_LPC_DIM +1, encoderObj);
        }
        CNG_Update(rhNBE,norma,Vad,encoderObj);
        if(Vad == 0) {

            CNG_encoder(prevExcitat, prevSubfrLSPquant, pAq_t, pAna, encoderObj);
            vad_update_A(pAq_t,pAp_t,exc,PRESENT_SPEECH,val1,wsp,resFilMem0,synFltw);
            vM->VADPPrev = vM->VADPrev;
            vM->VADPrev = Vad;
            encoderObj->betaPreFilter = PITCH_SHARP_MIN;

            ippsCopy_16s(&speechHistory[LP_FRAME_DIM], &speechHistory[0], SPEECH_BUF_DIM-LP_FRAME_DIM);
            ippsCopy_16s(&prevWgtSpeech[LP_FRAME_DIM], &prevWgtSpeech[0], MAX_PITCH_LAG);
            ippsCopy_16s(&prevExcitat[LP_FRAME_DIM], &prevExcitat[0], L_prevExcitat);

            anau = encoderObj->encPrm+1;
            if(pAna[0] == 0) {
                *frametype=0;
            } else {
                *frametype=1;
                dst[0] = anau[0];
                dst[1] = anau[1];
                dst[2] = anau[2];
                dst[3] = anau[3];
            }
            CLEAR_SCRATCH_MEMORY(encoderObj);
            return APIG729_StsNoErr;
        }
        *pAna++ = 1;
        encoderObj->seed = SEED_INIT;
        encoderObj->CNGidx = 0;
        vM->VADPPrev = vM->VADPrev;
        vM->VADPrev = Vad;
    } else {
        if(ippsLevinsonDurbin_G729_32s16s(autoR, LPF_DIM, &pAp_t[LPF_DIM+1], rCoeff, &tmp ) == ippStsOverflow) {
            ippsCopy_16s(encoderObj->prevSubfrLPC,&pAp_t[LPF_DIM+1],LPF_DIM+1);
            rCoeff[0] = encoderObj->prevRC[0];
            rCoeff[1] = encoderObj->prevRC[1];
        } else {
            ippsCopy_16s(&pAp_t[LPF_DIM+1],encoderObj->prevSubfrLPC,LPF_DIM+1);
            encoderObj->prevRC[0] = rCoeff[0];
            encoderObj->prevRC[1] = rCoeff[1];
        }
        ippsLPCToLSP_G729_16s(&pAp_t[LPF_DIM+1], prevSubfrLSP, newLSP);

        ippsLSPToLSF_Norm_G729_16s(newLSP, newLSF);
        {
            LOCAL_ALIGN_ARRAY(32, short, tmp, VAD_LPC_DIM +1, encoderObj);
            VoiceActivityDetect_G729(LPC_WINDOW,newLSF,autoR,norma,rCoeff[1],&Vad,encoderObj->vadMem, tmp);
            LOCAL_ALIGN_ARRAY_FREE(32, short, tmp, VAD_LPC_DIM +1, encoderObj);
        }

        VADMusicDetection( encoderObj->codecType, autoR[0], norma,rCoeff ,encoderObj->pLag , encoderObj->pGain,
                           encoderObj->prevLPmode, &Vad,encoderObj->vadMem);
        CNG_Update(rhNBE,norma,Vad,encoderObj);

        if(Vad==0) {
            ippsCopy_16s(&encoderObj->BWDsynth[LP_FRAME_DIM], &encoderObj->BWDsynth[0], SYNTH_BWD_DIM);

            if( encoderObj->prevLPmode == 0) {
                ippsInterpolate_G729_16s(newLSP,prevSubfrLSP,tmpvec,LPF_DIM);
                ippsLSPToLPC_G729_16s(tmpvec,pAp_t);
                ippsLSPToLSF_Norm_G729_16s(tmpvec, interpLSF);
                ippsLSPToLSF_Norm_G729_16s(newLSP, newLSF);
            } else {
                ippsLSPToLPC_G729_16s(newLSP,pAp_t);
                ippsLSPToLSF_Norm_G729_16s(newLSP, newLSF);
                ippsCopy_16s(newLSF, interpLSF, LPF_DIM);
            }
            if(encoderObj->statGlobal > 10000) {
                encoderObj->statGlobal -= 2621;
                if( encoderObj->statGlobal < 10000)
                    encoderObj->statGlobal = 10000 ;
            }
            lpMode = 0;
            encoderObj->dominantBWDmode = 0;
            encoderObj->interpCoeff2_2 = 4506;

            ippsCopy_16s(newLSP, prevSubfrLSP, LPF_DIM);

            _ippsRCToLAR_G729_16s(rCoeff,LAR+2,2);
            ippsInterpolate_G729_16s(encoderObj->prevLAR,LAR+2,LAR,2);
            encoderObj->prevLAR[0] = LAR[2];
            encoderObj->prevLAR[1] = LAR[3];
            {
                LOCAL_ALIGN_ARRAY(32, short, PWGammaFactorMem, LPF_DIM, encoderObj);
                _ippsPWGammaFactor_G729_16s(LAR,interpLSF,&encoderObj->prevSubfrSmooth,wfact1,wfact2, PWGammaFactorMem);
                _ippsPWGammaFactor_G729_16s(LAR+2,newLSF,&encoderObj->prevSubfrSmooth,wfact1+1,wfact2+1, PWGammaFactorMem);
                LOCAL_ALIGN_ARRAY_FREE(32, short, PWGammaFactorMem, LPF_DIM, encoderObj);
            }

            CNG_encoder(prevExcitat, prevSubfrLSPquant, pAq_t, pAna, encoderObj);
            if(*pAna==2) *pAna=1;
            vM->VADPPrev = vM->VADPrev;
            vM->VADPrev = Vad;

            vad_update_I(pAq_t, pAp_t, exc, PRESENT_SPEECH, val1,
                         wsp,  resFilMem0,  synFltw,  synFltw0, wfact1, wfact2,
                         pAp1, pAp2, resFilMem, error, encoderObj->pSynth, encoderObj->pGain);

            ippsCopy_16s(&pAq_t[LPF_DIM+1], encoderObj->pPrevFilt, LPF_DIM+1);
            for(i=LPF_DIM+1; i <BWLPCF1_DIM; i++) encoderObj->pPrevFilt[i] = 0;
            encoderObj->prevLPmode = lpMode;

            encoderObj->betaPreFilter = PITCH_SHARP_MIN;

            ippsCopy_16s(&speechHistory[LP_FRAME_DIM], &speechHistory[0], SPEECH_BUF_DIM-LP_FRAME_DIM);
            ippsCopy_16s(&prevWgtSpeech[LP_FRAME_DIM], &prevWgtSpeech[0], MAX_PITCH_LAG);
            ippsCopy_16s(&prevExcitat[LP_FRAME_DIM], &prevExcitat[0], MAX_PITCH_LAG+INTERPOLATION_FILTER_DIM);

            anau = encoderObj->encPrm+1;
            if(pAna[0] == 0) {
                *frametype=0;
            } else {
                *frametype=1;
                dst[0] = anau[0];
                dst[1] = anau[1];
                dst[2] = anau[2];
                dst[3] = anau[3];
            }
            CLEAR_SCRATCH_MEMORY(encoderObj);
            return APIG729_StsNoErr;
        }
        *pAna++ = CodecTypeToRate[encoderObj->

⌨️ 快捷键说明

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