📄 decg729.c
字号:
qIndex[0] = (Ipp16s)((parm[0] >> FIR_STAGE_BITS) & 1); qIndex[1] = (Ipp16s)(parm[0] & (FIR_STAGE - 1)); qIndex[2] = (Ipp16s)((parm[1] >> SEC_STAGE_BITS) & (SEC_STAGE - 1)); qIndex[3] = (Ipp16s)(parm[1] & (SEC_STAGE - 1)); if(!badFrameIndicator) { decoderObj->prevMA = qIndex[0]; ippsLSFDecode_G729_16s( qIndex, (Ipp16s*)decoderObj->prevLSPfreq, decoderObj->prevSubfrLSPquant); } else { ippsLSFDecodeErased_G729_16s( decoderObj->prevMA, (Ipp16s*)decoderObj->prevLSPfreq, decoderObj->prevSubfrLSPquant); } ippsLSFToLSP_G729_16s(decoderObj->prevSubfrLSPquant, newLSP); /* Convert LSFs to LSPs */ parm += 2; LOCAL_ARRAY_FREE(Ipp16s, 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 */ ippsMove_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 { Ipp16s tmp; decoderObj->interpCoeff2_2 = (Ipp16s)(decoderObj->interpCoeff2_2 - 410); if( decoderObj->interpCoeff2_2 < 0) decoderObj->interpCoeff2_2 = 0; tmp = (Ipp16s)((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) { Ipp32s pitchIndx; pitchIndx = *parm++; badPitch = badFrameIndicator; if(subfrIdx == 0) { if(decoderObj->codecType != G729D_CODEC) badPitch = (Ipp16s)(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 { Ipp16s sTmpPrevFrameDelay, sTmpPrevFrameDelay2; sTmpPrevFrameDelay = decoderObj->prevFrameDelay; sTmpPrevFrameDelay2 = decoderObj->prevFrameDelay2; PitchTracking_G729E(&sTmpPrevFrameDelay, &sTmpPrevFrameDelay2, &decoderObj->prevPitch, &decoderObj->stat_pitch, &decoderObj->pitchStatIntDelay, &decoderObj->pitchStatFracDelay); } statStat = 0; if(decoderObj->codecType == G729_CODEC) { if(badFrameIndicator != 0) { index = (Ipp16s)(Rand_16s(&decoderObj->seedSavage) & (Ipp16s)0x1fff); /* 13 bits random */ pulseSign = (Ipp16s)(Rand_16s(&decoderObj->seedSavage) & (Ipp16s)15); /* 4 bits random */ } else { index = parm[0]; pulseSign = parm[1]; } i = index & 7; idx[0] = (Ipp16s)(5 * i); index = (Ipp16s)(index >> 3); i = index & 7; idx[1] = (Ipp16s)(5 * i + 1); index = (Ipp16s)(index >> 3); i = index & 7; idx[2] = (Ipp16s)(5 * i + 2); index = (Ipp16s)(index >> 3); j = index & 1; index = (Ipp16s)(index >> 1); i = index & 7; idx[3] = (Ipp16s)(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 = (Ipp16s)(pulseSign >> 1); } parm += 2; decoderObj->BWDFrameCounter = 0; } else if(decoderObj->codecType == G729D_CODEC) { Ipp16s sTmpIdx; 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); sTmpIdx = tab3[index & 15]; if((pulseSign & 1) != 0) { ACELPcodeVec[sTmpIdx] += 8191; } else { ACELPcodeVec[sTmpIdx] -= BWF_HARMONIC_E; } index >>= 4; pulseSign >>= 1; sTmpIdx = tab4[index & 31]; if((pulseSign & 1) != 0) { ACELPcodeVec[sTmpIdx] += 8191; } else { ACELPcodeVec[sTmpIdx] -= BWF_HARMONIC_E; } parm += 2; decoderObj->BWDFrameCounter = 0; } else if(decoderObj->codecType == G729E_CODEC) { Ipp16s sIdxCounter, trackVal; Ipp16s pos1, pos2, pos3, sTmpPulseSign; 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 = (Ipp16s)((tmp_parm[0] & 7) * 5); if(((tmp_parm[0]>>3) & 1) == 0) sTmpPulseSign = (1<<12); else sTmpPulseSign = -(1<<12); ACELPcodeVec[pos1] = sTmpPulseSign; pos2 = (Ipp16s)(((tmp_parm[0]>>4) & 7) * 5); if(pos2 > pos1) sTmpPulseSign = (Ipp16s)(-sTmpPulseSign); ACELPcodeVec[pos2] = (Ipp16s)(ACELPcodeVec[pos2] + sTmpPulseSign); pos1 = (Ipp16s)(((tmp_parm[1] & 7) * 5) + 1); if(((tmp_parm[1]>>3) & 1) == 0) sTmpPulseSign = (1<<12); else sTmpPulseSign = -(1<<12); ACELPcodeVec[pos1] = sTmpPulseSign; pos2 = (Ipp16s)((((tmp_parm[1]>>4) & 7) * 5) + 1); if(pos2 > pos1) sTmpPulseSign = (Ipp16s)(-sTmpPulseSign); ACELPcodeVec[pos2] = (Ipp16s)(ACELPcodeVec[pos2] + sTmpPulseSign); pos1 = (Ipp16s)(((tmp_parm[2] & 7) * 5) + 2); if(((tmp_parm[2]>>3) & 1) == 0) sTmpPulseSign = (1<<12); else sTmpPulseSign = -(1<<12); ACELPcodeVec[pos1] = sTmpPulseSign; pos2 = (Ipp16s)((((tmp_parm[2]>>4) & 7) * 5) + 2); if(pos2 > pos1) sTmpPulseSign = (Ipp16s)(-sTmpPulseSign); ACELPcodeVec[pos2] = (Ipp16s)(ACELPcodeVec[pos2] + sTmpPulseSign); pos1 = (Ipp16s)(((tmp_parm[3] & 7) * 5) + 3); if(((tmp_parm[3]>>3) & 1) == 0) sTmpPulseSign = (1<<12); else sTmpPulseSign = -(1<<12); ACELPcodeVec[pos1] = sTmpPulseSign; pos2 = (Ipp16s)((((tmp_parm[3]>>4) & 7) * 5) + 3); if(pos2 > pos1) sTmpPulseSign = (Ipp16s)(-sTmpPulseSign); ACELPcodeVec[pos2] = (Ipp16s)(ACELPcodeVec[pos2] + sTmpPulseSign); pos1 = (Ipp16s)(((tmp_parm[4] & 7) * 5) + 4); if(((tmp_parm[4]>>3) & 1) == 0) sTmpPulseSign = (1<<12); else sTmpPulseSign = -(1<<12); ACELPcodeVec[pos1] = sTmpPulseSign; pos2 = (Ipp16s)((((tmp_parm[4]>>4) & 7) * 5) + 4); if(pos2 > pos1) sTmpPulseSign = (Ipp16s)(-sTmpPulseSign); ACELPcodeVec[pos2] = (Ipp16s)(ACELPcodeVec[pos2] + sTmpPulseSign); decoderObj->BWDFrameCounter = 0; } else { trackVal = (Ipp16s)((tmp_parm[0]>>10) & 7); if(trackVal > 4) trackVal = 4; for(sIdxCounter=0; sIdxCounter<2; sIdxCounter++) { pos1 = (Ipp16s)(((tmp_parm[sIdxCounter] & 7) * 5) + trackVal); if(((tmp_parm[sIdxCounter]>>3) & 1) == 0) sTmpPulseSign = (1<<12); else sTmpPulseSign = -(1<<12); ACELPcodeVec[pos1] = sTmpPulseSign; pos2 = (Ipp16s)((((tmp_parm[sIdxCounter]>>4) & 7) * 5) + trackVal); if(pos2 > pos1) sTmpPulseSign = (Ipp16s)(-sTmpPulseSign); ACELPcodeVec[pos2] = (Ipp16s)(ACELPcodeVec[pos2] + sTmpPulseSign); pos3 = (Ipp16s)((((tmp_parm[sIdxCounter]>>7) & 7) * 5) + trackVal); if(pos3 > pos2) sTmpPulseSign = (Ipp16s)(-sTmpPulseSign); ACELPcodeVec[pos3] = (Ipp16s)(ACELPcodeVec[pos3] + sTmpPulseSign); trackVal++; if(trackVal > 4) trackVal = 0; } for(sIdxCounter=2; sIdxCounter<5; sIdxCounter++) { pos1 = (Ipp16s)(((tmp_parm[sIdxCounter] & 7) * 5) + trackVal); if(((tmp_parm[sIdxCounter]>>3) & 1) == 0) sTmpPulseSign = (1<<12); else sTmpPulseSign = -(1<<12); ACELPcodeVec[pos1] = sTmpPulseSign; pos2 = (Ipp16s)((((tmp_parm[sIdxCounter]>>4) & 7) * 5) + trackVal); if(pos2 > pos1) sTmpPulseSign = (Ipp16s)(-sTmpPulseSign); ACELPcodeVec[pos2] = (Ipp16s)(ACELPcodeVec[pos2] + sTmpPulseSign); trackVal++; if(trackVal > 4) trackVal = 0; } decoderObj->BWDFrameCounter++; if(decoderObj->BWDFrameCounter >= 30) { statStat = 1; decoderObj->BWDFrameCounter = 30; } } parm += 5; } decoderObj->betaPreFilter = (Ipp16s)(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(Ipp16s, gIngx, 2, decoderObj); ippsDotProd_16s32s_Sfs(ACELPcodeVec, ACELPcodeVec, LP_SUBFRAME_DIM, &i, 0); /* ACELPcodeVec energy */ gIngx[0] = (Ipp16s)(pitchIndx >> CDBK2_BIT_NUM) ; gIngx[1] = (Ipp16s)(pitchIndx & (CDBK2_DIM-1)); ippsDecodeGain_G729_16s(i, decoderObj->prevFrameQuantEn, gIngx, decoderObj->gains); LOCAL_ARRAY_FREE(Ipp16s, gIngx, 2, decoderObj); } else { ippsDecodeGain_G729_16s(0, decoderObj->prevFrameQuantEn, NULL, decoderObj->gains); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -