📄 owng729fp.c
字号:
static __ALIGN32 CONST Ipp32s map1_G729D[SIZECODEBOOK1_ANNEXD] = { 0, 4, 6, 5, 2, 1, 7, 3 };static __ALIGN32 CONST Ipp32s map2_G729D[SIZECODEBOOK2_ANNEXD] = { 0, 4, 3, 7, 5, 1, 6, 2 };static __ALIGN32 CONST Ipp32s imap1_G729D[SIZECODEBOOK1_ANNEXD] = { 0, 5, 4, 7, 1, 3, 2, 6 };static __ALIGN32 CONST Ipp32s imap2_G729D[SIZECODEBOOK2_ANNEXD] = { 0, 5, 7, 2, 1, 4, 6, 3 };static __ALIGN32 CONST Ipp32f gbk1_G729D[SIZECODEBOOK1_ANNEXD][2] = {{ 0.357003f, 0.00000f},{ 0.178752f, 0.065771f},{ 0.575276f, 0.166704f},{ 0.370335f, 0.371903f},{ 0.220734f, 0.411803f},{ 0.193548f, 0.566385f},{ 0.238962f, 0.785625f},{ 0.304379f, 1.360714f}};static __ALIGN32 CONST Ipp32f gbk2_G729D[SIZECODEBOOK2_ANNEXD][2] = {{ 0.00000f, 0.254841f},{ 0.243384f, 0.00000f},{ 0.273293f, 0.447009f},{ 0.480707f, 0.477384f},{ 0.628117f, 0.694884f},{ 0.660905f, 1.684719f},{ 0.729735f, 0.655223f},{ 1.002375f, 0.959743f}};static __ALIGN32 CONST Ipp32f PredCoeff[4] = {(Ipp32f)0.68,(Ipp32f)0.58,(Ipp32f)0.34,(Ipp32f)0.19};static void GainCodebookPreselect_G729D(Ipp32f *pBestGains, Ipp32s *pCand, Ipp32f fGainCode){ Ipp32f x,y ; x = (pBestGains[1]-(coef_G729D[0][0]*pBestGains[0]+coef_G729D[1][1])*fGainCode) * INV_COEF_ANNEXD ; y = (coef_G729D[1][0]*(-coef_G729D[0][1]+pBestGains[0]*coef_G729D[0][0])*fGainCode -coef_G729D[0][0]*pBestGains[1]) * INV_COEF_ANNEXD ; if(fGainCode>(Ipp32f)0.0){ /* pre select first index */ pCand[0] = 0 ; do{ if(y>thr1_G729D[pCand[0]]*fGainCode) (pCand[0])++ ; else break ; } while((pCand[0])<(SIZECODEBOOK1_ANNEXD-NUM_CAND1_ANNEXD)) ; /* pre select second index */ pCand[1] = 0 ; do{ if(x>thr2_G729D[pCand[1]]*fGainCode) (pCand[1])++ ; else break ; } while((pCand[1])<(SIZECODEBOOK2_ANNEXD-NUM_CAND2_ANNEXD)) ; } else{ /* pre select first index */ pCand[0] = 0 ; do{ if(y<thr1_G729D[pCand[0]]*fGainCode) (pCand[0])++ ; else break ; } while((pCand[0])<(SIZECODEBOOK1_ANNEXD-NUM_CAND1_ANNEXD)) ; /* pre select second index */ pCand[1] = 0 ; do{ if(x<thr2_G729D[pCand[1]]*fGainCode) (pCand[1])++ ; else break ; } while((pCand[1])<(SIZECODEBOOK2_ANNEXD-NUM_CAND2_ANNEXD)) ; } return ;}static void GainCodebookPreselect_G729(Ipp32f *pBestGains, Ipp32s *pCand, Ipp32f fGainCode){ Ipp32f x,y ; x = (pBestGains[1]-(coef_G729[0][0]*pBestGains[0]+coef_G729[1][1])*fGainCode) * INV_COEF_BASE ; y = (coef_G729[1][0]*(-coef_G729[0][1]+pBestGains[0]*coef_G729[0][0])*fGainCode -coef_G729[0][0]*pBestGains[1]) * INV_COEF_BASE ; if(fGainCode>(Ipp32f)0.0){ /* pre select first index */ pCand[0] = 0 ; do{ if(y>thr1_G729[pCand[0]]*fGainCode) (pCand[0])++ ; else break ; } while((pCand[0])<(SIZECODEBOOK1-NUM_CAND1)) ; /* pre select second index */ pCand[1] = 0 ; do{ if(x>thr2_G729[pCand[1]]*fGainCode) (pCand[1])++ ; else break ; } while((pCand[1])<(SIZECODEBOOK2-NUM_CAND2)) ; } else{ /* pre select first index */ pCand[0] = 0 ; do{ if(y<thr1_G729[pCand[0]]*fGainCode) (pCand[0])++ ; else break ; } while((pCand[0])<(SIZECODEBOOK1-NUM_CAND1)) ; /* pre select second index */ pCand[1] = 0 ; do{ if(x<thr2_G729[pCand[1]]*fGainCode) (pCand[1])++ ; else break ; } while((pCand[1])<(SIZECODEBOOK2-NUM_CAND2)) ; } return ;}static void GainUpdate_G729_32f(Ipp32f *pastQntEnergies, Ipp32f fGainCode){ Ipp32s j; /* update table of past quantized energies */ for (j = 3; j > 0; j--) pastQntEnergies[j] = pastQntEnergies[j-1]; pastQntEnergies[0] = (Ipp32f)20.0*(Ipp32f)log10((Ipp64f)fGainCode); return;}static void GainPredict_G729_32f(Ipp32f *pastQntEnr, Ipp32f *FixedCodebookExc, Ipp32s len,Ipp32f *fGainCode){ Ipp32f fEnergy, predCodeboookGain; Ipp32s i; Ipp64f dTmp; predCodeboookGain = MEAN_ENER ; /* innovation energy */ ippsDotProd_32f64f(FixedCodebookExc, FixedCodebookExc, len, &dTmp); fEnergy = (Ipp32f)dTmp+0.01f; fEnergy = (Ipp32f)10.0 * (Ipp32f)log10(fEnergy /(Ipp32f)len); predCodeboookGain -= fEnergy; /* predicted energy */ for (i=0; i<4; i++) predCodeboookGain += PredCoeff[i]*pastQntEnr[i]; /* predicted codebook gain */ *fGainCode = predCodeboookGain; *fGainCode = (Ipp32f)pow((Ipp64f)10.0,(Ipp64f)(*fGainCode/20.0)); /* predicted gain */ return;}Ipp32s GainQuant_G729(Ipp32f *FixedCodebookExc, Ipp32f *pGainCoeff, Ipp32s lSbfrLen, Ipp32f *pitchGain, Ipp32f *codeGain, Ipp32s tamingflag, Ipp32f *PastQuantEnergy, G729Codec_Type codecType,Ipp8s *pExtBuff){ Ipp32s *pCand,*index; Ipp32f fGainCode ; Ipp32f *pBestGain,fTmp; Ipp64f dGainCode; Ipp32s lQIndex; pBestGain = (Ipp32f *)pExtBuff; pCand = (Ipp32s *)(pExtBuff + 2*sizeof(Ipp32f)); index = (Ipp32s *)((Ipp8s *)pCand + 2*sizeof(Ipp32s)); GainPredict_G729_32f( PastQuantEnergy, FixedCodebookExc, lSbfrLen, &fGainCode); /*-- pre-selection --*/ fTmp = (Ipp32f)-1./((Ipp32f)4.*pGainCoeff[0]*pGainCoeff[2]-pGainCoeff[4]*pGainCoeff[4]) ; pBestGain[0] = ((Ipp32f)2.*pGainCoeff[2]*pGainCoeff[1]-pGainCoeff[3]*pGainCoeff[4])*fTmp ; pBestGain[1] = ((Ipp32f)2.*pGainCoeff[0]*pGainCoeff[3]-pGainCoeff[1]*pGainCoeff[4])*fTmp ; if (tamingflag == 1){ CLIP_TO_UPLEVEL(pBestGain[0],MAX_GAIN_TIMING2); } /* Presearch for gain codebook */ if(codecType==G729D_CODEC) { GainCodebookPreselect_G729D(pBestGain,pCand,fGainCode) ; ippsGainCodebookSearch_G729D_32f(pGainCoeff, fGainCode, pCand, index, tamingflag); *pitchGain = gbk1_G729D[index[0]][0]+gbk2_G729D[index[1]][0] ; dGainCode = (Ipp64f)(gbk1_G729D[index[0]][1]+gbk2_G729D[index[1]][1]); *codeGain = (Ipp32f)(dGainCode) * fGainCode; if(dGainCode < 0.2) dGainCode = 0.2; lQIndex = map1_G729D[index[0]]*SIZECODEBOOK2_ANNEXD+map2_G729D[index[1]]; } else { GainCodebookPreselect_G729(pBestGain,pCand,fGainCode) ; ippsGainCodebookSearch_G729_32f(pGainCoeff, fGainCode, pCand, index, tamingflag); *pitchGain = gbk1_G729[index[0]][0]+gbk2_G729[index[1]][0] ; dGainCode = (Ipp64f)(gbk1_G729[index[0]][1]+gbk2_G729[index[1]][1]); *codeGain = (Ipp32f)(dGainCode) * fGainCode; lQIndex = map1_G729[index[0]]*SIZECODEBOOK2+map2_G729[index[1]]; } /* Update table of past quantized energies */ GainUpdate_G729_32f( PastQuantEnergy, (Ipp32f)dGainCode); return lQIndex;}void DecodeGain_G729(Ipp32s index, Ipp32f *FixedCodebookExc, Ipp32s lSbfrLen, Ipp32f *pitchGain, Ipp32f *codeGain, Ipp32s rate, Ipp32f *PastQuantEnergy){ Ipp32s idxs[2]; Ipp32f fGainCode; Ipp64f dGainCode; GainPredict_G729_32f( PastQuantEnergy, FixedCodebookExc, lSbfrLen, &fGainCode); /* Decode pitch and codebook gain. */ if(rate==G729D_MODE) { idxs[0] = imap1_G729D[index>>NCODE2_B_ANNEXD] ; idxs[1] = imap2_G729D[index & (SIZECODEBOOK2_ANNEXD-1)] ; *pitchGain = gbk1_G729D[idxs[0]][0]+gbk2_G729D[idxs[1]][0]; dGainCode = (Ipp64f)gbk1_G729D[idxs[0]][1]+gbk2_G729D[idxs[1]][1]; *codeGain = (Ipp32f)(dGainCode) * fGainCode; if(dGainCode < 0.2) dGainCode = 0.2; } else { idxs[0] = imap1_G729[index>>NCODE2_BITS] ; idxs[1] = imap2_G729[index & (SIZECODEBOOK2-1)] ; *pitchGain = gbk1_G729[idxs[0]][0]+gbk2_G729[idxs[1]][0]; dGainCode = (Ipp64f)gbk1_G729[idxs[0]][1]+gbk2_G729[idxs[1]][1]; *codeGain = (Ipp32f) (dGainCode * fGainCode); } /* Update table of past quantized energies */ GainUpdate_G729_32f( PastQuantEnergy, (Ipp32f)dGainCode); return;}void PSTGetSize(Ipp32s *pDstSize){ *pDstSize = sizeof(PSTmemory); return;}void PSTInit(Ipp8s *pstMem){ PSTmemory *pstState = (PSTmemory *)pstMem; ippsZero_32f(pstState->ResidualMemory,RESISDUAL_MEMORY); ippsZero_32f(pstState->STPMemory,BWD_LPC_ORDER); ippsZero_32f(pstState->STPNumCoeff,SHORTTERM_POSTFLT_LEN_E); ippsZero_32f(pstState->ZeroMemory,BWD_LPC_ORDER); pstState->gainPrec = 1.;}static __ALIGN32 CONST Ipp32f STPTbl[SIZE_SHORT_INT_FLT_MEMORY] = {(Ipp32f) -0.005772, (Ipp32f) 0.087669, (Ipp32f) 0.965882, (Ipp32f) -0.048753,(Ipp32f) -0.014793, (Ipp32f) 0.214886, (Ipp32f) 0.868791, (Ipp32f) -0.065537,(Ipp32f) -0.028507, (Ipp32f) 0.374334, (Ipp32f) 0.723418, (Ipp32f) -0.060834,(Ipp32f) -0.045567, (Ipp32f) 0.550847, (Ipp32f) 0.550847, (Ipp32f) -0.045567,(Ipp32f) -0.060834, (Ipp32f) 0.723418, (Ipp32f) 0.374334, (Ipp32f) -0.028507,(Ipp32f) -0.065537, (Ipp32f) 0.868791, (Ipp32f) 0.214886, (Ipp32f) -0.014793,(Ipp32f) -0.048753, (Ipp32f) 0.965882, (Ipp32f) 0.087669, (Ipp32f) -0.005772};static __ALIGN32 CONST Ipp32f LTPTbl[SIZE_LONG_INT_FLT_MEMORY] = {(Ipp32f) -0.001246, (Ipp32f) 0.002200, (Ipp32f) -0.004791, (Ipp32f) 0.009621,(Ipp32f) -0.017685, (Ipp32f) 0.031212, (Ipp32f) -0.057225, (Ipp32f) 0.135470,(Ipp32f) 0.973955, (Ipp32f) -0.103495, (Ipp32f) 0.048663, (Ipp32f) -0.027090,(Ipp32f) 0.015280, (Ipp32f) -0.008160, (Ipp32f) 0.003961, (Ipp32f) -0.001827,(Ipp32f) -0.002388, (Ipp32f) 0.004479, (Ipp32f) -0.009715, (Ipp32f) 0.019261,(Ipp32f) -0.035118, (Ipp32f) 0.061945, (Ipp32f) -0.115187, (Ipp32f) 0.294161,(Ipp32f) 0.898322, (Ipp32f) -0.170283, (Ipp32f) 0.083211, (Ipp32f) -0.046645,(Ipp32f) 0.026210, (Ipp32f) -0.013854, (Ipp32f) 0.006641, (Ipp32f) -0.003099,(Ipp32f) -0.003277, (Ipp32f) 0.006456, (Ipp32f) -0.013906, (Ipp32f) 0.027229,(Ipp32f) -0.049283, (Ipp32f) 0.086990, (Ipp32f) -0.164590, (Ipp32f) 0.464041,(Ipp32f) 0.780309, (Ipp32f) -0.199879, (Ipp32f) 0.100795, (Ipp32f) -0.056792,(Ipp32f) 0.031761, (Ipp32f) -0.016606, (Ipp32f) 0.007866, (Ipp32f) -0.003740,(Ipp32f) -0.003770, (Ipp32f) 0.007714, (Ipp32f) -0.016462, (Ipp32f) 0.031849,(Ipp32f) -0.057272, (Ipp32f) 0.101294, (Ipp32f) -0.195755, (Ipp32f) 0.630993,(Ipp32f) 0.630993, (Ipp32f) -0.195755, (Ipp32f) 0.101294, (Ipp32f) -0.057272,(Ipp32f) 0.031849, (Ipp32f) -0.016462, (Ipp32f) 0.007714, (Ipp32f) -0.003770,(Ipp32f) -0.003740, (Ipp32f) 0.007866, (Ipp32f) -0.016606, (Ipp32f) 0.031761,(Ipp32f) -0.056792, (Ipp32f) 0.100795, (Ipp32f) -0.199879, (Ipp32f) 0.780309,(Ipp32f) 0.464041, (Ipp32f) -0.164590, (Ipp32f) 0.086990, (Ipp32f) -0.049283,(Ipp32f) 0.027229, (Ipp32f) -0.013906, (Ipp32f) 0.006456, (Ipp32f) -0.003277,(Ipp32f) -0.003099, (Ipp32f) 0.006641, (Ipp32f) -0.013854, (Ipp32f) 0.026210,(Ipp32f) -0.046645, (Ipp32f) 0.083211, (Ipp32f) -0.170283, (Ipp32f) 0.898322,(Ipp32f) 0.294161, (Ipp32f) -0.115187, (Ipp32f) 0.061945, (Ipp32f) -0.035118,(Ipp32f) 0.019261, (Ipp32f) -0.009715, (Ipp32f) 0.004479, (Ipp32f) -0.002388,(Ipp32f) -0.001827, (Ipp32f) 0.003961, (Ipp32f) -0.008160, (Ipp32f) 0.015280,(Ipp32f) -0.027090, (Ipp32f) 0.048663, (Ipp32f) -0.103495, (Ipp32f) 0.973955,(Ipp32f) 0.135470, (Ipp32f) -0.057225, (Ipp32f) 0.031212, (Ipp32f) -0.017685,(Ipp32f) 0.009621, (Ipp32f) -0.004791, (Ipp32f) 0.002200, (Ipp32f) -0.001246};static void HarmonicPostFilter_G729_32f(Ipp32s valPitchDelay, Ipp32f *pSrc, Ipp32f *pDst, Ipp32s *isVoiced, Ipp32f valHarmonicCoeff, Ipp32f *mem);static void SearchDelay(Ipp32s valPitchDelay, Ipp32f *pSrcSignal, Ipp32s *LTPDelay, Ipp32s *lPhase, Ipp32f *LTPGainNumerator, Ipp32f *LTPGainDemerator, Ipp32f *pSignal, Ipp32s *lOffset, Ipp32f *mem);static void HarmonicFilter_G729_32f(Ipp32f *pSrcSignal, Ipp32f *pSrcFltSignal, Ipp32f *pDstSignal, Ipp32f valFltGain);static void TiltCompensation_G729_32f(Ipp32f *pSrcSignal, Ipp32f *pDstSignal, Ipp32f val);static void Calc1stParcor(Ipp32f *pSrcImpulseResponse, Ipp32f *pDstPartialCorrCoeff, Ipp32s len);static void GainControl_G729(Ipp32f *pSrcSignal, Ipp32f *pDstSignal, Ipp32f *pSrcDstGain, Ipp32f *mem);void Post_G729E(G729FPDecoder_Obj *decoderObj, Ipp32s pitchDelay, Ipp32f *pSignal, Ipp32f *pLPC, Ipp32f *pDstFltSignal, Ipp32s *pVoicing, Ipp32s len, Ipp32s lenLPC, Ipp32s Vad){ LOCAL_ALIGN_ARRAY(32, Ipp32f, STPDenCoeff, BWD_LPC_ORDERP1,decoderObj); LOCAL_ALIGN_ARRAY(32, Ipp32f, LTPSignal, SUBFR_LENP1,decoderObj); LOCAL_ALIGN_ARRAY(32, Ipp32f, mem,SIZE_SEARCH_DEL_MEMORY+2*(FRAC_DELAY_RES-1),decoderObj); Ipp32f *pLTPSignal; Ipp32f f1stParcor,fG0, fTmp; Ipp32f *pResidual; Ipp32f *pSTPMemory; Ipp32s i; PSTmemory *pstState = (PSTmemory *)decoderObj->pstMem; pResidual = pstState->ResidualMemory + RESISDUAL_MEMORY; pSTPMemory = pstState->STPMemory + BWD_LPC_ORDER - 1; /* Compute weighted LPC coefficients */ WeightLPCCoeff_G729(pLPC, decoderObj->g1PST, lenLPC, STPDenCoeff); WeightLPCCoeff_G729(pLPC, decoderObj->g2PST, lenLPC, pstState->STPNumCoeff); ippsZero_32f(&pstState->STPNumCoeff[lenLPC+1], (BWD_LPC_ORDER-lenLPC)); /* Compute A(gamma2) residual */ ippsConvBiased_32f(pstState->STPNumCoeff,lenLPC+1,pSignal,SUBFR_LEN+lenLPC,pResidual,SUBFR_LEN,lenLPC); /* Harmonic filtering */ pLTPSignal = LTPSignal + 1; if (Vad > 1) HarmonicPostFilter_G729_32f(pitchDelay, pResidual, pLTPSignal, pVoicing, decoderObj->gHarmPST,mem); else { *pVoicing = 0; ippsCopy_32f(pResidual, pLTPSignal, SUBFR_LEN); } /* Save last output of 1/A(gamma1) (from preceding subframe) */ LTPSignal[0] = *pSTPMemory; /* Controls Ipp16s term pst filter gain and compute f1stParcor */ /* compute i.r. of composed filter STPNumCoeff / STPDenCoeff */ ippsSynthesisFilter_G729_32f(STPDenCoeff, lenLPC, pstState->STPNumCoeff, mem, len, pstState->ZeroMemory); /* compute 1st parcor */ Calc1stParcor(mem, &f1stParcor, len); /* compute fG0 */ fG0 = 0.f; for(i=0; i<len; i++) { fG0 += (Ipp32f)fabs(mem[i]); } /* Scale signal input of 1/A(gamma1) */ if(fG0 > (Ipp32f)1.) { fTmp = (Ipp32f)1./fG0; ippsMulC_32f_I(fTmp, pLTPSignal, SUBFR_LEN); } /* 1/A(gamma1) filtering, STPMemory is updated */ ippsSynthesisFilter_G729_32f(STPDenCoeff, lenLPC, pLTPSignal, pLTPSignal, SUBFR_LEN, &pstState->STPMemory[BWD_LPC_ORDER-lenLPC]); ippsCopy_32f(&pLTPSignal[SUBFR_LEN-BWD_LPC_ORDER], pstState->STPMemory, BWD_LPC_ORDER); /* Tilt filtering with : (1 + mu z-1) * (1/1-|mu|)*/ TiltCompensation_G729_32f(LTPSignal, pDstFltSignal, f1stParcor); /* Gain control */ GainControl_G729(pSignal, pDs
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -