Line | Count | Source |
1 | | /* Copyright (c) 2002-2008 Jean-Marc Valin |
2 | | Copyright (c) 2007-2008 CSIRO |
3 | | Copyright (c) 2007-2009 Xiph.Org Foundation |
4 | | Copyright (c) 2024 Arm Limited |
5 | | Written by Jean-Marc Valin, and Yunho Huh */ |
6 | | /** |
7 | | @file mathops.h |
8 | | @brief Various math functions |
9 | | */ |
10 | | /* |
11 | | Redistribution and use in source and binary forms, with or without |
12 | | modification, are permitted provided that the following conditions |
13 | | are met: |
14 | | |
15 | | - Redistributions of source code must retain the above copyright |
16 | | notice, this list of conditions and the following disclaimer. |
17 | | |
18 | | - Redistributions in binary form must reproduce the above copyright |
19 | | notice, this list of conditions and the following disclaimer in the |
20 | | documentation and/or other materials provided with the distribution. |
21 | | |
22 | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
23 | | ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
24 | | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
25 | | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER |
26 | | OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
27 | | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
28 | | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
29 | | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
30 | | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
31 | | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
32 | | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
33 | | */ |
34 | | |
35 | | #ifndef MATHOPS_H |
36 | | #define MATHOPS_H |
37 | | |
38 | | #include "arch.h" |
39 | | #include "entcode.h" |
40 | | #include "os_support.h" |
41 | | |
42 | | |
43 | | #if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) |
44 | | #include "arm/mathops_arm.h" |
45 | | #endif |
46 | | |
47 | 101M | #define PI 3.1415926535897931 |
48 | | |
49 | | /* Multiplies two 16-bit fractional values. Bit-exactness of this macro is important */ |
50 | 12.1M | #define FRAC_MUL16(a,b) ((16384+((opus_int32)(opus_int16)(a)*(opus_int16)(b)))>>15) |
51 | | |
52 | | unsigned isqrt32(opus_uint32 _val); |
53 | | |
54 | | /* CELT doesn't need it for fixed-point, by analysis.c does. */ |
55 | | #if !defined(FIXED_POINT) || defined(ANALYSIS_C) |
56 | 66.0M | #define cA 0.43157974f |
57 | 66.0M | #define cB 0.67848403f |
58 | 66.0M | #define cC 0.08595542f |
59 | 99.4M | #define cE ((float)PI/2) |
60 | 67.5M | static OPUS_INLINE float fast_atan2f(float y, float x) { |
61 | 67.5M | float x2, y2; |
62 | 67.5M | x2 = x*x; |
63 | 67.5M | y2 = y*y; |
64 | | /* For very small values, we don't care about the answer, so |
65 | | we can just return 0. */ |
66 | 67.5M | if (x2 + y2 < 1e-18f) |
67 | 1.57M | { |
68 | 1.57M | return 0; |
69 | 1.57M | } |
70 | 66.0M | if(x2<y2){ |
71 | 32.6M | float den = (y2 + cB*x2) * (y2 + cC*x2); |
72 | 32.6M | return -x*y*(y2 + cA*x2) / den + (y<0 ? -cE : cE); |
73 | 33.3M | }else{ |
74 | 33.3M | float den = (x2 + cB*y2) * (x2 + cC*y2); |
75 | 33.3M | return x*y*(x2 + cA*y2) / den + (y<0 ? -cE : cE) - (x*y<0 ? -cE : cE); |
76 | 33.3M | } |
77 | 66.0M | } Line | Count | Source | 60 | 67.5M | static OPUS_INLINE float fast_atan2f(float y, float x) { | 61 | 67.5M | float x2, y2; | 62 | 67.5M | x2 = x*x; | 63 | 67.5M | y2 = y*y; | 64 | | /* For very small values, we don't care about the answer, so | 65 | | we can just return 0. */ | 66 | 67.5M | if (x2 + y2 < 1e-18f) | 67 | 1.57M | { | 68 | 1.57M | return 0; | 69 | 1.57M | } | 70 | 66.0M | if(x2<y2){ | 71 | 32.6M | float den = (y2 + cB*x2) * (y2 + cC*x2); | 72 | 32.6M | return -x*y*(y2 + cA*x2) / den + (y<0 ? -cE : cE); | 73 | 33.3M | }else{ | 74 | 33.3M | float den = (x2 + cB*y2) * (x2 + cC*y2); | 75 | 33.3M | return x*y*(x2 + cA*y2) / den + (y<0 ? -cE : cE) - (x*y<0 ? -cE : cE); | 76 | 33.3M | } | 77 | 66.0M | } |
Unexecuted instantiation: opus_encoder.c:fast_atan2f Unexecuted instantiation: celt.c:fast_atan2f Unexecuted instantiation: celt_encoder.c:fast_atan2f Unexecuted instantiation: kiss_fft.c:fast_atan2f Unexecuted instantiation: mdct.c:fast_atan2f Unexecuted instantiation: modes.c:fast_atan2f Unexecuted instantiation: pitch.c:fast_atan2f Unexecuted instantiation: celt_lpc.c:fast_atan2f Unexecuted instantiation: quant_bands.c:fast_atan2f Unexecuted instantiation: rate.c:fast_atan2f Unexecuted instantiation: pitch_sse.c:fast_atan2f Unexecuted instantiation: opus.c:fast_atan2f Unexecuted instantiation: opus_decoder.c:fast_atan2f Unexecuted instantiation: bands.c:fast_atan2f Unexecuted instantiation: celt_decoder.c:fast_atan2f Unexecuted instantiation: laplace.c:fast_atan2f Unexecuted instantiation: mathops.c:fast_atan2f Unexecuted instantiation: vq.c:fast_atan2f Unexecuted instantiation: vq_sse2.c:fast_atan2f Unexecuted instantiation: cwrs.c:fast_atan2f Unexecuted instantiation: opus_projection_encoder.c:fast_atan2f Unexecuted instantiation: opus_multistream_encoder.c:fast_atan2f Unexecuted instantiation: opus_multistream_decode_fuzzer.cc:fast_atan2f(float, float) Unexecuted instantiation: opus_projection_decoder_fuzzer.cc:fast_atan2f(float, float) Unexecuted instantiation: opus_projection_decoder.c:fast_atan2f |
78 | | #undef cA |
79 | | #undef cB |
80 | | #undef cC |
81 | | #undef cE |
82 | | #endif |
83 | | |
84 | | |
85 | | #ifndef OVERRIDE_CELT_MAXABS16 |
86 | | static OPUS_INLINE opus_val32 celt_maxabs16(const opus_val16 *x, int len) |
87 | 1.67M | { |
88 | 1.67M | int i; |
89 | 1.67M | opus_val16 maxval = 0; |
90 | 1.67M | opus_val16 minval = 0; |
91 | 746M | for (i=0;i<len;i++) |
92 | 745M | { |
93 | 745M | maxval = MAX16(maxval, x[i]); |
94 | 745M | minval = MIN16(minval, x[i]); |
95 | 745M | } |
96 | 1.67M | return MAX32(EXTEND32(maxval),-EXTEND32(minval)); |
97 | 1.67M | } Unexecuted instantiation: celt.c:celt_maxabs16 Unexecuted instantiation: opus.c:celt_maxabs16 Unexecuted instantiation: opus_decoder.c:celt_maxabs16 celt_decoder.c:celt_maxabs16 Line | Count | Source | 87 | 190k | { | 88 | 190k | int i; | 89 | 190k | opus_val16 maxval = 0; | 90 | 190k | opus_val16 minval = 0; | 91 | 114M | for (i=0;i<len;i++) | 92 | 114M | { | 93 | 114M | maxval = MAX16(maxval, x[i]); | 94 | 114M | minval = MIN16(minval, x[i]); | 95 | 114M | } | 96 | 190k | return MAX32(EXTEND32(maxval),-EXTEND32(minval)); | 97 | 190k | } |
Unexecuted instantiation: mathops.c:celt_maxabs16 Unexecuted instantiation: mdct.c:celt_maxabs16 Unexecuted instantiation: modes.c:celt_maxabs16 Line | Count | Source | 87 | 242k | { | 88 | 242k | int i; | 89 | 242k | opus_val16 maxval = 0; | 90 | 242k | opus_val16 minval = 0; | 91 | 83.0M | for (i=0;i<len;i++) | 92 | 82.7M | { | 93 | 82.7M | maxval = MAX16(maxval, x[i]); | 94 | 82.7M | minval = MIN16(minval, x[i]); | 95 | 82.7M | } | 96 | 242k | return MAX32(EXTEND32(maxval),-EXTEND32(minval)); | 97 | 242k | } |
Unexecuted instantiation: celt_lpc.c:celt_maxabs16 Unexecuted instantiation: quant_bands.c:celt_maxabs16 Unexecuted instantiation: rate.c:celt_maxabs16 Unexecuted instantiation: vq.c:celt_maxabs16 Unexecuted instantiation: pitch_sse2.c:celt_maxabs16 Unexecuted instantiation: celt_lpc_sse4_1.c:celt_maxabs16 Unexecuted instantiation: pitch_sse4_1.c:celt_maxabs16 Unexecuted instantiation: bands.c:celt_maxabs16 Unexecuted instantiation: cwrs.c:celt_maxabs16 Unexecuted instantiation: kiss_fft.c:celt_maxabs16 Unexecuted instantiation: laplace.c:celt_maxabs16 Unexecuted instantiation: opus_projection_encoder.c:celt_maxabs16 Unexecuted instantiation: opus_multistream_encoder.c:celt_maxabs16 Unexecuted instantiation: analysis.c:celt_maxabs16 celt_encoder.c:celt_maxabs16 Line | Count | Source | 87 | 811k | { | 88 | 811k | int i; | 89 | 811k | opus_val16 maxval = 0; | 90 | 811k | opus_val16 minval = 0; | 91 | 295M | for (i=0;i<len;i++) | 92 | 294M | { | 93 | 294M | maxval = MAX16(maxval, x[i]); | 94 | 294M | minval = MIN16(minval, x[i]); | 95 | 294M | } | 96 | 811k | return MAX32(EXTEND32(maxval),-EXTEND32(minval)); | 97 | 811k | } |
opus_encoder.c:celt_maxabs16 Line | Count | Source | 87 | 433k | { | 88 | 433k | int i; | 89 | 433k | opus_val16 maxval = 0; | 90 | 433k | opus_val16 minval = 0; | 91 | 254M | for (i=0;i<len;i++) | 92 | 253M | { | 93 | 253M | maxval = MAX16(maxval, x[i]); | 94 | 253M | minval = MIN16(minval, x[i]); | 95 | 253M | } | 96 | 433k | return MAX32(EXTEND32(maxval),-EXTEND32(minval)); | 97 | 433k | } |
Unexecuted instantiation: pitch_sse.c:celt_maxabs16 Unexecuted instantiation: vq_sse2.c:celt_maxabs16 Unexecuted instantiation: opus_multistream_decode_fuzzer.cc:celt_maxabs16(float const*, int) Unexecuted instantiation: opus_projection_decoder_fuzzer.cc:celt_maxabs16(float const*, int) Unexecuted instantiation: opus_projection_decoder.c:celt_maxabs16 |
98 | | #endif |
99 | | |
100 | | #if defined(ENABLE_RES24) && defined(FIXED_POINT) |
101 | | static OPUS_INLINE opus_res celt_maxabs_res(const opus_res *x, int len) |
102 | 1.02M | { |
103 | 1.02M | int i; |
104 | 1.02M | opus_res maxval = 0; |
105 | 1.02M | opus_res minval = 0; |
106 | 393M | for (i=0;i<len;i++) |
107 | 392M | { |
108 | 392M | maxval = MAX32(maxval, x[i]); |
109 | 392M | minval = MIN32(minval, x[i]); |
110 | 392M | } |
111 | | /* opus_res should never reach such amplitude, so we should be safe. */ |
112 | 1.02M | celt_sig_assert(minval != -2147483648); |
113 | 1.02M | return MAX32(maxval,-minval); |
114 | 1.02M | } Unexecuted instantiation: celt.c:celt_maxabs_res Unexecuted instantiation: opus.c:celt_maxabs_res Unexecuted instantiation: opus_decoder.c:celt_maxabs_res Unexecuted instantiation: celt_decoder.c:celt_maxabs_res Unexecuted instantiation: mathops.c:celt_maxabs_res Unexecuted instantiation: mdct.c:celt_maxabs_res Unexecuted instantiation: modes.c:celt_maxabs_res Unexecuted instantiation: pitch.c:celt_maxabs_res Unexecuted instantiation: celt_lpc.c:celt_maxabs_res Unexecuted instantiation: quant_bands.c:celt_maxabs_res Unexecuted instantiation: rate.c:celt_maxabs_res Unexecuted instantiation: vq.c:celt_maxabs_res Unexecuted instantiation: pitch_sse2.c:celt_maxabs_res Unexecuted instantiation: celt_lpc_sse4_1.c:celt_maxabs_res Unexecuted instantiation: pitch_sse4_1.c:celt_maxabs_res Unexecuted instantiation: bands.c:celt_maxabs_res Unexecuted instantiation: cwrs.c:celt_maxabs_res Unexecuted instantiation: kiss_fft.c:celt_maxabs_res Unexecuted instantiation: laplace.c:celt_maxabs_res Unexecuted instantiation: opus_projection_encoder.c:celt_maxabs_res opus_encoder.c:celt_maxabs_res Line | Count | Source | 102 | 663k | { | 103 | 663k | int i; | 104 | 663k | opus_res maxval = 0; | 105 | 663k | opus_res minval = 0; | 106 | 340M | for (i=0;i<len;i++) | 107 | 339M | { | 108 | 339M | maxval = MAX32(maxval, x[i]); | 109 | 339M | minval = MIN32(minval, x[i]); | 110 | 339M | } | 111 | | /* opus_res should never reach such amplitude, so we should be safe. */ | 112 | 663k | celt_sig_assert(minval != -2147483648); | 113 | 663k | return MAX32(maxval,-minval); | 114 | 663k | } |
Unexecuted instantiation: opus_multistream_encoder.c:celt_maxabs_res Unexecuted instantiation: analysis.c:celt_maxabs_res celt_encoder.c:celt_maxabs_res Line | Count | Source | 102 | 362k | { | 103 | 362k | int i; | 104 | 362k | opus_res maxval = 0; | 105 | 362k | opus_res minval = 0; | 106 | 52.6M | for (i=0;i<len;i++) | 107 | 52.2M | { | 108 | 52.2M | maxval = MAX32(maxval, x[i]); | 109 | 52.2M | minval = MIN32(minval, x[i]); | 110 | 52.2M | } | 111 | | /* opus_res should never reach such amplitude, so we should be safe. */ | 112 | 362k | celt_sig_assert(minval != -2147483648); | 113 | 362k | return MAX32(maxval,-minval); | 114 | 362k | } |
Unexecuted instantiation: opus_projection_decoder.c:celt_maxabs_res |
115 | | #else |
116 | 600k | #define celt_maxabs_res celt_maxabs16 |
117 | | #endif |
118 | | |
119 | | |
120 | | #ifndef OVERRIDE_CELT_MAXABS32 |
121 | | #ifdef FIXED_POINT |
122 | | static OPUS_INLINE opus_val32 celt_maxabs32(const opus_val32 *x, int len) |
123 | 3.96M | { |
124 | 3.96M | int i; |
125 | 3.96M | opus_val32 maxval = 0; |
126 | 3.96M | opus_val32 minval = 0; |
127 | 692M | for (i=0;i<len;i++) |
128 | 688M | { |
129 | 688M | maxval = MAX32(maxval, x[i]); |
130 | 688M | minval = MIN32(minval, x[i]); |
131 | 688M | } |
132 | 3.96M | return MAX32(maxval, -minval); |
133 | 3.96M | } Unexecuted instantiation: celt.c:celt_maxabs32 Unexecuted instantiation: opus.c:celt_maxabs32 Unexecuted instantiation: opus_decoder.c:celt_maxabs32 Unexecuted instantiation: celt_decoder.c:celt_maxabs32 Unexecuted instantiation: mathops.c:celt_maxabs32 Unexecuted instantiation: mdct.c:celt_maxabs32 Unexecuted instantiation: modes.c:celt_maxabs32 Line | Count | Source | 123 | 194k | { | 124 | 194k | int i; | 125 | 194k | opus_val32 maxval = 0; | 126 | 194k | opus_val32 minval = 0; | 127 | 386M | for (i=0;i<len;i++) | 128 | 386M | { | 129 | 386M | maxval = MAX32(maxval, x[i]); | 130 | 386M | minval = MIN32(minval, x[i]); | 131 | 386M | } | 132 | 194k | return MAX32(maxval, -minval); | 133 | 194k | } |
Unexecuted instantiation: celt_lpc.c:celt_maxabs32 Unexecuted instantiation: quant_bands.c:celt_maxabs32 Unexecuted instantiation: rate.c:celt_maxabs32 Unexecuted instantiation: vq.c:celt_maxabs32 Unexecuted instantiation: pitch_sse2.c:celt_maxabs32 Unexecuted instantiation: celt_lpc_sse4_1.c:celt_maxabs32 Unexecuted instantiation: pitch_sse4_1.c:celt_maxabs32 Line | Count | Source | 123 | 3.51M | { | 124 | 3.51M | int i; | 125 | 3.51M | opus_val32 maxval = 0; | 126 | 3.51M | opus_val32 minval = 0; | 127 | 43.3M | for (i=0;i<len;i++) | 128 | 39.8M | { | 129 | 39.8M | maxval = MAX32(maxval, x[i]); | 130 | 39.8M | minval = MIN32(minval, x[i]); | 131 | 39.8M | } | 132 | 3.51M | return MAX32(maxval, -minval); | 133 | 3.51M | } |
Unexecuted instantiation: cwrs.c:celt_maxabs32 Unexecuted instantiation: kiss_fft.c:celt_maxabs32 Unexecuted instantiation: laplace.c:celt_maxabs32 Unexecuted instantiation: opus_projection_encoder.c:celt_maxabs32 Unexecuted instantiation: opus_encoder.c:celt_maxabs32 Unexecuted instantiation: opus_multistream_encoder.c:celt_maxabs32 Line | Count | Source | 123 | 62.4k | { | 124 | 62.4k | int i; | 125 | 62.4k | opus_val32 maxval = 0; | 126 | 62.4k | opus_val32 minval = 0; | 127 | 45.0M | for (i=0;i<len;i++) | 128 | 44.9M | { | 129 | 44.9M | maxval = MAX32(maxval, x[i]); | 130 | 44.9M | minval = MIN32(minval, x[i]); | 131 | 44.9M | } | 132 | 62.4k | return MAX32(maxval, -minval); | 133 | 62.4k | } |
celt_encoder.c:celt_maxabs32 Line | Count | Source | 123 | 196k | { | 124 | 196k | int i; | 125 | 196k | opus_val32 maxval = 0; | 126 | 196k | opus_val32 minval = 0; | 127 | 217M | for (i=0;i<len;i++) | 128 | 216M | { | 129 | 216M | maxval = MAX32(maxval, x[i]); | 130 | 216M | minval = MIN32(minval, x[i]); | 131 | 216M | } | 132 | 196k | return MAX32(maxval, -minval); | 133 | 196k | } |
Unexecuted instantiation: opus_projection_decoder.c:celt_maxabs32 |
134 | | #else |
135 | | #define celt_maxabs32(x,len) celt_maxabs16(x,len) |
136 | | #endif |
137 | | #endif |
138 | | |
139 | | #ifndef FIXED_POINT |
140 | | /* Calculates the arctangent of x using a Remez approximation of order 15, |
141 | | * incorporating only odd-powered terms. */ |
142 | | static OPUS_INLINE float celt_atan_norm(float x) |
143 | 1.35M | { |
144 | 1.35M | #define ATAN2_2_OVER_PI 0.636619772367581f |
145 | 1.35M | float x_sq = x * x; |
146 | | |
147 | | /* Polynomial coefficients approximated in the [0, 1] range. |
148 | | * Lolremez command: lolremez --degree 6 --range "0:1" |
149 | | * "(atan(sqrt(x))-sqrt(x))/(x*sqrt(x))" "1/(sqrt(x)*x)" |
150 | | * Please note that ATAN2_COEFF_A01 is fixed to 1.0f. */ |
151 | 1.35M | #define ATAN2_COEFF_A03 -3.3331659436225891113281250000e-01f |
152 | 1.35M | #define ATAN2_COEFF_A05 1.99627041816711425781250000000e-01f |
153 | 1.35M | #define ATAN2_COEFF_A07 -1.3976582884788513183593750000e-01f |
154 | 1.35M | #define ATAN2_COEFF_A09 9.79423448443412780761718750000e-02f |
155 | 1.35M | #define ATAN2_COEFF_A11 -5.7773590087890625000000000000e-02f |
156 | 1.35M | #define ATAN2_COEFF_A13 2.30401363223791122436523437500e-02f |
157 | 1.35M | #define ATAN2_COEFF_A15 -4.3554059229791164398193359375e-03f |
158 | 1.35M | return ATAN2_2_OVER_PI * (x + x * x_sq * (ATAN2_COEFF_A03 |
159 | 1.35M | + x_sq * (ATAN2_COEFF_A05 |
160 | 1.35M | + x_sq * (ATAN2_COEFF_A07 |
161 | 1.35M | + x_sq * (ATAN2_COEFF_A09 |
162 | 1.35M | + x_sq * (ATAN2_COEFF_A11 |
163 | 1.35M | + x_sq * (ATAN2_COEFF_A13 |
164 | 1.35M | + x_sq * (ATAN2_COEFF_A15)))))))); |
165 | 1.35M | } Unexecuted instantiation: pitch_sse.c:celt_atan_norm Line | Count | Source | 143 | 1.35M | { | 144 | 1.35M | #define ATAN2_2_OVER_PI 0.636619772367581f | 145 | 1.35M | float x_sq = x * x; | 146 | | | 147 | | /* Polynomial coefficients approximated in the [0, 1] range. | 148 | | * Lolremez command: lolremez --degree 6 --range "0:1" | 149 | | * "(atan(sqrt(x))-sqrt(x))/(x*sqrt(x))" "1/(sqrt(x)*x)" | 150 | | * Please note that ATAN2_COEFF_A01 is fixed to 1.0f. */ | 151 | 1.35M | #define ATAN2_COEFF_A03 -3.3331659436225891113281250000e-01f | 152 | 1.35M | #define ATAN2_COEFF_A05 1.99627041816711425781250000000e-01f | 153 | 1.35M | #define ATAN2_COEFF_A07 -1.3976582884788513183593750000e-01f | 154 | 1.35M | #define ATAN2_COEFF_A09 9.79423448443412780761718750000e-02f | 155 | 1.35M | #define ATAN2_COEFF_A11 -5.7773590087890625000000000000e-02f | 156 | 1.35M | #define ATAN2_COEFF_A13 2.30401363223791122436523437500e-02f | 157 | 1.35M | #define ATAN2_COEFF_A15 -4.3554059229791164398193359375e-03f | 158 | 1.35M | return ATAN2_2_OVER_PI * (x + x * x_sq * (ATAN2_COEFF_A03 | 159 | 1.35M | + x_sq * (ATAN2_COEFF_A05 | 160 | 1.35M | + x_sq * (ATAN2_COEFF_A07 | 161 | 1.35M | + x_sq * (ATAN2_COEFF_A09 | 162 | 1.35M | + x_sq * (ATAN2_COEFF_A11 | 163 | 1.35M | + x_sq * (ATAN2_COEFF_A13 | 164 | 1.35M | + x_sq * (ATAN2_COEFF_A15)))))))); | 165 | 1.35M | } |
Unexecuted instantiation: vq_sse2.c:celt_atan_norm Unexecuted instantiation: opus_multistream_decode_fuzzer.cc:celt_atan_norm(float) Unexecuted instantiation: opus_projection_decoder_fuzzer.cc:celt_atan_norm(float) |
166 | | |
167 | | /* Calculates the arctangent of y/x, returning an approximate value in radians. |
168 | | * Please refer to the linked wiki page (https://en.wikipedia.org/wiki/Atan2) |
169 | | * to learn how atan2 results are computed. */ |
170 | | static OPUS_INLINE float celt_atan2p_norm(float y, float x) |
171 | 1.38M | { |
172 | 1.38M | celt_sig_assert(x>=0 && y>=0); |
173 | | |
174 | | /* For very small values, we don't care about the answer. */ |
175 | 1.38M | if ((x*x + y*y) < 1e-18f) |
176 | 35.9k | { |
177 | 35.9k | return 0; |
178 | 35.9k | } |
179 | | |
180 | 1.35M | if (y < x) |
181 | 660k | { |
182 | 660k | return celt_atan_norm(y / x); |
183 | 690k | } else { |
184 | 690k | return 1.f - celt_atan_norm(x / y); |
185 | 690k | } |
186 | 1.35M | } Unexecuted instantiation: pitch_sse.c:celt_atan2p_norm Line | Count | Source | 171 | 1.38M | { | 172 | 1.38M | celt_sig_assert(x>=0 && y>=0); | 173 | | | 174 | | /* For very small values, we don't care about the answer. */ | 175 | 1.38M | if ((x*x + y*y) < 1e-18f) | 176 | 35.9k | { | 177 | 35.9k | return 0; | 178 | 35.9k | } | 179 | | | 180 | 1.35M | if (y < x) | 181 | 660k | { | 182 | 660k | return celt_atan_norm(y / x); | 183 | 690k | } else { | 184 | 690k | return 1.f - celt_atan_norm(x / y); | 185 | 690k | } | 186 | 1.35M | } |
Unexecuted instantiation: vq_sse2.c:celt_atan2p_norm Unexecuted instantiation: opus_multistream_decode_fuzzer.cc:celt_atan2p_norm(float, float) Unexecuted instantiation: opus_projection_decoder_fuzzer.cc:celt_atan2p_norm(float, float) |
187 | | #endif |
188 | | |
189 | | #if !defined(FIXED_POINT) || defined(ENABLE_QEXT) |
190 | | /* Computes estimated cosine values for (PI/2 * x) using only terms with even |
191 | | * exponents. */ |
192 | | static OPUS_INLINE float celt_cos_norm2(float x) |
193 | 2.48M | { |
194 | 2.48M | float x_norm_sq; |
195 | 2.48M | int output_sign; |
196 | | /* Restrict x to [-1, 3]. */ |
197 | 2.48M | x -= 4*floor(.25*(x+1)); |
198 | | /* Negative sign for [1, 3]. */ |
199 | 2.48M | output_sign = 1 - 2*(x>1); |
200 | | /* Restrict to [-1, 1]. */ |
201 | 2.48M | x -= 2*(x>1); |
202 | | |
203 | | /* The cosine function, cos(x), has a Taylor series representation consisting |
204 | | * exclusively of even-powered polynomial terms. */ |
205 | 2.48M | x_norm_sq = x * x; |
206 | | |
207 | | /* Polynomial coefficients approximated in the [0, 1] range using only terms |
208 | | * with even exponents. |
209 | | * Lolremez command: lolremez --degree 4 --range 0:1 "cos(sqrt(x)*pi*0.5)" */ |
210 | 2.48M | #define COS_COEFF_A0 9.999999403953552246093750000000e-01f |
211 | 2.48M | #define COS_COEFF_A2 -1.233698248863220214843750000000000f |
212 | 2.48M | #define COS_COEFF_A4 2.536507546901702880859375000000e-01f |
213 | 2.48M | #define COS_COEFF_A6 -2.08106283098459243774414062500e-02f |
214 | 2.48M | #define COS_COEFF_A8 8.581906440667808055877685546875e-04f |
215 | 2.48M | return output_sign * (COS_COEFF_A0 + x_norm_sq * (COS_COEFF_A2 + |
216 | 2.48M | x_norm_sq * (COS_COEFF_A4 + |
217 | 2.48M | x_norm_sq * (COS_COEFF_A6 + |
218 | 2.48M | x_norm_sq * (COS_COEFF_A8))))); |
219 | 2.48M | } Unexecuted instantiation: opus_projection_encoder.c:celt_cos_norm2 Unexecuted instantiation: celt.c:celt_cos_norm2 Unexecuted instantiation: mathops.c:celt_cos_norm2 Unexecuted instantiation: opus_encoder.c:celt_cos_norm2 Unexecuted instantiation: opus_multistream_encoder.c:celt_cos_norm2 Unexecuted instantiation: analysis.c:celt_cos_norm2 Unexecuted instantiation: celt_encoder.c:celt_cos_norm2 Unexecuted instantiation: kiss_fft.c:celt_cos_norm2 Unexecuted instantiation: mdct.c:celt_cos_norm2 Unexecuted instantiation: modes.c:celt_cos_norm2 Unexecuted instantiation: pitch.c:celt_cos_norm2 Unexecuted instantiation: celt_lpc.c:celt_cos_norm2 Unexecuted instantiation: quant_bands.c:celt_cos_norm2 Unexecuted instantiation: rate.c:celt_cos_norm2 Unexecuted instantiation: vq.c:celt_cos_norm2 Unexecuted instantiation: pitch_sse2.c:celt_cos_norm2 Unexecuted instantiation: celt_lpc_sse4_1.c:celt_cos_norm2 Unexecuted instantiation: pitch_sse4_1.c:celt_cos_norm2 Unexecuted instantiation: opus.c:celt_cos_norm2 Unexecuted instantiation: opus_decoder.c:celt_cos_norm2 Unexecuted instantiation: celt_decoder.c:celt_cos_norm2 Unexecuted instantiation: cwrs.c:celt_cos_norm2 Unexecuted instantiation: laplace.c:celt_cos_norm2 Unexecuted instantiation: pitch_sse.c:celt_cos_norm2 Line | Count | Source | 193 | 2.48M | { | 194 | 2.48M | float x_norm_sq; | 195 | 2.48M | int output_sign; | 196 | | /* Restrict x to [-1, 3]. */ | 197 | 2.48M | x -= 4*floor(.25*(x+1)); | 198 | | /* Negative sign for [1, 3]. */ | 199 | 2.48M | output_sign = 1 - 2*(x>1); | 200 | | /* Restrict to [-1, 1]. */ | 201 | 2.48M | x -= 2*(x>1); | 202 | | | 203 | | /* The cosine function, cos(x), has a Taylor series representation consisting | 204 | | * exclusively of even-powered polynomial terms. */ | 205 | 2.48M | x_norm_sq = x * x; | 206 | | | 207 | | /* Polynomial coefficients approximated in the [0, 1] range using only terms | 208 | | * with even exponents. | 209 | | * Lolremez command: lolremez --degree 4 --range 0:1 "cos(sqrt(x)*pi*0.5)" */ | 210 | 2.48M | #define COS_COEFF_A0 9.999999403953552246093750000000e-01f | 211 | 2.48M | #define COS_COEFF_A2 -1.233698248863220214843750000000000f | 212 | 2.48M | #define COS_COEFF_A4 2.536507546901702880859375000000e-01f | 213 | 2.48M | #define COS_COEFF_A6 -2.08106283098459243774414062500e-02f | 214 | 2.48M | #define COS_COEFF_A8 8.581906440667808055877685546875e-04f | 215 | 2.48M | return output_sign * (COS_COEFF_A0 + x_norm_sq * (COS_COEFF_A2 + | 216 | 2.48M | x_norm_sq * (COS_COEFF_A4 + | 217 | 2.48M | x_norm_sq * (COS_COEFF_A6 + | 218 | 2.48M | x_norm_sq * (COS_COEFF_A8))))); | 219 | 2.48M | } |
Unexecuted instantiation: vq_sse2.c:celt_cos_norm2 Unexecuted instantiation: opus_multistream_decode_fuzzer.cc:celt_cos_norm2(float) Unexecuted instantiation: opus_projection_decoder_fuzzer.cc:celt_cos_norm2(float) Unexecuted instantiation: opus_projection_decoder.c:celt_cos_norm2 |
220 | | |
221 | | #endif |
222 | | |
223 | | #ifndef FIXED_POINT |
224 | | |
225 | 11.7M | #define celt_sqrt(x) ((float)sqrt(x)) |
226 | 5.42M | #define celt_sqrt32(x) ((float)sqrt(x)) |
227 | 1.49M | #define celt_rsqrt(x) (1.f/celt_sqrt(x)) |
228 | | #define celt_rsqrt_norm(x) (celt_rsqrt(x)) |
229 | 1.44M | #define celt_rsqrt_norm32(x) (celt_rsqrt(x)) |
230 | 1.81M | #define celt_cos_norm(x) ((float)cos((.5f*PI)*(x))) |
231 | 128k | #define celt_rcp(x) (1.f/(x)) |
232 | 905k | #define celt_div(a,b) ((a)/(b)) |
233 | 1.34M | #define frac_div32(a,b) ((float)(a)/(b)) |
234 | 287k | #define frac_div32_q29(a,b) frac_div32(a,b) |
235 | | |
236 | | #ifdef FLOAT_APPROX |
237 | | /* Calculates the base-2 logarithm (log2(x)) of a number. It is designed for |
238 | | * systems using radix-2 floating-point representation, with the exponent |
239 | | * located at bits 23 to 30 and an offset of 127. Note that special cases like |
240 | | * denormalized numbers, positive/negative infinity, and NaN are not handled. |
241 | | * log2(x) = log2(x^exponent * mantissa) |
242 | | * = exponent + log2(mantissa) */ |
243 | | |
244 | | /* Log2 x normalization single precision coefficients calculated by |
245 | | * 1 / (1 + 0.125 * index). |
246 | | * Coefficients in Double Precision |
247 | | * double log2_x_norm_coeff[8] = { |
248 | | * 1.0000000000000000000, 8.888888888888888e-01, |
249 | | * 8.000000000000000e-01, 7.272727272727273e-01, |
250 | | * 6.666666666666666e-01, 6.153846153846154e-01, |
251 | | * 5.714285714285714e-01, 5.333333333333333e-01} */ |
252 | | static const float log2_x_norm_coeff[8] = { |
253 | | 1.000000000000000000000000000f, 8.88888895511627197265625e-01f, |
254 | | 8.00000000000000000000000e-01f, 7.27272748947143554687500e-01f, |
255 | | 6.66666686534881591796875e-01f, 6.15384638309478759765625e-01f, |
256 | | 5.71428596973419189453125e-01f, 5.33333361148834228515625e-01f}; |
257 | | |
258 | | /* Log2 y normalization single precision coefficients calculated by |
259 | | * log2(1 + 0.125 * index). |
260 | | * Coefficients in Double Precision |
261 | | * double log2_y_norm_coeff[8] = { |
262 | | * 0.0000000000000000000, 1.699250014423124e-01, |
263 | | * 3.219280948873623e-01, 4.594316186372973e-01, |
264 | | * 5.849625007211562e-01, 7.004397181410922e-01, |
265 | | * 8.073549220576041e-01, 9.068905956085185e-01}; */ |
266 | | static const float log2_y_norm_coeff[8] = { |
267 | | 0.0000000000000000000000000000f, 1.699250042438507080078125e-01f, |
268 | | 3.219280838966369628906250e-01f, 4.594316184520721435546875e-01f, |
269 | | 5.849624872207641601562500e-01f, 7.004396915435791015625000e-01f, |
270 | | 8.073549270629882812500000e-01f, 9.068905711174011230468750e-01f}; |
271 | | |
272 | | static OPUS_INLINE float celt_log2(float x) |
273 | 4.03M | { |
274 | 4.03M | opus_int32 integer; |
275 | 4.03M | opus_int32 range_idx; |
276 | 4.03M | union { |
277 | 4.03M | float f; |
278 | 4.03M | opus_uint32 i; |
279 | 4.03M | } in; |
280 | 4.03M | in.f = x; |
281 | 4.03M | integer = (opus_int32)(in.i>>23)-127; |
282 | 4.03M | in.i = (opus_int32)in.i - (opus_int32)((opus_uint32)integer<<23); |
283 | | |
284 | | /* Normalize the mantissa range from [1, 2] to [1,1.125], and then shift x |
285 | | * by 1.0625 to [-0.0625, 0.0625]. */ |
286 | 4.03M | range_idx = (in.i >> 20) & 0x7; |
287 | 4.03M | in.f = in.f * log2_x_norm_coeff[range_idx] - 1.0625f; |
288 | | |
289 | | /* Polynomial coefficients approximated in the [1, 1.125] range. |
290 | | * Lolremez command: lolremez --degree 4 --range -0.0625:0.0625 |
291 | | * "log(x+1.0625)/log(2)" |
292 | | * Coefficients in Double Precision |
293 | | * A0: 8.7462840624502679e-2 A1: 1.3578296070972002 |
294 | | * A2: -6.3897703690210047e-1 A3: 4.0197125617419959e-1 |
295 | | * A4: -2.8415445877832832e-1 */ |
296 | 4.03M | #define LOG2_COEFF_A0 8.74628424644470214843750000e-02f |
297 | 4.03M | #define LOG2_COEFF_A1 1.357829570770263671875000000000f |
298 | 4.03M | #define LOG2_COEFF_A2 -6.3897705078125000000000000e-01f |
299 | 4.03M | #define LOG2_COEFF_A3 4.01971250772476196289062500e-01f |
300 | 4.03M | #define LOG2_COEFF_A4 -2.8415444493293762207031250e-01f |
301 | 4.03M | in.f = LOG2_COEFF_A0 + in.f * (LOG2_COEFF_A1 |
302 | 4.03M | + in.f * (LOG2_COEFF_A2 |
303 | 4.03M | + in.f * (LOG2_COEFF_A3 |
304 | 4.03M | + in.f * (LOG2_COEFF_A4)))); |
305 | 4.03M | return integer + in.f + log2_y_norm_coeff[range_idx]; |
306 | 4.03M | } Line | Count | Source | 273 | 92.8k | { | 274 | 92.8k | opus_int32 integer; | 275 | 92.8k | opus_int32 range_idx; | 276 | 92.8k | union { | 277 | 92.8k | float f; | 278 | 92.8k | opus_uint32 i; | 279 | 92.8k | } in; | 280 | 92.8k | in.f = x; | 281 | 92.8k | integer = (opus_int32)(in.i>>23)-127; | 282 | 92.8k | in.i = (opus_int32)in.i - (opus_int32)((opus_uint32)integer<<23); | 283 | | | 284 | | /* Normalize the mantissa range from [1, 2] to [1,1.125], and then shift x | 285 | | * by 1.0625 to [-0.0625, 0.0625]. */ | 286 | 92.8k | range_idx = (in.i >> 20) & 0x7; | 287 | 92.8k | in.f = in.f * log2_x_norm_coeff[range_idx] - 1.0625f; | 288 | | | 289 | | /* Polynomial coefficients approximated in the [1, 1.125] range. | 290 | | * Lolremez command: lolremez --degree 4 --range -0.0625:0.0625 | 291 | | * "log(x+1.0625)/log(2)" | 292 | | * Coefficients in Double Precision | 293 | | * A0: 8.7462840624502679e-2 A1: 1.3578296070972002 | 294 | | * A2: -6.3897703690210047e-1 A3: 4.0197125617419959e-1 | 295 | | * A4: -2.8415445877832832e-1 */ | 296 | 92.8k | #define LOG2_COEFF_A0 8.74628424644470214843750000e-02f | 297 | 92.8k | #define LOG2_COEFF_A1 1.357829570770263671875000000000f | 298 | 92.8k | #define LOG2_COEFF_A2 -6.3897705078125000000000000e-01f | 299 | 92.8k | #define LOG2_COEFF_A3 4.01971250772476196289062500e-01f | 300 | 92.8k | #define LOG2_COEFF_A4 -2.8415444493293762207031250e-01f | 301 | 92.8k | in.f = LOG2_COEFF_A0 + in.f * (LOG2_COEFF_A1 | 302 | 92.8k | + in.f * (LOG2_COEFF_A2 | 303 | 92.8k | + in.f * (LOG2_COEFF_A3 | 304 | 92.8k | + in.f * (LOG2_COEFF_A4)))); | 305 | 92.8k | return integer + in.f + log2_y_norm_coeff[range_idx]; | 306 | 92.8k | } |
Line | Count | Source | 273 | 3.94M | { | 274 | 3.94M | opus_int32 integer; | 275 | 3.94M | opus_int32 range_idx; | 276 | 3.94M | union { | 277 | 3.94M | float f; | 278 | 3.94M | opus_uint32 i; | 279 | 3.94M | } in; | 280 | 3.94M | in.f = x; | 281 | 3.94M | integer = (opus_int32)(in.i>>23)-127; | 282 | 3.94M | in.i = (opus_int32)in.i - (opus_int32)((opus_uint32)integer<<23); | 283 | | | 284 | | /* Normalize the mantissa range from [1, 2] to [1,1.125], and then shift x | 285 | | * by 1.0625 to [-0.0625, 0.0625]. */ | 286 | 3.94M | range_idx = (in.i >> 20) & 0x7; | 287 | 3.94M | in.f = in.f * log2_x_norm_coeff[range_idx] - 1.0625f; | 288 | | | 289 | | /* Polynomial coefficients approximated in the [1, 1.125] range. | 290 | | * Lolremez command: lolremez --degree 4 --range -0.0625:0.0625 | 291 | | * "log(x+1.0625)/log(2)" | 292 | | * Coefficients in Double Precision | 293 | | * A0: 8.7462840624502679e-2 A1: 1.3578296070972002 | 294 | | * A2: -6.3897703690210047e-1 A3: 4.0197125617419959e-1 | 295 | | * A4: -2.8415445877832832e-1 */ | 296 | 3.94M | #define LOG2_COEFF_A0 8.74628424644470214843750000e-02f | 297 | 3.94M | #define LOG2_COEFF_A1 1.357829570770263671875000000000f | 298 | 3.94M | #define LOG2_COEFF_A2 -6.3897705078125000000000000e-01f | 299 | 3.94M | #define LOG2_COEFF_A3 4.01971250772476196289062500e-01f | 300 | 3.94M | #define LOG2_COEFF_A4 -2.8415444493293762207031250e-01f | 301 | 3.94M | in.f = LOG2_COEFF_A0 + in.f * (LOG2_COEFF_A1 | 302 | 3.94M | + in.f * (LOG2_COEFF_A2 | 303 | 3.94M | + in.f * (LOG2_COEFF_A3 | 304 | 3.94M | + in.f * (LOG2_COEFF_A4)))); | 305 | 3.94M | return integer + in.f + log2_y_norm_coeff[range_idx]; | 306 | 3.94M | } |
Unexecuted instantiation: pitch_sse.c:celt_log2 Unexecuted instantiation: vq_sse2.c:celt_log2 opus_multistream_encoder.c:celt_log2 Line | Count | Source | 273 | 992 | { | 274 | 992 | opus_int32 integer; | 275 | 992 | opus_int32 range_idx; | 276 | 992 | union { | 277 | 992 | float f; | 278 | 992 | opus_uint32 i; | 279 | 992 | } in; | 280 | 992 | in.f = x; | 281 | 992 | integer = (opus_int32)(in.i>>23)-127; | 282 | 992 | in.i = (opus_int32)in.i - (opus_int32)((opus_uint32)integer<<23); | 283 | | | 284 | | /* Normalize the mantissa range from [1, 2] to [1,1.125], and then shift x | 285 | | * by 1.0625 to [-0.0625, 0.0625]. */ | 286 | 992 | range_idx = (in.i >> 20) & 0x7; | 287 | 992 | in.f = in.f * log2_x_norm_coeff[range_idx] - 1.0625f; | 288 | | | 289 | | /* Polynomial coefficients approximated in the [1, 1.125] range. | 290 | | * Lolremez command: lolremez --degree 4 --range -0.0625:0.0625 | 291 | | * "log(x+1.0625)/log(2)" | 292 | | * Coefficients in Double Precision | 293 | | * A0: 8.7462840624502679e-2 A1: 1.3578296070972002 | 294 | | * A2: -6.3897703690210047e-1 A3: 4.0197125617419959e-1 | 295 | | * A4: -2.8415445877832832e-1 */ | 296 | 992 | #define LOG2_COEFF_A0 8.74628424644470214843750000e-02f | 297 | 992 | #define LOG2_COEFF_A1 1.357829570770263671875000000000f | 298 | 992 | #define LOG2_COEFF_A2 -6.3897705078125000000000000e-01f | 299 | 992 | #define LOG2_COEFF_A3 4.01971250772476196289062500e-01f | 300 | 992 | #define LOG2_COEFF_A4 -2.8415444493293762207031250e-01f | 301 | 992 | in.f = LOG2_COEFF_A0 + in.f * (LOG2_COEFF_A1 | 302 | 992 | + in.f * (LOG2_COEFF_A2 | 303 | 992 | + in.f * (LOG2_COEFF_A3 | 304 | 992 | + in.f * (LOG2_COEFF_A4)))); | 305 | 992 | return integer + in.f + log2_y_norm_coeff[range_idx]; | 306 | 992 | } |
|
307 | | |
308 | | /* Calculates an approximation of 2^x. The approximation was achieved by |
309 | | * employing a base-2 exponential function and utilizing a Remez approximation |
310 | | * of order 5, ensuring a controlled relative error. |
311 | | * exp2(x) = exp2(integer + fraction) |
312 | | * = exp2(integer) * exp2(fraction) */ |
313 | | static OPUS_INLINE float celt_exp2(float x) |
314 | 3.90M | { |
315 | 3.90M | opus_int32 integer; |
316 | 3.90M | float frac; |
317 | 3.90M | union { |
318 | 3.90M | float f; |
319 | 3.90M | opus_uint32 i; |
320 | 3.90M | } res; |
321 | 3.90M | integer = (int)floor(x); |
322 | 3.90M | if (integer < -50) |
323 | 3.83k | return 0; |
324 | 3.89M | frac = x-integer; |
325 | | |
326 | | /* Polynomial coefficients approximated in the [0, 1] range. |
327 | | * Lolremez command: lolremez --degree 5 --range 0:1 |
328 | | * "exp(x*0.693147180559945)" "exp(x*0.693147180559945)" |
329 | | * NOTE: log(2) ~ 0.693147180559945 */ |
330 | 3.89M | #define EXP2_COEFF_A0 9.999999403953552246093750000000e-01f |
331 | 3.89M | #define EXP2_COEFF_A1 6.931530833244323730468750000000e-01f |
332 | 3.89M | #define EXP2_COEFF_A2 2.401536107063293457031250000000e-01f |
333 | 3.89M | #define EXP2_COEFF_A3 5.582631751894950866699218750000e-02f |
334 | 3.89M | #define EXP2_COEFF_A4 8.989339694380760192871093750000e-03f |
335 | 3.89M | #define EXP2_COEFF_A5 1.877576694823801517486572265625e-03f |
336 | 3.89M | res.f = EXP2_COEFF_A0 + frac * (EXP2_COEFF_A1 |
337 | 3.89M | + frac * (EXP2_COEFF_A2 |
338 | 3.89M | + frac * (EXP2_COEFF_A3 |
339 | 3.89M | + frac * (EXP2_COEFF_A4 |
340 | 3.89M | + frac * (EXP2_COEFF_A5))))); |
341 | 3.89M | res.i = (opus_uint32)((opus_int32)res.i + (opus_int32)((opus_uint32)integer<<23)) & 0x7fffffff; |
342 | 3.89M | return res.f; |
343 | 3.90M | } Line | Count | Source | 314 | 8.75k | { | 315 | 8.75k | opus_int32 integer; | 316 | 8.75k | float frac; | 317 | 8.75k | union { | 318 | 8.75k | float f; | 319 | 8.75k | opus_uint32 i; | 320 | 8.75k | } res; | 321 | 8.75k | integer = (int)floor(x); | 322 | 8.75k | if (integer < -50) | 323 | 168 | return 0; | 324 | 8.58k | frac = x-integer; | 325 | | | 326 | | /* Polynomial coefficients approximated in the [0, 1] range. | 327 | | * Lolremez command: lolremez --degree 5 --range 0:1 | 328 | | * "exp(x*0.693147180559945)" "exp(x*0.693147180559945)" | 329 | | * NOTE: log(2) ~ 0.693147180559945 */ | 330 | 8.58k | #define EXP2_COEFF_A0 9.999999403953552246093750000000e-01f | 331 | 8.58k | #define EXP2_COEFF_A1 6.931530833244323730468750000000e-01f | 332 | 8.58k | #define EXP2_COEFF_A2 2.401536107063293457031250000000e-01f | 333 | 8.58k | #define EXP2_COEFF_A3 5.582631751894950866699218750000e-02f | 334 | 8.58k | #define EXP2_COEFF_A4 8.989339694380760192871093750000e-03f | 335 | 8.58k | #define EXP2_COEFF_A5 1.877576694823801517486572265625e-03f | 336 | 8.58k | res.f = EXP2_COEFF_A0 + frac * (EXP2_COEFF_A1 | 337 | 8.58k | + frac * (EXP2_COEFF_A2 | 338 | 8.58k | + frac * (EXP2_COEFF_A3 | 339 | 8.58k | + frac * (EXP2_COEFF_A4 | 340 | 8.58k | + frac * (EXP2_COEFF_A5))))); | 341 | 8.58k | res.i = (opus_uint32)((opus_int32)res.i + (opus_int32)((opus_uint32)integer<<23)) & 0x7fffffff; | 342 | 8.58k | return res.f; | 343 | 8.75k | } |
Line | Count | Source | 314 | 885k | { | 315 | 885k | opus_int32 integer; | 316 | 885k | float frac; | 317 | 885k | union { | 318 | 885k | float f; | 319 | 885k | opus_uint32 i; | 320 | 885k | } res; | 321 | 885k | integer = (int)floor(x); | 322 | 885k | if (integer < -50) | 323 | 0 | return 0; | 324 | 885k | frac = x-integer; | 325 | | | 326 | | /* Polynomial coefficients approximated in the [0, 1] range. | 327 | | * Lolremez command: lolremez --degree 5 --range 0:1 | 328 | | * "exp(x*0.693147180559945)" "exp(x*0.693147180559945)" | 329 | | * NOTE: log(2) ~ 0.693147180559945 */ | 330 | 885k | #define EXP2_COEFF_A0 9.999999403953552246093750000000e-01f | 331 | 885k | #define EXP2_COEFF_A1 6.931530833244323730468750000000e-01f | 332 | 885k | #define EXP2_COEFF_A2 2.401536107063293457031250000000e-01f | 333 | 885k | #define EXP2_COEFF_A3 5.582631751894950866699218750000e-02f | 334 | 885k | #define EXP2_COEFF_A4 8.989339694380760192871093750000e-03f | 335 | 885k | #define EXP2_COEFF_A5 1.877576694823801517486572265625e-03f | 336 | 885k | res.f = EXP2_COEFF_A0 + frac * (EXP2_COEFF_A1 | 337 | 885k | + frac * (EXP2_COEFF_A2 | 338 | 885k | + frac * (EXP2_COEFF_A3 | 339 | 885k | + frac * (EXP2_COEFF_A4 | 340 | 885k | + frac * (EXP2_COEFF_A5))))); | 341 | 885k | res.i = (opus_uint32)((opus_int32)res.i + (opus_int32)((opus_uint32)integer<<23)) & 0x7fffffff; | 342 | 885k | return res.f; | 343 | 885k | } |
Unexecuted instantiation: pitch_sse.c:celt_exp2 Unexecuted instantiation: opus_decoder.c:celt_exp2 Line | Count | Source | 314 | 3.00M | { | 315 | 3.00M | opus_int32 integer; | 316 | 3.00M | float frac; | 317 | 3.00M | union { | 318 | 3.00M | float f; | 319 | 3.00M | opus_uint32 i; | 320 | 3.00M | } res; | 321 | 3.00M | integer = (int)floor(x); | 322 | 3.00M | if (integer < -50) | 323 | 3.66k | return 0; | 324 | 3.00M | frac = x-integer; | 325 | | | 326 | | /* Polynomial coefficients approximated in the [0, 1] range. | 327 | | * Lolremez command: lolremez --degree 5 --range 0:1 | 328 | | * "exp(x*0.693147180559945)" "exp(x*0.693147180559945)" | 329 | | * NOTE: log(2) ~ 0.693147180559945 */ | 330 | 3.00M | #define EXP2_COEFF_A0 9.999999403953552246093750000000e-01f | 331 | 3.00M | #define EXP2_COEFF_A1 6.931530833244323730468750000000e-01f | 332 | 3.00M | #define EXP2_COEFF_A2 2.401536107063293457031250000000e-01f | 333 | 3.00M | #define EXP2_COEFF_A3 5.582631751894950866699218750000e-02f | 334 | 3.00M | #define EXP2_COEFF_A4 8.989339694380760192871093750000e-03f | 335 | 3.00M | #define EXP2_COEFF_A5 1.877576694823801517486572265625e-03f | 336 | 3.00M | res.f = EXP2_COEFF_A0 + frac * (EXP2_COEFF_A1 | 337 | 3.00M | + frac * (EXP2_COEFF_A2 | 338 | 3.00M | + frac * (EXP2_COEFF_A3 | 339 | 3.00M | + frac * (EXP2_COEFF_A4 | 340 | 3.00M | + frac * (EXP2_COEFF_A5))))); | 341 | 3.00M | res.i = (opus_uint32)((opus_int32)res.i + (opus_int32)((opus_uint32)integer<<23)) & 0x7fffffff; | 342 | 3.00M | return res.f; | 343 | 3.00M | } |
Unexecuted instantiation: vq_sse2.c:celt_exp2 |
344 | | |
345 | | #else |
346 | | #define celt_log2(x) ((float)(1.442695040888963387*log(x))) |
347 | | #define celt_exp2(x) ((float)exp(0.6931471805599453094*(x))) |
348 | | #endif |
349 | | |
350 | 3.84M | #define celt_exp2_db celt_exp2 |
351 | 7.36M | #define celt_log2_db celt_log2 |
352 | | |
353 | | #define celt_sin(x) celt_cos_norm2((0.5f*PI) * (x) - 1.0f) |
354 | | #define celt_log(x) (celt_log2(x) * 0.6931471805599453f) |
355 | | #define celt_exp(x) (celt_exp2((x) * 1.4426950408889634f)) |
356 | | |
357 | | #endif |
358 | | |
359 | | #ifdef FIXED_POINT |
360 | | |
361 | | #include "os_support.h" |
362 | | |
363 | | #ifndef OVERRIDE_CELT_ILOG2 |
364 | | /** Integer log in base2. Undefined for zero and negative numbers */ |
365 | | static OPUS_INLINE opus_int16 celt_ilog2(opus_int32 x) |
366 | 55.3M | { |
367 | 55.3M | celt_sig_assert(x>0); |
368 | 55.3M | return EC_ILOG(x)-1; |
369 | 55.3M | } Unexecuted instantiation: celt.c:celt_ilog2 Unexecuted instantiation: opus.c:celt_ilog2 Unexecuted instantiation: opus_decoder.c:celt_ilog2 celt_decoder.c:celt_ilog2 Line | Count | Source | 366 | 144k | { | 367 | 144k | celt_sig_assert(x>0); | 368 | | return EC_ILOG(x)-1; | 369 | 144k | } |
Line | Count | Source | 366 | 22.2M | { | 367 | 22.2M | celt_sig_assert(x>0); | 368 | | return EC_ILOG(x)-1; | 369 | 22.2M | } |
Line | Count | Source | 366 | 3.11M | { | 367 | 3.11M | celt_sig_assert(x>0); | 368 | | return EC_ILOG(x)-1; | 369 | 3.11M | } |
Unexecuted instantiation: modes.c:celt_ilog2 Line | Count | Source | 366 | 1.55M | { | 367 | 1.55M | celt_sig_assert(x>0); | 368 | | return EC_ILOG(x)-1; | 369 | 1.55M | } |
Line | Count | Source | 366 | 1.17M | { | 367 | 1.17M | celt_sig_assert(x>0); | 368 | | return EC_ILOG(x)-1; | 369 | 1.17M | } |
Line | Count | Source | 366 | 3.41M | { | 367 | 3.41M | celt_sig_assert(x>0); | 368 | | return EC_ILOG(x)-1; | 369 | 3.41M | } |
Unexecuted instantiation: rate.c:celt_ilog2 Line | Count | Source | 366 | 10.8M | { | 367 | 10.8M | celt_sig_assert(x>0); | 368 | | return EC_ILOG(x)-1; | 369 | 10.8M | } |
Unexecuted instantiation: pitch_sse2.c:celt_ilog2 Unexecuted instantiation: celt_lpc_sse4_1.c:celt_ilog2 Unexecuted instantiation: pitch_sse4_1.c:celt_ilog2 Line | Count | Source | 366 | 10.9M | { | 367 | 10.9M | celt_sig_assert(x>0); | 368 | | return EC_ILOG(x)-1; | 369 | 10.9M | } |
Unexecuted instantiation: cwrs.c:celt_ilog2 Unexecuted instantiation: kiss_fft.c:celt_ilog2 Unexecuted instantiation: laplace.c:celt_ilog2 Unexecuted instantiation: opus_projection_encoder.c:celt_ilog2 opus_encoder.c:celt_ilog2 Line | Count | Source | 366 | 1.40M | { | 367 | 1.40M | celt_sig_assert(x>0); | 368 | | return EC_ILOG(x)-1; | 369 | 1.40M | } |
opus_multistream_encoder.c:celt_ilog2 Line | Count | Source | 366 | 711 | { | 367 | 711 | celt_sig_assert(x>0); | 368 | | return EC_ILOG(x)-1; | 369 | 711 | } |
Unexecuted instantiation: analysis.c:celt_ilog2 celt_encoder.c:celt_ilog2 Line | Count | Source | 366 | 629k | { | 367 | 629k | celt_sig_assert(x>0); | 368 | | return EC_ILOG(x)-1; | 369 | 629k | } |
Unexecuted instantiation: opus_projection_decoder.c:celt_ilog2 |
370 | | #endif |
371 | | |
372 | | |
373 | | /** Integer log in base2. Defined for zero, but not for negative numbers */ |
374 | | static OPUS_INLINE opus_int16 celt_zlog2(opus_val32 x) |
375 | 3.81M | { |
376 | 3.81M | return x <= 0 ? 0 : celt_ilog2(x); |
377 | 3.81M | } Unexecuted instantiation: celt.c:celt_zlog2 Unexecuted instantiation: opus.c:celt_zlog2 Unexecuted instantiation: opus_decoder.c:celt_zlog2 celt_decoder.c:celt_zlog2 Line | Count | Source | 375 | 190k | { | 376 | 190k | return x <= 0 ? 0 : celt_ilog2(x); | 377 | 190k | } |
Unexecuted instantiation: mathops.c:celt_zlog2 Line | Count | Source | 375 | 694k | { | 376 | 694k | return x <= 0 ? 0 : celt_ilog2(x); | 377 | 694k | } |
Unexecuted instantiation: modes.c:celt_zlog2 Unexecuted instantiation: pitch.c:celt_zlog2 Unexecuted instantiation: celt_lpc.c:celt_zlog2 Unexecuted instantiation: quant_bands.c:celt_zlog2 Unexecuted instantiation: rate.c:celt_zlog2 Unexecuted instantiation: vq.c:celt_zlog2 Unexecuted instantiation: pitch_sse2.c:celt_zlog2 Unexecuted instantiation: celt_lpc_sse4_1.c:celt_zlog2 Unexecuted instantiation: pitch_sse4_1.c:celt_zlog2 Line | Count | Source | 375 | 2.93M | { | 376 | 2.93M | return x <= 0 ? 0 : celt_ilog2(x); | 377 | 2.93M | } |
Unexecuted instantiation: cwrs.c:celt_zlog2 Unexecuted instantiation: kiss_fft.c:celt_zlog2 Unexecuted instantiation: laplace.c:celt_zlog2 Unexecuted instantiation: opus_projection_encoder.c:celt_zlog2 Unexecuted instantiation: opus_encoder.c:celt_zlog2 Unexecuted instantiation: opus_multistream_encoder.c:celt_zlog2 Unexecuted instantiation: analysis.c:celt_zlog2 Unexecuted instantiation: celt_encoder.c:celt_zlog2 Unexecuted instantiation: opus_projection_decoder.c:celt_zlog2 |
378 | | |
379 | | opus_val16 celt_rsqrt_norm(opus_val32 x); |
380 | | |
381 | | opus_val32 celt_rsqrt_norm32(opus_val32 x); |
382 | | |
383 | | opus_val32 celt_sqrt(opus_val32 x); |
384 | | |
385 | | opus_val32 celt_sqrt32(opus_val32 x); |
386 | | |
387 | | opus_val16 celt_cos_norm(opus_val32 x); |
388 | | |
389 | | opus_val32 celt_cos_norm32(opus_val32 x); |
390 | | |
391 | | /** Base-2 logarithm approximation (log2(x)). (Q14 input, Q10 output) */ |
392 | | static OPUS_INLINE opus_val16 celt_log2(opus_val32 x) |
393 | 1.23M | { |
394 | 1.23M | int i; |
395 | 1.23M | opus_val16 n, frac; |
396 | | /* -0.41509302963303146, 0.9609890551383969, -0.31836011537636605, |
397 | | 0.15530808010959576, -0.08556153059057618 */ |
398 | 1.23M | static const opus_val16 C[5] = {-6801+(1<<(13-10)), 15746, -5217, 2545, -1401}; |
399 | 1.23M | if (x==0) |
400 | 0 | return -32767; |
401 | 1.23M | i = celt_ilog2(x); |
402 | 1.23M | n = VSHR32(x,i-15)-32768-16384; |
403 | 1.23M | frac = ADD16(C[0], MULT16_16_Q15(n, ADD16(C[1], MULT16_16_Q15(n, ADD16(C[2], MULT16_16_Q15(n, ADD16(C[3], MULT16_16_Q15(n, C[4])))))))); |
404 | 1.23M | return SHL32(i-13,10)+SHR32(frac,14-10); |
405 | 1.23M | } Unexecuted instantiation: celt.c:celt_log2 Unexecuted instantiation: opus.c:celt_log2 Unexecuted instantiation: opus_decoder.c:celt_log2 Unexecuted instantiation: celt_decoder.c:celt_log2 Unexecuted instantiation: mathops.c:celt_log2 Unexecuted instantiation: mdct.c:celt_log2 Unexecuted instantiation: modes.c:celt_log2 Unexecuted instantiation: pitch.c:celt_log2 Unexecuted instantiation: celt_lpc.c:celt_log2 Line | Count | Source | 393 | 1.09M | { | 394 | 1.09M | int i; | 395 | 1.09M | opus_val16 n, frac; | 396 | | /* -0.41509302963303146, 0.9609890551383969, -0.31836011537636605, | 397 | | 0.15530808010959576, -0.08556153059057618 */ | 398 | 1.09M | static const opus_val16 C[5] = {-6801+(1<<(13-10)), 15746, -5217, 2545, -1401}; | 399 | 1.09M | if (x==0) | 400 | 0 | return -32767; | 401 | 1.09M | i = celt_ilog2(x); | 402 | 1.09M | n = VSHR32(x,i-15)-32768-16384; | 403 | 1.09M | frac = ADD16(C[0], MULT16_16_Q15(n, ADD16(C[1], MULT16_16_Q15(n, ADD16(C[2], MULT16_16_Q15(n, ADD16(C[3], MULT16_16_Q15(n, C[4])))))))); | 404 | 1.09M | return SHL32(i-13,10)+SHR32(frac,14-10); | 405 | 1.09M | } |
Unexecuted instantiation: rate.c:celt_log2 Unexecuted instantiation: vq.c:celt_log2 Unexecuted instantiation: pitch_sse2.c:celt_log2 Unexecuted instantiation: celt_lpc_sse4_1.c:celt_log2 Unexecuted instantiation: pitch_sse4_1.c:celt_log2 Unexecuted instantiation: bands.c:celt_log2 Unexecuted instantiation: cwrs.c:celt_log2 Unexecuted instantiation: kiss_fft.c:celt_log2 Unexecuted instantiation: laplace.c:celt_log2 Unexecuted instantiation: opus_projection_encoder.c:celt_log2 Unexecuted instantiation: opus_encoder.c:celt_log2 opus_multistream_encoder.c:celt_log2 Line | Count | Source | 393 | 711 | { | 394 | 711 | int i; | 395 | 711 | opus_val16 n, frac; | 396 | | /* -0.41509302963303146, 0.9609890551383969, -0.31836011537636605, | 397 | | 0.15530808010959576, -0.08556153059057618 */ | 398 | 711 | static const opus_val16 C[5] = {-6801+(1<<(13-10)), 15746, -5217, 2545, -1401}; | 399 | 711 | if (x==0) | 400 | 0 | return -32767; | 401 | 711 | i = celt_ilog2(x); | 402 | 711 | n = VSHR32(x,i-15)-32768-16384; | 403 | 711 | frac = ADD16(C[0], MULT16_16_Q15(n, ADD16(C[1], MULT16_16_Q15(n, ADD16(C[2], MULT16_16_Q15(n, ADD16(C[3], MULT16_16_Q15(n, C[4])))))))); | 404 | 711 | return SHL32(i-13,10)+SHR32(frac,14-10); | 405 | 711 | } |
Unexecuted instantiation: analysis.c:celt_log2 Line | Count | Source | 393 | 132k | { | 394 | 132k | int i; | 395 | 132k | opus_val16 n, frac; | 396 | | /* -0.41509302963303146, 0.9609890551383969, -0.31836011537636605, | 397 | | 0.15530808010959576, -0.08556153059057618 */ | 398 | 132k | static const opus_val16 C[5] = {-6801+(1<<(13-10)), 15746, -5217, 2545, -1401}; | 399 | 132k | if (x==0) | 400 | 0 | return -32767; | 401 | 132k | i = celt_ilog2(x); | 402 | 132k | n = VSHR32(x,i-15)-32768-16384; | 403 | 132k | frac = ADD16(C[0], MULT16_16_Q15(n, ADD16(C[1], MULT16_16_Q15(n, ADD16(C[2], MULT16_16_Q15(n, ADD16(C[3], MULT16_16_Q15(n, C[4])))))))); | 404 | 132k | return SHL32(i-13,10)+SHR32(frac,14-10); | 405 | 132k | } |
Unexecuted instantiation: opus_projection_decoder.c:celt_log2 |
406 | | |
407 | | /* |
408 | | K0 = 1 |
409 | | K1 = log(2) |
410 | | K2 = 3-4*log(2) |
411 | | K3 = 3*log(2) - 2 |
412 | | */ |
413 | | #define D0 16383 |
414 | | #define D1 22804 |
415 | | #define D2 14819 |
416 | | #define D3 10204 |
417 | | |
418 | | static OPUS_INLINE opus_val32 celt_exp2_frac(opus_val16 x) |
419 | 2.04M | { |
420 | 2.04M | opus_val16 frac; |
421 | 2.04M | frac = SHL16(x, 4); |
422 | 2.04M | return ADD16(D0, MULT16_16_Q15(frac, ADD16(D1, MULT16_16_Q15(frac, ADD16(D2 , MULT16_16_Q15(D3,frac)))))); |
423 | 2.04M | } Unexecuted instantiation: celt.c:celt_exp2_frac Unexecuted instantiation: opus.c:celt_exp2_frac Unexecuted instantiation: opus_decoder.c:celt_exp2_frac Unexecuted instantiation: celt_decoder.c:celt_exp2_frac Unexecuted instantiation: mathops.c:celt_exp2_frac Unexecuted instantiation: mdct.c:celt_exp2_frac Unexecuted instantiation: modes.c:celt_exp2_frac Unexecuted instantiation: pitch.c:celt_exp2_frac Unexecuted instantiation: celt_lpc.c:celt_exp2_frac Unexecuted instantiation: quant_bands.c:celt_exp2_frac Unexecuted instantiation: rate.c:celt_exp2_frac Unexecuted instantiation: vq.c:celt_exp2_frac Unexecuted instantiation: pitch_sse2.c:celt_exp2_frac Unexecuted instantiation: celt_lpc_sse4_1.c:celt_exp2_frac Unexecuted instantiation: pitch_sse4_1.c:celt_exp2_frac Line | Count | Source | 419 | 1.76M | { | 420 | 1.76M | opus_val16 frac; | 421 | 1.76M | frac = SHL16(x, 4); | 422 | 1.76M | return ADD16(D0, MULT16_16_Q15(frac, ADD16(D1, MULT16_16_Q15(frac, ADD16(D2 , MULT16_16_Q15(D3,frac)))))); | 423 | 1.76M | } |
Unexecuted instantiation: cwrs.c:celt_exp2_frac Unexecuted instantiation: kiss_fft.c:celt_exp2_frac Unexecuted instantiation: laplace.c:celt_exp2_frac Unexecuted instantiation: opus_projection_encoder.c:celt_exp2_frac opus_encoder.c:celt_exp2_frac Line | Count | Source | 419 | 5.36k | { | 420 | 5.36k | opus_val16 frac; | 421 | 5.36k | frac = SHL16(x, 4); | 422 | 5.36k | return ADD16(D0, MULT16_16_Q15(frac, ADD16(D1, MULT16_16_Q15(frac, ADD16(D2 , MULT16_16_Q15(D3,frac)))))); | 423 | 5.36k | } |
Unexecuted instantiation: opus_multistream_encoder.c:celt_exp2_frac Unexecuted instantiation: analysis.c:celt_exp2_frac Unexecuted instantiation: opus_projection_decoder.c:celt_exp2_frac celt_encoder.c:celt_exp2_frac Line | Count | Source | 419 | 280k | { | 420 | 280k | opus_val16 frac; | 421 | 280k | frac = SHL16(x, 4); | 422 | 280k | return ADD16(D0, MULT16_16_Q15(frac, ADD16(D1, MULT16_16_Q15(frac, ADD16(D2 , MULT16_16_Q15(D3,frac)))))); | 423 | 280k | } |
|
424 | | |
425 | | #undef D0 |
426 | | #undef D1 |
427 | | #undef D2 |
428 | | #undef D3 |
429 | | |
430 | | /** Base-2 exponential approximation (2^x). (Q10 input, Q16 output) */ |
431 | | static OPUS_INLINE opus_val32 celt_exp2(opus_val16 x) |
432 | 353k | { |
433 | 353k | int integer; |
434 | 353k | opus_val16 frac; |
435 | 353k | integer = SHR16(x,10); |
436 | 353k | if (integer>14) |
437 | 227 | return 0x7f000000; |
438 | 353k | else if (integer < -15) |
439 | 2.05k | return 0; |
440 | 351k | frac = celt_exp2_frac(x-SHL16(integer,10)); |
441 | 351k | return VSHR32(EXTEND32(frac), -integer-2); |
442 | 353k | } Unexecuted instantiation: celt.c:celt_exp2 Unexecuted instantiation: opus.c:celt_exp2 Unexecuted instantiation: opus_decoder.c:celt_exp2 Unexecuted instantiation: celt_decoder.c:celt_exp2 Unexecuted instantiation: mathops.c:celt_exp2 Unexecuted instantiation: mdct.c:celt_exp2 Unexecuted instantiation: modes.c:celt_exp2 Unexecuted instantiation: pitch.c:celt_exp2 Unexecuted instantiation: celt_lpc.c:celt_exp2 Unexecuted instantiation: quant_bands.c:celt_exp2 Unexecuted instantiation: rate.c:celt_exp2 Unexecuted instantiation: vq.c:celt_exp2 Unexecuted instantiation: pitch_sse2.c:celt_exp2 Unexecuted instantiation: celt_lpc_sse4_1.c:celt_exp2 Unexecuted instantiation: pitch_sse4_1.c:celt_exp2 Line | Count | Source | 432 | 66.7k | { | 433 | 66.7k | int integer; | 434 | 66.7k | opus_val16 frac; | 435 | 66.7k | integer = SHR16(x,10); | 436 | 66.7k | if (integer>14) | 437 | 0 | return 0x7f000000; | 438 | 66.7k | else if (integer < -15) | 439 | 845 | return 0; | 440 | 65.9k | frac = celt_exp2_frac(x-SHL16(integer,10)); | 441 | 65.9k | return VSHR32(EXTEND32(frac), -integer-2); | 442 | 66.7k | } |
Unexecuted instantiation: cwrs.c:celt_exp2 Unexecuted instantiation: kiss_fft.c:celt_exp2 Unexecuted instantiation: laplace.c:celt_exp2 Unexecuted instantiation: opus_projection_encoder.c:celt_exp2 Line | Count | Source | 432 | 6.80k | { | 433 | 6.80k | int integer; | 434 | 6.80k | opus_val16 frac; | 435 | 6.80k | integer = SHR16(x,10); | 436 | 6.80k | if (integer>14) | 437 | 227 | return 0x7f000000; | 438 | 6.57k | else if (integer < -15) | 439 | 1.21k | return 0; | 440 | 5.36k | frac = celt_exp2_frac(x-SHL16(integer,10)); | 441 | 5.36k | return VSHR32(EXTEND32(frac), -integer-2); | 442 | 6.80k | } |
Unexecuted instantiation: opus_multistream_encoder.c:celt_exp2 Unexecuted instantiation: analysis.c:celt_exp2 Unexecuted instantiation: opus_projection_decoder.c:celt_exp2 Line | Count | Source | 432 | 280k | { | 433 | 280k | int integer; | 434 | 280k | opus_val16 frac; | 435 | 280k | integer = SHR16(x,10); | 436 | 280k | if (integer>14) | 437 | 0 | return 0x7f000000; | 438 | 280k | else if (integer < -15) | 439 | 0 | return 0; | 440 | 280k | frac = celt_exp2_frac(x-SHL16(integer,10)); | 441 | 280k | return VSHR32(EXTEND32(frac), -integer-2); | 442 | 280k | } |
|
443 | | |
444 | | #ifdef ENABLE_QEXT |
445 | | |
446 | | /* Calculates the base-2 logarithm of a Q14 input value. The result is returned |
447 | | * in Q(DB_SHIFT). If the input value is 0, the function will output -32.0f. */ |
448 | 2.32M | static OPUS_INLINE opus_val32 celt_log2_db(opus_val32 x) { |
449 | | /* Q30 */ |
450 | 2.32M | static const opus_val32 log2_x_norm_coeff[8] = { |
451 | 2.32M | 1073741824, 954437184, 858993472, 780903168, |
452 | 2.32M | 715827904, 660764224, 613566784, 572662336}; |
453 | | /* Q24 */ |
454 | 2.32M | static const opus_val32 log2_y_norm_coeff[8] = { |
455 | 2.32M | 0, 2850868, 5401057, 7707983, |
456 | 2.32M | 9814042, 11751428, 13545168, 15215099}; |
457 | 2.32M | static const opus_val32 LOG2_COEFF_A0 = 1467383; /* Q24 */ |
458 | 2.32M | static const opus_val32 LOG2_COEFF_A1 = 182244800; /* Q27 */ |
459 | 2.32M | static const opus_val32 LOG2_COEFF_A2 = -21440512; /* Q25 */ |
460 | 2.32M | static const opus_val32 LOG2_COEFF_A3 = 107903336; /* Q28 */ |
461 | 2.32M | static const opus_val32 LOG2_COEFF_A4 = -610217024; /* Q31 */ |
462 | | |
463 | 2.32M | opus_int32 integer, norm_coeff_idx, tmp; |
464 | 2.32M | opus_val32 mantissa; |
465 | 2.32M | if (x==0) { |
466 | 0 | return -536870912; /* -32.0f */ |
467 | 0 | } |
468 | 2.32M | integer = SUB32(celt_ilog2(x), 14); /* Q0 */ |
469 | 2.32M | mantissa = VSHR32(x, integer + 14 - 29); /* Q29 */ |
470 | 2.32M | norm_coeff_idx = SHR32(mantissa, 29 - 3) & 0x7; |
471 | | /* mantissa is in Q28 (29 + Q_NORM_CONST - 31 where Q_NORM_CONST is Q30) |
472 | | * 285212672 (Q28) is 1.0625f. */ |
473 | 2.32M | mantissa = SUB32(MULT32_32_Q31(mantissa, log2_x_norm_coeff[norm_coeff_idx]), |
474 | 2.32M | 285212672); |
475 | | |
476 | | /* q_a3(Q28): q_mantissa + q_a4 - 31 |
477 | | * q_a2(Q25): q_mantissa + q_a3 - 31 |
478 | | * q_a1(Q27): q_mantissa + q_a2 - 31 + 5 |
479 | | * q_a0(Q24): q_mantissa + q_a1 - 31 |
480 | | * where q_mantissa is Q28 */ |
481 | | /* Split evaluation in steps to avoid exploding macro expansion. */ |
482 | 2.32M | tmp = MULT32_32_Q31(mantissa, LOG2_COEFF_A4); |
483 | 2.32M | tmp = MULT32_32_Q31(mantissa, ADD32(LOG2_COEFF_A3, tmp)); |
484 | 2.32M | tmp = SHL32(MULT32_32_Q31(mantissa, ADD32(LOG2_COEFF_A2, tmp)), 5 /* SHL32 for LOG2_COEFF_A1 */); |
485 | 2.32M | tmp = MULT32_32_Q31(mantissa, ADD32(LOG2_COEFF_A1, tmp)); |
486 | 2.32M | return ADD32(log2_y_norm_coeff[norm_coeff_idx], |
487 | 2.32M | ADD32(SHL32(integer, DB_SHIFT), |
488 | 2.32M | ADD32(LOG2_COEFF_A0, tmp))); |
489 | 2.32M | } Unexecuted instantiation: opus_projection_encoder.c:celt_log2_db Unexecuted instantiation: celt.c:celt_log2_db Unexecuted instantiation: mathops.c:celt_log2_db Unexecuted instantiation: opus_encoder.c:celt_log2_db Unexecuted instantiation: opus_multistream_encoder.c:celt_log2_db Unexecuted instantiation: analysis.c:celt_log2_db Unexecuted instantiation: bands.c:celt_log2_db Unexecuted instantiation: celt_encoder.c:celt_log2_db Unexecuted instantiation: kiss_fft.c:celt_log2_db Unexecuted instantiation: mdct.c:celt_log2_db Unexecuted instantiation: modes.c:celt_log2_db Unexecuted instantiation: pitch.c:celt_log2_db Unexecuted instantiation: celt_lpc.c:celt_log2_db quant_bands.c:celt_log2_db Line | Count | Source | 448 | 2.32M | static OPUS_INLINE opus_val32 celt_log2_db(opus_val32 x) { | 449 | | /* Q30 */ | 450 | 2.32M | static const opus_val32 log2_x_norm_coeff[8] = { | 451 | 2.32M | 1073741824, 954437184, 858993472, 780903168, | 452 | 2.32M | 715827904, 660764224, 613566784, 572662336}; | 453 | | /* Q24 */ | 454 | 2.32M | static const opus_val32 log2_y_norm_coeff[8] = { | 455 | 2.32M | 0, 2850868, 5401057, 7707983, | 456 | 2.32M | 9814042, 11751428, 13545168, 15215099}; | 457 | 2.32M | static const opus_val32 LOG2_COEFF_A0 = 1467383; /* Q24 */ | 458 | 2.32M | static const opus_val32 LOG2_COEFF_A1 = 182244800; /* Q27 */ | 459 | 2.32M | static const opus_val32 LOG2_COEFF_A2 = -21440512; /* Q25 */ | 460 | 2.32M | static const opus_val32 LOG2_COEFF_A3 = 107903336; /* Q28 */ | 461 | 2.32M | static const opus_val32 LOG2_COEFF_A4 = -610217024; /* Q31 */ | 462 | | | 463 | 2.32M | opus_int32 integer, norm_coeff_idx, tmp; | 464 | 2.32M | opus_val32 mantissa; | 465 | 2.32M | if (x==0) { | 466 | 0 | return -536870912; /* -32.0f */ | 467 | 0 | } | 468 | 2.32M | integer = SUB32(celt_ilog2(x), 14); /* Q0 */ | 469 | 2.32M | mantissa = VSHR32(x, integer + 14 - 29); /* Q29 */ | 470 | 2.32M | norm_coeff_idx = SHR32(mantissa, 29 - 3) & 0x7; | 471 | | /* mantissa is in Q28 (29 + Q_NORM_CONST - 31 where Q_NORM_CONST is Q30) | 472 | | * 285212672 (Q28) is 1.0625f. */ | 473 | 2.32M | mantissa = SUB32(MULT32_32_Q31(mantissa, log2_x_norm_coeff[norm_coeff_idx]), | 474 | 2.32M | 285212672); | 475 | | | 476 | | /* q_a3(Q28): q_mantissa + q_a4 - 31 | 477 | | * q_a2(Q25): q_mantissa + q_a3 - 31 | 478 | | * q_a1(Q27): q_mantissa + q_a2 - 31 + 5 | 479 | | * q_a0(Q24): q_mantissa + q_a1 - 31 | 480 | | * where q_mantissa is Q28 */ | 481 | | /* Split evaluation in steps to avoid exploding macro expansion. */ | 482 | 2.32M | tmp = MULT32_32_Q31(mantissa, LOG2_COEFF_A4); | 483 | 2.32M | tmp = MULT32_32_Q31(mantissa, ADD32(LOG2_COEFF_A3, tmp)); | 484 | 2.32M | tmp = SHL32(MULT32_32_Q31(mantissa, ADD32(LOG2_COEFF_A2, tmp)), 5 /* SHL32 for LOG2_COEFF_A1 */); | 485 | 2.32M | tmp = MULT32_32_Q31(mantissa, ADD32(LOG2_COEFF_A1, tmp)); | 486 | 2.32M | return ADD32(log2_y_norm_coeff[norm_coeff_idx], | 487 | 2.32M | ADD32(SHL32(integer, DB_SHIFT), | 488 | 2.32M | ADD32(LOG2_COEFF_A0, tmp))); | 489 | 2.32M | } |
Unexecuted instantiation: rate.c:celt_log2_db Unexecuted instantiation: vq.c:celt_log2_db Unexecuted instantiation: pitch_sse2.c:celt_log2_db Unexecuted instantiation: celt_lpc_sse4_1.c:celt_log2_db Unexecuted instantiation: pitch_sse4_1.c:celt_log2_db Unexecuted instantiation: opus.c:celt_log2_db Unexecuted instantiation: opus_decoder.c:celt_log2_db Unexecuted instantiation: celt_decoder.c:celt_log2_db Unexecuted instantiation: cwrs.c:celt_log2_db Unexecuted instantiation: laplace.c:celt_log2_db Unexecuted instantiation: opus_projection_decoder.c:celt_log2_db |
490 | | |
491 | | /* Calculates exp2 for Q28 within a specific range (0 to 1.0) using fixed-point |
492 | | * arithmetic. The input number must be adjusted for Q DB_SHIFT. */ |
493 | | static OPUS_INLINE opus_val32 celt_exp2_db_frac(opus_val32 x) |
494 | 2.36M | { |
495 | | /* Approximation constants. */ |
496 | 2.36M | static const opus_int32 EXP2_COEFF_A0 = 268435440; /* Q28 */ |
497 | 2.36M | static const opus_int32 EXP2_COEFF_A1 = 744267456; /* Q30 */ |
498 | 2.36M | static const opus_int32 EXP2_COEFF_A2 = 1031451904; /* Q32 */ |
499 | 2.36M | static const opus_int32 EXP2_COEFF_A3 = 959088832; /* Q34 */ |
500 | 2.36M | static const opus_int32 EXP2_COEFF_A4 = 617742720; /* Q36 */ |
501 | 2.36M | static const opus_int32 EXP2_COEFF_A5 = 516104352; /* Q38 */ |
502 | 2.36M | opus_int32 tmp; |
503 | | /* Converts input value from Q24 to Q29. */ |
504 | 2.36M | opus_val32 x_q29 = SHL32(x, 29 - 24); |
505 | | /* Split evaluation in steps to avoid exploding macro expansion. */ |
506 | 2.36M | tmp = ADD32(EXP2_COEFF_A4, MULT32_32_Q31(x_q29, EXP2_COEFF_A5)); |
507 | 2.36M | tmp = ADD32(EXP2_COEFF_A3, MULT32_32_Q31(x_q29, tmp)); |
508 | 2.36M | tmp = ADD32(EXP2_COEFF_A2, MULT32_32_Q31(x_q29, tmp)); |
509 | 2.36M | tmp = ADD32(EXP2_COEFF_A1, MULT32_32_Q31(x_q29, tmp)); |
510 | 2.36M | return ADD32(EXP2_COEFF_A0, MULT32_32_Q31(x_q29, tmp)); |
511 | 2.36M | } Unexecuted instantiation: opus_projection_encoder.c:celt_exp2_db_frac Unexecuted instantiation: celt.c:celt_exp2_db_frac Unexecuted instantiation: mathops.c:celt_exp2_db_frac Unexecuted instantiation: opus_encoder.c:celt_exp2_db_frac Unexecuted instantiation: opus_multistream_encoder.c:celt_exp2_db_frac Unexecuted instantiation: analysis.c:celt_exp2_db_frac bands.c:celt_exp2_db_frac Line | Count | Source | 494 | 1.82M | { | 495 | | /* Approximation constants. */ | 496 | 1.82M | static const opus_int32 EXP2_COEFF_A0 = 268435440; /* Q28 */ | 497 | 1.82M | static const opus_int32 EXP2_COEFF_A1 = 744267456; /* Q30 */ | 498 | 1.82M | static const opus_int32 EXP2_COEFF_A2 = 1031451904; /* Q32 */ | 499 | 1.82M | static const opus_int32 EXP2_COEFF_A3 = 959088832; /* Q34 */ | 500 | 1.82M | static const opus_int32 EXP2_COEFF_A4 = 617742720; /* Q36 */ | 501 | 1.82M | static const opus_int32 EXP2_COEFF_A5 = 516104352; /* Q38 */ | 502 | 1.82M | opus_int32 tmp; | 503 | | /* Converts input value from Q24 to Q29. */ | 504 | 1.82M | opus_val32 x_q29 = SHL32(x, 29 - 24); | 505 | | /* Split evaluation in steps to avoid exploding macro expansion. */ | 506 | 1.82M | tmp = ADD32(EXP2_COEFF_A4, MULT32_32_Q31(x_q29, EXP2_COEFF_A5)); | 507 | 1.82M | tmp = ADD32(EXP2_COEFF_A3, MULT32_32_Q31(x_q29, tmp)); | 508 | 1.82M | tmp = ADD32(EXP2_COEFF_A2, MULT32_32_Q31(x_q29, tmp)); | 509 | 1.82M | tmp = ADD32(EXP2_COEFF_A1, MULT32_32_Q31(x_q29, tmp)); | 510 | 1.82M | return ADD32(EXP2_COEFF_A0, MULT32_32_Q31(x_q29, tmp)); | 511 | 1.82M | } |
celt_encoder.c:celt_exp2_db_frac Line | Count | Source | 494 | 533k | { | 495 | | /* Approximation constants. */ | 496 | 533k | static const opus_int32 EXP2_COEFF_A0 = 268435440; /* Q28 */ | 497 | 533k | static const opus_int32 EXP2_COEFF_A1 = 744267456; /* Q30 */ | 498 | 533k | static const opus_int32 EXP2_COEFF_A2 = 1031451904; /* Q32 */ | 499 | 533k | static const opus_int32 EXP2_COEFF_A3 = 959088832; /* Q34 */ | 500 | 533k | static const opus_int32 EXP2_COEFF_A4 = 617742720; /* Q36 */ | 501 | 533k | static const opus_int32 EXP2_COEFF_A5 = 516104352; /* Q38 */ | 502 | 533k | opus_int32 tmp; | 503 | | /* Converts input value from Q24 to Q29. */ | 504 | 533k | opus_val32 x_q29 = SHL32(x, 29 - 24); | 505 | | /* Split evaluation in steps to avoid exploding macro expansion. */ | 506 | 533k | tmp = ADD32(EXP2_COEFF_A4, MULT32_32_Q31(x_q29, EXP2_COEFF_A5)); | 507 | 533k | tmp = ADD32(EXP2_COEFF_A3, MULT32_32_Q31(x_q29, tmp)); | 508 | 533k | tmp = ADD32(EXP2_COEFF_A2, MULT32_32_Q31(x_q29, tmp)); | 509 | 533k | tmp = ADD32(EXP2_COEFF_A1, MULT32_32_Q31(x_q29, tmp)); | 510 | 533k | return ADD32(EXP2_COEFF_A0, MULT32_32_Q31(x_q29, tmp)); | 511 | 533k | } |
Unexecuted instantiation: kiss_fft.c:celt_exp2_db_frac Unexecuted instantiation: mdct.c:celt_exp2_db_frac Unexecuted instantiation: modes.c:celt_exp2_db_frac Unexecuted instantiation: pitch.c:celt_exp2_db_frac Unexecuted instantiation: celt_lpc.c:celt_exp2_db_frac Unexecuted instantiation: quant_bands.c:celt_exp2_db_frac Unexecuted instantiation: rate.c:celt_exp2_db_frac Unexecuted instantiation: vq.c:celt_exp2_db_frac Unexecuted instantiation: pitch_sse2.c:celt_exp2_db_frac Unexecuted instantiation: celt_lpc_sse4_1.c:celt_exp2_db_frac Unexecuted instantiation: pitch_sse4_1.c:celt_exp2_db_frac Unexecuted instantiation: opus.c:celt_exp2_db_frac Unexecuted instantiation: opus_decoder.c:celt_exp2_db_frac Unexecuted instantiation: celt_decoder.c:celt_exp2_db_frac Unexecuted instantiation: cwrs.c:celt_exp2_db_frac Unexecuted instantiation: laplace.c:celt_exp2_db_frac Unexecuted instantiation: opus_projection_decoder.c:celt_exp2_db_frac |
512 | | |
513 | | /* Calculates exp2 for Q16 using fixed-point arithmetic. The input number must |
514 | | * be adjusted for Q DB_SHIFT. */ |
515 | | static OPUS_INLINE opus_val32 celt_exp2_db(opus_val32 x) |
516 | 540k | { |
517 | 540k | int integer; |
518 | 540k | opus_val32 frac; |
519 | 540k | integer = SHR32(x,DB_SHIFT); |
520 | 540k | if (integer>14) |
521 | 0 | return 0x7f000000; |
522 | 540k | else if (integer <= -17) |
523 | 0 | return 0; |
524 | 540k | frac = celt_exp2_db_frac(x-SHL32(integer, DB_SHIFT)); /* Q28 */ |
525 | 540k | return VSHR32(frac, -integer + 28 - 16); /* Q16 */ |
526 | 540k | } Unexecuted instantiation: opus_projection_encoder.c:celt_exp2_db Unexecuted instantiation: celt.c:celt_exp2_db Unexecuted instantiation: mathops.c:celt_exp2_db Unexecuted instantiation: opus_encoder.c:celt_exp2_db Unexecuted instantiation: opus_multistream_encoder.c:celt_exp2_db Unexecuted instantiation: analysis.c:celt_exp2_db Line | Count | Source | 516 | 6.77k | { | 517 | 6.77k | int integer; | 518 | 6.77k | opus_val32 frac; | 519 | 6.77k | integer = SHR32(x,DB_SHIFT); | 520 | 6.77k | if (integer>14) | 521 | 0 | return 0x7f000000; | 522 | 6.77k | else if (integer <= -17) | 523 | 0 | return 0; | 524 | 6.77k | frac = celt_exp2_db_frac(x-SHL32(integer, DB_SHIFT)); /* Q28 */ | 525 | 6.77k | return VSHR32(frac, -integer + 28 - 16); /* Q16 */ | 526 | 6.77k | } |
celt_encoder.c:celt_exp2_db Line | Count | Source | 516 | 533k | { | 517 | 533k | int integer; | 518 | 533k | opus_val32 frac; | 519 | 533k | integer = SHR32(x,DB_SHIFT); | 520 | 533k | if (integer>14) | 521 | 0 | return 0x7f000000; | 522 | 533k | else if (integer <= -17) | 523 | 0 | return 0; | 524 | 533k | frac = celt_exp2_db_frac(x-SHL32(integer, DB_SHIFT)); /* Q28 */ | 525 | 533k | return VSHR32(frac, -integer + 28 - 16); /* Q16 */ | 526 | 533k | } |
Unexecuted instantiation: kiss_fft.c:celt_exp2_db Unexecuted instantiation: mdct.c:celt_exp2_db Unexecuted instantiation: modes.c:celt_exp2_db Unexecuted instantiation: pitch.c:celt_exp2_db Unexecuted instantiation: celt_lpc.c:celt_exp2_db Unexecuted instantiation: quant_bands.c:celt_exp2_db Unexecuted instantiation: rate.c:celt_exp2_db Unexecuted instantiation: vq.c:celt_exp2_db Unexecuted instantiation: pitch_sse2.c:celt_exp2_db Unexecuted instantiation: celt_lpc_sse4_1.c:celt_exp2_db Unexecuted instantiation: pitch_sse4_1.c:celt_exp2_db Unexecuted instantiation: opus.c:celt_exp2_db Unexecuted instantiation: opus_decoder.c:celt_exp2_db Unexecuted instantiation: celt_decoder.c:celt_exp2_db Unexecuted instantiation: cwrs.c:celt_exp2_db Unexecuted instantiation: laplace.c:celt_exp2_db Unexecuted instantiation: opus_projection_decoder.c:celt_exp2_db |
527 | | #else |
528 | | |
529 | 7.36M | #define celt_log2_db(x) SHL32(EXTEND32(celt_log2(x)), DB_SHIFT-10) |
530 | | #define celt_exp2_db_frac(x) SHL32(celt_exp2_frac(PSHR32(x, DB_SHIFT-10)), 14) |
531 | | #define celt_exp2_db(x) celt_exp2(PSHR32(x, DB_SHIFT-10)) |
532 | | |
533 | | #endif |
534 | | |
535 | | |
536 | | opus_val32 celt_rcp(opus_val32 x); |
537 | | opus_val32 celt_rcp_norm32(opus_val32 x); |
538 | | |
539 | 905k | #define celt_div(a,b) MULT32_32_Q31((opus_val32)(a),celt_rcp(b)) |
540 | | |
541 | | opus_val32 frac_div32_q29(opus_val32 a, opus_val32 b); |
542 | | opus_val32 frac_div32(opus_val32 a, opus_val32 b); |
543 | | |
544 | | /* Computes atan(x) multiplied by 2/PI. The input value (x) should be within the |
545 | | * range of -1 to 1 and represented in Q30 format. The function will return the |
546 | | * result in Q30 format. */ |
547 | | static OPUS_INLINE opus_val32 celt_atan_norm(opus_val32 x) |
548 | 1.21M | { |
549 | | /* Approximation constants. */ |
550 | 1.21M | static const opus_int32 ATAN_2_OVER_PI = 1367130551; /* Q31 */ |
551 | 1.21M | static const opus_int32 ATAN_COEFF_A03 = -715791936; /* Q31 */ |
552 | 1.21M | static const opus_int32 ATAN_COEFF_A05 = 857391616; /* Q32 */ |
553 | 1.21M | static const opus_int32 ATAN_COEFF_A07 = -1200579328; /* Q33 */ |
554 | 1.21M | static const opus_int32 ATAN_COEFF_A09 = 1682636672; /* Q34 */ |
555 | 1.21M | static const opus_int32 ATAN_COEFF_A11 = -1985085440; /* Q35 */ |
556 | 1.21M | static const opus_int32 ATAN_COEFF_A13 = 1583306112; /* Q36 */ |
557 | 1.21M | static const opus_int32 ATAN_COEFF_A15 = -598602432; /* Q37 */ |
558 | 1.21M | opus_int32 x_sq_q30; |
559 | 1.21M | opus_int32 x_q31; |
560 | 1.21M | opus_int32 tmp; |
561 | | /* The expected x is in the range of [-1.0f, 1.0f] */ |
562 | 1.21M | celt_sig_assert((x <= 1073741824) && (x >= -1073741824)); |
563 | | |
564 | | /* If x = 1.0f, returns 0.5f */ |
565 | 1.21M | if (x == 1073741824) |
566 | 0 | { |
567 | 0 | return 536870912; /* 0.5f (Q30) */ |
568 | 0 | } |
569 | | /* If x = 1.0f, returns 0.5f */ |
570 | 1.21M | if (x == -1073741824) |
571 | 0 | { |
572 | 0 | return -536870912; /* -0.5f (Q30) */ |
573 | 0 | } |
574 | 1.21M | x_q31 = SHL32(x, 1); |
575 | 1.21M | x_sq_q30 = MULT32_32_Q31(x_q31, x); |
576 | | /* Split evaluation in steps to avoid exploding macro expansion. */ |
577 | 1.21M | tmp = MULT32_32_Q31(x_sq_q30, ATAN_COEFF_A15); |
578 | 1.21M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A13, tmp)); |
579 | 1.21M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A11, tmp)); |
580 | 1.21M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A09, tmp)); |
581 | 1.21M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A07, tmp)); |
582 | 1.21M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A05, tmp)); |
583 | 1.21M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A03, tmp)); |
584 | 1.21M | tmp = ADD32(x, MULT32_32_Q31(x_q31, tmp)); |
585 | 1.21M | return MULT32_32_Q31(ATAN_2_OVER_PI, tmp); |
586 | 1.21M | } Unexecuted instantiation: celt.c:celt_atan_norm Unexecuted instantiation: opus.c:celt_atan_norm Unexecuted instantiation: opus_decoder.c:celt_atan_norm Unexecuted instantiation: celt_decoder.c:celt_atan_norm Unexecuted instantiation: mathops.c:celt_atan_norm Unexecuted instantiation: mdct.c:celt_atan_norm Unexecuted instantiation: modes.c:celt_atan_norm Unexecuted instantiation: pitch.c:celt_atan_norm Unexecuted instantiation: celt_lpc.c:celt_atan_norm Unexecuted instantiation: quant_bands.c:celt_atan_norm Unexecuted instantiation: rate.c:celt_atan_norm Line | Count | Source | 548 | 1.21M | { | 549 | | /* Approximation constants. */ | 550 | 1.21M | static const opus_int32 ATAN_2_OVER_PI = 1367130551; /* Q31 */ | 551 | 1.21M | static const opus_int32 ATAN_COEFF_A03 = -715791936; /* Q31 */ | 552 | 1.21M | static const opus_int32 ATAN_COEFF_A05 = 857391616; /* Q32 */ | 553 | 1.21M | static const opus_int32 ATAN_COEFF_A07 = -1200579328; /* Q33 */ | 554 | 1.21M | static const opus_int32 ATAN_COEFF_A09 = 1682636672; /* Q34 */ | 555 | 1.21M | static const opus_int32 ATAN_COEFF_A11 = -1985085440; /* Q35 */ | 556 | 1.21M | static const opus_int32 ATAN_COEFF_A13 = 1583306112; /* Q36 */ | 557 | 1.21M | static const opus_int32 ATAN_COEFF_A15 = -598602432; /* Q37 */ | 558 | 1.21M | opus_int32 x_sq_q30; | 559 | 1.21M | opus_int32 x_q31; | 560 | 1.21M | opus_int32 tmp; | 561 | | /* The expected x is in the range of [-1.0f, 1.0f] */ | 562 | 1.21M | celt_sig_assert((x <= 1073741824) && (x >= -1073741824)); | 563 | | | 564 | | /* If x = 1.0f, returns 0.5f */ | 565 | 1.21M | if (x == 1073741824) | 566 | 0 | { | 567 | 0 | return 536870912; /* 0.5f (Q30) */ | 568 | 0 | } | 569 | | /* If x = 1.0f, returns 0.5f */ | 570 | 1.21M | if (x == -1073741824) | 571 | 0 | { | 572 | 0 | return -536870912; /* -0.5f (Q30) */ | 573 | 0 | } | 574 | 1.21M | x_q31 = SHL32(x, 1); | 575 | 1.21M | x_sq_q30 = MULT32_32_Q31(x_q31, x); | 576 | | /* Split evaluation in steps to avoid exploding macro expansion. */ | 577 | 1.21M | tmp = MULT32_32_Q31(x_sq_q30, ATAN_COEFF_A15); | 578 | 1.21M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A13, tmp)); | 579 | 1.21M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A11, tmp)); | 580 | 1.21M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A09, tmp)); | 581 | 1.21M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A07, tmp)); | 582 | 1.21M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A05, tmp)); | 583 | 1.21M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A03, tmp)); | 584 | 1.21M | tmp = ADD32(x, MULT32_32_Q31(x_q31, tmp)); | 585 | 1.21M | return MULT32_32_Q31(ATAN_2_OVER_PI, tmp); | 586 | 1.21M | } |
Unexecuted instantiation: pitch_sse2.c:celt_atan_norm Unexecuted instantiation: celt_lpc_sse4_1.c:celt_atan_norm Unexecuted instantiation: pitch_sse4_1.c:celt_atan_norm Unexecuted instantiation: bands.c:celt_atan_norm Unexecuted instantiation: cwrs.c:celt_atan_norm Unexecuted instantiation: kiss_fft.c:celt_atan_norm Unexecuted instantiation: laplace.c:celt_atan_norm Unexecuted instantiation: opus_projection_encoder.c:celt_atan_norm Unexecuted instantiation: opus_encoder.c:celt_atan_norm Unexecuted instantiation: opus_multistream_encoder.c:celt_atan_norm Unexecuted instantiation: analysis.c:celt_atan_norm Unexecuted instantiation: celt_encoder.c:celt_atan_norm Unexecuted instantiation: opus_projection_decoder.c:celt_atan_norm |
587 | | |
588 | | /* Calculates the arctangent of y/x, multiplies the result by 2/pi, and returns |
589 | | * the value in Q30 format. Both input values (x and y) must be within the range |
590 | | * of 0 to 1 and represented in Q30 format. Inputs must be zero or greater, and |
591 | | * at least one input must be non-zero. */ |
592 | | static OPUS_INLINE opus_val32 celt_atan2p_norm(opus_val32 y, opus_val32 x) |
593 | 1.32M | { |
594 | 1.32M | celt_sig_assert(x>=0 && y>=0); |
595 | 1.32M | if (y==0 && x==0) { |
596 | 113k | return 0; |
597 | 1.21M | } else if (y < x) { |
598 | 588k | return celt_atan_norm(SHR32(frac_div32(y, x), 1)); |
599 | 623k | } else { |
600 | 623k | celt_sig_assert(y > 0); |
601 | 623k | return 1073741824 /* 1.0f Q30 */ - |
602 | 623k | celt_atan_norm(SHR32(frac_div32(x, y), 1)); |
603 | 623k | } |
604 | 1.32M | } Unexecuted instantiation: celt.c:celt_atan2p_norm Unexecuted instantiation: opus.c:celt_atan2p_norm Unexecuted instantiation: opus_decoder.c:celt_atan2p_norm Unexecuted instantiation: celt_decoder.c:celt_atan2p_norm Unexecuted instantiation: mathops.c:celt_atan2p_norm Unexecuted instantiation: mdct.c:celt_atan2p_norm Unexecuted instantiation: modes.c:celt_atan2p_norm Unexecuted instantiation: pitch.c:celt_atan2p_norm Unexecuted instantiation: celt_lpc.c:celt_atan2p_norm Unexecuted instantiation: quant_bands.c:celt_atan2p_norm Unexecuted instantiation: rate.c:celt_atan2p_norm Line | Count | Source | 593 | 1.32M | { | 594 | 1.32M | celt_sig_assert(x>=0 && y>=0); | 595 | 1.32M | if (y==0 && x==0) { | 596 | 113k | return 0; | 597 | 1.21M | } else if (y < x) { | 598 | 588k | return celt_atan_norm(SHR32(frac_div32(y, x), 1)); | 599 | 623k | } else { | 600 | 623k | celt_sig_assert(y > 0); | 601 | 623k | return 1073741824 /* 1.0f Q30 */ - | 602 | 623k | celt_atan_norm(SHR32(frac_div32(x, y), 1)); | 603 | 623k | } | 604 | 1.32M | } |
Unexecuted instantiation: pitch_sse2.c:celt_atan2p_norm Unexecuted instantiation: celt_lpc_sse4_1.c:celt_atan2p_norm Unexecuted instantiation: pitch_sse4_1.c:celt_atan2p_norm Unexecuted instantiation: bands.c:celt_atan2p_norm Unexecuted instantiation: cwrs.c:celt_atan2p_norm Unexecuted instantiation: kiss_fft.c:celt_atan2p_norm Unexecuted instantiation: laplace.c:celt_atan2p_norm Unexecuted instantiation: opus_projection_encoder.c:celt_atan2p_norm Unexecuted instantiation: opus_encoder.c:celt_atan2p_norm Unexecuted instantiation: opus_multistream_encoder.c:celt_atan2p_norm Unexecuted instantiation: analysis.c:celt_atan2p_norm Unexecuted instantiation: celt_encoder.c:celt_atan2p_norm Unexecuted instantiation: opus_projection_decoder.c:celt_atan2p_norm |
605 | | |
606 | | #define M1 32767 |
607 | | #define M2 -21 |
608 | | #define M3 -11943 |
609 | | #define M4 4936 |
610 | | |
611 | | /* Atan approximation using a 4th order polynomial. Input is in Q15 format |
612 | | and normalized by pi/4. Output is in Q15 format */ |
613 | | static OPUS_INLINE opus_val16 celt_atan01(opus_val16 x) |
614 | 0 | { |
615 | 0 | return MULT16_16_P15(x, ADD32(M1, MULT16_16_P15(x, ADD32(M2, MULT16_16_P15(x, ADD32(M3, MULT16_16_P15(M4, x))))))); |
616 | 0 | } Unexecuted instantiation: celt.c:celt_atan01 Unexecuted instantiation: opus.c:celt_atan01 Unexecuted instantiation: opus_decoder.c:celt_atan01 Unexecuted instantiation: celt_decoder.c:celt_atan01 Unexecuted instantiation: mathops.c:celt_atan01 Unexecuted instantiation: mdct.c:celt_atan01 Unexecuted instantiation: modes.c:celt_atan01 Unexecuted instantiation: pitch.c:celt_atan01 Unexecuted instantiation: celt_lpc.c:celt_atan01 Unexecuted instantiation: quant_bands.c:celt_atan01 Unexecuted instantiation: rate.c:celt_atan01 Unexecuted instantiation: vq.c:celt_atan01 Unexecuted instantiation: pitch_sse2.c:celt_atan01 Unexecuted instantiation: celt_lpc_sse4_1.c:celt_atan01 Unexecuted instantiation: pitch_sse4_1.c:celt_atan01 Unexecuted instantiation: bands.c:celt_atan01 Unexecuted instantiation: cwrs.c:celt_atan01 Unexecuted instantiation: kiss_fft.c:celt_atan01 Unexecuted instantiation: laplace.c:celt_atan01 Unexecuted instantiation: opus_projection_encoder.c:celt_atan01 Unexecuted instantiation: opus_encoder.c:celt_atan01 Unexecuted instantiation: opus_multistream_encoder.c:celt_atan01 Unexecuted instantiation: analysis.c:celt_atan01 Unexecuted instantiation: celt_encoder.c:celt_atan01 Unexecuted instantiation: opus_projection_decoder.c:celt_atan01 |
617 | | |
618 | | #undef M1 |
619 | | #undef M2 |
620 | | #undef M3 |
621 | | #undef M4 |
622 | | |
623 | | /* atan2() approximation valid for positive input values */ |
624 | | static OPUS_INLINE opus_val16 celt_atan2p(opus_val16 y, opus_val16 x) |
625 | 0 | { |
626 | 0 | if (x==0 && y==0) { |
627 | 0 | return 0; |
628 | 0 | } else if (y < x) |
629 | 0 | { |
630 | 0 | opus_val32 arg; |
631 | 0 | arg = celt_div(SHL32(EXTEND32(y),15),x); |
632 | 0 | if (arg >= 32767) |
633 | 0 | arg = 32767; |
634 | 0 | return SHR16(celt_atan01(EXTRACT16(arg)),1); |
635 | 0 | } else { |
636 | 0 | opus_val32 arg; |
637 | 0 | arg = celt_div(SHL32(EXTEND32(x),15),y); |
638 | 0 | if (arg >= 32767) |
639 | 0 | arg = 32767; |
640 | 0 | return 25736-SHR16(celt_atan01(EXTRACT16(arg)),1); |
641 | 0 | } |
642 | 0 | } Unexecuted instantiation: celt.c:celt_atan2p Unexecuted instantiation: opus.c:celt_atan2p Unexecuted instantiation: opus_decoder.c:celt_atan2p Unexecuted instantiation: celt_decoder.c:celt_atan2p Unexecuted instantiation: mathops.c:celt_atan2p Unexecuted instantiation: mdct.c:celt_atan2p Unexecuted instantiation: modes.c:celt_atan2p Unexecuted instantiation: pitch.c:celt_atan2p Unexecuted instantiation: celt_lpc.c:celt_atan2p Unexecuted instantiation: quant_bands.c:celt_atan2p Unexecuted instantiation: rate.c:celt_atan2p Unexecuted instantiation: vq.c:celt_atan2p Unexecuted instantiation: pitch_sse2.c:celt_atan2p Unexecuted instantiation: celt_lpc_sse4_1.c:celt_atan2p Unexecuted instantiation: pitch_sse4_1.c:celt_atan2p Unexecuted instantiation: bands.c:celt_atan2p Unexecuted instantiation: cwrs.c:celt_atan2p Unexecuted instantiation: kiss_fft.c:celt_atan2p Unexecuted instantiation: laplace.c:celt_atan2p Unexecuted instantiation: opus_projection_encoder.c:celt_atan2p Unexecuted instantiation: opus_encoder.c:celt_atan2p Unexecuted instantiation: opus_multistream_encoder.c:celt_atan2p Unexecuted instantiation: analysis.c:celt_atan2p Unexecuted instantiation: celt_encoder.c:celt_atan2p Unexecuted instantiation: opus_projection_decoder.c:celt_atan2p |
643 | | |
644 | | #endif /* FIXED_POINT */ |
645 | | |
646 | | #ifndef DISABLE_FLOAT_API |
647 | | |
648 | | void celt_float2int16_c(const float * OPUS_RESTRICT in, short * OPUS_RESTRICT out, int cnt); |
649 | | |
650 | | #ifndef OVERRIDE_FLOAT2INT16 |
651 | 0 | #define celt_float2int16(in, out, cnt, arch) ((void)(arch), celt_float2int16_c(in, out, cnt)) |
652 | | #endif |
653 | | |
654 | | int opus_limit2_checkwithin1_c(float *samples, int cnt); |
655 | | |
656 | | #ifndef OVERRIDE_LIMIT2_CHECKWITHIN1 |
657 | 0 | #define opus_limit2_checkwithin1(samples, cnt, arch) ((void)(arch), opus_limit2_checkwithin1_c(samples, cnt)) |
658 | | #endif |
659 | | |
660 | | #endif /* DISABLE_FLOAT_API */ |
661 | | |
662 | | #endif /* MATHOPS_H */ |