📄 ec_gains.cpp
字号:
st->gbuf[i - 1] = st->gbuf[i]; } st->gbuf[4] = *gain_code; return;}------------------------------------------------------------------------------ RESOURCES USED [optional] When the code is written for a specific target processor the the resources used should be documented below. HEAP MEMORY USED: x bytes STACK MEMORY USED: x bytes CLOCK CYCLES: (cycle count equation for this function) + (variable used to represent cycle count for each subroutine called) where: (cycle count variable) = cycle count for [subroutine name]------------------------------------------------------------------------------ CAUTION [optional] [State any special notes, constraints or cautions for users of this function]------------------------------------------------------------------------------*/void ec_gain_code_update( ec_gain_codeState *st, /* i/o : State struct */ Word16 bfi, /* i : flag: frame is bad */ Word16 prev_bf, /* i : flag: previous frame was bad */ Word16 *gain_code, /* i/o : decoded innovation gain */ Flag *pOverflow){ Word16 i; /* limit gain_code by previous good gain if previous frame was bad */ if (bfi == 0) { if (prev_bf != 0) { if (sub(*gain_code, st->prev_gc, pOverflow) > 0) { *gain_code = st->prev_gc; } } st->prev_gc = *gain_code; } /* update EC states: previous gain, gain buffer */ st->past_gain_code = *gain_code; for (i = 1; i < 5; i++) { st->gbuf[i - 1] = st->gbuf[i]; } st->gbuf[4] = *gain_code; return;}/****************************************************************************//*------------------------------------------------------------------------------ FUNCTION NAME: ec_gain_pitch------------------------------------------------------------------------------ INPUT AND OUTPUT DEFINITIONS Inputs: st = pointer to a pointer to a structure containing code state data of stucture type ec_gain_pitchState state = state of the state machine of type Word16 pOverflow = pointer to overflow indicator of type Flag Outputs: state = pointer to a pointer to a structure containing code state data of stucture type ec_gain_pitchState gain_pitch = pointer to pitch gain (Q14) of type Word16 pOverflow = 1 if there is an overflow else it is zero. Returns: None. Global Variables Used: None. Local Variables Needed: None.------------------------------------------------------------------------------ FUNCTION DESCRIPTION This function conceals the error using code gain implementation in this function.------------------------------------------------------------------------------ REQUIREMENTS None.------------------------------------------------------------------------------ REFERENCES ec_gain.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001------------------------------------------------------------------------------ PSEUDO-CODE static const Word16 pdown[7] = { 32767, 32112, 32112, 26214, 9830, 6553, 6553 }; Word16 tmp; // calculate median of last five gains tmp = gmed_n (st->pbuf, 5); // new gain = minimum(median, past_gain) * pdown[state] if (sub (tmp, st->past_gain_pit) > 0) { tmp = st->past_gain_pit; } *gain_pitch = mult (tmp, pdown[state]);------------------------------------------------------------------------------ RESOURCES USED [optional] When the code is written for a specific target processor the the resources used should be documented below. HEAP MEMORY USED: x bytes STACK MEMORY USED: x bytes CLOCK CYCLES: (cycle count equation for this function) + (variable used to represent cycle count for each subroutine called) where: (cycle count variable) = cycle count for [subroutine name]------------------------------------------------------------------------------ CAUTION [optional] [State any special notes, constraints or cautions for users of this function]------------------------------------------------------------------------------*/void ec_gain_pitch( ec_gain_pitchState *st, /* i/o : state variables */ Word16 state, /* i : state of the state machine */ Word16 *gain_pitch, /* o : pitch gain (Q14) */ Flag *pOverflow){ static const Word16 pdown[7] = { 32767, 32112, 32112, 26214, 9830, 6553, 6553 }; Word16 tmp; /* calculate median of last five gains */ tmp = gmed_n(st->pbuf, 5); /* new gain = minimum(median, past_gain) * pdown[state] */ if (sub(tmp, st->past_gain_pit, pOverflow) > 0) { tmp = st->past_gain_pit; } *gain_pitch = mult(tmp, pdown[state], pOverflow);}/****************************************************************************//*------------------------------------------------------------------------------ FUNCTION NAME: ec_gain_pitch_reset------------------------------------------------------------------------------ INPUT AND OUTPUT DEFINITIONS Inputs: state = state of the state machine of type Word16 pOverflow = pointer to overflow indicator of type Flag Outputs: state = pointer to a pointer to a structure containing code state data of stucture type ec_gain_pitchState pOverflow = 1 if there is an overflow else it is zero. Returns: None. Global Variables Used: None. Local Variables Needed: None.------------------------------------------------------------------------------ FUNCTION DESCRIPTION Function: ec_gain_pitch_reset Purpose: Resets state memory------------------------------------------------------------------------------ REQUIREMENTS None.------------------------------------------------------------------------------ REFERENCES ec_gain.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001------------------------------------------------------------------------------ PSEUDO-CODEint ec_gain_pitch_reset (ec_gain_pitchState *state){ Word16 i; if (state == (ec_gain_pitchState *) NULL){ // fprintf(stderr, "ec_gain_pitch_reset: invalid parameter\n"); return -1; } for(i = 0; i < 5; i++) state->pbuf[i] = 1640; state->past_gain_pit = 0; state->prev_gp = 16384; return 0;}------------------------------------------------------------------------------ RESOURCES USED [optional] When the code is written for a specific target processor the the resources used should be documented below. HEAP MEMORY USED: x bytes STACK MEMORY USED: x bytes CLOCK CYCLES: (cycle count equation for this function) + (variable used to represent cycle count for each subroutine called) where: (cycle count variable) = cycle count for [subroutine name]------------------------------------------------------------------------------ CAUTION [optional] [State any special notes, constraints or cautions for users of this function]------------------------------------------------------------------------------*/Word16 ec_gain_pitch_reset(ec_gain_pitchState *state){ Word16 i; if (state == (ec_gain_pitchState *) NULL) { /* fprintf(stderr, "ec_gain_pitch_reset: invalid parameter\n"); */ return -1; } for (i = 0; i < 5; i++) state->pbuf[i] = 1640; state->past_gain_pit = 0; state->prev_gp = 16384; return 0;}/****************************************************************************//*------------------------------------------------------------------------------ FUNCTION NAME: ec_gain_pitch_update------------------------------------------------------------------------------ INPUT AND OUTPUT DEFINITIONS Inputs: st = pointer to a pointer to a structure containing code state data of stucture type ec_gain_pitchState bfi = flag indicating the frame is bad of type Word16 prev_bf = flag indicating the previous frame was bad of type Word16 gain_pitch = pointer to pitch gain of type Word16 pOverflow = pointer to overflow indicator of type Flag Outputs: state = pointer to a pointer to a structure containing code state data of stucture type ec_gain_pitchState gain_pitch = pointer to pitch gain of type Word16 pOverflow = 1 if there is an overflow else it is zero. Returns: None. Global Variables Used: None. Local Variables Needed: None.------------------------------------------------------------------------------ FUNCTION DESCRIPTION Purpose : update the pitch gain concealment state; limit gain_pitch if the previous frame was bad Call this function always after decoding (or concealing) the gain------------------------------------------------------------------------------ REQUIREMENTS None.------------------------------------------------------------------------------ REFERENCES ec_gain.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001------------------------------------------------------------------------------ PSEUDO-CODE Word16 i; if (bfi == 0) { if (prev_bf != 0) { if (sub (*gain_pitch, st->prev_gp) > 0) { *gain_pitch = st->prev_gp; } } st->prev_gp = *gain_pitch; } st->past_gain_pit = *gain_pitch; if (sub (st->past_gain_pit, 16384) > 0) // if (st->past_gain_pit > 1.0) { st->past_gain_pit = 16384; } for (i = 1; i < 5; i++) { st->pbuf[i - 1] = st->pbuf[i]; } st->pbuf[4] = st->past_gain_pit;------------------------------------------------------------------------------ RESOURCES USED [optional] When the code is written for a specific target processor the the resources used should be documented below. HEAP MEMORY USED: x bytes STACK MEMORY USED: x bytes CLOCK CYCLES: (cycle count equation for this function) + (variable used to represent cycle count for each subroutine called) where: (cycle count variable) = cycle count for [subroutine name]------------------------------------------------------------------------------ CAUTION [optional] [State any special notes, constraints or cautions for users of this function]------------------------------------------------------------------------------*/void ec_gain_pitch_update( ec_gain_pitchState *st, /* i/o : state variables */ Word16 bfi, /* i : flag: frame is bad */ Word16 prev_bf, /* i : flag: previous frame was bad */ Word16 *gain_pitch, /* i/o : pitch gain */ Flag *pOverflow){ Word16 i; if (bfi == 0) { if (prev_bf != 0) { if (sub(*gain_pitch, st->prev_gp, pOverflow) > 0) { *gain_pitch = st->prev_gp; } } st->prev_gp = *gain_pitch; } st->past_gain_pit = *gain_pitch; if (sub(st->past_gain_pit, 16384, pOverflow) > 0) /* if (st->past_gain_pit > 1.0) */ { st->past_gain_pit = 16384; } for (i = 1; i < 5; i++) { st->pbuf[i - 1] = st->pbuf[i]; } st->pbuf[4] = st->past_gain_pit;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -