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

📄 owng723.c

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 C
📖 第 1 页 / 共 5 页
字号:
          Params->sAmplitude[sNSbfr] = sSign;
          Params->sPosition[sNSbfr] = lCdbkIdx;

          LOCAL_ARRAY_FREE(short, pDstFixedPosition,4, encoderObj) ;
          LOCAL_ARRAY_FREE(short, pDstFixedSign,    4, encoderObj) ;
          LOCAL_ALIGN_ARRAY_FREE(16, short, pAlignBuff,         G723_SBFR_LEN, encoderObj) ;
          LOCAL_ALIGN_ARRAY_FREE(16, int,   pToeplizMatrix,     G723_TOEPLIZ_MATRIX_SIZE, encoderObj) ;
          LOCAL_ALIGN_ARRAY_FREE(16, short, pFltFixedVector,    G723_SBFR_LEN+4, encoderObj) ;
          LOCAL_ALIGN_ARRAY_FREE(16, short, pFixedVector,       G723_SBFR_LEN+4, encoderObj) ;
          LOCAL_ALIGN_ARRAY_FREE(16, short, pTargetImpRespCorr, G723_SBFR_LEN+4, encoderObj) ;

          break;
       }
    }
}

void InterpolationIndex_G723_16s( short *pDecodedExc, short sPitchLag, short *pGain, short *pGainSFS, short *pDstIdx)
{
    int   lSfs, lIdx, lTmp;
    short sTargetVecEnergy, sMaxCorr, sBestEnergy;
    short *pExc;

    /* Normalize the excitation */
    lSfs=3;
    ippsAutoScale_16s_I( pDecodedExc, G723_MAX_PITCH+G723_FRM_LEN, &lSfs );
    *pGainSFS = lSfs;

    if ( sPitchLag > (short) (G723_MAX_PITCH-3) )
        sPitchLag = (short) (G723_MAX_PITCH-3);

    lIdx = sPitchLag;
    pExc = &pDecodedExc[G723_MAX_PITCH+G723_FRM_LEN-2*G723_SBFR_LEN];
    ippsAutoCorrLagMax_Inv_16s(pExc,2*G723_SBFR_LEN,sPitchLag-3,sPitchLag+3,&lTmp,&lIdx);

    if(lTmp > 0 ) {
      sMaxCorr = Cnvrt_NR_32s16s( lTmp );
      /* Compute target energy */
      ippsDotProd_16s32s_Sfs(pExc,pExc,2*G723_SBFR_LEN,&lTmp,0);
       lTmp <<=1;
      sTargetVecEnergy = Cnvrt_NR_32s16s( lTmp );
      *pGain = sTargetVecEnergy;

      /* Calculate the best energy */
      ippsDotProd_16s32s_Sfs(pExc-lIdx,pExc-lIdx,2*G723_SBFR_LEN,&lTmp,0);
       lTmp <<=1;

      sBestEnergy = Cnvrt_NR_32s16s( lTmp );

      lTmp = sBestEnergy * sTargetVecEnergy;
      lTmp >>= 3;

      if ( lTmp < sMaxCorr * sMaxCorr ) *pDstIdx = (short)lIdx;
      else *pDstIdx = 0;
    } else *pDstIdx = 0;

    return;
}

typedef struct _G723_VADmemory{
    int     PrevEnergy;
    int     NoiseLevel;
    short   HangoverCounter;
    short   VADCounter;
    short   AdaptEnableFlag;
    short   OpenLoopDelay[4];
}G723_VADmemory;

/*
  Name:       VoiceActivityDetectSize

   Purpose:     VAD decision memory size query
   pVADmem     pointer to the VAD decision memory
*/

void VoiceActivityDetectSize_G723(int* pVADsize)
{

   *pVADsize = sizeof(G723_VADmemory);
   *pVADsize = (*pVADsize+7)&(~7);
}
/*
  Name:       VoiceActivityDetectInit

   Purpose:     VAD decision memory init
   pVADmem     pointer to the VAD decision memory
*/

void VoiceActivityDetectInit_G723(char* pVADmem)
{
   G723_VADmemory* vadMem =  (G723_VADmemory*)pVADmem;


   vadMem->HangoverCounter = 3;
   vadMem->VADCounter = 0;
   vadMem->PrevEnergy = 0x400;
   vadMem->NoiseLevel = 0x400;

   vadMem->AdaptEnableFlag = 0;

   vadMem->OpenLoopDelay[0] = 1;
   vadMem->OpenLoopDelay[1] = 1;

}

