void Excitation_VQ_and_gain_scaling(Ipp16s linearGain, const Ipp16s* tbl, Ipp16s* et) { Ipp32s aa0, k; for(k=0; k<IDIM; k++) { aa0 = linearGain * tbl[k]; et[k] = Cnvrt_NR_32s16s(aa0); } return; }
void FirstOrderLowpassFilter_OuputGainScaling(Ipp16s scale, Ipp16s nlsscale, Ipp16s *scalefil, Ipp16s *temp, Ipp16s *spf) { Ipp32s val1, val2, k; val2 = AGCFAC1 * scale; val2 = val2 >> (nlsscale - 7); for(k=0; k<IDIM; k++) { val1 = val2 + AGCFAC*(*scalefil); val1 = val1 << 2; *scalefil = Cnvrt_NR_32s16s(val1); val1 = (*scalefil) * temp[k]; val1 = val1 << 2; spf[k] = Cnvrt_NR_32s16s(val1); } return; }
void ScaleFactorCalc(Ipp32s sumunfil, Ipp32s sumfil, Ipp16s *pRatio, Ipp16s *pScaleRatio) { Ipp32s dwDen, dwNum; Ipp16s den, num; Ipp16s scaleDen, scaleNum; if(sumfil > 4) { VscaleOne_Range30_32s(&sumfil, &dwDen, &scaleDen); den = Cnvrt_NR_32s16s(dwDen); VscaleOne_Range30_32s(&sumunfil, &dwNum, &scaleNum); num = Cnvrt_NR_32s16s(dwNum); Divide_16s(num, scaleNum, den, scaleDen, pRatio, pScaleRatio); } else { *pRatio = 16384; *pScaleRatio = 14; } return; }
void InverseLogarithmCalc(Ipp32s gainLog, Ipp16s *pLinearGain, Ipp16s *pScaleGain){ Ipp32s dwVal0, dwVal1; Ipp32s x, z; Ipp16s tmp; /* add offset */ z = gainLog + GOFF; /* Compute gain = 10**(z/20) */ dwVal0 = 10 * z; dwVal1 = 2*20649 * z; dwVal1 = Cnvrt_NR_32s16s(dwVal1); dwVal0 += dwVal1; dwVal1 = dwVal0 >> 15; *pScaleGain = (short)(14 - dwVal1); dwVal1 = ShiftL_32s(dwVal1, 15); x = Sub_32s(dwVal0, dwVal1); dwVal0 = 323 * x; /* c_c4 */ dwVal0 = ShiftL_32s(dwVal0, 1); dwVal0 = Add_32s(dwVal0, 1874<<16); /* + c_c3 */ tmp = Cnvrt_NR_32s16s(dwVal0); dwVal0 = tmp * x; dwVal0 = ShiftL_32s(dwVal0, 1); dwVal0 = Add_32s(dwVal0, 7866<<16); /* + c_c2 */ tmp = Cnvrt_NR_32s16s(dwVal0); dwVal0 = tmp * x; dwVal0 = ShiftL_32s(dwVal0, 1); dwVal0 = Add_32s(dwVal0, 22702<<16); /* + c_c1 */ tmp = Cnvrt_NR_32s16s(dwVal0); dwVal0 = tmp * x; dwVal0 = Add_32s(dwVal0, 16384<<16); /* + c_c0 */ *pLinearGain = Cnvrt_NR_32s16s(dwVal0); return; }
void Set_Flags_and_Scalin_Factor_for_Frame_Erasure(Ipp16s fecount, Ipp16s ptab, Ipp16s kp, Ipp16s* fedelay, Ipp16s* fescale, Ipp16s* nlsfescale, Ipp16s* voiced, Ipp16s* etpast, Ipp16s *avmag, Ipp16s *nlsavmag) { Ipp16s n10msec, nls; Ipp32s aa0, i; n10msec = (Ipp16s)(fecount >> 2); if(n10msec == 0) { if(ptab > VTH) { *fedelay = kp; *voiced = G728_TRUE; } else { *voiced = G728_FALSE; aa0 = 0; for(i = -40;i < 0; i++) aa0 = aa0 + Abs_32s(etpast[i]); VscaleOne_Range30_32s(&aa0, &aa0, &nls); *avmag = Cnvrt_NR_32s16s(aa0); *nlsavmag = (Ipp16s)(nls - 16 + 3); } } if(*voiced == G728_TRUE) { if(n10msec < 5) *fescale = voicedfegain[n10msec]; else *fescale = 0; } else { if(n10msec < 6) { *fescale = unvoicedfegain[n10msec]; aa0 = (*fescale) * (*avmag); VscaleOne_Range30_32s(&aa0, &aa0, nlsfescale); *fescale = Cnvrt_NR_32s16s(aa0); *nlsfescale = (Ipp16s)((*nlsfescale)+(*nlsavmag) - 1); } else { *fescale = 0; } } return; }
void BandwidthExpansionModulFE(const Ipp16s* pConstBroadenVector, Ipp16s* pTmpCoeffs, Ipp16s coeffsScale, Ipp16s* pCoeffs, int len, short countFE, short illCond){ Ipp32s i, dwProd; Ipp16s scale = (short)(16 - coeffsScale); Ipp32s ovfPos = IPP_MAX_32S >> scale; Ipp32s ovfNeg = IPP_MIN_32S >> scale; if((countFE==1)&&(illCond == G728_FALSE)) { for(i=0; i<LPC; i++) { dwProd = pConstBroadenVector[i] * pTmpCoeffs[i]; if(dwProd > ovfPos || dwProd < ovfNeg) /* Do not update*/ return; pCoeffs[i] = pTmpCoeffs[i] = Cnvrt_NR_32s16s(dwProd<<scale); /* I think atmp doesn't need to be updated. (Igor S. Belyakov)*/ } } else { for(i=0; i<LPC; i++) { dwProd = pConstBroadenVector[i] * pCoeffs[i]; pCoeffs[i] = Cnvrt_NR_32s16s(dwProd<<2); } } len = len;/*To remove warning*/ return; }
void WeightingFilterCoeffsCalc(Ipp16s *pTmpWghtFltrCoeffs, Ipp16s coeffsScale, Ipp16s *pVecWghtFltrCoeffs) { Ipp32s dwProd, i; Ipp16s tmpCoeffs[10]; Ipp16s *pNumerCoeffs = pVecWghtFltrCoeffs; Ipp16s *pDenomCoeffs = pVecWghtFltrCoeffs+LPCW; Ipp16s scale = (short)(16 - coeffsScale); Ipp32s ovfPos = IPP_MAX_32S >> scale; Ipp32s ovfNeg = IPP_MIN_32S >> scale; /* Do the numerator coefficients */ for(i=0; i<6; i++){ dwProd = cnstZeroCtrlFactor[i+1] * pTmpWghtFltrCoeffs[i]; /* if Overflow expected in ShiftL_32s Do not update */ if(dwProd > ovfPos || dwProd < ovfNeg) return; dwProd <<= scale; tmpCoeffs[i] = Cnvrt_NR_32s16s(dwProd); } for(i=6; i<LPCW; i++){ dwProd = cnstZeroCtrlFactor[i+1] * pTmpWghtFltrCoeffs[i]; dwProd <<= scale; tmpCoeffs[i] = Cnvrt_NR_32s16s(dwProd); } for(i=0; i<LPCW; i++) pNumerCoeffs[i] = tmpCoeffs[i]; /* Do the denumerator coefficients */ for(i=0; i<LPCW; i++){ dwProd = cnstPoleCtrlFactor[i+1] * pTmpWghtFltrCoeffs[i]; dwProd <<= scale; pDenomCoeffs[i] = Cnvrt_NR_32s16s(dwProd); } return; }
void Bandwidth_expansion_block51FE(Ipp16s fecount, Ipp16s illcond, Ipp16s* atmp, Ipp16s nlsatmp, Ipp16s* a) { Ipp32s i, aa0; Ipp16s scale = 16 - nlsatmp; /* nlsatmp = 13,14 or 15 only*/ Ipp32s ovfPos = IPP_MAX_32S >> scale; Ipp32s ovfNeg = IPP_MIN_32S >> scale; if((fecount==1)&&(illcond == G728_FALSE)) { for(i=1; i<=LPC; i++) { aa0 = facvfe[i] * atmp[i-1]; if(aa0 > ovfPos || aa0 < ovfNeg) return; /* Do not update*/ aa0 <<= scale; a[i-1] = atmp[i-1] = Cnvrt_NR_32s16s(aa0); /* I think atmp doesn't need to be updated. (Igor S. Belyakov)*/ } } else { for(i=1; i<=LPC; i++) { aa0 = facvfe[i] * a[i-1]; aa0 = aa0 << 2; a[i-1] = Cnvrt_NR_32s16s(aa0); } } return; }
void LTPCoeffsCalc(const Ipp16s *sst, Ipp32s kp, Ipp16s *gl, Ipp16s *glb, Ipp16s *pTab){ Ipp32s aa0, aa1; Ipp16s den, num; Ipp16s nlsden, nlsnum, nlsptab, nls, b; /* Pitch_predictor_tab_calc*/ ippsDotProd_16s32s_Sfs(sst-NPWSZ-kp, sst-NPWSZ-kp, NPWSZ,&aa0, 0); ippsDotProd_16s32s_Sfs(sst-NPWSZ, sst-NPWSZ-kp, NPWSZ,&aa1, 0); if(aa0 == 0) { *pTab = 0; } else if(aa1 <= 0) { *pTab = 0; } else { if(aa1 >= aa0) *pTab = 16384; else { VscaleOne_Range30_32s(&aa0, &aa0, &nlsden); VscaleOne_Range30_32s(&aa1, &aa1, &nlsnum); num = Cnvrt_NR_32s16s(aa1); den = Cnvrt_NR_32s16s(aa0); Divide_16s(num, nlsnum, den, nlsden, pTab, &nlsptab); *pTab = (*pTab) >> (nlsptab - 14); } } /* Update long-term postfilter coefficients*/ if(*pTab < PPFTH) aa0 = 0; else aa0 = PPFZCF * (*pTab); b = aa0 >> 14; aa0 = aa0 >> 16; aa0 = aa0 + 16384; den = aa0; Divide_16s(16384, 14, den, 14, gl, &nls); aa0 = *gl * b; *glb = aa0 >> nls; if(nls > 14) *gl = (*gl) >> (nls-14); return; }
void BandwidthExpansionModul(const Ipp16s* pConstBroadenVector, Ipp16s* pTmpCoeffs, Ipp16s coeffsScale, Ipp16s* pCoeffs, int len){ Ipp32s i, dwProd; Ipp16s scale = (short)(16 - coeffsScale); Ipp32s ovfPos = IPP_MAX_32S >> scale; Ipp32s ovfNeg = IPP_MIN_32S >> scale; for(i=0; i<len; i++) { dwProd = pConstBroadenVector[i] * pTmpCoeffs[i]; /* if Overflow expected in ShiftL_32s Do not update */ if(dwProd > ovfPos || dwProd < ovfNeg) return; dwProd <<= scale; pTmpCoeffs[i] = Cnvrt_NR_32s16s(dwProd); } for(i=0; i<len; i++) pCoeffs[i] = pTmpCoeffs[i]; return; }
void Excitation_signal_extrapolation(Ipp16s voiced, Ipp16s *fedelay, Ipp16s fescale, Ipp16s nlsfescale, Ipp16s* etpast, Ipp16s *et, Ipp16s *nlset, Ipp16s *seed) { Ipp16s temp, nlstemp,den,nlsden,nls; Ipp32s i, aa0, aa1; if(voiced == G728_TRUE) { temp = fescale; nlstemp = 15; for(i=0; i<IDIM; i++) etpast[i] = etpast[i-(*fedelay)]; /* nlstemp = 15;*/ } if(voiced == G728_FALSE) { *fedelay = Rand_G728_16s(seed); aa1 = 0; for(i=0; i<IDIM; i++) { etpast[i] = etpast[i-(*fedelay)]; aa1 = aa1 + Abs_32s(etpast[i]); } if((aa1==0)||(fescale==0)) { temp = 0; nlstemp = 15; } else { Vscale_32s(&aa1, 1, 1, 30, &aa1, &nlsden); den = Cnvrt_NR_32s16s(aa1); nlsden = nlsden - 16; Divide(fescale, nlsfescale, den, nlsden, &temp, &nlstemp); } } for(i=0; i<IDIM; i++) { aa0 = temp * etpast[i]; aa0 = ShiftR_32s(aa0, nlstemp); aa0 = Cnvrt_32s16s(aa0); etpast[i] = aa0; } Vscale_16s(etpast, IDIM, IDIM, 13, et, &nls); *nlset = nls + 2; return; }
void ExcitationSignalExtrapolation(Ipp16s voiced, Ipp16s *fedelay, Ipp16s fescale, Ipp16s nlsfescale, Ipp16s* etpast, Ipp16s *et, Ipp16s *nlset, Ipp16s *seed) { Ipp16s temp = fescale, nlstemp = 15,den,nlsden,nls; Ipp32s i, aa0, aa1; if(voiced == G728_TRUE) { for(i=0; i<IDIM; i++) etpast[i] = etpast[i-(*fedelay)]; /* nlstemp = 15;*/ } if(voiced == G728_FALSE) { *fedelay = Rand_G728_16s(seed); aa1 = 0; for(i=0; i<IDIM; i++) { etpast[i] = etpast[i-(*fedelay)]; aa1 = aa1 + Abs_32s(etpast[i]); } if((aa1==0)||(fescale==0)) { temp = 0; nlstemp = 15; } else { VscaleOne_Range30_32s(&aa1, &aa1, &nlsden); den = Cnvrt_NR_32s16s(aa1); nlsden = (Ipp16s)(nlsden - 16); Divide_16s(fescale, nlsfescale, den, nlsden, &temp, &nlstemp); } } for(i=0; i<IDIM; i++) { aa0 = temp * etpast[i]; aa0 = aa0 >> nlstemp; aa0 = Cnvrt_32s16s(aa0); etpast[i] = (Ipp16s)aa0; } VscaleFive_16s(etpast, et, 13, &nls); *nlset = (Ipp16s)(nls + 2); return; }
void STPCoeffsCalc(Ipp16s *pLPCFltrCoeffs, Ipp16s scaleLPCFltrCoeffs, Ipp16s *pstA, Ipp16s rc1, Ipp16s *tiltz) { Ipp32s dwVal, i, j; Ipp16s ws[3]; Ipp16s *az = pstA; Ipp16s *ap = pstA+10; Ipp16s scale = (Ipp16s)(16 - scaleLPCFltrCoeffs); Ipp32s ovfPos = IPP_MAX_32S >> scale; Ipp32s ovfNeg = IPP_MIN_32S >> scale; for(i=0; i<2; i++) { dwVal = cnstSTPostFltrPoleVector[i] * pLPCFltrCoeffs[i]; if(dwVal > ovfPos || dwVal < ovfNeg){ /* if Overflow in ShiftL_32s*/ if(scale==2) { for(j=0; j<10; j++) { dwVal = pLPCFltrCoeffs[j] << 15; pLPCFltrCoeffs[j] = Cnvrt_NR_32s16s(dwVal); } } if(scale==1) { for(j=0; j<10; j++) { dwVal = pLPCFltrCoeffs[j] << 14; pLPCFltrCoeffs[j] = Cnvrt_NR_32s16s(dwVal); } } return; } dwVal = ShiftL_32s(dwVal, scale); ws[i] = Cnvrt_NR_32s16s(dwVal); } for(i=0; i<2; i++) ap[i] = ws[i]; for(i=2; i<10; i++) { dwVal = cnstSTPostFltrPoleVector[i] * pLPCFltrCoeffs[i]; dwVal = ShiftL_32s(dwVal, scale); ap[i] = Cnvrt_NR_32s16s(dwVal); } for(i=0;i<10;i++) { dwVal = cnstSTPostFltrZeroVector[i] * pLPCFltrCoeffs[i]; dwVal = ShiftL_32s(dwVal, scale); az[i] = Cnvrt_NR_32s16s(dwVal); } dwVal = TILTF * rc1; *tiltz = Cnvrt_NR_32s16s(dwVal); if(scale==2) { for(j=0; j<10; j++) { dwVal = pLPCFltrCoeffs[j] << 15; pLPCFltrCoeffs[j] = Cnvrt_NR_32s16s(dwVal); } } if(scale==1) { for(j=0; j<10; j++) { dwVal = pLPCFltrCoeffs[j] << 14; pLPCFltrCoeffs[j] = Cnvrt_NR_32s16s(dwVal); } } return; }