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

📄 encoder.c

📁 Intel开发的IPP库的应用实例
💻 C
📖 第 1 页 / 共 3 页
字号:
         pFBBuffer[i] = (int)(tmp*1024);
         C0 += pFBBuffer[i];
      }

      /* Discrete Cosine Transform */
      ippsDCTLifter_32s16s_Sfs(pFBBuffer, pCodec->pFeatBuffer,pCodec->pDCTLifter,1);

      /* Append logE after c0 or overwrite c0 */
      ippsConvert_32f16s_Sfs(&C0,&pCodec->pFeatBuffer[pCodec->numCepCoeff-1],1,ippRndNear,5);
      ippsConvert_32f16s_Sfs(&LogEnergy,&pCodec->pFeatBuffer[pCodec->numCepCoeff],1,ippRndNear,-9);

      ippsCopy_16s(pCodec->pFeatBuffer,pFwork,(NUM_CEP_COEFF+1));
      pFwork += (NUM_CEP_COEFF+1);
      pCodec->NumberFrame++;
   }/*  end for  */
   if (StreamEnd){
      ResetAuroraEncoder(pCodec);
      return FrameCounter;
   }
   if (tailSample>0){
      ippsRShiftC_16s(WaveBuffer,1,pCodec->pWwork+pCodec->curPosition,tailSample);
      ippsCompensateOffset_16s_I(pCodec->pWwork+pCodec->curPosition,
         tailSample,&(pCodec->pSrc0),pCodec->Dst0,0.999f);
      pCodec->pSrc0 = WaveBuffer[tailSample-1]>>1;
      pCodec->Dst0 = pCodec->pWwork[pCodec->curPosition+tailSample-1];
      pCodec->curPosition += tailSample;
   }
   return FrameCounter;
}