static __ALIGN32 CONST int LogAdd_Tbl[11] = {
   300482560, 300482560, 300482560, 300482560,337149952,378273792,424443904,476217344,534315008,599523328,672694272
};
static __ALIGN32 CONST short  LogMul_Tbl[11] = {
      0,    0,    0,    0, 1119, 1255, 1409, 1580, 1773, 1990, 2233
};
void VoiceActivityDetect_G723(const Ipp16s *pSrc, const Ipp16s *pNoiseLPC,
         const Ipp16s *pOpenLoopDelay, int SineWaveDetector, int *pVADDecision, int *pAdaptEnableFlag, char* pVADmem, short *AlignBuff)
{
   G723_VADmemory* vadMem =  (G723_VADmemory*)pVADmem;
   int i, j, lTmp0, lTmp1;
   short  sTmp0, sTmp1, sNmult, MinOLP;

   int  VADResult = 1 ;

   vadMem->OpenLoopDelay[2] = pOpenLoopDelay[0] ;
   vadMem->OpenLoopDelay[3] = pOpenLoopDelay[1] ;

   /* Find Minimum pitch period */
   MinOLP = G723_MAX_PITCH ;
   for ( i = 0 ; i < 4 ; i ++ ) {
       if ( MinOLP > vadMem->OpenLoopDelay[i] )
           MinOLP = vadMem->OpenLoopDelay[i] ;
   }

   /* How many olps are multiplies of their min */
   sNmult = 0 ;
   for ( i = 0 ; i < 4 ; i++ ) {
       sTmp1 = MinOLP ;
       for ( j = 0 ; j < 8 ; j++ ) {
           sTmp0 = sTmp1 - vadMem->OpenLoopDelay[i];
           if(sTmp0 < 0) sTmp0 = -sTmp0;
           if ( sTmp0 <= 3 ) sNmult++ ;
           sTmp1 += MinOLP;
       }
   }

   /* Update adaptation enable counter if not periodic and not sine and clip it.*/
   if ( (sNmult == 4) || (SineWaveDetector == -1) )
      if(vadMem->AdaptEnableFlag > 5) vadMem->AdaptEnableFlag = 6;
      else vadMem->AdaptEnableFlag += 2;
   else
      if ( vadMem->AdaptEnableFlag < 1 ) vadMem->AdaptEnableFlag = 0;
      else vadMem->AdaptEnableFlag--;

   /* Inverse filter the data */

   ippsResidualFilter_AMRWB_16s_Sfs(pNoiseLPC, G723_LPC_ORDER, &pSrc[G723_SBFR_LEN], AlignBuff, G723_FRM_LEN-G723_SBFR_LEN, 14);
   ippsDotProd_16s32s_Sfs(AlignBuff,AlignBuff,G723_FRM_LEN-G723_SBFR_LEN,&lTmp1,-1);

    /* Scale the rezidual energy */
    lTmp1 = MulC_32s(2913,  lTmp1 ) ;
   /* Clip noise level */
   if ( vadMem->NoiseLevel > vadMem->PrevEnergy ) {
      lTmp0 = vadMem->PrevEnergy - (vadMem->PrevEnergy>>2);
      vadMem->NoiseLevel = lTmp0 + (vadMem->NoiseLevel>>2);
   }


   /* Update the noise level */
   if ( !vadMem->AdaptEnableFlag ) {
      vadMem->NoiseLevel = vadMem->NoiseLevel + (vadMem->NoiseLevel>>5);
   } else { /* Decay NoiseLevel */
      vadMem->NoiseLevel = vadMem->NoiseLevel - (vadMem->NoiseLevel>>11);
   }

   /* Update previous energy */
   vadMem->PrevEnergy = lTmp1 ;

   /* CLip Noise Level */
   if ( vadMem->NoiseLevel < 0x80 )
       vadMem->NoiseLevel = 0x80 ;
   if ( vadMem->NoiseLevel > 0x1ffff )
       vadMem->NoiseLevel = 0x1ffff ;

   /* Compute the treshold */
   lTmp0 = vadMem->NoiseLevel<<13;
   sTmp0 = Norm_32s_Pos_I(&lTmp0);
   sTmp1 = (lTmp0>>15)& 0x7e00;

   lTmp0 = LogAdd_Tbl[sTmp0] - sTmp1 * LogMul_Tbl[sTmp0];
   sTmp1 = lTmp0 >> 15;


   sTmp0 = (short)(vadMem->NoiseLevel>>2);
   lTmp0 = sTmp0*sTmp1;
   lTmp0 >>= 10;

   /* treshold */
   if ( lTmp0 > lTmp1 )
       VADResult = 0 ;

   /* update counters */
   if ( VADResult ) {
       vadMem->VADCounter++ ;
       vadMem->HangoverCounter++ ;
   } else {
       vadMem->VADCounter-- ;
       if ( vadMem->VADCounter < 0 )
           vadMem->VADCounter = 0 ;
   }
   if ( vadMem->VADCounter >= 2 ) {
       vadMem->HangoverCounter = 6 ;
       if ( vadMem->VADCounter >= 3 )
           vadMem->VADCounter = 3 ;
   }
   if ( vadMem->HangoverCounter ) {
       VADResult = 1 ;
       if ( vadMem->VADCounter == 0 )
           vadMem->HangoverCounter -- ;
   }
   /* Update periodicy detector */
   vadMem->OpenLoopDelay[0] = vadMem->OpenLoopDelay[2] ;
   vadMem->OpenLoopDelay[1] = vadMem->OpenLoopDelay[3] ;

   *pAdaptEnableFlag = vadMem->AdaptEnableFlag; /* adaptation enable counter  */
   *pVADDecision = VADResult; /* VAD desision : 0 - noise, 1 - voice  */

}

