⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pre_proc.cpp

📁 实现3GPP的GSM中AMR语音的CODECS。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
------------------------------------------------------------------------------ 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 + -