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

📄 encgsmamr.c

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 C
📖 第 1 页 / 共 2 页
字号:
   IPP_ALIGNED_ARRAY(16, short, pCodebookSrch, SUBFR_SIZE_GSMAMR);
   IPP_ALIGNED_ARRAY(16, short, pFixCodebookExc, SUBFR_SIZE_GSMAMR);
   IPP_ALIGNED_ARRAY(16, short, pFltAdaptExc, SUBFR_SIZE_GSMAMR);
   IPP_ALIGNED_ARRAY(16, short, pFltFixExc, SUBFR_SIZE_GSMAMR);
   IPP_ALIGNED_ARRAY(16, short, pLPCPredRes, SUBFR_SIZE_GSMAMR);
   IPP_ALIGNED_ARRAY(16, short, pLPCPredRes2, SUBFR_SIZE_GSMAMR);

   IPP_ALIGNED_ARRAY(16, short, pPitchSrchM475, SUBFR_SIZE_GSMAMR);
   IPP_ALIGNED_ARRAY(16, short, pFltCodebookM475, SUBFR_SIZE_GSMAMR);
   IPP_ALIGNED_ARRAY(16, short, pFixCodebookExcM475, SUBFR_SIZE_GSMAMR);
   IPP_ALIGNED_ARRAY(16, short, pImpResM475, SUBFR_SIZE_GSMAMR);
   IPP_ALIGNED_ARRAY(16, short, pMemSynSave, LP_ORDER_SIZE);
   IPP_ALIGNED_ARRAY(16, short, pMemW0Save, LP_ORDER_SIZE);
   IPP_ALIGNED_ARRAY(16, short, pMemErrSave, LP_ORDER_SIZE);
   IPP_ALIGNED_ARRAY(16, short, pSrcWgtLpc1, 44);
   IPP_ALIGNED_ARRAY(16, short, pSrcWgtLpc2, 44);
   IPP_ALIGNED_ARRAY(16, short, pNewLSP1, 2*LP_ORDER_SIZE);
   IPP_ALIGNED_ARRAY(16, short, pNewQntLSP1, 2*LP_ORDER_SIZE);
   short sharp_save;
   short evenSubfr;
   short T0_sf0 = 0;
   short T0_frac_sf0 = 0;
   short i_subfr_sf0 = 0;
   short gain_pit_sf0;
   short gain_code_sf0;

   short i_subfr, subfrNr;
   short T_op[2];
   short T0, T0_frac;
   short gain_pit, gain_code;
   IppSpchBitRate irate = mode2rates[rate];
   IppSpchBitRate usedRate = irate;

   /* Flags */
   short lsp_flag = 0;
   short gainPitchLimit;
   short vad_flag=0;
   short compute_sid_flag=0;

   const short *g1;
   int L_Rmax=0;
   int L_R0=0;

   {
      IPP_ALIGNED_ARRAY(16, int, r_auto, LP1_ORDER_SIZE*2);
      if ( IPP_SPCHBR_12200 == irate ) {
        ippsAutoCorr_GSMAMR_16s32s(encSt->pWindowPtr_M122, r_auto, irate);
        ippsLevinsonDurbin_GSMAMR_32s16s(&r_auto[0], &A_t[LP1_ORDER_SIZE]);
        ippsLevinsonDurbin_GSMAMR_32s16s(&r_auto[LP1_ORDER_SIZE], &A_t[LP1_ORDER_SIZE*3]);
      } else {
        ippsAutoCorr_GSMAMR_16s32s(encSt->pWindowPtr, r_auto,  irate);
        ippsLevinsonDurbin_GSMAMR_32s16s(r_auto, &A_t[LP1_ORDER_SIZE * 3]);
      }
   }
   *pVad = 1;

   if (encSt->vFlagDTX) {
      Ipp16s irate = -1;

      if (encSt->vFlagDTX == GSMAMREncode_VAD2_Enabled)
         ippsVAD2_GSMAMR_16s(encSt->pSpeechPtrNew, (IppGSMAMRVad2State*)encSt->pVAD2St,
                             &vad_flag, encSt->vFlagLTP);
      else
         ippsVAD1_GSMAMR_16s(encSt->pSpeechPtr, (IppGSMAMRVad1State*)encSt->pVAD1St,
                             &vad_flag, encSt->vBestHpCorr, encSt->vFlagTone);

      ippsEncDTXHandler_GSMAMR_16s(&encSt->stDTXEncState.vDTXHangoverCt,
                                   &encSt->stDTXEncState.vDecExpireCt,
                                   &irate, &compute_sid_flag, vad_flag);
      if(irate == IPP_SPCHBR_DTX) {
         usedRate = IPP_SPCHBR_DTX;
         *pVad = 0;  /* SID frame */
      }
   }

   /* From A(z) to lsp. LSP quantization and interpolation */
   {
      IPP_ALIGNED_ARRAY(16, short, lsp_new_q, LP_ORDER_SIZE*2);

      if( IPP_SPCHBR_12200 == irate) {
         IPP_ALIGNED_ARRAY(16, short, lsp, LP_ORDER_SIZE);

         ippsLPCToLSP_GSMAMR_16s(&A_t[LP1_ORDER_SIZE], encSt->a_LSP_Old, &(pNewLSP[LP_ORDER_SIZE]));
         ippsLPCToLSP_GSMAMR_16s(&A_t[LP1_ORDER_SIZE * 3], &(pNewLSP[LP_ORDER_SIZE]), &(pNewLSP[0]));

         ippsInterpolate_G729_16s(&pNewLSP[LP_ORDER_SIZE],encSt->a_LSP_Old,lsp,LP_ORDER_SIZE);
         ippsLSPToLPC_GSMAMR_16s(lsp, A_t);
         ippsInterpolate_G729_16s(&pNewLSP[LP_ORDER_SIZE],pNewLSP,lsp,LP_ORDER_SIZE);
         ippsLSPToLPC_GSMAMR_16s(lsp, &A_t[2*LP1_ORDER_SIZE]);

         if ( IPP_SPCHBR_DTX != usedRate) {

             ippsCopy_16s(&pNewLSP[LP_ORDER_SIZE], pNewLSP1, LP_ORDER_SIZE);
             ippsCopy_16s(pNewLSP, &pNewLSP1[LP_ORDER_SIZE], LP_ORDER_SIZE);
             ippsLSPQuant_GSMAMR_16s(pNewLSP1, encSt->a_PastQntPredErr, pNewQntLSP1, pAnaParam, irate);
             ippsCopy_16s(&pNewQntLSP1[LP_ORDER_SIZE], lsp_new_q, LP_ORDER_SIZE);
             ippsCopy_16s(pNewQntLSP1, &lsp_new_q[LP_ORDER_SIZE], LP_ORDER_SIZE);

             ippsInterpolate_G729_16s(&lsp_new_q[LP_ORDER_SIZE],encSt->a_LSPQnt_Old,lsp,LP_ORDER_SIZE);
             ippsLSPToLPC_GSMAMR_16s(lsp, Aq_t);
             ippsLSPToLPC_GSMAMR_16s(&lsp_new_q[LP_ORDER_SIZE], &Aq_t[LP1_ORDER_SIZE]);
             ippsInterpolate_G729_16s(&lsp_new_q[LP_ORDER_SIZE],lsp_new_q,lsp,LP_ORDER_SIZE);
             ippsLSPToLPC_GSMAMR_16s(lsp, &Aq_t[2*LP1_ORDER_SIZE]);
             ippsLSPToLPC_GSMAMR_16s(lsp_new_q, &Aq_t[3*LP1_ORDER_SIZE]);
             pAnaParam += 5;
         }
      }
      else
      {
         IPP_ALIGNED_ARRAY(16, short, lsp, LP_ORDER_SIZE);
         ippsLPCToLSP_GSMAMR_16s(&A_t[LP1_ORDER_SIZE * 3], encSt->a_LSP_Old, pNewLSP);

         ippsInterpolate_GSMAMR_16s(pNewLSP,encSt->a_LSP_Old,lsp,LP_ORDER_SIZE);
         ippsLSPToLPC_GSMAMR_16s(lsp, A_t);
         ippsInterpolate_G729_16s(encSt->a_LSP_Old,pNewLSP,lsp,LP_ORDER_SIZE);
         ippsLSPToLPC_GSMAMR_16s(lsp, &A_t[LP1_ORDER_SIZE]);
         ippsInterpolate_GSMAMR_16s(encSt->a_LSP_Old,pNewLSP,lsp,LP_ORDER_SIZE);
         ippsLSPToLPC_GSMAMR_16s(lsp, &A_t[2*LP1_ORDER_SIZE]);
         /*  subframe 4 is not processed (available) */

         if ( IPP_SPCHBR_DTX != usedRate)
         {

             ippsLSPQuant_GSMAMR_16s(pNewLSP, encSt->a_PastQntPredErr, lsp_new_q, pAnaParam, irate);

             ippsInterpolate_GSMAMR_16s(lsp_new_q,encSt->a_LSPQnt_Old,lsp,LP_ORDER_SIZE);
             ippsLSPToLPC_GSMAMR_16s(lsp, Aq_t);
             ippsInterpolate_G729_16s(encSt->a_LSPQnt_Old,lsp_new_q,lsp,LP_ORDER_SIZE);
             ippsLSPToLPC_GSMAMR_16s(lsp, &Aq_t[LP1_ORDER_SIZE]);
             ippsInterpolate_GSMAMR_16s(encSt->a_LSPQnt_Old,lsp_new_q,lsp,LP_ORDER_SIZE);
             ippsLSPToLPC_GSMAMR_16s(lsp, &Aq_t[2*LP1_ORDER_SIZE]);

             ippsLSPToLPC_GSMAMR_16s(lsp_new_q, &Aq_t[3*LP1_ORDER_SIZE]);
             pAnaParam += 3;
         }
      }

      ippsCopy_16s(&(pNewLSP[0]), encSt->a_LSP_Old, LP_ORDER_SIZE);
      ippsCopy_16s(&(lsp_new_q[0]), encSt->a_LSPQnt_Old, LP_ORDER_SIZE);
   }

   ippsEncDTXBuffer_GSMAMR_16s(encSt->pSpeechPtrNew, pNewLSP, &encSt->stDTXEncState.vHistoryPtr,
                               encSt->stDTXEncState.a_LSPHistory, encSt->stDTXEncState.a_LogEnergyHistory);

   if (IPP_SPCHBR_DTX == usedRate)
   {
      ippsEncDTXSID_GSMAMR_16s(encSt->stDTXEncState.a_LSPHistory, encSt->stDTXEncState.a_LogEnergyHistory,
                               &encSt->stDTXEncState.vLogEnergyIndex,
                               &encSt->stDTXEncState.vLSFQntIndex, encSt->stDTXEncState.a_LSPIndex,
                               encSt->stGainQntSt.a_PastQntEnergy,
                               encSt->stGainQntSt.a_PastQntEnergy_M122, compute_sid_flag);
      *(pAnaParam)++ = encSt->stDTXEncState.vLSFQntIndex;
      *(pAnaParam)++ = encSt->stDTXEncState.a_LSPIndex[0];
      *(pAnaParam)++ = encSt->stDTXEncState.a_LSPIndex[1];
      *(pAnaParam)++ = encSt->stDTXEncState.a_LSPIndex[2];
      *(pAnaParam)++ = encSt->stDTXEncState.vLogEnergyIndex;

      ippsZero_16s(encSt->a_ExcVecOld,    PITCH_MAX_LAG + FLT_INTER_SIZE);
      ippsZero_16s(encSt->a_Memory_W0,     LP_ORDER_SIZE);
      ippsZero_16s(encSt->a_MemoryErr,    LP_ORDER_SIZE);
      ippsZero_16s(encSt->pZeroVec,       SUBFR_SIZE_GSMAMR);

      ippsCopy_16s(TableLSPInitData, &encSt->a_LSP_Old[0], LP_ORDER_SIZE);
      ippsCopy_16s(encSt->a_LSP_Old, encSt->a_LSPQnt_Old, LP_ORDER_SIZE);
      ippsZero_16s(encSt->a_PastQntPredErr,LP_ORDER_SIZE);
      ippsCopy_16s(pNewLSP, encSt->a_LSP_Old, LP_ORDER_SIZE);
      ippsCopy_16s(pNewLSP, encSt->a_LSPQnt_Old, LP_ORDER_SIZE);
      encSt->vTimePrevSubframe = 0;
      encSt->vFlagSharp = PITCH_SHARP_MIN;

   } else lsp_flag = ownCheckLSPVec_GSMAMR(&encSt->vCount, encSt->a_LSP_Old);


   if(irate <= IPP_SPCHBR_7950) g1 = pTableGamma1;
   else                         g1 = pTableGamma1_M122;

   ippsMul_NR_16s_Sfs(A_t,g1,pSrcWgtLpc1,4*LP_ORDER_SIZE+4,15); /* four frames at a time*/
   ippsMul_NR_16s_Sfs(A_t,pTableGamma2,pSrcWgtLpc2,4*LP_ORDER_SIZE+4,15);

   if(encSt->vFlagDTX == GSMAMREncode_DefaultMode) {

       ippsOpenLoopPitchSearchNonDTX_GSMAMR_16s(pSrcWgtLpc1,pSrcWgtLpc2,(encSt->pSpeechPtr-LP_ORDER_SIZE),
                                                &encSt->vTimeMedOld,&encSt->vFlagVADState,encSt->a_LTPStateOld,
                                                encSt->a_WeightSpeechVecOld,T_op,encSt->a_GainFlg,irate);
   }
   else if(encSt->vFlagDTX == GSMAMREncode_VAD1_Enabled){

         ippsOpenLoopPitchSearchDTXVAD1_GSMAMR_16s(pSrcWgtLpc1, pSrcWgtLpc2,(encSt->pSpeechPtr-LP_ORDER_SIZE),
             &encSt->vFlagTone, &encSt->vTimeMedOld,&encSt->vFlagVADState,encSt->a_LTPStateOld,encSt->a_WeightSpeechVecOld,
             &encSt->vBestHpCorr,T_op,encSt->a_GainFlg,irate);

         ownVADPitchDetection_GSMAMR((IppGSMAMRVad1State*)encSt->pVAD1St, T_op, &encSt->vLagCountOld, &encSt->vLagOld);
   } else if(encSt->vFlagDTX == GSMAMREncode_VAD2_Enabled){
         ippsOpenLoopPitchSearchDTXVAD2_GSMAMR_16s32s(pSrcWgtLpc1,
         pSrcWgtLpc2,(encSt->pSpeechPtr-LP_ORDER_SIZE),&encSt->vTimeMedOld,&encSt->vFlagVADState,encSt->a_LTPStateOld,encSt->a_WeightSpeechVecOld,
         &L_Rmax, &L_R0, T_op,encSt->a_GainFlg,irate);

         ownUpdateLTPFlag_GSMAMR(irate, L_Rmax, L_R0, &encSt->vFlagLTP);
      }

   if (usedRate == IPP_SPCHBR_DTX)  {
      ippsCopy_16s(&encSt->a_SpeechVecOld[FRAME_SIZE_GSMAMR], &encSt->a_SpeechVecOld[0], (SPEECH_BUF_SIZE - FRAME_SIZE_GSMAMR));
      return 0;
   }

   A = A_t;
   Aq = Aq_t;
   if (irate == IPP_SPCHBR_12200 || irate == IPP_SPCHBR_10200) g1 = pTableGamma1_M122;
   else                                                        g1 = pTableGamma1;

   evenSubfr = 0;
   subfrNr = -1;
   for(i_subfr = 0; i_subfr < FRAME_SIZE_GSMAMR; i_subfr += SUBFR_SIZE_GSMAMR) {
      subfrNr++;
      evenSubfr = 1 - evenSubfr;

      if ((evenSubfr != 0) && (usedRate == IPP_SPCHBR_4750)) {
         ippsCopy_16s(encSt->a_MemorySyn, pMemSynSave, LP_ORDER_SIZE);
         ippsCopy_16s(encSt->a_Memory_W0, pMemW0Save, LP_ORDER_SIZE);
         ippsCopy_16s(encSt->a_MemoryErr, pMemErrSave, LP_ORDER_SIZE);
         sharp_save = encSt->vFlagSharp;
      }

      ippsMul_NR_16s_Sfs(A,g1,pSrcWgtLpc1,LP_ORDER_SIZE+1,15);
      ippsMul_NR_16s_Sfs(A,pTableGamma2,pSrcWgtLpc2,LP_ORDER_SIZE+1,15);

      if (usedRate != IPP_SPCHBR_4750) {
         ippsImpulseResponseTarget_GSMAMR_16s(&encSt->pSpeechPtr[i_subfr-LP_ORDER_SIZE],pSrcWgtLpc1,pSrcWgtLpc2,
            Aq,encSt->a_MemoryErr,encSt->a_Memory_W0,encSt->pImpResVec, pLPCPredRes, pPitchSrch);

      } else { /* MR475 */
         ippsImpulseResponseTarget_GSMAMR_16s(&encSt->pSpeechPtr[i_subfr-LP_ORDER_SIZE],pSrcWgtLpc1,pSrcWgtLpc2,
            Aq,encSt->a_MemoryErr,pMemW0Save,encSt->pImpResVec, pLPCPredRes, pPitchSrch);

         if (evenSubfr != 0)
             ippsCopy_16s (encSt->pImpResVec, pImpResM475, SUBFR_SIZE_GSMAMR);

      }

      ippsCopy_16s(pLPCPredRes, &encSt->pExcVec[i_subfr], SUBFR_SIZE_GSMAMR);
      ippsCopy_16s (pLPCPredRes, pLPCPredRes2, SUBFR_SIZE_GSMAMR);

      ownCloseLoopFracPitchSearch_GSMAMR(&encSt->vTimePrevSubframe, encSt->a_GainHistory, usedRate, i_subfr,
                                         T_op, encSt->pImpResVec, &encSt->pExcVec[i_subfr], pLPCPredRes2,
                                         pPitchSrch, lsp_flag, pCodebookSrch, pFltAdaptExc, &T0, &T0_frac,
                                         &gain_pit, &pAnaParam, &gainPitchLimit);

      if ((subfrNr == 0) && (encSt->a_GainFlg[0] > 0))
         encSt->a_LTPStateOld[1] = T0;
      if ((subfrNr == 3) && (encSt->a_GainFlg[1] > 0))
         encSt->a_LTPStateOld[0] = T0;

      if (usedRate == IPP_SPCHBR_12200)
        ippsAlgebraicCodebookSearch_GSMAMR_16s(T0, gain_pit,
            pCodebookSrch, pLPCPredRes2, encSt->pImpResVec, pFixCodebookExc, pFltFixExc, pAnaParam, subfrNr, IPP_SPCHBR_12200);
      else
        ippsAlgebraicCodebookSearch_GSMAMR_16s(T0, encSt->vFlagSharp,
            pCodebookSrch, pLPCPredRes2, encSt->pImpResVec, pFixCodebookExc, pFltFixExc, pAnaParam, subfrNr, usedRate);

      if(usedRate == IPP_SPCHBR_10200)       pAnaParam+=7;
      else if (usedRate == IPP_SPCHBR_12200) pAnaParam+=10;
      else                                   pAnaParam+=2;

      ownGainQuant_GSMAMR(&encSt->stGainQntSt, usedRate, pLPCPredRes, &encSt->pExcVec[i_subfr], pFixCodebookExc,
                          pPitchSrch, pCodebookSrch,  pFltAdaptExc, pFltFixExc, evenSubfr, gainPitchLimit,
                          &gain_pit_sf0, &gain_code_sf0, &gain_pit, &gain_code, &pAnaParam);

      ippsCopy_16s(&encSt->a_GainHistory[1], &encSt->a_GainHistory[0], PG_NUM_FRAME-1);
      encSt->a_GainHistory[PG_NUM_FRAME-1] = gain_pit >> 3;

      if (usedRate != IPP_SPCHBR_4750)  {
         ownSubframePostProc_GSMAMR(encSt->pSpeechPtr, usedRate, i_subfr, gain_pit,
                                    gain_code, Aq, pSynthVec, pPitchSrch, pFixCodebookExc,
                                    pFltAdaptExc, pFltFixExc, encSt->a_MemorySyn,
                                    encSt->a_MemoryErr, encSt->a_Memory_W0, encSt->pExcVec,
                                    &encSt->vFlagSharp);
      } else {

         if (evenSubfr != 0) {
            i_subfr_sf0 = i_subfr;
            ippsCopy_16s(pPitchSrch, pPitchSrchM475, SUBFR_SIZE_GSMAMR);
            ippsCopy_16s(pFltFixExc, pFltCodebookM475, SUBFR_SIZE_GSMAMR);
            ippsCopy_16s(pFixCodebookExc, pFixCodebookExcM475, SUBFR_SIZE_GSMAMR);
            T0_sf0 = T0;
            T0_frac_sf0 = T0_frac;

            ownSubframePostProc_GSMAMR(encSt->pSpeechPtr, usedRate, i_subfr, gain_pit,
                                       gain_code, Aq, pSynthVec, pPitchSrch, pFixCodebookExc,
                                       pFltAdaptExc, pFltFixExc, pMemSynSave, encSt->a_MemoryErr,
                                       pMemW0Save, encSt->pExcVec, &encSt->vFlagSharp);
            encSt->vFlagSharp = sharp_save;
         } else {

            ippsCopy_16s(pMemErrSave, encSt->a_MemoryErr, LP_ORDER_SIZE);
            ownPredExcMode3_6_GSMAMR(&encSt->pExcVec[i_subfr_sf0], T0_sf0, T0_frac_sf0,
                         SUBFR_SIZE_GSMAMR, 1);

            ippsConvPartial_16s_Sfs(&encSt->pExcVec[i_subfr_sf0], pImpResM475,  pFltAdaptExc, SUBFR_SIZE_GSMAMR, 12);

            Aq -= LP1_ORDER_SIZE;
            ownSubframePostProc_GSMAMR(encSt->pSpeechPtr, usedRate, i_subfr_sf0, gain_pit_sf0, gain_code_sf0,
                                       Aq, pSynthVec, pPitchSrchM475, pFixCodebookExcM475, pFltAdaptExc,
                                       pFltCodebookM475, encSt->a_MemorySyn, encSt->a_MemoryErr, encSt->a_Memory_W0,
                                       encSt->pExcVec, &sharp_save);
            Aq += LP1_ORDER_SIZE;
            ippsImpulseResponseTarget_GSMAMR_16s(&encSt->pSpeechPtr[i_subfr-LP_ORDER_SIZE],pSrcWgtLpc1,pSrcWgtLpc2,
            Aq,encSt->a_MemoryErr,encSt->a_Memory_W0,encSt->pImpResVec, pLPCPredRes, pPitchSrch);

            ownPredExcMode3_6_GSMAMR(&encSt->pExcVec[i_subfr], T0, T0_frac, SUBFR_SIZE_GSMAMR, 1);
            ippsConvPartial_16s_Sfs(&encSt->pExcVec[i_subfr], encSt->pImpResVec,  pFltAdaptExc, SUBFR_SIZE_GSMAMR, 12);

            ownSubframePostProc_GSMAMR(encSt->pSpeechPtr, usedRate, i_subfr, gain_pit, gain_code, Aq, pSynthVec,
                                       pPitchSrch, pFixCodebookExc, pFltAdaptExc, pFltFixExc, encSt->a_MemorySyn,
                                       encSt->a_MemoryErr, encSt->a_Memory_W0, encSt->pExcVec, &encSt->vFlagSharp);
         }
      }

      A += LP1_ORDER_SIZE;
      Aq += LP1_ORDER_SIZE;
   }

   ippsCopy_16s(&encSt->a_ExcVecOld[FRAME_SIZE_GSMAMR], &encSt->a_ExcVecOld[0], PITCH_MAX_LAG + FLT_INTER_SIZE);
   ippsCopy_16s(&encSt->a_SpeechVecOld[FRAME_SIZE_GSMAMR], &encSt->a_SpeechVecOld[0], (SPEECH_BUF_SIZE - FRAME_SIZE_GSMAMR));

   return 0;
   /* End of ownEncode_GSMAMR() */
}

⌨️ 快捷键说明

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