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

📄 decg729.c

📁 G.711,G.723.1,G.726,G.729,GSM CODEC C/C++ code
💻 C
📖 第 1 页 / 共 5 页
字号:
            if(!badFrameIndicator) {
                decoderObj->prevMA = qIndex[0];
                ippsLSFDecode_G729_16s( qIndex, (short*)decoderObj->prevLSPfreq, decoderObj->prevSubfrLSPquant);
            } else {
                ippsLSFDecodeErased_G729_16s( decoderObj->prevMA,
                                              (short*)decoderObj->prevLSPfreq, decoderObj->prevSubfrLSPquant);
            }

            ippsLSFToLSP_G729_16s(decoderObj->prevSubfrLSPquant, newLSP); /* Convert LSFs to LSPs */
            parm += 2;
            LOCAL_ARRAY_FREE(short, 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 */
                ippsCopy_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 {
            short tmp;
            decoderObj->interpCoeff2_2 = decoderObj->interpCoeff2_2 - 410;
            if( decoderObj->interpCoeff2_2 < 0) decoderObj->interpCoeff2_2 = 0;
            tmp = (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) {
            int pitchIndx;
            pitchIndx = *parm++;
            badPitch = badFrameIndicator;

            if(subfrIdx == 0) {
                if(decoderObj->codecType != G729D_CODEC)
                    badPitch = 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 {
                short i, j;
                i = decoderObj->prevFrameDelay;
                j = decoderObj->prevFrameDelay2;
                PitchTracking_G729E(&i, &j, &decoderObj->prevPitch, &decoderObj->stat_pitch,
                                    &decoderObj->pitchStatIntDelay, &decoderObj->pitchStatFracDelay);
            }

            statStat = 0;
            if(decoderObj->codecType == G729_CODEC) {
                if(badFrameIndicator != 0) {
                    index = Rand_16s(&decoderObj->seedSavage) & (short)0x1fff;     /* 13 bits random */
                    pulseSign = Rand_16s(&decoderObj->seedSavage) & (short)15;     /*  4 bits random */
                } else {
                    index = parm[0];
                    pulseSign = parm[1];
                }
                i      = index & 7;
                idx[0] = 5 * i;
                index  = index >> 3;
                i      = index & 7;
                idx[1] = 5 * i + 1;
                index  = index >> 3;
                i      = index & 7;
                idx[2] = 5 * i + 2;
                index  = index >> 3;
                j      = index & 1;
                index  = index >> 1;
                i      = index & 7;
                idx[3] = 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 = pulseSign >> 1;
                }

                parm += 2;
                decoderObj->BWDFrameCounter = 0;
            } else if(decoderObj->codecType == G729D_CODEC) {
                short idx;

                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);
                idx = tab3[index & 15];
                if((pulseSign & 1) != 0) {
                    ACELPcodeVec[idx] += 8191;
                } else {
                    ACELPcodeVec[idx] -= BWF_HARMONIC_E;
                }
                index >>= 4;
                pulseSign >>= 1;
                idx = tab4[index & 31];

                if((pulseSign & 1) != 0) {
                    ACELPcodeVec[idx] += 8191;
                } else {
                    ACELPcodeVec[idx] -= BWF_HARMONIC_E;
                }

                parm += 2;
                decoderObj->BWDFrameCounter = 0;
            } else if(decoderObj->codecType == G729E_CODEC) {
                short j, trackVal;
                short pos1, pos2, pos3, pulseSign;
                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 = ((tmp_parm[0] & 7) * 5);
                    if(((tmp_parm[0]>>3) & 1) == 0)
                        pulseSign = (1<<12);
                    else pulseSign = -(1<<12);
                    ACELPcodeVec[pos1] = pulseSign;
                    pos2 = (((tmp_parm[0]>>4) & 7) * 5);
                    if(pos2 > pos1)
                        pulseSign = -pulseSign;
                    ACELPcodeVec[pos2] += pulseSign;
                    pos1 = ((tmp_parm[1] & 7) * 5) + 1;
                    if(((tmp_parm[1]>>3) & 1) == 0)
                        pulseSign = (1<<12);
                    else
                        pulseSign = -(1<<12);
                    ACELPcodeVec[pos1] = pulseSign;

                    pos2 = (((tmp_parm[1]>>4) & 7) * 5) + 1;
                    if(pos2 > pos1)
                        pulseSign = -pulseSign;

                    ACELPcodeVec[pos2] += pulseSign;

                    pos1 = ((tmp_parm[2] & 7) * 5) + 2;
                    if(((tmp_parm[2]>>3) & 1) == 0)
                        pulseSign = (1<<12);
                    else
                        pulseSign = -(1<<12);
                    ACELPcodeVec[pos1] = pulseSign;

                    pos2 = (((tmp_parm[2]>>4) & 7) * 5) + 2;
                    if(pos2 > pos1)
                        pulseSign = -pulseSign;
                    ACELPcodeVec[pos2] += pulseSign;
                    pos1 = ((tmp_parm[3] & 7) * 5) + 3;
                    if(((tmp_parm[3]>>3) & 1) == 0)
                        pulseSign = (1<<12);
                    else
                        pulseSign = -(1<<12);
                    ACELPcodeVec[pos1] = pulseSign;
                    pos2 = (((tmp_parm[3]>>4) & 7) * 5) + 3;
                    if(pos2 > pos1)
                        pulseSign = -pulseSign;

                    ACELPcodeVec[pos2] += pulseSign;

                    pos1 = ((tmp_parm[4] & 7) * 5) + 4;
                    if(((tmp_parm[4]>>3) & 1) == 0)
                        pulseSign = (1<<12);
                    else pulseSign = -(1<<12);
                    ACELPcodeVec[pos1] = pulseSign;

                    pos2 = (((tmp_parm[4]>>4) & 7) * 5) + 4;
                    if(pos2 > pos1) pulseSign = -pulseSign;

                    ACELPcodeVec[pos2] += pulseSign;
                    decoderObj->BWDFrameCounter = 0;
                } else {
                    trackVal = (tmp_parm[0]>>10) & 7;
                    if(trackVal > 4)
                        trackVal = 4;

                    for(j=0; j<2; j++) {
                        pos1 = ((tmp_parm[j] & 7) * 5) + trackVal;
                        if(((tmp_parm[j]>>3) & 1) == 0)
                            pulseSign = (1<<12);
                        else
                            pulseSign = -(1<<12);
                        ACELPcodeVec[pos1] = pulseSign;

                        pos2 = (((tmp_parm[j]>>4) & 7) * 5) + trackVal;
                        if(pos2 > pos1)
                            pulseSign = -pulseSign;

                        ACELPcodeVec[pos2] += pulseSign;

                        pos3 = (((tmp_parm[j]>>7) & 7) * 5) + trackVal;
                        if(pos3 > pos2)
                            pulseSign = -pulseSign;

                        ACELPcodeVec[pos3] += pulseSign;

                        trackVal++;
                        if(trackVal > 4)
                            trackVal = 0;
                    }

                    for(j=2; j<5; j++) {
                        pos1 = ((tmp_parm[j] & 7) * 5) + trackVal;
                        if(((tmp_parm[j]>>3) & 1) == 0)
                            pulseSign = (1<<12);
                        else
                            pulseSign = -(1<<12);
                        ACELPcodeVec[pos1] = pulseSign;

                        pos2 = (((tmp_parm[j]>>4) & 7) * 5) + trackVal;
                        if(pos2 > pos1)
                            pulseSign = -pulseSign;
                        ACELPcodeVec[pos2] += pulseSign;
                        trackVal++;
                        if(trackVal > 4)
                            trackVal = 0;
                    }
                    decoderObj->BWDFrameCounter++;
                    if(decoderObj->BWDFrameCounter >= 30) {
                        statStat = 1;
                        decoderObj->BWDFrameCounter = 30;
                    }
                }
                parm += 5;
            }

            decoderObj->betaPreFilter = 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(short, gIngx, 2, decoderObj);
                    ippsDotProd_16s32s_Sfs(ACELPcodeVec, ACELPcodeVec, LP_SUBFRAME_DIM, &i, 0); /* ACELPcodeVec energy */
                    gIngx[0] = (short)(pitchIndx >> CDBK2_BIT_NUM) ;
                    gIngx[1] = (short)(pitchIndx & (CDBK2_DIM-1));
                    ippsDecodeGain_G729_16s(i, decoderObj->prevFrameQuantEn, gIngx, decoderObj->gains);
                    LOCAL_ARRAY_FREE(short, gIngx, 2, decoderObj);
                } else {
                    ippsDecodeGain_G729_16s(0, decoderObj->prevFrameQuantEn, NULL, decoderObj->gains);
                }
            } else {
                int energy;

                ippsDotProd_16s32s_Sfs(ACELPcodeVec, ACELPcodeVec, LP_SUBFRAME_DIM, &energy, 0); /* ACELPcodeVec energy */
                if(decoderObj->codecType == G729D_CODEC) {

⌨️ 快捷键说明

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