tbdm.c
上传用户:zslianheng
上传日期:2013-04-03
资源大小:946k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

Visual C++

  1. /*
  2. $Log: tbdm.c,v $
  3. Revision 1.1.1.1  2002/07/28 05:23:47  freeman_yong
  4. lpc10 codec
  5.  * Revision 1.1  1996/08/19  22:30:26  jaf
  6.  * Initial revision
  7.  *
  8. */
  9. #ifdef P_R_O_T_O_T_Y_P_E_S
  10. extern int tbdm_(real *speech, integer *lpita, integer *tau, integer *ltau, real *amdf, integer *minptr, integer *maxptr, integer *mintau);
  11. /*:ref: difmag_ 14 8 6 4 4 4 4 6 4 4 */
  12. #endif
  13. /*  -- translated by f2c (version 19951025).
  14.    You must link the resulting object file with the libraries:
  15. -lf2c -lm   (in that order)
  16. */
  17. #include "f2c.h"
  18. /* ********************************************************************** */
  19. /*  TBDM Version 49 */
  20. /* $Log: tbdm.c,v $
  21. /* Revision 1.1.1.1  2002/07/28 05:23:47  freeman_yong
  22. /* lpc10 codec
  23. /*
  24.  * Revision 1.1  1996/08/19  22:30:26  jaf
  25.  * Initial revision
  26.  * */
  27. /* Revision 1.3  1996/03/18  22:14:00  jaf */
  28. /* Just added a few comments about which array indices of the arguments */
  29. /* are used, and mentioning that this subroutine has no local state. */
  30. /* Revision 1.2  1996/03/13  14:48:37  jaf */
  31. /* Comments added explaining that none of the local variables of this */
  32. /* subroutine need to be saved from one invocation to the next. */
  33. /* Revision 1.1  1996/02/07 14:49:54  jaf */
  34. /* Initial revision */
  35. /* ********************************************************************* */
  36. /*TURBO DIFMAG: Compute High Resolution Average Magnitude Difference Function
  37. */
  38. /* Note: There are several constants in here that appear to depend on a */
  39. /* particular TAU table.  That's not a problem for the LPC10 coder, but */
  40. /* watch out if you change the contents of TAU in the subroutine ANALYS. */
  41. /* Input: */
  42. /*  SPEECH - Low pass filtered speech */
  43. /*           Indices 1 through MAX+LPITA-1 are read, where: */
  44. /*           MAX = (TAU(LTAU)-TAU(1))/2+1 */
  45. /*           (If TAU(1) .LT. 39, then larger indices could be read */
  46. /*           by the last call to DIFMAG below.) */
  47. /*  LPITA  - Length of speech buffer */
  48. /*  TAU    - Table of lags, sorted in increasing order. */
  49. /*           Indices 1 through LTAU read. */
  50. /*  LTAU   - Number of lag values to compute */
  51. /* Output: */
  52. /*  AMDF   - Average Magnitude Difference for each lag in TAU */
  53. /*          Indices 1 through LTAU written, and several might then be read.*/
  54. /*  MINPTR - Index of minimum AMDF value */
  55. /*  MAXPTR - Index of maximum AMDF value within +/- 1/2 octave of min */
  56. /*  MINTAU - Lag corresponding to minimum AMDF value */
  57. /* This subroutine has no local state. */
  58. /* Subroutine */ int tbdm_(real *speech, integer *lpita, integer *tau, 
  59. integer *ltau, real *amdf, integer *minptr, integer *maxptr, integer *
  60. mintau)
  61. {
  62.     /* System generated locals */
  63.     integer i__1, i__2, i__3, i__4;
  64.     /* Local variables */
  65.     real amdf2[6];
  66.     integer minp2, ltau2, maxp2, i__;
  67.     extern /* Subroutine */ int difmag_(real *, integer *, integer *, integer 
  68.     *, integer *, real *, integer *, integer *);
  69.     integer minamd, ptr, tau2[6];
  70. /*  Arguments */
  71. /*  REAL SPEECH(LPITA+TAU(LTAU)), AMDF(LTAU) */
  72. /*   Stupid TOAST doesn't understand expressions */
  73. /*       Local variables that need not be saved */
  74. /*       Local state */
  75. /*       None */
  76. /*   Compute full AMDF using log spaced lags, find coarse minimum */
  77.     /* Parameter adjustments */
  78.     --speech;
  79.     --amdf;
  80.     --tau;
  81.     /* Function Body */
  82.     difmag_(&speech[1], lpita, &tau[1], ltau, &tau[*ltau], &amdf[1], minptr, 
  83.     maxptr);
  84.     *mintau = tau[*minptr];
  85.     minamd = amdf[*minptr];
  86. /*   Build table containing all lags within +/- 3 of the AMDF minimum */
  87. /*    excluding all that have already been computed */
  88.     ltau2 = 0;
  89.     ptr = *minptr - 2;
  90. /* Computing MAX */
  91.     i__1 = *mintau - 3;
  92. /* Computing MIN */
  93.     i__3 = *mintau + 3, i__4 = tau[*ltau] - 1;
  94.     i__2 = min(i__3,i__4);
  95.     for (i__ = max(i__1,41); i__ <= i__2; ++i__) {
  96. while(tau[ptr] < i__) {
  97.     ++ptr;
  98. }
  99. if (tau[ptr] != i__) {
  100.     ++ltau2;
  101.     tau2[ltau2 - 1] = i__;
  102. }
  103.     }
  104. /*   Compute AMDF of the new lags, if there are any, and choose one */
  105. /*    if it is better than the coarse minimum */
  106.     if (ltau2 > 0) {
  107. difmag_(&speech[1], lpita, tau2, &ltau2, &tau[*ltau], amdf2, &minp2, &
  108. maxp2);
  109. if (amdf2[minp2 - 1] < (real) minamd) {
  110.     *mintau = tau2[minp2 - 1];
  111.     minamd = amdf2[minp2 - 1];
  112. }
  113.     }
  114. /*   Check one octave up, if there are any lags not yet computed */
  115.     if (*mintau >= 80) {
  116. i__ = *mintau / 2;
  117. if ((i__ & 1) == 0) {
  118.     ltau2 = 2;
  119.     tau2[0] = i__ - 1;
  120.     tau2[1] = i__ + 1;
  121. } else {
  122.     ltau2 = 1;
  123.     tau2[0] = i__;
  124. }
  125. difmag_(&speech[1], lpita, tau2, &ltau2, &tau[*ltau], amdf2, &minp2, &
  126. maxp2);
  127. if (amdf2[minp2 - 1] < (real) minamd) {
  128.     *mintau = tau2[minp2 - 1];
  129.     minamd = amdf2[minp2 - 1];
  130.     *minptr += -20;
  131. }
  132.     }
  133. /*   Force minimum of the AMDF array to the high resolution minimum */
  134.     amdf[*minptr] = (real) minamd;
  135. /*   Find maximum of AMDF within 1/2 octave of minimum */
  136. /* Computing MAX */
  137.     i__2 = *minptr - 5;
  138.     *maxptr = max(i__2,1);
  139. /* Computing MIN */
  140.     i__1 = *minptr + 5;
  141.     i__2 = min(i__1,*ltau);
  142.     for (i__ = *maxptr + 1; i__ <= i__2; ++i__) {
  143. if (amdf[i__] > amdf[*maxptr]) {
  144.     *maxptr = i__;
  145. }
  146.     }
  147.     return 0;
  148. } /* tbdm_ */