📄 encgsmamr.c
字号:
IPP_ALIGNED_ARRAY(16, short, pCodebookSrch, SUBFR_SIZE_GSMAMR);
IPP_ALIGNED_ARRAY(16, short, pFixCodebookExc, SUBFR_SIZE_GSMAMR);
IPP_ALIGNED_ARRAY(16, short, pFltAdaptExc, SUBFR_SIZE_GSMAMR);
IPP_ALIGNED_ARRAY(16, short, pFltFixExc, SUBFR_SIZE_GSMAMR);
IPP_ALIGNED_ARRAY(16, short, pLPCPredRes, SUBFR_SIZE_GSMAMR);
IPP_ALIGNED_ARRAY(16, short, pLPCPredRes2, SUBFR_SIZE_GSMAMR);
IPP_ALIGNED_ARRAY(16, short, pPitchSrchM475, SUBFR_SIZE_GSMAMR);
IPP_ALIGNED_ARRAY(16, short, pFltCodebookM475, SUBFR_SIZE_GSMAMR);
IPP_ALIGNED_ARRAY(16, short, pFixCodebookExcM475, SUBFR_SIZE_GSMAMR);
IPP_ALIGNED_ARRAY(16, short, pImpResM475, SUBFR_SIZE_GSMAMR);
IPP_ALIGNED_ARRAY(16, short, pMemSynSave, LP_ORDER_SIZE);
IPP_ALIGNED_ARRAY(16, short, pMemW0Save, LP_ORDER_SIZE);
IPP_ALIGNED_ARRAY(16, short, pMemErrSave, LP_ORDER_SIZE);
IPP_ALIGNED_ARRAY(16, short, pSrcWgtLpc1, 44);
IPP_ALIGNED_ARRAY(16, short, pSrcWgtLpc2, 44);
IPP_ALIGNED_ARRAY(16, short, pNewLSP1, 2*LP_ORDER_SIZE);
IPP_ALIGNED_ARRAY(16, short, pNewQntLSP1, 2*LP_ORDER_SIZE);
short sharp_save;
short evenSubfr;
short T0_sf0 = 0;
short T0_frac_sf0 = 0;
short i_subfr_sf0 = 0;
short gain_pit_sf0;
short gain_code_sf0;
short i_subfr, subfrNr;
short T_op[2];
short T0, T0_frac;
short gain_pit, gain_code;
IppSpchBitRate irate = mode2rates[rate];
IppSpchBitRate usedRate = irate;
/* Flags */
short lsp_flag = 0;
short gainPitchLimit;
short vad_flag=0;
short compute_sid_flag=0;
const short *g1;
int L_Rmax=0;
int L_R0=0;
{
IPP_ALIGNED_ARRAY(16, int, r_auto, LP1_ORDER_SIZE*2);
if ( IPP_SPCHBR_12200 == irate ) {
ippsAutoCorr_GSMAMR_16s32s(encSt->pWindowPtr_M122, r_auto, irate);
ippsLevinsonDurbin_GSMAMR_32s16s(&r_auto[0], &A_t[LP1_ORDER_SIZE]);
ippsLevinsonDurbin_GSMAMR_32s16s(&r_auto[LP1_ORDER_SIZE], &A_t[LP1_ORDER_SIZE*3]);
} else {
ippsAutoCorr_GSMAMR_16s32s(encSt->pWindowPtr, r_auto, irate);
ippsLevinsonDurbin_GSMAMR_32s16s(r_auto, &A_t[LP1_ORDER_SIZE * 3]);
}
}
*pVad = 1;
if (encSt->vFlagDTX) {
Ipp16s irate = -1;
if (encSt->vFlagDTX == GSMAMREncode_VAD2_Enabled)
ippsVAD2_GSMAMR_16s(encSt->pSpeechPtrNew, (IppGSMAMRVad2State*)encSt->pVAD2St,
&vad_flag, encSt->vFlagLTP);
else
ippsVAD1_GSMAMR_16s(encSt->pSpeechPtr, (IppGSMAMRVad1State*)encSt->pVAD1St,
&vad_flag, encSt->vBestHpCorr, encSt->vFlagTone);
ippsEncDTXHandler_GSMAMR_16s(&encSt->stDTXEncState.vDTXHangoverCt,
&encSt->stDTXEncState.vDecExpireCt,
&irate, &compute_sid_flag, vad_flag);
if(irate == IPP_SPCHBR_DTX) {
usedRate = IPP_SPCHBR_DTX;
*pVad = 0; /* SID frame */
}
}
/* From A(z) to lsp. LSP quantization and interpolation */
{
IPP_ALIGNED_ARRAY(16, short, lsp_new_q, LP_ORDER_SIZE*2);
if( IPP_SPCHBR_12200 == irate) {
IPP_ALIGNED_ARRAY(16, short, lsp, LP_ORDER_SIZE);
ippsLPCToLSP_GSMAMR_16s(&A_t[LP1_ORDER_SIZE], encSt->a_LSP_Old, &(pNewLSP[LP_ORDER_SIZE]));
ippsLPCToLSP_GSMAMR_16s(&A_t[LP1_ORDER_SIZE * 3], &(pNewLSP[LP_ORDER_SIZE]), &(pNewLSP[0]));
ippsInterpolate_G729_16s(&pNewLSP[LP_ORDER_SIZE],encSt->a_LSP_Old,lsp,LP_ORDER_SIZE);
ippsLSPToLPC_GSMAMR_16s(lsp, A_t);
ippsInterpolate_G729_16s(&pNewLSP[LP_ORDER_SIZE],pNewLSP,lsp,LP_ORDER_SIZE);
ippsLSPToLPC_GSMAMR_16s(lsp, &A_t[2*LP1_ORDER_SIZE]);
if ( IPP_SPCHBR_DTX != usedRate) {
ippsCopy_16s(&pNewLSP[LP_ORDER_SIZE], pNewLSP1, LP_ORDER_SIZE);
ippsCopy_16s(pNewLSP, &pNewLSP1[LP_ORDER_SIZE], LP_ORDER_SIZE);
ippsLSPQuant_GSMAMR_16s(pNewLSP1, encSt->a_PastQntPredErr, pNewQntLSP1, pAnaParam, irate);
ippsCopy_16s(&pNewQntLSP1[LP_ORDER_SIZE], lsp_new_q, LP_ORDER_SIZE);
ippsCopy_16s(pNewQntLSP1, &lsp_new_q[LP_ORDER_SIZE], LP_ORDER_SIZE);
ippsInterpolate_G729_16s(&lsp_new_q[LP_ORDER_SIZE],encSt->a_LSPQnt_Old,lsp,LP_ORDER_SIZE);
ippsLSPToLPC_GSMAMR_16s(lsp, Aq_t);
ippsLSPToLPC_GSMAMR_16s(&lsp_new_q[LP_ORDER_SIZE], &Aq_t[LP1_ORDER_SIZE]);
ippsInterpolate_G729_16s(&lsp_new_q[LP_ORDER_SIZE],lsp_new_q,lsp,LP_ORDER_SIZE);
ippsLSPToLPC_GSMAMR_16s(lsp, &Aq_t[2*LP1_ORDER_SIZE]);
ippsLSPToLPC_GSMAMR_16s(lsp_new_q, &Aq_t[3*LP1_ORDER_SIZE]);
pAnaParam += 5;
}
}
else
{
IPP_ALIGNED_ARRAY(16, short, lsp, LP_ORDER_SIZE);
ippsLPCToLSP_GSMAMR_16s(&A_t[LP1_ORDER_SIZE * 3], encSt->a_LSP_Old, pNewLSP);
ippsInterpolate_GSMAMR_16s(pNewLSP,encSt->a_LSP_Old,lsp,LP_ORDER_SIZE);
ippsLSPToLPC_GSMAMR_16s(lsp, A_t);
ippsInterpolate_G729_16s(encSt->a_LSP_Old,pNewLSP,lsp,LP_ORDER_SIZE);
ippsLSPToLPC_GSMAMR_16s(lsp, &A_t[LP1_ORDER_SIZE]);
ippsInterpolate_GSMAMR_16s(encSt->a_LSP_Old,pNewLSP,lsp,LP_ORDER_SIZE);
ippsLSPToLPC_GSMAMR_16s(lsp, &A_t[2*LP1_ORDER_SIZE]);
/* subframe 4 is not processed (available) */
if ( IPP_SPCHBR_DTX != usedRate)
{
ippsLSPQuant_GSMAMR_16s(pNewLSP, encSt->a_PastQntPredErr, lsp_new_q, pAnaParam, irate);
ippsInterpolate_GSMAMR_16s(lsp_new_q,encSt->a_LSPQnt_Old,lsp,LP_ORDER_SIZE);
ippsLSPToLPC_GSMAMR_16s(lsp, Aq_t);
ippsInterpolate_G729_16s(encSt->a_LSPQnt_Old,lsp_new_q,lsp,LP_ORDER_SIZE);
ippsLSPToLPC_GSMAMR_16s(lsp, &Aq_t[LP1_ORDER_SIZE]);
ippsInterpolate_GSMAMR_16s(encSt->a_LSPQnt_Old,lsp_new_q,lsp,LP_ORDER_SIZE);
ippsLSPToLPC_GSMAMR_16s(lsp, &Aq_t[2*LP1_ORDER_SIZE]);
ippsLSPToLPC_GSMAMR_16s(lsp_new_q, &Aq_t[3*LP1_ORDER_SIZE]);
pAnaParam += 3;
}
}
ippsCopy_16s(&(pNewLSP[0]), encSt->a_LSP_Old, LP_ORDER_SIZE);
ippsCopy_16s(&(lsp_new_q[0]), encSt->a_LSPQnt_Old, LP_ORDER_SIZE);
}
ippsEncDTXBuffer_GSMAMR_16s(encSt->pSpeechPtrNew, pNewLSP, &encSt->stDTXEncState.vHistoryPtr,
encSt->stDTXEncState.a_LSPHistory, encSt->stDTXEncState.a_LogEnergyHistory);
if (IPP_SPCHBR_DTX == usedRate)
{
ippsEncDTXSID_GSMAMR_16s(encSt->stDTXEncState.a_LSPHistory, encSt->stDTXEncState.a_LogEnergyHistory,
&encSt->stDTXEncState.vLogEnergyIndex,
&encSt->stDTXEncState.vLSFQntIndex, encSt->stDTXEncState.a_LSPIndex,
encSt->stGainQntSt.a_PastQntEnergy,
encSt->stGainQntSt.a_PastQntEnergy_M122, compute_sid_flag);
*(pAnaParam)++ = encSt->stDTXEncState.vLSFQntIndex;
*(pAnaParam)++ = encSt->stDTXEncState.a_LSPIndex[0];
*(pAnaParam)++ = encSt->stDTXEncState.a_LSPIndex[1];
*(pAnaParam)++ = encSt->stDTXEncState.a_LSPIndex[2];
*(pAnaParam)++ = encSt->stDTXEncState.vLogEnergyIndex;
ippsZero_16s(encSt->a_ExcVecOld, PITCH_MAX_LAG + FLT_INTER_SIZE);
ippsZero_16s(encSt->a_Memory_W0, LP_ORDER_SIZE);
ippsZero_16s(encSt->a_MemoryErr, LP_ORDER_SIZE);
ippsZero_16s(encSt->pZeroVec, SUBFR_SIZE_GSMAMR);
ippsCopy_16s(TableLSPInitData, &encSt->a_LSP_Old[0], LP_ORDER_SIZE);
ippsCopy_16s(encSt->a_LSP_Old, encSt->a_LSPQnt_Old, LP_ORDER_SIZE);
ippsZero_16s(encSt->a_PastQntPredErr,LP_ORDER_SIZE);
ippsCopy_16s(pNewLSP, encSt->a_LSP_Old, LP_ORDER_SIZE);
ippsCopy_16s(pNewLSP, encSt->a_LSPQnt_Old, LP_ORDER_SIZE);
encSt->vTimePrevSubframe = 0;
encSt->vFlagSharp = PITCH_SHARP_MIN;
} else lsp_flag = ownCheckLSPVec_GSMAMR(&encSt->vCount, encSt->a_LSP_Old);
if(irate <= IPP_SPCHBR_7950) g1 = pTableGamma1;
else g1 = pTableGamma1_M122;
ippsMul_NR_16s_Sfs(A_t,g1,pSrcWgtLpc1,4*LP_ORDER_SIZE+4,15); /* four frames at a time*/
ippsMul_NR_16s_Sfs(A_t,pTableGamma2,pSrcWgtLpc2,4*LP_ORDER_SIZE+4,15);
if(encSt->vFlagDTX == GSMAMREncode_DefaultMode) {
ippsOpenLoopPitchSearchNonDTX_GSMAMR_16s(pSrcWgtLpc1,pSrcWgtLpc2,(encSt->pSpeechPtr-LP_ORDER_SIZE),
&encSt->vTimeMedOld,&encSt->vFlagVADState,encSt->a_LTPStateOld,
encSt->a_WeightSpeechVecOld,T_op,encSt->a_GainFlg,irate);
}
else if(encSt->vFlagDTX == GSMAMREncode_VAD1_Enabled){
ippsOpenLoopPitchSearchDTXVAD1_GSMAMR_16s(pSrcWgtLpc1, pSrcWgtLpc2,(encSt->pSpeechPtr-LP_ORDER_SIZE),
&encSt->vFlagTone, &encSt->vTimeMedOld,&encSt->vFlagVADState,encSt->a_LTPStateOld,encSt->a_WeightSpeechVecOld,
&encSt->vBestHpCorr,T_op,encSt->a_GainFlg,irate);
ownVADPitchDetection_GSMAMR((IppGSMAMRVad1State*)encSt->pVAD1St, T_op, &encSt->vLagCountOld, &encSt->vLagOld);
} else if(encSt->vFlagDTX == GSMAMREncode_VAD2_Enabled){
ippsOpenLoopPitchSearchDTXVAD2_GSMAMR_16s32s(pSrcWgtLpc1,
pSrcWgtLpc2,(encSt->pSpeechPtr-LP_ORDER_SIZE),&encSt->vTimeMedOld,&encSt->vFlagVADState,encSt->a_LTPStateOld,encSt->a_WeightSpeechVecOld,
&L_Rmax, &L_R0, T_op,encSt->a_GainFlg,irate);
ownUpdateLTPFlag_GSMAMR(irate, L_Rmax, L_R0, &encSt->vFlagLTP);
}
if (usedRate == IPP_SPCHBR_DTX) {
ippsCopy_16s(&encSt->a_SpeechVecOld[FRAME_SIZE_GSMAMR], &encSt->a_SpeechVecOld[0], (SPEECH_BUF_SIZE - FRAME_SIZE_GSMAMR));
return 0;
}
A = A_t;
Aq = Aq_t;
if (irate == IPP_SPCHBR_12200 || irate == IPP_SPCHBR_10200) g1 = pTableGamma1_M122;
else g1 = pTableGamma1;
evenSubfr = 0;
subfrNr = -1;
for(i_subfr = 0; i_subfr < FRAME_SIZE_GSMAMR; i_subfr += SUBFR_SIZE_GSMAMR) {
subfrNr++;
evenSubfr = 1 - evenSubfr;
if ((evenSubfr != 0) && (usedRate == IPP_SPCHBR_4750)) {
ippsCopy_16s(encSt->a_MemorySyn, pMemSynSave, LP_ORDER_SIZE);
ippsCopy_16s(encSt->a_Memory_W0, pMemW0Save, LP_ORDER_SIZE);
ippsCopy_16s(encSt->a_MemoryErr, pMemErrSave, LP_ORDER_SIZE);
sharp_save = encSt->vFlagSharp;
}
ippsMul_NR_16s_Sfs(A,g1,pSrcWgtLpc1,LP_ORDER_SIZE+1,15);
ippsMul_NR_16s_Sfs(A,pTableGamma2,pSrcWgtLpc2,LP_ORDER_SIZE+1,15);
if (usedRate != IPP_SPCHBR_4750) {
ippsImpulseResponseTarget_GSMAMR_16s(&encSt->pSpeechPtr[i_subfr-LP_ORDER_SIZE],pSrcWgtLpc1,pSrcWgtLpc2,
Aq,encSt->a_MemoryErr,encSt->a_Memory_W0,encSt->pImpResVec, pLPCPredRes, pPitchSrch);
} else { /* MR475 */
ippsImpulseResponseTarget_GSMAMR_16s(&encSt->pSpeechPtr[i_subfr-LP_ORDER_SIZE],pSrcWgtLpc1,pSrcWgtLpc2,
Aq,encSt->a_MemoryErr,pMemW0Save,encSt->pImpResVec, pLPCPredRes, pPitchSrch);
if (evenSubfr != 0)
ippsCopy_16s (encSt->pImpResVec, pImpResM475, SUBFR_SIZE_GSMAMR);
}
ippsCopy_16s(pLPCPredRes, &encSt->pExcVec[i_subfr], SUBFR_SIZE_GSMAMR);
ippsCopy_16s (pLPCPredRes, pLPCPredRes2, SUBFR_SIZE_GSMAMR);
ownCloseLoopFracPitchSearch_GSMAMR(&encSt->vTimePrevSubframe, encSt->a_GainHistory, usedRate, i_subfr,
T_op, encSt->pImpResVec, &encSt->pExcVec[i_subfr], pLPCPredRes2,
pPitchSrch, lsp_flag, pCodebookSrch, pFltAdaptExc, &T0, &T0_frac,
&gain_pit, &pAnaParam, &gainPitchLimit);
if ((subfrNr == 0) && (encSt->a_GainFlg[0] > 0))
encSt->a_LTPStateOld[1] = T0;
if ((subfrNr == 3) && (encSt->a_GainFlg[1] > 0))
encSt->a_LTPStateOld[0] = T0;
if (usedRate == IPP_SPCHBR_12200)
ippsAlgebraicCodebookSearch_GSMAMR_16s(T0, gain_pit,
pCodebookSrch, pLPCPredRes2, encSt->pImpResVec, pFixCodebookExc, pFltFixExc, pAnaParam, subfrNr, IPP_SPCHBR_12200);
else
ippsAlgebraicCodebookSearch_GSMAMR_16s(T0, encSt->vFlagSharp,
pCodebookSrch, pLPCPredRes2, encSt->pImpResVec, pFixCodebookExc, pFltFixExc, pAnaParam, subfrNr, usedRate);
if(usedRate == IPP_SPCHBR_10200) pAnaParam+=7;
else if (usedRate == IPP_SPCHBR_12200) pAnaParam+=10;
else pAnaParam+=2;
ownGainQuant_GSMAMR(&encSt->stGainQntSt, usedRate, pLPCPredRes, &encSt->pExcVec[i_subfr], pFixCodebookExc,
pPitchSrch, pCodebookSrch, pFltAdaptExc, pFltFixExc, evenSubfr, gainPitchLimit,
&gain_pit_sf0, &gain_code_sf0, &gain_pit, &gain_code, &pAnaParam);
ippsCopy_16s(&encSt->a_GainHistory[1], &encSt->a_GainHistory[0], PG_NUM_FRAME-1);
encSt->a_GainHistory[PG_NUM_FRAME-1] = gain_pit >> 3;
if (usedRate != IPP_SPCHBR_4750) {
ownSubframePostProc_GSMAMR(encSt->pSpeechPtr, usedRate, i_subfr, gain_pit,
gain_code, Aq, pSynthVec, pPitchSrch, pFixCodebookExc,
pFltAdaptExc, pFltFixExc, encSt->a_MemorySyn,
encSt->a_MemoryErr, encSt->a_Memory_W0, encSt->pExcVec,
&encSt->vFlagSharp);
} else {
if (evenSubfr != 0) {
i_subfr_sf0 = i_subfr;
ippsCopy_16s(pPitchSrch, pPitchSrchM475, SUBFR_SIZE_GSMAMR);
ippsCopy_16s(pFltFixExc, pFltCodebookM475, SUBFR_SIZE_GSMAMR);
ippsCopy_16s(pFixCodebookExc, pFixCodebookExcM475, SUBFR_SIZE_GSMAMR);
T0_sf0 = T0;
T0_frac_sf0 = T0_frac;
ownSubframePostProc_GSMAMR(encSt->pSpeechPtr, usedRate, i_subfr, gain_pit,
gain_code, Aq, pSynthVec, pPitchSrch, pFixCodebookExc,
pFltAdaptExc, pFltFixExc, pMemSynSave, encSt->a_MemoryErr,
pMemW0Save, encSt->pExcVec, &encSt->vFlagSharp);
encSt->vFlagSharp = sharp_save;
} else {
ippsCopy_16s(pMemErrSave, encSt->a_MemoryErr, LP_ORDER_SIZE);
ownPredExcMode3_6_GSMAMR(&encSt->pExcVec[i_subfr_sf0], T0_sf0, T0_frac_sf0,
SUBFR_SIZE_GSMAMR, 1);
ippsConvPartial_16s_Sfs(&encSt->pExcVec[i_subfr_sf0], pImpResM475, pFltAdaptExc, SUBFR_SIZE_GSMAMR, 12);
Aq -= LP1_ORDER_SIZE;
ownSubframePostProc_GSMAMR(encSt->pSpeechPtr, usedRate, i_subfr_sf0, gain_pit_sf0, gain_code_sf0,
Aq, pSynthVec, pPitchSrchM475, pFixCodebookExcM475, pFltAdaptExc,
pFltCodebookM475, encSt->a_MemorySyn, encSt->a_MemoryErr, encSt->a_Memory_W0,
encSt->pExcVec, &sharp_save);
Aq += LP1_ORDER_SIZE;
ippsImpulseResponseTarget_GSMAMR_16s(&encSt->pSpeechPtr[i_subfr-LP_ORDER_SIZE],pSrcWgtLpc1,pSrcWgtLpc2,
Aq,encSt->a_MemoryErr,encSt->a_Memory_W0,encSt->pImpResVec, pLPCPredRes, pPitchSrch);
ownPredExcMode3_6_GSMAMR(&encSt->pExcVec[i_subfr], T0, T0_frac, SUBFR_SIZE_GSMAMR, 1);
ippsConvPartial_16s_Sfs(&encSt->pExcVec[i_subfr], encSt->pImpResVec, pFltAdaptExc, SUBFR_SIZE_GSMAMR, 12);
ownSubframePostProc_GSMAMR(encSt->pSpeechPtr, usedRate, i_subfr, gain_pit, gain_code, Aq, pSynthVec,
pPitchSrch, pFixCodebookExc, pFltAdaptExc, pFltFixExc, encSt->a_MemorySyn,
encSt->a_MemoryErr, encSt->a_Memory_W0, encSt->pExcVec, &encSt->vFlagSharp);
}
}
A += LP1_ORDER_SIZE;
Aq += LP1_ORDER_SIZE;
}
ippsCopy_16s(&encSt->a_ExcVecOld[FRAME_SIZE_GSMAMR], &encSt->a_ExcVecOld[0], PITCH_MAX_LAG + FLT_INTER_SIZE);
ippsCopy_16s(&encSt->a_SpeechVecOld[FRAME_SIZE_GSMAMR], &encSt->a_SpeechVecOld[0], (SPEECH_BUF_SIZE - FRAME_SIZE_GSMAMR));
return 0;
/* End of ownEncode_GSMAMR() */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -