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

📄 decgsmamr.c

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 C
📖 第 1 页 / 共 3 页
字号:
GSMAMR_CODECFUN( APIGSMAMR_Status, apiGSMAMRDecoder_Mode, (GSMAMRDecoder_Obj* decoderObj, unsigned int mode))
{
   decoderObj->objPrm.mode = mode;
   return APIGSMAMR_StsNoErr;
}

static int ownDecode_GSMAMR(sDecoderState_GSMAMR *decState,  GSMAMR_Rate_t rate, short *pSynthParm,
    enum enDTXStateType newDTXState, RXFrameType frameType, short *pSynthSpeech, short *pA_LP);

/*************************************************************************
* apiGSMAMRDecode()
*   Decodes one frame: bitstream -> pcm audio
**************************************************************************/
GSMAMR_CODECFUN( APIGSMAMR_Status, apiGSMAMRDecode,
         (GSMAMRDecoder_Obj* decoderObj,const unsigned char* src, GSMAMR_Rate_t rate,
          RXFrameType rx_type, short* dst))
{
   IPP_ALIGNED_ARRAY(16, short, Az_dec, LP_ALL_FRAME);         /* Decoded Az for post-filter          */
   IPP_ALIGNED_ARRAY(16, short, prm_buf, MAX_NUM_PRM);
   short *prm = prm_buf;
   IPP_ALIGNED_ARRAY(16, short, tmp_synth, 160);
   enum enDTXStateType newDTXState;

   if(NULL==decoderObj || NULL==src || NULL ==dst)
      return APIGSMAMR_StsBadArgErr;
   if(0 >= decoderObj->objPrm.objSize)
      return APIGSMAMR_StsNotInitialized;
   if(rate > GSMAMR_RATE_DTX  || rate < 0)
      return APIGSMAMR_StsBadArgErr;
   if(DEC_KEY != decoderObj->objPrm.key)
      return APIGSMAMR_StsBadCodecType;
   decoderObj->rate = rate;
   newDTXState = ownRX_DTX_Handler_GSMAMR(decoderObj, rx_type);

   /* Synthesis */
   if( rx_type == RX_SID_BAD || rx_type == RX_SID_UPDATE) {
      ownBits2Prm_GSMAMR(src,prm,GSMAMR_RATE_DTX);
   }else{
      ownBits2Prm_GSMAMR(src,prm,decoderObj->rate);
   }
   ownDecode_GSMAMR(&decoderObj->stDecState, decoderObj->rate, prm,
          newDTXState, rx_type, (short*)dst, Az_dec);
   /* Post-filter */
   ippsPostFilter_GSMAMR_16s(Az_dec, (short*)dst, &decoderObj->stPFiltState.vMemPrevRes,
                             &decoderObj->stPFiltState.vPastGainScale,
                             decoderObj->stPFiltState.a_SynthBuf,
                             decoderObj->stPFiltState.a_MemSynPst,
                             tmp_synth, mode2rates[rate]);
   ippsCopy_16s(tmp_synth, (short*)dst, 160);
   /* post HP filter, and 15->16 bits */
   ippsHighPassFilter_G729_16s_ISfs((short*)dst, FRAME_SIZE_GSMAMR, 13, decoderObj->postProc);
   return APIGSMAMR_StsNoErr;
}

/***************************************************************************
*  Function: ownDecode_GSMAMR     Speech decoder routine.
***************************************************************************/
/*
*  decState  [in/out] -  State variables
*  rate          [in] - GSMAMR rate
*  pSynthParm    [in] - Vector of synthesis parameters (length of vector - PRM_SIZE)
*  newDTXState   [in] - State of DTX
*  frameType    [in] - Received frame type
*  pSynthSpeech [out] - Synthesis speech (length of vector - FRAME_SIZE_GSMAMR)
*  pA_LP        [out] - Decoded LP filter in 4 subframes (length of vector - LP_ALL_FRAME)
*/

static int ownDecode_GSMAMR(sDecoderState_GSMAMR *decState, GSMAMR_Rate_t rate, short *pSynthParm,
                            enum enDTXStateType newDTXState, RXFrameType frameType,
                            short *pSynthSpeech, short *pA_LP)
{
    /* LPC coefficients */
    short *Az;                /* Pointer on pA_LP */
    /* LSPs */
    IPP_ALIGNED_ARRAY(16, short, LspInter, SUBFR_SIZE_GSMAMR);
    /* LSFs */
    IPP_ALIGNED_ARRAY(16, short, prev_lsf, LP_ORDER_SIZE);
    IPP_ALIGNED_ARRAY(16, short, lsf_i, LP_ORDER_SIZE);
    /* Algebraic codevector */
    IPP_ALIGNED_ARRAY(16, short, code, SUBFR_SIZE_GSMAMR);
    /* excitation */
    IPP_ALIGNED_ARRAY(16, short, excp, SUBFR_SIZE_GSMAMR);
    IPP_ALIGNED_ARRAY(16, short, exc_enhanced, SUBFR_SIZE_GSMAMR);
    /* Scalars */
    short i, i_subfr;
    short T0, index, index_mr475 = 0;
    short gain_pit, gain_code, gain_code_mix, pit_sharp, pitch_fac;
    short tmp_shift, temp;
    short carefulFlag, excEnergy, subfrNr;
    int tmpRes;
    short evenSubfr = 0;
    short bfi = 0;   /* bad frame indication flag                          */
    short pdfi = 0;  /* potential degraded bad frame flag                  */
    IPP_ALIGNED_ARRAY(16, short, pDstAdptVector, SUBFR_SIZE_GSMAMR);
    sDTXDecoderSt *DTXState = &decState->dtxDecoderState;
    IppSpchBitRate irate = mode2rates[rate];

    /* find the new  DTX state  SPEECH OR DTX */
    /* function result */
    /* DTX actions */
    if (newDTXState != SPEECH)
    {
       ownDecoderInit_GSMAMR(decState,GSMAMR_RATE_DTX);
       ownDTXDecoder_GSMAMR(&decState->dtxDecoderState, decState->a_MemorySyn, decState->a_PastQntPredErr,
                            decState->a_PastLSFQnt, decState->a_PastQntEnergy, decState->a_PastQntEnergy_M122,
                            &decState->vHgAverageVar, &decState->vHgAverageCount, newDTXState, rate,
                            pSynthParm, pSynthSpeech, pA_LP);
       /* update average lsp */
       ippsLSFToLSP_GSMAMR_16s(decState->a_PastLSFQnt, decState->a_LSP_Old);
       ippsInterpolateC_NR_G729_16s_Sfs(decState->a_PastLSFQnt,EXP_CONST_016,
                                        decState->a_LSPAveraged,EXP_CONST_084,
                                        decState->a_LSPAveraged,LP_ORDER_SIZE,15);
       DTXState->eDTXPrevState = newDTXState;
       return 0;
    }
    /* SPEECH action state machine  */
    if((frameType == RX_SPEECH_BAD) || (frameType == RX_NO_DATA) || (frameType == RX_ONSET))
    {
       bfi = 1;
       if((frameType == RX_NO_DATA) || (frameType == RX_ONSET))
         ownBuildCNParam_GSMAMR(&decState->vCNGen, TableParamPerModes[rate],TableBitAllModes[rate],pSynthParm);
    }
    else if(frameType == RX_SPEECH_DEGRADED) pdfi = 1;

    if(bfi != 0)            decState->vStateMachine++;
    else if(decState->vStateMachine == 6) decState->vStateMachine = 5;
    else                     decState->vStateMachine = 0;

    if(decState->vStateMachine > 6) decState->vStateMachine = 6;
    if(DTXState->eDTXPrevState == DTX) {
       decState->vStateMachine = 5;
       decState->vPrevBadFr = 0;
    } else if (DTXState->eDTXPrevState == DTX_MUTE) {
       decState->vStateMachine = 5;
       decState->vPrevBadFr = 1;
    }

    /* save old LSFs for CB gain smoothing */
    ippsCopy_16s (decState->a_PastLSFQnt, prev_lsf, LP_ORDER_SIZE);
    /* decode LSF and generate interpolated lpc coefficients for the 4 subframes */
    ippsQuantLSPDecode_GSMAMR_16s(pSynthParm, decState->a_PastQntPredErr, decState->a_PastLSFQnt,
                                  decState->a_LSP_Old, LspInter, bfi, irate);
    ippsLSPToLPC_GSMAMR_16s(&(LspInter[0]), &(pA_LP[0]));  /* Subframe 1 */
    ippsLSPToLPC_GSMAMR_16s(&(LspInter[LP_ORDER_SIZE]), &(pA_LP[LP1_ORDER_SIZE]));  /* Subframe 2 */
    ippsLSPToLPC_GSMAMR_16s(&(LspInter[LP_ORDER_SIZE*2]), &(pA_LP[LP1_ORDER_SIZE*2]));  /* Subframe 3 */
    ippsLSPToLPC_GSMAMR_16s(&(LspInter[LP_ORDER_SIZE*3]), &(pA_LP[LP1_ORDER_SIZE*3]));  /* Subframe 4 */

    if(irate == IPP_SPCHBR_12200) pSynthParm += 5;
    else pSynthParm += 3;
    /*------------------------------------------------------------------------*
     *          Loop for every subframe in the analysis frame                 *
     *------------------------------------------------------------------------*/

    Az = pA_LP;      /* pointer to interpolated LPC parameters */
    evenSubfr = 0;
    subfrNr = -1;
    for (i_subfr = 0; i_subfr < FRAME_SIZE_GSMAMR; i_subfr += SUBFR_SIZE_GSMAMR)
    {
       subfrNr++;
       evenSubfr = 1 - evenSubfr;
       /* pitch index */
       index = *pSynthParm++;

       ippsAdaptiveCodebookDecode_GSMAMR_16s(
            index, &decState->vPrevPitchLag, &decState->vLTPLag, (decState->pExcVec - MAX_OFFSET),
            &T0, pDstAdptVector, subfrNr, bfi,
            decState->vBackgroundNoise, decState->vVoiceHangover, irate);

        if (irate == IPP_SPCHBR_12200)
        { /* MR122 */
            index = *pSynthParm++;
            if (bfi != 0)
                ownConcealGainPitch_GSMAMR(decState->a_LSFBuffer,decState->vPastGainZero, decState->vStateMachine, &gain_pit);
            else
                gain_pit = (TableQuantGainPitch[index] >> 2) << 2;
            ownConcealGainPitchUpdate_GSMAMR(decState->a_LSFBuffer, &decState->vPastGainZero,&decState->vPrevGainZero, bfi,
                                  decState->vPrevBadFr, &gain_pit);
        }
        ippsFixedCodebookDecode_GSMAMR_16s(pSynthParm, code, subfrNr, irate);

        if (irate == IPP_SPCHBR_10200) { /* MR102 */
            pSynthParm+=7;
            pit_sharp = Cnvrt_32s16s(decState->vFlagSharp << 1);
        } else if (irate == IPP_SPCHBR_12200) { /* MR122 */
            pSynthParm+=10;
            pit_sharp = Cnvrt_32s16s(gain_pit << 1);
        } else {
            pSynthParm+=2;
            pit_sharp = Cnvrt_32s16s(decState->vFlagSharp << 1);
        }

        if(T0 < SUBFR_SIZE_GSMAMR)
           ippsHarmonicFilter_16s_I(pit_sharp,T0,code+T0, (SUBFR_SIZE_GSMAMR - T0));

        if (irate == IPP_SPCHBR_4750) {
           /* read and decode pitch and code gain */
           if(evenSubfr != 0)
              index_mr475 = *pSynthParm++;        /* index of gain(s) */
           if (bfi == 0) {
              ownDecodeCodebookGains_GSMAMR(decState->a_PastQntEnergy,decState->a_PastQntEnergy_M122, irate, index_mr475, code,
                       evenSubfr, &gain_pit, &gain_code);
           } else {
              ownConcealGainPitch_GSMAMR(decState->a_LSFBuffer,decState->vPastGainZero, decState->vStateMachine, &gain_pit);
              ownConcealCodebookGain_GSMAMR(decState->a_GainBuffer,decState->vPastGainCode, decState->a_PastQntEnergy,
                            decState->a_PastQntEnergy_M122, decState->vStateMachine,&gain_code);
           }
           ownConcealGainPitchUpdate_GSMAMR(decState->a_LSFBuffer, &decState->vPastGainZero,&decState->vPrevGainZero, bfi, decState->vPrevBadFr,
                                 &gain_pit);
           ownConcealCodebookGainUpdate_GSMAMR(decState->a_GainBuffer,&decState->vPastGainCode,&decState->vPrevGainCode, bfi, decState->vPrevBadFr,
                                &gain_code);
           pit_sharp = gain_pit;
           if(pit_sharp > PITCH_SHARP_MAX) pit_sharp = PITCH_SHARP_MAX;
        }
        else if ((irate <= IPP_SPCHBR_7400) || (irate == IPP_SPCHBR_10200))
        {
            /* read and decode pitch and code gain */
            index = *pSynthParm++;                /* index of gain(s) */
            if(bfi == 0) {
               ownDecodeCodebookGains_GSMAMR(decState->a_PastQntEnergy,decState->a_PastQntEnergy_M122, irate, index, code,
                        evenSubfr, &gain_pit, &gain_code);
            } else {

⌨️ 快捷键说明

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