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

📄 pitch_fr.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 2 页
字号:
        return -1;    }    Pitch_fr_reset(s);    *state = s;    return 0;}/***************************************************************************  Function:   Pitch_fr_reset*  Purpose:    Initializes state memory to zero****************************************************************************/int Pitch_fr_reset (Pitch_frState *state){    if (state == (Pitch_frState *) NULL){        fprintf(stderr, "Pitch_fr_reset: invalid parameter\n");        return -1;    }    state->T0_prev_subframe = 0;    return 0;}/***************************************************************************  Function:   Pitch_fr_exit*  Purpose:    The memory used for state memory is freed****************************************************************************/void Pitch_fr_exit (Pitch_frState **state){    if (state == NULL || *state == NULL)        return;    /* deallocate memory */    free(*state);    *state = NULL;    return;}/************************************************************************* * *  FUNCTION:   Pitch_fr() * *  PURPOSE: Find the pitch period with 1/3 or 1/6 subsample resolution *           (closed loop). * *  DESCRIPTION: *        - find the normalized correlation between the target and filtered *          past excitation in the search range. *        - select the delay with maximum normalized correlation. *        - interpolate the normalized correlation at fractions -3/6 to 3/6 *          with step 1/6 around the chosen delay. *        - The fraction which gives the maximum interpolated value is chosen. * *************************************************************************/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                         */){    Word16 i;    Word16 t_min, t_max;    Word16 t0_min, t0_max;    Word16 max, lag, 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, flag4;    Word16 last_frac;    Word16 delta_int_low, delta_int_range;    Word16 delta_frc_low, 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;           move16 ();    flag3           = mode_dep_parm[mode].flag3;                  move16 ();    frac            = mode_dep_parm[mode].first_frac;             move16 ();    last_frac       = mode_dep_parm[mode].last_frac;              move16 ();    delta_int_low   = mode_dep_parm[mode].delta_int_low;          move16 ();    delta_int_range = mode_dep_parm[mode].delta_int_range;        move16 ();        delta_frc_low   = mode_dep_parm[mode].delta_frc_low;          move16 ();    delta_frc_range = mode_dep_parm[mode].delta_frc_range;        move16 ();    pit_min         = mode_dep_parm[mode].pit_min;                move16 ();        /*-----------------------------------------------------------------------*     *                 decide upon full or differential search               *     *-----------------------------------------------------------------------*/        delta_search = 1;                                             move16 ();        test (); test ();    if ((i_subfr == 0) || (sub(i_subfr,L_FRAME_BY2) == 0)) {              /* Subframe 1 and 3 */              test (); test (); test ();        if (((sub(mode, MR475) != 0) && (sub(mode, MR515) != 0)) ||            (sub(i_subfr,L_FRAME_BY2) != 0)) {                    /* 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 */         move16 ();                        /* calculate index into T_op which contains the open-loop */            /* pitch estimations for the 2 big subframes */                        frame_offset = 1;                                      move16 ();            test ();            if (i_subfr == 0)                frame_offset = 0;                                  move16 ();                        /* 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);        }        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);        }    }    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);    }    /*-----------------------------------------------------------------------*     *           Find interval to compute normalized correlation             *     *-----------------------------------------------------------------------*/    t_min = sub (t0_min, L_INTER_SRCH);    t_max = add (t0_max, L_INTER_SRCH);    corr = &corr_v[-t_min];                                        move16 ();    /*-----------------------------------------------------------------------*     * 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];                                            move16 ();    lag = t0_min;                                                  move16 ();    for (i = t0_min + 1; i <= t0_max; i++) {        test ();        if (sub (corr[i], max) >= 0) {            max = corr[i];                                         move16 ();            lag = i;                                               move16 ();        }    }    /*-----------------------------------------------------------------------*     *                        Find fractional pitch                          *     *-----------------------------------------------------------------------*/    test (); test ();    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;                                                  move16 ();    }    else {        /* if differential search AND mode MR475 OR MR515 OR MR59 OR MR67   */        /* then search fractional with 4 bits resolution           */              test (); test (); test (); test (); test ();        if ((delta_search != 0) &&           ((sub (mode, MR475) == 0) ||            (sub (mode, MR515) == 0) ||            (sub (mode, MR59) == 0) ||            (sub (mode, 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;                          move16 ();          test ();          if ( sub( sub(tmp_lag, t0_min), 5) > 0)             tmp_lag = add (t0_min, 5);          test ();          if ( sub( sub(t0_max, tmp_lag), 4) > 0)               tmp_lag = sub (t0_max, 4);                    test (); test ();          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) {             test ();             /* limit search around T0 to the right side */             frac = 0;                                            move16 ();             searchFrac (&lag, &frac, last_frac, corr, flag3);          }          else if (sub (lag, add(tmp_lag, 1)) == 0) {             test (); test ();             /* limit search around T0 to the left side */             last_frac = 0;                                       move16 ();             searchFrac (&lag, &frac, last_frac, corr, flag3);          }          else {             test (); test ();             /* no fractional search */             frac = 0;                                            move16 ();            }       }       else          /* test the fractions around T0 */          searchFrac (&lag, &frac, last_frac, corr, flag3);    }        /*-----------------------------------------------------------------------*     *                           encode pitch                                *     *-----------------------------------------------------------------------*/        test ();    if (flag3 != 0) {              /* flag4 indicates encoding with 4 bit resolution;         */       /* this is needed for mode MR475, MR515 and MR59           */              flag4 = 0;                                                 move16 ();       test (); test (); test (); test ();        if ( (sub (mode, MR475) == 0) ||            (sub (mode, MR515) == 0) ||            (sub (mode, MR59) == 0) ||            (sub (mode, MR67) == 0) ) {          flag4 = 1;                                              move16 ();       }              /* encode with 1/3 subsample resolution */              *ana_index = Enc_lag3(lag, frac, st->T0_prev_subframe,                             t0_min, t0_max, delta_search, flag4); move16 (); /* function result */    }      else    {       /* encode with 1/6 subsample resolution */              *ana_index = Enc_lag6(lag, frac, t0_min, delta_search); move16 (); /* function result */    }        /*-----------------------------------------------------------------------*     *                          update state variables                       *     *-----------------------------------------------------------------------*/        st->T0_prev_subframe = lag;                                    move16 ();        /*-----------------------------------------------------------------------*     *                      update output variables                          *     *-----------------------------------------------------------------------*/        *resu3    = flag3;                                             move16 ();    *pit_frac = frac;                                              move16 ();    return (lag);}

⌨️ 快捷键说明

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