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

📄 encgsmamr.c

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*/////////////////////////////////////////////////////////////////////////////
//
//                  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) 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: GSMAMR speech codec: encoder API.
//
*/

#include "owngsmamr.h"

/* filter coefficients (fc = 140 Hz, coeff. b[] is divided by 2) */
static __ALIGN32 CONST short pTblCoeff_b140[3] = {1899, -3798, 1899};      /* 1/2 in Q12 */
static __ALIGN32 CONST short pTblCoeff_a140[3] = {4096, 7807, -3733};      /* Q12 */

/* Spectral expansion factors */

static __ALIGN32 CONST short pTableGamma1[4*LP_ORDER_SIZE+4] =
{
   32767, 30802, 28954, 27217, 25584, 24049, 22606, 21250, 19975, 18777, 17650,
   32767, 30802, 28954, 27217, 25584, 24049, 22606, 21250, 19975, 18777, 17650,
   32767, 30802, 28954, 27217, 25584, 24049, 22606, 21250, 19975, 18777, 17650,
   32767, 30802, 28954, 27217, 25584, 24049, 22606, 21250, 19975, 18777, 17650
};

/* pTableGamma1 differs for the 12k2 coder */
static __ALIGN32 CONST short pTableGamma1_M122[4*LP_ORDER_SIZE+4] =
{
    32767, 29491, 26542, 23888, 21499, 19349, 17414, 15672, 14105, 12694, 11425,
    32767, 29491, 26542, 23888, 21499, 19349, 17414, 15672, 14105, 12694, 11425,
    32767, 29491, 26542, 23888, 21499, 19349, 17414, 15672, 14105, 12694, 11425,
    32767, 29491, 26542, 23888, 21499, 19349, 17414, 15672, 14105, 12694, 11425
};

static __ALIGN32 CONST short pTableGamma2[4*LP_ORDER_SIZE+4] =
{
   32767, 19661, 11797, 7078, 4247, 2548, 1529, 917, 550, 330, 198,
   32767, 19661, 11797, 7078, 4247, 2548, 1529, 917, 550, 330, 198,
   32767, 19661, 11797, 7078, 4247, 2548, 1529, 917, 550, 330, 198,
   32767, 19661, 11797, 7078, 4247, 2548, 1529, 917, 550, 330, 198
};

GSMAMR_CODECFUN( APIGSMAMR_Status, apiGSMAMREncoder_GetSize,
         (GSMAMREncoder_Obj* encoderObj, unsigned int *pCodecSize))
{
   if(NULL == encoderObj)
      return APIGSMAMR_StsBadArgErr;
   if(NULL == pCodecSize)
      return APIGSMAMR_StsBadArgErr;
   if(encoderObj->objPrm.key != DEC_KEY)
      return APIGSMAMR_StsNotInitialized;

   *pCodecSize = encoderObj->objPrm.objSize;
   return APIGSMAMR_StsNoErr;
}


/*************************************************************************
*  Function:   apiGSMAMREncoder_Alloc
*     Enquire a size of the coder state memory
**************************************************************************/
GSMAMR_CODECFUN( APIGSMAMR_Status, apiGSMAMREncoder_Alloc,
         (const GSMAMREnc_Params *gsm_Params, unsigned int *pSizeTab))
{
   int fltSize;
   int allocSize=sizeof(GSMAMREncoder_Obj);
   ippsHighPassFilterSize_G729(&fltSize);
   allocSize += fltSize;
   if(GSMAMR_CODEC != gsm_Params->codecType)
      return APIGSMAMR_StsBadCodecType;
   ownEncDetectSize_GSMAMR(gsm_Params->mode,&allocSize);
   pSizeTab[0] =  allocSize;
   return APIGSMAMR_StsNoErr;
}

