OLD | NEW |
1 /* Copyright (c) 2002-2008 Jean-Marc Valin | 1 /* Copyright (c) 2002-2008 Jean-Marc Valin |
2 Copyright (c) 2007-2008 CSIRO | 2 Copyright (c) 2007-2008 CSIRO |
3 Copyright (c) 2007-2009 Xiph.Org Foundation | 3 Copyright (c) 2007-2009 Xiph.Org Foundation |
4 Written by Jean-Marc Valin */ | 4 Written by Jean-Marc Valin */ |
5 /** | 5 /** |
6 @file mathops.h | 6 @file mathops.h |
7 @brief Various math functions | 7 @brief Various math functions |
8 */ | 8 */ |
9 /* | 9 /* |
10 Redistribution and use in source and binary forms, with or without | 10 Redistribution and use in source and binary forms, with or without |
(...skipping 20 matching lines...) Expand all Loading... |
31 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 31 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
32 */ | 32 */ |
33 | 33 |
34 #ifndef MATHOPS_H | 34 #ifndef MATHOPS_H |
35 #define MATHOPS_H | 35 #define MATHOPS_H |
36 | 36 |
37 #include "arch.h" | 37 #include "arch.h" |
38 #include "entcode.h" | 38 #include "entcode.h" |
39 #include "os_support.h" | 39 #include "os_support.h" |
40 | 40 |
| 41 #define PI 3.141592653f |
| 42 |
41 /* Multiplies two 16-bit fractional values. Bit-exactness of this macro is impor
tant */ | 43 /* Multiplies two 16-bit fractional values. Bit-exactness of this macro is impor
tant */ |
42 #define FRAC_MUL16(a,b) ((16384+((opus_int32)(opus_int16)(a)*(opus_int16)(b)))>>
15) | 44 #define FRAC_MUL16(a,b) ((16384+((opus_int32)(opus_int16)(a)*(opus_int16)(b)))>>
15) |
43 | 45 |
44 unsigned isqrt32(opus_uint32 _val); | 46 unsigned isqrt32(opus_uint32 _val); |
45 | 47 |
| 48 /* CELT doesn't need it for fixed-point, by analysis.c does. */ |
| 49 #if !defined(FIXED_POINT) || defined(ANALYSIS_C) |
| 50 #define cA 0.43157974f |
| 51 #define cB 0.67848403f |
| 52 #define cC 0.08595542f |
| 53 #define cE ((float)PI/2) |
| 54 static OPUS_INLINE float fast_atan2f(float y, float x) { |
| 55 float x2, y2; |
| 56 x2 = x*x; |
| 57 y2 = y*y; |
| 58 /* For very small values, we don't care about the answer, so |
| 59 we can just return 0. */ |
| 60 if (x2 + y2 < 1e-18f) |
| 61 { |
| 62 return 0; |
| 63 } |
| 64 if(x2<y2){ |
| 65 float den = (y2 + cB*x2) * (y2 + cC*x2); |
| 66 return -x*y*(y2 + cA*x2) / den + (y<0 ? -cE : cE); |
| 67 }else{ |
| 68 float den = (x2 + cB*y2) * (x2 + cC*y2); |
| 69 return x*y*(x2 + cA*y2) / den + (y<0 ? -cE : cE) - (x*y<0 ? -cE : cE); |
| 70 } |
| 71 } |
| 72 #undef cA |
| 73 #undef cB |
| 74 #undef cC |
| 75 #undef cD |
| 76 #endif |
| 77 |
| 78 |
46 #ifndef OVERRIDE_CELT_MAXABS16 | 79 #ifndef OVERRIDE_CELT_MAXABS16 |
47 static OPUS_INLINE opus_val32 celt_maxabs16(const opus_val16 *x, int len) | 80 static OPUS_INLINE opus_val32 celt_maxabs16(const opus_val16 *x, int len) |
48 { | 81 { |
49 int i; | 82 int i; |
50 opus_val16 maxval = 0; | 83 opus_val16 maxval = 0; |
51 opus_val16 minval = 0; | 84 opus_val16 minval = 0; |
52 for (i=0;i<len;i++) | 85 for (i=0;i<len;i++) |
53 { | 86 { |
54 maxval = MAX16(maxval, x[i]); | 87 maxval = MAX16(maxval, x[i]); |
55 minval = MIN16(minval, x[i]); | 88 minval = MIN16(minval, x[i]); |
(...skipping 17 matching lines...) Expand all Loading... |
73 return MAX32(maxval, -minval); | 106 return MAX32(maxval, -minval); |
74 } | 107 } |
75 #else | 108 #else |
76 #define celt_maxabs32(x,len) celt_maxabs16(x,len) | 109 #define celt_maxabs32(x,len) celt_maxabs16(x,len) |
77 #endif | 110 #endif |
78 #endif | 111 #endif |
79 | 112 |
80 | 113 |
81 #ifndef FIXED_POINT | 114 #ifndef FIXED_POINT |
82 | 115 |
83 #define PI 3.141592653f | |
84 #define celt_sqrt(x) ((float)sqrt(x)) | 116 #define celt_sqrt(x) ((float)sqrt(x)) |
85 #define celt_rsqrt(x) (1.f/celt_sqrt(x)) | 117 #define celt_rsqrt(x) (1.f/celt_sqrt(x)) |
86 #define celt_rsqrt_norm(x) (celt_rsqrt(x)) | 118 #define celt_rsqrt_norm(x) (celt_rsqrt(x)) |
87 #define celt_cos_norm(x) ((float)cos((.5f*PI)*(x))) | 119 #define celt_cos_norm(x) ((float)cos((.5f*PI)*(x))) |
88 #define celt_rcp(x) (1.f/(x)) | 120 #define celt_rcp(x) (1.f/(x)) |
89 #define celt_div(a,b) ((a)/(b)) | 121 #define celt_div(a,b) ((a)/(b)) |
90 #define frac_div32(a,b) ((float)(a)/(b)) | 122 #define frac_div32(a,b) ((float)(a)/(b)) |
91 | 123 |
92 #ifdef FLOAT_APPROX | 124 #ifdef FLOAT_APPROX |
93 | 125 |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 opus_val32 arg; | 281 opus_val32 arg; |
250 arg = celt_div(SHL32(EXTEND32(x),15),y); | 282 arg = celt_div(SHL32(EXTEND32(x),15),y); |
251 if (arg >= 32767) | 283 if (arg >= 32767) |
252 arg = 32767; | 284 arg = 32767; |
253 return 25736-SHR16(celt_atan01(EXTRACT16(arg)),1); | 285 return 25736-SHR16(celt_atan01(EXTRACT16(arg)),1); |
254 } | 286 } |
255 } | 287 } |
256 | 288 |
257 #endif /* FIXED_POINT */ | 289 #endif /* FIXED_POINT */ |
258 #endif /* MATHOPS_H */ | 290 #endif /* MATHOPS_H */ |
OLD | NEW |