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

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_main.h"
  10. #include "enc_lpc.h"
  11. #ifdef WIN32
  12. #pragma warning( disable : 4310)
  13. #endif
  14. #define MAX_16 (Word16)0x7FFF
  15. #define MIN_16 (Word16)0x8000
  16. #define MAX_31 (Word32)0x3FFFFFFF
  17. #define MIN_31 (Word32)0xC0000000
  18. #define L_FRAME16k   320     /* Frame size at 16kHz         */
  19. #define L_SUBFR16k   80      /* Subframe size at 16kHz      */
  20. #define L_SUBFR      64      /* Subframe size               */
  21. #define M16k         20      /* Order of LP filter          */
  22. #define L_WINDOW     384     /* window size in LP analysis  */
  23. #define PREEMPH_FAC  0.68F   /* preemphasis factor          */
  24. extern const Word16 E_ROM_pow2[];
  25. extern const Word16 E_ROM_log2[];
  26. extern const Word16 E_ROM_isqrt[];
  27. extern const Float32 E_ROM_fir_6k_7k[];
  28. extern const Float32 E_ROM_hp_gain[];
  29. extern const Float32 E_ROM_fir_ipol[];
  30. extern const Float32 E_ROM_hamming_cos[];
  31. /*
  32.  * E_UTIL_random
  33.  *
  34.  * Parameters:
  35.  *    seed        I/O: seed for random number
  36.  *
  37.  * Function:
  38.  *    Signed 16 bits random generator.
  39.  *
  40.  * Returns:
  41.  *    random number
  42.  */
  43. Word16 E_UTIL_random(Word16 *seed)
  44. {
  45.   /*static Word16 seed = 21845;*/
  46.   *seed = (Word16) (*seed * 31821L + 13849L);
  47.   return(*seed);
  48. }
  49. /*
  50.  * E_UTIL_saturate
  51.  *
  52.  * Parameters:
  53.  *    inp        I: 32-bit number
  54.  *
  55.  * Function:
  56.  *    Saturation to 16-bit number
  57.  *
  58.  * Returns:
  59.  *    16-bit number
  60.  */
  61. Word16 E_UTIL_saturate(Word32 inp)
  62. {
  63.    Word16 out;
  64.    if ((inp < MAX_16) & (inp > MIN_16))
  65.    {
  66.       out = (Word16)inp;
  67.    }
  68.    else
  69.    {
  70.       if (inp > 0)
  71.       {
  72.          out = MAX_16;
  73.       }
  74.       else
  75.       {
  76.          out = MIN_16;
  77.       }
  78.    }
  79.    return(out);
  80. }
  81. /*
  82.  * E_UTIL_saturate_31
  83.  *
  84.  * Parameters:
  85.  *    inp        I: 32-bit number
  86.  *
  87.  * Function:
  88.  *    Saturation to 31-bit number
  89.  *
  90.  * Returns:
  91.  *    31(32)-bit number
  92.  */
  93. Word32 E_UTIL_saturate_31(Word32 inp)
  94. {
  95.    Word32 out;
  96.    if ((inp < MAX_31) & (inp > MIN_31))
  97.    {
  98.       out = inp;
  99.    }
  100.    else
  101.    {
  102.       if (inp > 0)
  103.       {
  104.          out = MAX_31;
  105.       }
  106.       else
  107.       {
  108.          out = MIN_31;
  109.       }
  110.    }
  111.    return(out);
  112. }
  113. /*
  114.  * E_UTIL_norm_s
  115.  *
  116.  * Parameters:
  117.  *    L_var1      I: 32 bit Word32 signed integer (Word32) whose value
  118.  *                   falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  119.  *
  120.  * Function:
  121.  *    Produces the number of left shift needed to normalize the 16 bit
  122.  *    variable var1 for positive values on the interval with minimum
  123.  *    of 16384 and maximum of 32767, and for negative values on
  124.  *    the interval with minimum of -32768 and maximum of -16384.
  125.  *
  126.  * Returns:
  127.  *    16 bit Word16 signed integer (Word16) whose value falls in the range
  128.  *    0x0000 0000 <= var_out <= 0x0000 000f.
  129.  */
  130. Word16 E_UTIL_norm_s (Word16 var1)
  131. {
  132.    Word16 var_out;
  133.    if (var1 == 0)
  134.    {
  135.       var_out = 0;
  136.    }
  137.    else
  138.    {
  139.       if (var1 == -1)
  140.       {
  141.          var_out = 15;
  142.       }
  143.       else
  144.       {
  145.          if (var1 < 0)
  146.          {
  147.             var1 = (Word16)~var1;
  148.          }
  149.          for (var_out = 0; var1 < 0x4000; var_out++)
  150.          {
  151.             var1 <<= 1;
  152.          }
  153.       }
  154.    }
  155.    return (var_out);
  156. }
  157. /*
  158.  * E_UTIL_norm_l
  159.  *
  160.  * Parameters:
  161.  *    L_var1      I: 32 bit Word32 signed integer (Word32) whose value
  162.  *                   falls in the range 0x8000 0000 <= var1 <= 0x7fff ffff.
  163.  *
  164.  * Function:
  165.  *    Produces the number of left shifts needed to normalize the 32 bit
  166.  *    variable L_var1 for positive values on the interval with minimum of
  167.  *    1073741824 and maximum of 2147483647, and for negative values on
  168.  *    the interval with minimum of -2147483648 and maximum of -1073741824;
  169.  *    in order to normalize the result, the following operation must be done:
  170.  *    norm_L_var1 = L_shl(L_var1,norm_l(L_var1)).
  171.  *
  172.  * Returns:
  173.  *    16 bit Word16 signed integer (Word16) whose value falls in the range
  174.  *    0x0000 0000 <= var_out <= 0x0000 001f.
  175.  */
  176. Word16 E_UTIL_norm_l (Word32 L_var1)
  177. {
  178.    Word16 var_out;
  179.    if (L_var1 == 0)
  180.    {
  181.       var_out = 0;
  182.    }
  183.    else
  184.    {
  185.       if (L_var1 == (Word32) 0xffffffffL)
  186.       {
  187.          var_out = 31;
  188.       }
  189.       else
  190.       {
  191.          if (L_var1 < 0)
  192.          {
  193.             L_var1 = ~L_var1;
  194.          }
  195.          for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)
  196.          {
  197.             L_var1 <<= 1;
  198.          }
  199.       }
  200.    }
  201.    return (var_out);
  202. }
  203. /*
  204.  * E_UTIL_l_extract
  205.  *
  206.  * Parameters:
  207.  *    L_32        I: 32 bit integer.
  208.  *    hi          O: b16 to b31 of L_32
  209.  *    lo          O: (L_32 - hi<<16)>>1
  210.  *
  211.  * Function:
  212.  *    Extract from a 32 bit integer two 16 bit DPF.
  213.  *
  214.  * Returns:
  215.  *    void
  216.  */
  217. void E_UTIL_l_extract(Word32 L_32, Word16 *hi, Word16 *lo)
  218. {
  219.    *hi = (Word16)(L_32 >> 16);
  220.    *lo = (Word16)((L_32 >> 1) - ((*hi * 16384) << 1));
  221.    return;
  222. }
  223. /*
  224.  * E_UTIL_mpy_32_16
  225.  *
  226.  * Parameters:
  227.  *    hi          I: hi part of 32 bit number
  228.  *    lo          I: lo part of 32 bit number
  229.  *    n           I: 16 bit number
  230.  *
  231.  * Function:
  232.  *    Multiply a 16 bit integer by a 32 bit (DPF). The result is divided
  233.  *    by 2^15.
  234.  *
  235.  *    L_32 = (hi1*lo2)<<1 + ((lo1*lo2)>>15)<<1
  236.  *
  237.  * Returns:
  238.  *    32 bit result
  239.  */
  240. Word32 E_UTIL_mpy_32_16 (Word16 hi, Word16 lo, Word16 n)
  241. {
  242.    Word32 L_32;
  243.    L_32 = (hi * n) << 1;
  244.    L_32 = L_32 + (((lo * n) >> 15) << 1);
  245.    return (L_32);
  246. }
  247. /*
  248.  * E_UTIL_pow2
  249.  *
  250.  * Parameters:
  251.  *    exponant    I: (Q0) Integer part.      (range: 0 <= val <= 30)
  252.  *    fraction    I: (Q15) Fractionnal part.  (range: 0.0 <= val < 1.0)
  253.  *
  254.  * Function:
  255.  *    L_x = pow(2.0, exponant.fraction)         (exponant = interger part)
  256.  *        = pow(2.0, 0.fraction) << exponant
  257.  *
  258.  *    Algorithm:
  259.  *
  260.  *    The function Pow2(L_x) is approximated by a table and linear
  261.  *    interpolation.
  262.  *
  263.  *    1 - i = bit10 - b15 of fraction,   0 <= i <= 31
  264.  *    2 - a = bit0 - b9   of fraction
  265.  *    3 - L_x = table[i] << 16 - (table[i] - table[i + 1]) * a * 2
  266.  *    4 - L_x = L_x >> (30-exponant)     (with rounding)
  267.  *
  268.  * Returns:
  269.  *    range 0 <= val <= 0x7fffffff
  270.  */
  271. Word32 E_UTIL_pow2(Word16 exponant, Word16 fraction)
  272. {
  273.    Word32 L_x, tmp, i, exp;
  274.    Word16 a;
  275.    L_x = fraction * 32;          /* L_x = fraction<<6             */
  276.    i = L_x >> 15;                /* Extract b10-b16 of fraction   */
  277.    a = (Word16)(L_x);            /* Extract b0-b9   of fraction   */
  278.    a = (Word16)(a & (Word16)0x7fff);
  279.    L_x = E_ROM_pow2[i] << 16;    /* table[i] << 16                */
  280.    tmp = E_ROM_pow2[i] - E_ROM_pow2[i + 1];  /* table[i] - table[i+1] */
  281.    L_x = L_x - ((tmp * a) << 1); /* L_x -= tmp*a*2                */
  282.    exp = 30 - exponant;
  283.    L_x = (L_x + (1 << (exp - 1))) >> exp;
  284.    return(L_x);
  285. }
  286. /*
  287.  * E_UTIL_normalised_log2
  288.  *
  289.  * Parameters:
  290.  *    L_x      I: input value (normalized)
  291.  *    exp      I: norm_l (L_x)
  292.  *    exponent O: Integer part of Log2.   (range: 0<=val<=30)
  293.  *    fraction O: Fractional part of Log2. (range: 0<=val<1)
  294.  *
  295.  * Function:
  296.  *    Computes log2(L_x, exp),  where   L_x is positive and
  297.  *    normalized, and exp is the normalisation exponent
  298.  *    If L_x is negative or zero, the result is 0.
  299.  *
  300.  *    The function Log2(L_x) is approximated by a table and linear
  301.  *    interpolation. The following steps are used to compute Log2(L_x)
  302.  *
  303.  *    1. exponent = 30 - norm_exponent
  304.  *    2. i = bit25 - b31 of L_x;  32 <= i <= 63  (because of normalization).
  305.  *    3. a = bit10 - b24
  306.  *    4. i -= 32
  307.  *    5. fraction = table[i] << 16 - (table[i] - table[i + 1]) * a * 2
  308.  *
  309.  *
  310.  * Returns:
  311.  *    void
  312.  */
  313. static void E_UTIL_normalised_log2(Word32 L_x, Word16 exp, Word16 *exponent,
  314.                           Word16 *fraction)
  315. {
  316.    Word32 i, a, tmp;
  317.    Word32 L_y;
  318.    if (L_x <= 0)
  319.    {
  320.       *exponent = 0;
  321.       *fraction = 0;
  322.       return;
  323.    }
  324.    *exponent = (Word16)(30 - exp);
  325.    L_x = L_x >> 10;
  326.    i = L_x >> 15;         /* Extract b25-b31               */
  327.    a = L_x;               /* Extract b10-b24 of fraction   */
  328.    a = a & 0x00007fff;
  329.    i = i - 32;
  330.    L_y = E_ROM_log2[i] << 16;               /* table[i] << 16        */
  331.    tmp = E_ROM_log2[i] - E_ROM_log2[i + 1]; /* table[i] - table[i+1] */
  332.    L_y = L_y - ((tmp * a) << 1);            /* L_y -= tmp*a*2        */
  333.    *fraction = (Word16)(L_y >> 16);
  334.    return;
  335. }
  336. /*
  337.  * E_UTIL_log2
  338.  *
  339.  * Parameters:
  340.  *    L_x      I: input value
  341.  *    exponent O: Integer part of Log2.   (range: 0<=val<=30)
  342.  *    fraction O: Fractional part of Log2. (range: 0<=val<1)
  343.  *
  344.  * Function:
  345.  *    Computes log2(L_x),  where   L_x is positive.
  346.  *    If L_x is negative or zero, the result is 0.
  347.  *
  348.  * Returns:
  349.  *    void
  350.  */
  351. void E_UTIL_log2_32 (Word32 L_x, Word16 *exponent, Word16 *fraction)
  352. {
  353.    Word16 exp;
  354.    exp = E_UTIL_norm_l(L_x);
  355.    E_UTIL_normalised_log2((L_x << exp), exp, exponent, fraction);
  356. }
  357. /*
  358.  * E_UTIL_interpol
  359.  *
  360.  * Parameters:
  361.  *    x           I: input vector
  362.  *    fir         I: filter coefficient
  363.  *    frac        I: fraction (0..resol)
  364.  *    resol       I: resolution
  365.  *    nb_coef     I: number of coefficients
  366.  *
  367.  * Function:
  368.  *    Fractional interpolation of signal at position (frac/up_samp)
  369.  *
  370.  * Returns:
  371.  *    result of interpolation
  372.  */
  373. static Float32 E_UTIL_interpol(Float32 *x, Word32 frac, Word32 up_samp,
  374.                                Word32 nb_coef)
  375. {
  376.    Word32 i;
  377.    Float32 s;
  378.    Float32 *x1, *x2;
  379.    const Float32 *c1, *c2;
  380.    x1 = &x[0];
  381.    x2 = &x[1];
  382.    c1 = &E_ROM_fir_ipol[frac];
  383.    c2 = &E_ROM_fir_ipol[up_samp - frac];
  384.    s = 0.0;
  385.    for(i = 0; i < nb_coef; i++)
  386.    {
  387.       s += x1[-i] * c1[up_samp * i] + x2[i] * c2[up_samp * i];
  388.    }
  389.    return s;
  390. }
  391. /*
  392.  * E_UTIL_hp50_12k8
  393.  *
  394.  * Parameters:
  395.  *    signal       I/O: signal
  396.  *    lg             I: lenght of signal
  397.  *    mem          I/O: filter memory [6]
  398.  *
  399.  * Function:
  400.  *    2nd order high pass filter with cut off frequency at 50 Hz.
  401.  *
  402.  *    Algorithm:
  403.  *
  404.  *    y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2]
  405.  *                     + a[1]*y[i-1] + a[2]*y[i-2];
  406.  *
  407.  *    b[3] = {0.989501953f, -1.979003906f, 0.989501953f};
  408.  *    a[3] = {1.000000000F,  1.978881836f,-0.966308594f};
  409.  *
  410.  *
  411.  * Returns:
  412.  *    void
  413.  */
  414. void E_UTIL_hp50_12k8(Float32 signal[], Word32 lg, Float32 mem[])
  415. {
  416.    Word32 i;
  417.    Float32 x0, x1, x2, y0, y1, y2;
  418.    y1 = mem[0];
  419.    y2 = mem[1];
  420.    x0 = mem[2];
  421.    x1 = mem[3];
  422.    for(i = 0; i < lg; i++)
  423.    {
  424.       x2 = x1;
  425.       x1 = x0;
  426.       x0 = signal[i];
  427.       y0 = y1 * 1.978881836F + y2 * -0.979125977F + x0 * 0.989501953F +
  428.          x1 * -1.979003906F + x2 * 0.989501953F;
  429.       signal[i] = y0;
  430.       y2 = y1;
  431.       y1 = y0;
  432.    }
  433.    mem[0] = ((y1 > 1e-10) | (y1 < -1e-10)) ? y1 : 0;
  434.    mem[1] = ((y2 > 1e-10) | (y2 < -1e-10)) ? y2 : 0;
  435.    mem[2] = ((x0 > 1e-10) | (x0 < -1e-10)) ? x0 : 0;
  436.    mem[3] = ((x1 > 1e-10) | (x1 < -1e-10)) ? x1 : 0;
  437.    return;
  438. }
  439. /*
  440.  * E_UTIL_hp400_12k8
  441.  *
  442.  * Parameters:
  443.  *    signal       I/O: signal
  444.  *    lg             I: lenght of signal
  445.  *    mem          I/O: filter memory [4]
  446.  *
  447.  * Function:
  448.  *    2nd order high pass filter with cut off frequency at 400 Hz.
  449.  *
  450.  *    Algorithm:
  451.  *
  452.  *    y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2]
  453.  *                     + a[1]*y[i-1] + a[2]*y[i-2];
  454.  *
  455.  *    b[3] = {0.893554687, -1.787109375,  0.893554687};
  456.  *    a[3] = {1.000000000,  1.787109375, -0.864257812};
  457.  *
  458.  *
  459.  * Returns:
  460.  *    void
  461.  */
  462. static void E_UTIL_hp400_12k8(Float32 signal[], Word32 lg, Float32 mem[])
  463. {
  464.    Word32 i;
  465.    Float32 x0, x1, x2;
  466.    Float32 y0, y1, y2;
  467.    y1 = mem[0];
  468.    y2 = mem[1];
  469.    x0 = mem[2];
  470.    x1 = mem[3];
  471.    for(i = 0; i < lg; i++)
  472.    {
  473.       x2 = x1;
  474.       x1 = x0;
  475.       x0 = signal[i];
  476.       y0 = y1 * 1.787109375F + y2 * -0.864257812F + x0 * 0.893554687F + x1 * -
  477.          1.787109375F + x2 * 0.893554687F;
  478.       signal[i] = y0;
  479.       y2 = y1;
  480.       y1 = y0;
  481.    }
  482.    mem[0] = y1;
  483.    mem[1] = y2;
  484.    mem[2] = x0;
  485.    mem[3] = x1;
  486.    return;
  487. }
  488. /*
  489.  * E_UTIL_bp_6k_7k
  490.  *
  491.  * Parameters:
  492.  *    signal       I/O: signal
  493.  *    lg             I: lenght of signal
  494.  *    mem          I/O: filter memory [4]
  495.  *
  496.  * Function:
  497.  *    15th order band pass 6kHz to 7kHz FIR filter.
  498.  *
  499.  * Returns:
  500.  *    void
  501.  */
  502. static void E_UTIL_bp_6k_7k(Float32 signal[], Word32 lg, Float32 mem[])
  503. {
  504.    Float32 x[L_SUBFR16k + 30];
  505.    Float32 s0, s1, s2, s3;
  506.    Float32 *px;
  507.    Word32 i, j;
  508.    memcpy(x, mem, 30 * sizeof(Float32));
  509.    memcpy(x + 30, signal, lg * sizeof(Float32));
  510.    px = x;
  511.    for(i = 0; i < lg; i++)
  512.    {
  513.       s0 = 0;
  514.       s1 = px[0] * E_ROM_fir_6k_7k[0];
  515.       s2 = px[1] * E_ROM_fir_6k_7k[1];
  516.       s3 = px[2] * E_ROM_fir_6k_7k[2];
  517.       for(j = 3; j < 31; j += 4)
  518.       {
  519.          s0 += px[j] * E_ROM_fir_6k_7k[j];
  520.          s1 += px[j + 1] * E_ROM_fir_6k_7k[j + 1];
  521.          s2 += px[j + 2] * E_ROM_fir_6k_7k[j + 2];
  522.          s3 += px[j + 3] * E_ROM_fir_6k_7k[j + 3];
  523.       }
  524.       px++;
  525.       signal[i] = (Float32)((s0 + s1 + s2 + s3) * 0.25F);   /* gain of coef = 4.0 */
  526.    }
  527.    memcpy(mem, x + lg, 30 * sizeof(Float32));
  528.    return;
  529. }
  530. /*
  531.  * E_UTIL_preemph
  532.  *
  533.  * Parameters:
  534.  *    x            I/O: signal
  535.  *    mu             I: preemphasis factor
  536.  *    lg             I: vector size
  537.  *    mem          I/O: memory (x[-1])
  538.  *
  539.  * Function:
  540.  *    Filtering through 1 - mu z^-1
  541.  *
  542.  *
  543.  * Returns:
  544.  *    void
  545.  */
  546. void E_UTIL_preemph(Word16 x[], Word16 mu, Word32 lg, Word16 *mem)
  547. {
  548.    Word32 i, L_tmp;
  549.    Word16 temp;
  550.    temp = x[lg - 1];
  551.    for (i = lg - 1; i > 0; i--)
  552.    {
  553.       L_tmp = x[i] << 15;
  554.       L_tmp -= x[i - 1] * mu;
  555.       x[i] = (Word16)((L_tmp + 0x4000) >> 15);
  556.    }
  557.    L_tmp = (x[0] << 15);
  558.    L_tmp -= *mem * mu;
  559.    x[0] = (Word16)((L_tmp + 0x4000) >> 15);
  560.    *mem = temp;
  561.    return;
  562. }
  563. void E_UTIL_f_preemph(Float32 *signal, Float32 mu, Word32 L, Float32 *mem)
  564. {
  565.    Word32 i;
  566.    Float32 temp;
  567.    temp = signal[L - 1];
  568.    for (i = L - 1; i > 0; i--)
  569.    {
  570.       signal[i] = signal[i] - mu * signal[i - 1];
  571.    }
  572.    signal[0] -= mu * (*mem);
  573.    *mem = temp;
  574.    return;
  575. }
  576. /*
  577.  * E_UTIL_deemph
  578.  *
  579.  * Parameters:
  580.  *    signal       I/O: signal
  581.  *    mu             I: deemphasis factor
  582.  *    L              I: vector size
  583.  *    mem          I/O: memory (signal[-1])
  584.  *
  585.  * Function:
  586.  *    Filtering through 1/(1-mu z^-1)
  587.  *    Signal is divided by 2.
  588.  *
  589.  * Returns:
  590.  *    void
  591.  */
  592. void E_UTIL_deemph(Float32 *signal, Float32 mu, Word32 L, Float32 *mem)
  593. {
  594.    Word32 i;
  595.    signal[0] = signal[0] + mu * (*mem);
  596.    for (i = 1; i < L; i++)
  597.    {
  598.       signal[i] = signal[i] + mu * signal[i - 1];
  599.    }
  600.    *mem = signal[L - 1];
  601.    if ((*mem < 1e-10) & (*mem > -1e-10))
  602.    {
  603.       *mem = 0;
  604.    }
  605.    return;
  606. }
  607. /*
  608.  * E_UTIL_synthesis
  609.  *
  610.  * Parameters:
  611.  *    a              I: LP filter coefficients
  612.  *    m              I: order of LP filter
  613.  *    x              I: input signal
  614.  *    y              O: output signal
  615.  *    lg             I: size of filtering
  616.  *    mem          I/O: initial filter states
  617.  *    update_m       I: update memory flag
  618.  *
  619.  * Function:
  620.  *    Perform the synthesis filtering 1/A(z).
  621.  *    Memory size is always M.
  622.  *
  623.  * Returns:
  624.  *    void
  625.  */
  626. void E_UTIL_synthesis(Float32 a[], Float32 x[], Float32 y[], Word32 l,
  627.                       Float32 mem[], Word32 update_m)
  628. {
  629.    Float32 buf[L_FRAME16k + M16k];     /* temporary synthesis buffer */
  630.    Float32 s;
  631.    Float32 *yy;
  632.    Word32 i, j;
  633.    /* copy initial filter states into synthesis buffer */
  634.    memcpy(buf, mem, M * sizeof(Float32));
  635.    yy = &buf[M];
  636.    for (i = 0; i < l; i++)
  637.    {
  638.       s = x[i];
  639.       for (j = 1; j <= M; j += 4)
  640.       {
  641.          s -= a[j] * yy[i - j];
  642.          s -= a[j + 1] * yy[i - (j + 1)];
  643.          s -= a[j + 2] * yy[i - (j + 2)];
  644.          s -= a[j + 3] * yy[i - (j + 3)];
  645.       }
  646.       yy[i] = s;
  647.       y[i] = s;
  648.    }
  649.    /* Update memory if required */
  650.    if (update_m)
  651.    {
  652.       memcpy(mem, &yy[l - M], M * sizeof(Float32));
  653.    }
  654.    return;
  655. }
  656. /*
  657.  * E_UTIL_down_samp
  658.  *
  659.  * Parameters:
  660.  *    res            I: signal to down sample
  661.  *    res_d          O: down sampled signal
  662.  *    L_frame_d      I: length of output
  663.  *
  664.  * Function:
  665.  *    Down sample to 4/5
  666.  *
  667.  * Returns:
  668.  *    void
  669.  */
  670. static void E_UTIL_down_samp(Float32 *res, Float32 *res_d, Word32 L_frame_d)
  671. {
  672.    Word32 i, j, frac;
  673.    Float32 pos, fac;
  674.    fac = 0.8F;
  675.    pos = 0;
  676.    for(i = 0; i < L_frame_d; i++)
  677.    {
  678.       j = (Word32)pos;    /* j = (Word32)( (Float32)i * inc); */
  679.       frac = (Word32)(((pos - (Float32)j) * 4) + 0.5);
  680.       res_d[i] = fac * E_UTIL_interpol(&res[j], frac, 4, 15);
  681.       pos += 1.25F;
  682.    }
  683.    return;
  684. }
  685. /*
  686.  * E_UTIL_decim_12k8
  687.  *
  688.  * Parameters:
  689.  *    sig16k         I: signal to decimate
  690.  *    lg             I: length of input
  691.  *    sig12k8        O: decimated signal
  692.  *    mem          I/O: memory (2*15)
  693.  *
  694.  * Function:
  695.  *    Decimation of 16kHz signal to 12.8kHz.
  696.  *
  697.  * Returns:
  698.  *    void
  699.  */
  700. void E_UTIL_decim_12k8(Float32 sig16k[], Word32 lg, Float32 sig12k8[],
  701.                        Float32 mem[])
  702. {
  703.    Float32 signal[(2 * 15) + L_FRAME16k];
  704.    memcpy(signal, mem, 2 * 15 * sizeof(Float32));
  705.    memcpy(&signal[2 * 15], sig16k, lg * sizeof(Float32));
  706.    E_UTIL_down_samp(signal + 15, sig12k8, lg * 4 / 5);
  707.    memcpy(mem, &signal[lg], 2 * 15 * sizeof(Float32));
  708.    return;
  709. }
  710. /*
  711.  * E_UTIL_residu
  712.  *
  713.  * Parameters:
  714.  *    a           I: LP filter coefficients (Q12)
  715.  *    x           I: input signal (usually speech)
  716.  *    y           O: output signal (usually residual)
  717.  *    l           I: size of filtering
  718.  *
  719.  * Function:
  720.  *    Compute the LP residual by filtering the input speech through A(z).
  721.  *    Order of LP filter = M.
  722.  *
  723.  * Returns:
  724.  *    void
  725.  */
  726. void E_UTIL_residu(Float32 *a, Float32 *x, Float32 *y, Word32 l)
  727. {
  728.    Float32 s;
  729.    Word32 i;
  730.    for (i = 0; i < l; i++)
  731.    {
  732.       s = x[i];
  733.       s += a[1] * x[i - 1];
  734.       s += a[2] * x[i - 2];
  735.       s += a[3] * x[i - 3];
  736.       s += a[4] * x[i - 4];
  737.       s += a[5] * x[i - 5];
  738.       s += a[6] * x[i - 6];
  739.       s += a[7] * x[i - 7];
  740.       s += a[8] * x[i - 8];
  741.       s += a[9] * x[i - 9];
  742.       s += a[10] * x[i - 10];
  743.       s += a[11] * x[i - 11];
  744.       s += a[12] * x[i - 12];
  745.       s += a[13] * x[i - 13];
  746.       s += a[14] * x[i - 14];
  747.       s += a[15] * x[i - 15];
  748.       s += a[16] * x[i - 16];
  749.       y[i] = s;
  750.    }
  751.    return;
  752. }
  753. /*
  754.  * E_UTIL_convolve
  755.  *
  756.  * Parameters:
  757.  *    x           I: input vector
  758.  *    h           I: impulse response (or second input vector) (Q15)
  759.  *    y           O: output vetor (result of convolution)
  760.  *
  761.  * Function:
  762.  *    Perform the convolution between two vectors x[] and h[] and
  763.  *    write the result in the vector y[]. All vectors are of length L.
  764.  *    Only the first L samples of the convolution are considered.
  765.  *    Vector size = L_SUBFR
  766.  *
  767.  * Returns:
  768.  *    void
  769.  */
  770. void E_UTIL_convolve(Word16 x[], Word16 q, Float32 h[], Float32 y[])
  771. {
  772.    Float32 fx[L_SUBFR];
  773.    Float32 temp, scale;
  774.    Word32 i, n;
  775.    scale = (Float32)pow(2, -q);
  776.    for (i = 0; i < L_SUBFR; i++)
  777.    {
  778.       fx[i] = (Float32)(scale * x[i]);
  779.    }
  780.    for (n = 0; n < L_SUBFR; n += 2)
  781.    {
  782.       temp = 0.0;
  783.       for (i = 0; i <= n; i++)
  784.       {
  785.          temp += (Float32)(fx[i] * h[n - i]);
  786.       }
  787.       y[n] = temp;
  788.       temp = 0.0;
  789.       for (i = 0; i <= (n + 1); i += 2)
  790.       {
  791.          temp += (Float32)(fx[i] * h[(n + 1) - i]);
  792.          temp += (Float32)(fx[i + 1] * h[n - i]);
  793.       }
  794.       y[n + 1] = temp;
  795.    }
  796.    return;
  797. }
  798. void E_UTIL_f_convolve(Float32 x[], Float32 h[], Float32 y[])
  799. {
  800.    Float32 temp;
  801.    Word32 i, n;
  802.    for (n = 0; n < L_SUBFR; n += 2)
  803.    {
  804.       temp = 0.0;
  805.       for (i = 0; i <= n; i++)
  806.       {
  807.          temp += x[i] * h[n - i];
  808.       }
  809.       y[n] = temp;
  810.       temp = 0.0;
  811.       for (i = 0; i <= (n + 1); i += 2)
  812.       {
  813.          temp += x[i] * h[(n + 1) - i];
  814.          temp += x[i + 1] * h[n - i];
  815.       }
  816.       y[n + 1] = temp;
  817.    }
  818.    return;
  819. }
  820. /*
  821.  * E_UTIL_signal_up_scale
  822.  *
  823.  * Parameters:
  824.  *    x         I/O: signal to scale
  825.  *    exp         I: exponent: x = round(x << exp)
  826.  *
  827.  * Function:
  828.  *    Scale signal up to get maximum of dynamic.
  829.  *
  830.  * Returns:
  831.  *    void
  832.  */
  833. void E_UTIL_signal_up_scale(Word16 x[], Word16 exp)
  834. {
  835.    Word32 i;
  836.    Word32  tmp;
  837.    for (i = 0; i < (PIT_MAX + L_INTERPOL + L_SUBFR); i++)
  838.    {
  839.       tmp = x[i] << exp;
  840.       x[i] = E_UTIL_saturate(tmp);
  841.    }
  842.    return;
  843. }
  844. /*
  845.  * E_UTIL_signal_down_scale
  846.  *
  847.  * Parameters:
  848.  *    x         I/O: signal to scale
  849.  *    lg          I: size of x[]
  850.  *    exp         I: exponent: x = round(x << exp)
  851.  *
  852.  * Function:
  853.  *    Scale signal up to get maximum of dynamic.
  854.  *
  855.  * Returns:
  856.  *    32 bit result
  857.  */
  858. void E_UTIL_signal_down_scale(Word16 x[], Word32 lg, Word16 exp)
  859. {
  860.    Word32 i, tmp;
  861.    for (i = 0; i < lg; i++)
  862.    {
  863.       tmp = x[i] << 16;
  864.       tmp = tmp >> exp;
  865.       x[i] = (Word16)((tmp + 0x8000) >> 16);
  866.    }
  867.    return;
  868. }
  869. /*
  870.  * E_UTIL_dot_product12
  871.  *
  872.  * Parameters:
  873.  *    x        I: 12bit x vector
  874.  *    y        I: 12bit y vector
  875.  *    lg       I: vector length (x*4)
  876.  *    exp      O: exponent of result (0..+30)
  877.  *
  878.  * Function:
  879.  *    Compute scalar product of <x[],y[]> using accumulator.
  880.  *    The result is normalized (in Q31) with exponent (0..30).
  881.  *
  882.  * Returns:
  883.  *    Q31 normalised result (1 < val <= -1)
  884.  */
  885. Word32 E_UTIL_dot_product12(Word16 x[], Word16 y[], Word32 lg, Word32 *exp)
  886. {
  887.    Word32 i, sft, L_sum, L_sum1, L_sum2, L_sum3, L_sum4;
  888.    L_sum1 = 0L;
  889.    L_sum2 = 0L;
  890.    L_sum3 = 0L;
  891.    L_sum4 = 0L;
  892.    for (i = 0; i < lg; i += 4)
  893.    {
  894.       L_sum1 += x[i] * y[i];
  895.       L_sum2 += x[i + 1] * y[i + 1];
  896.       L_sum3 += x[i + 2] * y[i + 2];
  897.       L_sum4 += x[i + 3] * y[i + 3];
  898.    }
  899.    L_sum1 = E_UTIL_saturate_31(L_sum1);
  900.    L_sum2 = E_UTIL_saturate_31(L_sum2);
  901.    L_sum3 = E_UTIL_saturate_31(L_sum3);
  902.    L_sum4 = E_UTIL_saturate_31(L_sum4);
  903.    L_sum1 += L_sum3;
  904.    L_sum2 += L_sum4;
  905.    L_sum1 = E_UTIL_saturate_31(L_sum1);
  906.    L_sum2 = E_UTIL_saturate_31(L_sum2);
  907.    L_sum = L_sum1 + L_sum2;
  908.    L_sum = (E_UTIL_saturate_31(L_sum) << 1) + 1;
  909.    /* Normalize acc in Q31 */
  910.    sft = E_UTIL_norm_l(L_sum);
  911.    L_sum = (L_sum << sft);
  912.    *exp = (30 - sft);  /* exponent = 0..30 */
  913.    return (L_sum);
  914. }
  915. /*
  916.  * E_UTIL_normalised_inverse_sqrt
  917.  *
  918.  * Parameters:
  919.  *    frac     I/O: (Q31) normalized value (1.0 < frac <= 0.5)
  920.  *    exp      I/O: exponent (value = frac x 2^exponent)
  921.  *
  922.  * Function:
  923.  *    Compute 1/sqrt(value).
  924.  *    If value is negative or zero, result is 1 (frac=7fffffff, exp=0).
  925.  *
  926.  *    The function 1/sqrt(value) is approximated by a table and linear
  927.  *    interpolation.
  928.  *    1. If exponant is odd then shift fraction right once.
  929.  *    2. exponant = -((exponant - 1) >> 1)
  930.  *    3. i = bit25 - b30 of fraction, 16 <= i <= 63 ->because of normalization.
  931.  *    4. a = bit10 - b24
  932.  *    5. i -= 16
  933.  *    6. fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2
  934.  *
  935.  * Returns:
  936.  *    void
  937.  */
  938. void E_UTIL_normalised_inverse_sqrt(Word32 *frac, Word16 *exp)
  939. {
  940.    Word32 i, a, tmp;
  941.    if (*frac <= (Word32) 0)
  942.    {
  943.       *exp = 0;
  944.       *frac = 0x7fffffffL;
  945.       return;
  946.    }
  947.    if ((Word16) (*exp & 1) == 1)  /* If exponant odd -> shift right */
  948.    {
  949.       *frac = (*frac >> 1);
  950.    }
  951.    *exp = (Word16)(-((*exp - 1) >> 1));
  952.    *frac = (*frac >> 9);
  953.    i = *frac >> 16;                    /* Extract b25-b31 */
  954.    *frac = (*frac >> 1);
  955.    a = (Word16)*frac;                  /* Extract b10-b24 */
  956.    a = a & 0x00007fff;
  957.    i = i - 16;
  958.    *frac = E_ROM_isqrt[i] << 16;                /* table[i] << 16         */
  959.    tmp = E_ROM_isqrt[i] - E_ROM_isqrt[i + 1];   /* table[i] - table[i+1]) */
  960.    *frac = *frac - ((tmp * a) << 1);            /* frac -=  tmp*a*2       */
  961.    return;
  962. }
  963. /*
  964.  * E_UTIL_enc_synthesis
  965.  *
  966.  * Parameters:
  967.  *    Aq             I: quantized Az
  968.  *    exc            I: excitation at 12kHz
  969.  *    synth16k       O: 16kHz synthesis signal
  970.  *    st           I/O: State structure
  971.  *
  972.  * Function:
  973.  *    Synthesis of signal at 16kHz with HF extension.
  974.  *
  975.  * Returns:
  976.  *    The quantised gain index when using the highest mode, otherwise zero
  977.  */
  978. Word32 E_UTIL_enc_synthesis(Float32 Aq[], Float32 exc[], Float32 synth16k[],
  979.                             Coder_State *st)
  980. {
  981.    Float32 synth[L_SUBFR];
  982.    Float32 HF[L_SUBFR16k];   /* High Frequency vector      */
  983.    Float32 Ap[M + 1];
  984.    Float32 HF_SP[L_SUBFR16k];   /* High Frequency vector (from original signal) */
  985.    Float32 HP_est_gain, HP_calc_gain, HP_corr_gain, fac, tmp, ener, dist_min;
  986.    Float32 dist, gain2;
  987.    Word32 i, hp_gain_ind = 0;
  988.    /*
  989.     * speech synthesis
  990.     * ----------------
  991.     * - Find synthesis speech corresponding to exc2[].
  992.     * - Perform fixed deemphasis and hp 50hz filtering.
  993.     * - Oversampling from 12.8kHz to 16kHz.
  994.     */
  995.    E_UTIL_synthesis(Aq, exc, synth, L_SUBFR, st->mem_syn2, 1);
  996.    E_UTIL_deemph(synth, PREEMPH_FAC, L_SUBFR, &(st->mem_deemph));
  997.    E_UTIL_hp50_12k8(synth, L_SUBFR, st->mem_sig_out);
  998.    /* Original speech signal as reference for high band gain quantisation */
  999.    memcpy(HF_SP, synth16k, L_SUBFR16k * sizeof(Float32));
  1000.    /*
  1001.     * HF noise synthesis
  1002.     * ------------------
  1003.     * - Generate HF noise between 6 and 7 kHz.
  1004.     * - Set energy of noise according to synthesis tilt.
  1005.     *     tilt > 0.8 ==> - 14 dB (voiced)
  1006.     *     tilt   0.5 ==> - 6 dB  (voiced or noise)
  1007.     *     tilt < 0.0 ==>   0 dB  (noise)
  1008.     */
  1009.    /* generate white noise vector */
  1010.    for(i = 0; i < L_SUBFR16k; i++)
  1011.    {
  1012.       HF[i] = (Float32)E_UTIL_random(&(st->mem_seed));
  1013.    }
  1014.    /* set energy of white noise to energy of excitation */
  1015.    ener = 0.01F;
  1016.    tmp = 0.01F;
  1017.    for(i = 0; i < L_SUBFR; i++)
  1018.    {
  1019.       ener += exc[i] * exc[i];
  1020.    }
  1021.    for(i = 0; i < L_SUBFR16k; i++)
  1022.    {
  1023.       tmp += HF[i] * HF[i];
  1024.    }
  1025.    tmp = (Float32)(sqrt(ener / tmp));
  1026.    for(i = 0; i < L_SUBFR16k; i++)
  1027.    {
  1028.       HF[i] *= tmp;
  1029.    }
  1030.    /* find tilt of synthesis speech (tilt: 1=voiced, -1=unvoiced) */
  1031.    E_UTIL_hp400_12k8(synth, L_SUBFR, st->mem_hp400);
  1032.    ener = 0.001f;
  1033.    tmp = 0.001f;
  1034.    for(i = 1; i < L_SUBFR; i++)
  1035.    {
  1036.       ener += synth[i] * synth[i];
  1037.       tmp += synth[i] * synth[i - 1];
  1038.    }
  1039.    fac = tmp / ener;
  1040.    /* modify energy of white noise according to synthesis tilt */
  1041.    HP_est_gain = 1.0F - fac;
  1042.    gain2 = (1.0F - fac) * 1.25F;
  1043.    if(st->mem_vad_hist)
  1044.    {
  1045.       HP_est_gain = gain2;
  1046.    }
  1047.    if(HP_est_gain < 0.1)
  1048.    {
  1049.       HP_est_gain = 0.1f;
  1050.    }
  1051.    if(HP_est_gain > 1.0)
  1052.    {
  1053.       HP_est_gain = 1.0f;
  1054.    }
  1055.    /* synthesis of noise: 4.8kHz..5.6kHz --> 6kHz..7kHz */
  1056.    E_LPC_a_weight(Aq, Ap, 0.6f, M);
  1057.    E_UTIL_synthesis(Ap, HF, HF, L_SUBFR16k, st->mem_syn_hf, 1);
  1058.    /* noise High Pass filtering (0.94ms of delay) */
  1059.    E_UTIL_bp_6k_7k(HF, L_SUBFR16k, st->mem_hf);
  1060.    /* noise High Pass filtering (0.94ms of delay) */
  1061.    E_UTIL_bp_6k_7k(HF_SP, L_SUBFR16k, st->mem_hf2);
  1062.    ener = 0.001F;
  1063.    tmp = 0.001F;
  1064.    for(i = 0; i < L_SUBFR16k; i++)
  1065.    {
  1066.       ener += HF_SP[i] * HF_SP[i];
  1067.       tmp += HF[i] * HF[i];
  1068.    }
  1069.    HP_calc_gain = (Float32)sqrt(ener /tmp);
  1070.    st->mem_gain_alpha *= st->dtx_encSt->mem_dtx_hangover_count / 7;
  1071.    if(st->dtx_encSt->mem_dtx_hangover_count > 6)
  1072.    {
  1073.       st->mem_gain_alpha = 1.0F;
  1074.    }
  1075.    HP_corr_gain = (HP_calc_gain * st->mem_gain_alpha) +
  1076.       ((1.0F - st->mem_gain_alpha) * HP_est_gain);
  1077.    /* Quantise the correction gain */
  1078.    dist_min = 100000.0F;
  1079.    for(i = 0; i < 16; i++)
  1080.    {
  1081.       dist = (HP_corr_gain - E_ROM_hp_gain[i]) * (HP_corr_gain - E_ROM_hp_gain[i]);
  1082.       if(dist_min > dist)
  1083.       {
  1084.          dist_min = dist;
  1085.          hp_gain_ind = i;
  1086.       }
  1087.    }
  1088.    HP_corr_gain = (Float32)E_ROM_hp_gain[hp_gain_ind];
  1089.    /* return the quantised gain index when using the highest mode, otherwise zero */
  1090.    return(hp_gain_ind);
  1091. }
  1092. /*
  1093.  * E_UTIL_autocorr
  1094.  *
  1095.  * Parameters:
  1096.  *    x           I: input signal
  1097.  *    r_h         O: autocorrelations
  1098.  *
  1099.  * Function:
  1100.  *    Compute the autocorrelations of windowed speech signal.
  1101.  *    order of LP filter is M. Window size is L_WINDOW.
  1102.  *    Analysis window is "window".
  1103.  *
  1104.  * Returns:
  1105.  *    void
  1106.  */
  1107. void E_UTIL_autocorr(Float32 *x, Float32 *r)
  1108. {
  1109.    Float32 t[L_WINDOW + M];
  1110.    Word32 i, j;
  1111.    for (i = 0; i < L_WINDOW; i += 4)
  1112.    {
  1113.       t[i] = x[i] * E_ROM_hamming_cos[i];
  1114.       t[i + 1] = x[i + 1] * E_ROM_hamming_cos[i + 1];
  1115.       t[i + 2] = x[i + 2] * E_ROM_hamming_cos[i + 2];
  1116.       t[i + 3] = x[i + 3] * E_ROM_hamming_cos[i + 3];
  1117.    }
  1118.    memset(&t[L_WINDOW], 0, M * sizeof(Float32));
  1119.    memset(r, 0, (M + 1) * sizeof(Float32));
  1120.    for (j = 0; j < L_WINDOW; j++)
  1121.    {
  1122.       r[0] += t[j] * t[j];
  1123.       r[1] += t[j] * t[j + 1];
  1124.       r[2] += t[j] * t[j + 2];
  1125.       r[3] += t[j] * t[j + 3];
  1126.       r[4] += t[j] * t[j + 4];
  1127.       r[5] += t[j] * t[j + 5];
  1128.       r[6] += t[j] * t[j + 6];
  1129.       r[7] += t[j] * t[j + 7];
  1130.       r[8] += t[j] * t[j + 8];
  1131.       r[9] += t[j] * t[j + 9];
  1132.       r[10] += t[j] * t[j + 10];
  1133.       r[11] += t[j] * t[j + 11];
  1134.       r[12] += t[j] * t[j + 12];
  1135.       r[13] += t[j] * t[j + 13];
  1136.       r[14] += t[j] * t[j + 14];
  1137.       r[15] += t[j] * t[j + 15];
  1138.       r[16] += t[j] * t[j + 16];
  1139.    }
  1140.    if (r[0] < 1.0F)
  1141.    {
  1142.       r[0] = 1.0F;
  1143.    }
  1144.    return;
  1145. }