enc_gain.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:17k
源码类别:

Symbian

开发平台:

C/C++

  1. /*
  2.  *===================================================================
  3.  *  3GPP AMR Wideband Floating-point Speech Codec
  4.  *===================================================================
  5.  */
  6. #include <math.h>
  7. #include "hlxclib/memory.h"
  8. #include "typedef.h"
  9. #include "enc_util.h"
  10. #define L_FRAME         256   /* Frame size                                */
  11. #define L_SUBFR         64    /* Subframe size                             */
  12. #define HP_ORDER        3
  13. #define L_INTERPOL1     4
  14. #define L_INTERPOL2     16
  15. #define PIT_SHARP       27853 /* pitch sharpening factor = 0.85 Q15        */
  16. #define F_PIT_SHARP     0.85F /* pitch sharpening factor                   */
  17. #define PIT_MIN         34    /* Minimum pitch lag with resolution 1/4     */
  18. #define UP_SAMP         4
  19. #define DIST_ISF_MAX    120
  20. #define DIST_ISF_THRES  60
  21. #define GAIN_PIT_THRES  0.9F
  22. #define GAIN_PIT_MIN    0.6F
  23. extern const Float32 E_ROM_corrweight[];
  24. extern const Float32 E_ROM_inter4_1[];
  25. extern const Word16 E_ROM_inter4_2[];
  26. /*
  27.  * E_GAIN_clip_init
  28.  *
  29.  * Parameters:
  30.  *    mem        O: memory of gain of pitch clipping algorithm
  31.  *
  32.  * Function:
  33.  *    Initialises state memory
  34.  *
  35.  * Returns:
  36.  *    void
  37.  */
  38. void E_GAIN_clip_init(Float32 mem[])
  39. {
  40.    mem[0] = DIST_ISF_MAX;
  41.    mem[1] = GAIN_PIT_MIN;
  42. }
  43. /*
  44.  * E_GAIN_clip_test
  45.  *
  46.  * Parameters:
  47.  *    mem         I: memory of gain of pitch clipping algorithm
  48.  *
  49.  * Function:
  50.  *    Gain clipping test to avoid unstable synthesis on frame erasure
  51.  *
  52.  * Returns:
  53.  *    Test result
  54.  */
  55. Word32 E_GAIN_clip_test(Float32 mem[])
  56. {
  57.    Word32 clip;
  58.    clip = 0;
  59.    if ((mem[0] < DIST_ISF_THRES) && (mem[1] > GAIN_PIT_THRES))
  60.    {
  61.       clip = 1;
  62.    }
  63.    return (clip);
  64. }
  65. /*
  66.  * E_GAIN_clip_isf_test
  67.  *
  68.  * Parameters:
  69.  *    isf         I: isf values (in frequency domain)
  70.  *    mem       I/O: memory of gain of pitch clipping algorithm
  71.  *
  72.  * Function:
  73.  *    Check resonance for pitch clipping algorithm
  74.  *
  75.  * Returns:
  76.  *    void
  77.  */
  78. void E_GAIN_clip_isf_test(Float32 isf[], Float32 mem[])
  79. {
  80.    Word32 i;
  81.    Float32 dist, dist_min;
  82.    dist_min = isf[1] - isf[0];
  83.    for (i = 2; i < M - 1; i++)
  84.    {
  85.       dist = isf[i] - isf[i-1];
  86.       if (dist < dist_min)
  87.       {
  88.          dist_min = dist;
  89.       }
  90.    }
  91.    dist = 0.8F * mem[0] + 0.2F * dist_min;
  92.    if (dist > DIST_ISF_MAX)
  93.    {
  94.       dist = DIST_ISF_MAX;
  95.    }
  96.    mem[0] = dist;
  97.    return;
  98. }
  99. /*
  100.  * E_GAIN_clip_pit_test
  101.  *
  102.  * Parameters:
  103.  *    gain_pit       I: gain of quantized pitch
  104.  *    mem          I/O: memory of gain of pitch clipping algorithm
  105.  *
  106.  * Function:
  107.  *    Test quantised gain of pitch for pitch clipping algorithm
  108.  *
  109.  * Returns:
  110.  *    void
  111.  */
  112. void E_GAIN_clip_pit_test(Float32 gain_pit, Float32 mem[])
  113. {
  114.    Float32 gain;
  115.    gain = 0.9F * mem[1] + 0.1F * gain_pit;
  116.    if (gain < GAIN_PIT_MIN)
  117.    {
  118.       gain = GAIN_PIT_MIN;
  119.    }
  120.    mem[1] = gain;
  121.    return;
  122. }
  123. /*
  124.  * E_GAIN_lp_decim2
  125.  *
  126.  * Parameters:
  127.  *    x            I/O: signal to process
  128.  *    l              I: size of filtering
  129.  *    mem          I/O: memory (size = 3)
  130.  *
  131.  * Function:
  132.  *    Decimate a vector by 2 with 2nd order fir filter.
  133.  *
  134.  * Returns:
  135.  *    void
  136.  */
  137. void E_GAIN_lp_decim2(Float32 x[], Word32 l, Float32 *mem)
  138. {
  139.    Float32 x_buf[L_FRAME + 3];
  140.    Float32 temp;
  141.    Word32 i, j;
  142.    /* copy initial filter states into buffer */
  143.    memcpy(x_buf, mem, 3 * sizeof(Float32));
  144.    memcpy(&x_buf[3], x, l * sizeof(Float32));
  145.    for (i = 0; i < 3; i++)
  146.    {
  147.       mem[i] =
  148.          ((x[l - 3 + i] > 1e-10) | (x[l - 3 + i] < -1e-10)) ? x[l - 3 + i] : 0;
  149.    }
  150.    for (i = 0, j = 0; i < l; i += 2, j++)
  151.    {
  152.       temp = x_buf[i] * 0.13F;
  153.       temp += x_buf[i + 1] * 0.23F;
  154.       temp += x_buf[i + 2] * 0.28F;
  155.       temp += x_buf[i + 3] * 0.23F;
  156.       temp += x_buf[i + 4] * 0.13F;
  157.       x[j] = temp;
  158.    }
  159.    return;
  160. }
  161. /*
  162.  * E_GAIN_open_loop_search
  163.  *
  164.  * Parameters:
  165.  *    wsp               I: signal (end pntr) used to compute the open loop pitch
  166.  *    L_min             I: minimum pitch lag
  167.  *    L_max             I: maximum pitch lag
  168.  *    nFrame            I: length of frame to compute pitch
  169.  *    L_0               I: old open-loop lag
  170.  *    gain              O: open-loop pitch-gain
  171.  *    hp_wsp_mem      I/O: memory of the highpass filter for hp_wsp[] (lg = 9)
  172.  *    hp_old_wsp        O: highpass wsp[]
  173.  *    weight_flg        I: is weighting function used
  174.  *
  175.  * Function:
  176.  *    Find open loop pitch lag
  177.  *
  178.  * Returns:
  179.  *    open loop pitch lag
  180.  */
  181. Word32 E_GAIN_open_loop_search(Float32 *wsp, Word32 L_min, Word32 L_max,
  182.                            Word32 nFrame, Word32 L_0, Float32 *gain,
  183.                            Float32 *hp_wsp_mem, Float32 hp_old_wsp[],
  184.                            UWord8 weight_flg)
  185. {
  186.    Word32  i, j, k, L = 0;
  187.    Float32  o, R0, R1, R2, R0_max = -1.0e23f;
  188.    const Float32 *ww, *we;
  189.    Float32 *data_a, *data_b, *hp_wsp, *p, *p1;
  190.    ww = &E_ROM_corrweight[198];
  191.    we = &E_ROM_corrweight[98 + L_max - L_0];
  192.    for (i = L_max; i > L_min; i--)
  193.    {
  194.       p  = &wsp[0];
  195.       p1 = &wsp[-i];
  196.       /* Compute the correlation R0 and the energy R1. */
  197.       R0 = 0.0;
  198.       for (j = 0; j < nFrame; j += 2)
  199.       {
  200.          R0 += p[j] * p1[j];
  201.          R0 += p[j + 1] * p1[j + 1];
  202.       }
  203.       /* Weighting of the correlation function. */
  204.       R0 *= *ww--;
  205.       /* Weight the neighborhood of the old lag. */
  206.       if ((L_0 > 0) & (weight_flg == 1))
  207.       {
  208.          R0 *= *we--;
  209.       }
  210.       /* Store the values if a currest maximum has been found. */
  211.       if (R0 >= R0_max)
  212.       {
  213.          R0_max = R0;
  214.          L = i;
  215.       }
  216.    }
  217.    data_a = hp_wsp_mem;
  218.    data_b = hp_wsp_mem + HP_ORDER;
  219.    hp_wsp = hp_old_wsp + L_max;
  220.    for (k = 0; k < nFrame; k++)
  221.    {
  222.       data_b[0] = data_b[1];
  223.       data_b[1] = data_b[2];
  224.       data_b[2] = data_b[3];
  225.       data_b[HP_ORDER] = wsp[k];
  226.       o = data_b[0] * 0.83787057505665F;
  227.       o += data_b[1] * -2.50975570071058F;
  228.       o += data_b[2] * 2.50975570071058F;
  229.       o += data_b[3] * -0.83787057505665F;
  230.       o -= data_a[0] * -2.64436711600664F;
  231.       o -= data_a[1] * 2.35087386625360F;
  232.       o -= data_a[2] * -0.70001156927424F;
  233.       data_a[2] = data_a[1];
  234.       data_a[1] = data_a[0];
  235.       data_a[0] = o;
  236.       hp_wsp[k] = o;
  237.    }
  238.    p  = &hp_wsp[0];
  239.    p1 = &hp_wsp[-L];
  240.    R0 = 0.0F;
  241.    R1 = 0.0F;
  242.    R2 = 0.0F;
  243.    for (j = 0; j < nFrame; j++)
  244.    {
  245.       R1 += p1[j] * p1[j];
  246.       R2 += p[j] * p[j];
  247.       R0 += p[j] * p1[j];
  248.    }
  249.    *gain = (Float32)(R0 / (sqrt(R1 * R2) + 1e-5));
  250.    memcpy(hp_old_wsp, &hp_old_wsp[nFrame], L_max * sizeof(Float32));
  251.    return(L);
  252. }
  253. /*
  254.  * E_GAIN_sort
  255.  *
  256.  * Parameters:
  257.  *    n              I: number of lags
  258.  *    ra           I/O: lags / sorted lags
  259.  *
  260.  * Function:
  261.  *    Sort open-loop lags
  262.  *
  263.  * Returns:
  264.  *    void
  265.  */
  266. static void E_GAIN_sort(Word32 n, Word32 *ra)
  267. {
  268.    Word32 l, j, ir, i, rra;
  269.    l = (n >> 1) + 1;
  270.    ir = n;
  271.    for (;;)
  272.    {
  273.       if (l > 1)
  274.       {
  275.          rra = ra[--l];
  276.       }
  277.       else
  278.       {
  279.          rra = ra[ir];
  280.          ra[ir] = ra[1];
  281.          if (--ir == 1)
  282.          {
  283.             ra[1] = rra;
  284.             return;
  285.          }
  286.       }
  287.       i = l;
  288.       j = l << 1;
  289.       while (j <= ir)
  290.       {
  291.          if (j < ir && ra[j] < ra[j + 1])
  292.          {
  293.             ++j;
  294.          }
  295.          if (rra < ra[j])
  296.          {
  297.             ra[i] = ra[j];
  298.             j += (i = j);
  299.          }
  300.          else
  301.          {
  302.             j = ir + 1;
  303.          }
  304.       }
  305.       ra[i] = rra;
  306.    }
  307. }
  308. /*
  309.  * E_GAIN_olag_median
  310.  *
  311.  * Parameters:
  312.  *    prev_ol_lag            I: previous open-loop lag
  313.  *    old_ol_lag             I: old open-loop lags
  314.  *
  315.  * Function:
  316.  *    Median of 5 previous open-loop lags
  317.  *
  318.  * Returns:
  319.  *    median of 5 previous open-loop lags
  320.  */
  321. Word32 E_GAIN_olag_median(Word32 prev_ol_lag, Word32 old_ol_lag[5])
  322. {
  323.    Word32 tmp[6] = {0};
  324.    Word32 i;
  325.    /* Use median of 5 previous open-loop lags as old lag */
  326.    for (i = 4; i > 0; i--)
  327.    {
  328.       old_ol_lag[i] = old_ol_lag[i-1];
  329.    }
  330.    old_ol_lag[0] = prev_ol_lag;
  331.    for (i = 0; i < 5; i++)
  332.    {
  333.       tmp[i+1] = old_ol_lag[i];
  334.    }
  335.    E_GAIN_sort(5, tmp);
  336.    return tmp[3];
  337. }
  338. /*
  339.  * E_GAIN_norm_corr
  340.  *
  341.  * Parameters:
  342.  *    exc            I: excitation buffer
  343.  *    xn             I: target signal
  344.  *    h              I: weighted synthesis filter impulse response (Q15)
  345.  *    t0_min         I: minimum value in the searched range
  346.  *    t0_max         I: maximum value in the searched range
  347.  *    corr_norm      O: normalized correlation (Q15)
  348.  *
  349.  * Function:
  350.  *    Find the normalized correlation between the target vector and the
  351.  *    filtered past excitation (correlation between target and filtered
  352.  *    excitation divided by the square root of energy of filtered excitation)
  353.  *    Size of subframe = L_SUBFR.
  354.  *
  355.  * Returns:
  356.  *    void
  357.  */
  358. static void E_GAIN_norm_corr(Float32 exc[], Float32 xn[], Float32 h[],
  359.                              Word32 t_min, Word32 t_max, Float32 corr_norm[])
  360. {
  361.    Float32 excf[L_SUBFR];  /* filtered past excitation */
  362.    Float32 alp, ps, norm;
  363.    Word32 t, j, k;
  364.    k = - t_min;
  365.    /* compute the filtered excitation for the first delay t_min */
  366.    E_UTIL_f_convolve(&exc[k], h, excf);
  367.    /* loop for every possible period */
  368.    for (t = t_min; t <= t_max; t++)
  369.    {
  370.       /* Compute correlation between xn[] and excf[] */
  371.       ps = 0.0F;
  372.       alp = 0.01F;
  373.       for (j = 0; j < L_SUBFR; j++)
  374.       {
  375.          ps += xn[j] * excf[j];
  376.          alp += excf[j] * excf[j];
  377.       }
  378.       /* Compute 1/sqrt(energie of excf[]) */
  379.       norm = (Float32)(1.0F / sqrt(alp));
  380.       /* Normalize correlation = correlation * (1/sqrt(energy)) */
  381.       corr_norm[t] = ps * norm;
  382.       /* update the filtered excitation excf[] for the next iteration */
  383.       if (t != t_max)
  384.       {
  385.          k--;
  386.          for (j = L_SUBFR - 1; j > 0; j--)
  387.          {
  388.             excf[j] = excf[j - 1] + exc[k] * h[j];
  389.          }
  390.          excf[0] = exc[k];
  391.       }
  392.    }
  393.    return;
  394. }
  395. /*
  396.  * E_GAIN_norm_corr_interpolate
  397.  *
  398.  * Parameters:
  399.  *    x           I: input vector
  400.  *    frac        I: fraction (-4..+3)
  401.  *
  402.  * Function:
  403.  *    Interpolating the normalized correlation
  404.  *
  405.  * Returns:
  406.  *    interpolated value
  407.  */
  408. static Float32 E_GAIN_norm_corr_interpolate(Float32 *x, Word32 frac)
  409. {
  410.    Float32 s, *x1, *x2;
  411.    const Float32 *c1, *c2;
  412.    if (frac < 0)
  413.    {
  414.       frac += 4;
  415.       x--;
  416.    }
  417.    x1 = &x[0];
  418.    x2 = &x[1];
  419.    c1 = &E_ROM_inter4_1[frac];
  420.    c2 = &E_ROM_inter4_1[4 - frac];
  421.    s = x1[0] * c1[0] + x2[0] * c2[0];
  422.    s += x1[-1] * c1[4] + x2[1] * c2[4];
  423.    s += x1[-2] * c1[8] + x2[2] * c2[8];
  424.    s += x1[-3] * c1[12] + x2[3] * c2[12];
  425.    return s;
  426. }
  427. /*
  428.  * E_GAIN_closed_loop_search
  429.  *
  430.  * Parameters:
  431.  *    exc            I: excitation buffer
  432.  *    xn             I: target signal
  433.  *    h              I: weighted synthesis filter impulse response
  434.  *    t0_min         I: minimum value in the searched range
  435.  *    t0_max         I: maximum value in the searched range
  436.  *    pit_frac       O: chosen fraction
  437.  *    i_subfr        I: flag to first subframe
  438.  *    t0_fr2         I: minimum value for resolution 1/2
  439.  *    t0_fr1         I: minimum value for resolution 1
  440.  *
  441.  * Function:
  442.  *    Find the closed loop pitch period with 1/4 subsample resolution.
  443.  *
  444.  * Returns:
  445.  *    chosen integer pitch lag
  446.  */
  447. Word32 E_GAIN_closed_loop_search(Float32 exc[], Float32 xn[], Float32 h[],
  448.                              Word32 t0_min, Word32 t0_max, Word32 *pit_frac,
  449.                              Word32 i_subfr, Word32 t0_fr2, Word32 t0_fr1)
  450. {
  451.    Float32 corr_v[15 + 2 * L_INTERPOL1 + 1];
  452.    Float32 cor_max, max, temp;
  453.    Float32 *corr;
  454.    Word32 i, fraction, step;
  455.    Word32 t0, t_min, t_max;
  456.    /* Find interval to compute normalized correlation */
  457.    t_min = t0_min - L_INTERPOL1;
  458.    t_max = t0_max + L_INTERPOL1;
  459.    /* allocate memory to normalized correlation vector */
  460.    corr = &corr_v[-t_min];      /* corr[t_min..t_max] */
  461.    /* Compute normalized correlation between target and filtered excitation */
  462.    E_GAIN_norm_corr(exc, xn, h, t_min, t_max, corr);
  463.    /*  find integer pitch */
  464.    max = corr[t0_min];
  465.    t0  = t0_min;
  466.    for(i = t0_min + 1; i <= t0_max; i++)
  467.    {
  468.       if( corr[i] > max)
  469.       {
  470.          max = corr[i];
  471.          t0 = i;
  472.       }
  473.    }
  474.    /* If first subframe and t0 >= t0_fr1, do not search fractionnal pitch */
  475.    if((i_subfr == 0) & (t0 >= t0_fr1))
  476.    {
  477.       *pit_frac = 0;
  478.       return(t0);
  479.    }
  480.    /*
  481.     * Search fractionnal pitch with 1/4 subsample resolution.
  482.     * Test the fractions around t0 and choose the one which maximizes
  483.     * the interpolated normalized correlation.
  484.     */
  485.    step = 1;                /* 1/4 subsample resolution */
  486.    fraction = -3;
  487.    if (((i_subfr == 0) & (t0 >= t0_fr2)) | (t0_fr2 == PIT_MIN))
  488.    {
  489.       step = 2;              /* 1/2 subsample resolution */
  490.       fraction = -2;
  491.    }
  492.    if (t0 == t0_min)
  493.    {
  494.       fraction = 0;
  495.    }
  496.    cor_max = E_GAIN_norm_corr_interpolate(&corr[t0], fraction);
  497.    for (i = (fraction + step); i <= 3; i += step)
  498.    {
  499.       temp = E_GAIN_norm_corr_interpolate(&corr[t0], i);
  500.       if (temp > cor_max)
  501.       {
  502.          cor_max = temp;
  503.          fraction = i;
  504.       }
  505.    }
  506.    /* limit the fraction value in the interval [0,1,2,3] */
  507.    if (fraction < 0)
  508.    {
  509.       fraction += 4;
  510.       t0 -= 1;
  511.    }
  512.    *pit_frac = fraction;
  513.    return (t0);
  514. }
  515. /*
  516.  * E_GAIN_adaptive_codebook_excitation
  517.  *
  518.  * Parameters:
  519.  *    exc          I/O: excitation buffer
  520.  *    T0             I: integer pitch lag
  521.  *    frac           I: fraction of lag
  522.  *    L_subfr        I: subframe size
  523.  *
  524.  * Function:
  525.  *    Compute the result of Word32 term prediction with fractional
  526.  *    interpolation of resolution 1/4.
  527.  *
  528.  * Returns:
  529.  *    interpolated signal (adaptive codebook excitation)
  530.  */
  531. void E_GAIN_adaptive_codebook_excitation(Word16 exc[], Word16 T0, Word32 frac, Word16 L_subfr)
  532. {
  533.    Word32 i, j, k, L_sum;
  534.    Word16 *x;
  535.    x = &exc[-T0];
  536.    frac = -(frac);
  537.    if (frac < 0)
  538.    {
  539.       frac = (frac + UP_SAMP);
  540.       x--;
  541.    }
  542.    x = x - L_INTERPOL2 + 1;
  543.    for (j = 0; j < L_subfr; j++)
  544.    {
  545.       L_sum = 0L;
  546.       for (i = 0, k = ((UP_SAMP - 1) - frac); i < 2 * L_INTERPOL2; i++, k += UP_SAMP)
  547.       {
  548.          L_sum = L_sum + (x[i] * E_ROM_inter4_2[k]);
  549.       }
  550.       L_sum = (L_sum + 0x2000) >> 14;
  551.       exc[j] = E_UTIL_saturate(L_sum);
  552.       x++;
  553.    }
  554.    return;
  555. }
  556. /*
  557.  * E_GAIN_pitch_sharpening
  558.  *
  559.  * Parameters:
  560.  *    x            I/O: impulse response (or algebraic code)
  561.  *    pit_lag        I: pitch lag
  562.  *
  563.  * Function:
  564.  *    Performs Pitch sharpening routine for one subframe.
  565.  *    pitch sharpening factor is 0.85
  566.  *
  567.  * Returns:
  568.  *    void
  569.  */
  570. void E_GAIN_pitch_sharpening(Word16 *x, Word16 pit_lag)
  571. {
  572.    Word32 L_tmp, i;
  573.    for (i = pit_lag; i < L_SUBFR; i++)
  574.    {
  575.       L_tmp = x[i] << 15;
  576.       L_tmp += x[i - pit_lag] * PIT_SHARP;
  577.       x[i] = (Word16)((L_tmp + 0x4000) >> 15);
  578.    }
  579.    return;
  580. }
  581. void E_GAIN_f_pitch_sharpening(Float32 *x, Word32 pit_lag)
  582. {
  583.    Word32 i;
  584.    for (i = pit_lag; i < L_SUBFR; i++)
  585.    {
  586.       x[i] += x[i - pit_lag] * F_PIT_SHARP;
  587.    }
  588.    return;
  589. }
  590. /*
  591.  * E_GAIN_voice_factor
  592.  *
  593.  * Parameters:
  594.  *    exc            I: pitch excitation (Q_exc)
  595.  *    Q_exc          I: exc format
  596.  *    gain_pit       I: gain of pitch (Q14)
  597.  *    code           I: Fixed codebook excitation (Q9)
  598.  *    gain_code      I: gain of code (Q0)
  599.  *
  600.  *
  601.  * Function:
  602.  *    Find the voicing factor (1=voice to -1=unvoiced)
  603.  *    Subframe length is L_SUBFR
  604.  *
  605.  * Returns:
  606.  *    factor (-1=unvoiced to 1=voiced) (Q15)
  607.  */
  608. Word32 E_GAIN_voice_factor(Word16 exc[], Word16 Q_exc, Word16 gain_pit,
  609.                           Word16 code[], Word16 gain_code)
  610. {
  611.    Word32 i, L_tmp, tmp, exp, ener1, exp1, ener2, exp2;
  612.    ener1 = E_UTIL_dot_product12(exc, exc, L_SUBFR, &exp1) >> 16;
  613.    exp1 = exp1 - (Q_exc + Q_exc);
  614.    L_tmp = (gain_pit * gain_pit) << 1;
  615.    exp = E_UTIL_norm_l(L_tmp);
  616.    tmp = (L_tmp << exp) >> 16;
  617.    ener1 = (ener1 * tmp) >> 15;
  618.    exp1 = (exp1 - exp) - 10;        /* 10 -> gain_pit Q14 to Q9 */
  619.    ener2 = E_UTIL_dot_product12(code, code, L_SUBFR, &exp2) >> 16;
  620.    exp = E_UTIL_norm_s(gain_code);
  621.    tmp = gain_code << exp;
  622.    tmp = (tmp * tmp) >> 15;
  623.    ener2 = (ener2 * tmp) >> 15;
  624.    exp2 = exp2 - (exp + exp);
  625.    i = exp1 - exp2;
  626.    if (i >= 0)
  627.    {
  628.       ener1 = ener1 >> 1;
  629.       ener2 = ener2 >> (i + 1);
  630.    }
  631.    else
  632.    {
  633.       i = 1 - i;
  634.       if (i < 32)
  635.       {
  636.          ener1 = ener1 >> i;
  637.       }
  638.       else
  639.       {
  640.          ener1 = 0;
  641.       }
  642.       ener2 = ener2 >> 1;
  643.    }
  644.    tmp = ener1 - ener2;
  645.    ener1 = (ener1 + ener2) + 1;
  646.    tmp = (tmp << 15) / ener1;
  647.    return (tmp);
  648. }