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

语音压缩

开发平台:

C/C++

  1. /**************************************************************************
  2. *
  3. * ROUTINE
  4. * intanaly
  5. *
  6. * FUNCTION
  7. * Linearly interpolate between transmitted LSPs
  8. * to generate nn (=4) intermediate sets of LSP
  9. * frequencies for subframe analysis. 
  10. *
  11. *
  12. * SYNOPSIS
  13. * subroutine intanaly(lspnew, nn, lsp)
  14. *
  15. *   formal 
  16. *
  17. *                       data    I/O
  18. *       name            type    type    function
  19. *       -------------------------------------------------------------------
  20. * lspnew float i new frequency array
  21. * nn int i number of segments/frame
  22. * lsp float o interpolated frequency matrix
  23. *
  24. *   external 
  25. *                       data    I/O
  26. *       name            type    type    function
  27. *       -------------------------------------------------------------------
  28. * no int i
  29. * frame int i
  30. *
  31. ***************************************************************************
  32. *
  33. * DESCRIPTION
  34. * This routine linearly interpolates lsp's for analysis in
  35. * nn (=4) subframes.  This is a combination of inter- and 
  36. * intra-frame interpolation.  There are two routines, one for the 
  37. * analyzer and one for the synthesizer.
  38. *
  39. * The lsps are interpolated from two transmitted frames,
  40. *  old and new.  The lsp interpolation is calculated as follows:
  41. *
  42. * superframe:       old             new
  43. *
  44. * |              |           |
  45. * |---------------------|---------------------|
  46. * |              |           |
  47. *
  48. *                                      /
  49. *                                                        /
  50. *
  51. * subframe:         1       2        3        4
  52. *      |                  |
  53. *        ...---|--------|--------|--------|--------|
  54. *      |                  |
  55. *   v       v        v        v
  56. *
  57. * weighting:
  58. * old:     7/8      5/8      3/8      1/8
  59. * new:     1/8      3/8      5/8      7/8
  60. *
  61. * Note: This is dependent on nn = ll/l = 4!
  62. *
  63. ***************************************************************************
  64. *
  65. * CALLED BY
  66. *
  67. * celp
  68. *
  69. * CALLS
  70. *
  71. *
  72. *
  73. **************************************************************************/
  74. #define TRUE 1
  75. #define FALSE 0
  76. #include "ccsub.h"
  77. extern int no, frame;
  78. static float tempfreq, w[2][4] =   { 0.875, 0.625, 0.375, 0.125,  
  79.                                      0.125, 0.375, 0.625, 0.875};
  80. intanaly(lspnew, nn, lsp)
  81. int nn;
  82. float lspnew[], lsp[][MAXNO];
  83. {
  84.   int i, j, nonmono;
  85.   static float lspold[MAXNO] = {.03, .05, .09, .13, .19,                                           .23, .29, .33, .39, .44};
  86.   static float oldlsp[MAXNO];
  87.   for (i = 0; i < nn; i++)
  88.   /* *interpolate lsp's  */
  89.   {
  90.     for (j = 0; j < no; j++)
  91.       lsp[i][j] = w[0][i]*lspold[j] + w[1][i]*lspnew[j];
  92.     /* *OPTIONAL bug checker
  93.        *check for monotonically increasing lsp's
  94.        *swap crossed LSPs */
  95.   
  96.     for (j = 1; j < no; j++)
  97.     {
  98.       if (lsp[i][j] < lsp[i][j - 1])
  99.       {
  100.         printf("intanaly: Swapping nonmono lsps @ frame %dn", frame);
  101.         tempfreq = lsp[i][j];
  102.         lsp[i][j] = lsp[i][j - 1];
  103.         lsp[i][j - 1] = tempfreq;
  104.       }
  105.     }
  106.     /* *recheck for monotonically increasing lsp's
  107.        *substitute old LSPs (they must be really messed up!) */
  108.   
  109.     nonmono = FALSE;
  110.     for (j = 1; j < no; j++)
  111.     {
  112.       if (lsp[i][j] < lsp[i][j - 1]) 
  113.         nonmono = TRUE;
  114.     }
  115.     if (nonmono)
  116.     {
  117.       printf("intanaly: Resetting interp LSP at frame %dn", frame);
  118.       for (j = 0; j < no; j++)
  119.       {
  120.         if (i == 0)
  121.           lsp[i][j] = oldlsp[j];
  122.         else
  123.           lsp[i][j] = lsp[i - 1][j];
  124.       }
  125.     }
  126.   }
  127.   
  128.   /* *save lsp's for next pass */
  129.   
  130.   for (j = 0; j < no; j++)
  131.   {
  132.     lspold[j] = lspnew[j];
  133.     oldlsp[j] = lsp[nn][j];
  134.   }
  135. }