예제 #1
0
void ownScaleHPFilterState(Ipp16s* pMemHPFilter, Ipp32s scale, Ipp32s order) {

   Ipp32s tmp32;
   Ipp16s tmp16;

   if (order == 2) {
      Ipp16s y2H,y2L,y1H,y1L,x0,x1;
      y2H=pMemHPFilter[0]; y2L=pMemHPFilter[1];
      y1H=pMemHPFilter[2]; y1L=pMemHPFilter[3];
      x0=pMemHPFilter[4];
      x1=pMemHPFilter[5];
      if (scale > 0) {
         tmp32 = x0 << 16;
         tmp32 = ShiftL_32s(tmp32, (Ipp16u)(scale));
         Unpack_32s(tmp32, &x0, &tmp16);

         tmp32 = (y1H << 16) + (y1L << 1);
         tmp32 = ShiftL_32s(tmp32, (Ipp16u)(scale));
         Unpack_32s(tmp32, &y1H, &y1L);

         y1L = (Ipp16s)(y1L - (tmp16 >> 1));

         tmp32 = x1 << 16;
         tmp32 = ShiftL_32s(tmp32, (Ipp16u)(scale));
         Unpack_32s(tmp32, &x1, &tmp16);

         tmp32 = (y2H << 16) + (y2L << 1);
         tmp32 = ShiftL_32s(tmp32, (Ipp16u)(scale));
         Unpack_32s(tmp32, &y2H, &y2L);

         y2L = (Ipp16s)(y2L - (tmp16 >> 1));
      } else {
예제 #2
0
파일: adapters.c 프로젝트: dormclub/tjphone
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;
}
예제 #3
0
파일: pstg728.c 프로젝트: paranojik/multitv
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;
}