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