PITCH.C
上传用户:meifeng08
上传日期:2013-06-18
资源大小:5304k
文件大小:20k
源码类别:

语音压缩

开发平台:

C/C++

  1. /* Version 3.3    Last modified: December 26, 1995 */
  2. /*---------------------------------------------------------------------------*
  3.  * procedure Pitch_ol                                                        *
  4.  * ~~~~~~~~~~~~~~~~~~                                                        *
  5.  * Compute the open loop pitch lag.                                          *
  6.  *                                                                           *
  7.  *---------------------------------------------------------------------------*/
  8. #include "typedef.h"
  9. #include "basic_op.h"
  10. #include "oper_32b.h"
  11. #include "ld8k.h"
  12. #include "tab_ld8k.h"
  13. /* local function */
  14. static Word16 Lag_max(        /* output: lag found                           */
  15.   Word16 signal[],     /* input : signal used to compute the open loop pitch */
  16.   Word16 L_frame,      /* input : length of frame to compute pitch           */
  17.   Word16 lag_max,      /* input : maximum lag                                */
  18.   Word16 lag_min,      /* input : minimum lag                                */
  19.   Word16 *cor_max);    /* output: normalized correlation of selected lag     */
  20. Word16 Pitch_ol(       /* output: open loop pitch lag                        */
  21.    Word16 signal[],    /* input : signal used to compute the open loop pitch */
  22.                        /*     signal[-pit_max] to signal[-1] should be known */
  23.    Word16   pit_min,   /* input : minimum pitch lag                          */
  24.    Word16   pit_max,   /* input : maximum pitch lag                          */
  25.    Word16   L_frame    /* input : length of frame to compute pitch           */
  26. )
  27. {
  28.   Word16  i, j;
  29.   Word16  max1, max2, max3;
  30.   Word16  p_max1, p_max2, p_max3;
  31.   Word32  t0, L_temp;
  32.   /* Scaled signal */
  33.   Word16 scaled_signal[L_FRAME+PIT_MAX];
  34.   Word16 *scal_sig;
  35.   scal_sig = &scaled_signal[pit_max];
  36.   /*--------------------------------------------------------*
  37.    *  Verification for risk of overflow.                    *
  38.    *--------------------------------------------------------*/
  39.    Overflow = 0;
  40.    t0 = 0;
  41.    for(i= -pit_max; i< L_frame; i++)
  42.      t0 = L_mac(t0, signal[i], signal[i]);
  43.   /*--------------------------------------------------------*
  44.    * Scaling of input signal.                               *
  45.    *                                                        *
  46.    *   if Overflow        -> scal_sig[i] = signal[i]>>3     *
  47.    *   else if t0 < 1^20  -> scal_sig[i] = signal[i]<<3     *
  48.    *   else               -> scal_sig[i] = signal[i]        *
  49.    *--------------------------------------------------------*/
  50.    if(Overflow == 1)
  51.    {
  52.      for(i=-pit_max; i<L_frame; i++)
  53.        scal_sig[i] = shr(signal[i], 3);
  54.    }
  55.    else {
  56.      L_temp = L_sub(t0, (Word32)1048576L);
  57.      if ( L_temp < (Word32)0 )  /* if (t0 < 2^20) */
  58.      {
  59.         for(i=-pit_max; i<L_frame; i++)
  60.           scal_sig[i] = shl(signal[i], 3);
  61.      }
  62.      else
  63.      {
  64.        for(i=-pit_max; i<L_frame; i++)
  65.          scal_sig[i] = signal[i];
  66.      }
  67.    }
  68.   /*--------------------------------------------------------------------*
  69.    *  The pitch lag search is divided in three sections.                *
  70.    *  Each section cannot have a pitch multiple.                        *
  71.    *  We find a maximum for each section.                               *
  72.    *  We compare the maximum of each section by favoring small lag.     *
  73.    *                                                                    *
  74.    *  First section:  lag delay = pit_max     downto 4*pit_min          *
  75.    *  Second section: lag delay = 4*pit_min-1 downto 2*pit_min          *
  76.    *  Third section:  lag delay = 2*pit_min-1 downto pit_min            *
  77.    *--------------------------------------------------------------------*/
  78.    j = shl(pit_min, 2);
  79.    p_max1 = Lag_max(scal_sig, L_frame, pit_max, j, &max1);
  80.    i = sub(j, 1); j = shl(pit_min, 1);
  81.    p_max2 = Lag_max(scal_sig, L_frame, i, j, &max2);
  82.    i = sub(j, 1);
  83.    p_max3 = Lag_max(scal_sig, L_frame, i, pit_min , &max3);
  84.   /*--------------------------------------------------------------------*
  85.    * Compare the 3 sections maximum, and favor small lag.               *
  86.    *--------------------------------------------------------------------*/
  87.   if( sub(mult(max1, THRESHPIT), max2)  < 0)
  88.   {
  89.     max1 = max2;
  90.     p_max1 = p_max2;
  91.   }
  92.   if( sub(mult(max1, THRESHPIT), max3)  < 0)
  93.   {
  94.     p_max1 = p_max3;
  95.   }
  96.   return (p_max1);
  97. }
  98. /*---------------------------------------------------------------------------*
  99.  * procedure Lag_max                                                         *
  100.  * ~~~~~~~~~~~~~~~~~                                                         *
  101.  * Find the lag that has maximum correlation with scal_sig[]                 *
  102.  *                                                                           *
  103.  *---------------------------------------------------------------------------*
  104.  * arguments:                                                                *
  105.  *                                                                           *
  106.  *   signal[]   :Signal used to compute the open loop pitch.                 *
  107.  *   L_frame    :Length of frame to compute pitch.                           *
  108.  *   lag_max    :Maximum lag                                                 *
  109.  *   lag_min    :Minimum lag                                                 *
  110.  *   *cor_max   ;Maximum of normalized correlation of lag found.             *
  111.  *                                                                           *
  112.  *   Return lag found.                                                       *
  113.  *--------------------------------------------------------------------------*/
  114. static Word16 Lag_max( /* output: lag found                                  */
  115.   Word16 signal[],     /* input : signal used to compute the open loop pitch */
  116.   Word16 L_frame,      /* input : length of frame to compute pitch           */
  117.   Word16 lag_max,      /* input : maximum lag                                */
  118.   Word16 lag_min,      /* input : minimum lag                                */
  119.   Word16 *cor_max)     /* output: normalized correlation of selected lag     */
  120. {
  121.   Word16  i, j;
  122.   Word16  *p, *p1;
  123.   Word32  max, t0, L_temp;
  124.   Word16  max_h, max_l, ener_h, ener_l;
  125.   Word16  p_max;
  126.   max = MIN_32;
  127.    /* initialization used only to suppress Microsoft Visual C++  warnings */
  128.   p_max = lag_max;
  129.   for (i = lag_max; i >= lag_min; i--)
  130.   {
  131.     p  = signal;
  132.     p1 = &signal[-i];
  133.     t0 = 0;
  134.     for (j=0; j<L_frame; j++, p++, p1++)
  135.       t0 = L_mac(t0, *p, *p1);
  136.     L_temp = L_sub(t0,max);
  137.     if (L_temp >= 0L)
  138.     {
  139.       max    = t0;
  140.       p_max = i;
  141.     }
  142.   }
  143.   /* compute energy */
  144.   t0 = 0;
  145.   p = &signal[-p_max];
  146.   for(i=0; i<L_frame; i++, p++)
  147.     t0 = L_mac(t0, *p, *p);
  148.   /* 1/sqrt(energy),    result in Q30 */
  149.   t0 = Inv_sqrt(t0);
  150.   /* max = max/sqrt(energy)                   */
  151.   /* This result will always be on 16 bits !! */
  152.   L_Extract(max, &max_h, &max_l);
  153.   L_Extract(t0, &ener_h, &ener_l);
  154.   t0 = Mpy_32(max_h, max_l, ener_h, ener_l);
  155.   *cor_max = extract_l(t0);
  156.   return(p_max);
  157. }
  158. /*--------------------------------------------------------------------------*
  159.  * Function  Pitch_fr3()                                                    *
  160.  * ~~~~~~~~~~~~~~~~~~~~~                                                    *
  161.  * Find the pitch period with 1/3 subsample resolution.                     *
  162.  *--------------------------------------------------------------------------*/
  163.         /* Local functions */
  164. static void Norm_Corr(Word16 exc[], Word16 xn[], Word16 h[], Word16 L_subfr,
  165.                       Word16 t_min, Word16 t_max, Word16 corr_norm[]);
  166. Word16 Pitch_fr3(    /* (o)     : pitch period.                          */
  167.   Word16 exc[],      /* (i)     : excitation buffer                      */
  168.   Word16 xn[],       /* (i)     : target vector                          */
  169.   Word16 h[],        /* (i) Q12 : impulse response of filters.           */
  170.   Word16 L_subfr,    /* (i)     : Length of subframe                     */
  171.   Word16 t0_min,     /* (i)     : minimum value in the searched range.   */
  172.   Word16 t0_max,     /* (i)     : maximum value in the searched range.   */
  173.   Word16 i_subfr,    /* (i)     : indicator for first subframe.          */
  174.   Word16 *pit_frac   /* (o)     : chosen fraction.                       */
  175. )
  176. {
  177.   Word16 i;
  178.   Word16 t_min, t_max;
  179.   Word16 max, lag, frac;
  180.   Word16 *corr;
  181.   Word16 corr_int;
  182.   Word16 corr_v[40];           /* Total length = t0_max-t0_min+1+2*L_INTER */
  183.   /* Find interval to compute normalized correlation */
  184.   t_min = sub(t0_min, L_INTER4);
  185.   t_max = add(t0_max, L_INTER4);
  186.   corr = &corr_v[-t_min];
  187.   /* Compute normalized correlation between target and filtered excitation */
  188.   Norm_Corr(exc, xn, h, L_subfr, t_min, t_max, corr);
  189.   /* Find integer pitch */
  190.   max = corr[t0_min];
  191.   lag = t0_min;
  192.   for(i= t0_min+(Word16)1; i<=t0_max; i++)
  193.   {
  194.     if( sub(corr[i], max) >= 0)
  195.     {
  196.       max = corr[i];
  197.       lag = i;
  198.     }
  199.   }
  200.   /* If first subframe and lag > 84 do not search fractional pitch */
  201.   if( (i_subfr == 0) && (sub(lag, 84) > 0) )
  202.   {
  203.     *pit_frac = 0;
  204.     return(lag);
  205.   }
  206.   /* Test the fractions around T0 and choose the one which maximizes   */
  207.   /* the interpolated normalized correlation.                          */
  208.   max  = Interpol_3(&corr[lag], -2);
  209.   frac = -2;
  210.   for (i = -1; i <= 2; i++)
  211.   {
  212.     corr_int = Interpol_3(&corr[lag], i);
  213.     if (sub(corr_int, max) > 0)
  214.     {
  215.       max = corr_int;
  216.       frac = i;
  217.     }
  218.   }
  219.   /* limit the fraction value between -1 and 1 */
  220.   if (sub(frac, -2) == 0)
  221.   {
  222.     frac = 1;
  223.     lag = sub(lag, 1);
  224.   }
  225.   if (sub(frac, 2) == 0)
  226.   {
  227.     frac = -1;
  228.     lag = add(lag, 1);
  229.   }
  230.   *pit_frac = frac;
  231.   return(lag);
  232. }
  233. /*---------------------------------------------------------------------------*
  234.  * Function Norm_Corr()                                                      *
  235.  * ~~~~~~~~~~~~~~~~~~~~                                                      *
  236.  * Find the normalized correlation between the target vector and the         *
  237.  * filtered past excitation.                                                 *
  238.  *---------------------------------------------------------------------------*
  239.  * Input arguments:                                                          *
  240.  *     exc[]    : excitation buffer                                          *
  241.  *     xn[]     : target vector                                              *
  242.  *     h[]      : impulse response of synthesis and weighting filters (Q12)  *
  243.  *     L_subfr  : Length of subframe                                         *
  244.  *     t_min    : minimum value of pitch lag.                                *
  245.  *     t_max    : maximum value of pitch lag.                                *
  246.  *                                                                           *
  247.  * Output arguments:                                                         *
  248.  *     corr_norm[]:  normalized correlation (correlation between target and  *
  249.  *                   filtered excitation divided by the square root of       *
  250.  *                   energy of filtered excitation)                          *
  251.  *--------------------------------------------------------------------------*/
  252. static void Norm_Corr(Word16 exc[], Word16 xn[], Word16 h[], Word16 L_subfr,
  253.                Word16 t_min, Word16 t_max, Word16 corr_norm[])
  254. {
  255.   Word16 i,j,k;
  256.   Word16 corr_h, corr_l, norm_h, norm_l;
  257.   Word32 s, L_temp;
  258.   Word16 excf[L_SUBFR];
  259.   Word16 scaling, h_fac, *s_excf, scaled_excf[L_SUBFR];
  260.   k =  negate(t_min);
  261.   /* compute the filtered excitation for the first delay t_min */
  262.   Convolve(&exc[k], h, excf, L_subfr);
  263.   /* scaled "excf[]" to avoid overflow */
  264.   for(j=0; j<L_subfr; j++)
  265.     scaled_excf[j] = shr(excf[j], 2);
  266.   /* Compute energy of excf[] for danger of overflow */
  267.   s = 0;
  268.   for (j = 0; j < L_subfr; j++)
  269.     s = L_mac(s, excf[j], excf[j]);
  270.   L_temp = L_sub(s, 67108864L);
  271.   if (L_temp <= 0L)      /* if (s <= 2^26) */
  272.   {
  273.     s_excf = excf;
  274.     h_fac = 15-12;               /* h in Q12 */
  275.     scaling = 0;
  276.   }
  277.   else {
  278.     s_excf = scaled_excf;        /* "excf[]" is divide by 2 */
  279.     h_fac = 15-12-2;             /* h in Q12, divide by 2 */
  280.     scaling = 2;
  281.   }
  282.   /* loop for every possible period */
  283.   for (i = t_min; i <= t_max; i++)
  284.   {
  285.     /* Compute 1/sqrt(energy of excf[]) */
  286.     s = 0;
  287.     for (j = 0; j < L_subfr; j++)
  288.       s = L_mac(s, s_excf[j], s_excf[j]);
  289.     s = Inv_sqrt(s);                     /* Result in Q30 */
  290.     L_Extract(s, &norm_h, &norm_l);
  291.     /* Compute correlation between xn[] and excf[] */
  292.     s = 0;
  293.     for (j = 0; j < L_subfr; j++)
  294.       s = L_mac(s, xn[j], s_excf[j]);
  295.     L_Extract(s, &corr_h, &corr_l);
  296.     /* Normalize correlation = correlation * (1/sqrt(energy)) */
  297.     s = Mpy_32(corr_h, corr_l, norm_h, norm_l);
  298.     corr_norm[i] = extract_h(L_shl(s, 16));   /* Result is on 16 bits */
  299.     /* modify the filtered excitation excf[] for the next iteration */
  300.     if( sub(i, t_max) != 0)
  301.     {
  302.       k=sub(k,1);
  303.       for (j = L_subfr-(Word16)1; j > 0; j--)
  304.       {
  305.         s = L_mult(exc[k], h[j]);
  306.         s = L_shl(s, h_fac);             /* h is in Q(12-scaling) */
  307.         s_excf[j] = add(extract_h(s), s_excf[j-1]);
  308.       }
  309.       s_excf[0] = shr(exc[k], scaling);
  310.     }
  311.   }
  312.   return;
  313. }
  314. /*---------------------------------------------------------------------*
  315.  * Function  G_pitch:                                                  *
  316.  *           ~~~~~~~~                                                  *
  317.  *---------------------------------------------------------------------*
  318.  * Compute correlations <xn,y1> and <y1,y1> to use in gains quantizer. *
  319.  * Also compute the gain of pitch. Result in Q14                       *
  320.  *  if (gain < 0)  gain =0                                             *
  321.  *  if (gain >1.2) gain =1.2                                           *
  322.  *---------------------------------------------------------------------*/
  323. Word16 G_pitch(      /* (o) Q14 : Gain of pitch lag saturated to 1.2       */
  324.   Word16 xn[],       /* (i)     : Pitch target.                            */
  325.   Word16 y1[],       /* (i)     : Filtered adaptive codebook.              */
  326.   Word16 g_coeff[],  /* (i)     : Correlations need for gain quantization. */
  327.   Word16 L_subfr     /* (i)     : Length of subframe.                      */
  328. )
  329. {
  330.    Word16 i;
  331.    Word16 xy, yy, exp_xy, exp_yy, gain;
  332.    Word32 s;
  333.    Word16 scaled_y1[L_SUBFR];
  334.    /* divide "y1[]" by 4 to avoid overflow */
  335.    for(i=0; i<L_subfr; i++)
  336.      scaled_y1[i] = shr(y1[i], 2);
  337.    /* Compute scalar product <y1[],y1[]> */
  338.    Overflow = 0;
  339.    s = 1;                    /* Avoid case of all zeros */
  340.    for(i=0; i<L_subfr; i++)
  341.      s = L_mac(s, y1[i], y1[i]);
  342.    if (Overflow == 0) {
  343.      exp_yy = norm_l(s);
  344.      yy     = round( L_shl(s, exp_yy) );
  345.    }
  346.    else {
  347.      s = 1;                  /* Avoid case of all zeros */
  348.      for(i=0; i<L_subfr; i++)
  349.        s = L_mac(s, scaled_y1[i], scaled_y1[i]);
  350.      exp_yy = norm_l(s);
  351.      yy     = round( L_shl(s, exp_yy) );
  352.      exp_yy = sub(exp_yy, 4);
  353.    }
  354.    /* Compute scalar product <xn[],y1[]> */
  355.    Overflow = 0;
  356.    s = 0;
  357.    for(i=0; i<L_subfr; i++)
  358.      s = L_mac(s, xn[i], y1[i]);
  359.    if (Overflow == 0) {
  360.      exp_xy = norm_l(s);
  361.      xy     = round( L_shl(s, exp_xy) );
  362.    }
  363.    else {
  364.      s = 0;
  365.      for(i=0; i<L_subfr; i++)
  366.        s = L_mac(s, xn[i], scaled_y1[i]);
  367.      exp_xy = norm_l(s);
  368.      xy     = round( L_shl(s, exp_xy) );
  369.      exp_xy = sub(exp_xy, 2);
  370.    }
  371.    g_coeff[0] = yy;
  372.    g_coeff[1] = sub(15, exp_yy);
  373.    g_coeff[2] = xy;
  374.    g_coeff[3] = sub(15, exp_xy);
  375.    /* If (xy <= 0) gain = 0 */
  376.    if (xy <= 0)
  377.    {
  378.       g_coeff[3] = -15;   /* Force exp_xy to -15 = (15-30) */
  379.       return( (Word16) 0);
  380.    }
  381.    /* compute gain = xy/yy */
  382.    xy = shr(xy, 1);             /* Be sure xy < yy */
  383.    gain = div_s( xy, yy);
  384.    i = sub(exp_xy, exp_yy);
  385.    gain = shr(gain, i);         /* saturation if > 1.99 in Q14 */
  386.    /* if(gain >1.2) gain = 1.2  in Q14 */
  387.    if( sub(gain, 19661) > 0)
  388.    {
  389.      gain = 19661;
  390.    }
  391.    return(gain);
  392. }
  393. /*----------------------------------------------------------------------*
  394.  *    Function Enc_lag3                                                 *
  395.  *             ~~~~~~~~                                                 *
  396.  *   Encoding of fractional pitch lag with 1/3 resolution.              *
  397.  *----------------------------------------------------------------------*
  398.  * The pitch range for the first subframe is divided as follows:        *
  399.  *   19 1/3  to   84 2/3   resolution 1/3                               *
  400.  *   85      to   143      resolution 1                                 *
  401.  *                                                                      *
  402.  * The period in the first subframe is encoded with 8 bits.             *
  403.  * For the range with fractions:                                        *
  404.  *   index = (T-19)*3 + frac - 1;   where T=[19..85] and frac=[-1,0,1]  *
  405.  * and for the integer only range                                       *
  406.  *   index = (T - 85) + 197;        where T=[86..143]                   *
  407.  *----------------------------------------------------------------------*
  408.  * For the second subframe a resolution of 1/3 is always used, and the  *
  409.  * search range is relative to the lag in the first subframe.           *
  410.  * If t0 is the lag in the first subframe then                          *
  411.  *  t_min=t0-5   and  t_max=t0+4   and  the range is given by           *
  412.  *       t_min - 2/3   to  t_max + 2/3                                  *
  413.  *                                                                      *
  414.  * The period in the 2nd subframe is encoded with 5 bits:               *
  415.  *   index = (T-(t_min-1))*3 + frac - 1;    where T[t_min-1 .. t_max+1] *
  416.  *----------------------------------------------------------------------*/
  417. Word16 Enc_lag3(     /* output: Return index of encoding */
  418.   Word16 T0,         /* input : Pitch delay              */
  419.   Word16 T0_frac,    /* input : Fractional pitch delay   */
  420.   Word16 *T0_min,    /* in/out: Minimum search delay     */
  421.   Word16 *T0_max,    /* in/out: Maximum search delay     */
  422.   Word16 pit_min,    /* input : Minimum pitch delay      */
  423.   Word16 pit_max,    /* input : Maximum pitch delay      */
  424.   Word16 pit_flag    /* input : Flag for 1st subframe    */
  425. )
  426. {
  427.   Word16 index, i;
  428.   if (pit_flag == 0)   /* if 1st subframe */
  429.   {
  430.     /* encode pitch delay (with fraction) */
  431.     if (sub(T0, 85) <= 0)
  432.     {
  433.       /* index = t0*3 - 58 + t0_frac   */
  434.       i = add(add(T0, T0), T0);
  435.       index = add(sub(i, 58), T0_frac);
  436.     }
  437.     else {
  438.       index = add(T0, 112);
  439.     }
  440.     /* find T0_min and T0_max for second (or fourth) subframe */
  441.     *T0_min = sub(T0, 5);
  442.     if (sub(*T0_min, pit_min) < 0)
  443.     {
  444.       *T0_min = pit_min;
  445.     }
  446.     *T0_max = add(*T0_min, 9);
  447.     if (sub(*T0_max, pit_max) > 0)
  448.     {
  449.       *T0_max = pit_max;
  450.       *T0_min = sub(*T0_max, 9);
  451.     }
  452.   }
  453.   else      /* if second subframe */
  454.   {
  455.     /* i = t0 - t0_min;               */
  456.     /* index = i*3 + 2 + t0_frac;     */
  457.     i = sub(T0, *T0_min);
  458.     i = add(add(i, i), i);
  459.     index = add(add(i, 2), T0_frac);
  460.   }
  461.   return index;
  462. }
  463. /*---------------------------------------------------------------------------*
  464.  * Procedure Interpol_3()                                                    *
  465.  * ~~~~~~~~~~~~~~~~~~~~~~                                                    *
  466.  * For interpolating the normalized correlation with 1/3 resolution.         *
  467.  *--------------------------------------------------------------------------*/
  468. Word16 Interpol_3(      /* (o)  : interpolated value  */
  469.   Word16 *x,            /* (i)  : input vector        */
  470.   Word16 frac           /* (i)  : fraction            */
  471. )
  472. {
  473.   Word16 i, k;
  474.   Word16 *x1, *x2, *c1, *c2;
  475.   Word32 s;
  476.   if(frac < 0)
  477.   {
  478.     frac = add(frac, UP_SAMP);
  479.     x--;
  480.   }
  481.   x1 = &x[0];
  482.   x2 = &x[1];
  483.   c1 = &inter_3[frac];
  484.   c2 = &inter_3[sub(UP_SAMP,frac)];
  485.   s = 0;
  486.   for(i=0, k=0; i< L_INTER4; i++, k+=UP_SAMP)
  487.   {
  488.     s = L_mac(s, x1[-i], c1[k]);
  489.     s = L_mac(s, x2[i],  c2[k]);
  490.   }
  491.   return round(s);
  492. }