📄 encamrwb.c
字号:
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 + -