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

📄 encg729fp.c

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 C
📖 第 1 页 / 共 5 页
字号:
/*/////////////////////////////////////////////////////////////////////////////
//
//                  INTEL CORPORATION PROPRIETARY INFORMATION
//     This software is supplied under the terms of a license agreement or
//     nondisclosure agreement with Intel Corporation and may not be copied
//     or disclosed except in accordance with the terms of that agreement.
//          Copyright(c) 2004-2005 Intel Corporation. All Rights Reserved.
//
//     Intel(R) Integrated Performance Primitives
//     USC - Unified Speech Codec interface library
//
// By downloading and installing USC codec, you hereby agree that the
// accompanying Materials are being provided to you under the terms and
// conditions of the End User License Agreement for the Intel(R) Integrated
// Performance Primitives product previously accepted by you. Please refer
// to the file ipplic.htm located in the root directory of your Intel(R) IPP
// product installation for more information.
//
// A speech coding standards promoted by ITU, ETSI, 3GPP and other
// organizations. Implementations of these standards, or the standard enabled
// platforms may require licenses from various entities, including
// Intel Corporation.
//
//
// Purpose: G.729 floating-point speech codec: encode API functions.
//
*/
#include <math.h>
#include "owng729fp.h"

__ALIGN32 CONST float InitLSP[LPC_ORDER] =
     { 0.9595f,  0.8413f,  0.6549f,  0.4154f,  0.1423f,
      -0.1423f, -0.4154f, -0.6549f, -0.8413f, -0.9595f
};
__ALIGN32 CONST float InitFrequences[LPC_ORDER] = {  /* previous LSP vector(init) */
 0.285599f,  0.571199f,  0.856798f,  1.142397f,  1.427997f,
 1.713596f,  1.999195f,  2.284795f,  2.570394f,  2.855993f
};     /* IPP_PI*(j+1)/(LPC_ORDER+1) */

static __ALIGN32 CONST float b140[3] = {0.92727435E+00f, -0.18544941E+01f, 0.92727435E+00f};
static __ALIGN32 CONST float a140[3] = {1.00000000E+00f, 0.19059465E+01f, -0.91140240E+00f};

static __ALIGN32 CONST float lwindow[LPC_ORDER+2] = {
   0.99879038f, 0.99546894f, 0.98995779f,
   0.98229335f, 0.97252620f, 0.96072035f,
   0.94695264f, 0.93131180f, 0.91389754f,
   0.89481964f, 0.87419660f, 0.85215437f
};

__ALIGN32 CONST float lagBwd[BWD_LPC_ORDER] = {
   0.999892f,  0.999869f,  0.999831f,  0.999777f,  0.999707f,
   0.999622f,  0.999522f,  0.999407f,  0.999276f,  0.999129f,
   0.998968f,  0.998790f,  0.998598f,  0.998390f,  0.998167f,
   0.997928f,  0.997674f,  0.997405f,  0.997121f,  0.996821f,
   0.996506f,  0.996175f,  0.995830f,  0.995469f,  0.995093f,
   0.994702f,  0.994295f,  0.993874f,  0.993437f,  0.992985f,
};

/* Quantization of SID gain */
__ALIGN32 CONST float SIDGainTbl[32] = {
      0.502f,    1.262f,    2.000f,    3.170f,
      5.024f,    7.962f,   12.619f,   15.887f,
     20.000f,   25.179f,   31.698f,   39.905f,
     50.238f,   63.246f,   79.621f,  100.237f,
    126.191f,  158.866f,  200.000f,  251.785f,
    316.979f,  399.052f,  502.377f,  632.456f,
    796.214f, 1002.374f, 1261.915f, 1588.656f,
   2000.000f, 2517.851f, 3169.786f, 3990.525f
};

#define         AVG(a,b,c,d) (int)( ((a)+(b)+(c)+(d))/4.0f + 0.5f)

static void UpdateVad_I(G729FPEncoder_Obj* encoderObj, float *Excitation, float *forwardLPC, float *WeightedSpeech,
                 float *gamma1, float *gamma2, float *pSynth,
                 float *pError, float *SpeechWnd, int* dst,G729Codec_Type codecType);

static void UpdateVad_A(G729FPEncoder_Obj* encoderObj, float *Excitation,
                        float *WeightedSpeech, float *SpeechWnd, int* dst);

static void UpdateCNG(float *pSrcAutoCorr, int Vad, char *cngMem);

static int CodecType2Num(G729Codec_Type codecType)
{
    switch(codecType) {
    case G729D_CODEC:
       return 0;
    case G729_CODEC:
       return 1;
    case G729A_CODEC:
       return 1;
    case G729E_CODEC:
       return 2;
    }
    return -1;
}

static int ownEncoderObjSize()
{
   int codecSize, fltsize;

   codecSize = sizeof(G729FPEncoder_Obj);
   ippsIIRGetStateSize_32f(2,&fltsize);
   codecSize += fltsize;
   VADGetSize(&fltsize);
   codecSize += fltsize;
   CNGGetSize(&fltsize);
   codecSize += fltsize;
   MSDGetSize(&fltsize);
   codecSize += fltsize;
   ippsWinHybridGetStateSize_G729E_32f(&fltsize);
   codecSize += fltsize;

   return codecSize;
}

