add.c
上传用户:shw771010
上传日期:2022-01-05
资源大小:991k
文件大小:5k
源码类别:

Audio

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
  3.  * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
  4.  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  5.  */
  6. /*
  7.  *  See private.h for the more commonly used macro versions.
  8.  */
  9. #include <stdio.h>
  10. #include <assert.h>
  11. #include "gsm610_priv.h"
  12. #define saturate(x) 
  13. ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x))
  14. word gsm_add ( word a, word b)
  15. {
  16. longword sum = (longword)a + (longword)b;
  17. return saturate(sum);
  18. }
  19. word gsm_sub ( word a, word b)
  20. {
  21. longword diff = (longword)a - (longword)b;
  22. return saturate(diff);
  23. }
  24. word gsm_mult ( word a, word b)
  25. {
  26. if (a == MIN_WORD && b == MIN_WORD)
  27. return MAX_WORD;
  28. return SASR_L( (longword)a * (longword)b, 15 );
  29. }
  30. word gsm_mult_r ( word a, word b)
  31. {
  32. if (b == MIN_WORD && a == MIN_WORD) return MAX_WORD;
  33. else {
  34. longword prod = (longword)a * (longword)b + 16384;
  35. prod >>= 15;
  36. return prod & 0xFFFF;
  37. }
  38. }
  39. word gsm_abs (word a)
  40. {
  41. return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a;
  42. }
  43. longword gsm_L_mult (word a, word b)
  44. {
  45. assert( a != MIN_WORD || b != MIN_WORD );
  46. return ((longword)a * (longword)b) << 1;
  47. }
  48. longword gsm_L_add ( longword a, longword b)
  49. {
  50. if (a < 0) {
  51. if (b >= 0) return a + b;
  52. else {
  53. ulongword A = (ulongword)-(a + 1) + (ulongword)-(b + 1);
  54. return A >= MAX_LONGWORD ? MIN_LONGWORD :-(longword)A-2;
  55. }
  56. }
  57. else if (b <= 0) return a + b;
  58. else {
  59. ulongword A = (ulongword)a + (ulongword)b;
  60. return A > MAX_LONGWORD ? MAX_LONGWORD : A;
  61. }
  62. }
  63. longword gsm_L_sub ( longword a, longword b)
  64. {
  65. if (a >= 0) {
  66. if (b >= 0) return a - b;
  67. else {
  68. /* a>=0, b<0 */
  69. ulongword A = (ulongword)a + -(b + 1);
  70. return A >= MAX_LONGWORD ? MAX_LONGWORD : (A + 1);
  71. }
  72. }
  73. else if (b <= 0) return a - b;
  74. else {
  75. /* a<0, b>0 */  
  76. ulongword A = (ulongword)-(a + 1) + b;
  77. return A >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)A - 1;
  78. }
  79. }
  80. static unsigned char const bitoff[ 256 ] = {
  81.  8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
  82.  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  83.  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  84.  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  85.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  86.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  87.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  88.  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  89.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  90.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  91.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  92.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  93.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  94.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  95.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  96.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  97. };
  98. word gsm_norm (longword a )
  99. /*
  100.  * the number of left shifts needed to normalize the 32 bit
  101.  * variable L_var1 for positive values on the interval
  102.  *
  103.  * with minimum of
  104.  * minimum of 1073741824  (01000000000000000000000000000000) and 
  105.  * maximum of 2147483647  (01111111111111111111111111111111)
  106.  *
  107.  *
  108.  * and for negative values on the interval with
  109.  * minimum of -2147483648 (-10000000000000000000000000000000) and
  110.  * maximum of -1073741824 ( -1000000000000000000000000000000).
  111.  *
  112.  * in order to normalize the result, the following
  113.  * operation must be done: L_norm_var1 = L_var1 << norm( L_var1 );
  114.  *
  115.  * (That's 'ffs', only from the left, not the right..)
  116.  */
  117. {
  118. assert(a != 0);
  119. if (a < 0) {
  120. if (a <= -1073741824) return 0;
  121. a = ~a;
  122. }
  123. return    a & 0xffff0000 
  124. ? ( a & 0xff000000
  125.   ?  -1 + bitoff[ 0xFF & (a >> 24) ]
  126.   :   7 + bitoff[ 0xFF & (a >> 16) ] )
  127. : ( a & 0xff00
  128.   ?  15 + bitoff[ 0xFF & (a >> 8) ]
  129.   :  23 + bitoff[ 0xFF & a ] );
  130. }
  131. longword gsm_L_asl (longword a, int n)
  132. {
  133. if (n >= 32) return 0;
  134. if (n <= -32) return -(a < 0);
  135. if (n < 0) return gsm_L_asr(a, -n);
  136. return a << n;
  137. }
  138. word gsm_asr (word a, int n)
  139. {
  140. if (n >= 16) return -(a < 0);
  141. if (n <= -16) return 0;
  142. if (n < 0) return a << -n;
  143. return SASR_W (a, (word) n);
  144. }
  145. word gsm_asl (word a, int n)
  146. {
  147. if (n >= 16) return 0;
  148. if (n <= -16) return -(a < 0);
  149. if (n < 0) return gsm_asr(a, -n);
  150. return a << n;
  151. }
  152. longword gsm_L_asr (longword a, int n)
  153. {
  154. if (n >= 32) return -(a < 0);
  155. if (n <= -32) return 0;
  156. if (n < 0) return a << -n;
  157. return SASR_L (a, (word) n);
  158. }
  159. /*
  160. ** word gsm_asr (word a, int n)
  161. ** {
  162. ** if (n >= 16) return -(a < 0);
  163. ** if (n <= -16) return 0;
  164. ** if (n < 0) return a << -n;
  165. **
  166. ** # ifdef SASR_W
  167. ** return a >> n;
  168. ** # else
  169. ** if (a >= 0) return a >> n;
  170. ** else return -(word)( -(uword)a >> n );
  171. ** # endif
  172. ** }
  173. **
  174. */
  175. /* 
  176.  *  (From p. 46, end of section 4.2.5)
  177.  *
  178.  *  NOTE: The following lines gives [sic] one correct implementation
  179.  *     of the div(num, denum) arithmetic operation.  Compute div
  180.  *        which is the integer division of num by denum: with denum
  181.  *   >= num > 0
  182.  */
  183. word gsm_div (word num, word denum)
  184. {
  185. longword L_num   = num;
  186. longword L_denum = denum;
  187. word div  = 0;
  188. int k  = 15;
  189. /* The parameter num sometimes becomes zero.
  190.  * Although this is explicitly guarded against in 4.2.5,
  191.  * we assume that the result should then be zero as well.
  192.  */
  193. /* assert(num != 0); */
  194. assert(num >= 0 && denum >= num);
  195. if (num == 0)
  196.     return 0;
  197. while (k--) {
  198. div   <<= 1;
  199. L_num <<= 1;
  200. if (L_num >= L_denum) {
  201. L_num -= L_denum;
  202. div++;
  203. }
  204. }
  205. return div;
  206. }