/*   WAVEFORM -> QUANTIZED   */
int ApplyAuroraEncoder_WQ(AuroraEncoder *pCodec,short *pSrc,int InputLength,
                       unsigned char * pDst, int StreamEnd){

   int i,iCount;
   short *WaveBuffer;
   int FrameCounter;
   int tailSample;
   int step;
   float LogEnergy;
   unsigned char *pIndexVQ;
   int pFBBuffer[NUM_CHANNELS];
   float tmp,C0;

   if (InputLength<=0){
      FrameCounter=0;
      ResetAuroraEncoder(pCodec);
      return FrameCounter;
   }

   if (pCodec->EncoderOutput == QUANTIZED){
      pIndexVQ = (unsigned char*)pDst/*+FeatureSize*pCodec->NumberFrame*/;
   }
   else {
      printf("\n!!! ERROR: encoder was initialized with another output flag !!!");
      return 0;
   }

   WaveBuffer = pSrc;
   FrameCounter = InputLength;
   if (pCodec->EncoderInput==WAVEFORM){
      if (pCodec->curPosition+InputLength >= pCodec->FrameLength){
            FrameCounter = (pCodec->curPosition+InputLength-(pCodec->FrameLength-pCodec->FrameShift)) / pCodec->FrameShift;
            tailSample = (pCodec->curPosition+InputLength-(pCodec->FrameLength-pCodec->FrameShift)) % pCodec->FrameShift;
            step = pCodec->FrameLength - pCodec->curPosition;
      }
      else{
            FrameCounter = 0;
            tailSample = InputLength;
      }
   }
   else {
      printf("\n!!! ERROR: encoder was initialized with another input flag !!!");
      return 0;
   }

   /*   calculate feature   */
   for (iCount=0;iCount<FrameCounter;iCount++){
      /* Offset Compensation*/
      ippsRShiftC_16s(WaveBuffer,1,pCodec->pWwork+pCodec->curPosition,step);
      ippsCompensateOffset_16s_I(pCodec->pWwork+pCodec->curPosition,
         step,&(pCodec->pSrc0),pCodec->Dst0,0.999f);

      pCodec->pSrc0 = WaveBuffer[step-1]>>1;
      pCodec->Dst0 = pCodec->pWwork[pCodec->FrameLength-1];

      WaveBuffer+=step;

      pCodec->curPosition = pCodec->FrameLength - pCodec->FrameShift;
      step = pCodec->FrameShift;

      /* logE computation */
      LogEnergy = 0.0;

      ippsDotProd_16s32f(pCodec->pWwork,pCodec->pWwork,pCodec->FrameLength,&LogEnergy);
      LogEnergy*=4;
      if (LogEnergy <= 0)
         LogEnergy = (float)-50.0f;
      else{
         LogEnergy = (float) log ((double) LogEnergy);
      }

      /* Pre-emphasis */
      ippsCopyWithPadding_16s(pCodec->pWwork, pCodec->FrameLength, pCodec->workBuffer,pCodec->FFTLength);

      ippsPreemphasize_16s(pCodec->workBuffer, pCodec->FrameLength, EMPHASIS_COEFF);

      pCodec->workBuffer[0] = (short)(pCodec->pWwork[0] - EMPHASIS_COEFF * pCodec->preFloat);

      /* Replace WorkBuffer*/
      pCodec->preFloat = pCodec->pWwork[pCodec->FrameShift-1];
      ippsMove_16s(pCodec->pWwork+pCodec->FrameShift, pCodec->pWwork,
         pCodec->FrameLength-pCodec->FrameShift);

      /* Windowing */
      ippsMul_16s_ISfs(pCodec->HammingWindow,pCodec->workBuffer,pCodec->FrameLength,15);

      /* Mel filtering with FFT and Magnitude spectrum*/
      ippsEvalFBank_16s32s_Sfs(pCodec->workBuffer,pFBBuffer,pCodec->pFBank,-2);

      /* Natural logarithm computation */

      C0=0;
      for (i = 0; i < pCodec->numChannels; i++){
         tmp = (float)pFBBuffer[i];
         if (tmp <= 0)
            pFBBuffer[i] = (int)-50*1024;
         else
            tmp = (float) log ((double) tmp);
         pFBBuffer[i] = (int)(tmp*1024);
         C0 += pFBBuffer[i];
      }

      /* Discrete Cosine Transform */
      ippsDCTLifter_32s16s_Sfs(pFBBuffer, pCodec->pFeatBuffer,pCodec->pDCTLifter,1);

      /* Append logE after c0 or overwrite c0 */
      ippsConvert_32f16s_Sfs(&C0,&pCodec->pFeatBuffer[pCodec->numCepCoeff-1],1,ippRndNear,5);
      ippsConvert_32f16s_Sfs(&LogEnergy,&pCodec->pFeatBuffer[pCodec->numCepCoeff],1,ippRndNear,-9);

      /*  Quantise  */
      pCodec->pFeatBuffer[pCodec->numCepCoeff] = (short)(pCodec->pFeatBuffer[pCodec->numCepCoeff] * pCodec->weight_logE);
      pCodec->pFeatBuffer[pCodec->numCepCoeff-1] = (short)(pCodec->weight_c0 * pCodec->pFeatBuffer[pCodec->numCepCoeff-1]);

      ippsSplitVQ_16s8u(pCodec->pFeatBuffer,pCodec->numCepCoeff+1,pCodec->pIndexVQBuffer,NUM_CODEBOOK,1,
         (const IppsCdbkState_16s **)pCodec->ppCdbkState,NUM_CODEBOOK);

      ippsCopy_8u(pCodec->pIndexVQBuffer,pIndexVQ,NUM_CODEBOOK);
      pIndexVQ += NUM_CODEBOOK;
      pCodec->NumberFrame++;
   }/*  end for  */
   if (StreamEnd){
      ResetAuroraEncoder(pCodec);
      return FrameCounter;
   }

   if (tailSample>0){
      ippsRShiftC_16s(WaveBuffer,1,pCodec->pWwork+pCodec->curPosition,tailSample);
      ippsCompensateOffset_16s_I(pCodec->pWwork+pCodec->curPosition,
         tailSample,&(pCodec->pSrc0),pCodec->Dst0,0.999f);
      pCodec->pSrc0 = WaveBuffer[tailSample-1]>>1;
      pCodec->Dst0 = pCodec->pWwork[pCodec->curPosition+tailSample-1];
      pCodec->curPosition += tailSample;
   }

   return FrameCounter;
}

