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