int ownDtxEncoderInit_GSMAMR(sDTXEncoderSt* dtxSt)
{
   short i;

   dtxSt->vHistoryPtr = 0;
   dtxSt->vLogEnergyIndex = 0;
   dtxSt->vLSFQntIndex = 0;
   dtxSt->a_LSPIndex[0] = 0;
   dtxSt->a_LSPIndex[1] = 0;
   dtxSt->a_LSPIndex[2] = 0;

   for(i = 0; i < DTX_HIST_SIZE; i++)
     ippsCopy_16s(TableLSPInitData, &dtxSt->a_LSPHistory[i * LP_ORDER_SIZE], LP_ORDER_SIZE);

   ippsZero_16s(dtxSt->a_LogEnergyHistory, DTX_HIST_SIZE);
   dtxSt->vDTXHangoverCt = DTX_HANG_PERIOD;
   dtxSt->vDecExpireCt = 32767;

   return 1;
}

int ownGainQuantInit_GSMAMR(sGainQuantSt *state)
{

   state->vExpPredCBGain = 0;
   state->vFracPredCBGain = 0;
   state->vExpTargetEnergy = 0;
   state->vFracTargetEnergy = 0;

   ippsZero_16s(state->a_ExpEnCoeff, 5);
   ippsZero_16s(state->a_FracEnCoeff, 5);
   state->pGainPtr = NULL;
   ippsSet_16s(MIN_ENERGY, state->a_PastQntEnergy, NUM_PRED_TAPS);
   ippsSet_16s(MIN_ENERGY_M122, state->a_PastQntEnergy_M122, NUM_PRED_TAPS);
   ippsSet_16s(MIN_ENERGY, state->a_PastUnQntEnergy, NUM_PRED_TAPS);
   ippsSet_16s(MIN_ENERGY_M122, state->a_PastUnQntEnergy_M122, NUM_PRED_TAPS);
   state->vOnSetQntGain = 0;
   state->vPrevAdaptOut = 0;
   state->vPrevGainCode = 0;
   ippsZero_16s(state->a_LTPHistoryGain,NUM_MEM_LTPG);

   return 1;
}

int ownVAD1Init_GSMAMR(IppGSMAMRVad1State *state)
{

   state->pitchFlag = 0;
   state->complexHigh = 0;
   state->complexLow = 0;
   state->complexHangTimer = 0;
   state->vadReg = 0;
   state->statCount = 0;
   state->burstCount = 0;
   state->hangCount = 0;
   state->complexHangCount = 0;

   ippsZero_16s( state->pFifthFltState, 6 );
   ippsZero_16s( state->pThirdFltState, 5 );

   ippsSet_16s(INIT_BACKGROUND_NOISE, state->pBkgNoiseEstimate, NUM_SUBBANDS_VAD);
   ippsSet_16s(INIT_BACKGROUND_NOISE, state->pPrevSignalLevel, NUM_SUBBANDS_VAD);
   ippsSet_16s(INIT_BACKGROUND_NOISE, state->pPrevAverageLevel, NUM_SUBBANDS_VAD);
   ippsZero_16s( state->pPrevSignalSublevel, NUM_SUBBANDS_VAD );

   state->corrHp = INIT_LOWPOW_SEGMENT;
   state->complexWarning = 0;

   return 1;
}

int ownVAD2Init_GSMAMR(IppGSMAMRVad2State *state)
{
    ippsZero_16s((Ipp16s *)state, sizeof(IppGSMAMRVad2State)/2);
    return 1;
}

int ownEncDetectSize_GSMAMR(int mode, int* pEncSize)
{
   //if (mode == GSMAMREncode_VAD1_Enabled)
      *pEncSize += sizeof(IppGSMAMRVad1State);
   //if (mode == GSMAMREncode_VAD2_Enabled)
      *pEncSize += sizeof(IppGSMAMRVad2State);

   return 1;
}

int ownEncoderInit_GSMAMR(GSMAMREncoder_Obj* pEnc)
{
   sEncoderState_GSMAMR *stEnc = &pEnc->stEncState;
   stEnc->vFlagDTX = pEnc->objPrm.mode;

   stEnc->pSpeechPtrNew = stEnc->a_SpeechVecOld + SPEECH_BUF_SIZE - FRAME_SIZE_GSMAMR;   /* New speech     */
   stEnc->pSpeechPtr = stEnc->pSpeechPtrNew - SUBFR_SIZE_GSMAMR;                  /* Present frame  */
   stEnc->pWindowPtr = stEnc->a_SpeechVecOld + SPEECH_BUF_SIZE - LP_WINDOW_SIZE;    /* For LPC window */
   stEnc->pWindowPtr_M122 = stEnc->pWindowPtr - SUBFR_SIZE_GSMAMR; /* EFR LPC window: no lookahead */

   stEnc->pWeightSpeechVec = stEnc->a_WeightSpeechVecOld + PITCH_MAX_LAG;
   stEnc->pExcVec = stEnc->a_ExcVecOld + PITCH_MAX_LAG + FLT_INTER_SIZE;
   stEnc->pZeroVec = stEnc->a_ZeroVec + LP1_ORDER_SIZE;
   stEnc->pErrorPtr = stEnc->a_MemoryErr + LP_ORDER_SIZE;
   stEnc->pImpResVec = &stEnc->a_ImpResVec[0];

   ippsZero_16s(stEnc->a_SpeechVecOld, SPEECH_BUF_SIZE);
   ippsZero_16s(stEnc->a_ExcVecOld,PITCH_MAX_LAG + FLT_INTER_SIZE);
   ippsZero_16s(stEnc->a_WeightSpeechVecOld,PITCH_MAX_LAG);
   ippsZero_16s(stEnc->a_MemorySyn,LP_ORDER_SIZE);
   //ippsZero_16s(stEnc->a_Memory_W1,LP_ORDER_SIZE);
   ippsZero_16s(stEnc->a_Memory_W0,LP_ORDER_SIZE);
   ippsZero_16s(stEnc->a_MemoryErr,LP_ORDER_SIZE);
   ippsZero_16s(stEnc->pZeroVec,SUBFR_SIZE_GSMAMR);

   ippsSet_16s(40, stEnc->a_LTPStateOld, 5);

   ippsZero_16s(stEnc->a_SubState, (LP_ORDER_SIZE + 1));
   stEnc->a_SubState[0] = 4096;

   ippsCopy_16s(TableLSPInitData, &stEnc->a_LSP_Old[0], LP_ORDER_SIZE);
   ippsCopy_16s(stEnc->a_LSP_Old, stEnc->a_LSPQnt_Old, LP_ORDER_SIZE);
   ippsZero_16s(stEnc->a_PastQntPredErr,LP_ORDER_SIZE);

   stEnc->vTimePrevSubframe = 0;

   ownGainQuantInit_GSMAMR(&stEnc->stGainQntSt);

   stEnc->vTimeMedOld = 40;
   stEnc->vFlagVADState = 0;
   //stEnc->wght_flg = 0;

   stEnc->vCount = 0;
   ippsZero_16s(stEnc->a_GainHistory, PG_NUM_FRAME);    /* Init Gp_Clipping */

  // if (stEnc->vFlagDTX == GSMAMREncode_VAD1_Enabled)
      ownVAD1Init_GSMAMR((IppGSMAMRVad1State*)stEnc->pVAD1St);
  // if (stEnc->vFlagDTX == GSMAMREncode_VAD2_Enabled)
      ownVAD2Init_GSMAMR((IppGSMAMRVad2State*)stEnc->pVAD2St);
   ownDtxEncoderInit_GSMAMR(&stEnc->stDTXEncState);

   stEnc->vFlagSharp = PITCH_SHARP_MIN;
   stEnc->vLagCountOld = 0;
   stEnc->vLagOld = 0;
   stEnc->vFlagTone = 0;
   stEnc->vBestHpCorr = INIT_LOWPOW_SEGMENT;

   return 1;
}
GSMAMR_CODECFUN( APIGSMAMR_Status, apiGSMAMREncoder_Mode,
                (GSMAMREncoder_Obj* encoderObj, unsigned int mode))
{
   encoderObj->objPrm.mode = mode;
   encoderObj->stEncState.vFlagDTX = mode;
   return APIGSMAMR_StsNoErr;
}
/*************************************************************************
*  Function:   apiGSMAMREncoder_Init
*     Initializes coder state memory
**************************************************************************/
GSMAMR_CODECFUN( APIGSMAMR_Status, apiGSMAMREncoder_Init,
                (GSMAMREncoder_Obj* encoderObj, unsigned int mode))
{
   int fltSize;
   IPP_ALIGNED_ARRAY(16, Ipp16s, abEnc, 6);
   int obj_size = sizeof(GSMAMREncoder_Obj);
   ippsZero_16s((short*)encoderObj,sizeof(GSMAMREncoder_Obj)>>1) ;
   encoderObj->objPrm.mode = mode;
   encoderObj->objPrm.key = ENC_KEY;
   encoderObj->preProc = (char*)encoderObj + sizeof(GSMAMREncoder_Obj);
   ippsHighPassFilterSize_G729(&fltSize);
   obj_size += fltSize;
   ownEncDetectSize_GSMAMR(mode,&obj_size);
   encoderObj->stEncState.pVAD1St = (char*)encoderObj->preProc + fltSize;
   fltSize = sizeof(IppGSMAMRVad1State);
   encoderObj->stEncState.pVAD2St = (char*)encoderObj->stEncState.pVAD1St + fltSize;
   obj_size += fltSize;
   encoderObj->objPrm.objSize = obj_size;

   abEnc[0] = pTblCoeff_a140[0];
   abEnc[1] = pTblCoeff_a140[1];
   abEnc[2] = pTblCoeff_a140[2];
   abEnc[3] = pTblCoeff_b140[0];
   abEnc[4] = pTblCoeff_b140[1];
   abEnc[5] = pTblCoeff_b140[2];
   ownEncoderInit_GSMAMR(encoderObj);
   ippsHighPassFilterInit_G729(abEnc, encoderObj->preProc);

   return APIGSMAMR_StsNoErr;
}
/*************************************************************************
*  Function:   apiGSMAMREncode
**************************************************************************/

