📄 decg729.c
字号:
if(!badFrameIndicator) {
decoderObj->prevMA = qIndex[0];
ippsLSFDecode_G729_16s( qIndex, (short*)decoderObj->prevLSPfreq, decoderObj->prevSubfrLSPquant);
} else {
ippsLSFDecodeErased_G729_16s( decoderObj->prevMA,
(short*)decoderObj->prevLSPfreq, decoderObj->prevSubfrLSPquant);
}
ippsLSFToLSP_G729_16s(decoderObj->prevSubfrLSPquant, newLSP); /* Convert LSFs to LSPs */
parm += 2;
LOCAL_ARRAY_FREE(short, qIndex,4,decoderObj);
if( decoderObj->prevLPmode == 0) {
ippsInterpolate_G729_16s(newLSP,prevSubfrLSP,prevSubfrLSP, LPF_DIM );
ippsLSPToLPC_G729_16s(prevSubfrLSP, FWDfiltLPC); /* 1-st subframe */
ippsLSPToLPC_G729_16s(newLSP, &FWDfiltLPC[LPF_DIM+1]); /* 2-nd subframe */
} else {
ippsLSPToLPC_G729_16s(newLSP, FWDfiltLPC); /* 1-st subframe */
ippsCopy_16s(FWDfiltLPC, &FWDfiltLPC[LPF_DIM+1], LPF_DIM+1);/* 2-nd subframe */
}
/* update the next frame LSFs*/
ippsCopy_16s(newLSP, prevSubfrLSP, LPF_DIM );
decoderObj->interpCoeff2_2 = 4506;
mAq = LPF_DIM;
pA = FWDfiltLPC;
ippsCopy_16s(&FWDfiltLPC[LPF_DIM+1], decoderObj->pPrevFilt, LPF_DIM+1);
ippsZero_16s(&decoderObj->pPrevFilt[LPF_DIM+1], (BWLPCF1_DIM-LPF_DIM-1));
} else {
short tmp;
decoderObj->interpCoeff2_2 = decoderObj->interpCoeff2_2 - 410;
if( decoderObj->interpCoeff2_2 < 0) decoderObj->interpCoeff2_2 = 0;
tmp = (1<<12) - decoderObj->interpCoeff2_2;
ippsInterpolateC_G729_16s_Sfs(BWDfiltLPC + BWLPCF1_DIM, tmp,
decoderObj->pPrevFilt, decoderObj->interpCoeff2_2, BWDfiltLPC + BWLPCF1_DIM, BWLPCF1_DIM, 12);
ippsInterpolate_G729_16s
(BWDfiltLPC + BWLPCF1_DIM, decoderObj->pPrevFilt, BWDfiltLPC, BWLPCF1_DIM);
mAq = BWLPCF_DIM;
pA = BWDfiltLPC;
ippsCopy_16s(&BWDfiltLPC[BWLPCF1_DIM], decoderObj->pPrevFilt, BWLPCF1_DIM);
}
for(ppAz=pA,subfrIdx = 0; subfrIdx < LP_FRAME_DIM; subfrIdx += LP_SUBFRAME_DIM) {
int pitchIndx;
pitchIndx = *parm++;
badPitch = badFrameIndicator;
if(subfrIdx == 0) {
if(decoderObj->codecType != G729D_CODEC)
badPitch = badFrameIndicator + *parm++;
}
DecodeAdaptCodebookDelays(&decoderObj->prevFrameDelay,&decoderObj->prevFrameDelay2,delayVal,subfrIdx,badPitch,pitchIndx,decoderObj->codecType);
if(subfrIdx == 0)
prevFrameDelay1 = delayVal[0]; /* if first frame */
ippsDecodeAdaptiveVector_G729_16s_I(delayVal,&prevExcitat[subfrIdx]);
/* pitch tracking */
if( decoderObj->codecType == G729E_CODEC) {
PitchTracking_G729E(&decoderObj->prevFrameDelay, &decoderObj->prevFrameDelay2, &decoderObj->prevPitch, &decoderObj->stat_pitch,
&decoderObj->pitchStatIntDelay, &decoderObj->pitchStatFracDelay);
} else {
short i, j;
i = decoderObj->prevFrameDelay;
j = decoderObj->prevFrameDelay2;
PitchTracking_G729E(&i, &j, &decoderObj->prevPitch, &decoderObj->stat_pitch,
&decoderObj->pitchStatIntDelay, &decoderObj->pitchStatFracDelay);
}
statStat = 0;
if(decoderObj->codecType == G729_CODEC) {
if(badFrameIndicator != 0) {
index = Rand_16s(&decoderObj->seedSavage) & (short)0x1fff; /* 13 bits random */
pulseSign = Rand_16s(&decoderObj->seedSavage) & (short)15; /* 4 bits random */
} else {
index = parm[0];
pulseSign = parm[1];
}
i = index & 7;
idx[0] = 5 * i;
index = index >> 3;
i = index & 7;
idx[1] = 5 * i + 1;
index = index >> 3;
i = index & 7;
idx[2] = 5 * i + 2;
index = index >> 3;
j = index & 1;
index = index >> 1;
i = index & 7;
idx[3] = i * 5 + 3 + j;
/* decode the signs & build the codeword */
ippsZero_16s(ACELPcodeVec,LP_SUBFRAME_DIM);
for(j=0; j<4; j++) {
if((pulseSign & 1) != 0) {
ACELPcodeVec[idx[j]] = 8191;
} else {
ACELPcodeVec[idx[j]] = -BWF_HARMONIC_E;
}
pulseSign = pulseSign >> 1;
}
parm += 2;
decoderObj->BWDFrameCounter = 0;
} else if(decoderObj->codecType == G729D_CODEC) {
short idx;
if(badFrameIndicator != 0) {
index = Rand_16s(&decoderObj->seedSavage);
pulseSign = Rand_16s(&decoderObj->seedSavage);
} else {
index = parm[0];
pulseSign = parm[1];
}
ippsZero_16s(ACELPcodeVec,LP_SUBFRAME_DIM);
idx = tab3[index & 15];
if((pulseSign & 1) != 0) {
ACELPcodeVec[idx] += 8191;
} else {
ACELPcodeVec[idx] -= BWF_HARMONIC_E;
}
index >>= 4;
pulseSign >>= 1;
idx = tab4[index & 31];
if((pulseSign & 1) != 0) {
ACELPcodeVec[idx] += 8191;
} else {
ACELPcodeVec[idx] -= BWF_HARMONIC_E;
}
parm += 2;
decoderObj->BWDFrameCounter = 0;
} else if(decoderObj->codecType == G729E_CODEC) {
short j, trackVal;
short pos1, pos2, pos3, pulseSign;
ippsZero_16s(ACELPcodeVec,LP_SUBFRAME_DIM);
if(badFrameIndicator != 0) {
tmp_parm[0] = Rand_16s(&decoderObj->seedSavage);
tmp_parm[1] = Rand_16s(&decoderObj->seedSavage);
tmp_parm[2] = Rand_16s(&decoderObj->seedSavage);
tmp_parm[3] = Rand_16s(&decoderObj->seedSavage);
tmp_parm[4] = Rand_16s(&decoderObj->seedSavage);
} else {
ippsCopy_16s(parm, tmp_parm, 5);
}
if(LPmode == 0) {
pos1 = ((tmp_parm[0] & 7) * 5);
if(((tmp_parm[0]>>3) & 1) == 0)
pulseSign = (1<<12);
else pulseSign = -(1<<12);
ACELPcodeVec[pos1] = pulseSign;
pos2 = (((tmp_parm[0]>>4) & 7) * 5);
if(pos2 > pos1)
pulseSign = -pulseSign;
ACELPcodeVec[pos2] += pulseSign;
pos1 = ((tmp_parm[1] & 7) * 5) + 1;
if(((tmp_parm[1]>>3) & 1) == 0)
pulseSign = (1<<12);
else
pulseSign = -(1<<12);
ACELPcodeVec[pos1] = pulseSign;
pos2 = (((tmp_parm[1]>>4) & 7) * 5) + 1;
if(pos2 > pos1)
pulseSign = -pulseSign;
ACELPcodeVec[pos2] += pulseSign;
pos1 = ((tmp_parm[2] & 7) * 5) + 2;
if(((tmp_parm[2]>>3) & 1) == 0)
pulseSign = (1<<12);
else
pulseSign = -(1<<12);
ACELPcodeVec[pos1] = pulseSign;
pos2 = (((tmp_parm[2]>>4) & 7) * 5) + 2;
if(pos2 > pos1)
pulseSign = -pulseSign;
ACELPcodeVec[pos2] += pulseSign;
pos1 = ((tmp_parm[3] & 7) * 5) + 3;
if(((tmp_parm[3]>>3) & 1) == 0)
pulseSign = (1<<12);
else
pulseSign = -(1<<12);
ACELPcodeVec[pos1] = pulseSign;
pos2 = (((tmp_parm[3]>>4) & 7) * 5) + 3;
if(pos2 > pos1)
pulseSign = -pulseSign;
ACELPcodeVec[pos2] += pulseSign;
pos1 = ((tmp_parm[4] & 7) * 5) + 4;
if(((tmp_parm[4]>>3) & 1) == 0)
pulseSign = (1<<12);
else pulseSign = -(1<<12);
ACELPcodeVec[pos1] = pulseSign;
pos2 = (((tmp_parm[4]>>4) & 7) * 5) + 4;
if(pos2 > pos1) pulseSign = -pulseSign;
ACELPcodeVec[pos2] += pulseSign;
decoderObj->BWDFrameCounter = 0;
} else {
trackVal = (tmp_parm[0]>>10) & 7;
if(trackVal > 4)
trackVal = 4;
for(j=0; j<2; j++) {
pos1 = ((tmp_parm[j] & 7) * 5) + trackVal;
if(((tmp_parm[j]>>3) & 1) == 0)
pulseSign = (1<<12);
else
pulseSign = -(1<<12);
ACELPcodeVec[pos1] = pulseSign;
pos2 = (((tmp_parm[j]>>4) & 7) * 5) + trackVal;
if(pos2 > pos1)
pulseSign = -pulseSign;
ACELPcodeVec[pos2] += pulseSign;
pos3 = (((tmp_parm[j]>>7) & 7) * 5) + trackVal;
if(pos3 > pos2)
pulseSign = -pulseSign;
ACELPcodeVec[pos3] += pulseSign;
trackVal++;
if(trackVal > 4)
trackVal = 0;
}
for(j=2; j<5; j++) {
pos1 = ((tmp_parm[j] & 7) * 5) + trackVal;
if(((tmp_parm[j]>>3) & 1) == 0)
pulseSign = (1<<12);
else
pulseSign = -(1<<12);
ACELPcodeVec[pos1] = pulseSign;
pos2 = (((tmp_parm[j]>>4) & 7) * 5) + trackVal;
if(pos2 > pos1)
pulseSign = -pulseSign;
ACELPcodeVec[pos2] += pulseSign;
trackVal++;
if(trackVal > 4)
trackVal = 0;
}
decoderObj->BWDFrameCounter++;
if(decoderObj->BWDFrameCounter >= 30) {
statStat = 1;
decoderObj->BWDFrameCounter = 30;
}
}
parm += 5;
}
decoderObj->betaPreFilter = decoderObj->betaPreFilter << 1;
if(delayVal[0] < LP_SUBFRAME_DIM) {
ippsHarmonicFilter_16s_I(decoderObj->betaPreFilter,delayVal[0],&ACELPcodeVec[delayVal[0]],LP_SUBFRAME_DIM-delayVal[0]);
}
pitchIndx = *parm++;
if(decoderObj->codecType == G729_CODEC) {
if(!badFrameIndicator) {
LOCAL_ARRAY(short, gIngx, 2, decoderObj);
ippsDotProd_16s32s_Sfs(ACELPcodeVec, ACELPcodeVec, LP_SUBFRAME_DIM, &i, 0); /* ACELPcodeVec energy */
gIngx[0] = (short)(pitchIndx >> CDBK2_BIT_NUM) ;
gIngx[1] = (short)(pitchIndx & (CDBK2_DIM-1));
ippsDecodeGain_G729_16s(i, decoderObj->prevFrameQuantEn, gIngx, decoderObj->gains);
LOCAL_ARRAY_FREE(short, gIngx, 2, decoderObj);
} else {
ippsDecodeGain_G729_16s(0, decoderObj->prevFrameQuantEn, NULL, decoderObj->gains);
}
} else {
int energy;
ippsDotProd_16s32s_Sfs(ACELPcodeVec, ACELPcodeVec, LP_SUBFRAME_DIM, &energy, 0); /* ACELPcodeVec energy */
if(decoderObj->codecType == G729D_CODEC) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -