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

📄 decg729.c

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 C
📖 第 1 页 / 共 5 页
字号:
    if(DEC_KEY != decoderObj->objPrm.key)
        return APIG729_StsBadCodecType;

    delayVal[0]=delayVal[1]=0;

    pA = AzDec;
    pParm = src;
    if(frametype == -1) {
        decoderObj->decPrm[1] = 0;
        decoderObj->decPrm[0] = 1;
    } else if(frametype == 0) {
        decoderObj->decPrm[1] = 0;
        decoderObj->decPrm[0] = 0;

    } else if(frametype == 1) {
        decoderObj->decPrm[1] = 1;
        decoderObj->decPrm[0] = 0;
        i=0;
        decoderObj->decPrm[1+1] = ExtractBitsG729(&pParm,&i,1);
        decoderObj->decPrm[1+2] = ExtractBitsG729(&pParm,&i,5);
        decoderObj->decPrm[1+3] = ExtractBitsG729(&pParm,&i,4);
        decoderObj->decPrm[1+4] = ExtractBitsG729(&pParm,&i,5);

    } else if(frametype == 2) {
        decoderObj->decPrm[0] = 0;
        decoderObj->decPrm[1] = 2;
        i=0;
        decoderObj->decPrm[2] = ExtractBitsG729(&pParm,&i,1+FIR_STAGE_BITS);
        decoderObj->decPrm[3] = ExtractBitsG729(&pParm,&i,SEC_STAGE_BITS*2);
        decoderObj->decPrm[4] = ExtractBitsG729(&pParm,&i,8);
        decoderObj->decPrm[5] = ExtractBitsG729(&pParm,&i,9);
        decoderObj->decPrm[6] = ExtractBitsG729(&pParm,&i,2);
        decoderObj->decPrm[7] = ExtractBitsG729(&pParm,&i,6);
        decoderObj->decPrm[8] = ExtractBitsG729(&pParm,&i,4);
        decoderObj->decPrm[9] = ExtractBitsG729(&pParm,&i,9);
        decoderObj->decPrm[10] = ExtractBitsG729(&pParm,&i,2);
        decoderObj->decPrm[11] = ExtractBitsG729(&pParm,&i,6);

        decoderObj->codecType = G729D_CODEC;
    } else if(frametype == 3) {
        i=0;
        decoderObj->decPrm[1] = 3;
        decoderObj->decPrm[0] = 0;
        decoderObj->decPrm[1+1] = ExtractBitsG729(&pParm,&i,1+FIR_STAGE_BITS);
        decoderObj->decPrm[1+2] = ExtractBitsG729(&pParm,&i,SEC_STAGE_BITS*2);
        decoderObj->decPrm[1+3] = ExtractBitsG729(&pParm,&i,8);
        decoderObj->decPrm[1+4] = ExtractBitsG729(&pParm,&i,1);
        decoderObj->decPrm[1+5] = ExtractBitsG729(&pParm,&i,13);
        decoderObj->decPrm[1+6] = ExtractBitsG729(&pParm,&i,4);
        decoderObj->decPrm[1+7] = ExtractBitsG729(&pParm,&i,7);
        decoderObj->decPrm[1+8] = ExtractBitsG729(&pParm,&i,5);
        decoderObj->decPrm[1+9] = ExtractBitsG729(&pParm,&i,13);
        decoderObj->decPrm[1+10] = ExtractBitsG729(&pParm,&i,4);
        decoderObj->decPrm[1+11] = ExtractBitsG729(&pParm,&i,7);
        decoderObj->decPrm[1+4] = (equality(decoderObj->decPrm[1+3])+decoderObj->decPrm[1+4]) & 0x00000001; /*  parity error (1) */
        decoderObj->codecType = G729_CODEC;
    } else if(frametype == 4) {
        short tmp;
        i=0;
        tmp = ExtractBitsG729(&pParm,&i,2);

        decoderObj->decPrm[0] = 0;
        decoderObj->decPrm[1] = 4;
        if(tmp==0) {
            decoderObj->decPrm[2] = 0;

            decoderObj->decPrm[3] = ExtractBitsG729(&pParm,&i,1+FIR_STAGE_BITS);
            decoderObj->decPrm[4] = ExtractBitsG729(&pParm,&i,SEC_STAGE_BITS*2);
            decoderObj->decPrm[5] = ExtractBitsG729(&pParm,&i,8);
            decoderObj->decPrm[6] = ExtractBitsG729(&pParm,&i,1);
            decoderObj->decPrm[7] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[8] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[9] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[10] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[11] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[12] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[13] = ExtractBitsG729(&pParm,&i,5);
            decoderObj->decPrm[14] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[15] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[16] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[17] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[18] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[19] = ExtractBitsG729(&pParm,&i,7);

            i = decoderObj->decPrm[5]>>1;
            i &= 1;
            decoderObj->decPrm[6] += i;
            decoderObj->decPrm[6] = (equality(decoderObj->decPrm[5])+decoderObj->decPrm[6]) & 0x00000001;/* parm[6] = parity error (1) */
        } else {
            decoderObj->decPrm[2] = 1; /*LPmode*/

            decoderObj->decPrm[3] = ExtractBitsG729(&pParm,&i,8);
            decoderObj->decPrm[4] = ExtractBitsG729(&pParm,&i,1);
            decoderObj->decPrm[5] = ExtractBitsG729(&pParm,&i,13);
            decoderObj->decPrm[6] = ExtractBitsG729(&pParm,&i,10);
            decoderObj->decPrm[7] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[8] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[9] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[10] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[11] = ExtractBitsG729(&pParm,&i,5);
            decoderObj->decPrm[12] = ExtractBitsG729(&pParm,&i,13);
            decoderObj->decPrm[13] = ExtractBitsG729(&pParm,&i,10);
            decoderObj->decPrm[14] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[15] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[16] = ExtractBitsG729(&pParm,&i,7);
            decoderObj->decPrm[17] = ExtractBitsG729(&pParm,&i,7);

            i = decoderObj->decPrm[3]>>1;
            i &= 1;
            decoderObj->decPrm[4] += i;
            decoderObj->decPrm[4] = (equality(decoderObj->decPrm[3])+decoderObj->decPrm[4]) & 0x00000001;/* parm[4] = parity error (1) */
        }
        decoderObj->codecType = G729E_CODEC;
    }

    parm = decoderObj->decPrm;

    badFrameIndicator = *parm++;
    fType = *parm;
    if(badFrameIndicator == 1) {
        fType = decoderObj->CNGvar;
        if(fType == 1) fType = 0;
    } else {
        decoderObj->valGainAttenuation = IPP_MAX_16S;
        decoderObj->BFIcount = 0;
    }

    if( fType == 4) {
        if(badFrameIndicator != 0) {
            LPmode = decoderObj->prevLPmode;
        } else {
            LPmode = parm[1];
        }
        if(decoderObj->prevBFI != 0) {
            voiceFlag = decoderObj->prevVoiceFlag;
            decoderObj->voiceFlag = decoderObj->prevVoiceFlag;
        }
        ippsWinHybrid_G729E_16s32s(decoderObj->LTPostFilt, BWDacf,
                                   (IppsWinHybridState_G729E_16s*)&decoderObj->hwState);

        BWDLagWindow(BWDacf, BWDhighAcf);

        if(ippsLevinsonDurbin_G729_32s16s(BWDhighAcf, BWLPCF_DIM, &BWDfiltLPC[BWLPCF1_DIM], BWDrc,&temp) == ippStsOverflow) {
            ippsCopy_16s(decoderObj->pPrevBwdLPC,&BWDfiltLPC[BWLPCF1_DIM],BWLPCF1_DIM);
            BWDrc[0] = decoderObj->pPrevBwdRC[0];
            BWDrc[1] = decoderObj->pPrevBwdRC[1];

        } else {
            ippsCopy_16s(&BWDfiltLPC[BWLPCF1_DIM],decoderObj->pPrevBwdLPC,BWLPCF1_DIM);
            decoderObj->pPrevBwdRC[0] = BWDrc[0];
            decoderObj->pPrevBwdRC[1] = BWDrc[1];
        }

        satFilter = 0;
        for(i=BWLPCF1_DIM; i<2*BWLPCF1_DIM; i++) {
            if(BWDfiltLPC[i] >= IPP_MAX_16S) {
                satFilter = 1;
                break;
            }
        }
        if(satFilter == 1) ippsCopy_16s(decoderObj->pBwdLPC2, &BWDfiltLPC[BWLPCF1_DIM], BWLPCF1_DIM);
        else ippsCopy_16s(&BWDfiltLPC[BWLPCF1_DIM], decoderObj->pBwdLPC2, BWLPCF1_DIM);

        ippsMulPowerC_NR_16s_Sfs(&BWDfiltLPC[BWLPCF1_DIM], N0_98, &BWDfiltLPC[BWLPCF1_DIM], BWLPCF1_DIM, 15);
    }
    ippsCopy_16s(&decoderObj->LTPostFilt[LP_FRAME_DIM], &decoderObj->LTPostFilt[0], SYNTH_BWD_DIM);

    if(LPmode == 1) {
        short tmp;

        if((decoderObj->interpCoeff2 != 0)) {
            tmp = (1<<12) - decoderObj->interpCoeff2;
            ippsInterpolateC_G729_16s_Sfs(BWDfiltLPC + BWLPCF1_DIM, tmp,
                                          decoderObj->pBwdLPC, decoderObj->interpCoeff2, BWDfiltLPC + BWLPCF1_DIM, BWLPCF1_DIM, 12);
        }
    }
    if((badFrameIndicator != 0)&&(decoderObj->prevBFI == 0) && (decoderObj->CNGvar >3))
        ippsCopy_16s(&BWDfiltLPC[BWLPCF1_DIM],decoderObj->pBwdLPC,BWLPCF1_DIM);

    if(fType < 2) {
        if(fType == 1) {
            LOCAL_ALIGN_ARRAY(32, short, lsfq,LPF_DIM,decoderObj);
            sidGain = SIDgain[(int)parm[4]];
            ippsLSFDecode_G729B_16s(&parm[1],(Ipp16s*)(decoderObj->prevLSPfreq),lsfq);
            ippsLSFToLSP_G729_16s(lsfq,lspSID);
            LOCAL_ALIGN_ARRAY_FREE(32, short, lsfq,LPF_DIM,decoderObj);
        } else {
            if(decoderObj->CNGvar > 1) {
                QuantSIDGain_G729B_16s(&decoderObj->SIDflag0, &decoderObj->SIDflag1, 0, &temp, &index2);
                sidGain = SIDgain[(int)index2];
            }
        }
        if(decoderObj->CNGvar > 1) {
            gainNow = sidGain;
        } else {
            gainNow = (gainNow * GAIN0 + BWF_HARMONIC)>>15;
            gainNow = Add_16s(gainNow, (short)((sidGain * GAIN1 + BWF_HARMONIC)>>15));
        }

        if(gainNow == 0) {
            ippsZero_16s(excitation,LP_FRAME_DIM);
            gpVal = 0;
            for(subfrIdx = 0;  subfrIdx < LP_FRAME_DIM; subfrIdx += LP_SUBFRAME_DIM) {
                ippsPhaseDispersionUpdate_G729D_16s(gpVal,gainNow,
                                                    (IppsPhaseDispersion_State_G729D*)decoderObj->PhDispMem);
            }
        } else {
            for(i = 0;  i < LP_FRAME_DIM; i += LP_SUBFRAME_DIM) {
                int    invSq;
                Ipp16s pG2, tmp, tmp2;
                const short *excCached;
                LOCAL_ARRAY(Ipp16s, idx, 4, decoderObj);
                LOCAL_ARRAY(Ipp16s, pulseSign, 4, decoderObj);
                LOCAL_ALIGN_ARRAY(32, Ipp16s, excg, LP_SUBFRAME_DIM, decoderObj);
                LOCAL_ARRAY(Ipp16s,tempArray,LP_SUBFRAME_DIM, decoderObj);
                RandomCodebookParm_G729B_16s(&decoderObj->seed,idx,pulseSign,&pG2,delayVal);
                ippsDecodeAdaptiveVector_G729_16s_I(delayVal,&prevExcitat[i]);
                if(decoderObj->CNGidx > CNG_STACK_SIZE-1) { /* not cached */
                    ippsRandomNoiseExcitation_G729B_16s(&decoderObj->seed,excg,LP_SUBFRAME_DIM);
                    ippsDotProd_16s32s_Sfs(excg,excg,LP_SUBFRAME_DIM,&invSq,0);
                    ippsInvSqrt_32s_I(&invSq,1);
                    excCached=excg;
                } else {
                    decoderObj->seed = cngSeedOut[decoderObj->CNGidx];
                    invSq = cngInvSqrt[decoderObj->CNGidx];
                    excCached=&cngCache[decoderObj->CNGidx][0];
                    decoderObj->CNGidx++;
                }
                NoiseExcitationFactorization_G729B_16s(excCached,invSq,gainNow,excg,LP_SUBFRAME_DIM);
                tmp2 = ComfortNoiseExcitation_G729B_16s_I(excg,idx,pulseSign,gainNow,pG2,&excitation[i],&tmp,tempArray);
                if(tmp2 < 0) gpVal = 0;
                if(tmp >= 0)
                    ippsPhaseDispersionUpdate_G729D_16s(gpVal,tmp,
                                                        (IppsPhaseDispersion_State_G729D*)decoderObj->PhDispMem);
                else
                    ippsPhaseDispersionUpdate_G729D_16s(gpVal,(short)-tmp,
                                                        (IppsPhaseDispersion_State_G729D*)decoderObj->PhDispMem);

                LOCAL_ARRAY_FREE(Ipp16s,tempArray,LP_SUBFRAME_DIM, decoderObj);
                LOCAL_ALIGN_ARRAY_FREE(32, Ipp16s, excg, LP_SUBFRAME_DIM, decoderObj);
                LOCAL_ARRAY_FREE(Ipp16s, pulseSign, 4, decoderObj);
                LOCAL_ARRAY_FREE(Ipp16s, idx, 4, decoderObj);
            }
        }
        ippsInterpolate_G729_16s(prevSubfrLSP,lspSID,prevSubfrLSP, LPF_DIM );
        ippsLSPToLPC_G729_16s(prevSubfrLSP,&FWDfiltLPC[0]);
        ippsLSPToLPC_G729_16s(lspSID,&FWDfiltLPC[LPF_DIM+1]);
        ippsCopy_16s(lspSID, prevSubfrLSP, LPF_DIM );
        decoderObj->sidGain = sidGain;
        decoderObj->gainNow = gainNow;

        ppAz = FWDfiltLPC;
        for(subfrIdx = 0; subfrIdx < LP_FRAME_DIM; subfrIdx += LP_SUBFRAME_DIM) {
            if(SynthesisFilter_G729_16s(ppAz,&excitation[subfrIdx],&synth[subfrIdx],LP_SUBFRAME_DIM,synFltw,20)==
               ippStsOverflow) {
                /* scale down excitation and redo in case of overflow */
                ippsRShiftC_16s_I(2,prevExcitat,L_prevExcitat+LP_FRAME_DIM);
                SynthesisFilterOvf_G729_16s(ppAz,&excitation[subfrIdx],&synth[subfrIdx],LP_SUBFRAME_DIM,synFltw,20);
            }

            ppAz += LPF_DIM+1;
            prevFrameDelay[subfrIdx/LP_SUBFRAME_DIM] = decoderObj->prevFrameDelay;
        }
        decoderObj->betaPreFilter = PITCH_SHARP_MIN;

        prevFrameDelay1 = decoderObj->prevFrameDelay;
        decoderObj->interpCoeff2_2 = 4506;
        decoderObj->BWDFrameCounter = 0;
        decoderObj->stat_pitch = 0;
        ippsCopy_16s(&FWDfiltLPC[LPF_DIM+1], decoderObj->pPrevFilt, LPF_DIM+1);
        ippsZero_16s(&decoderObj->pPrevFilt[LPF_DIM+1], (BWLPCF1_DIM-LPF_DIM-1));

    } else {
        decoderObj->seed = SEED_INIT;
        decoderObj->CNGidx = 0;
        parm++;
        if(decoderObj->codecType == G729E_CODEC) parm++;
        if( LPmode==0 ) {
            LOCAL_ARRAY(short, qIndex,4,decoderObj);

            qIndex[0] = (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));

⌨️ 快捷键说明

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