Line | Count | Source (jump to first uncovered line) |
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 | 560M | #define PI 3.1415926535897931 |
48 | | |
49 | | /* Multiplies two 16-bit fractional values. Bit-exactness of this macro is important */ |
50 | 58.4M | #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 | 361M | #define cA 0.43157974f |
57 | 361M | #define cB 0.67848403f |
58 | 361M | #define cC 0.08595542f |
59 | 543M | #define cE ((float)PI/2) |
60 | 363M | static OPUS_INLINE float fast_atan2f(float y, float x) { |
61 | 363M | float x2, y2; |
62 | 363M | x2 = x*x; |
63 | 363M | y2 = y*y; |
64 | | /* For very small values, we don't care about the answer, so |
65 | | we can just return 0. */ |
66 | 363M | if (x2 + y2 < 1e-18f) |
67 | 2.08M | { |
68 | 2.08M | return 0; |
69 | 2.08M | } |
70 | 361M | if(x2<y2){ |
71 | 180M | float den = (y2 + cB*x2) * (y2 + cC*x2); |
72 | 180M | return -x*y*(y2 + cA*x2) / den + (y<0 ? -cE : cE); |
73 | 181M | }else{ |
74 | 181M | float den = (x2 + cB*y2) * (x2 + cC*y2); |
75 | 181M | return x*y*(x2 + cA*y2) / den + (y<0 ? -cE : cE) - (x*y<0 ? -cE : cE); |
76 | 181M | } |
77 | 361M | } Line | Count | Source | 60 | 363M | static OPUS_INLINE float fast_atan2f(float y, float x) { | 61 | 363M | float x2, y2; | 62 | 363M | x2 = x*x; | 63 | 363M | y2 = y*y; | 64 | | /* For very small values, we don't care about the answer, so | 65 | | we can just return 0. */ | 66 | 363M | if (x2 + y2 < 1e-18f) | 67 | 2.08M | { | 68 | 2.08M | return 0; | 69 | 2.08M | } | 70 | 361M | if(x2<y2){ | 71 | 180M | float den = (y2 + cB*x2) * (y2 + cC*x2); | 72 | 180M | return -x*y*(y2 + cA*x2) / den + (y<0 ? -cE : cE); | 73 | 181M | }else{ | 74 | 181M | float den = (x2 + cB*y2) * (x2 + cC*y2); | 75 | 181M | return x*y*(x2 + cA*y2) / den + (y<0 ? -cE : cE) - (x*y<0 ? -cE : cE); | 76 | 181M | } | 77 | 361M | } |
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 | 172M | { |
88 | 172M | int i; |
89 | 172M | opus_val16 maxval = 0; |
90 | 172M | opus_val16 minval = 0; |
91 | 52.3G | for (i=0;i<len;i++) |
92 | 52.1G | { |
93 | 52.1G | maxval = MAX16(maxval, x[i]); |
94 | 52.1G | minval = MIN16(minval, x[i]); |
95 | 52.1G | } |
96 | 172M | return MAX32(EXTEND32(maxval),-EXTEND32(minval)); |
97 | 172M | } 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 | 158k | { | 88 | 158k | int i; | 89 | 158k | opus_val16 maxval = 0; | 90 | 158k | opus_val16 minval = 0; | 91 | 89.5M | for (i=0;i<len;i++) | 92 | 89.4M | { | 93 | 89.4M | maxval = MAX16(maxval, x[i]); | 94 | 89.4M | minval = MIN16(minval, x[i]); | 95 | 89.4M | } | 96 | 158k | return MAX32(EXTEND32(maxval),-EXTEND32(minval)); | 97 | 158k | } |
Unexecuted instantiation: mathops.c:celt_maxabs16 Unexecuted instantiation: mdct.c:celt_maxabs16 Unexecuted instantiation: modes.c:celt_maxabs16 Line | Count | Source | 87 | 267k | { | 88 | 267k | int i; | 89 | 267k | opus_val16 maxval = 0; | 90 | 267k | opus_val16 minval = 0; | 91 | 85.8M | for (i=0;i<len;i++) | 92 | 85.5M | { | 93 | 85.5M | maxval = MAX16(maxval, x[i]); | 94 | 85.5M | minval = MIN16(minval, x[i]); | 95 | 85.5M | } | 96 | 267k | return MAX32(EXTEND32(maxval),-EXTEND32(minval)); | 97 | 267k | } |
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 | 133M | { | 88 | 133M | int i; | 89 | 133M | opus_val16 maxval = 0; | 90 | 133M | opus_val16 minval = 0; | 91 | 20.7G | for (i=0;i<len;i++) | 92 | 20.6G | { | 93 | 20.6G | maxval = MAX16(maxval, x[i]); | 94 | 20.6G | minval = MIN16(minval, x[i]); | 95 | 20.6G | } | 96 | 133M | return MAX32(EXTEND32(maxval),-EXTEND32(minval)); | 97 | 133M | } |
opus_encoder.c:celt_maxabs16 Line | Count | Source | 87 | 39.1M | { | 88 | 39.1M | int i; | 89 | 39.1M | opus_val16 maxval = 0; | 90 | 39.1M | opus_val16 minval = 0; | 91 | 31.3G | for (i=0;i<len;i++) | 92 | 31.3G | { | 93 | 31.3G | maxval = MAX16(maxval, x[i]); | 94 | 31.3G | minval = MIN16(minval, x[i]); | 95 | 31.3G | } | 96 | 39.1M | return MAX32(EXTEND32(maxval),-EXTEND32(minval)); | 97 | 39.1M | } |
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 | | #ifdef ENABLE_RES24 |
101 | | static OPUS_INLINE opus_res celt_maxabs_res(const opus_res *x, int len) |
102 | 340k | { |
103 | 340k | int i; |
104 | 340k | opus_res maxval = 0; |
105 | 340k | opus_res minval = 0; |
106 | 170M | for (i=0;i<len;i++) |
107 | 170M | { |
108 | 170M | maxval = MAX32(maxval, x[i]); |
109 | 170M | minval = MIN32(minval, x[i]); |
110 | 170M | } |
111 | | /* opus_res should never reach such amplitude, so we should be safe. */ |
112 | 340k | celt_sig_assert(minval != -2147483648); |
113 | 340k | return MAX32(maxval,-minval); |
114 | 340k | } Unexecuted instantiation: opus_projection_encoder.c:celt_maxabs_res Unexecuted instantiation: celt.c:celt_maxabs_res Unexecuted instantiation: mathops.c:celt_maxabs_res opus_encoder.c:celt_maxabs_res Line | Count | Source | 102 | 77.7k | { | 103 | 77.7k | int i; | 104 | 77.7k | opus_res maxval = 0; | 105 | 77.7k | opus_res minval = 0; | 106 | 133M | for (i=0;i<len;i++) | 107 | 133M | { | 108 | 133M | maxval = MAX32(maxval, x[i]); | 109 | 133M | minval = MIN32(minval, x[i]); | 110 | 133M | } | 111 | | /* opus_res should never reach such amplitude, so we should be safe. */ | 112 | 77.7k | celt_sig_assert(minval != -2147483648); | 113 | 77.7k | return MAX32(maxval,-minval); | 114 | 77.7k | } |
Unexecuted instantiation: opus_multistream_encoder.c:celt_maxabs_res Unexecuted instantiation: analysis.c:celt_maxabs_res Unexecuted instantiation: bands.c:celt_maxabs_res celt_encoder.c:celt_maxabs_res Line | Count | Source | 102 | 263k | { | 103 | 263k | int i; | 104 | 263k | opus_res maxval = 0; | 105 | 263k | opus_res minval = 0; | 106 | 37.3M | for (i=0;i<len;i++) | 107 | 37.1M | { | 108 | 37.1M | maxval = MAX32(maxval, x[i]); | 109 | 37.1M | minval = MIN32(minval, x[i]); | 110 | 37.1M | } | 111 | | /* opus_res should never reach such amplitude, so we should be safe. */ | 112 | 263k | celt_sig_assert(minval != -2147483648); | 113 | 263k | return MAX32(maxval,-minval); | 114 | 263k | } |
Unexecuted instantiation: kiss_fft.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: opus.c:celt_maxabs_res Unexecuted instantiation: opus_decoder.c:celt_maxabs_res Unexecuted instantiation: celt_decoder.c:celt_maxabs_res Unexecuted instantiation: cwrs.c:celt_maxabs_res Unexecuted instantiation: laplace.c:celt_maxabs_res Unexecuted instantiation: opus_projection_decoder.c:celt_maxabs_res |
115 | | #else |
116 | 94.4M | #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 | 5.38M | { |
124 | 5.38M | int i; |
125 | 5.38M | opus_val32 maxval = 0; |
126 | 5.38M | opus_val32 minval = 0; |
127 | 789M | for (i=0;i<len;i++) |
128 | 783M | { |
129 | 783M | maxval = MAX32(maxval, x[i]); |
130 | 783M | minval = MIN32(minval, x[i]); |
131 | 783M | } |
132 | 5.38M | return MAX32(maxval, -minval); |
133 | 5.38M | } 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 | 203k | { | 124 | 203k | int i; | 125 | 203k | opus_val32 maxval = 0; | 126 | 203k | opus_val32 minval = 0; | 127 | 382M | for (i=0;i<len;i++) | 128 | 382M | { | 129 | 382M | maxval = MAX32(maxval, x[i]); | 130 | 382M | minval = MIN32(minval, x[i]); | 131 | 382M | } | 132 | 203k | return MAX32(maxval, -minval); | 133 | 203k | } |
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 | 4.80M | { | 124 | 4.80M | int i; | 125 | 4.80M | opus_val32 maxval = 0; | 126 | 4.80M | opus_val32 minval = 0; | 127 | 61.7M | for (i=0;i<len;i++) | 128 | 56.9M | { | 129 | 56.9M | maxval = MAX32(maxval, x[i]); | 130 | 56.9M | minval = MIN32(minval, x[i]); | 131 | 56.9M | } | 132 | 4.80M | return MAX32(maxval, -minval); | 133 | 4.80M | } |
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 | 92.5k | { | 124 | 92.5k | int i; | 125 | 92.5k | opus_val32 maxval = 0; | 126 | 92.5k | opus_val32 minval = 0; | 127 | 66.7M | for (i=0;i<len;i++) | 128 | 66.6M | { | 129 | 66.6M | maxval = MAX32(maxval, x[i]); | 130 | 66.6M | minval = MIN32(minval, x[i]); | 131 | 66.6M | } | 132 | 92.5k | return MAX32(maxval, -minval); | 133 | 92.5k | } |
celt_encoder.c:celt_maxabs32 Line | Count | Source | 123 | 280k | { | 124 | 280k | int i; | 125 | 280k | opus_val32 maxval = 0; | 126 | 280k | opus_val32 minval = 0; | 127 | 278M | for (i=0;i<len;i++) | 128 | 278M | { | 129 | 278M | maxval = MAX32(maxval, x[i]); | 130 | 278M | minval = MIN32(minval, x[i]); | 131 | 278M | } | 132 | 280k | return MAX32(maxval, -minval); | 133 | 280k | } |
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 | 20.2M | { |
144 | 20.2M | #define ATAN2_2_OVER_PI 0.636619772367581f |
145 | 20.2M | 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 | 20.2M | #define ATAN2_COEFF_A03 -3.3331659436225891113281250000e-01f |
152 | 20.2M | #define ATAN2_COEFF_A05 1.99627041816711425781250000000e-01f |
153 | 20.2M | #define ATAN2_COEFF_A07 -1.3976582884788513183593750000e-01f |
154 | 20.2M | #define ATAN2_COEFF_A09 9.79423448443412780761718750000e-02f |
155 | 20.2M | #define ATAN2_COEFF_A11 -5.7773590087890625000000000000e-02f |
156 | 20.2M | #define ATAN2_COEFF_A13 2.30401363223791122436523437500e-02f |
157 | 20.2M | #define ATAN2_COEFF_A15 -4.3554059229791164398193359375e-03f |
158 | 20.2M | return ATAN2_2_OVER_PI * (x + x * x_sq * (ATAN2_COEFF_A03 |
159 | 20.2M | + x_sq * (ATAN2_COEFF_A05 |
160 | 20.2M | + x_sq * (ATAN2_COEFF_A07 |
161 | 20.2M | + x_sq * (ATAN2_COEFF_A09 |
162 | 20.2M | + x_sq * (ATAN2_COEFF_A11 |
163 | 20.2M | + x_sq * (ATAN2_COEFF_A13 |
164 | 20.2M | + x_sq * (ATAN2_COEFF_A15)))))))); |
165 | 20.2M | } Unexecuted instantiation: pitch_sse.c:celt_atan_norm Line | Count | Source | 143 | 20.2M | { | 144 | 20.2M | #define ATAN2_2_OVER_PI 0.636619772367581f | 145 | 20.2M | 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 | 20.2M | #define ATAN2_COEFF_A03 -3.3331659436225891113281250000e-01f | 152 | 20.2M | #define ATAN2_COEFF_A05 1.99627041816711425781250000000e-01f | 153 | 20.2M | #define ATAN2_COEFF_A07 -1.3976582884788513183593750000e-01f | 154 | 20.2M | #define ATAN2_COEFF_A09 9.79423448443412780761718750000e-02f | 155 | 20.2M | #define ATAN2_COEFF_A11 -5.7773590087890625000000000000e-02f | 156 | 20.2M | #define ATAN2_COEFF_A13 2.30401363223791122436523437500e-02f | 157 | 20.2M | #define ATAN2_COEFF_A15 -4.3554059229791164398193359375e-03f | 158 | 20.2M | return ATAN2_2_OVER_PI * (x + x * x_sq * (ATAN2_COEFF_A03 | 159 | 20.2M | + x_sq * (ATAN2_COEFF_A05 | 160 | 20.2M | + x_sq * (ATAN2_COEFF_A07 | 161 | 20.2M | + x_sq * (ATAN2_COEFF_A09 | 162 | 20.2M | + x_sq * (ATAN2_COEFF_A11 | 163 | 20.2M | + x_sq * (ATAN2_COEFF_A13 | 164 | 20.2M | + x_sq * (ATAN2_COEFF_A15)))))))); | 165 | 20.2M | } |
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 | 215M | { |
172 | 215M | celt_sig_assert(x>=0 && y>=0); |
173 | | |
174 | | /* For very small values, we don't care about the answer. */ |
175 | 215M | if ((x*x + y*y) < 1e-18f) |
176 | 194M | { |
177 | 194M | return 0; |
178 | 194M | } |
179 | | |
180 | 20.2M | if (y < x) |
181 | 14.9M | { |
182 | 14.9M | return celt_atan_norm(y / x); |
183 | 14.9M | } else { |
184 | 5.23M | return 1.f - celt_atan_norm(x / y); |
185 | 5.23M | } |
186 | 20.2M | } Unexecuted instantiation: pitch_sse.c:celt_atan2p_norm Line | Count | Source | 171 | 215M | { | 172 | 215M | celt_sig_assert(x>=0 && y>=0); | 173 | | | 174 | | /* For very small values, we don't care about the answer. */ | 175 | 215M | if ((x*x + y*y) < 1e-18f) | 176 | 194M | { | 177 | 194M | return 0; | 178 | 194M | } | 179 | | | 180 | 20.2M | if (y < x) | 181 | 14.9M | { | 182 | 14.9M | return celt_atan_norm(y / x); | 183 | 14.9M | } else { | 184 | 5.23M | return 1.f - celt_atan_norm(x / y); | 185 | 5.23M | } | 186 | 20.2M | } |
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.40M | { |
194 | 2.40M | float x_norm_sq; |
195 | 2.40M | int output_sign; |
196 | | /* Restrict x to [-1, 3]. */ |
197 | 2.40M | x -= 4*floor(.25*(x+1)); |
198 | | /* Negative sign for [1, 3]. */ |
199 | 2.40M | output_sign = 1 - 2*(x>1); |
200 | | /* Restrict to [-1, 1]. */ |
201 | 2.40M | 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.40M | 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.40M | #define COS_COEFF_A0 9.999999403953552246093750000000e-01f |
211 | 2.40M | #define COS_COEFF_A2 -1.233698248863220214843750000000000f |
212 | 2.40M | #define COS_COEFF_A4 2.536507546901702880859375000000e-01f |
213 | 2.40M | #define COS_COEFF_A6 -2.08106283098459243774414062500e-02f |
214 | 2.40M | #define COS_COEFF_A8 8.581906440667808055877685546875e-04f |
215 | 2.40M | return output_sign * (COS_COEFF_A0 + x_norm_sq * (COS_COEFF_A2 + |
216 | 2.40M | x_norm_sq * (COS_COEFF_A4 + |
217 | 2.40M | x_norm_sq * (COS_COEFF_A6 + |
218 | 2.40M | x_norm_sq * (COS_COEFF_A8))))); |
219 | 2.40M | } 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.40M | { | 194 | 2.40M | float x_norm_sq; | 195 | 2.40M | int output_sign; | 196 | | /* Restrict x to [-1, 3]. */ | 197 | 2.40M | x -= 4*floor(.25*(x+1)); | 198 | | /* Negative sign for [1, 3]. */ | 199 | 2.40M | output_sign = 1 - 2*(x>1); | 200 | | /* Restrict to [-1, 1]. */ | 201 | 2.40M | 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.40M | 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.40M | #define COS_COEFF_A0 9.999999403953552246093750000000e-01f | 211 | 2.40M | #define COS_COEFF_A2 -1.233698248863220214843750000000000f | 212 | 2.40M | #define COS_COEFF_A4 2.536507546901702880859375000000e-01f | 213 | 2.40M | #define COS_COEFF_A6 -2.08106283098459243774414062500e-02f | 214 | 2.40M | #define COS_COEFF_A8 8.581906440667808055877685546875e-04f | 215 | 2.40M | return output_sign * (COS_COEFF_A0 + x_norm_sq * (COS_COEFF_A2 + | 216 | 2.40M | x_norm_sq * (COS_COEFF_A4 + | 217 | 2.40M | x_norm_sq * (COS_COEFF_A6 + | 218 | 2.40M | x_norm_sq * (COS_COEFF_A8))))); | 219 | 2.40M | } |
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 | 1.67G | #define celt_sqrt(x) ((float)sqrt(x)) |
226 | 433M | #define celt_sqrt32(x) ((float)sqrt(x)) |
227 | 131M | #define celt_rsqrt(x) (1.f/celt_sqrt(x)) |
228 | | #define celt_rsqrt_norm(x) (celt_rsqrt(x)) |
229 | 131M | #define celt_rsqrt_norm32(x) (celt_rsqrt(x)) |
230 | 16.9M | #define celt_cos_norm(x) ((float)cos((.5f*PI)*(x))) |
231 | 1.49M | #define celt_rcp(x) (1.f/(x)) |
232 | 8.47M | #define celt_div(a,b) ((a)/(b)) |
233 | 9.39M | #define frac_div32(a,b) ((float)(a)/(b)) |
234 | 5.71M | #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 | 1.14G | { |
274 | 1.14G | opus_int32 integer; |
275 | 1.14G | opus_int32 range_idx; |
276 | 1.14G | union { |
277 | 1.14G | float f; |
278 | 1.14G | opus_uint32 i; |
279 | 1.14G | } in; |
280 | 1.14G | in.f = x; |
281 | 1.14G | integer = (opus_int32)(in.i>>23)-127; |
282 | 1.14G | 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 | 1.14G | range_idx = (in.i >> 20) & 0x7; |
287 | 1.14G | 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 | 1.14G | #define LOG2_COEFF_A0 8.74628424644470214843750000e-02f |
297 | 1.14G | #define LOG2_COEFF_A1 1.357829570770263671875000000000f |
298 | 1.14G | #define LOG2_COEFF_A2 -6.3897705078125000000000000e-01f |
299 | 1.14G | #define LOG2_COEFF_A3 4.01971250772476196289062500e-01f |
300 | 1.14G | #define LOG2_COEFF_A4 -2.8415444493293762207031250e-01f |
301 | 1.14G | in.f = LOG2_COEFF_A0 + in.f * (LOG2_COEFF_A1 |
302 | 1.14G | + in.f * (LOG2_COEFF_A2 |
303 | 1.14G | + in.f * (LOG2_COEFF_A3 |
304 | 1.14G | + in.f * (LOG2_COEFF_A4)))); |
305 | 1.14G | return integer + in.f + log2_y_norm_coeff[range_idx]; |
306 | 1.14G | } Line | Count | Source | 273 | 947k | { | 274 | 947k | opus_int32 integer; | 275 | 947k | opus_int32 range_idx; | 276 | 947k | union { | 277 | 947k | float f; | 278 | 947k | opus_uint32 i; | 279 | 947k | } in; | 280 | 947k | in.f = x; | 281 | 947k | integer = (opus_int32)(in.i>>23)-127; | 282 | 947k | 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 | 947k | range_idx = (in.i >> 20) & 0x7; | 287 | 947k | 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 | 947k | #define LOG2_COEFF_A0 8.74628424644470214843750000e-02f | 297 | 947k | #define LOG2_COEFF_A1 1.357829570770263671875000000000f | 298 | 947k | #define LOG2_COEFF_A2 -6.3897705078125000000000000e-01f | 299 | 947k | #define LOG2_COEFF_A3 4.01971250772476196289062500e-01f | 300 | 947k | #define LOG2_COEFF_A4 -2.8415444493293762207031250e-01f | 301 | 947k | in.f = LOG2_COEFF_A0 + in.f * (LOG2_COEFF_A1 | 302 | 947k | + in.f * (LOG2_COEFF_A2 | 303 | 947k | + in.f * (LOG2_COEFF_A3 | 304 | 947k | + in.f * (LOG2_COEFF_A4)))); | 305 | 947k | return integer + in.f + log2_y_norm_coeff[range_idx]; | 306 | 947k | } |
Line | Count | Source | 273 | 1.14G | { | 274 | 1.14G | opus_int32 integer; | 275 | 1.14G | opus_int32 range_idx; | 276 | 1.14G | union { | 277 | 1.14G | float f; | 278 | 1.14G | opus_uint32 i; | 279 | 1.14G | } in; | 280 | 1.14G | in.f = x; | 281 | 1.14G | integer = (opus_int32)(in.i>>23)-127; | 282 | 1.14G | 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 | 1.14G | range_idx = (in.i >> 20) & 0x7; | 287 | 1.14G | 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 | 1.14G | #define LOG2_COEFF_A0 8.74628424644470214843750000e-02f | 297 | 1.14G | #define LOG2_COEFF_A1 1.357829570770263671875000000000f | 298 | 1.14G | #define LOG2_COEFF_A2 -6.3897705078125000000000000e-01f | 299 | 1.14G | #define LOG2_COEFF_A3 4.01971250772476196289062500e-01f | 300 | 1.14G | #define LOG2_COEFF_A4 -2.8415444493293762207031250e-01f | 301 | 1.14G | in.f = LOG2_COEFF_A0 + in.f * (LOG2_COEFF_A1 | 302 | 1.14G | + in.f * (LOG2_COEFF_A2 | 303 | 1.14G | + in.f * (LOG2_COEFF_A3 | 304 | 1.14G | + in.f * (LOG2_COEFF_A4)))); | 305 | 1.14G | return integer + in.f + log2_y_norm_coeff[range_idx]; | 306 | 1.14G | } |
Unexecuted instantiation: pitch_sse.c:celt_log2 Unexecuted instantiation: vq_sse2.c:celt_log2 opus_multistream_encoder.c:celt_log2 Line | Count | Source | 273 | 1.23k | { | 274 | 1.23k | opus_int32 integer; | 275 | 1.23k | opus_int32 range_idx; | 276 | 1.23k | union { | 277 | 1.23k | float f; | 278 | 1.23k | opus_uint32 i; | 279 | 1.23k | } in; | 280 | 1.23k | in.f = x; | 281 | 1.23k | integer = (opus_int32)(in.i>>23)-127; | 282 | 1.23k | 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 | 1.23k | range_idx = (in.i >> 20) & 0x7; | 287 | 1.23k | 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 | 1.23k | #define LOG2_COEFF_A0 8.74628424644470214843750000e-02f | 297 | 1.23k | #define LOG2_COEFF_A1 1.357829570770263671875000000000f | 298 | 1.23k | #define LOG2_COEFF_A2 -6.3897705078125000000000000e-01f | 299 | 1.23k | #define LOG2_COEFF_A3 4.01971250772476196289062500e-01f | 300 | 1.23k | #define LOG2_COEFF_A4 -2.8415444493293762207031250e-01f | 301 | 1.23k | in.f = LOG2_COEFF_A0 + in.f * (LOG2_COEFF_A1 | 302 | 1.23k | + in.f * (LOG2_COEFF_A2 | 303 | 1.23k | + in.f * (LOG2_COEFF_A3 | 304 | 1.23k | + in.f * (LOG2_COEFF_A4)))); | 305 | 1.23k | return integer + in.f + log2_y_norm_coeff[range_idx]; | 306 | 1.23k | } |
|
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 | 171M | { |
315 | 171M | opus_int32 integer; |
316 | 171M | float frac; |
317 | 171M | union { |
318 | 171M | float f; |
319 | 171M | opus_uint32 i; |
320 | 171M | } res; |
321 | 171M | integer = (int)floor(x); |
322 | 171M | if (integer < -50) |
323 | 3.14k | return 0; |
324 | 171M | 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 | 171M | #define EXP2_COEFF_A0 9.999999403953552246093750000000e-01f |
331 | 171M | #define EXP2_COEFF_A1 6.931530833244323730468750000000e-01f |
332 | 171M | #define EXP2_COEFF_A2 2.401536107063293457031250000000e-01f |
333 | 171M | #define EXP2_COEFF_A3 5.582631751894950866699218750000e-02f |
334 | 171M | #define EXP2_COEFF_A4 8.989339694380760192871093750000e-03f |
335 | 171M | #define EXP2_COEFF_A5 1.877576694823801517486572265625e-03f |
336 | 171M | res.f = EXP2_COEFF_A0 + frac * (EXP2_COEFF_A1 |
337 | 171M | + frac * (EXP2_COEFF_A2 |
338 | 171M | + frac * (EXP2_COEFF_A3 |
339 | 171M | + frac * (EXP2_COEFF_A4 |
340 | 171M | + frac * (EXP2_COEFF_A5))))); |
341 | 171M | res.i = (opus_uint32)((opus_int32)res.i + (opus_int32)((opus_uint32)integer<<23)) & 0x7fffffff; |
342 | 171M | return res.f; |
343 | 171M | } Line | Count | Source | 314 | 3.52M | { | 315 | 3.52M | opus_int32 integer; | 316 | 3.52M | float frac; | 317 | 3.52M | union { | 318 | 3.52M | float f; | 319 | 3.52M | opus_uint32 i; | 320 | 3.52M | } res; | 321 | 3.52M | integer = (int)floor(x); | 322 | 3.52M | if (integer < -50) | 323 | 224 | return 0; | 324 | 3.52M | 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.52M | #define EXP2_COEFF_A0 9.999999403953552246093750000000e-01f | 331 | 3.52M | #define EXP2_COEFF_A1 6.931530833244323730468750000000e-01f | 332 | 3.52M | #define EXP2_COEFF_A2 2.401536107063293457031250000000e-01f | 333 | 3.52M | #define EXP2_COEFF_A3 5.582631751894950866699218750000e-02f | 334 | 3.52M | #define EXP2_COEFF_A4 8.989339694380760192871093750000e-03f | 335 | 3.52M | #define EXP2_COEFF_A5 1.877576694823801517486572265625e-03f | 336 | 3.52M | res.f = EXP2_COEFF_A0 + frac * (EXP2_COEFF_A1 | 337 | 3.52M | + frac * (EXP2_COEFF_A2 | 338 | 3.52M | + frac * (EXP2_COEFF_A3 | 339 | 3.52M | + frac * (EXP2_COEFF_A4 | 340 | 3.52M | + frac * (EXP2_COEFF_A5))))); | 341 | 3.52M | res.i = (opus_uint32)((opus_int32)res.i + (opus_int32)((opus_uint32)integer<<23)) & 0x7fffffff; | 342 | 3.52M | return res.f; | 343 | 3.52M | } |
Line | Count | Source | 314 | 165M | { | 315 | 165M | opus_int32 integer; | 316 | 165M | float frac; | 317 | 165M | union { | 318 | 165M | float f; | 319 | 165M | opus_uint32 i; | 320 | 165M | } res; | 321 | 165M | integer = (int)floor(x); | 322 | 165M | if (integer < -50) | 323 | 0 | return 0; | 324 | 165M | 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 | 165M | #define EXP2_COEFF_A0 9.999999403953552246093750000000e-01f | 331 | 165M | #define EXP2_COEFF_A1 6.931530833244323730468750000000e-01f | 332 | 165M | #define EXP2_COEFF_A2 2.401536107063293457031250000000e-01f | 333 | 165M | #define EXP2_COEFF_A3 5.582631751894950866699218750000e-02f | 334 | 165M | #define EXP2_COEFF_A4 8.989339694380760192871093750000e-03f | 335 | 165M | #define EXP2_COEFF_A5 1.877576694823801517486572265625e-03f | 336 | 165M | res.f = EXP2_COEFF_A0 + frac * (EXP2_COEFF_A1 | 337 | 165M | + frac * (EXP2_COEFF_A2 | 338 | 165M | + frac * (EXP2_COEFF_A3 | 339 | 165M | + frac * (EXP2_COEFF_A4 | 340 | 165M | + frac * (EXP2_COEFF_A5))))); | 341 | 165M | res.i = (opus_uint32)((opus_int32)res.i + (opus_int32)((opus_uint32)integer<<23)) & 0x7fffffff; | 342 | 165M | return res.f; | 343 | 165M | } |
Unexecuted instantiation: pitch_sse.c:celt_exp2 Unexecuted instantiation: opus_decoder.c:celt_exp2 Line | Count | Source | 314 | 2.64M | { | 315 | 2.64M | opus_int32 integer; | 316 | 2.64M | float frac; | 317 | 2.64M | union { | 318 | 2.64M | float f; | 319 | 2.64M | opus_uint32 i; | 320 | 2.64M | } res; | 321 | 2.64M | integer = (int)floor(x); | 322 | 2.64M | if (integer < -50) | 323 | 2.92k | return 0; | 324 | 2.64M | 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 | 2.64M | #define EXP2_COEFF_A0 9.999999403953552246093750000000e-01f | 331 | 2.64M | #define EXP2_COEFF_A1 6.931530833244323730468750000000e-01f | 332 | 2.64M | #define EXP2_COEFF_A2 2.401536107063293457031250000000e-01f | 333 | 2.64M | #define EXP2_COEFF_A3 5.582631751894950866699218750000e-02f | 334 | 2.64M | #define EXP2_COEFF_A4 8.989339694380760192871093750000e-03f | 335 | 2.64M | #define EXP2_COEFF_A5 1.877576694823801517486572265625e-03f | 336 | 2.64M | res.f = EXP2_COEFF_A0 + frac * (EXP2_COEFF_A1 | 337 | 2.64M | + frac * (EXP2_COEFF_A2 | 338 | 2.64M | + frac * (EXP2_COEFF_A3 | 339 | 2.64M | + frac * (EXP2_COEFF_A4 | 340 | 2.64M | + frac * (EXP2_COEFF_A5))))); | 341 | 2.64M | res.i = (opus_uint32)((opus_int32)res.i + (opus_int32)((opus_uint32)integer<<23)) & 0x7fffffff; | 342 | 2.64M | return res.f; | 343 | 2.64M | } |
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 | 168M | #define celt_exp2_db celt_exp2 |
351 | 1.15G | #define celt_log2_db celt_log2 |
352 | | |
353 | | #endif |
354 | | |
355 | | #ifdef FIXED_POINT |
356 | | |
357 | | #include "os_support.h" |
358 | | |
359 | | #ifndef OVERRIDE_CELT_ILOG2 |
360 | | /** Integer log in base2. Undefined for zero and negative numbers */ |
361 | | static OPUS_INLINE opus_int16 celt_ilog2(opus_int32 x) |
362 | 65.7M | { |
363 | 65.7M | celt_sig_assert(x>0); |
364 | 65.7M | return EC_ILOG(x)-1; |
365 | 65.7M | } 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 | 362 | 120k | { | 363 | 120k | celt_sig_assert(x>0); | 364 | 120k | return EC_ILOG(x)-1; | 365 | 120k | } |
Line | Count | Source | 362 | 25.6M | { | 363 | 25.6M | celt_sig_assert(x>0); | 364 | 25.6M | return EC_ILOG(x)-1; | 365 | 25.6M | } |
Line | Count | Source | 362 | 3.57M | { | 363 | 3.57M | celt_sig_assert(x>0); | 364 | 3.57M | return EC_ILOG(x)-1; | 365 | 3.57M | } |
Unexecuted instantiation: modes.c:celt_ilog2 Line | Count | Source | 362 | 1.90M | { | 363 | 1.90M | celt_sig_assert(x>0); | 364 | 1.90M | return EC_ILOG(x)-1; | 365 | 1.90M | } |
Line | Count | Source | 362 | 1.44M | { | 363 | 1.44M | celt_sig_assert(x>0); | 364 | 1.44M | return EC_ILOG(x)-1; | 365 | 1.44M | } |
Line | Count | Source | 362 | 4.61M | { | 363 | 4.61M | celt_sig_assert(x>0); | 364 | 4.61M | return EC_ILOG(x)-1; | 365 | 4.61M | } |
Unexecuted instantiation: rate.c:celt_ilog2 Line | Count | Source | 362 | 13.2M | { | 363 | 13.2M | celt_sig_assert(x>0); | 364 | 13.2M | return EC_ILOG(x)-1; | 365 | 13.2M | } |
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 | 362 | 13.9M | { | 363 | 13.9M | celt_sig_assert(x>0); | 364 | 13.9M | return EC_ILOG(x)-1; | 365 | 13.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 | 362 | 418k | { | 363 | 418k | celt_sig_assert(x>0); | 364 | 418k | return EC_ILOG(x)-1; | 365 | 418k | } |
opus_multistream_encoder.c:celt_ilog2 Line | Count | Source | 362 | 1.75k | { | 363 | 1.75k | celt_sig_assert(x>0); | 364 | 1.75k | return EC_ILOG(x)-1; | 365 | 1.75k | } |
Unexecuted instantiation: analysis.c:celt_ilog2 celt_encoder.c:celt_ilog2 Line | Count | Source | 362 | 834k | { | 363 | 834k | celt_sig_assert(x>0); | 364 | 834k | return EC_ILOG(x)-1; | 365 | 834k | } |
Unexecuted instantiation: opus_projection_decoder.c:celt_ilog2 |
366 | | #endif |
367 | | |
368 | | |
369 | | /** Integer log in base2. Defined for zero, but not for negative numbers */ |
370 | | static OPUS_INLINE opus_int16 celt_zlog2(opus_val32 x) |
371 | 4.66M | { |
372 | 4.66M | return x <= 0 ? 0 : celt_ilog2(x); |
373 | 4.66M | } 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 | 371 | 158k | { | 372 | 158k | return x <= 0 ? 0 : celt_ilog2(x); | 373 | 158k | } |
Unexecuted instantiation: mathops.c:celt_zlog2 Line | Count | Source | 371 | 654k | { | 372 | 654k | return x <= 0 ? 0 : celt_ilog2(x); | 373 | 654k | } |
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 | 371 | 3.85M | { | 372 | 3.85M | return x <= 0 ? 0 : celt_ilog2(x); | 373 | 3.85M | } |
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 |
374 | | |
375 | | opus_val16 celt_rsqrt_norm(opus_val32 x); |
376 | | |
377 | | opus_val32 celt_rsqrt_norm32(opus_val32 x); |
378 | | |
379 | | opus_val32 celt_sqrt(opus_val32 x); |
380 | | |
381 | | opus_val32 celt_sqrt32(opus_val32 x); |
382 | | |
383 | | opus_val16 celt_cos_norm(opus_val32 x); |
384 | | |
385 | | opus_val32 celt_cos_norm32(opus_val32 x); |
386 | | |
387 | | /** Base-2 logarithm approximation (log2(x)). (Q14 input, Q10 output) */ |
388 | | static OPUS_INLINE opus_val16 celt_log2(opus_val32 x) |
389 | 2.36M | { |
390 | 2.36M | int i; |
391 | 2.36M | opus_val16 n, frac; |
392 | | /* -0.41509302963303146, 0.9609890551383969, -0.31836011537636605, |
393 | | 0.15530808010959576, -0.08556153059057618 */ |
394 | 2.36M | static const opus_val16 C[5] = {-6801+(1<<(13-10)), 15746, -5217, 2545, -1401}; |
395 | 2.36M | if (x==0) |
396 | 0 | return -32767; |
397 | 2.36M | i = celt_ilog2(x); |
398 | 2.36M | n = VSHR32(x,i-15)-32768-16384; |
399 | 2.36M | 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])))))))); |
400 | 2.36M | return SHL32(i-13,10)+SHR32(frac,14-10); |
401 | 2.36M | } 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 | 389 | 2.22M | { | 390 | 2.22M | int i; | 391 | 2.22M | opus_val16 n, frac; | 392 | | /* -0.41509302963303146, 0.9609890551383969, -0.31836011537636605, | 393 | | 0.15530808010959576, -0.08556153059057618 */ | 394 | 2.22M | static const opus_val16 C[5] = {-6801+(1<<(13-10)), 15746, -5217, 2545, -1401}; | 395 | 2.22M | if (x==0) | 396 | 0 | return -32767; | 397 | 2.22M | i = celt_ilog2(x); | 398 | 2.22M | n = VSHR32(x,i-15)-32768-16384; | 399 | 2.22M | 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])))))))); | 400 | 2.22M | return SHL32(i-13,10)+SHR32(frac,14-10); | 401 | 2.22M | } |
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 | 389 | 1.75k | { | 390 | 1.75k | int i; | 391 | 1.75k | opus_val16 n, frac; | 392 | | /* -0.41509302963303146, 0.9609890551383969, -0.31836011537636605, | 393 | | 0.15530808010959576, -0.08556153059057618 */ | 394 | 1.75k | static const opus_val16 C[5] = {-6801+(1<<(13-10)), 15746, -5217, 2545, -1401}; | 395 | 1.75k | if (x==0) | 396 | 0 | return -32767; | 397 | 1.75k | i = celt_ilog2(x); | 398 | 1.75k | n = VSHR32(x,i-15)-32768-16384; | 399 | 1.75k | 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])))))))); | 400 | 1.75k | return SHL32(i-13,10)+SHR32(frac,14-10); | 401 | 1.75k | } |
Unexecuted instantiation: analysis.c:celt_log2 Line | Count | Source | 389 | 145k | { | 390 | 145k | int i; | 391 | 145k | opus_val16 n, frac; | 392 | | /* -0.41509302963303146, 0.9609890551383969, -0.31836011537636605, | 393 | | 0.15530808010959576, -0.08556153059057618 */ | 394 | 145k | static const opus_val16 C[5] = {-6801+(1<<(13-10)), 15746, -5217, 2545, -1401}; | 395 | 145k | if (x==0) | 396 | 0 | return -32767; | 397 | 145k | i = celt_ilog2(x); | 398 | 145k | n = VSHR32(x,i-15)-32768-16384; | 399 | 145k | 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])))))))); | 400 | 145k | return SHL32(i-13,10)+SHR32(frac,14-10); | 401 | 145k | } |
Unexecuted instantiation: opus_projection_decoder.c:celt_log2 |
402 | | |
403 | | /* |
404 | | K0 = 1 |
405 | | K1 = log(2) |
406 | | K2 = 3-4*log(2) |
407 | | K3 = 3*log(2) - 2 |
408 | | */ |
409 | | #define D0 16383 |
410 | | #define D1 22804 |
411 | | #define D2 14819 |
412 | | #define D3 10204 |
413 | | |
414 | | static OPUS_INLINE opus_val32 celt_exp2_frac(opus_val16 x) |
415 | 2.34M | { |
416 | 2.34M | opus_val16 frac; |
417 | 2.34M | frac = SHL16(x, 4); |
418 | 2.34M | return ADD16(D0, MULT16_16_Q15(frac, ADD16(D1, MULT16_16_Q15(frac, ADD16(D2 , MULT16_16_Q15(D3,frac)))))); |
419 | 2.34M | } 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 | 415 | 1.82M | { | 416 | 1.82M | opus_val16 frac; | 417 | 1.82M | frac = SHL16(x, 4); | 418 | 1.82M | return ADD16(D0, MULT16_16_Q15(frac, ADD16(D1, MULT16_16_Q15(frac, ADD16(D2 , MULT16_16_Q15(D3,frac)))))); | 419 | 1.82M | } |
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 | 415 | 7.35k | { | 416 | 7.35k | opus_val16 frac; | 417 | 7.35k | frac = SHL16(x, 4); | 418 | 7.35k | return ADD16(D0, MULT16_16_Q15(frac, ADD16(D1, MULT16_16_Q15(frac, ADD16(D2 , MULT16_16_Q15(D3,frac)))))); | 419 | 7.35k | } |
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 | 415 | 511k | { | 416 | 511k | opus_val16 frac; | 417 | 511k | frac = SHL16(x, 4); | 418 | 511k | return ADD16(D0, MULT16_16_Q15(frac, ADD16(D1, MULT16_16_Q15(frac, ADD16(D2 , MULT16_16_Q15(D3,frac)))))); | 419 | 511k | } |
|
420 | | |
421 | | #undef D0 |
422 | | #undef D1 |
423 | | #undef D2 |
424 | | #undef D3 |
425 | | |
426 | | /** Base-2 exponential approximation (2^x). (Q10 input, Q16 output) */ |
427 | | static OPUS_INLINE opus_val32 celt_exp2(opus_val16 x) |
428 | 583k | { |
429 | 583k | int integer; |
430 | 583k | opus_val16 frac; |
431 | 583k | integer = SHR16(x,10); |
432 | 583k | if (integer>14) |
433 | 261 | return 0x7f000000; |
434 | 582k | else if (integer < -15) |
435 | 2.89k | return 0; |
436 | 579k | frac = celt_exp2_frac(x-SHL16(integer,10)); |
437 | 579k | return VSHR32(EXTEND32(frac), -integer-2); |
438 | 583k | } 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 | 428 | 61.4k | { | 429 | 61.4k | int integer; | 430 | 61.4k | opus_val16 frac; | 431 | 61.4k | integer = SHR16(x,10); | 432 | 61.4k | if (integer>14) | 433 | 0 | return 0x7f000000; | 434 | 61.4k | else if (integer < -15) | 435 | 767 | return 0; | 436 | 60.6k | frac = celt_exp2_frac(x-SHL16(integer,10)); | 437 | 60.6k | return VSHR32(EXTEND32(frac), -integer-2); | 438 | 61.4k | } |
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 | 428 | 9.75k | { | 429 | 9.75k | int integer; | 430 | 9.75k | opus_val16 frac; | 431 | 9.75k | integer = SHR16(x,10); | 432 | 9.75k | if (integer>14) | 433 | 261 | return 0x7f000000; | 434 | 9.48k | else if (integer < -15) | 435 | 2.13k | return 0; | 436 | 7.35k | frac = celt_exp2_frac(x-SHL16(integer,10)); | 437 | 7.35k | return VSHR32(EXTEND32(frac), -integer-2); | 438 | 9.75k | } |
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 | 428 | 511k | { | 429 | 511k | int integer; | 430 | 511k | opus_val16 frac; | 431 | 511k | integer = SHR16(x,10); | 432 | 511k | if (integer>14) | 433 | 0 | return 0x7f000000; | 434 | 511k | else if (integer < -15) | 435 | 0 | return 0; | 436 | 511k | frac = celt_exp2_frac(x-SHL16(integer,10)); | 437 | 511k | return VSHR32(EXTEND32(frac), -integer-2); | 438 | 511k | } |
|
439 | | |
440 | | #ifdef ENABLE_QEXT |
441 | | |
442 | | /* Calculates the base-2 logarithm of a Q14 input value. The result is returned |
443 | | * in Q(DB_SHIFT). If the input value is 0, the function will output -32.0f. */ |
444 | 2.39M | static OPUS_INLINE opus_val32 celt_log2_db(opus_val32 x) { |
445 | | /* Q30 */ |
446 | 2.39M | static const opus_val32 log2_x_norm_coeff[8] = { |
447 | 2.39M | 1073741824, 954437184, 858993472, 780903168, |
448 | 2.39M | 715827904, 660764224, 613566784, 572662336}; |
449 | | /* Q24 */ |
450 | 2.39M | static const opus_val32 log2_y_norm_coeff[8] = { |
451 | 2.39M | 0, 2850868, 5401057, 7707983, |
452 | 2.39M | 9814042, 11751428, 13545168, 15215099}; |
453 | 2.39M | static const opus_val32 LOG2_COEFF_A0 = 1467383; /* Q24 */ |
454 | 2.39M | static const opus_val32 LOG2_COEFF_A1 = 182244800; /* Q27 */ |
455 | 2.39M | static const opus_val32 LOG2_COEFF_A2 = -21440512; /* Q25 */ |
456 | 2.39M | static const opus_val32 LOG2_COEFF_A3 = 107903336; /* Q28 */ |
457 | 2.39M | static const opus_val32 LOG2_COEFF_A4 = -610217024; /* Q31 */ |
458 | | |
459 | 2.39M | opus_int32 integer, norm_coeff_idx, tmp; |
460 | 2.39M | opus_val32 mantissa; |
461 | 2.39M | if (x==0) { |
462 | 0 | return -536870912; /* -32.0f */ |
463 | 0 | } |
464 | 2.39M | integer = SUB32(celt_ilog2(x), 14); /* Q0 */ |
465 | 2.39M | mantissa = VSHR32(x, integer + 14 - 29); /* Q29 */ |
466 | 2.39M | norm_coeff_idx = SHR32(mantissa, 29 - 3) & 0x7; |
467 | | /* mantissa is in Q28 (29 + Q_NORM_CONST - 31 where Q_NORM_CONST is Q30) |
468 | | * 285212672 (Q28) is 1.0625f. */ |
469 | 2.39M | mantissa = SUB32(MULT32_32_Q31(mantissa, log2_x_norm_coeff[norm_coeff_idx]), |
470 | 2.39M | 285212672); |
471 | | |
472 | | /* q_a3(Q28): q_mantissa + q_a4 - 31 |
473 | | * q_a2(Q25): q_mantissa + q_a3 - 31 |
474 | | * q_a1(Q27): q_mantissa + q_a2 - 31 + 5 |
475 | | * q_a0(Q24): q_mantissa + q_a1 - 31 |
476 | | * where q_mantissa is Q28 */ |
477 | | /* Split evaluation in steps to avoid exploding macro expansion. */ |
478 | 2.39M | tmp = MULT32_32_Q31(mantissa, LOG2_COEFF_A4); |
479 | 2.39M | tmp = MULT32_32_Q31(mantissa, ADD32(LOG2_COEFF_A3, tmp)); |
480 | 2.39M | tmp = SHL32(MULT32_32_Q31(mantissa, ADD32(LOG2_COEFF_A2, tmp)), 5 /* SHL32 for LOG2_COEFF_A1 */); |
481 | 2.39M | tmp = MULT32_32_Q31(mantissa, ADD32(LOG2_COEFF_A1, tmp)); |
482 | 2.39M | return ADD32(log2_y_norm_coeff[norm_coeff_idx], |
483 | 2.39M | ADD32(SHL32(integer, DB_SHIFT), |
484 | 2.39M | ADD32(LOG2_COEFF_A0, tmp))); |
485 | 2.39M | } 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 | 444 | 2.39M | static OPUS_INLINE opus_val32 celt_log2_db(opus_val32 x) { | 445 | | /* Q30 */ | 446 | 2.39M | static const opus_val32 log2_x_norm_coeff[8] = { | 447 | 2.39M | 1073741824, 954437184, 858993472, 780903168, | 448 | 2.39M | 715827904, 660764224, 613566784, 572662336}; | 449 | | /* Q24 */ | 450 | 2.39M | static const opus_val32 log2_y_norm_coeff[8] = { | 451 | 2.39M | 0, 2850868, 5401057, 7707983, | 452 | 2.39M | 9814042, 11751428, 13545168, 15215099}; | 453 | 2.39M | static const opus_val32 LOG2_COEFF_A0 = 1467383; /* Q24 */ | 454 | 2.39M | static const opus_val32 LOG2_COEFF_A1 = 182244800; /* Q27 */ | 455 | 2.39M | static const opus_val32 LOG2_COEFF_A2 = -21440512; /* Q25 */ | 456 | 2.39M | static const opus_val32 LOG2_COEFF_A3 = 107903336; /* Q28 */ | 457 | 2.39M | static const opus_val32 LOG2_COEFF_A4 = -610217024; /* Q31 */ | 458 | | | 459 | 2.39M | opus_int32 integer, norm_coeff_idx, tmp; | 460 | 2.39M | opus_val32 mantissa; | 461 | 2.39M | if (x==0) { | 462 | 0 | return -536870912; /* -32.0f */ | 463 | 0 | } | 464 | 2.39M | integer = SUB32(celt_ilog2(x), 14); /* Q0 */ | 465 | 2.39M | mantissa = VSHR32(x, integer + 14 - 29); /* Q29 */ | 466 | 2.39M | norm_coeff_idx = SHR32(mantissa, 29 - 3) & 0x7; | 467 | | /* mantissa is in Q28 (29 + Q_NORM_CONST - 31 where Q_NORM_CONST is Q30) | 468 | | * 285212672 (Q28) is 1.0625f. */ | 469 | 2.39M | mantissa = SUB32(MULT32_32_Q31(mantissa, log2_x_norm_coeff[norm_coeff_idx]), | 470 | 2.39M | 285212672); | 471 | | | 472 | | /* q_a3(Q28): q_mantissa + q_a4 - 31 | 473 | | * q_a2(Q25): q_mantissa + q_a3 - 31 | 474 | | * q_a1(Q27): q_mantissa + q_a2 - 31 + 5 | 475 | | * q_a0(Q24): q_mantissa + q_a1 - 31 | 476 | | * where q_mantissa is Q28 */ | 477 | | /* Split evaluation in steps to avoid exploding macro expansion. */ | 478 | 2.39M | tmp = MULT32_32_Q31(mantissa, LOG2_COEFF_A4); | 479 | 2.39M | tmp = MULT32_32_Q31(mantissa, ADD32(LOG2_COEFF_A3, tmp)); | 480 | 2.39M | tmp = SHL32(MULT32_32_Q31(mantissa, ADD32(LOG2_COEFF_A2, tmp)), 5 /* SHL32 for LOG2_COEFF_A1 */); | 481 | 2.39M | tmp = MULT32_32_Q31(mantissa, ADD32(LOG2_COEFF_A1, tmp)); | 482 | 2.39M | return ADD32(log2_y_norm_coeff[norm_coeff_idx], | 483 | 2.39M | ADD32(SHL32(integer, DB_SHIFT), | 484 | 2.39M | ADD32(LOG2_COEFF_A0, tmp))); | 485 | 2.39M | } |
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 |
486 | | |
487 | | /* Calculates exp2 for Q28 within a specific range (0 to 1.0) using fixed-point |
488 | | * arithmetic. The input number must be adjusted for Q DB_SHIFT. */ |
489 | | static OPUS_INLINE opus_val32 celt_exp2_db_frac(opus_val32 x) |
490 | 2.28M | { |
491 | | /* Approximation constants. */ |
492 | 2.28M | static const opus_int32 EXP2_COEFF_A0 = 268435440; /* Q28 */ |
493 | 2.28M | static const opus_int32 EXP2_COEFF_A1 = 744267456; /* Q30 */ |
494 | 2.28M | static const opus_int32 EXP2_COEFF_A2 = 1031451904; /* Q32 */ |
495 | 2.28M | static const opus_int32 EXP2_COEFF_A3 = 959088832; /* Q34 */ |
496 | 2.28M | static const opus_int32 EXP2_COEFF_A4 = 617742720; /* Q36 */ |
497 | 2.28M | static const opus_int32 EXP2_COEFF_A5 = 516104352; /* Q38 */ |
498 | 2.28M | opus_int32 tmp; |
499 | | /* Converts input value from Q24 to Q29. */ |
500 | 2.28M | opus_val32 x_q29 = SHL32(x, 29 - 24); |
501 | | /* Split evaluation in steps to avoid exploding macro expansion. */ |
502 | 2.28M | tmp = ADD32(EXP2_COEFF_A4, MULT32_32_Q31(x_q29, EXP2_COEFF_A5)); |
503 | 2.28M | tmp = ADD32(EXP2_COEFF_A3, MULT32_32_Q31(x_q29, tmp)); |
504 | 2.28M | tmp = ADD32(EXP2_COEFF_A2, MULT32_32_Q31(x_q29, tmp)); |
505 | 2.28M | tmp = ADD32(EXP2_COEFF_A1, MULT32_32_Q31(x_q29, tmp)); |
506 | 2.28M | return ADD32(EXP2_COEFF_A0, MULT32_32_Q31(x_q29, tmp)); |
507 | 2.28M | } 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 | 490 | 1.70M | { | 491 | | /* Approximation constants. */ | 492 | 1.70M | static const opus_int32 EXP2_COEFF_A0 = 268435440; /* Q28 */ | 493 | 1.70M | static const opus_int32 EXP2_COEFF_A1 = 744267456; /* Q30 */ | 494 | 1.70M | static const opus_int32 EXP2_COEFF_A2 = 1031451904; /* Q32 */ | 495 | 1.70M | static const opus_int32 EXP2_COEFF_A3 = 959088832; /* Q34 */ | 496 | 1.70M | static const opus_int32 EXP2_COEFF_A4 = 617742720; /* Q36 */ | 497 | 1.70M | static const opus_int32 EXP2_COEFF_A5 = 516104352; /* Q38 */ | 498 | 1.70M | opus_int32 tmp; | 499 | | /* Converts input value from Q24 to Q29. */ | 500 | 1.70M | opus_val32 x_q29 = SHL32(x, 29 - 24); | 501 | | /* Split evaluation in steps to avoid exploding macro expansion. */ | 502 | 1.70M | tmp = ADD32(EXP2_COEFF_A4, MULT32_32_Q31(x_q29, EXP2_COEFF_A5)); | 503 | 1.70M | tmp = ADD32(EXP2_COEFF_A3, MULT32_32_Q31(x_q29, tmp)); | 504 | 1.70M | tmp = ADD32(EXP2_COEFF_A2, MULT32_32_Q31(x_q29, tmp)); | 505 | 1.70M | tmp = ADD32(EXP2_COEFF_A1, MULT32_32_Q31(x_q29, tmp)); | 506 | 1.70M | return ADD32(EXP2_COEFF_A0, MULT32_32_Q31(x_q29, tmp)); | 507 | 1.70M | } |
celt_encoder.c:celt_exp2_db_frac Line | Count | Source | 490 | 573k | { | 491 | | /* Approximation constants. */ | 492 | 573k | static const opus_int32 EXP2_COEFF_A0 = 268435440; /* Q28 */ | 493 | 573k | static const opus_int32 EXP2_COEFF_A1 = 744267456; /* Q30 */ | 494 | 573k | static const opus_int32 EXP2_COEFF_A2 = 1031451904; /* Q32 */ | 495 | 573k | static const opus_int32 EXP2_COEFF_A3 = 959088832; /* Q34 */ | 496 | 573k | static const opus_int32 EXP2_COEFF_A4 = 617742720; /* Q36 */ | 497 | 573k | static const opus_int32 EXP2_COEFF_A5 = 516104352; /* Q38 */ | 498 | 573k | opus_int32 tmp; | 499 | | /* Converts input value from Q24 to Q29. */ | 500 | 573k | opus_val32 x_q29 = SHL32(x, 29 - 24); | 501 | | /* Split evaluation in steps to avoid exploding macro expansion. */ | 502 | 573k | tmp = ADD32(EXP2_COEFF_A4, MULT32_32_Q31(x_q29, EXP2_COEFF_A5)); | 503 | 573k | tmp = ADD32(EXP2_COEFF_A3, MULT32_32_Q31(x_q29, tmp)); | 504 | 573k | tmp = ADD32(EXP2_COEFF_A2, MULT32_32_Q31(x_q29, tmp)); | 505 | 573k | tmp = ADD32(EXP2_COEFF_A1, MULT32_32_Q31(x_q29, tmp)); | 506 | 573k | return ADD32(EXP2_COEFF_A0, MULT32_32_Q31(x_q29, tmp)); | 507 | 573k | } |
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 |
508 | | |
509 | | /* Calculates exp2 for Q16 using fixed-point arithmetic. The input number must |
510 | | * be adjusted for Q DB_SHIFT. */ |
511 | | static OPUS_INLINE opus_val32 celt_exp2_db(opus_val32 x) |
512 | 582k | { |
513 | 582k | int integer; |
514 | 582k | opus_val32 frac; |
515 | 582k | integer = SHR32(x,DB_SHIFT); |
516 | 582k | if (integer>14) |
517 | 0 | return 0x7f000000; |
518 | 582k | else if (integer <= -17) |
519 | 0 | return 0; |
520 | 582k | frac = celt_exp2_db_frac(x-SHL32(integer, DB_SHIFT)); /* Q28 */ |
521 | 582k | return VSHR32(frac, -integer + 28 - 16); /* Q16 */ |
522 | 582k | } 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 | 512 | 9.38k | { | 513 | 9.38k | int integer; | 514 | 9.38k | opus_val32 frac; | 515 | 9.38k | integer = SHR32(x,DB_SHIFT); | 516 | 9.38k | if (integer>14) | 517 | 0 | return 0x7f000000; | 518 | 9.38k | else if (integer <= -17) | 519 | 0 | return 0; | 520 | 9.38k | frac = celt_exp2_db_frac(x-SHL32(integer, DB_SHIFT)); /* Q28 */ | 521 | 9.38k | return VSHR32(frac, -integer + 28 - 16); /* Q16 */ | 522 | 9.38k | } |
celt_encoder.c:celt_exp2_db Line | Count | Source | 512 | 573k | { | 513 | 573k | int integer; | 514 | 573k | opus_val32 frac; | 515 | 573k | integer = SHR32(x,DB_SHIFT); | 516 | 573k | if (integer>14) | 517 | 0 | return 0x7f000000; | 518 | 573k | else if (integer <= -17) | 519 | 0 | return 0; | 520 | 573k | frac = celt_exp2_db_frac(x-SHL32(integer, DB_SHIFT)); /* Q28 */ | 521 | 573k | return VSHR32(frac, -integer + 28 - 16); /* Q16 */ | 522 | 573k | } |
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 |
523 | | #else |
524 | | |
525 | 1.15G | #define celt_log2_db(x) SHL32(EXTEND32(celt_log2(x)), DB_SHIFT-10) |
526 | | #define celt_exp2_db_frac(x) SHL32(celt_exp2_frac(PSHR32(x, DB_SHIFT-10)), 14) |
527 | | #define celt_exp2_db(x) celt_exp2(PSHR32(x, DB_SHIFT-10)) |
528 | | |
529 | | #endif |
530 | | |
531 | | |
532 | | opus_val32 celt_rcp(opus_val32 x); |
533 | | opus_val32 celt_rcp_norm32(opus_val32 x); |
534 | | |
535 | 8.47M | #define celt_div(a,b) MULT32_32_Q31((opus_val32)(a),celt_rcp(b)) |
536 | | |
537 | | opus_val32 frac_div32_q29(opus_val32 a, opus_val32 b); |
538 | | opus_val32 frac_div32(opus_val32 a, opus_val32 b); |
539 | | |
540 | | /* Computes atan(x) multiplied by 2/PI. The input value (x) should be within the |
541 | | * range of -1 to 1 and represented in Q30 format. The function will return the |
542 | | * result in Q30 format. */ |
543 | | static OPUS_INLINE opus_val32 celt_atan_norm(opus_val32 x) |
544 | 1.46M | { |
545 | | /* Approximation constants. */ |
546 | 1.46M | static const opus_int32 ATAN_2_OVER_PI = 1367130551; /* Q31 */ |
547 | 1.46M | static const opus_int32 ATAN_COEFF_A03 = -715791936; /* Q31 */ |
548 | 1.46M | static const opus_int32 ATAN_COEFF_A05 = 857391616; /* Q32 */ |
549 | 1.46M | static const opus_int32 ATAN_COEFF_A07 = -1200579328; /* Q33 */ |
550 | 1.46M | static const opus_int32 ATAN_COEFF_A09 = 1682636672; /* Q34 */ |
551 | 1.46M | static const opus_int32 ATAN_COEFF_A11 = -1985085440; /* Q35 */ |
552 | 1.46M | static const opus_int32 ATAN_COEFF_A13 = 1583306112; /* Q36 */ |
553 | 1.46M | static const opus_int32 ATAN_COEFF_A15 = -598602432; /* Q37 */ |
554 | 1.46M | opus_int32 x_sq_q30; |
555 | 1.46M | opus_int32 x_q31; |
556 | 1.46M | opus_int32 tmp; |
557 | | /* The expected x is in the range of [-1.0f, 1.0f] */ |
558 | 1.46M | celt_sig_assert((x <= 1073741824) && (x >= -1073741824)); |
559 | | |
560 | | /* If x = 1.0f, returns 0.5f */ |
561 | 1.46M | if (x == 1073741824) |
562 | 0 | { |
563 | 0 | return 536870912; /* 0.5f (Q30) */ |
564 | 0 | } |
565 | | /* If x = 1.0f, returns 0.5f */ |
566 | 1.46M | if (x == -1073741824) |
567 | 0 | { |
568 | 0 | return -536870912; /* -0.5f (Q30) */ |
569 | 0 | } |
570 | 1.46M | x_q31 = SHL32(x, 1); |
571 | 1.46M | x_sq_q30 = MULT32_32_Q31(x_q31, x); |
572 | | /* Split evaluation in steps to avoid exploding macro expansion. */ |
573 | 1.46M | tmp = MULT32_32_Q31(x_sq_q30, ATAN_COEFF_A15); |
574 | 1.46M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A13, tmp)); |
575 | 1.46M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A11, tmp)); |
576 | 1.46M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A09, tmp)); |
577 | 1.46M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A07, tmp)); |
578 | 1.46M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A05, tmp)); |
579 | 1.46M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A03, tmp)); |
580 | 1.46M | tmp = ADD32(x, MULT32_32_Q31(x_q31, tmp)); |
581 | 1.46M | return MULT32_32_Q31(ATAN_2_OVER_PI, tmp); |
582 | 1.46M | } 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 | 544 | 1.46M | { | 545 | | /* Approximation constants. */ | 546 | 1.46M | static const opus_int32 ATAN_2_OVER_PI = 1367130551; /* Q31 */ | 547 | 1.46M | static const opus_int32 ATAN_COEFF_A03 = -715791936; /* Q31 */ | 548 | 1.46M | static const opus_int32 ATAN_COEFF_A05 = 857391616; /* Q32 */ | 549 | 1.46M | static const opus_int32 ATAN_COEFF_A07 = -1200579328; /* Q33 */ | 550 | 1.46M | static const opus_int32 ATAN_COEFF_A09 = 1682636672; /* Q34 */ | 551 | 1.46M | static const opus_int32 ATAN_COEFF_A11 = -1985085440; /* Q35 */ | 552 | 1.46M | static const opus_int32 ATAN_COEFF_A13 = 1583306112; /* Q36 */ | 553 | 1.46M | static const opus_int32 ATAN_COEFF_A15 = -598602432; /* Q37 */ | 554 | 1.46M | opus_int32 x_sq_q30; | 555 | 1.46M | opus_int32 x_q31; | 556 | 1.46M | opus_int32 tmp; | 557 | | /* The expected x is in the range of [-1.0f, 1.0f] */ | 558 | 1.46M | celt_sig_assert((x <= 1073741824) && (x >= -1073741824)); | 559 | | | 560 | | /* If x = 1.0f, returns 0.5f */ | 561 | 1.46M | if (x == 1073741824) | 562 | 0 | { | 563 | 0 | return 536870912; /* 0.5f (Q30) */ | 564 | 0 | } | 565 | | /* If x = 1.0f, returns 0.5f */ | 566 | 1.46M | if (x == -1073741824) | 567 | 0 | { | 568 | 0 | return -536870912; /* -0.5f (Q30) */ | 569 | 0 | } | 570 | 1.46M | x_q31 = SHL32(x, 1); | 571 | 1.46M | x_sq_q30 = MULT32_32_Q31(x_q31, x); | 572 | | /* Split evaluation in steps to avoid exploding macro expansion. */ | 573 | 1.46M | tmp = MULT32_32_Q31(x_sq_q30, ATAN_COEFF_A15); | 574 | 1.46M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A13, tmp)); | 575 | 1.46M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A11, tmp)); | 576 | 1.46M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A09, tmp)); | 577 | 1.46M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A07, tmp)); | 578 | 1.46M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A05, tmp)); | 579 | 1.46M | tmp = MULT32_32_Q31(x_sq_q30, ADD32(ATAN_COEFF_A03, tmp)); | 580 | 1.46M | tmp = ADD32(x, MULT32_32_Q31(x_q31, tmp)); | 581 | 1.46M | return MULT32_32_Q31(ATAN_2_OVER_PI, tmp); | 582 | 1.46M | } |
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 |
583 | | |
584 | | /* Calculates the arctangent of y/x, multiplies the result by 2/pi, and returns |
585 | | * the value in Q30 format. Both input values (x and y) must be within the range |
586 | | * of 0 to 1 and represented in Q30 format. Inputs must be zero or greater, and |
587 | | * at least one input must be non-zero. */ |
588 | | static OPUS_INLINE opus_val32 celt_atan2p_norm(opus_val32 y, opus_val32 x) |
589 | 1.57M | { |
590 | 1.57M | celt_sig_assert(x>=0 && y>=0); |
591 | 1.57M | if (y==0 && x==0) { |
592 | 118k | return 0; |
593 | 1.46M | } else if (y < x) { |
594 | 716k | return celt_atan_norm(SHR32(frac_div32(y, x), 1)); |
595 | 744k | } else { |
596 | 744k | celt_sig_assert(y > 0); |
597 | 744k | return 1073741824 /* 1.0f Q30 */ - |
598 | 744k | celt_atan_norm(SHR32(frac_div32(x, y), 1)); |
599 | 744k | } |
600 | 1.57M | } 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 | 589 | 1.57M | { | 590 | 1.57M | celt_sig_assert(x>=0 && y>=0); | 591 | 1.57M | if (y==0 && x==0) { | 592 | 118k | return 0; | 593 | 1.46M | } else if (y < x) { | 594 | 716k | return celt_atan_norm(SHR32(frac_div32(y, x), 1)); | 595 | 744k | } else { | 596 | 744k | celt_sig_assert(y > 0); | 597 | 744k | return 1073741824 /* 1.0f Q30 */ - | 598 | 744k | celt_atan_norm(SHR32(frac_div32(x, y), 1)); | 599 | 744k | } | 600 | 1.57M | } |
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 |
601 | | |
602 | | #define M1 32767 |
603 | | #define M2 -21 |
604 | | #define M3 -11943 |
605 | | #define M4 4936 |
606 | | |
607 | | /* Atan approximation using a 4th order polynomial. Input is in Q15 format |
608 | | and normalized by pi/4. Output is in Q15 format */ |
609 | | static OPUS_INLINE opus_val16 celt_atan01(opus_val16 x) |
610 | 0 | { |
611 | 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))))))); |
612 | 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 |
613 | | |
614 | | #undef M1 |
615 | | #undef M2 |
616 | | #undef M3 |
617 | | #undef M4 |
618 | | |
619 | | /* atan2() approximation valid for positive input values */ |
620 | | static OPUS_INLINE opus_val16 celt_atan2p(opus_val16 y, opus_val16 x) |
621 | 0 | { |
622 | 0 | if (x==0 && y==0) { |
623 | 0 | return 0; |
624 | 0 | } else if (y < x) |
625 | 0 | { |
626 | 0 | opus_val32 arg; |
627 | 0 | arg = celt_div(SHL32(EXTEND32(y),15),x); |
628 | 0 | if (arg >= 32767) |
629 | 0 | arg = 32767; |
630 | 0 | return SHR16(celt_atan01(EXTRACT16(arg)),1); |
631 | 0 | } else { |
632 | 0 | opus_val32 arg; |
633 | 0 | arg = celt_div(SHL32(EXTEND32(x),15),y); |
634 | 0 | if (arg >= 32767) |
635 | 0 | arg = 32767; |
636 | 0 | return 25736-SHR16(celt_atan01(EXTRACT16(arg)),1); |
637 | 0 | } |
638 | 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 |
639 | | |
640 | | #endif /* FIXED_POINT */ |
641 | | |
642 | | #ifndef DISABLE_FLOAT_API |
643 | | |
644 | | void celt_float2int16_c(const float * OPUS_RESTRICT in, short * OPUS_RESTRICT out, int cnt); |
645 | | |
646 | | #ifndef OVERRIDE_FLOAT2INT16 |
647 | 0 | #define celt_float2int16(in, out, cnt, arch) ((void)(arch), celt_float2int16_c(in, out, cnt)) |
648 | | #endif |
649 | | |
650 | | int opus_limit2_checkwithin1_c(float *samples, int cnt); |
651 | | |
652 | | #ifndef OVERRIDE_LIMIT2_CHECKWITHIN1 |
653 | 0 | #define opus_limit2_checkwithin1(samples, cnt, arch) ((void)(arch), opus_limit2_checkwithin1_c(samples, cnt)) |
654 | | #endif |
655 | | |
656 | | #endif /* DISABLE_FLOAT_API */ |
657 | | |
658 | | #endif /* MATHOPS_H */ |