📄 encg729fp.c
字号:
LOCAL_ALIGN_ARRAY(32, float, CurrLSP, LPC_ORDER,encoderObj);
LOCAL_ALIGN_ARRAY(32, float, tmpLSP, LPC_ORDER,encoderObj);
LOCAL_ALIGN_ARRAY(32, float, CurrQntLSP, LPC_ORDER,encoderObj); /* LSPs at 2th subframe */
LOCAL_ALIGN_ARRAY(32, float, TmpAlignVec, WINDOW_LEN,encoderObj);
/* Other vectors */
LOCAL_ALIGN_ARRAY(32, float, ImpulseResponse, SUBFR_LEN,encoderObj); /* Impulse response*/
LOCAL_ALIGN_ARRAY(32, float, TargetVector, SUBFR_LEN,encoderObj); /* Target vector for pitch search */
LOCAL_ALIGN_ARRAY(32, float, FltTargetVector, SUBFR_LEN,encoderObj); /* Target vector for codebook search */
LOCAL_ALIGN_ARRAY(32, float, FixedCodebookExc, SUBFR_LEN,encoderObj); /* Fixed codebook excitation */
LOCAL_ALIGN_ARRAY(32, float, FltAdaptExc, SUBFR_LEN,encoderObj); /* Filtered adaptive excitation */
LOCAL_ALIGN_ARRAY(32, float, FltFixedCodebookExc, SUBFR_LEN,encoderObj); /* Filtered fixed codebook excitation */
LOCAL_ALIGN_ARRAY(32, float, PitchPredResidual, SUBFR_LEN,encoderObj); /* Pitch prediction residual */
LOCAL_ARRAY(float, forwardReflectCoeff, LPC_ORDER,encoderObj); /* Reflection coefficients : forward analysis */
LOCAL_ARRAY(float, InterpolatedLSF, LPC_ORDER,encoderObj); /* Interpolated LSF 1st subframe. */
LOCAL_ARRAY(float, CurrLSF, LPC_ORDER,encoderObj);
LOCAL_ARRAY(float, CurrFreq, LPC_ORDER,encoderObj);
LOCAL_ARRAY(float, TmpAutoCorr, LPC_ORDERP1,encoderObj);
LOCAL_ARRAY(int, EncodedParams, 19,encoderObj);
LOCAL_ARRAY(float, g_coeff, 5,encoderObj); /* Correlations between TargetVector, FltAdaptExc, & FltFixedCodebookExc:
<FltAdaptExc,FltAdaptExc>, <TargetVector,FltAdaptExc>, <FltFixedCodebookExc,FltFixedCodebookExc>, <TargetVector,FltFixedCodebookExc>,<FltAdaptExc,FltFixedCodebookExc>*/
LOCAL_ARRAY(float, gamma1, 2,encoderObj); /* Weighting factor for the 2 subframes */
LOCAL_ARRAY(float, gamma2, 2,encoderObj);
LOCAL_ARRAY(int, code_lsp, 2,encoderObj);
LOCAL_ARRAY(int, delayLine, 2,encoderObj);
float *SpeechWnd, *pWindow;
float *newSpeech; /* Global variable */
/* Weighted speech vector */
float *WeightedSpeech;
/* Excitation vector */
float *Excitation;
/* Zero vector */
float *pZero;
float *pError;
float *pSynth;
float *pQLPC;
float *pUnQLPC;
float *pLPC, *pQntLPC;
/* Scalars */
int LPCMode; /* LP Backward (1) / Forward (0) Indication mode */
int apLen, aqLen;
int i, j, NGamma, NSbfr;
int openLoopPitch, pitchDelay, minPitchDelay, maxPitchDelay, fracPartPitchDelay;
int index, taming;
float pitchGain, codeGain;
int VADDecision;
/* G.729 ANNEXE variables*/
int isSaturateAZ;
float EnergydB;
int avg_lag;
float tmp_lev;
IppStatus sts;
int *anau;
if(NULL==src || NULL ==dst)
return APIG729_StsBadArgErr;
if ((codecType != G729_CODEC)&&(codecType != G729A_CODEC)&&(codecType != G729D_CODEC)&&(codecType != G729E_CODEC))
return APIG729_StsBadCodecType;
if(encoderObj->objPrm.objSize <= 0)
return APIG729_StsNotInitialized;
if(ENC_KEY != encoderObj->objPrm.key)
return APIG729_StsBadCodecType;
ippsZero_32f(WeightedLPC1,BWD_LPC_ORDERP1);
ippsZero_32f(WeightedLPC2,BWD_LPC_ORDERP1);
anau = &EncodedParams[0];
newSpeech = encoderObj->OldSpeechBuffer + SPEECH_BUFF_LEN - FRM_LEN;
SpeechWnd = newSpeech - LOOK_AHEAD_LEN; /* Present frame */
pWindow = encoderObj->OldSpeechBuffer + SPEECH_BUFF_LEN - WINDOW_LEN; /* For LPC window */
WeightedSpeech = encoderObj->OldWeightedSpeechBuffer + PITCH_LAG_MAX;
Excitation = encoderObj->OldExcitationBuffer + PITCH_LAG_MAX + INTERPOL_LEN;
if(codecType!=G729A_CODEC){
pZero = encoderObj->UnitImpulse + BWD_LPC_ORDERP1;
pError = encoderObj->ErrFltMemory + BWD_LPC_ORDER;
pSynth = encoderObj->SynthBuffer + BWD_SYNTH_MEM;
}
if (encoderObj->sFrameCounter == 32767) encoderObj->sFrameCounter = 256;
else encoderObj->sFrameCounter++;
ippsConvert_16s32f(src,newSpeech,FRM_LEN);
ippsIIR_32f_I(newSpeech,FRM_LEN,encoderObj->iirstate);
#ifdef CLIPPING_DENORMAL_MODE
if((encoderObj->sFrameCounter % 5)==0) {
ippsIIRGetDlyLine_32f(encoderObj->iirstate, TmpAlignVec);
CLIP_DENORMAL_I(TmpAlignVec[0]);
CLIP_DENORMAL_I(TmpAlignVec[1]);
ippsIIRSetDlyLine_32f(encoderObj->iirstate, TmpAlignVec);
}
#endif
ownAutoCorr_G729_32f(pWindow, LPC_ORDERP2, forwardAutoCorr,TmpAlignVec); /* Autocorrelations */
ippsCopy_32f(forwardAutoCorr, TmpAutoCorr, LPC_ORDERP1);
/* Lag windowing */
ippsMul_32f_I(lwindow, &forwardAutoCorr[1], LPC_ORDERP2);
/* Levinson Durbin */
tmp_lev = 0;
sts = ippsLevinsonDurbin_G729_32f(forwardAutoCorr, LPC_ORDER, &forwardLPC[LPC_ORDERP1], forwardReflectCoeff, &tmp_lev);
if(sts == ippStsOverflow) {
ippsCopy_32f(encoderObj->OldForwardLPC,&forwardLPC[LPC_ORDERP1],LPC_ORDER+1);
forwardReflectCoeff[0] = encoderObj->OldForwardRC[0];
forwardReflectCoeff[1] = encoderObj->OldForwardRC[1];
} else {
ippsCopy_32f(&forwardLPC[LPC_ORDERP1],encoderObj->OldForwardLPC,LPC_ORDER+1);
encoderObj->OldForwardRC[0] = forwardReflectCoeff[0];
encoderObj->OldForwardRC[1] = forwardReflectCoeff[1];
}
/* Convert A(z) to lsp */
if(codecType==G729A_CODEC){
ippsLPCToLSP_G729A_32f(&forwardLPC[LPC_ORDERP1], encoderObj->OldLSP, CurrLSP);
} else {
ippsLPCToLSP_G729_32f(&forwardLPC[LPC_ORDERP1], encoderObj->OldLSP, CurrLSP);
}
if (encoderObj->objPrm.mode == G729Encode_VAD_Enabled) {
ownACOS_G729_32f(CurrLSP, CurrLSF, LPC_ORDER);
VoiceActivityDetect_G729_32f(forwardReflectCoeff[1], CurrLSF, forwardAutoCorr, pWindow, encoderObj->sFrameCounter,
encoderObj->prevVADDec, encoderObj->prevPrevVADDec, &VADDecision, &EnergydB,encoderObj->vadMem,TmpAlignVec);
if(codecType!=G729A_CODEC){
MusicDetection_G729E_32f( encoderObj, codecType, forwardAutoCorr[0],forwardReflectCoeff, &VADDecision, EnergydB,encoderObj->msdMem,TmpAlignVec);
}
UpdateCNG(TmpAutoCorr, VADDecision,encoderObj->cngMem);
} else VADDecision = 1;
if(VADDecision == 0) {
if(codecType==G729A_CODEC){
UpdateVad_A(encoderObj, Excitation, WeightedSpeech, SpeechWnd, anau);
} else {
/* Inactive frame */
ippsCopy_32f(&encoderObj->SynthBuffer[FRM_LEN], &encoderObj->SynthBuffer[0], BWD_SYNTH_MEM);
/* Find interpolated LPC parameters in all subframes unquantized. *
* The interpolated parameters are in array forwardLPC of size (LPC_ORDER+1)*4 */
if( encoderObj->prevLPCMode == 0) {
ippsInterpolateC_G729_32f(encoderObj->OldLSP, 0.5f, CurrLSP, 0.5f, tmpLSP, LPC_ORDER);
ippsLSPToLPC_G729_32f(tmpLSP, forwardLPC);
ownACOS_G729_32f(tmpLSP, InterpolatedLSF, LPC_ORDER);
ownACOS_G729_32f(CurrLSP, CurrLSF, LPC_ORDER);
} else {
/* no interpolation */
/* unquantized */
ippsLSPToLPC_G729_32f(CurrLSP, forwardLPC); /* Subframe 1 */
ownACOS_G729_32f(CurrLSP, CurrLSF, LPC_ORDER); /* transformation from LSP to LSF (freq.domain) */
ippsCopy_32f(CurrLSF, InterpolatedLSF, LPC_ORDER); /* Subframe 1 */
}
if (encoderObj->sGlobalStatInd > 10000) {
encoderObj->sGlobalStatInd -= 2621;
if(encoderObj->sGlobalStatInd < 10000) encoderObj->sGlobalStatInd = 10000 ;
}
encoderObj->isBWDDominant = 0;
encoderObj->fInterpolationCoeff = 1.1f;
ippsCopy_32f(CurrLSP, encoderObj->OldLSP, LPC_ORDER);
PWGammaFactor_G729(gamma1, gamma2, InterpolatedLSF, CurrLSF, forwardReflectCoeff,&encoderObj->isSmooth, encoderObj->LogAreaRatioCoeff);
UpdateVad_I(encoderObj, Excitation, forwardLPC, WeightedSpeech, gamma1, gamma2, pSynth,
pError, SpeechWnd, anau, codecType);
/* update previous filter for next frame */
ippsCopy_32f(&forwardQntLPC[LPC_ORDERP1], encoderObj->PrevFlt, LPC_ORDERP1);
for(i=LPC_ORDERP1; i <BWD_LPC_ORDERP1; i++) encoderObj->PrevFlt[i] = 0.f;
}
encoderObj->prevLPCMode = 0;
encoderObj->fBetaPreFilter = PITCH_SHARPMIN;
/* Update memories for next frames */
ippsCopy_32f(&encoderObj->OldSpeechBuffer[FRM_LEN], &encoderObj->OldSpeechBuffer[0], SPEECH_BUFF_LEN-FRM_LEN);
ippsCopy_32f(&encoderObj->OldWeightedSpeechBuffer[FRM_LEN], &encoderObj->OldWeightedSpeechBuffer[0], PITCH_LAG_MAX);
ippsCopy_32f(&encoderObj->OldExcitationBuffer[FRM_LEN], &encoderObj->OldExcitationBuffer[0], PITCH_LAG_MAX+INTERPOL_LEN);
anau = EncodedParams+1;
if(EncodedParams[0] == 0){ /* untransmitted*/
*frametype=0;
}else{
*frametype=1; /* SID*/
dst[0] = (unsigned char)(((anau[0] & 0x1) << 7) | ((anau[1] & 0x1f) << 2) | ((anau[2] & 0xf)>>2)); /* 1+5+2 */
dst[1] = (unsigned char)(((anau[2] & 0x3) << 6) | ((anau[3] & 0x1f) << 1)); /* 2+5+LSB */
}
CLEAR_SCRATCH_MEMORY(encoderObj);
return APIG729_StsNoErr;
}
/* Active frame */
*anau++ = CodecType2Num(codecType)+2; /* bit rate mode */
if(encoderObj->objPrm.mode == G729Encode_VAD_Enabled) {
encoderObj->sCNGSeed = INIT_SEED_VAL;
encoderObj->prevPrevVADDec = encoderObj->prevVADDec;
encoderObj->prevVADDec = VADDecision;
}
/* LSP quantization */
ippsLSPQuant_G729E_32f( CurrLSP, (float*)encoderObj->PrevFreq, CurrFreq, CurrQntLSP, code_lsp);
if( encoderObj->prevLPCMode == 0) {
if(codecType!=G729A_CODEC){
ippsInterpolateC_G729_32f(encoderObj->OldLSP, 0.5f, CurrLSP, 0.5f, tmpLSP, LPC_ORDER);
ippsLSPToLPC_G729_32f(tmpLSP, forwardLPC);
ownACOS_G729_32f(tmpLSP, InterpolatedLSF, LPC_ORDER);
ownACOS_G729_32f(CurrLSP, CurrLSF, LPC_ORDER);
}
ippsInterpolateC_G729_32f(encoderObj->OldQuantLSP, 0.5f, CurrQntLSP, 0.5f, tmpLSP, LPC_ORDER);
ippsLSPToLPC_G729_32f(tmpLSP, forwardQntLPC);
ippsLSPToLPC_G729_32f(CurrQntLSP, &forwardQntLPC[LPC_ORDER+1]);
} else {
/* no interpolation */
/* unquantized */
ippsLSPToLPC_G729_32f(CurrLSP, forwardLPC); /* Subframe 1 */
ownACOS_G729_32f(CurrLSP, CurrLSF, LPC_ORDER); /* transformation from LSP to LSF (freq.domain) */
ippsCopy_32f(CurrLSF, InterpolatedLSF, LPC_ORDER); /* Subframe 1 */
ippsLSPToLPC_G729_32f(CurrQntLSP, &forwardQntLPC[LPC_ORDERP1]); /* Subframe 2 */
ippsCopy_32f(&forwardQntLPC[LPC_ORDERP1], forwardQntLPC, LPC_ORDERP1); /* Subframe 1 */
}
/* Decision for the switch Forward / Backward mode */
if(codecType == G729E_CODEC) {
/* LPC recursive Window as in G728 */
ippsWinHybrid_G729E_32f(encoderObj->SynthBuffer, backwardAutoCorr, encoderObj->pHWState);
/* Lag windowing */
ippsMul_32f_I(lagBwd, &backwardAutoCorr[1], BWD_LPC_ORDER);
if (backwardAutoCorr[0] < 1.0f) backwardAutoCorr[0] = 1.0f;
sts = ippsLevinsonDurbin_G729_32f(backwardAutoCorr, BWD_LPC_ORDER, &backwardLPC[BWD_LPC_ORDERP1], backwardReflectCoeff, &tmp_lev);
if(sts == ippStsOverflow) {
ippsCopy_32f(encoderObj->OldBackwardLPC,&backwardLPC[BWD_LPC_ORDERP1],BWD_LPC_ORDER+1);
backwardReflectCoeff[0] = encoderObj->OldBackwardRC[0];
backwardReflectCoeff[1] = encoderObj->OldBackwardRC[1];
} else {
ippsCopy_32f(&backwardLPC[BWD_LPC_ORDERP1],encoderObj->OldBackwardLPC,BWD_LPC_ORDER+1);
encoderObj->OldBackwardRC[0] = backwardReflectCoeff[0];
encoderObj->OldBackwardRC[1] = backwardReflectCoeff[1];
}
/* Tests saturation of backwardLPC */
isSaturateAZ = 0;
for (i=BWD_LPC_ORDERP1; i<2*BWD_LPC_ORDERP1; i++) if (backwardLPC[i] >= 8.f) {isSaturateAZ = 1;break;}
if (isSaturateAZ == 1) ippsCopy_32f(encoderObj->BackwardLPCMemory, &backwardLPC[BWD_LPC_ORDERP1], BWD_LPC_ORDERP1);
else ippsCopy_32f(&backwardLPC[BWD_LPC_ORDERP1], encoderObj->BackwardLPCMemory, BWD_LPC_ORDERP1);
/* Additional bandwidth expansion on backward filter */
WeightLPCCoeff_G729(&backwardLPC[BWD_LPC_ORDERP1], BWD_GAMMA, BWD_LPC_ORDER, &backwardLPC[BWD_LPC_ORDERP1]);
SetLPCMode_G729FPE(encoderObj,SpeechWnd, forwardQntLPC, backwardLPC, &LPCMode, CurrLSP,TmpAlignVec);
*anau++ = LPCMode;
} else {
if (encoderObj->sGlobalStatInd > 10000) {
encoderObj->sGlobalStatInd -= 2621;
if( encoderObj->sGlobalStatInd < 10000) encoderObj->sGlobalStatInd = 10000 ;
}
LPCMode = 0;
encoderObj->isBWDDominant = 0;
encoderObj->fInterpolationCoeff = 1.1f;
}
/* Update synthesis signal for next frame. */
ippsCopy_32f(&encoderObj->SynthBuffer[FRM_LEN], &encoderObj->SynthBuffer[0], BWD_SYNTH_MEM);
/* Update the LSPs for the next frame */
ippsCopy_32f(CurrLSP, encoderObj->OldLSP, LPC_ORDER);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -