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

📄 encg729.c

📁 G.711,G.723.1,G.726,G.729,GSM CODEC C/C++ code
💻 C
📖 第 1 页 / 共 5 页
字号:
(G729Encoder_Obj* encoderObj,const short *src, unsigned char* dst, G729Codec_Type codecType , int *frametype) {

    LOCAL_ALIGN_ARRAY(32, short, impResp, LP_SUBFRAME_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, val1, LP_SUBFRAME_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, tmpVec2, LP_SUBFRAME_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, codeword, LP_SUBFRAME_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, y1, LP_SUBFRAME_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, y2, LP_SUBFRAME_DIM,encoderObj);
    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, tmpvec, BWLPCF_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, pAp1, BWLPCF1_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, tmp_not_used,LP_SUBFRAME_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, pAp2, BWLPCF1_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, interpLSF, LPF_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, newLSF, LPF_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, int,   BWDacf, BWLPCF1_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, int,   BWDacfHigh, BWLPCF1_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, BWDrc,BWLPCF_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, pBwdLPC2,2*BWLPCF1_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, nullArr, LP_SUBFRAME_DIM,encoderObj);
    LOCAL_ALIGN_ARRAY(32, short, LTPresid, LP_SUBFRAME_DIM,encoderObj);

    LOCAL_ARRAY(short,indexFC,2,encoderObj);
    LOCAL_ARRAY(short,delay,2,encoderObj);
    LOCAL_ARRAY(short,LAR,4,encoderObj);
    LOCAL_ARRAY(short,wfact1,2,encoderObj);
    LOCAL_ARRAY(short,wfact2,2,encoderObj);
    LOCAL_ARRAY(short,LSPcode,2,encoderObj);
    LOCAL_ARRAY(short,freqNow,LPF_DIM,encoderObj);
    short *pAq, *pAp, bestOPLag, index, gainAc, gainCode, gainPit, tmp, improveFlag, subfr;
    char  *synFltw = encoderObj->synFltw;
    short *pAna = encoderObj->encPrm,*anau;
    short *speechHistory = encoderObj->speechHistory;
    short *prevSubfrLSP = encoderObj->prevSubfrLSP;
    short *prevSubfrLSPquant = encoderObj->prevSubfrLSPquant;
    short betaPreFilter = encoderObj->betaPreFilter;
    short *resFilMem0  = encoderObj->resFilMem0;
    short *prevWgtSpeech = encoderObj->prevWgtSpeech;
    short *wsp = prevWgtSpeech + MAX_PITCH_LAG;
    short *prevExcitat = encoderObj->prevExcitat;
    short *exc = prevExcitat + L_prevExcitat;
    int   i, j, subfrIdx, valOpenDelay;
    short vadEnable = (encoderObj->objPrm.mode == G729Encode_VAD_Enabled);
    char *synFltw0 = encoderObj->synFltw0;
    short *resFilMem  = encoderObj->resFilMem;
    short *error  = resFilMem + BWLPCF_DIM;
    short lpMode = 0;
    short satFilt;
    short mAp, mAq, m_a;
    short *ppAp, *ppAq;
    short tmp1, tmp2,avgLag;

    VADmemory* vM =  (VADmemory*)encoderObj->vadMem;
    if(NULL==src || NULL ==dst)
        return APIG729_StsBadArgErr;
    if(encoderObj->preProc == NULL)
        return APIG729_StsNotInitialized;
    if((codecType != G729_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;
    ippsZero_16s(nullArr, LP_SUBFRAME_DIM);
    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);
    {
        LOCAL_ALIGN_ARRAY(32, short, rCoeff, LPF_DIM,encoderObj);
        LOCAL_ALIGN_ARRAY(32, short, newLSP, LPF_DIM,encoderObj);
        LOCAL_ALIGN_ARRAY(32, short, newQlsp, LPF_DIM+1,encoderObj);
        LOCAL_ALIGN_ARRAY(32, int, autoR, VAD_LPC_DIM +2,encoderObj);
        LOCAL_ALIGN_ARRAY(32, short, yVal, LP_WINDOW_DIM,encoderObj);
        short Vad=1;
        short norma;
        short *rhNBE = &newQlsp[0];
        norma=1;
        ippsMul_NR_16s_Sfs(LPC_WINDOW,hammingWin,yVal,LP_WINDOW_DIM,15);
        j = LPF_DIM;
        if(vadEnable == 1)
            j = VAD_LPC_DIM ;
        while(ippsAutoCorr_NormE_16s32s(yVal,LP_WINDOW_DIM,autoR,j+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(ippsLevinsonDurbin_G729_32s16s(autoR, LPF_DIM, &pAp_t[LPF_DIM+1], rCoeff, &tmp ) == ippStsOverflow) {
            for(i=0; i<=LPF_DIM; i++) {
                pAp_t[LPF_DIM+1+i] = encoderObj->prevSubfrLPC[i];
            }
            rCoeff[0] = encoderObj->prevRC[0];
            rCoeff[1] = encoderObj->prevRC[1];
        } else {
            for(i=0; i<=LPF_DIM; i++) encoderObj->prevSubfrLPC[i] = pAp_t[LPF_DIM+1+i];
            encoderObj->prevRC[0] = rCoeff[0];
            encoderObj->prevRC[1] = rCoeff[1];
        }
        ippsLPCToLSP_G729_16s(&pAp_t[LPF_DIM+1], prevSubfrLSP, newLSP);
        if(vadEnable == 1) {
            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;

                /* the next frame's LSPs update*/
                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] & 1) << 7) | ((anau[1] & 31) << 2) | ((anau[2] & 15)>>2);
                    dst[1] = ((anau[2] & 3) << 6) | ((anau[3] & 31) << 1);
                }
                CLEAR_SCRATCH_MEMORY(encoderObj);
                return APIG729_StsNoErr;
            }
        }

        *pAna++ = CodecTypeToRate[encoderObj->codecType];
        encoderObj->seed = SEED_INIT;
        vM->VADPPrev = vM->VADPrev;
        vM->VADPrev = Vad;
        encoderObj->CNGidx = 0;
        LOCAL_ALIGN_ARRAY_FREE(32,short, yVal, LP_WINDOW_DIM,encoderObj);

        if(encoderObj->codecType == G729_CODEC) {
            ippsLSPQuant_G729_16s(newLSP,(Ipp16s*)encoderObj->prevLSPfreq,newQlsp,pAna);
            pAna += 2;
        } else {
            if(encoderObj->codecType == G729E_CODEC) {
                ippsWinHybrid_G729E_16s32s(encoderObj->BWDsynth, BWDacf,
                                           (IppsWinHybridState_G729E_16s*)&encoderObj->hwState);
                BWDLagWindow(BWDacf, BWDacfHigh);
                if(ippsLevinsonDurbin_G729_32s16s(BWDacfHigh, BWLPCF_DIM, &pBwdLPC2[BWLPCF1_DIM], BWDrc, &tmp )
                   == ippStsOverflow) {
                    for(i=0; i<=BWLPCF_DIM; i++) {
                        pBwdLPC2[BWLPCF1_DIM+i] = encoderObj->pPrevBwdLPC[i];
                    }
                    BWDrc[0] = encoderObj->pPrevBwdRC[0];
                    BWDrc[1] = encoderObj->pPrevBwdRC[1];
                } else {
                    for(i=0; i<=BWLPCF_DIM; i++) encoderObj->pPrevBwdLPC[i] = pBwdLPC2[BWLPCF1_DIM+i];
                    encoderObj->pPrevBwdRC[0] = BWDrc[0];
                    encoderObj->pPrevBwdRC[1] = BWDrc[1];
                }

                satFilt = 0;
                for(i=BWLPCF1_DIM; i<2*BWLPCF1_DIM; i++) if(pBwdLPC2[i] >= IPP_MAX_16S)
                        satFilt = 1;
                if(satFilt == 1)
                    ippsCopy_16s(encoderObj->pBwdLPC2, &pBwdLPC2[BWLPCF1_DIM], BWLPCF1_DIM);
                else
                    ippsCopy_16s(&pBwdLPC2[BWLPCF1_DIM], encoderObj->pBwdLPC2, BWLPCF1_DIM);

                ippsMulPowerC_NR_16s_Sfs(&pBwdLPC2[BWLPCF1_DIM], N0_98, &pBwdLPC2[BWLPCF1_DIM], BWLPCF1_DIM,15);
            }
            ippsCopy_16s(&encoderObj->BWDsynth[LP_FRAME_DIM], &encoderObj->BWDsynth[0], SYNTH_BWD_DIM);
            ippsLSPQuant_G729E_16s(newLSP,(const Ipp16s*)encoderObj->prevLSPfreq,freqNow,newQlsp,LSPcode);
        }

        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);

            ippsInterpolate_G729_16s(newQlsp,prevSubfrLSPquant,tmpvec,LPF_DIM);

            ippsLSPToLPC_G729_16s(tmpvec,&pAq_t[0]);
            ippsLSPToLPC_G729_16s(newQlsp,&pAq_t[LPF_DIM+1]);
        } else {
            ippsLSPToLPC_G729_16s(newLSP,pAp_t);
            ippsLSPToLSF_Norm_G729_16s(newLSP, newLSF);
            ippsCopy_16s(newLSF, interpLSF, LPF_DIM);
            ippsLSPToLPC_G729_16s(newQlsp,&pAq_t[LPF_DIM+1]);
            ippsCopy_16s(&pAq_t[LPF_DIM+1], pAq_t, LPF_DIM+1);
        }
        if(encoderObj->codecType == G729E_CODEC) {
            SetLPCMode_G729E(PRESENT_SPEECH, pAq_t, pBwdLPC2, &lpMode,
                             newLSP, prevSubfrLSP, encoderObj);
        }

        /* the next frame's LSPs update*/

        ippsCopy_16s(newLSP,prevSubfrLSP,LPF_DIM);
        if(lpMode==0) {
            ippsCopy_16s(newQlsp,prevSubfrLSPquant,LPF_DIM);
            _ippsRCToLAR_G729_16s(rCoeff,LAR+2,2);
            mAq = LPF_DIM;
            mAp = LPF_DIM;
            if(encoderObj->dominantBWDmode == 0)
                pAp = pAp_t;
            else
                pAp = pAq_t;
            pAq = pAq_t;
            tmp = encoderObj->prevLAR[0] + LAR[2];
            LAR[0] = (tmp<0)? ~(( ~tmp) >> 1 ) : tmp>>1;
            tmp = encoderObj->prevLAR[1] + LAR[3];
            LAR[1] = (tmp<0)? ~(( ~tmp) >> 1 ) : tmp>>1;
            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);
            }
            ippsMulPowerC_NR_16s_Sfs(&pAp[0],wfact1[0], pAp1,LPF_DIM+1,15);
            ippsMulPowerC_NR_16s_Sfs(&pAp[0],wfact2[0], pAp2,LPF_DIM+1,15);

            ippsResidualFilter_G729_16s(&PRESENT_SPEECH[0],pAp1, &wsp[0]);
            ippsSynthesisFilterLow_NR_16s_ISfs(pAp2,wsp,LP_SUBFRAME_DIM,12,((SynthesisFilterState*)synFltw)->buffer+20);
            ippsCopy_16s((wsp+LP_SUBFRAME_DIM-30), ((SynthesisFilterState*)synFltw)->buffer, 30);

            ippsMulPowerC_NR_16s_Sfs(&pAp[LPF_DIM+1],wfact1[1], pAp1,LPF_DIM+1,15);
            ippsMulPowerC_NR_16s_Sfs(&pAp[LPF_DIM+1],wfact2[1], pAp2,LPF_DIM+1,15);
            ippsResidualFilter_G729_16s(&PRESENT_SPEECH[LP_SUBFRAME_DIM], pAp1, &wsp[LP_SUBFRAME_DIM]);
            ippsSynthesisFilterLow_NR_16s_ISfs(pAp2,&wsp[LP_SUBFRAME_DIM],LP_SUBFRAME_DIM,12,((SynthesisFilterState*)synFltw)->buffer+20);
            ippsCopy_16s((&wsp[LP_SUBFRAME_DIM]+LP_SUBFRAME_DIM-30), ((SynthesisFilterState*)synFltw)->buffer, 30);

            ippsOpenLoopPitchSearch_G729_16s(wsp, &bestOPLag);

            if((encoderObj->codecType != G729_CODEC)) {
                if(encoderObj->codecType == G729E_CODEC)
                    *pAna++ = lpMode;

                for( i = LSP_MA_ORDER-1 ; i > 0 ; i-- )
                    ippsCopy_16s(encoderObj->prevLSPfreq[i-1], encoderObj->prevLSPfreq[i], LPF_DIM);

⌨️ 快捷键说明

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