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

📄 pitch_fr.cpp

📁 实现3GPP的GSM中AMR语音的CODECS。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    corr = &corr_v[-t_min];    //-----------------------------------------------------------------------      Compute normalized correlation between target and filtered excitation     -----------------------------------------------------------------------    Norm_Corr (exc, xn, h, L_subfr, t_min, t_max, corr);    //-----------------------------------------------------------------------                                Find integer pitch     -----------------------------------------------------------------------    max = corr[t0_min];    lag = t0_min;    for (i = t0_min + 1; i <= t0_max; i++) {        if (sub (corr[i], max) >= 0) {            max = corr[i];            lag = i;        }    }    //-----------------------------------------------------------------------                             Find fractional pitch     -----------------------------------------------------------------------    if ((delta_search == 0) && (sub (lag, max_frac_lag) > 0)) {        // full search and integer pitch greater than max_frac_lag        // fractional search is not needed, set fractional to zero        frac = 0;    }    else {        // if differential search AND mode MR475 OR MR515 OR MR59 OR MR67        // then search fractional with 4 bits resolution       if ((delta_search != 0) &&           ((sub ((Word16)mode, (Word16)MR475) == 0) ||            (sub ((Word16)mode, (Word16)MR515) == 0) ||            (sub ((Word16)mode, (Word16)MR59) == 0) ||            (sub ((Word16)mode, (Word16)MR67) == 0))) {          // modify frac or last_frac according to position of last          // integer pitch: either search around integer pitch,          // or only on left or right side          tmp_lag = st->T0_prev_subframe;          if ( sub( sub(tmp_lag, t0_min), 5) > 0)             tmp_lag = add (t0_min, 5);          if ( sub( sub(t0_max, tmp_lag), 4) > 0)               tmp_lag = sub (t0_max, 4);          if ((sub (lag, tmp_lag) == 0) ||              (sub (lag, sub(tmp_lag, 1)) == 0)) {             // normal search in fractions around T0             searchFrac (&lag, &frac, last_frac, corr, flag3);          }          else if (sub (lag, sub (tmp_lag, 2)) == 0) {             // limit search around T0 to the right side             frac = 0;             searchFrac (&lag, &frac, last_frac, corr, flag3);          }          else if (sub (lag, add(tmp_lag, 1)) == 0) {             // limit search around T0 to the left side             last_frac = 0;             searchFrac (&lag, &frac, last_frac, corr, flag3);          }          else {             // no fractional search             frac = 0;            }       }       else          // test the fractions around T0          searchFrac (&lag, &frac, last_frac, corr, flag3);    }    //-----------------------------------------------------------------------     //                           encode pitch     //-----------------------------------------------------------------------    if (flag3 != 0) {       // flag4 indicates encoding with 4 bit resolution;       // this is needed for mode MR475, MR515 and MR59       flag4 = 0;       if ( (sub ((Word16)mode, (Word16)MR475) == 0) ||            (sub ((Word16)mode, (Word16)MR515) == 0) ||            (sub ((Word16)mode, (Word16)MR59) == 0) ||            (sub ((Word16)mode, (Word16)MR67) == 0) ) {          flag4 = 1;       }       // encode with 1/3 subsample resolution       *ana_index = Enc_lag3(lag, frac, st->T0_prev_subframe,                             t0_min, t0_max, delta_search, flag4);       // function result    }    else    {       // encode with 1/6 subsample resolution       *ana_index = Enc_lag6(lag, frac, t0_min, delta_search);       // function result    }     //-----------------------------------------------------------------------     //                          update state variables     //-----------------------------------------------------------------------    st->T0_prev_subframe = lag;     //-----------------------------------------------------------------------     //                      update output variables     //-----------------------------------------------------------------------    *resu3    = flag3;    *pit_frac = frac;    return (lag);}------------------------------------------------------------------------------ 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 Pitch_fr(         /* o   : pitch period (integer)                    */    Pitch_frState *st,   /* i/o : State struct                              */    enum Mode mode,      /* i   : codec mode                                */    Word16 T_op[],       /* i   : open loop pitch lags                      */    Word16 exc[],        /* i   : excitation buffer                      Q0 */    Word16 xn[],         /* i   : target vector                          Q0 */    Word16 h[],          /* i   : impulse response of synthesis and                                  weighting filters                     Q12 */    Word16 L_subfr,      /* i   : Length of subframe                        */    Word16 i_subfr,      /* i   : subframe offset                           */    Word16 *pit_frac,    /* o   : pitch period (fractional)                 */    Word16 *resu3,       /* o   : subsample resolution 1/3 (=1) or 1/6 (=0) */    Word16 *ana_index,   /* o   : index of encoding                         */    Flag   *pOverflow){    Word16 i;    Word16 t_min;    Word16 t_max;    Word16 t0_min = 0;    Word16 t0_max;    Word16 max;    Word16 lag;    Word16 frac;    Word16 tmp_lag;    Word16 *corr;    Word16 corr_v[40];    /* Total length = t0_max-t0_min+1+2*L_INTER_SRCH */    Word16 max_frac_lag;    Word16 flag3;    Word16 flag4;    Word16 last_frac;    Word16 delta_int_low;    Word16 delta_int_range;    Word16 delta_frc_low;    Word16 delta_frc_range;    Word16 pit_min;    Word16 frame_offset;    Word16 delta_search;    /*-----------------------------------------------------------------------*     *                      set mode specific variables                      *     *-----------------------------------------------------------------------*/    max_frac_lag    = mode_dep_parm[mode].max_frac_lag;    flag3           = mode_dep_parm[mode].flag3;    frac            = mode_dep_parm[mode].first_frac;    last_frac       = mode_dep_parm[mode].last_frac;    delta_int_low   = mode_dep_parm[mode].delta_int_low;    delta_int_range = mode_dep_parm[mode].delta_int_range;    delta_frc_low   = mode_dep_parm[mode].delta_frc_low;    delta_frc_range = mode_dep_parm[mode].delta_frc_range;    pit_min         = mode_dep_parm[mode].pit_min;    /*-----------------------------------------------------------------------*     *                 decide upon full or differential search               *     *-----------------------------------------------------------------------*/    delta_search = 1;    if ((i_subfr == 0) || (i_subfr == L_FRAME_BY2))    {        /* Subframe 1 and 3 */        if (((mode != MR475) && (mode != MR515)) || (i_subfr != L_FRAME_BY2))        {            /* set t0_min, t0_max for full search */            /* this is *not* done for mode MR475, MR515 in subframe 3 */            delta_search = 0; /* no differential search */            /* calculate index into T_op which contains the open-loop */            /* pitch estimations for the 2 big subframes */            frame_offset = 1;            if (i_subfr == 0)                frame_offset = 0;            /* get T_op from the corresponding half frame and */            /* set t0_min, t0_max */            getRange(T_op[frame_offset], delta_int_low, delta_int_range,                     pit_min, PIT_MAX, &t0_min, &t0_max, pOverflow);        }        else        {            /* mode MR475, MR515 and 3. Subframe: delta search as well */            getRange(st->T0_prev_subframe, delta_frc_low, delta_frc_range,                     pit_min, PIT_MAX, &t0_min, &t0_max, pOverflow);        }    }    else    {        /* for Subframe 2 and 4 */        /* get range around T0 of previous subframe for delta search */        getRange(st->T0_prev_subframe, delta_frc_low, delta_frc_range,                 pit_min, PIT_MAX, &t0_min, &t0_max, pOverflow);    }    /*-----------------------------------------------------------------------*     *           Find interval to compute normalized correlation             *     *-----------------------------------------------------------------------*/    t_min = sub(t0_min, L_INTER_SRCH, pOverflow);    t_max = add(t0_max, L_INTER_SRCH, pOverflow);    corr = &corr_v[-t_min];    /*-----------------------------------------------------------------------*     * Compute normalized correlation between target and filtered excitation *     *-----------------------------------------------------------------------*/    Norm_Corr(exc, xn, h, L_subfr, t_min, t_max, corr, pOverflow);    /*-----------------------------------------------------------------------*     *                           Find integer pitch                          *     *-----------------------------------------------------------------------*/    max = corr[t0_min];    lag = t0_min;    for (i = t0_min + 1; i <= t0_max; i++)    {        if (corr[i] >= max)        {            max = corr[i];            lag = i;        }    }    /*-----------------------------------------------------------------------*     *                        Find fractional pitch                          *     *-----------------------------------------------------------------------*/    if ((delta_search == 0) && (lag > max_frac_lag))    {        /* full search and integer pitch greater than max_frac_lag */        /* fractional search is not needed, set fractional to zero */        frac = 0;    }    else    {        /* if differential search AND mode MR475 OR MR515 OR MR59 OR MR67   */        /* then search fractional with 4 bits resolution           */        if ((delta_search != 0) &&                ((mode == MR475) || (mode == MR515) ||                 (mode == MR59) || (mode == MR67)))        {            /* modify frac or last_frac according to position of last */            /* integer pitch: either search around integer pitch, */            /* or only on left or right side */            tmp_lag = st->T0_prev_subframe;            if (sub(sub(tmp_lag, t0_min, pOverflow), 5, pOverflow) > 0)                tmp_lag = add(t0_min, 5, pOverflow);            if (sub(sub(t0_max, tmp_lag, pOverflow), 4, pOverflow) > 0)                tmp_lag = sub(t0_max, 4, pOverflow);            if ((lag == tmp_lag) || (lag == (tmp_lag - 1)))            {                /* normal search in fractions around T0 */                searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow);            }            else if (lag == (tmp_lag - 2))            {                /* limit search around T0 to the right side */                frac = 0;                searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow);            }            else if (lag == (tmp_lag + 1))            {                /* limit search around T0 to the left side */                last_frac = 0;                searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow);            }            else            {                /* no fractional search */                frac = 0;            }        }        else            /* test the fractions around T0 */            searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow);    }    /*-----------------------------------------------------------------------*     *                           encode pitch                                *     *-----------------------------------------------------------------------*/    if (flag3 != 0)    {        /* flag4 indicates encoding with 4 bit resolution;         */        /* this is needed for mode MR475, MR515 and MR59           */        flag4 = 0;        if ((mode == MR475) || (mode == MR515) ||                (mode == MR59) || (mode == MR67))        {            flag4 = 1;        }        /* encode with 1/3 subsample resolution */        *ana_index = Enc_lag3(lag, frac, st->T0_prev_subframe,                              t0_min, t0_max, delta_search, flag4, pOverflow);        /* function result */    }    else    {        /* encode with 1/6 subsample resolution */        *ana_index = Enc_lag6(lag, frac, t0_min, delta_search, pOverflow);        /* function result */    }    /*-----------------------------------------------------------------------*     *                          update state variables                       *     *-----------------------------------------------------------------------*/    st->T0_prev_subframe = lag;    /*-----------------------------------------------------------------------*     *                      update output variables                          *     *-----------------------------------------------------------------------*/    *resu3    = flag3;    *pit_frac = frac;    return (lag);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -