?? decgsmamr.c
字號:
GSMAMR_CODECFUN( APIGSMAMR_Status, apiGSMAMRDecoder_Mode, (GSMAMRDecoder_Obj* decoderObj, unsigned int mode))
{
decoderObj->objPrm.mode = mode;
return APIGSMAMR_StsNoErr;
}
static int ownDecode_GSMAMR(sDecoderState_GSMAMR *decState, GSMAMR_Rate_t rate, short *pSynthParm,
enum enDTXStateType newDTXState, RXFrameType frameType, short *pSynthSpeech, short *pA_LP);
/*************************************************************************
* apiGSMAMRDecode()
* Decodes one frame: bitstream -> pcm audio
**************************************************************************/
GSMAMR_CODECFUN( APIGSMAMR_Status, apiGSMAMRDecode,
(GSMAMRDecoder_Obj* decoderObj,const unsigned char* src, GSMAMR_Rate_t rate,
RXFrameType rx_type, short* dst))
{
IPP_ALIGNED_ARRAY(16, short, Az_dec, LP_ALL_FRAME); /* Decoded Az for post-filter */
IPP_ALIGNED_ARRAY(16, short, prm_buf, MAX_NUM_PRM);
short *prm = prm_buf;
IPP_ALIGNED_ARRAY(16, short, tmp_synth, 160);
enum enDTXStateType newDTXState;
if(NULL==decoderObj || NULL==src || NULL ==dst)
return APIGSMAMR_StsBadArgErr;
if(0 >= decoderObj->objPrm.objSize)
return APIGSMAMR_StsNotInitialized;
if(rate > GSMAMR_RATE_DTX || rate < 0)
return APIGSMAMR_StsBadArgErr;
if(DEC_KEY != decoderObj->objPrm.key)
return APIGSMAMR_StsBadCodecType;
decoderObj->rate = rate;
newDTXState = ownRX_DTX_Handler_GSMAMR(decoderObj, rx_type);
/* Synthesis */
if( rx_type == RX_SID_BAD || rx_type == RX_SID_UPDATE) {
ownBits2Prm_GSMAMR(src,prm,GSMAMR_RATE_DTX);
}else{
ownBits2Prm_GSMAMR(src,prm,decoderObj->rate);
}
ownDecode_GSMAMR(&decoderObj->stDecState, decoderObj->rate, prm,
newDTXState, rx_type, (short*)dst, Az_dec);
/* Post-filter */
ippsPostFilter_GSMAMR_16s(Az_dec, (short*)dst, &decoderObj->stPFiltState.vMemPrevRes,
&decoderObj->stPFiltState.vPastGainScale,
decoderObj->stPFiltState.a_SynthBuf,
decoderObj->stPFiltState.a_MemSynPst,
tmp_synth, mode2rates[rate]);
ippsCopy_16s(tmp_synth, (short*)dst, 160);
/* post HP filter, and 15->16 bits */
ippsHighPassFilter_G729_16s_ISfs((short*)dst, FRAME_SIZE_GSMAMR, 13, decoderObj->postProc);
return APIGSMAMR_StsNoErr;
}
/***************************************************************************
* Function: ownDecode_GSMAMR Speech decoder routine.
***************************************************************************/
/*
* decState [in/out] - State variables
* rate [in] - GSMAMR rate
* pSynthParm [in] - Vector of synthesis parameters (length of vector - PRM_SIZE)
* newDTXState [in] - State of DTX
* frameType [in] - Received frame type
* pSynthSpeech [out] - Synthesis speech (length of vector - FRAME_SIZE_GSMAMR)
* pA_LP [out] - Decoded LP filter in 4 subframes (length of vector - LP_ALL_FRAME)
*/
static int ownDecode_GSMAMR(sDecoderState_GSMAMR *decState, GSMAMR_Rate_t rate, short *pSynthParm,
enum enDTXStateType newDTXState, RXFrameType frameType,
short *pSynthSpeech, short *pA_LP)
{
/* LPC coefficients */
short *Az; /* Pointer on pA_LP */
/* LSPs */
IPP_ALIGNED_ARRAY(16, short, LspInter, SUBFR_SIZE_GSMAMR);
/* LSFs */
IPP_ALIGNED_ARRAY(16, short, prev_lsf, LP_ORDER_SIZE);
IPP_ALIGNED_ARRAY(16, short, lsf_i, LP_ORDER_SIZE);
/* Algebraic codevector */
IPP_ALIGNED_ARRAY(16, short, code, SUBFR_SIZE_GSMAMR);
/* excitation */
IPP_ALIGNED_ARRAY(16, short, excp, SUBFR_SIZE_GSMAMR);
IPP_ALIGNED_ARRAY(16, short, exc_enhanced, SUBFR_SIZE_GSMAMR);
/* Scalars */
short i, i_subfr;
short T0, index, index_mr475 = 0;
short gain_pit, gain_code, gain_code_mix, pit_sharp, pitch_fac;
short tmp_shift, temp;
short carefulFlag, excEnergy, subfrNr;
int tmpRes;
short evenSubfr = 0;
short bfi = 0; /* bad frame indication flag */
short pdfi = 0; /* potential degraded bad frame flag */
IPP_ALIGNED_ARRAY(16, short, pDstAdptVector, SUBFR_SIZE_GSMAMR);
sDTXDecoderSt *DTXState = &decState->dtxDecoderState;
IppSpchBitRate irate = mode2rates[rate];
/* find the new DTX state SPEECH OR DTX */
/* function result */
/* DTX actions */
if (newDTXState != SPEECH)
{
ownDecoderInit_GSMAMR(decState,GSMAMR_RATE_DTX);
ownDTXDecoder_GSMAMR(&decState->dtxDecoderState, decState->a_MemorySyn, decState->a_PastQntPredErr,
decState->a_PastLSFQnt, decState->a_PastQntEnergy, decState->a_PastQntEnergy_M122,
&decState->vHgAverageVar, &decState->vHgAverageCount, newDTXState, rate,
pSynthParm, pSynthSpeech, pA_LP);
/* update average lsp */
ippsLSFToLSP_GSMAMR_16s(decState->a_PastLSFQnt, decState->a_LSP_Old);
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;
}
/* SPEECH action state machine */
if((frameType == RX_SPEECH_BAD) || (frameType == RX_NO_DATA) || (frameType == RX_ONSET))
{
bfi = 1;
if((frameType == RX_NO_DATA) || (frameType == RX_ONSET))
ownBuildCNParam_GSMAMR(&decState->vCNGen, TableParamPerModes[rate],TableBitAllModes[rate],pSynthParm);
}
else if(frameType == RX_SPEECH_DEGRADED) pdfi = 1;
if(bfi != 0) decState->vStateMachine++;
else if(decState->vStateMachine == 6) decState->vStateMachine = 5;
else decState->vStateMachine = 0;
if(decState->vStateMachine > 6) decState->vStateMachine = 6;
if(DTXState->eDTXPrevState == DTX) {
decState->vStateMachine = 5;
decState->vPrevBadFr = 0;
} else if (DTXState->eDTXPrevState == DTX_MUTE) {
decState->vStateMachine = 5;
decState->vPrevBadFr = 1;
}
/* save old LSFs for CB gain smoothing */
ippsCopy_16s (decState->a_PastLSFQnt, prev_lsf, LP_ORDER_SIZE);
/* decode LSF and generate interpolated lpc coefficients for the 4 subframes */
ippsQuantLSPDecode_GSMAMR_16s(pSynthParm, decState->a_PastQntPredErr, decState->a_PastLSFQnt,
decState->a_LSP_Old, LspInter, bfi, irate);
ippsLSPToLPC_GSMAMR_16s(&(LspInter[0]), &(pA_LP[0])); /* Subframe 1 */
ippsLSPToLPC_GSMAMR_16s(&(LspInter[LP_ORDER_SIZE]), &(pA_LP[LP1_ORDER_SIZE])); /* Subframe 2 */
ippsLSPToLPC_GSMAMR_16s(&(LspInter[LP_ORDER_SIZE*2]), &(pA_LP[LP1_ORDER_SIZE*2])); /* Subframe 3 */
ippsLSPToLPC_GSMAMR_16s(&(LspInter[LP_ORDER_SIZE*3]), &(pA_LP[LP1_ORDER_SIZE*3])); /* Subframe 4 */
if(irate == IPP_SPCHBR_12200) pSynthParm += 5;
else pSynthParm += 3;
/*------------------------------------------------------------------------*
* Loop for every subframe in the analysis frame *
*------------------------------------------------------------------------*/
Az = pA_LP; /* pointer to interpolated LPC parameters */
evenSubfr = 0;
subfrNr = -1;
for (i_subfr = 0; i_subfr < FRAME_SIZE_GSMAMR; i_subfr += SUBFR_SIZE_GSMAMR)
{
subfrNr++;
evenSubfr = 1 - evenSubfr;
/* pitch index */
index = *pSynthParm++;
ippsAdaptiveCodebookDecode_GSMAMR_16s(
index, &decState->vPrevPitchLag, &decState->vLTPLag, (decState->pExcVec - MAX_OFFSET),
&T0, pDstAdptVector, subfrNr, bfi,
decState->vBackgroundNoise, decState->vVoiceHangover, irate);
if (irate == IPP_SPCHBR_12200)
{ /* MR122 */
index = *pSynthParm++;
if (bfi != 0)
ownConcealGainPitch_GSMAMR(decState->a_LSFBuffer,decState->vPastGainZero, decState->vStateMachine, &gain_pit);
else
gain_pit = (TableQuantGainPitch[index] >> 2) << 2;
ownConcealGainPitchUpdate_GSMAMR(decState->a_LSFBuffer, &decState->vPastGainZero,&decState->vPrevGainZero, bfi,
decState->vPrevBadFr, &gain_pit);
}
ippsFixedCodebookDecode_GSMAMR_16s(pSynthParm, code, subfrNr, irate);
if (irate == IPP_SPCHBR_10200) { /* MR102 */
pSynthParm+=7;
pit_sharp = Cnvrt_32s16s(decState->vFlagSharp << 1);
} else if (irate == IPP_SPCHBR_12200) { /* MR122 */
pSynthParm+=10;
pit_sharp = Cnvrt_32s16s(gain_pit << 1);
} else {
pSynthParm+=2;
pit_sharp = Cnvrt_32s16s(decState->vFlagSharp << 1);
}
if(T0 < SUBFR_SIZE_GSMAMR)
ippsHarmonicFilter_16s_I(pit_sharp,T0,code+T0, (SUBFR_SIZE_GSMAMR - T0));
if (irate == IPP_SPCHBR_4750) {
/* read and decode pitch and code gain */
if(evenSubfr != 0)
index_mr475 = *pSynthParm++; /* index of gain(s) */
if (bfi == 0) {
ownDecodeCodebookGains_GSMAMR(decState->a_PastQntEnergy,decState->a_PastQntEnergy_M122, irate, index_mr475, code,
evenSubfr, &gain_pit, &gain_code);
} else {
ownConcealGainPitch_GSMAMR(decState->a_LSFBuffer,decState->vPastGainZero, decState->vStateMachine, &gain_pit);
ownConcealCodebookGain_GSMAMR(decState->a_GainBuffer,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;
}
else if ((irate <= IPP_SPCHBR_7400) || (irate == IPP_SPCHBR_10200))
{
/* read and decode pitch and code gain */
index = *pSynthParm++; /* index of gain(s) */
if(bfi == 0) {
ownDecodeCodebookGains_GSMAMR(decState->a_PastQntEnergy,decState->a_PastQntEnergy_M122, irate, index, code,
evenSubfr, &gain_pit, &gain_code);
} else {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -