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

语音压缩

开发平台:

C/C++

  1. /**************************************************************************
  2. *
  3. * ROUTINE
  4. * intsynth
  5. *
  6. * FUNCTION
  7. * Linearly interpolate between transmitted LSPs
  8. * to generate nn (=4) intermediate sets of LSP
  9. * frequencies for subframe synthesis. 
  10. *
  11. *
  12. * SYNOPSIS
  13. * subroutine intsynth(lspnew, nn, lsp, twoerror, syndavg)
  14. *
  15. *   formal 
  16. *
  17. *                       data    I/O
  18. *       name            type    type    function
  19. *       -------------------------------------------------------------------
  20. * lspnew float i/o new frequency array
  21. * nn int i number of segments/frame
  22. * lsp float o interpolated frequency matrix
  23. * twoerror int i flag for occurrence of two errors
  24. *   in Hamming protected bits.
  25. * syndavg float i bit error estimation parameter
  26. *
  27. *   external 
  28. *                       data    I/O
  29. *       name            type    type    function
  30. *       -------------------------------------------------------------------
  31. * no int i
  32. * frame int i
  33. *
  34. ***************************************************************************
  35. *
  36. * DESCRIPTION
  37. * This routine interpolates lsp's for subframe synthesis.
  38. * This version is only for use with absolute scalar LSP coding!
  39. * The interpolated LSPs are identical to the interpolated set in the
  40. * transmitter provided there are no transmission errors.  If the 
  41. * LSP's are nonmonotonic, then LSP errors have occured and an 
  42. * attempt is made to "fix" them by repeating previous LSP values. 
  43. * If this correction fails (the vector is still nonomonotonic),
  44. * then the entire previous LSP vector is repeated.  (This version
  45. *       ignores twoerror and syndavg.)
  46. *
  47. *
  48. ***************************************************************************
  49. *
  50. * CALLED BY
  51. *
  52. * celp
  53. *
  54. * CALLS
  55. *
  56. * lsptopc  rctopc
  57. *
  58. **************************************************************************/
  59. #define TRUE 1
  60. #define FALSE 0
  61. #include "ccsub.h"
  62. extern int no, frame;
  63. intsynth(lspnew, nn, lsp, twoerror, syndavg)
  64. int nn, twoerror;
  65. float lspnew[], lsp[][MAXNO], syndavg;
  66. {
  67.   int i, j, nonmono;
  68.   float temp[MAXNO+1], rc[MAXNO], dlsp[MAXNO + 1];
  69.   static float w[2][4] =   
  70.   {
  71.     0.875, 0.625, 0.375, 0.125,  
  72.     0.125, 0.375, 0.625, 0.875
  73.   };
  74.   static float lspold[MAXNO] =
  75.   {
  76.     .03, .05, .09, .13, .19, 
  77.     .23, .29, .33, .39, .44
  78.   };
  79.   /* *try to fix any nonmonotonic LSPs by repeating pair  */
  80.   for (i = 1; i < no; i++)
  81.   {
  82.     if (lspnew[i] <= lspnew[i - 1])
  83.     {
  84.       printf("intsynth: try to fix any nonmonotonic LSPsn");
  85.       lspnew[i] = lspold[i];
  86.       lspnew[i - 1] = lspold[i - 1];
  87.     }
  88.   }
  89.   /* *check fixed LSPs (also check for pairs too close?)  */
  90.   nonmono = FALSE;
  91.   for (i = 1; i < no; i++)
  92.   {
  93.     if (lspnew[i] <= lspnew[i - 1])
  94.       nonmono = TRUE;
  95.   }
  96.   /* *if fix fails, repeat entire LSP vector  */
  97.   if (nonmono)
  98.   {
  99.     printf("intsynth: repeat entire LSP vectorn");
  100.     printf("intsynth: syndavg = %f  twoerror = %d  frame = %dn",
  101.    syndavg, twoerror, frame);
  102.     printf("lspold          lspnewn");
  103.     for (i = 0; i < no; i++)
  104.     {
  105.       printf("%-14f %-14f n", lspold[i], lspnew[i]);
  106.       lspnew[i] = lspold[i];
  107.     }
  108.   }
  109.   /* *OPTIONAl (and not finished):  */
  110.   /* *if large prediction gain then repeat close LSP pair  */
  111.   lsptopc(lspnew, temp);
  112.   pctorc(temp, rc, no);
  113.   for (i = 1; i < no; i++)
  114.   {
  115.     dlsp[i] = lspnew[i] - lspnew[i - 1];
  116.   }
  117.   dlsp[no] = 0.5 - lspnew[no - 1];
  118.   /* *interpolate lsp's  */
  119.   for (i = 0; i < nn; i++)
  120.   {
  121.     for (j = 0; j < no; j++)
  122.       lsp[i][j] = w[0][i] * lspold[j] + w[1][i] * lspnew[j];
  123.     /* *OPTIONAL bug checker  */
  124.     /* *check for monotonically increasing lsp's  */
  125.     nonmono = FALSE;
  126.     for (j = 1; j < no; j++)
  127.     {
  128.       if (lsp[i][j] <= lsp[i][j - 1])
  129. nonmono = TRUE;
  130.     }
  131.     if (nonmono)
  132.     {
  133.       printf("intsynth: nonmono LSPs @ frame %d CAN'T HAPPENn",
  134.      frame);
  135.       printf("intsynth: LSPs=");
  136.       for (j = 0; j < no; j++)
  137. printf("  %f", lsp[i][j]);
  138.       printf("n");
  139.     }
  140.   }
  141.   /*  *update lsp history  */
  142.   for (i = 0; i < no; i++)
  143.     lspold[i] = lspnew[i];
  144. }