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

📄 decgsmamr.c

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 C
📖 第 1 页 / 共 3 页
字号:
               ownConcealGainPitch_GSMAMR(decState->a_LSFBuffer,decState->vPastGainZero, decState->vStateMachine, &gain_pit);
               ownConcealCodebookGain_GSMAMR(decState->a_LSFBuffer,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;
            if (irate == IPP_SPCHBR_10200) {
               if (decState->vPrevPitchLag > (SUBFR_SIZE_GSMAMR + 5)) pit_sharp >>= 2;

            }
        }
        else
        {
           /* read and decode pitch gain */
           index = *pSynthParm++;                 /* index of gain(s) */
           if (irate == IPP_SPCHBR_7950)
           {
              /* decode pitch gain */
              if (bfi != 0)
                 ownConcealGainPitch_GSMAMR(decState->a_LSFBuffer,decState->vPastGainZero, decState->vStateMachine, &gain_pit);
              else
                 gain_pit = TableQuantGainPitch[index];

              ownConcealGainPitchUpdate_GSMAMR(decState->a_LSFBuffer, &decState->vPastGainZero,&decState->vPrevGainZero, bfi, decState->vPrevBadFr,
                                    &gain_pit);
              /* read and decode code gain */
              index = *pSynthParm++;
              if (bfi == 0) {
                 ownDecodeFixedCodebookGain_GSMAMR(decState->a_PastQntEnergy,decState->a_PastQntEnergy_M122, irate, index, code, &gain_code);
              } else {
                 ownConcealCodebookGain_GSMAMR(decState->a_GainBuffer,decState->vPastGainCode, decState->a_PastQntEnergy,
                               decState->a_PastQntEnergy_M122, decState->vStateMachine,
                               &gain_code);
              }
              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
           { /* MR122 */
              if (bfi == 0) {
                 ownDecodeFixedCodebookGain_GSMAMR(decState->a_PastQntEnergy,decState->a_PastQntEnergy_M122, irate, index, code, &gain_code);
              } else {
                 ownConcealCodebookGain_GSMAMR(decState->a_GainBuffer,decState->vPastGainCode, decState->a_PastQntEnergy,
                               decState->a_PastQntEnergy_M122, decState->vStateMachine,&gain_code);
              }
              ownConcealCodebookGainUpdate_GSMAMR(decState->a_GainBuffer,&decState->vPastGainCode,&decState->vPrevGainCode, bfi, decState->vPrevBadFr,
                                   &gain_code);
              pit_sharp = gain_pit;
           }
        }

        /* store pitch sharpening for next subframe          */
        if (irate != IPP_SPCHBR_4750 || evenSubfr == 0) {
            decState->vFlagSharp = gain_pit;
            if (decState->vFlagSharp > PITCH_SHARP_MAX)  decState->vFlagSharp = PITCH_SHARP_MAX;

        }
        pit_sharp = Cnvrt_32s16s(pit_sharp << 1);
        if (pit_sharp > 16384)
        {
           /* Bith are not bit-exact due to other rounding:
              ippsMulC_16s_Sfs(decState->pExcVec,pit_sharp,excp,SUBFR_SIZE_GSMAMR,15);
              ippsMulC_NR_16s_Sfs(decState->pExcVec,pit_sharp,excp,SUBFR_SIZE_GSMAMR,15);
           */
           for (i = 0; i < SUBFR_SIZE_GSMAMR; i++)
               excp[i] = (short)((decState->pExcVec[i] * pit_sharp) >> 15);

           for (i = 0; i < SUBFR_SIZE_GSMAMR; i++)  {
               tmpRes = excp[i] * gain_pit;
               /* */
               if (irate != IPP_SPCHBR_12200) tmpRes = Mul2_32s(tmpRes);
               excp[i] = Cnvrt_NR_32s16s(tmpRes);
            }
        }

        if( bfi == 0 ) {
           ippsCopy_16s(decState->a_LTPGainHistory+1, decState->a_LTPGainHistory, 8);
           decState->a_LTPGainHistory[8] = gain_pit;
        }

        if ( (decState->vPrevBadFr != 0 || bfi != 0) && decState->vBackgroundNoise != 0 &&
             ((irate == IPP_SPCHBR_4750) ||
              (irate == IPP_SPCHBR_5150) ||
              (irate == IPP_SPCHBR_5900))
             )
        {
           if(gain_pit > 12288)                  /* if (gain_pit > 0.75) in Q14*/
              gain_pit = ((gain_pit - 12288) >> 1) + 12288;
                                                 /* gain_pit = (gain_pit-0.75)/2.0 + 0.75; */
           if(gain_pit > 14745) gain_pit = 14745;/* if (gain_pit > 0.90) in Q14*/
        }
        switch(i_subfr){
        case 0:
           ippsInterpolate_GSMAMR_16s(decState->a_PastLSFQnt,prev_lsf,lsf_i,LP_ORDER_SIZE);
           break;
        case SUBFR_SIZE_GSMAMR:
           ippsInterpolate_G729_16s(prev_lsf,decState->a_PastLSFQnt,lsf_i,LP_ORDER_SIZE);
           break;
        case 2*SUBFR_SIZE_GSMAMR:
           ippsInterpolate_GSMAMR_16s(prev_lsf,decState->a_PastLSFQnt,lsf_i,LP_ORDER_SIZE);
           break;
        default: /* 3*SUBFR_SIZE_GSMAMR:*/
           ippsCopy_16s(decState->a_PastLSFQnt,lsf_i,LP_ORDER_SIZE);
        }

        gain_code_mix = ownCBGainAverage_GSMAMR(decState->a_GainHistory,&decState->vHgAverageVar,&decState->vHgAverageCount,
                                                irate, gain_code, lsf_i, decState->a_LSPAveraged, bfi,
                                                decState->vPrevBadFr, pdfi, decState->vPrevDegBadFr,
                                                decState->vBackgroundNoise, decState->vVoiceHangover);
        /* make sure that MR74, MR795, MR122 have original code_gain*/
        if((irate > IPP_SPCHBR_6700) && (irate != IPP_SPCHBR_10200) )  /* MR74, MR795, MR122 */
           gain_code_mix = gain_code;

        /*-------------------------------------------------------*
         * - Find the total excitation.                          *
         * - Find synthesis speech corresponding to decState->pExcVec[].   *
         *-------------------------------------------------------*/
        if (irate <= IPP_SPCHBR_10200)  { /* MR475, MR515, MR59, MR67, MR74, MR795, MR102*/
           pitch_fac = gain_pit;
           tmp_shift = 1;
        } else {      /* MR122 */
           pitch_fac = gain_pit >> 1;
           tmp_shift = 2;
        }

        ippsCopy_16s(decState->pExcVec, exc_enhanced, SUBFR_SIZE_GSMAMR);
        ippsInterpolateC_NR_G729_16s_Sfs(code,gain_code,decState->pExcVec,pitch_fac,
                                         decState->pExcVec,SUBFR_SIZE_GSMAMR,15-tmp_shift);

        if ( ((irate == IPP_SPCHBR_4750) ||
              (irate == IPP_SPCHBR_5150) ||
              (irate == IPP_SPCHBR_5900))&&
             decState->vVoiceHangover > 3     &&
             decState->vBackgroundNoise != 0 &&
             bfi != 0 )
        {
            decState->stPhDispState.vFlagLockGain = 1; /* Always Use full Phase Disp. */
        } else { /* if error in bg noise       */
            decState->stPhDispState.vFlagLockGain = 0;    /* free phase dispersion adaption */
        }
        /* apply phase dispersion to innovation (if enabled) and
           compute total excitation for synthesis part           */
        ownPhaseDispersion_GSMAMR(&decState->stPhDispState, irate, exc_enhanced,
                                  gain_code_mix, gain_pit, code, pitch_fac, tmp_shift);

        ippsDotProd_16s32s_Sfs((const Ipp16s*) exc_enhanced, (const Ipp16s*)exc_enhanced,
            SUBFR_SIZE_GSMAMR, &tmpRes, 0);
        tmpRes = ownSqrt_Exp_GSMAMR(tmpRes, &temp); /* function result */
        tmpRes >>= (temp >> 1) + 17;
        excEnergy = (short)tmpRes;   /* scaling in ownCtrlDetectBackgroundNoise_GSMAMR()     */
        if ( ((irate == IPP_SPCHBR_4750) ||
              (irate == IPP_SPCHBR_5150) ||
              (irate == IPP_SPCHBR_5900))  &&
             decState->vVoiceHangover > 5 &&
             decState->vBackgroundNoise != 0 &&
             decState->vStateMachine < 4 &&
             ( (pdfi != 0 && decState->vPrevDegBadFr != 0) ||
                bfi != 0 ||
                decState->vPrevBadFr != 0) )
        {
           carefulFlag = 0;
           if((pdfi != 0) && (bfi == 0)) carefulFlag = 1;

           ownCtrlDetectBackgroundNoise_GSMAMR(exc_enhanced, excEnergy, decState->a_EnergyHistSubFr,
                                               decState->vVoiceHangover, decState->vPrevBadFr, carefulFlag);
        }
        if((decState->vBackgroundNoise != 0) &&
           ( bfi != 0 || decState->vPrevBadFr != 0 ) &&
           (decState->vStateMachine < 4)) {
           ; /* do nothing! */
        } else {
           /* Update energy history for all rates */
           ippsCopy_16s(decState->a_EnergyHistSubFr+1, decState->a_EnergyHistSubFr, 8);
           decState->a_EnergyHistSubFr[8] = excEnergy;
        }

        if (pit_sharp > 16384) {
           ippsAdd_16s_I(exc_enhanced, excp, SUBFR_SIZE_GSMAMR);
           ownScaleExcitation_GSMAMR(exc_enhanced, excp);
           ippsSynthesisFilter_NR_16s_Sfs(Az,excp,&pSynthSpeech[i_subfr],SUBFR_SIZE_GSMAMR,12,decState->a_MemorySyn);
        } else {
           ippsSynthesisFilter_NR_16s_Sfs(Az,exc_enhanced,&pSynthSpeech[i_subfr],SUBFR_SIZE_GSMAMR,12,decState->a_MemorySyn);
        }
        ippsCopy_16s(&pSynthSpeech[i_subfr+SUBFR_SIZE_GSMAMR-LP_ORDER_SIZE], decState->a_MemorySyn, LP_ORDER_SIZE);
        /*--------------------------------------------------*
         * Update signal for next frame.                    *
         * -> shift to the left by SUBFR_SIZE_GSMAMR  decState->pExcVec[]       *
         *--------------------------------------------------*/
        ippsCopy_16s (&decState->a_ExcVecOld[SUBFR_SIZE_GSMAMR], &decState->a_ExcVecOld[0], (PITCH_MAX_LAG + FLT_INTER_SIZE));
        /* interpolated LPC parameters for next subframe */
        Az += LP1_ORDER_SIZE;
        /* store T0 for next subframe */
        decState->vPrevPitchLag = T0;
    }
    /*-------------------------------------------------------*
     * Call the Source Characteristic Detector which updates *
     * decState->vBackgroundNoise and decState->vVoiceHangover.         *
     *-------------------------------------------------------*/
    decState->vBackgroundNoise = ownSourceChDetectorUpdate_GSMAMR(
                                  decState->a_EnergyHistVector, &(decState->vCountHangover),
                                  &(decState->a_LTPGainHistory[0]), &(pSynthSpeech[0]),
                                  &(decState->vVoiceHangover));

    ippsDecDTXBuffer_GSMAMR_16s(pSynthSpeech, decState->a_PastLSFQnt, &decState->dtxDecoderState.vLogEnergyHistory,
                                decState->dtxDecoderState.a_LSFHistory, decState->dtxDecoderState.a_LogEnergyHistory);
    /* store bfi for next subframe */
    decState->vPrevBadFr = bfi;
    decState->vPrevDegBadFr = pdfi;
    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;
}

⌨️ 快捷键说明

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