FreeCalypso > hg > gsm-codec-lib
comparison libtwamr/inv_sqrt.c @ 253:54f6bc41ed10
libtwamr: integrate a* modules
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 05 Apr 2024 06:08:15 +0000 |
parents | |
children | 07f936338de1 |
comparison
equal
deleted
inserted
replaced
252:57b4053559ff | 253:54f6bc41ed10 |
---|---|
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 : inv_sqrt.c | |
11 * Purpose : Computes 1/sqrt(L_x), where L_x is positive. | |
12 * : If L_x is negative or zero, | |
13 * : the result is 1 (3fff ffff). | |
14 * Description : | |
15 * The function 1/sqrt(L_x) is approximated by a table and linear | |
16 * interpolation. The inverse square root is computed using the | |
17 * following steps: | |
18 * 1- Normalization of L_x. | |
19 * 2- If (30-exponent) is even then shift right once. | |
20 * 3- exponent = (30-exponent)/2 +1 | |
21 * 4- i = bit25-b31 of L_x; 16<=i<=63 because of normalization. | |
22 * 5- a = bit10-b24 | |
23 * 6- i -=16 | |
24 * 7- L_y = table[i]<<16 - (table[i] - table[i+1]) * a * 2 | |
25 * 8- L_y >>= exponent | |
26 * | |
27 ******************************************************************************** | |
28 */ | |
29 /* | |
30 ******************************************************************************** | |
31 * MODULE INCLUDE FILE AND VERSION ID | |
32 ******************************************************************************** | |
33 */ | |
34 #include "namespace.h" | |
35 #include "inv_sqrt.h" | |
36 const char inv_sqrt_id[] = "@(#)$Id $" inv_sqrt_h; | |
37 | |
38 /* | |
39 ******************************************************************************** | |
40 * INCLUDE FILES | |
41 ******************************************************************************** | |
42 */ | |
43 #include "typedef.h" | |
44 #include "basic_op.h" | |
45 #include "no_count.h" | |
46 | |
47 /* | |
48 ******************************************************************************** | |
49 * LOCAL VARIABLES AND TABLES | |
50 ******************************************************************************** | |
51 */ | |
52 #include "inv_sqrt.tab" /* Table for inv_sqrt() */ | |
53 | |
54 /* | |
55 ******************************************************************************** | |
56 * PUBLIC PROGRAM CODE | |
57 ******************************************************************************** | |
58 */ | |
59 | |
60 Word32 Inv_sqrt ( /* (o) : output value */ | |
61 Word32 L_x /* (i) : input value */ | |
62 ) | |
63 { | |
64 Word16 exp, i, a, tmp; | |
65 Word32 L_y; | |
66 | |
67 test (); | |
68 if (L_x <= (Word32) 0) | |
69 return ((Word32) 0x3fffffffL); | |
70 | |
71 exp = norm_l (L_x); | |
72 L_x = L_shl (L_x, exp); /* L_x is normalize */ | |
73 | |
74 exp = sub (30, exp); | |
75 test (); logic16 (); | |
76 if ((exp & 1) == 0) /* If exponent even -> shift right */ | |
77 { | |
78 L_x = L_shr (L_x, 1); | |
79 } | |
80 exp = shr (exp, 1); | |
81 exp = add (exp, 1); | |
82 | |
83 L_x = L_shr (L_x, 9); | |
84 i = extract_h (L_x); /* Extract b25-b31 */ | |
85 L_x = L_shr (L_x, 1); | |
86 a = extract_l (L_x); /* Extract b10-b24 */ | |
87 a = a & (Word16) 0x7fff; logic16 (); | |
88 | |
89 i = sub (i, 16); | |
90 | |
91 L_y = L_deposit_h (table[i]); /* table[i] << 16 */ | |
92 tmp = sub (table[i], table[i + 1]); /* table[i] - table[i+1]) */ | |
93 L_y = L_msu (L_y, tmp, a); /* L_y -= tmp*a*2 */ | |
94 | |
95 L_y = L_shr (L_y, exp); /* denormalization */ | |
96 | |
97 return (L_y); | |
98 } |