static __ALIGN32 CONST short StratingPositionTbl[G723_SBFR_LEN/GRIDSIZE] = {
   0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58};

#define MAX_CACHE_NUM 32
static __ALIGN32 CONST short SeedCacheTbl[MAX_CACHE_NUM] = {
    17547, -15555,  11855,  26561, -20077, -21051, 24151,   9545,
   -15205,  24141,  29791,  -5935,   -605,  21717, -3993,  12889,
    -9045,   4445,  21103, -32287,  -7757,   5093,  6775,  22377,
   -29509,  -9107, -14209,  13041,  24003,  -5387, -9081, -27527};

static __ALIGN32 CONST short OlpCache[MAX_CACHE_NUM][2] = {
   {129, 137}, {143, 135}, {137, 140}, {133, 136},
   {129, 124}, {139, 140}, {129, 133}, {123, 129},
   {139, 128}, {128, 125}, {140, 132}, {137, 133},
   {136, 127}, {131, 132}, {129, 138}, {133, 127},
   {142, 123}, {127, 141}, {137, 128}, {134, 133},
   {136, 135}, {137, 129}, {143, 125}, {138, 130},
   {139, 143}, {140, 139}, {127, 128}, {124, 138},
   {130, 126}, {136, 129}, {130, 138}, {136, 136}};

static __ALIGN32 CONST short GainCache[MAX_CACHE_NUM][4] = {
   {34, 31, 18, 35}, {38, 16, 47, 22}, { 9, 29, 48, 36}, {16, 44,  4, 15},
   {16, 27, 34, 34}, { 5, 26, 45,  8}, {14, 32, 31, 36}, {12, 18, 25,  8},
   { 7, 50, 46, 49}, {43, 26,  1, 21}, { 3, 37, 35, 27}, { 5,  7, 29,  4},
   { 6, 50,  4, 28}, { 3, 16, 16, 12}, {25, 44, 10,  8}, {43, 10, 17,  2},
   {14, 27,  8, 22}, {33, 46, 40, 30}, {31,  4,  6, 28}, {28, 29, 39,  3},
   {31, 32,  9, 31}, {34, 15, 22, 26}, {20, 17, 23, 38}, { 9, 12, 44,  6},
   { 6, 14,  5,  5}, { 7, 25, 13, 49}, {44, 31, 11, 38}, {36, 10, 33, 11},
   {40, 24, 48, 44}, { 1, 24, 12, 49}, {50, 48, 21, 28}, { 9, 23,  5, 19}};

static __ALIGN32 CONST short SignCache[MAX_CACHE_NUM][24] = {
   { 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},
   { 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,

⌨️ 快捷键说明

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