pctolsp3.c
上传用户:tsjrly
上传日期:2021-02-19
资源大小:107k
文件大小:8k
源码类别:

语音压缩

开发平台:

C/C++

  1. /**************************************************************************
  2. *
  3. * ROUTINE
  4. *               pctolsp3
  5. *
  6. * FUNCTION
  7. *
  8. * compute LSP from predictor polynomial and quantize it
  9. *
  10. * SYNOPSIS
  11. *               subroutine pctolsp3(a, freq, bits, findex)
  12. *
  13. *   formal
  14. *
  15. *                       data    I/O
  16. *       name            type    type    function
  17. *       -------------------------------------------------------------------
  18. * a float i a-polynomial a(0)=1
  19. *       freq float i/o lsp frequency array/
  20. * output quantized frequency array
  21. * bits int i bit allocation
  22. * findex int o frequency index array
  23. *
  24. *
  25. ***************************************************************************
  26. *
  27. * DESCRIPTION
  28. *
  29. *  Compte the LSPs using Chebyshev polynomials and then quantize.
  30. *
  31. * Taken from code written by Lionel Wolovitz, PSION PLC
  32. *
  33. ***************************************************************************
  34. *
  35. * CALLED BY
  36. *
  37. * celp
  38. *
  39. * CALLS
  40. *
  41. *
  42. **************************************************************************
  43. *
  44. * REFRENCES
  45. *
  46. * Peter Kabal and Ravi Prakash Ramachandran, "The Computation of 
  47. * Line Spectral Frequencies Using Chebyshev Polynomials," IEEE 
  48. * Transactions on Acoustics, Speech, and Signal Processing, 
  49. * Vol. ASSP-34, No. 6, December 1986
  50. *
  51. **************************************************************************/
  52. #include <math.h>
  53. #include "ccsub.h"
  54. /* Extracts of code to do LSP root finding from predictor coefficients, and
  55.    to convert back from roots to predictor coefficients.  */
  56. static float lsp[MAXNO][16] =
  57. {
  58.   {0.01250000,   0.02125000,   0.02812500,   0.03125000,
  59.    0.03500000,   0.04250000,   0.05250000,   0.06250000},
  60.   {0.02625000,   0.02937500,   0.03312500,   0.03687500,
  61.    0.04062500,   0.04500000,   0.05000000,   0.05500000,
  62.    0.06000000,   0.06500000,   0.07000000,   0.07625000,
  63.    0.08375000,   0.09250000,   0.10125000,   0.11000000},
  64.   {0.05250000,   0.05750000,   0.06250000,   0.06750000,
  65.    0.07312500,   0.08000000,   0.08812500,   0.09687500,
  66.    0.10625000,   0.11875000,   0.13125000,   0.14375000,
  67.    0.15625000,   0.16875000,   0.18125000,   0.19375000},
  68.   {0.07750000,   0.08250000,   0.09000000,   0.09937500,
  69.    0.11000000,   0.12125000,   0.13500000,   0.14625000,
  70.    0.15875000,   0.17125000,   0.18375000,   0.19625000,
  71.    0.20875000,   0.22125000,   0.23375000,   0.24625000},
  72.   {0.12500000,   0.13125000,   0.14125000,   0.15125000,
  73.    0.16062500,   0.16875000,   0.17875000,   0.18875000,
  74.    0.19875000,   0.20875000,   0.21875000,   0.23125000,
  75.    0.24375000,   0.25625000,   0.26875000,   0.28125000},
  76.   {0.18375000,   0.19625000,   0.21125000,   0.22875000,
  77.    0.25000000,   0.27500000,   0.30000000,   0.32500000},
  78.   {0.22500000,   0.23500000,   0.24500000,   0.26250000,
  79.    0.28750000,   0.31000000,   0.33750000,   0.36250000},
  80.   {0.27812500,   0.30000000,   0.31562500,   0.33125000,
  81.    0.35000000,   0.36875000,   0.39375000,   0.41875000},
  82.   {0.34500000,   0.36000000,   0.37500000,   0.38750000,
  83.    0.40000000,   0.41375000,   0.42875000,   0.44375000},
  84.   {0.39875000,   0.40875000,   0.41875000,   0.42750000,
  85.    0.43625000,   0.44875000,   0.46375000,   0.47875000}
  86. };
  87. static float table[MAXNO][17] =
  88. {
  89.   { 0.99691746,    0.99110012,    0.98442723,    0.98078609,
  90.     0.97591778,    0.96455891,    0.94608763,    0.92388272,
  91.    -2.00000000,   -2.00000000,   -2.00000000,   -2.00000000,
  92.    -2.00000000,   -2.00000000,   -2.00000000,   -2.00000000,   -2.0},
  93.   { 0.98642983,    0.98301624,    0.97841983,    0.97328029,
  94.     0.96760046,    0.96029536,    0.95105858,    0.94088325,
  95.     0.92977943,    0.91775807,    0.90483103,    0.88741813,
  96.     0.86471905,    0.83581413,    0.80438365,    0.77052259,   -2.0},
  97.   { 0.94608763,    0.93544674,    0.92388272,    0.91140698,
  98.     0.89629734,    0.87631182,    0.85058793,    0.82040883,
  99.     0.78532570,    0.73433325,    0.67881359,    0.61910900,
  100.     0.55558755,    0.48864087,    0.41868168,    0.34614129,   -2.0},
  101.   { 0.88377046,    0.86863696,    0.84433435,    0.81132672,
  102.     0.77052259,    0.72358094,    0.66132536,    0.60669785,
  103.     0.54245932,    0.47487648,    0.40436600,    0.33136257,
  104.     0.25631627,    0.17968976,    0.10195545,    0.02359258,   -2.0},
  105.   { 0.70711856,    0.67881359,    0.63136740,    0.58142959,
  106.     0.53252513,    0.48864087,    0.43289406,    0.37543889,
  107.     0.31650210,    0.25631627,    0.19511892,    0.11756801,
  108.     0.03929228,   -0.03922568,   -0.11750182,   -0.19505355,   -2.0},
  109.   { 0.40436600,    0.33136257,    0.24110239,    0.13315156,
  110.     0.00003333,   -0.15639826,   -0.30897896,   -0.45395190,
  111.    -2.00000000,   -2.00000000,   -2.00000000,   -2.00000000,
  112.    -2.00000000,   -2.00000000,   -2.00000000,   -2.00000000,   -2.0},
  113.   { 0.15646409,    0.09413950,    0.03144340,   -0.07842421,
  114.    -0.23340810,   -0.36808613,   -0.52246020,   -0.64941130,
  115.    -2.00000000,   -2.00000000,   -2.00000000,   -2.00000000,
  116.    -2.00000000,   -2.00000000,   -2.00000000,   -2.00000000,   -2.0},
  117.   {-0.17575978,   -0.30897896,   -0.40071028,   -0.48858271,
  118.    -0.58774750,   -0.67876465,   -0.78528443,   -0.87246873,
  119.    -2.00000000,   -2.00000000,   -2.00000000,   -2.00000000,
  120.    -2.00000000,   -2.00000000,   -2.00000000,   -2.00000000,   -2.0},
  121.   {-0.56204534,   -0.63738701,   -0.70707143,   -0.76037242,
  122.    -0.80898565,   -0.85668907,   -0.90143037,   -0.93817086,
  123.    -2.00000000,   -2.00000000,   -2.00000000,   -2.00000000,
  124.    -2.00000000,   -2.00000000,   -2.00000000,   -2.00000000,   -2.0},
  125.   {-0.80434405,   -0.84006400,   -0.87246873,   -0.89800250,
  126.    -0.92082280,   -0.94858126,   -0.97415943,   -0.99109125,
  127.    -2.00000000,   -2.00000000,   -2.00000000,   -2.00000000,
  128.    -2.00000000,   -2.00000000,   -2.00000000,   -2.00000000,   -2.0}
  129. };
  130. pctolsp3(a, freq, sbits, findex)
  131. int *findex, *sbits;
  132. float *a, *freq;
  133. {
  134.   register int index;
  135.   int *f, *s;
  136.   float prev1, prev2;
  137.   float *r, *x3, *x4, temp, temp0, temp1, temp2;
  138.   float q[6], p[6];
  139.   q[1] = a[1] + a[10] - 1.0;
  140.   q[2] = a[2] + a[9] - q[1];
  141.   q[3] = a[3] + a[8] - q[2];
  142.   q[4] = a[4] + a[7] - q[3];
  143.   q[5] = a[5] + a[6] - q[4];
  144.   q[5] /= 2.0;
  145.   p[1] = a[1] - a[10] + 1.0;
  146.   p[2] = a[2] - a[9] + p[1];
  147.   p[3] = a[3] - a[8] + p[2];
  148.   p[4] = a[4] - a[7] + p[3];
  149.   p[5] = a[5] - a[6] + p[4];
  150.   p[5] /= 2.0;
  151.   prev1 = 9e9;
  152.   prev2 = 9e9;
  153.   x3 = (&table[0][0]);
  154.   x4 = (&lsp[0][0]);
  155.   r = (&freq[0]);
  156.   s = (&sbits[0]);
  157.   f = (&findex[0]);
  158.   index = 0;
  159.   for (;;)
  160.   {
  161.     for (;;)
  162.     {
  163.       /* evaluate sum polynomial (5 adds, 4 subs, 4 muls) */
  164.       temp = (x3[index]);
  165.       temp1 = 2.0*temp               + q[1];
  166.       temp2 = 2.0*temp*temp1 - 1.0   + q[2];
  167.       temp0 = 2.0*temp*temp2 - temp1 + q[3];
  168.       temp1 = 2.0*temp*temp0 - temp2 + q[4];
  169.       temp2 =     temp*temp1 - temp0 + q[5];
  170.       /* look for sign change */
  171.       if ((temp2*prev1) < 0.0 || index+1 == 1<<*s)
  172.       {
  173.         if (fabs(temp2) < fabs(prev1))
  174.           (*r++) = (x4[index]);
  175.         else
  176.           (*r++) = (x4[--index]);
  177.         if (prev1 < 0.0)
  178.           prev1 = 9e9;
  179.         else
  180.           prev1 = (-9e9);
  181.         *f++ = index;
  182.         if (r < (&freq[10]))
  183.         {
  184.           x3 += 17;
  185.           x4 += 16;
  186.           s++;
  187.           index = 0;
  188.           while (x4[index] < *(r-1)) index++;
  189.           break;
  190.         }
  191.         else
  192.           return;
  193.       }
  194.       prev1 = temp2;
  195.       index++;
  196.     }
  197.     for (;;)
  198.     {
  199.       /* evaluate sum polynomial (5 adds, 4 subs, 4 muls) */
  200.       temp = (x3[index]);
  201.       temp1 = 2.0*temp               + p[1];
  202.       temp2 = 2.0*temp*temp1 - 1.0   + p[2];
  203.       temp0 = 2.0*temp*temp2 - temp1 + p[3];
  204.       temp1 = 2.0*temp*temp0 - temp2 + p[4];
  205.       temp2 =     temp*temp1 - temp0 + p[5];
  206.       /* look for sign change */
  207.       if ((temp2*prev2) < 0.0 || index+1 == 1<<*s)
  208.       {
  209.         if (fabs(temp2) < fabs(prev2))
  210.           (*r++) = (x4[index]);
  211.         else
  212.           (*r++) = (x4[--index]);
  213.         if (prev2 < 0.0)
  214.           prev2 = 9e9;
  215.         else
  216.           prev2 = (-9e9);
  217.         *f++ = index;
  218.         if (r < (&freq[10]))
  219.         {
  220.           x3 += 17;
  221.           x4 += 16;
  222.           s++;
  223.           index = 0;
  224.           while (x4[index] < *(r-1)) index++;
  225.           break;
  226.         }
  227.         else
  228.           return;
  229.       }
  230.       prev2 = temp2;
  231.       index++;
  232.     }
  233.   }
  234. }