GSMAMR_CODECFUN(  APIGSMAMR_Status, apiGSMAMREncode,
         (GSMAMREncoder_Obj* encoderObj,const short* src,  GSMAMR_Rate_t rate,
          unsigned char* dst, int *pVad ))
{
   IPP_ALIGNED_ARRAY(16, short, pSynthVec, FRAME_SIZE_GSMAMR);        /* Buffer for synthesis speech           */
   IPP_ALIGNED_ARRAY(16, short, pParamVec, MAX_NUM_PRM);
   short *pParamPtr = pParamVec;
   short *pNewSpeech = encoderObj->stEncState.pSpeechPtrNew;

   if(NULL==encoderObj || NULL==src || NULL ==dst )
      return APIGSMAMR_StsBadArgErr;
   if(0 >= encoderObj->objPrm.objSize)
      return APIGSMAMR_StsNotInitialized;
   if(rate > GSMAMR_RATE_DTX  || rate < 0)
      return APIGSMAMR_StsBadArgErr;
   if(ENC_KEY != encoderObj->objPrm.key)
      return APIGSMAMR_StsBadCodecType;
   encoderObj->rate = rate;

   /* filter + downscaling */
   ippsCopy_16s(src, pNewSpeech, FRAME_SIZE_GSMAMR);
   ippsHighPassFilter_G729_16s_ISfs(pNewSpeech, FRAME_SIZE_GSMAMR, 12, encoderObj->preProc);

   /* Call the speech encoder */
   ownEncode_GSMAMR(&encoderObj->stEncState, encoderObj->rate, pParamPtr, pVad, pSynthVec);

   if(!*pVad) rate = GSMAMR_RATE_DTX;
   ownPrm2Bits_GSMAMR(pParamVec, dst, rate);

   return APIGSMAMR_StsNoErr;
}

/***************************************************************************
 * Function: ownEncode_GSMAMR
 ***************************************************************************/
int ownEncode_GSMAMR(sEncoderState_GSMAMR *encSt,GSMAMR_Rate_t rate, short *pAnaParam,
                     int *pVad, short *pSynthVec)
{
   /* LPC coefficients */
   IPP_ALIGNED_ARRAY(16, short, A_t, (LP1_ORDER_SIZE) * 4);
   IPP_ALIGNED_ARRAY(16, short, Aq_t, (LP1_ORDER_SIZE) * 4);
   short *A, *Aq;
   IPP_ALIGNED_ARRAY(16, short, pNewLSP, 2*LP_ORDER_SIZE);

   IPP_ALIGNED_ARRAY(16, short, pPitchSrch, SUBFR_SIZE_GSMAMR);

⌨️ 快捷键说明

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