?? encg729.c
字號:
(G729Encoder_Obj* encoderObj,const short *src, unsigned char* dst, G729Codec_Type codecType , int *frametype) {
LOCAL_ALIGN_ARRAY(32, short, impResp, LP_SUBFRAME_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, short, val1, LP_SUBFRAME_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, short, tmpVec2, LP_SUBFRAME_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, short, codeword, LP_SUBFRAME_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, short, y1, LP_SUBFRAME_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, short, y2, LP_SUBFRAME_DIM,encoderObj);
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, tmpvec, BWLPCF_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, short, pAp1, BWLPCF1_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, short, tmp_not_used,LP_SUBFRAME_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, short, pAp2, BWLPCF1_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, short, interpLSF, LPF_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, short, newLSF, LPF_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, int, BWDacf, BWLPCF1_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, int, BWDacfHigh, BWLPCF1_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, short, BWDrc,BWLPCF_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, short, pBwdLPC2,2*BWLPCF1_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, short, nullArr, LP_SUBFRAME_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, short, LTPresid, LP_SUBFRAME_DIM,encoderObj);
LOCAL_ARRAY(short,indexFC,2,encoderObj);
LOCAL_ARRAY(short,delay,2,encoderObj);
LOCAL_ARRAY(short,LAR,4,encoderObj);
LOCAL_ARRAY(short,wfact1,2,encoderObj);
LOCAL_ARRAY(short,wfact2,2,encoderObj);
LOCAL_ARRAY(short,LSPcode,2,encoderObj);
LOCAL_ARRAY(short,freqNow,LPF_DIM,encoderObj);
short *pAq, *pAp, bestOPLag, index, gainAc, gainCode, gainPit, tmp, improveFlag, subfr;
char *synFltw = encoderObj->synFltw;
short *pAna = encoderObj->encPrm,*anau;
short *speechHistory = encoderObj->speechHistory;
short *prevSubfrLSP = encoderObj->prevSubfrLSP;
short *prevSubfrLSPquant = encoderObj->prevSubfrLSPquant;
short betaPreFilter = encoderObj->betaPreFilter;
short *resFilMem0 = encoderObj->resFilMem0;
short *prevWgtSpeech = encoderObj->prevWgtSpeech;
short *wsp = prevWgtSpeech + MAX_PITCH_LAG;
short *prevExcitat = encoderObj->prevExcitat;
short *exc = prevExcitat + L_prevExcitat;
int i, j, subfrIdx, valOpenDelay;
short vadEnable = (encoderObj->objPrm.mode == G729Encode_VAD_Enabled);
char *synFltw0 = encoderObj->synFltw0;
short *resFilMem = encoderObj->resFilMem;
short *error = resFilMem + BWLPCF_DIM;
short lpMode = 0;
short satFilt;
short mAp, mAq, m_a;
short *ppAp, *ppAq;
short tmp1, tmp2,avgLag;
VADmemory* vM = (VADmemory*)encoderObj->vadMem;
if(NULL==src || NULL ==dst)
return APIG729_StsBadArgErr;
if(encoderObj->preProc == NULL)
return APIG729_StsNotInitialized;
if((codecType != G729_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;
ippsZero_16s(nullArr, LP_SUBFRAME_DIM);
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);
{
LOCAL_ALIGN_ARRAY(32, short, rCoeff, LPF_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, short, newLSP, LPF_DIM,encoderObj);
LOCAL_ALIGN_ARRAY(32, short, newQlsp, LPF_DIM+1,encoderObj);
LOCAL_ALIGN_ARRAY(32, int, autoR, VAD_LPC_DIM +2,encoderObj);
LOCAL_ALIGN_ARRAY(32, short, yVal, LP_WINDOW_DIM,encoderObj);
short Vad=1;
short norma;
short *rhNBE = &newQlsp[0];
norma=1;
ippsMul_NR_16s_Sfs(LPC_WINDOW,hammingWin,yVal,LP_WINDOW_DIM,15);
j = LPF_DIM;
if(vadEnable == 1)
j = VAD_LPC_DIM ;
while(ippsAutoCorr_NormE_16s32s(yVal,LP_WINDOW_DIM,autoR,j+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(ippsLevinsonDurbin_G729_32s16s(autoR, LPF_DIM, &pAp_t[LPF_DIM+1], rCoeff, &tmp ) == ippStsOverflow) {
for(i=0; i<=LPF_DIM; i++) {
pAp_t[LPF_DIM+1+i] = encoderObj->prevSubfrLPC[i];
}
rCoeff[0] = encoderObj->prevRC[0];
rCoeff[1] = encoderObj->prevRC[1];
} else {
for(i=0; i<=LPF_DIM; i++) encoderObj->prevSubfrLPC[i] = pAp_t[LPF_DIM+1+i];
encoderObj->prevRC[0] = rCoeff[0];
encoderObj->prevRC[1] = rCoeff[1];
}
ippsLPCToLSP_G729_16s(&pAp_t[LPF_DIM+1], prevSubfrLSP, newLSP);
if(vadEnable == 1) {
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;
/* the next frame's LSPs update*/
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] & 1) << 7) | ((anau[1] & 31) << 2) | ((anau[2] & 15)>>2);
dst[1] = ((anau[2] & 3) << 6) | ((anau[3] & 31) << 1);
}
CLEAR_SCRATCH_MEMORY(encoderObj);
return APIG729_StsNoErr;
}
}
*pAna++ = CodecTypeToRate[encoderObj->codecType];
encoderObj->seed = SEED_INIT;
vM->VADPPrev = vM->VADPrev;
vM->VADPrev = Vad;
encoderObj->CNGidx = 0;
LOCAL_ALIGN_ARRAY_FREE(32,short, yVal, LP_WINDOW_DIM,encoderObj);
if(encoderObj->codecType == G729_CODEC) {
ippsLSPQuant_G729_16s(newLSP,(Ipp16s*)encoderObj->prevLSPfreq,newQlsp,pAna);
pAna += 2;
} else {
if(encoderObj->codecType == G729E_CODEC) {
ippsWinHybrid_G729E_16s32s(encoderObj->BWDsynth, BWDacf,
(IppsWinHybridState_G729E_16s*)&encoderObj->hwState);
BWDLagWindow(BWDacf, BWDacfHigh);
if(ippsLevinsonDurbin_G729_32s16s(BWDacfHigh, BWLPCF_DIM, &pBwdLPC2[BWLPCF1_DIM], BWDrc, &tmp )
== ippStsOverflow) {
for(i=0; i<=BWLPCF_DIM; i++) {
pBwdLPC2[BWLPCF1_DIM+i] = encoderObj->pPrevBwdLPC[i];
}
BWDrc[0] = encoderObj->pPrevBwdRC[0];
BWDrc[1] = encoderObj->pPrevBwdRC[1];
} else {
for(i=0; i<=BWLPCF_DIM; i++) encoderObj->pPrevBwdLPC[i] = pBwdLPC2[BWLPCF1_DIM+i];
encoderObj->pPrevBwdRC[0] = BWDrc[0];
encoderObj->pPrevBwdRC[1] = BWDrc[1];
}
satFilt = 0;
for(i=BWLPCF1_DIM; i<2*BWLPCF1_DIM; i++) if(pBwdLPC2[i] >= IPP_MAX_16S)
satFilt = 1;
if(satFilt == 1)
ippsCopy_16s(encoderObj->pBwdLPC2, &pBwdLPC2[BWLPCF1_DIM], BWLPCF1_DIM);
else
ippsCopy_16s(&pBwdLPC2[BWLPCF1_DIM], encoderObj->pBwdLPC2, BWLPCF1_DIM);
ippsMulPowerC_NR_16s_Sfs(&pBwdLPC2[BWLPCF1_DIM], N0_98, &pBwdLPC2[BWLPCF1_DIM], BWLPCF1_DIM,15);
}
ippsCopy_16s(&encoderObj->BWDsynth[LP_FRAME_DIM], &encoderObj->BWDsynth[0], SYNTH_BWD_DIM);
ippsLSPQuant_G729E_16s(newLSP,(const Ipp16s*)encoderObj->prevLSPfreq,freqNow,newQlsp,LSPcode);
}
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);
ippsInterpolate_G729_16s(newQlsp,prevSubfrLSPquant,tmpvec,LPF_DIM);
ippsLSPToLPC_G729_16s(tmpvec,&pAq_t[0]);
ippsLSPToLPC_G729_16s(newQlsp,&pAq_t[LPF_DIM+1]);
} else {
ippsLSPToLPC_G729_16s(newLSP,pAp_t);
ippsLSPToLSF_Norm_G729_16s(newLSP, newLSF);
ippsCopy_16s(newLSF, interpLSF, LPF_DIM);
ippsLSPToLPC_G729_16s(newQlsp,&pAq_t[LPF_DIM+1]);
ippsCopy_16s(&pAq_t[LPF_DIM+1], pAq_t, LPF_DIM+1);
}
if(encoderObj->codecType == G729E_CODEC) {
SetLPCMode_G729E(PRESENT_SPEECH, pAq_t, pBwdLPC2, &lpMode,
newLSP, prevSubfrLSP, encoderObj);
}
/* the next frame's LSPs update*/
ippsCopy_16s(newLSP,prevSubfrLSP,LPF_DIM);
if(lpMode==0) {
ippsCopy_16s(newQlsp,prevSubfrLSPquant,LPF_DIM);
_ippsRCToLAR_G729_16s(rCoeff,LAR+2,2);
mAq = LPF_DIM;
mAp = LPF_DIM;
if(encoderObj->dominantBWDmode == 0)
pAp = pAp_t;
else
pAp = pAq_t;
pAq = pAq_t;
tmp = encoderObj->prevLAR[0] + LAR[2];
LAR[0] = (tmp<0)? ~(( ~tmp) >> 1 ) : tmp>>1;
tmp = encoderObj->prevLAR[1] + LAR[3];
LAR[1] = (tmp<0)? ~(( ~tmp) >> 1 ) : tmp>>1;
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);
}
ippsMulPowerC_NR_16s_Sfs(&pAp[0],wfact1[0], pAp1,LPF_DIM+1,15);
ippsMulPowerC_NR_16s_Sfs(&pAp[0],wfact2[0], pAp2,LPF_DIM+1,15);
ippsResidualFilter_G729_16s(&PRESENT_SPEECH[0],pAp1, &wsp[0]);
ippsSynthesisFilterLow_NR_16s_ISfs(pAp2,wsp,LP_SUBFRAME_DIM,12,((SynthesisFilterState*)synFltw)->buffer+20);
ippsCopy_16s((wsp+LP_SUBFRAME_DIM-30), ((SynthesisFilterState*)synFltw)->buffer, 30);
ippsMulPowerC_NR_16s_Sfs(&pAp[LPF_DIM+1],wfact1[1], pAp1,LPF_DIM+1,15);
ippsMulPowerC_NR_16s_Sfs(&pAp[LPF_DIM+1],wfact2[1], pAp2,LPF_DIM+1,15);
ippsResidualFilter_G729_16s(&PRESENT_SPEECH[LP_SUBFRAME_DIM], pAp1, &wsp[LP_SUBFRAME_DIM]);
ippsSynthesisFilterLow_NR_16s_ISfs(pAp2,&wsp[LP_SUBFRAME_DIM],LP_SUBFRAME_DIM,12,((SynthesisFilterState*)synFltw)->buffer+20);
ippsCopy_16s((&wsp[LP_SUBFRAME_DIM]+LP_SUBFRAME_DIM-30), ((SynthesisFilterState*)synFltw)->buffer, 30);
ippsOpenLoopPitchSearch_G729_16s(wsp, &bestOPLag);
if((encoderObj->codecType != G729_CODEC)) {
if(encoderObj->codecType == G729E_CODEC)
*pAna++ = lpMode;
for( i = LSP_MA_ORDER-1 ; i > 0 ; i-- )
ippsCopy_16s(encoderObj->prevLSPfreq[i-1], encoderObj->prevLSPfreq[i], LPF_DIM);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -