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

📄 owng729fp.c

📁 G.729 and G.723.1 codecs x86 (and x86_64) Linux and FreeBSD source code for Asterisk open source PBX
💻 C
📖 第 1 页 / 共 5 页
字号:
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 + -