G729_CODECFUN( APIG729_Status, apiG729FPEncoder_Alloc,
         (G729Codec_Type codecType, int *pCodecSize))
{
   if ((codecType != G729_CODEC)&&(codecType != G729A_CODEC)
      &&(codecType != G729D_CODEC)&&(codecType != G729E_CODEC)&&(codecType != G729I_CODEC)){
      return APIG729_StsBadCodecType;
   }

   *pCodecSize = ownEncoderObjSize();

   return APIG729_StsNoErr;

}

G729_CODECFUN( APIG729_Status, apiG729FPCodec_ScratchMemoryAlloc,(int *pCodecSize))
{
   if(NULL==pCodecSize)
      return APIG729_StsBadArgErr;
   *pCodecSize = G729FP_ENCODER_SCRATCH_MEMORY_SIZE;

   return APIG729_StsNoErr;
}

G729_CODECFUN( APIG729_Status, apiG729FPEncoder_Mode,
         (G729FPEncoder_Obj* encoderObj, G729Encode_Mode mode))
{
   if(G729Encode_VAD_Enabled != mode && G729Encode_VAD_Disabled != mode){
      return APIG729_StsBadArgErr;
   }
   encoderObj->objPrm.mode = mode;
   return APIG729_StsNoErr;
}

G729_CODECFUN( APIG729_Status, apiG729FPEncoder_InitBuff,
         (G729FPEncoder_Obj* encoderObj, char *buff))
{
#if !defined (NO_SCRATCH_MEMORY_USED)

   if(NULL==encoderObj || NULL==buff)
      return APIG729_StsBadArgErr;

   encoderObj->Mem.base = buff;
   encoderObj->Mem.CurPtr = encoderObj->Mem.base;
   encoderObj->Mem.VecPtr = (int *)(encoderObj->Mem.base+G729FP_ENCODER_SCRATCH_MEMORY_SIZE);
#endif
   return APIG729_StsNoErr;
}

