示例#1
0
文件: vq.c 项目: paranojik/multitv
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;
}
示例#2
0
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;
}
示例#3
0
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;
}
示例#4
0
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;
}
示例#5
0
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;
}
示例#6
0
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;
}
示例#7
0
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;
}
示例#8
0
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;
}
示例#9
0
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;
}
示例#10
0
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;
}
示例#11
0
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;
}
示例#12
0
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;
}
示例#13
0
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;
}