/*   WAVEFORM -> MULTIFRAME   */
int ApplyAuroraEncoder_WM(AuroraEncoder *pCodec,short *pSrc,int InputLength,
                       unsigned char * pDst, int StreamEnd){

   int i,iCount;
   short *WaveBuffer;
   int FrameCounter,MultyFrameCounter;
   int tailSample;
   int step;
   float LogEnergy;
   int idx,crc;
   int pFBBuffer[NUM_CHANNELS];
   int nullMFrame=0;
   unsigned char *pMFwork;
   float tmp,C0;

   MultyFrameCounter=0;
   if (pCodec->EncoderOutput == MULTIFRAME){
      pMFwork =(unsigned char *) pDst/*+NUM_MULTY_BYTE*pCodec->NumberFrame*/;
   }
   else {
      printf("\n!!! ERROR: encoder was initialized with another output flag !!!");
      return 0;
   }

   if (InputLength<=0){
      ResetAuroraEncoder(pCodec);
      return 0;
   }

   WaveBuffer = pSrc;
   FrameCounter = InputLength;
   if (pCodec->EncoderInput==WAVEFORM){
      if (pCodec->curPosition+InputLength >= pCodec->FrameLength){
            FrameCounter = (pCodec->curPosition+InputLength-(pCodec->FrameLength-pCodec->FrameShift)) / pCodec->FrameShift;
            tailSample = (pCodec->curPosition+InputLength-(pCodec->FrameLength-pCodec->FrameShift)) % pCodec->FrameShift;
            step = pCodec->FrameLength - pCodec->curPosition;
      }
      else{
            FrameCounter = 0;
            tailSample = InputLength;
      }
   }
   else {
      printf("\n!!! ERROR: encoder was initialized with another input flag !!!");
      return 0;
   }

   /*   calculate feature   */
   for (iCount=0;iCount<FrameCounter;iCount++){
      /* Offset Compensation*/
      ippsRShiftC_16s(WaveBuffer,1,pCodec->pWwork+pCodec->curPosition,step);
      ippsCompensateOffset_16s_I(pCodec->pWwork+pCodec->curPosition,
         step,&(pCodec->pSrc0),pCodec->Dst0,0.999f);

      pCodec->pSrc0 = WaveBuffer[step-1]>>1;
      pCodec->Dst0 = pCodec->pWwork[pCodec->FrameLength-1];

      WaveBuffer+=step;

      pCodec->curPosition = pCodec->FrameLength - pCodec->FrameShift;
      step = pCodec->FrameShift;

      /* logE computation */
      LogEnergy = 0.0;

      ippsDotProd_16s32f(pCodec->pWwork,pCodec->pWwork,pCodec->FrameLength,&LogEnergy);
      LogEnergy*=4;
      if (LogEnergy <= 0)
         LogEnergy = (short)-50.0f;
      else{
         LogEnergy = (float) log ((double) LogEnergy);
      }

      /* Pre-emphasis */
      ippsCopyWithPadding_16s(pCodec->pWwork, pCodec->FrameLength, pCodec->workBuffer,pCodec->FFTLength);

      ippsPreemphasize_16s(pCodec->workBuffer, pCodec->FrameLength, EMPHASIS_COEFF);

      pCodec->workBuffer[0] = (short)(pCodec->pWwork[0] - EMPHASIS_COEFF * pCodec->preFloat);

      /* Replace WorkBuffer*/
      pCodec->preFloat = pCodec->pWwork[pCodec->FrameShift-1];
      ippsMove_16s(pCodec->pWwork+pCodec->FrameShift, pCodec->pWwork,
         pCodec->FrameLength-pCodec->FrameShift);

      /* Windowing */
      ippsMul_16s_ISfs(pCodec->HammingWindow,pCodec->workBuffer,pCodec->FrameLength,15);

      /* Mel filtering with FFT and Magnitude spectrum*/
      ippsEvalFBank_16s32s_Sfs(pCodec->workBuffer,pFBBuffer,pCodec->pFBank,-2);

      /* Natural logarithm computation */

      C0=0;
      for (i = 0; i < pCodec->numChannels; i++){
         tmp = (float)pFBBuffer[i];
         if (tmp <= 0)
            pFBBuffer[i] = (int)-50*1024;
         else
            tmp = (float) log ((double) tmp);
         pFBBuffer[i] = (int)(tmp*1024);
         C0 += pFBBuffer[i];
      }

      /* Discrete Cosine Transform */
      ippsDCTLifter_32s16s_Sfs(pFBBuffer, pCodec->pFeatBuffer,pCodec->pDCTLifter,1);

      /* Append logE after c0 or overwrite c0 */
      ippsConvert_32f16s_Sfs(&C0,&pCodec->pFeatBuffer[pCodec->numCepCoeff-1],1,ippRndNear,5);
      ippsConvert_32f16s_Sfs(&LogEnergy,&pCodec->pFeatBuffer[pCodec->numCepCoeff],1,ippRndNear,-9);

      /*  Quantise  */
      pCodec->pFeatBuffer[pCodec->numCepCoeff] = (short)(pCodec->pFeatBuffer[pCodec->numCepCoeff] * pCodec->weight_logE);
      pCodec->pFeatBuffer[pCodec->numCepCoeff-1] = (short)(pCodec->weight_c0 * pCodec->pFeatBuffer[pCodec->numCepCoeff-1]);

      ippsSplitVQ_16s8u(pCodec->pFeatBuffer,pCodec->numCepCoeff+1,pCodec->pIndexVQBuffer,NUM_CODEBOOK,1,
         (const IppsCdbkState_16s **)pCodec->ppCdbkState,NUM_CODEBOOK);

      idx = (pCodec->iCountFrame/4)*23+6;
      if(pCodec->iCountFrame%4==0){
         pCodec->pFrame->pFrameBuffer[idx]   = (0x3f & pCodec->pIndexVQBuffer[0]);
         pCodec->pFrame->pFrameBuffer[idx]  |= (0xc0 & (pCodec->pIndexVQBuffer[1] << 6));
         pCodec->pFrame->pFrameBuffer[idx+1] = (0x0f & (pCodec->pIndexVQBuffer[1] >> 2));
         pCodec->pFrame->pFrameBuffer[idx+1]|= (0xf0 & (pCodec->pIndexVQBuffer[2] << 4));
         pCodec->pFrame->pFrameBuffer[idx+2] = (0x03 & (pCodec->pIndexVQBuffer[2] >> 4));
         pCodec->pFrame->pFrameBuffer[idx+2]|= (0xfc & (pCodec->pIndexVQBuffer[3] << 2));
         pCodec->pFrame->pFrameBuffer[idx+3] = (0x3f &  pCodec->pIndexVQBuffer[4]);
         pCodec->pFrame->pFrameBuffer[idx+3]|= (0xc0 & (pCodec->pIndexVQBuffer[5] << 6));
         pCodec->pFrame->pFrameBuffer[idx+4] = (0x0f & (pCodec->pIndexVQBuffer[5] >> 2));
         pCodec->pFrame->pFrameBuffer[idx+4]|= (0xf0 & (pCodec->pIndexVQBuffer[6] << 4));
         pCodec->pFrame->pFrameBuffer[idx+5] = (0x0f & (pCodec->pIndexVQBuffer[6] >> 4));
         pCodec->pFrame->pos += 5;
         crc = encodeCRC(&pCodec->pFrame->pFrameBuffer[idx]);
         pCodec->pFrame->pFrameBuffer[idx+11] = (0x0f & crc);
      }

      if(pCodec->iCountFrame%4==1){
         pCodec->pFrame->pFrameBuffer[idx+5]|= (0xf0 & (pCodec->pIndexVQBuffer[0] << 4));
         pCodec->pFrame->pFrameBuffer[idx+6] = (0x03 & (pCodec->pIndexVQBuffer[0] >> 4));
         pCodec->pFrame->pFrameBuffer[idx+6]|= (0xfc & (pCodec->pIndexVQBuffer[1] << 2));
         pCodec->pFrame->pFrameBuffer[idx+7] = (0x3f &  pCodec->pIndexVQBuffer[2]);
         pCodec->pFrame->pFrameBuffer[idx+7]|= (0xc0 & (pCodec->pIndexVQBuffer[3] << 6));
         pCodec->pFrame->pFrameBuffer[idx+8] = (0x0f & (pCodec->pIndexVQBuffer[3] >> 2));
         pCodec->pFrame->pFrameBuffer[idx+8]|= (0xf0 & (pCodec->pIndexVQBuffer[4] << 4));
         pCodec->pFrame->pFrameBuffer[idx+9] = (0x03 & (pCodec->pIndexVQBuffer[4] >> 4));
         pCodec->pFrame->pFrameBuffer[idx+9]|= (0xfc & (pCodec->pIndexVQBuffer[5] << 2));
         pCodec->pFrame->pFrameBuffer[idx+10]= (0xff &  pCodec->pIndexVQBuffer[6]);
         pCodec->pFrame->pos +=6;
         crc = encodeCRC(&pCodec->pFrame->pFrameBuffer[idx]);
         pCodec->pFrame->pFrameBuffer[idx+11] = (0x0f & crc);
      }

      if (pCodec->iCountFrame%4==2){
         pCodec->pFrame->pFrameBuffer[idx+11]|= (0xf0 & (pCodec->pIndexVQBuffer[0] << 4));
         pCodec->pFrame->pFrameBuffer[idx+12] = (0x03 & (pCodec->pIndexVQBuffer[0] >> 4));
         pCodec->pFrame->pFrameBuffer[idx+12]|= (0xfc & (pCodec->pIndexVQBuffer[1] << 2));
         pCodec->pFrame->pFrameBuffer[idx+13] = (0x3f &  pCodec->pIndexVQBuffer[2]);
         pCodec->pFrame->pFrameBuffer[idx+13]|= (0xc0 & (pCodec->pIndexVQBuffer[3] << 6));
         pCodec->pFrame->pFrameBuffer[idx+14] = (0x0f & (pCodec->pIndexVQBuffer[3] >> 2));
         pCodec->pFrame->pFrameBuffer[idx+14]|= (0xf0 & (pCodec->pIndexVQBuffer[4] << 4));
         pCodec->pFrame->pFrameBuffer[idx+15] = (0x03 & (pCodec->pIndexVQBuffer[4] >> 4));

⌨️ 快捷键说明

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