G729_CODECFUN( APIG729_Status, apiG729FPEncoder_Init,
         (G729FPEncoder_Obj* encoderObj, G729Codec_Type codecType, G729Encode_Mode mode))
{

   int i;
   int fltsize;
   void* pBuf;
   Ipp32f coeff[6];

   if(NULL==encoderObj)
      return APIG729_StsBadArgErr;

   if ((codecType != G729_CODEC)&&(codecType != G729A_CODEC)
      &&(codecType != G729D_CODEC)&&(codecType != G729E_CODEC)&&(codecType != G729I_CODEC)){
      return APIG729_StsBadCodecType;
   }

   ippsZero_16s((short*)encoderObj,sizeof(G729FPEncoder_Obj)>>1) ;

   encoderObj->objPrm.objSize = ownEncoderObjSize();
   encoderObj->objPrm.mode = mode;
   encoderObj->objPrm.key = ENC_KEY;
   encoderObj->objPrm.codecType=codecType;

   coeff[0] = b140[0];
   coeff[1] = b140[1];
   coeff[2] = b140[2];
   coeff[3] = a140[0];
   coeff[4] = -a140[1];
   coeff[5] = -a140[2];
   pBuf = (char*)encoderObj + sizeof(G729FPEncoder_Obj);
   ippsIIRInit_32f(&encoderObj->iirstate,coeff,2,NULL,pBuf);
   ippsIIRGetStateSize_32f(2,&fltsize);
   encoderObj->vadMem = (char *)((char*)pBuf + fltsize);
   VADGetSize(&fltsize);
   encoderObj->cngMem = (char *)((char*)encoderObj->vadMem + fltsize);
   CNGGetSize(&fltsize);
   encoderObj->msdMem = (char *)((char*)encoderObj->cngMem + fltsize);
   MSDGetSize(&fltsize);
   encoderObj->pHWState = (IppsWinHybridState_G729E_32f *)((char*)encoderObj->msdMem + fltsize);

   /* Static vectors to zero */

   ippsZero_32f(encoderObj->OldSpeechBuffer, SPEECH_BUFF_LEN);
   ippsZero_32f(encoderObj->OldExcitationBuffer, PITCH_LAG_MAX+INTERPOL_LEN);
   ippsZero_32f(encoderObj->OldWeightedSpeechBuffer, PITCH_LAG_MAX);
   ippsZero_32f(encoderObj->WeightedFilterMemory,  BWD_LPC_ORDER);
   ippsZero_32f(encoderObj->FltMem,   BWD_LPC_ORDER);
   encoderObj->fBetaPreFilter = PITCH_SHARPMIN;
   ippsCopy_32f(InitLSP, encoderObj->OldLSP, LPC_ORDER);
   ippsCopy_32f(InitLSP, encoderObj->OldQuantLSP, LPC_ORDER);
   for(i=0; i<4; i++) encoderObj->ExcitationError[i] = 1.f;

   encoderObj->PastQuantEnergy[0]=encoderObj->PastQuantEnergy[1]=encoderObj->PastQuantEnergy[2]=encoderObj->PastQuantEnergy[3]=-14.0;
   for(i=0; i<MOVING_AVER_ORDER; i++)
     ippsCopy_32f (&InitFrequences[0], &encoderObj->PrevFreq[i][0], LPC_ORDER );
   ippsZero_32f(encoderObj->OldForwardLPC, LPC_ORDERP1);
   encoderObj->OldForwardLPC[0]= 1.f;
   ippsZero_32f(encoderObj->OldForwardRC, 2);
   encoderObj->sFrameCounter = 0;
   /* For G.729B */
   /* Initialize VAD/DTX parameters */
   //if(mode == G729Encode_VAD_Enabled) {
      encoderObj->prevVADDec = 1;
      encoderObj->prevPrevVADDec = 1;
      encoderObj->sCNGSeed = INIT_SEED_VAL;
      VADInit(encoderObj->vadMem);
      CNGInit(encoderObj->cngMem);
      MSDInit(encoderObj->msdMem);
   //}
   encoderObj->prevLPCMode = 0;
   if(codecType==G729A_CODEC) {
      ippsZero_32f(encoderObj->ZeroMemory, LPC_ORDER);
   } else {
      ippsZero_32f(encoderObj->SynFltMemory,  BWD_LPC_ORDER);
      ippsZero_32f(encoderObj->ErrFltMemory, BWD_LPC_ORDER);
      ippsZero_32f(&encoderObj->UnitImpulse[BWD_LPC_ORDERP1], SUBFR_LEN);
      ippsZero_32f(encoderObj->PrevFlt, BWD_LPC_ORDERP1);
      encoderObj->PrevFlt[0] = 1.f;
      ippsWinHybridInit_G729E_32f(encoderObj->pHWState);
      ippsZero_32f(encoderObj->SynthBuffer, BWD_ANALISIS_WND_LEN);
      ippsZero_32f(encoderObj->BackwardLPCMemory, BWD_LPC_ORDERP1);
      encoderObj->BackwardLPCMemory[0] = 1.f;
      encoderObj->isBWDDominant = 0;
      encoderObj->fInterpolationCoeff = 1.1f;       /* Filter interpolation parameter */
      encoderObj->sGlobalStatInd = 10000;  /* Mesure of global stationnarity */
      encoderObj->sBWDStatInd = 0;       /* Nbre of consecutive backward frames */
      encoderObj->sValBWDStatInd = 0;   /* Value associated with stat_bwd */
      ippsZero_32f(encoderObj->OldBackwardLPC, BWD_LPC_ORDERP1);
      encoderObj->OldBackwardLPC[0]= 1.f;
      ippsZero_32f(encoderObj->OldBackwardRC, 2);
      ippsSet_32s(20,encoderObj->LagBuffer,5);
      ippsSet_32f(0.7f,encoderObj->PitchGainBuffer,5);
      encoderObj->sBWDFrmCounter = 0;
      encoderObj->sFWDFrmCounter = 0;
      encoderObj->isSmooth = 1;
      encoderObj->LogAreaRatioCoeff[0] = encoderObj->LogAreaRatioCoeff[1] = 0.f;
      encoderObj->sSearchTimes = 30;
   }

   return APIG729_StsNoErr;
}

G729_CODECFUN( APIG729_Status, apiG729FPEncode,
         (G729FPEncoder_Obj* encoderObj,const short* src, unsigned char *dst,G729Codec_Type codecType, int *frametype))
{
    /* LPC analysis */
    LOCAL_ALIGN_ARRAY(32, float, forwardAutoCorr, (LPC_ORDERP2+1),encoderObj);       /* Autocorrelations (forward) */
    LOCAL_ALIGN_ARRAY(32, float, backwardAutoCorr, BWD_LPC_ORDERP1,encoderObj);      /* Autocorrelations (backward) */
    LOCAL_ALIGN_ARRAY(32, float, backwardReflectCoeff, BWD_LPC_ORDER,encoderObj);       /* Reflection coefficients : backward analysis */
    LOCAL_ALIGN_ARRAY(32, float, forwardLPC, LPC_ORDERP1*2,encoderObj);      /* A(z) forward unquantized for the 2 subframes */
    LOCAL_ALIGN_ARRAY(32, float, forwardQntLPC, LPC_ORDERP1*2,encoderObj);    /* A(z) forward quantized for the 2 subframes */
    LOCAL_ALIGN_ARRAY(32, float, backwardLPC, 2*BWD_LPC_ORDERP1,encoderObj);  /* A(z) backward for the 2 subframes */
    LOCAL_ALIGN_ARRAY(32, float, WeightedLPC1, BWD_LPC_ORDERP1,encoderObj);        /* A(z) with spectral expansion         */
    LOCAL_ALIGN_ARRAY(32, float, WeightedLPC2, BWD_LPC_ORDERP1,encoderObj);        /* A(z) with spectral expansion         */

⌨️ 快捷键说明

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