📄 encg729.c
字号:
} ippsSub_16s(tmpvec,&val1[LP_SUBFRAME_DIM-m_a],resFilMem0,m_a); ppAq += mAq+1; ppAp += mAp+1; } ippsMove_16s(&speechHistory[LP_FRAME_DIM], &speechHistory[0], SPEECH_BUF_DIM-LP_FRAME_DIM); ippsMove_16s(&prevWgtSpeech[LP_FRAME_DIM], &prevWgtSpeech[0], MAX_PITCH_LAG); ippsMove_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] = (Ipp8u)(anau[0] & 255); dst[1] = (Ipp8u)((anau[1] & 0x3ff) >> 2); dst[2] = (Ipp8u)(((anau[1] & 3) << 6) | ((anau[2]>>2)&0x3f)); dst[3] = (Ipp8u)(((anau[2] & 3) << 6) | ((anau[3] & 1) << 5) | ((anau[4] & 8191) >> 8)); dst[4] = (Ipp8u)(anau[4] & 255); dst[5] = (Ipp8u)(((anau[5] & 15)<<4) | ((anau[6] & 127) >> 3)); dst[6] = (Ipp8u)(((anau[6] & 7)<< 5) | (anau[7] & 31)); dst[7] = (Ipp8u)((anau[8] & 8191) >> 5); dst[8] = (Ipp8u)(((anau[8] & 31) << 3) | ((anau[9] & 15) >> 1)); dst[9] = (Ipp8u)(((anau[9] & 1) << 7) | (anau[10] & 127)); } else if(encoderObj->codecType == G729D_CODEC) { *frametype=2; dst[0] = (Ipp8u)(anau[0] & 255); dst[1] = (Ipp8u)((anau[1] & 0x3ff) >> 2); dst[2] = (Ipp8u)(((anau[1] & 3) << 6) | ((anau[2]>>2)&0x3f)); dst[3] = (Ipp8u)(((anau[2] & 3) << 6) | ((anau[3]>>3)&0x3f)); dst[4] = (Ipp8u)(((anau[3] & 7) << 5) | ((anau[4] & 3) << 3) | ((anau[5] >> 3)& 7)); dst[5] = (Ipp8u)(((anau[5] & 7) << 5) | ((anau[6] & 15) << 1)| ((anau[7] >> 8)& 1)); dst[6] = (Ipp8u)(anau[7] & 255); dst[7] = (Ipp8u)((anau[8] & 3) << 6 | (anau[9] & 0x3f)); } else if(encoderObj->codecType == G729E_CODEC) { *frametype=4; if(lpMode == 0) { /* forward */ dst[0] = (Ipp8u)((anau[0] >> 2) & 0x3f); dst[1] = (Ipp8u)(((anau[0] & 3) << 6) | ((anau[1]>>4)&0x3f)); dst[2] = (Ipp8u)(((anau[1] & 15) << 4) | ((anau[2]>>4)&15)); dst[3] = (Ipp8u)(((anau[2] & 15) << 4) | ((anau[3]&1)<<3) | ((anau[4]>>4)&7)); dst[4] = (Ipp8u)(((anau[4] & 15) << 4) | ((anau[5]>>3)&15)); dst[5] = (Ipp8u)(((anau[5] & 7) << 5) | ((anau[6]>>2)&31)); dst[6] = (Ipp8u)(((anau[6] & 3) << 6) | ((anau[7]>>1)&0x3f)); dst[7] = (Ipp8u)(((anau[7]& 1) << 7) | (anau[8]&127)); dst[8] = (Ipp8u)(((anau[9]& 127) << 1) | ((anau[10]>>4)&1)); dst[9] = (Ipp8u)(((anau[10] & 15) << 4) | ((anau[11]>>3)&15)); dst[10] = (Ipp8u)(((anau[11] & 7) << 5) | ((anau[12]>>2)&31)); dst[11] = (Ipp8u)(((anau[12] & 3) << 6) | ((anau[13]>>1)&0x3f)); dst[12] = (Ipp8u)(((anau[13]& 1) << 7) | (anau[14]&127)); dst[13] = (Ipp8u)(((anau[15]& 127) << 1) | ((anau[16]>>6)&1)); dst[14] = (Ipp8u)(((anau[16] & 0x3f) << 2)); } else { /* backward */ dst[0] = (Ipp8u)((3<<6) | ((anau[0] >> 2) & 0x3f)); dst[1] = (Ipp8u)(((anau[0] & 3) << 6) | ((anau[1]&1)<<5) | ((anau[2]>>8)&31)); dst[2] = (Ipp8u)(anau[2] & 255); dst[3] = (Ipp8u)((anau[3] >> 2) & 255); dst[4] = (Ipp8u)(((anau[3] & 3) << 6) | ((anau[4]>>1)&0x3f)); dst[5] = (Ipp8u)(((anau[4]& 1) << 7) | (anau[5]&127)); dst[6] = (Ipp8u)(((anau[6]& 127) << 1) | ((anau[7]>>6)&1)); dst[7] = (Ipp8u)(((anau[7]&0x3f) << 2) | ((anau[8] >>3)&3)); dst[8] = (Ipp8u)(((anau[8] & 7) << 5) | ((anau[9]>>8)&31)); dst[9] = (Ipp8u)(anau[9] & 255); dst[10] = (Ipp8u)((anau[10] >> 2) & 255); dst[11] = (Ipp8u)(((anau[10] & 3) << 6) | ((anau[11]>>1)&0x3f)); dst[12] = (Ipp8u)(((anau[11]& 1) << 7) | (anau[12]&127)); dst[13] = (Ipp8u)(((anau[13]& 127) << 1) | ((anau[14]>>6)&1)); dst[14] = (Ipp8u)(((anau[14] & 0x3f) << 2)); } } CLEAR_SCRATCH_MEMORY(encoderObj); return APIG729_StsNoErr;}G729_CODECFUN( APIG729_Status, apiG729EncodeVAD, (G729Encoder_Obj* encoderObj,const Ipp16s *src, Ipp16s *dst, G729Codec_Type codecType, Ipp32s *frametype )) { LOCAL_ALIGN_ARRAY(32, Ipp16s, pAp_t,(LPF_DIM+1)*2,encoderObj); LOCAL_ALIGN_ARRAY(32, Ipp16s, pAq_t,(LPF_DIM+1)*2,encoderObj); LOCAL_ALIGN_ARRAY(32, Ipp16s, rCoeff, LPF_DIM,encoderObj); LOCAL_ALIGN_ARRAY(32, Ipp16s, newLSP, LPF_DIM,encoderObj); LOCAL_ALIGN_ARRAY(32, Ipp16s, rhNBE, LPF_DIM+1,encoderObj); LOCAL_ALIGN_ARRAY(32, Ipp32s, autoR, VAD_LPC_DIM +2,encoderObj); LOCAL_ALIGN_ARRAY(32, Ipp16s, tmpvec, BWLPCF_DIM,encoderObj); LOCAL_ALIGN_ARRAY(32, Ipp16s, val1, LP_SUBFRAME_DIM,encoderObj); LOCAL_ALIGN_ARRAY(32, Ipp16s, newLSF, LPF_DIM,encoderObj); LOCAL_ALIGN_ARRAY(32, Ipp16s, interpLSF, LPF_DIM,encoderObj); LOCAL_ALIGN_ARRAY(32, Ipp16s, pAp1, BWLPCF1_DIM,encoderObj); LOCAL_ALIGN_ARRAY(32, Ipp16s, pAp2, BWLPCF1_DIM,encoderObj); LOCAL_ALIGN_ARRAY(32, Ipp16s, yVal, LP_WINDOW_DIM,encoderObj); LOCAL_ARRAY(Ipp16s,LAR,4,encoderObj); LOCAL_ARRAY(Ipp16s,wfact1,2,encoderObj); LOCAL_ARRAY(Ipp16s,wfact2,2,encoderObj); Ipp16s s,norma,Vad=1,tmp,lpMode; Ipp16s *speechHistory = encoderObj->speechHistory; Ipp16s *prevSubfrLSP = encoderObj->prevSubfrLSP; Ipp16s vadEnable = (Ipp16s)((encoderObj->objPrm.mode == G729Encode_VAD_Enabled)); Ipp16s *prevSubfrLSPquant = encoderObj->prevSubfrLSPquant; Ipp16s *resFilMem0 = encoderObj->resFilMem0; Ipp16s *prevWgtSpeech = encoderObj->prevWgtSpeech; Ipp16s *wsp = prevWgtSpeech + MAX_PITCH_LAG; Ipp16s *prevExcitat = encoderObj->prevExcitat; Ipp16s *exc = prevExcitat + L_prevExcitat; Ipp16s *pAna = encoderObj->encPrm,*anau; Ipp8s *synFltw = encoderObj->synFltw; Ipp8s *synFltw0 = encoderObj->synFltw0; Ipp16s *resFilMem = encoderObj->resFilMem; Ipp16s *error = resFilMem + BWLPCF_DIM; Ipp32s i; VADmemory_Obj* vM = (VADmemory_Obj*)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 = (Ipp16s)(norma - i); for(i=0; i<LPF_DIM+1; i++) rhNBE[i] = (Ipp16s)(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, Ipp16s, tmpVecVAD_LPC_DIM2, VAD_LPC_DIM +1, encoderObj); VoiceActivityDetect_G729(LPC_WINDOW,tmpvec,autoR,norma,rCoeff[1],&Vad,encoderObj->vadMem, tmpVecVAD_LPC_DIM2); LOCAL_ALIGN_ARRAY_FREE(32, Ipp16s, tmpVecVAD_LPC_DIM2, 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; ippsMove_16s(&speechHistory[LP_FRAME_DIM], &speechHistory[0], SPEECH_BUF_DIM-LP_FRAME_DIM); ippsMove_16s(&prevWgtSpeech[LP_FRAME_DIM], &prevWgtSpeech[0], MAX_PITCH_LAG); ippsMove_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, Ipp16s, tmpVecVAD_LPC_DIM3, VAD_LPC_DIM +1, encoderObj); VoiceActivityDetect_G729(LPC_WINDOW,newLSF,autoR,norma,rCoeff[1],&Vad,encoderObj->vadMem, tmpVecVAD_LPC_DIM3); LOCAL_ALIGN_ARRAY_FREE(32, Ipp16s, tmpVecVAD_LPC_DIM3, 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) { ippsMove_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, Ipp16s, 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, Ipp16s, 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; ippsMove_16s(&speechHistory[LP_FRAME_DIM], &speechHistory[0], SPEECH_BUF_DIM-LP_FRAME_DIM); ippsMove_16s(&prevWgtSpeech[LP_FRAME_DIM], &prevWgtSpeech[0], MAX_PITCH_LAG); ippsMove_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];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -