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

📄 encamrwb.c

📁 audio-video-codecs.rar语音编解码器
💻 C
📖 第 1 页 / 共 4 页
字号:
    if (st->siFrameFirst != 0)
    {
        st->siFrameFirst = 0;
        ippsCopy_16s(pIspQuantvec, st->asiIspQuantOld, LP_ORDER);
    }

    /* Find the interpolated ISPs and convert to pIspQuantvec[] for all subframes */

    {
      IPP_ALIGNED_ARRAY( 16, Ipp16s, isp, LP_ORDER);

      ippsInterpolateC_NR_G729_16s_Sfs(st->asiIspQuantOld, 18022, pIspQuantvec,14746, isp, LP_ORDER, 15);
      ippsISPToLPC_AMRWB_16s(isp, pLPCQuantvec, LP_ORDER);

      ippsInterpolateC_NR_G729_16s_Sfs(st->asiIspQuantOld,  6554, pIspQuantvec,26214, isp, LP_ORDER, 15);
      ippsISPToLPC_AMRWB_16s(isp, &pLPCQuantvec[LP_ORDER + 1], LP_ORDER);

      ippsInterpolateC_NR_G729_16s_Sfs(st->asiIspQuantOld,  1311, pIspQuantvec,31457, isp, LP_ORDER, 15);
      ippsISPToLPC_AMRWB_16s(isp, &pLPCQuantvec[2*(LP_ORDER + 1)], LP_ORDER);

      /* 4th subframe: pIspQuantvec (frac=1.0) */

      ippsISPToLPC_AMRWB_16s(pIspQuantvec, &pLPCQuantvec[3*(LP_ORDER + 1)], LP_ORDER);

      ippsCopy_16s(pIspQuantvec, st->asiIspQuantOld, LP_ORDER);
    }

    pLPCQuant = pLPCQuantvec;
    for (valSubFrame = 0; valSubFrame < FRAME_SIZE; valSubFrame += SUBFRAME_SIZE)
    {
        //ippsResidualFilter_AMRWB_16s_Sfs(pLPCQuant, LP_ORDER, &pSpeech[valSubFrame], &pExc[valSubFrame], SUBFRAME_SIZE,10);
        ippsResidualFilter_Low_16s_Sfs(pLPCQuant, LP_ORDER, &pSpeech[valSubFrame], &pExc[valSubFrame], SUBFRAME_SIZE, 11);
        pLPCQuant += (LP_ORDER + 1);
    }

    /* Buffer isf's and energy for dtx on non-speech frame */

    if (valVadFlag == 0)
    {
        ippsRShiftC_16s(pExc, valQNew, pExc2vec, FRAME_SIZE);
        ippsEncDTXBuffer_AMRWB_16s(pExc2vec, pIsfvec, &st->dtxEncState.siHistPtr,
                  st->dtxEncState.asiIsfHistory, st->dtxEncState.siLogEnerHist, valCodecMode);
    }

    /* Loop for every subframe in the analysis frame */

    pLPCUnQuant = pLPCUnQuantvec;
    pLPCQuant = pLPCQuantvec;

    for (valSubFrame = 0,subFrame=0; valSubFrame < FRAME_SIZE; valSubFrame += SUBFRAME_SIZE, subFrame++)
    {
        ippsSub_16s(st->asiSynthesis, &pSpeech[valSubFrame - LP_ORDER], pErrQuant, LP_ORDER);
        //ippsResidualFilter_AMRWB_16s_Sfs(pLPCQuant, LP_ORDER, &pSpeech[valSubFrame], &pExc[valSubFrame], SUBFRAME_SIZE,10);
        ippsResidualFilter_Low_16s_Sfs(pLPCQuant, LP_ORDER, &pSpeech[valSubFrame], &pExc[valSubFrame], SUBFRAME_SIZE, 11);
        {
           Ipp16s tmpLPCQuant;
           tmpLPCQuant = pLPCQuant[0];
           pLPCQuant[0] >>= 1;
           ippsSynthesisFilter_G729E_16s(pLPCQuant, LP_ORDER,  &pExc[valSubFrame], pErrQuant + LP_ORDER, SUBFRAME_SIZE, pErrQuant);
           pLPCQuant[0] = tmpLPCQuant;
        }

        ippsMulPowerC_NR_16s_Sfs(pLPCUnQuant, WEIGHT_FACTOR, pLPCvec, LP_ORDER+1, 15);
        //ippsResidualFilter_AMRWB_16s_Sfs(pLPCvec, LP_ORDER, pErrQuant + LP_ORDER, pAdptTgtPitch, SUBFRAME_SIZE,10);
        ippsResidualFilter_Low_16s_Sfs(pLPCvec, LP_ORDER, pErrQuant + LP_ORDER, pAdptTgtPitch, SUBFRAME_SIZE, 11);

        ippsDeemphasize_AMRWB_NR_16s_I(TILT_FACTOR, pAdptTgtPitch, SUBFRAME_SIZE, &(st->siSpeechWgt));

        ippsZero_16s(pFixCdbkvec, LP_ORDER);
        ippsCopy_16s(pAdptTgtPitch, pFixCdbkvec + LP_ORDER, SUBFRAME_SIZE / 2);

        tmp = 0;
        ippsPreemphasize_AMRWB_16s_ISfs (TILT_FACTOR, pFixCdbkvec + LP_ORDER, SUBFRAME_SIZE / 2, 13, &tmp);
        ippsMulPowerC_NR_16s_Sfs(pLPCUnQuant, WEIGHT_FACTOR, pLPCvec, LP_ORDER+1, 15);
        {
           Ipp16s tmpLPCVec;
           tmpLPCVec = pLPCvec[0];
           pLPCvec[0] >>= 1;
           ippsSynthesisFilter_G729E_16s_I(pLPCvec, LP_ORDER, pFixCdbkvec + LP_ORDER, SUBFRAME_SIZE / 2, pFixCdbkvec);
           pLPCvec[0] = tmpLPCVec;
        }
        //ippsResidualFilter_AMRWB_16s_Sfs(pLPCQuant, LP_ORDER, pFixCdbkvec + LP_ORDER, pResidvec, SUBFRAME_SIZE / 2,10);
        ippsResidualFilter_Low_16s_Sfs(pLPCQuant, LP_ORDER, pFixCdbkvec + LP_ORDER, pResidvec, SUBFRAME_SIZE/2, 11);

        ippsCopy_16s(&pExc[valSubFrame + (SUBFRAME_SIZE / 2)], pResidvec + (SUBFRAME_SIZE / 2), SUBFRAME_SIZE / 2);

        ippsZero_16s(pErrQuant, LP_ORDER + SUBFRAME_SIZE);
        ippsMulPowerC_NR_16s_Sfs(pLPCUnQuant, WEIGHT_FACTOR, pErrQuant + LP_ORDER, LP_ORDER+1, 15);
        {
           Ipp16s tmpLPCQuant;
           tmpLPCQuant = pLPCQuant[0];
           pLPCQuant[0] = 16384;
           ippsSynthesisFilter_G729E_16s_I(pLPCQuant, LP_ORDER, pErrQuant + LP_ORDER, SUBFRAME_SIZE, pErrQuant);
           pLPCQuant[0] = tmpLPCQuant;
           ippsCopy_16s(pErrQuant + LP_ORDER,pImpRespPitchvec,SUBFRAME_SIZE);
        }
        tmp = 0;
        ippsDeemphasize_AMRWB_NR_16s_I(TILT_FACTOR, pImpRespPitchvec, SUBFRAME_SIZE, &tmp);

        ippsCopy_16s(pImpRespPitchvec, pImpRespCdbkvec, SUBFRAME_SIZE);
        ownScaleSignal_AMRWB_16s_ISfs(pImpRespCdbkvec, SUBFRAME_SIZE, -2);

        ownScaleSignal_AMRWB_16s_ISfs(pAdptTgtPitch, SUBFRAME_SIZE, valShift);
        ownScaleSignal_AMRWB_16s_ISfs(pImpRespPitchvec, SUBFRAME_SIZE, (Ipp16s)(1 + valShift));

        /* find closed loop fractional pitch  lag */
        ippsAdaptiveCodebookSearch_AMRWB_16s(pAdptTgtPitch, pImpRespPitchvec, pOpenLoopLag, &valPitchLag, pPitchLagBounds, &pExc[valSubFrame], &valFracPitchLag,
                                 (Ipp16s*)pPrm, subFrame, irate);
        pPrm += 1;

        /* Gain clipping test to avoid unstable synthesis on frame erasure */
        valClipFlag = ownGpClip(st->asiGainPitchClip);

        if ((irate != IPP_SPCHBR_6600)&&(irate != IPP_SPCHBR_8850))
        {
            ippsConvPartial_NR_Low_16s(&pExc[valSubFrame], pImpRespPitchvec, pFltAdptvec, SUBFRAME_SIZE);
            ippsAdaptiveCodebookGainCoeff_AMRWB_16s(pAdptTgtPitch, pFltAdptvec, pGainCoeff, &valGainCoeff, SUBFRAME_SIZE);
            if ((valClipFlag != 0) && (valGainCoeff > PITCH_GAIN_CLIP))
                valGainCoeff = PITCH_GAIN_CLIP;
            ippsInterpolateC_G729_16s_Sfs(pAdptTgtPitch, 16384, pFltAdptvec,(Ipp16s)(-valGainCoeff), pCorrvec, SUBFRAME_SIZE, 14); /* pCorrvec used temporary */
        } else
        {
            valGainCoeff = 0;
        }

        /* find pitch excitation with lp filter */
        pSrcCoeff[0] = 20972;
        pSrcCoeff[1] = -5898;
        ippsHighPassFilter_Direct_AMRWB_16s(pSrcCoeff, &pExc[valSubFrame], pFixCdbkvec, SUBFRAME_SIZE, 1);

        //ippsConvPartial_NR_Low_16s(pFixCdbkvec, pImpRespPitchvec, pFltAdpt2vec, SUBFRAME_SIZE);
        ippsConvPartial_NR_16s(pFixCdbkvec, pImpRespPitchvec, pFltAdpt2vec, SUBFRAME_SIZE);
        ippsAdaptiveCodebookGainCoeff_AMRWB_16s(pAdptTgtPitch, pFltAdpt2vec, pGainCoeff2, &valAdptGain, SUBFRAME_SIZE);

        if ((valClipFlag != 0) && (valAdptGain > PITCH_GAIN_CLIP))
            valAdptGain = PITCH_GAIN_CLIP;
        ippsInterpolateC_G729_16s_Sfs(pAdptTgtPitch, 16384, pFltAdpt2vec,(Ipp16s)(-valAdptGain), pAdptTgtCdbk, SUBFRAME_SIZE, 14);

        valSelect = 0;
        if ((irate != IPP_SPCHBR_6600)&&(irate != IPP_SPCHBR_8850))
        {
           //Ipp32s valCorrSum, valCdbkSum;
           //ippsDotProd_16s32s_Sfs( pCorrvec, pCorrvec,SUBFRAME_SIZE, &valCorrSum, 0);
           //ippsDotProd_16s32s_Sfs( pAdptTgtCdbk, pAdptTgtCdbk,SUBFRAME_SIZE, &valCdbkSum, 0);
           //if (valCorrSum <= valCdbkSum) valSelect = 1;
           /*^^^^ overflows on new WB+ test sets ^^^^*/
           Ipp32s dwTmp = 0;
           for (i=0; i<SUBFRAME_SIZE; i++)
              dwTmp = Add_32s(dwTmp, (pCorrvec[i]*pCorrvec[i])<<1);
           for (i=0; i<SUBFRAME_SIZE; i++)
              dwTmp = Add_32s(dwTmp, Negate_32s((pAdptTgtCdbk[i]*pAdptTgtCdbk[i])<<1));
           if (dwTmp <= 0)
              valSelect = 1;
           *(pPrm)++ = valSelect;
        }

        if (valSelect == 0)
        {
            /* use the lp filter for pitch excitation prediction */
            valPitchGain = valAdptGain;
            ippsCopy_16s(pFixCdbkvec, &pExc[valSubFrame], SUBFRAME_SIZE);
            ippsCopy_16s(pFltAdpt2vec, pFltAdptvec, SUBFRAME_SIZE);
            ippsCopy_16s(pGainCoeff2, pGainCoeff, 4);
        } else
        {
            /* no filter used for pitch excitation prediction */
            valPitchGain = valGainCoeff;
            ippsCopy_16s(pCorrvec, pAdptTgtCdbk, SUBFRAME_SIZE);
        }

        ippsInterpolateC_G729_16s_Sfs(pResidvec, 16384, &pExc[valSubFrame],(Ipp16s)(-valPitchGain), pResidvec, SUBFRAME_SIZE, 14);
        ownScaleSignal_AMRWB_16s_ISfs(pResidvec, SUBFRAME_SIZE, valShift);

        tmp = 0;
        ippsPreemphasize_AMRWB_16s_ISfs (st->siTiltCode, pImpRespCdbkvec, SUBFRAME_SIZE, 14, &tmp);

        if (valFracPitchLag > 2) valPitchLag += 1;

        if (valPitchLag < SUBFRAME_SIZE) {
            ippsHarmonicFilter_NR_16s(PITCH_SHARP_FACTOR, valPitchLag, &pImpRespCdbkvec[valPitchLag], &pImpRespCdbkvec[valPitchLag], SUBFRAME_SIZE-valPitchLag);
        }

        ippsAlgebraicCodebookSearch_AMRWB_16s(pAdptTgtCdbk, pResidvec, pImpRespCdbkvec, pFixCdbkvec, pFltAdpt2vec, irate, (Ipp16s*)pPrm);

        if (irate == IPP_SPCHBR_6600)
        {
            pPrm += 1;
        } else if ((irate == IPP_SPCHBR_8850) || (irate == IPP_SPCHBR_12650) ||
            (irate == IPP_SPCHBR_14250) || (irate == IPP_SPCHBR_15850))
        {
            pPrm += 4;
        } else
        {
            pPrm += 8;
        }

        tmp = 0;
        ippsPreemphasize_AMRWB_16s_ISfs (st->siTiltCode, pFixCdbkvec, SUBFRAME_SIZE, 14,  &tmp);

        if (valPitchLag < SUBFRAME_SIZE) {
            ippsHarmonicFilter_NR_16s(PITCH_SHARP_FACTOR, valPitchLag, &pFixCdbkvec[valPitchLag], &pFixCdbkvec[valPitchLag], SUBFRAME_SIZE-valPitchLag);
        }

        ippsGainQuant_AMRWB_16s(pAdptTgtPitch, pFltAdptvec, (valQNew + valShift), pFixCdbkvec, pFltAdpt2vec, pGainCoeff,
                  st->asiGainQuant, &valPitchGain, &valCodeGain, valClipFlag, (Ipp16s*)pPrm, SUBFRAME_SIZE, irate);
        pPrm += 1;

        /* test quantized gain of pitch for pitch clipping algorithm */
        ownCheckGpClipPitchGain(valPitchGain, st->asiGainPitchClip);

        z = ShiftL_32s(valCodeGain, valQNew);
        valScaleCodeGain = Cnvrt_NR_32s16s(z);

        /* find voice factor (1=voiced, -1=unvoiced) */

        ippsCopy_16s(&pExc[valSubFrame], pExc2vec, SUBFRAME_SIZE);
        ownScaleSignal_AMRWB_16s_ISfs(pExc2vec, SUBFRAME_SIZE, valShift);

        valVoiceFac = ownVoiceFactor(pExc2vec, valShift, valPitchGain, pFixCdbkvec, valScaleCodeGain, SUBFRAME_SIZE);

        /* tilt of code for next subframe: 0.5=voiced, 0=unvoiced */

        st->siTiltCode = (Ipp16s)((valVoiceFac >> 2) + 8192);

        z = Mul2_32s(valScaleCodeGain * pFltAdpt2vec[SUBFRAME_SIZE - 1]);
        if ((5+valShift) > 0)
           z = ShiftL_32s(z, (Ipp16u)(5 + valShift));
        else
           z >>= -(5+valShift);
        z = Negate_32s(z);
        z = Add_32s(z, Mul2_32s(pAdptTgtPitch[SUBFRAME_SIZE - 1] * 16384));
        z = Add_32s(z, Negate_32s(Mul2_32s(pFltAdptvec[SUBFRAME_SIZE - 1] * valPitchGain)));
        if ((1-valShift) > 0)
           z = ShiftL_32s(z, (Ipp16u)(1-valShift));
        else
           z >>= -(1 - valShift);
        st->siSpeechWgt = Cnvrt_NR_32s16s(z);

        if (irate == IPP_SPCHBR_23850)
            ippsCopy_16s(&pExc[valSubFrame], pExc2vec, SUBFRAME_SIZE);

        ippsInterpolateC_NR_16s(pFixCdbkvec, valScaleCodeGain, 7,
            &pExc[valSubFrame], valPitchGain, 2, &pExc[valSubFrame], SUBFRAME_SIZE);

        {
           Ipp16s tmpLPCQnt;
           tmpLPCQnt = pLPCQuant[0];
           pLPCQuant[0] >>= 1;
           ippsSynthesisFilter_G729E_16s(pLPCQuant, LP_ORDER,  &pExc[valSubFrame], pSynthvec, SUBFRAME_SIZE, st->asiSynthesis);
           ippsCopy_16s(&pSynthvec[SUBFRAME_SIZE-LP_ORDER],st->asiSynthesis,LP_ORDER);
           pLPCQuant[0] = tmpLPCQnt;
        }

        if (irate == IPP_SPCHBR_23850)
        {
            Unpack_32s(valCodeGain, &valScaleCodeGain, &valCodeGainLow);

            /* noise enhancer */
            tmp = (Ipp16s)(16384 - (valVoiceFac >> 1));        /* 1=unvoiced, 0=voiced */
            valFac = Mul_16s_Sfs(valStabFac, tmp, 15);

            z = valCodeGain;

            if (z < st->iNoiseEnhancerThres)
            {
                z += Mpy_32_16(valScaleCodeGain, valCodeGainLow, 6226);
                if (z > st->iNoiseEnhancerThres) z = st->iNoiseEnhancerThres;
            } else
            {
                z = Mpy_32_16(valScaleCodeGain, valCodeGainLow, 27536);
                if (z < st->iNoiseEnhancerThres) z = st->iNoiseEnhancerThres;
            }
            st->iNoiseEnhancerThres = z;

            valCodeGain = Mpy_32_16(valScaleCodeGain, valCodeGainLow, (Ipp16s)(IPP_MAX_16S - valFac));
            Unpack_32s(z, &valScaleCodeGain, &valCodeGainLow);

⌨️ 快捷键说明

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