📄 pre_proc.cpp
字号:
------------------------------------------------------------------------------ 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 Pre_Process_reset(Pre_ProcessState *state){ if (state == (Pre_ProcessState *) NULL) { /* fprintf(stderr, "Pre_Process_reset: invalid parameter\n"); */ return(-1); } state->y2_hi = 0; state->y2_lo = 0; state->y1_hi = 0; state->y1_lo = 0; state->x0 = 0; state->x1 = 0; return(0);}/****************************************************************************//*------------------------------------------------------------------------------ FUNCTION NAME: Pre_Process_exit------------------------------------------------------------------------------ INPUT AND OUTPUT DEFINITIONS Inputs: state = a pointer to an array of pointers to structures of type Pre_ProcessState Outputs: state points to a NULL address Returns: None. Global Variables Used: None. Local Variables Needed: None.------------------------------------------------------------------------------ FUNCTION DESCRIPTION The memory used for state memory is freed.------------------------------------------------------------------------------ REQUIREMENTS None.------------------------------------------------------------------------------ REFERENCES pre_proc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001------------------------------------------------------------------------------ PSEUDO-CODEvoid Pre_Process_exit (Pre_ProcessState **state){ if (state == NULL || *state == NULL) return; // deallocate memory free(*state); *state = NULL; 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 Pre_Process_exit(Pre_ProcessState **state){ if (state == NULL || *state == NULL) { return; } /* deallocate memory */ oscl_free(*state); *state = NULL; return;}/****************************************************************************//*------------------------------------------------------------------------------ FUNCTION NAME: Pre_Process------------------------------------------------------------------------------ INPUT AND OUTPUT DEFINITIONS Inputs: st = a pointer to a structure of type Pre_ProcessState signal = input/output signal (Word16) lg = length of signal (Word16) Outputs: st points to the updated structure Returns: return_value = 0 (int) Global Variables Used: a = points to a buffer of filter coefficients b = points to a buffer of filter coefficients Local Variables Needed: None.------------------------------------------------------------------------------ FUNCTION DESCRIPTION This module performs the preprocessing of the input speech. The signal is passed through a 2nd order high pass filtering with cut off frequency at 80 Hz. The input is divided by two in the filtering process. y[i] = b[0]*x[i]/2 + b[1]*x[i-1]/2 + b[2]*x[i-2]/2 + a[1]*y[i-1] + a[2]*y[i-2];------------------------------------------------------------------------------ REQUIREMENTS None.------------------------------------------------------------------------------ REFERENCES pre_proc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001------------------------------------------------------------------------------ PSEUDO-CODEint Pre_Process ( Pre_ProcessState *st, Word16 signal[], // input/output signal Word16 lg) // lenght of signal{ Word16 i, x2; Word32 L_tmp; for (i = 0; i < lg; i++) { x2 = st->x1; st->x1 = st->x0; st->x0 = signal[i]; // y[i] = b[0]*x[i]/2 + b[1]*x[i-1]/2 + b140[2]*x[i-2]/2 // + a[1]*y[i-1] + a[2] * y[i-2]; L_tmp = Mpy_32_16 (st->y1_hi, st->y1_lo, a[1]); L_tmp = L_add (L_tmp, Mpy_32_16 (st->y2_hi, st->y2_lo, a[2])); L_tmp = L_mac (L_tmp, st->x0, b[0]); L_tmp = L_mac (L_tmp, st->x1, b[1]); L_tmp = L_mac (L_tmp, x2, b[2]); L_tmp = L_shl (L_tmp, 3); signal[i] = pv_round (L_tmp); st->y2_hi = st->y1_hi; st->y2_lo = st->y1_lo; L_Extract (L_tmp, &st->y1_hi, &st->y1_lo); } 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]------------------------------------------------------------------------------*//* filter coefficients (fc = 80 Hz, coeff. b[] is divided by 2) const Word16 b[3] = {1899, -3798, 1899}; const Word16 a[3] = {4096, 7807, -3733};*/void Pre_Process( Pre_ProcessState *st, Word16 signal[], /* input/output signal */ Word16 lg) /* length of signal */{ register Word16 i; Word16 x_n_2; Word16 x_n_1; Word32 L_tmp; Word16 *p_signal = signal; x_n_2 = st->x1; x_n_1 = st->x0; for (i = lg; i != 0; i--) { /* y[i] = b[0]*x[i]/2 + b[1]*x[i-1]/2 + b140[2]*x[i-2]/2 */ /* + a[1]*y[i-1] + a[2] * y[i-2]; */ L_tmp = ((Word32) st->y1_hi) * 7807; L_tmp += (Word32)(((Word32) st->y1_lo * 7807) >> 15); L_tmp += ((Word32) st->y2_hi) * (-3733); st->y2_hi = st->y1_hi; L_tmp += (Word32)(((Word32) st->y2_lo * (-3733)) >> 15); st->y2_lo = st->y1_lo; L_tmp += ((Word32) x_n_2) * 1899; x_n_2 = x_n_1; L_tmp += ((Word32) x_n_1) * (-3798); x_n_1 = *(p_signal); L_tmp += ((Word32) x_n_1) * 1899; *(p_signal++) = (Word16)((L_tmp + 0x0000800L) >> 12); st->y1_hi = (Word16)(L_tmp >> 12); st->y1_lo = (Word16)((L_tmp << 3) - ((Word32)(st->y1_hi) << 15)); } st->x1 = x_n_2; st->x0 = x_n_1; return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -