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

📄 owng723.c

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 C
📖 第 1 页 / 共 5 页
字号:
    -16384,  16384, -16384, -16384,  16384,  16384,  16384,  16384,
     16384,  16384, -16384,  16384,  16384,  16384,      0,      0},
   {-16384,  16384, -16384,  16384,  16384,  16384,  16384, -16384,
     16384, -16384,  16384,  16384, -16384,  16384,  16384,  16384,
    -16384, -16384, -16384, -16384,  16384,  16384,      0,      0},
   {-16384,  16384,  16384,  16384,  16384,  16384, -16384, -16384,
    -16384, -16384,  16384, -16384,  16384, -16384, -16384, -16384,
    -16384,  16384, -16384,  16384,  16384, -16384,      0,      0},
   {-16384, -16384, -16384,  16384,  16384,  16384,  16384,  16384,
     16384,  16384,  16384,  16384, -16384,  16384,  16384, -16384,
    -16384, -16384, -16384,  16384, -16384, -16384,      0,      0},
   {-16384, -16384, -16384,  16384, -16384, -16384,  16384,  16384,
     16384,  16384,  16384, -16384,  16384,  16384,  16384,  16384,
    -16384, -16384,  16384,  16384,  16384,  16384,      0,      0},
   {-16384,  16384,  16384,  16384, -16384, -16384,  16384,  16384,
    -16384, -16384, -16384, -16384,  16384,  16384, -16384,  16384,
    -16384, -16384, -16384,  16384, -16384,  16384,      0,      0},
   { 16384,  16384, -16384,  16384, -16384,  16384, -16384, -16384,
    -16384,  16384,  16384,  16384,  16384, -16384, -16384,  16384,
    -16384, -16384,  16384,  16384, -16384,  16384,      0,      0},
   { 16384, -16384,  16384,  16384,  16384,  16384,  16384,  16384,
    -16384, -16384, -16384, -16384,  16384,  16384, -16384,  16384,
     16384, -16384, -16384,  16384,  16384, -16384,      0,      0},
   { 16384, -16384,  16384, -16384, -16384,  16384,  16384, -16384,
    -16384, -16384, -16384,  16384,  16384,  16384,  16384,  16384,
    -16384, -16384, -16384, -16384,  16384,  16384,      0,      0},
   { 16384,  16384, -16384, -16384, -16384, -16384, -16384,  16384,
     16384, -16384, -16384, -16384,  16384,  16384,  16384, -16384,
     16384,  16384, -16384, -16384, -16384,  16384,      0,      0},
   { 16384,  16384,  16384, -16384,  16384,  16384,  16384, -16384,
     16384,  16384,  16384,  16384,  16384, -16384, -16384, -16384,
    -16384,  16384, -16384, -16384,  16384, -16384,      0,      0},
   { 16384, -16384, -16384, -16384, -16384,  16384,  16384, -16384,
     16384,  16384, -16384, -16384,  16384,  16384,  16384,  16384,
     16384, -16384,  16384,  16384, -16384, -16384,      0,      0},
   { 16384, -16384, -16384, -16384, -16384,  16384,  16384, -16384,
    -16384, -16384,  16384,  16384,  16384,  16384,  16384,  16384,
     16384,  16384,  16384, -16384,  16384, -16384,      0,      0}
};

static __ALIGN32 CONST short PosCache[MAX_CACHE_NUM][24] = {
   { 47,  51,  27,  41,  21,   9, 117,  83,
     69,  81, 109,  54,  52,  24,  20,  10,
     58,  72,  66,  68, 104,  86,   0,   0},
   { 46,  28,  50,  38,  22,  36, 114,  64,
    100, 112,  60,  24,  34,   6,   4,  28,
     42,  60, 118,  82, 114,  86,   0,   0},
   { 42,  52,  34,  36,  58,  14,  66,  88,
     68, 100,  74,  19,  35,   9,  53,   3,
      1,  84,  64,  88,  74,  78,   0,   0},
   { 41,  17,   1,   7,  13,  29,  86,  94,
     90, 112,  66,  11,  33,  23,  51,  37,
      5, 104, 100,  60,  62, 102,   0,   0},
   { 37,  43,  11,  19,   3,   5,  94,  72,
    108,  96,  98,  14,  50,  18,  32,  12,
      0, 117, 119,  69,  67,  81,   0,   0},
   {  8,  56,   4,  20,  22,  58, 113, 109,
     99,  95,  61,  30,  40,  12,  20,  14,
     18, 111, 109, 115,  93,  79,   0,   0},
   { 38,  28,  16,  50,  14,  58,  87, 103,
     83,  77, 119,  47,  53,   5,  21,  51,
     31, 117, 113,  71,  83,  99,   0,   0},
   { 17,  37,  15,  31,  11,  33,  75, 113,
     73,  63,  97,  33,   7,  39,  29,  23,
     43,  89,  95,  81,  71,  75,   0,   0},
   { 55,  21,   5,  29,  33,  17, 113,  67,
    115, 103,  97,   6,  44,  30,  26,  18,
     46,  90,  62, 100,  78,  86,   0,   0},
   { 10,  26,  38,  44,  34,   6, 104, 112,
     76,  78,  82,  24,  56,  50,  30,  14,
     28, 104,  64,  78, 112,  98,   0,   0},
   { 30,  24,  36,  12,  10,   0, 118,  90,
     94,  70,  84,  19,  37,  45,  53,  25,
      7, 104,  84, 110, 112, 106,   0,   0},
   {  1,  31,  25,  15,  47,  39,  88, 116,
     62,  94,  72,  15,  23,   1,  33,  49,
     37, 106,  84, 114,  62, 102,   0,   0},
   { 37,  47,   9,  13,   7,  45, 112,  62,
     86,  96, 104,  30,  34,   2,  54,  24,
     14, 111,  75, 107,  87, 119,   0,   0},
   { 54,   0,  38,   4,   2,  32,  93,  75,
    119,  65, 117,   6,  24,  58,  38,  30,
     22, 103, 105,  87, 115,  95,   0,   0},
   { 18,  36,  38,  32,  26,   4, 101, 109,
    119,  79,  63,  51,  47,  19,  41,  27,
     29, 113,  95,  97, 119, 105,   0,   0},
   { 57,  59,  31,  17,  13,  47,  67, 109,
     63, 103,  95,  13,  17,  23,   3,  15,
     41,  99,  71, 111,  89,  81,   0,   0},
   { 43,   3,  23,  25,  29,  37,  91,  61,
     85,  79,  69,  28,  18,  46,  14,  34,
      4, 118,  96,  88,  90, 116,   0,   0},
   { 16,  34,   6,  54,  30,  36,  76, 112,
     90, 106,  86,  38,   2,  50,  40,   8,
     48, 102, 108,  84,  70,  66,   0,   0},
   {  0,   8,  20,  58,  14,  46,  92, 102,
    116, 104,  78,  29,  21,  37,  55,   5,
     47,  76,  86, 116,  80,  92,   0,   0},
   {  3,  57,  31,  35,  13,   7,  70,  90,
     72,  84,  60,  29,  51,  45,  57,  21,
      5,  60, 110,  68,  96, 118,   0,   0},
   { 17,   5,  45,  15,  55,  43, 110,  62,
    106, 114,  94,  58,   0,  50,   8,  46,
     14, 115,  73, 101,  91,  99,   0,   0},
   { 20,  12,  54,  52,  16,  50, 115, 109,
     71,  99, 119,  54,  50,  12,  40,   4,
     10, 105,  81,  71,  65,  69,   0,   0},
   { 38,  54,  42,  24,  22,  30,  95,  69,
    101,  91,  75,   7,  21,  43,  55,  11,
     51,  61, 117,  79,  71, 113,   0,   0},
   { 19,  29,  57,  13,  49,  21,  99, 117,
     93, 119,  75,   3,   9,  15,  55,  17,
     25, 119,  87,  97,  89,  95,   0,   0},
   { 15,  53,  21,  35,   7,  59, 111,  67,
     95, 117,  77,   0,  34,  16,  40,   8,
     44,  98, 114,  86,  84,  64,   0,   0},
   {  4,  52,  14,  32,  10,  24,  88,  64,
    118,  92,  76,   0,  48,   4,  34,  14,
     54, 110,  78, 100,  66,  96,   0,   0},
   { 10,   2,  44,  50,  56,  52, 106,  66,
     94, 114, 118,  49,  45,  37,   5,  47,
     23,  60,  70,  72,  84,  88,   0,   0},
   { 45,  35,  21,   9,  15,  37,  92,  74,
     64,  86,  84,  55,   5,  45,  53,   3,
     57,  86, 116, 118,  62,  80,   0,   0},
   { 39,  31,   7,  29,  15,   1,  90,  74,
    106,  70,  68,  36,   4,  54,  52,  26,
     46,  71, 109, 103,  77,  99,   0,   0},
   { 28,  36,  54,   2,  12,  10, 119,  97,
     87,  89, 105,  54,  56,  26,  24,  40,
     32, 119,  99,  65,  79, 103,   0,   0},
   { 40,  26,  28,  56,   2,  14,  69,  97,
     83, 113,  71,  35,  37,  21,  29,   7,
     53,  79,  63,  71,  67,  97,   0,   0},
   { 23,  13,   9,  21,  15,   5, 113,  79,
    103, 105,  91,   5,  39,  19,   9,  29,
     43,  89,  85,  95,  73,  69,   0,   0}
};

void ComfortNoiseExcitation_G723_16s (Ipp16s gain, Ipp16s *pPrevExc, Ipp16s *pExc,
                                      Ipp16s *pSeed, Ipp16s *pOlp, Ipp16s *pLags,
                                      Ipp16s *pGains, G723_Rate currRate, char *buff, Ipp16s *CasheCounter)

{
   int i, lNSbfr, lNBlock;
   short j, sTmp, sTmp1;
   short *pPosition, *pSign;
   short *ppPosition;
   short *pCurrExcitation;
   short sfs, sX1, sX2, sDiscr, sB, sAbsX2, sAbsX1;
   int lTmp, lC, lExcEnergy;
   short *pTmpPos;
   short *pOff;
   short *pTmpExcitation;

   pPosition = (short *)buff;
   pSign = pPosition + 2*NUM_PULSE_IN_BLOCK;
   pTmpPos = pSign + 2*NUM_PULSE_IN_BLOCK;
   pOff = pTmpPos + G723_SBFR_LEN/GRIDSIZE;
   pTmpExcitation = pOff + 4;

   /* generate LTP codes */
   if(*CasheCounter < -1) {
      int curr = *CasheCounter;
      pOlp[0] = OlpCache[curr][0];
      pOlp[1] = OlpCache[curr][1];

      pGains[0] = GainCache[curr][0];
      pGains[1] = GainCache[curr][1];
      pGains[2] = GainCache[curr][2];
      pGains[3] = GainCache[curr][3];

      *pSeed = SeedCacheTbl[curr];

      ippsCopy_16s(SignCache[curr],pSign,2*NUM_PULSE_IN_BLOCK);
      ippsCopy_16s(PosCache[curr],pPosition,2*NUM_PULSE_IN_BLOCK);

      *CasheCounter += 1;
   } else {
      pOlp[0] = NormRand_16s(21, pSeed) + 123;
      pOlp[1] = NormRand_16s(21, pSeed) + 123;
      for(lNSbfr=0; lNSbfr<4; lNSbfr++) {  /* in [1, MAX_GAIN] */
         pGains[lNSbfr] = NormRand_16s(MAX_GAIN, pSeed) + 1;
      }

      /* Generate signs and grids */
      for(lNBlock=0; lNBlock<4; lNBlock += 2) {
         sTmp    = NormRand_16s((1 << (NUM_PULSE_IN_BLOCK+2)), pSeed);
         pOff[lNBlock] = sTmp & 0x1;
         sTmp    >>= 1;
         pOff[lNBlock+1] = G723_SBFR_LEN + (sTmp & 0x1);
         for(i=0; i<NUM_PULSE_IN_BLOCK; i++) {
            pSign[i+NUM_PULSE_IN_BLOCK*(lNBlock>>1)] = ((sTmp & 0x2) - 1)<<14;
            sTmp >>= 1;
         }
      }

      /* Generate positions */
      ppPosition  = pPosition;
      for(lNSbfr=0; lNSbfr<4; lNSbfr++) {
         ippsCopy_16s(StratingPositionTbl, pTmpPos, G723_SBFR_LEN/GRIDSIZE);

         sTmp=(G723_SBFR_LEN/GRIDSIZE); for(i=0; i<NPulse[lNSbfr]; i++) {
            j = NormRand_16s(sTmp, pSeed);
            *ppPosition++ = pTmpPos[j] + pOff[lNSbfr];
            sTmp --; pTmpPos[j] = pTmpPos[sTmp];
         }
      }
   }
   pLags[0] = 1;
   pLags[1] = 0;
   pLags[2] = 1;
   pLags[3] = 3;
   /* calculate fixed codebook gains */
   pCurrExcitation = pExc;

   lNSbfr = 0;
   for(lNBlock=0; lNBlock<2; lNBlock++) {
      /* decode LTP only */
      {
         short lag1 = pOlp[lNBlock];
         short lag2 = pLags[lNSbfr];

         ippsDecodeAdaptiveVector_G723_16s(lag1, lag2, pGains[lNSbfr], &pPrevExc[0], pCurrExcitation, SA_Rate[currRate]);
         lag2 = pLags[lNSbfr+1];
         ippsDecodeAdaptiveVector_G723_16s(lag1, lag2, pGains[lNSbfr+1], &pPrevExc[G723_SBFR_LEN], &pCurrExcitation[G723_SBFR_LEN], SA_Rate[currRate]);
      }
      /*ippsMaxAbs_16s(pCurrExcitation,2*G723_SBFR_LEN,&sTmp1);*/
      ippsMax_16s(pCurrExcitation,2*G723_SBFR_LEN,&sTmp1);
      ippsMin_16s(pCurrExcitation,2*G723_SBFR_LEN,&sTmp);
      if(-sTmp > sTmp1) sTmp1 = -sTmp;
      if(sTmp1 == 0) sfs = 0;
      else {
         sfs = 4 - Exp_16s(sTmp1); /* 4 bits of margin  */
         if(sfs < -2) sfs = -2;
      }
      if(sfs<0)
         ippsLShiftC_16s(pCurrExcitation,-sfs,pTmpExcitation,2*G723_SBFR_LEN);
      else
         ippsRShiftC_16s(pCurrExcitation,sfs,pTmpExcitation,2*G723_SBFR_LEN);
      lTmp = pTmpExcitation[pPosition[0+NUM_PULSE_IN_BLOCK*lNBlock]] * pSign[0+NUM_PULSE_IN_BLOCK*lNBlock];
      for(i=1; i<NUM_PULSE_IN_BLOCK; i++) {
         lTmp += pTmpExcitation[pPosition[i+NUM_PULSE_IN_BLOCK*lNBlock]] * pSign[i+NUM_PULSE_IN_BLOCK*lNBlock];
      }
      sTmp = lTmp>>14;
      sB = ((sTmp*INV_NUM_PULSE_IN_BLOCK)+0x4000)>>15;
      /* excitation energy */
      ippsDotProd_16s32s_Sfs(pTmpExcitation,pTmpExcitation,2*G723_SBFR_LEN,&lExcEnergy,-1);

      /* compute 2*G723_SBFR_LEN x gain**2 x 2**(-2sh1+1)    */
      /* gain input = 2**5 gain                     */
      sTmp = (short)((gain * G723_SBFR_LEN)>>5);
      lTmp = 2 * sTmp * gain;
      sTmp = (sfs<<1)+4;
      lTmp = lTmp>>sTmp;
      lTmp = lExcEnergy - lTmp;
      lC  = MulC_32s(INV_NUM_PULSE_IN_BLOCK, lTmp); /*  * 1/NbPuls  */

     /* Solve EQ(X) = X**2 + 2 sB X + c */
      lTmp = 2* sB * sB - lC;
      if(lTmp <=  0) {
          sX1 = -sB;
      }
      else {
         sDiscr = ownSqrt_32s(lTmp>>1);
         sX1 = sDiscr - sB;
         sX2 = sDiscr + sB;
         sAbsX2 = abs(sX2);
         sAbsX1 = abs(sX1);
         if (sAbsX2 < sAbsX1) sX1 = -sX2;
      }

      /* Update Excitation */
      if(++sfs < 0) sTmp = sX1>>(-sfs);
      else sTmp = sX1<<sfs;

      if(sTmp > G723_MAX_GAIN)
         sTmp = G723_MAX_GAIN;

      if(sTmp < -G723_MAX_GAIN)
          sTmp = -G723_MAX_GAIN;

      for(i=0; i<NUM_PULSE_IN_BLOCK; i++) { j = pPosition[i+NUM_PULSE_IN_BLOCK*lNBlock]; pCurrExcitation[j] = pCurrExcitation[j] +
        (sTmp * (pSign[i+NUM_PULSE_IN_BLOCK*lNBlock])>>15);
      }

      /* update PrevExcitation */
      ippsCopy_16s(&pPrevExc[2*G723_SBFR_LEN],pPrevExc,G723_MAX_PITCH-2*G723_SBFR_LEN);
      ippsCopy_16s(pCurrExcitation,&pPrevExc[G723_MAX_PITCH-2*G723_SBFR_LEN],2*G723_SBFR_LEN);

      pCurrExcitation += 2*G723_SBFR_LEN;
      lNSbfr += 2;
   }
}

__ALIGN32 CONST IppSpchBitRate SA_Rate[2] = {IPP_SPCHBR_6300, IPP_SPCHBR_5300};

__ALIGN32 CONST short LPCDCTbl[G723_LPC_ORDER] = {
   3131,4721,7690,10806,13872,16495,19752,22260,25484,27718};


__ALIGN32 CONST short PerceptualFltCoeffTbl[2*G723_LPC_ORDER] = {
   29491,26542,23888,21499,19349,17414,15673,14106,12695,11425,/* Zero part */
   16384, 8192, 4096, 2048, 1024,  512,  256,  128,   64,   32,/* Pole part */
};

__ALIGN32 CONST short GainDBLvls[N_GAINS] = {
  0xFFFF,  0xFFFE, 0xFFFD, 0xFFFC, 0xFFFA, 0xFFF7, 0xFFF3, 0xFFEE,
  0xFFE6,  0xFFDA, 0xFFC9, 0xFFB0, 0xFF8D, 0xFF5A, 0xFF10, 0xFEA4,
  0xFE0A,  0xFD2A, 0xFBE6, 0xFA13, 0xF76F, 0xF39E, 0xEE1A, 0xE621
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -