log2.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*
  2. ********************************************************************************
  3. *
  4. * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001
  5. * R99 Version 3.3.0
  6. * REL-4 Version 4.1.0
  7. *
  8. ********************************************************************************
  9. *
  10. * File : log2.c
  11. * Purpose : Computes log2(L_x)
  12. *
  13. ********************************************************************************
  14. */
  15. /*
  16. ********************************************************************************
  17. * MODULE INCLUDE FILE AND VERSION ID
  18. ********************************************************************************
  19. */
  20. #include "log2.h"
  21. const char log2_id[] = "@(#)$Id $" log2_h;
  22. /*
  23. ********************************************************************************
  24. * INCLUDE FILES
  25. ********************************************************************************
  26. */
  27. #include "typedef.h"
  28. #include "basic_op.h"
  29. #include "count.h"
  30. /*
  31. ********************************************************************************
  32. * LOCAL VARIABLES AND TABLES
  33. ********************************************************************************
  34. */
  35. #include "log2.tab" /* Table for Log2() */
  36. /*
  37. ********************************************************************************
  38. * PUBLIC PROGRAM CODE
  39. ********************************************************************************
  40. */
  41. /*************************************************************************
  42. *
  43. * FUNCTION: Log2_norm()
  44. *
  45. * PURPOSE: Computes log2(L_x, exp), where L_x is positive and
  46. * normalized, and exp is the normalisation exponent
  47. * If L_x is negative or zero, the result is 0.
  48. *
  49. * DESCRIPTION:
  50. * The function Log2(L_x) is approximated by a table and linear
  51. * interpolation. The following steps are used to compute Log2(L_x)
  52. *
  53. * 1- exponent = 30-norm_exponent
  54. * 2- i = bit25-b31 of L_x; 32<=i<=63 (because of normalization).
  55. * 3- a = bit10-b24
  56. * 4- i -=32
  57. * 5- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2
  58. *
  59. *************************************************************************/
  60. void Log2_norm (
  61. Word32 L_x, /* (i) : input value (normalized) */
  62. Word16 exp, /* (i) : norm_l_ex (L_x) */
  63. Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */
  64. Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */
  65. )
  66. {
  67. Word16 i, a, tmp;
  68. Word32 L_y;
  69. test ();
  70. if (L_x <= (Word32) 0)
  71. {
  72. *exponent = 0; move16 ();
  73. *fraction = 0; move16 ();
  74. return;
  75. }
  76. *exponent = sub_ex (30, exp); move16 ();
  77. L_x = L_shr_ex (L_x, 9);
  78. i = extract_h_ex (L_x); /* Extract b25-b31 */
  79. L_x = L_shr_ex (L_x, 1);
  80. a = extract_l_ex (L_x); /* Extract b10-b24 of fraction */
  81. a = a & (Word16) 0x7fff; logic16 ();
  82. i = sub_ex (i, 32);
  83. L_y = L_deposit_h_ex (table[i]); /* table[i] << 16 */
  84. tmp = sub_ex (table[i], table[i + 1]); /* table[i] - table[i+1] */
  85. L_y = L_msu_ex (L_y, tmp, a); /* L_y -= tmp*a*2 */
  86. *fraction = extract_h_ex (L_y);move16 ();
  87. return;
  88. }
  89. /*************************************************************************
  90. *
  91. * FUNCTION: Log2()
  92. *
  93. * PURPOSE: Computes log2(L_x), where L_x is positive.
  94. * If L_x is negative or zero, the result is 0.
  95. *
  96. * DESCRIPTION:
  97. * normalizes L_x and then calls Log2_norm().
  98. *
  99. *************************************************************************/
  100. void Log2 (
  101. Word32 L_x, /* (i) : input value */
  102. Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */
  103. Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */
  104. )
  105. {
  106. Word16 exp;
  107. exp = norm_l_ex (L_x);
  108. Log2_norm (L_shl_ex (L_x, exp), exp, exponent, fraction);
  109. }