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

📄 decg729.c

📁 G.729 and G.723.1 codecs x86 (and x86_64) Linux and FreeBSD source code for Asterisk open source PBX
💻 C
📖 第 1 页 / 共 5 页
字号:
            qIndex[0] = (Ipp16s)((parm[0] >> FIR_STAGE_BITS) & 1);            qIndex[1] = (Ipp16s)(parm[0] & (FIR_STAGE - 1));            qIndex[2] = (Ipp16s)((parm[1] >> SEC_STAGE_BITS) & (SEC_STAGE - 1));            qIndex[3] = (Ipp16s)(parm[1] & (SEC_STAGE - 1));            if(!badFrameIndicator) {                decoderObj->prevMA = qIndex[0];                ippsLSFDecode_G729_16s( qIndex, (Ipp16s*)decoderObj->prevLSPfreq, decoderObj->prevSubfrLSPquant);            } else {                ippsLSFDecodeErased_G729_16s( decoderObj->prevMA,                                              (Ipp16s*)decoderObj->prevLSPfreq, decoderObj->prevSubfrLSPquant);            }            ippsLSFToLSP_G729_16s(decoderObj->prevSubfrLSPquant, newLSP); /* Convert LSFs to LSPs */            parm += 2;            LOCAL_ARRAY_FREE(Ipp16s, qIndex,4,decoderObj);            if( decoderObj->prevLPmode == 0) {                ippsInterpolate_G729_16s(newLSP,prevSubfrLSP,prevSubfrLSP, LPF_DIM );                ippsLSPToLPC_G729_16s(prevSubfrLSP, FWDfiltLPC);            /*  1-st subframe */                ippsLSPToLPC_G729_16s(newLSP, &FWDfiltLPC[LPF_DIM+1]);      /* 2-nd subframe */            } else {                ippsLSPToLPC_G729_16s(newLSP, FWDfiltLPC);                  /* 1-st subframe */                ippsMove_16s(FWDfiltLPC, &FWDfiltLPC[LPF_DIM+1], LPF_DIM+1);/* 2-nd subframe */            }            /* update the next frame LSFs*/            ippsCopy_16s(newLSP, prevSubfrLSP, LPF_DIM );            decoderObj->interpCoeff2_2 = 4506;            mAq = LPF_DIM;            pA = FWDfiltLPC;            ippsCopy_16s(&FWDfiltLPC[LPF_DIM+1], decoderObj->pPrevFilt, LPF_DIM+1);            ippsZero_16s(&decoderObj->pPrevFilt[LPF_DIM+1], (BWLPCF1_DIM-LPF_DIM-1));        } else {            Ipp16s tmp;            decoderObj->interpCoeff2_2 = (Ipp16s)(decoderObj->interpCoeff2_2 - 410);            if( decoderObj->interpCoeff2_2 < 0) decoderObj->interpCoeff2_2 = 0;            tmp = (Ipp16s)((1<<12) - decoderObj->interpCoeff2_2);            ippsInterpolateC_G729_16s_Sfs(BWDfiltLPC + BWLPCF1_DIM, tmp,                                          decoderObj->pPrevFilt, decoderObj->interpCoeff2_2, BWDfiltLPC + BWLPCF1_DIM, BWLPCF1_DIM, 12);            ippsInterpolate_G729_16s            (BWDfiltLPC + BWLPCF1_DIM, decoderObj->pPrevFilt, BWDfiltLPC, BWLPCF1_DIM);            mAq = BWLPCF_DIM;            pA = BWDfiltLPC;            ippsCopy_16s(&BWDfiltLPC[BWLPCF1_DIM], decoderObj->pPrevFilt, BWLPCF1_DIM);        }        for(ppAz=pA,subfrIdx = 0; subfrIdx < LP_FRAME_DIM; subfrIdx += LP_SUBFRAME_DIM) {            Ipp32s pitchIndx;            pitchIndx = *parm++;            badPitch = badFrameIndicator;            if(subfrIdx == 0) {                if(decoderObj->codecType != G729D_CODEC)                    badPitch = (Ipp16s)(badFrameIndicator + *parm++);            }            DecodeAdaptCodebookDelays(&decoderObj->prevFrameDelay,&decoderObj->prevFrameDelay2,delayVal,subfrIdx,badPitch,pitchIndx,decoderObj->codecType);            if(subfrIdx == 0)                prevFrameDelay1 = delayVal[0];         /* if first frame */            ippsDecodeAdaptiveVector_G729_16s_I(delayVal,&prevExcitat[subfrIdx]);            /* pitch tracking */            if( decoderObj->codecType == G729E_CODEC) {                PitchTracking_G729E(&decoderObj->prevFrameDelay, &decoderObj->prevFrameDelay2, &decoderObj->prevPitch, &decoderObj->stat_pitch,                                    &decoderObj->pitchStatIntDelay, &decoderObj->pitchStatFracDelay);            } else {                Ipp16s sTmpPrevFrameDelay, sTmpPrevFrameDelay2;                sTmpPrevFrameDelay = decoderObj->prevFrameDelay;                sTmpPrevFrameDelay2 = decoderObj->prevFrameDelay2;                PitchTracking_G729E(&sTmpPrevFrameDelay, &sTmpPrevFrameDelay2, &decoderObj->prevPitch, &decoderObj->stat_pitch,                                    &decoderObj->pitchStatIntDelay, &decoderObj->pitchStatFracDelay);            }            statStat = 0;            if(decoderObj->codecType == G729_CODEC) {                if(badFrameIndicator != 0) {                    index = (Ipp16s)(Rand_16s(&decoderObj->seedSavage) & (Ipp16s)0x1fff);     /* 13 bits random */                    pulseSign = (Ipp16s)(Rand_16s(&decoderObj->seedSavage) & (Ipp16s)15);     /*  4 bits random */                } else {                    index = parm[0];                    pulseSign = parm[1];                }                i      = index & 7;                idx[0] = (Ipp16s)(5 * i);                index  = (Ipp16s)(index >> 3);                i      = index & 7;                idx[1] = (Ipp16s)(5 * i + 1);                index  = (Ipp16s)(index >> 3);                i      = index & 7;                idx[2] = (Ipp16s)(5 * i + 2);                index  = (Ipp16s)(index >> 3);                j      = index & 1;                index  = (Ipp16s)(index >> 1);                i      = index & 7;                idx[3] = (Ipp16s)(i * 5 + 3 + j);                /* decode the signs & build the codeword */                ippsZero_16s(ACELPcodeVec,LP_SUBFRAME_DIM);                for(j=0; j<4; j++) {                    if((pulseSign & 1) != 0) {                        ACELPcodeVec[idx[j]] = 8191;                    } else {                        ACELPcodeVec[idx[j]] = -BWF_HARMONIC_E;                    }                    pulseSign = (Ipp16s)(pulseSign >> 1);                }                parm += 2;                decoderObj->BWDFrameCounter = 0;            } else if(decoderObj->codecType == G729D_CODEC) {                Ipp16s sTmpIdx;                if(badFrameIndicator != 0) {                    index = Rand_16s(&decoderObj->seedSavage);                    pulseSign = Rand_16s(&decoderObj->seedSavage);                } else {                    index = parm[0];                    pulseSign = parm[1];                }                ippsZero_16s(ACELPcodeVec,LP_SUBFRAME_DIM);                sTmpIdx = tab3[index & 15];                if((pulseSign & 1) != 0) {                    ACELPcodeVec[sTmpIdx] += 8191;                } else {                    ACELPcodeVec[sTmpIdx] -= BWF_HARMONIC_E;                }                index >>= 4;                pulseSign >>= 1;                sTmpIdx = tab4[index & 31];                if((pulseSign & 1) != 0) {                    ACELPcodeVec[sTmpIdx] += 8191;                } else {                    ACELPcodeVec[sTmpIdx] -= BWF_HARMONIC_E;                }                parm += 2;                decoderObj->BWDFrameCounter = 0;            } else if(decoderObj->codecType == G729E_CODEC) {                Ipp16s sIdxCounter, trackVal;                Ipp16s pos1, pos2, pos3, sTmpPulseSign;                ippsZero_16s(ACELPcodeVec,LP_SUBFRAME_DIM);                if(badFrameIndicator != 0) {                    tmp_parm[0] = Rand_16s(&decoderObj->seedSavage);                    tmp_parm[1] = Rand_16s(&decoderObj->seedSavage);                    tmp_parm[2] = Rand_16s(&decoderObj->seedSavage);                    tmp_parm[3] = Rand_16s(&decoderObj->seedSavage);                    tmp_parm[4] = Rand_16s(&decoderObj->seedSavage);                } else {                    ippsCopy_16s(parm, tmp_parm, 5);                }                if(LPmode == 0) {                    pos1 = (Ipp16s)((tmp_parm[0] & 7) * 5);                    if(((tmp_parm[0]>>3) & 1) == 0)                        sTmpPulseSign = (1<<12);                    else sTmpPulseSign = -(1<<12);                    ACELPcodeVec[pos1] = sTmpPulseSign;                    pos2 = (Ipp16s)(((tmp_parm[0]>>4) & 7) * 5);                    if(pos2 > pos1)                        sTmpPulseSign = (Ipp16s)(-sTmpPulseSign);                    ACELPcodeVec[pos2] = (Ipp16s)(ACELPcodeVec[pos2] + sTmpPulseSign);                    pos1 = (Ipp16s)(((tmp_parm[1] & 7) * 5) + 1);                    if(((tmp_parm[1]>>3) & 1) == 0)                        sTmpPulseSign = (1<<12);                    else                        sTmpPulseSign = -(1<<12);                    ACELPcodeVec[pos1] = sTmpPulseSign;                    pos2 = (Ipp16s)((((tmp_parm[1]>>4) & 7) * 5) + 1);                    if(pos2 > pos1)                        sTmpPulseSign = (Ipp16s)(-sTmpPulseSign);                    ACELPcodeVec[pos2] = (Ipp16s)(ACELPcodeVec[pos2] + sTmpPulseSign);                    pos1 = (Ipp16s)(((tmp_parm[2] & 7) * 5) + 2);                    if(((tmp_parm[2]>>3) & 1) == 0)                        sTmpPulseSign = (1<<12);                    else                        sTmpPulseSign = -(1<<12);                    ACELPcodeVec[pos1] = sTmpPulseSign;                    pos2 = (Ipp16s)((((tmp_parm[2]>>4) & 7) * 5) + 2);                    if(pos2 > pos1)                        sTmpPulseSign = (Ipp16s)(-sTmpPulseSign);                    ACELPcodeVec[pos2] = (Ipp16s)(ACELPcodeVec[pos2] + sTmpPulseSign);                    pos1 = (Ipp16s)(((tmp_parm[3] & 7) * 5) + 3);                    if(((tmp_parm[3]>>3) & 1) == 0)                        sTmpPulseSign = (1<<12);                    else                        sTmpPulseSign = -(1<<12);                    ACELPcodeVec[pos1] = sTmpPulseSign;                    pos2 = (Ipp16s)((((tmp_parm[3]>>4) & 7) * 5) + 3);                    if(pos2 > pos1)                        sTmpPulseSign = (Ipp16s)(-sTmpPulseSign);                    ACELPcodeVec[pos2] = (Ipp16s)(ACELPcodeVec[pos2] + sTmpPulseSign);                    pos1 = (Ipp16s)(((tmp_parm[4] & 7) * 5) + 4);                    if(((tmp_parm[4]>>3) & 1) == 0)                        sTmpPulseSign = (1<<12);                    else sTmpPulseSign = -(1<<12);                    ACELPcodeVec[pos1] = sTmpPulseSign;                    pos2 = (Ipp16s)((((tmp_parm[4]>>4) & 7) * 5) + 4);                    if(pos2 > pos1) sTmpPulseSign = (Ipp16s)(-sTmpPulseSign);                    ACELPcodeVec[pos2] = (Ipp16s)(ACELPcodeVec[pos2] + sTmpPulseSign);                    decoderObj->BWDFrameCounter = 0;                } else {                    trackVal = (Ipp16s)((tmp_parm[0]>>10) & 7);                    if(trackVal > 4)                        trackVal = 4;                    for(sIdxCounter=0; sIdxCounter<2; sIdxCounter++) {                        pos1 = (Ipp16s)(((tmp_parm[sIdxCounter] & 7) * 5) + trackVal);                        if(((tmp_parm[sIdxCounter]>>3) & 1) == 0)                            sTmpPulseSign = (1<<12);                        else                            sTmpPulseSign = -(1<<12);                        ACELPcodeVec[pos1] = sTmpPulseSign;                        pos2 = (Ipp16s)((((tmp_parm[sIdxCounter]>>4) & 7) * 5) + trackVal);                        if(pos2 > pos1)                            sTmpPulseSign = (Ipp16s)(-sTmpPulseSign);                        ACELPcodeVec[pos2] = (Ipp16s)(ACELPcodeVec[pos2] + sTmpPulseSign);                        pos3 = (Ipp16s)((((tmp_parm[sIdxCounter]>>7) & 7) * 5) + trackVal);                        if(pos3 > pos2)                            sTmpPulseSign = (Ipp16s)(-sTmpPulseSign);                        ACELPcodeVec[pos3] = (Ipp16s)(ACELPcodeVec[pos3] + sTmpPulseSign);                        trackVal++;                        if(trackVal > 4)                            trackVal = 0;                    }                    for(sIdxCounter=2; sIdxCounter<5; sIdxCounter++) {                        pos1 = (Ipp16s)(((tmp_parm[sIdxCounter] & 7) * 5) + trackVal);                        if(((tmp_parm[sIdxCounter]>>3) & 1) == 0)                            sTmpPulseSign = (1<<12);                        else                            sTmpPulseSign = -(1<<12);                        ACELPcodeVec[pos1] = sTmpPulseSign;                        pos2 = (Ipp16s)((((tmp_parm[sIdxCounter]>>4) & 7) * 5) + trackVal);                        if(pos2 > pos1)                            sTmpPulseSign = (Ipp16s)(-sTmpPulseSign);                        ACELPcodeVec[pos2] = (Ipp16s)(ACELPcodeVec[pos2] + sTmpPulseSign);                        trackVal++;                        if(trackVal > 4)                            trackVal = 0;                    }                    decoderObj->BWDFrameCounter++;                    if(decoderObj->BWDFrameCounter >= 30) {                        statStat = 1;                        decoderObj->BWDFrameCounter = 30;                    }                }                parm += 5;            }            decoderObj->betaPreFilter = (Ipp16s)(decoderObj->betaPreFilter << 1);            if(delayVal[0] < LP_SUBFRAME_DIM) {                ippsHarmonicFilter_16s_I(decoderObj->betaPreFilter,delayVal[0],&ACELPcodeVec[delayVal[0]],LP_SUBFRAME_DIM-delayVal[0]);            }            pitchIndx = *parm++;            if(decoderObj->codecType == G729_CODEC) {                if(!badFrameIndicator) {                    LOCAL_ARRAY(Ipp16s, gIngx, 2, decoderObj);                    ippsDotProd_16s32s_Sfs(ACELPcodeVec, ACELPcodeVec, LP_SUBFRAME_DIM, &i, 0); /* ACELPcodeVec energy */                    gIngx[0] = (Ipp16s)(pitchIndx >> CDBK2_BIT_NUM) ;                    gIngx[1] = (Ipp16s)(pitchIndx & (CDBK2_DIM-1));                    ippsDecodeGain_G729_16s(i, decoderObj->prevFrameQuantEn, gIngx, decoderObj->gains);                    LOCAL_ARRAY_FREE(Ipp16s, gIngx, 2, decoderObj);                } else {                    ippsDecodeGain_G729_16s(0, decoderObj->prevFrameQuantEn, NULL, decoderObj->gains);                }

⌨️ 快捷键说明

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