ldelay.c
上传用户:szhypcb168
上传日期:2007-01-06
资源大小:2187k
文件大小:3k
源码类别:

语音压缩

开发平台:

Unix_Linux

  1. #define NFRAC 5
  2. #define TRUE 1
  3. #define FALSE 0
  4. #define M1 -20
  5. #define M2  19
  6. /* five fractional delays calculated over a 40 point interpolation  */
  7. /* (-20 to 19) */
  8. static float frac[NFRAC] = {0.25, 0.33333333, 0.5, 0.66666667, 0.75};
  9. static int twelfths[NFRAC] = {3, 4, 6, 8, 9};
  10.  
  11. /**************************************************************************
  12. *
  13. * NAME
  14. * ldelay
  15. *
  16. * FUNCTION
  17. * Time delay a bandlimited signal
  18. * using point-by-point recursion
  19. * with a long interpolation filter (see delay.c)
  20. *
  21. * SYNOPSIS
  22. * subroutine ldelay(x, start, n, d, m, y)
  23. *
  24. *   formal 
  25. *                       data    I/O
  26. *       name            type    type    function
  27. *       -------------------------------------------------------------------
  28. * x[n] float i signal input (output in last 60)
  29. * start int i beginning of output sequence
  30. * n int i length of input sequence
  31. * d float i fractional pitch
  32. * m int i integer pitch
  33. * y[n] float o delayed input signal
  34. *
  35. ***************************************************************************
  36. *
  37. * DESCRIPTION
  38. *
  39. * Subroutine to time delay a bandlimited signal by resampling the
  40. * reconstructed data (aka sinc interpolation).  The well known
  41. * reconstruction formula is:
  42. *
  43. *              |    M2      sin[pi(t-nT)/T]    M2
  44. *   y(n) = X(t)| = SUM x(n) --------------- = SUM x(n) sinc[(t-nT)/T]
  45. *              |   n=M1         pi(t-nT)/T    n=M1
  46. *              |t=n+d
  47. *
  48. * The interpolating (sinc) function is Hamming windowed to bandlimit
  49. * the signal to reduce aliasing.
  50. *
  51. * Multiple simultaneous time delays may be efficiently calculated
  52. * by polyphase filtering.  Polyphase filters decimate the unused
  53. * filter coefficients.  See Chapter 6 in C&R for details. 
  54. *
  55. ***************************************************************************
  56. *
  57. * CALLED BY
  58. *
  59. * pitchvq   psearch
  60. *
  61. * CALLS
  62. *
  63. * ham
  64. *
  65. ***************************************************************************
  66. *
  67. * REFERENCES
  68. *
  69. * Crochiere & Rabiner, Multirate Digital Signal Processing,
  70. * P-H 1983, Chapters 2 and 6.
  71. *
  72. *
  73. * Kroon & Atal, "Pitch Predictors with High Temporal Resolution,"
  74. * ICASSP '90, S12.6
  75. *
  76. **************************************************************************/
  77. #define SIZE (M2 - M1 + 1)
  78. ldelay(x, start, n, d, m, y)
  79. float x[], d, y[];
  80. int m, n, start;
  81. {
  82.   static float wsinc[SIZE][NFRAC], hwin[12*SIZE+1];
  83.   static int first = TRUE;
  84.   int i, j, k, index, qd();
  85.   float sinc();
  86.   /* Generate Hamming windowed sinc interpolating function for each */
  87.   /* allowable fraction.  The interpolating functions are stored in   */
  88.   /* time reverse order (i.e., delay appears as advance) to align     */
  89.   /* with the adaptive code book v0 array.  The interp filters are:   */
  90.   /*  wsinc[.,0] frac = 1/4 (3/12)       */
  91.   /*  wsinc[.,1] frac = 1/3 (4/12)       */
  92.   /*  . .       */
  93.   /*  wsinc[.,4] frac = 3/4 (9/12)       */
  94.   if (first)
  95.   {
  96.     ham(hwin, 12*SIZE+1);
  97.     for (i = 0; i < NFRAC; i++)
  98.       for (k = M1, j = 0; j < SIZE; j++)
  99.       {
  100.         wsinc[j][i] = sinc(frac[i] + k) * hwin[12*j+twelfths[i]];
  101.         k++;
  102.       }
  103.     first = FALSE;
  104.   }
  105.   index = qd(d);
  106.   /* *Resample:  */
  107.   for (i = 0; i < n; i++)
  108.   {
  109.     x[start+i-1] = 0.0;
  110.     for (k = M1, j = 0; j < SIZE; j++)
  111.     {
  112.       x[start+i-1] += x[start-m+i+k-1] * wsinc[j][index];
  113.       k++;
  114.     }
  115.   }
  116.   /* *The v0 array in psearch.c/pgain.c must be zero above "start" */
  117.   /* *because of overlap and add convolution techniques used in pgain. */
  118.   for (i = 0; i < n; i++)
  119.   {
  120.     y[i] = x[start+i-1];
  121.     x[start+i-1] = 0.0;
  122.   }
  123. }