/proc/self/cwd/libfaad/mdct.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding |
3 | | ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com |
4 | | ** |
5 | | ** This program is free software; you can redistribute it and/or modify |
6 | | ** it under the terms of the GNU General Public License as published by |
7 | | ** the Free Software Foundation; either version 2 of the License, or |
8 | | ** (at your option) any later version. |
9 | | ** |
10 | | ** This program is distributed in the hope that it will be useful, |
11 | | ** but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | | ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | | ** GNU General Public License for more details. |
14 | | ** |
15 | | ** You should have received a copy of the GNU General Public License |
16 | | ** along with this program; if not, write to the Free Software |
17 | | ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
18 | | ** |
19 | | ** Any non-GPL usage of this software or parts of this software is strictly |
20 | | ** forbidden. |
21 | | ** |
22 | | ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 |
23 | | ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" |
24 | | ** |
25 | | ** Commercial non-GPL licensing of this software is possible. |
26 | | ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. |
27 | | ** |
28 | | ** $Id: mdct.c,v 1.47 2007/11/01 12:33:31 menno Exp $ |
29 | | **/ |
30 | | |
31 | | /* |
32 | | * Fast (I)MDCT Implementation using (I)FFT ((Inverse) Fast Fourier Transform) |
33 | | * and consists of three steps: pre-(I)FFT complex multiplication, complex |
34 | | * (I)FFT, post-(I)FFT complex multiplication, |
35 | | * |
36 | | * As described in: |
37 | | * P. Duhamel, Y. Mahieux, and J.P. Petit, "A Fast Algorithm for the |
38 | | * Implementation of Filter Banks Based on 'Time Domain Aliasing |
39 | | * Cancellation'," IEEE Proc. on ICASSP'91, 1991, pp. 2209-2212. |
40 | | * |
41 | | * |
42 | | * As of April 6th 2002 completely rewritten. |
43 | | * This (I)MDCT can now be used for any data size n, where n is divisible by 8. |
44 | | * |
45 | | */ |
46 | | |
47 | | #include "common.h" |
48 | | #include "structs.h" |
49 | | |
50 | | #include <stdlib.h> |
51 | | #ifdef _WIN32_WCE |
52 | | #define assert(x) |
53 | | #else |
54 | | #include <assert.h> |
55 | | #endif |
56 | | |
57 | | #include "cfft.h" |
58 | | #include "mdct.h" |
59 | | #include "mdct_tab.h" |
60 | | |
61 | | |
62 | | mdct_info *faad_mdct_init(uint16_t N) |
63 | 18.8k | { |
64 | 18.8k | mdct_info *mdct = (mdct_info*)faad_malloc(sizeof(mdct_info)); |
65 | | |
66 | 18.8k | assert(N % 8 == 0); |
67 | | |
68 | 18.8k | mdct->N = N; |
69 | | |
70 | | /* NOTE: For "small framelengths" in FIXED_POINT the coefficients need to be |
71 | | * scaled by sqrt("(nearest power of 2) > N" / N) */ |
72 | | |
73 | | /* RE(mdct->sincos[k]) = scale*(real_t)(cos(2.0*M_PI*(k+1./8.) / (real_t)N)); |
74 | | * IM(mdct->sincos[k]) = scale*(real_t)(sin(2.0*M_PI*(k+1./8.) / (real_t)N)); */ |
75 | | /* scale is 1 for fixed point, sqrt(N) for floating point */ |
76 | 18.8k | switch (N) |
77 | 18.8k | { |
78 | 7.06k | case 2048: mdct->sincos = (complex_t*)mdct_tab_2048; break; |
79 | 7.06k | case 256: mdct->sincos = (complex_t*)mdct_tab_256; break; |
80 | | #ifdef LD_DEC |
81 | | case 1024: mdct->sincos = (complex_t*)mdct_tab_1024; break; |
82 | | #endif |
83 | 0 | #ifdef ALLOW_SMALL_FRAMELENGTH |
84 | 2.37k | case 1920: mdct->sincos = (complex_t*)mdct_tab_1920; break; |
85 | 2.37k | case 240: mdct->sincos = (complex_t*)mdct_tab_240; break; |
86 | | #ifdef LD_DEC |
87 | | case 960: mdct->sincos = (complex_t*)mdct_tab_960; break; |
88 | | #endif |
89 | 18.8k | #endif |
90 | | #ifdef SSR_DEC |
91 | | case 512: mdct->sincos = (complex_t*)mdct_tab_512; break; |
92 | | case 64: mdct->sincos = (complex_t*)mdct_tab_64; break; |
93 | | #endif |
94 | 18.8k | } |
95 | | |
96 | | /* initialise fft */ |
97 | 18.8k | mdct->cfft = cffti(N/4); |
98 | | |
99 | | #ifdef PROFILE |
100 | | mdct->cycles = 0; |
101 | | mdct->fft_cycles = 0; |
102 | | #endif |
103 | | |
104 | 18.8k | return mdct; |
105 | 18.8k | } |
106 | | |
107 | | void faad_mdct_end(mdct_info *mdct) |
108 | 64.7k | { |
109 | 64.7k | if (mdct != NULL) |
110 | 64.7k | { |
111 | | #ifdef PROFILE |
112 | | printf("MDCT[%.4d]: %I64d cycles\n", mdct->N, mdct->cycles); |
113 | | printf("CFFT[%.4d]: %I64d cycles\n", mdct->N/4, mdct->fft_cycles); |
114 | | #endif |
115 | | |
116 | 64.7k | cfftu(mdct->cfft); |
117 | | |
118 | 64.7k | faad_free(mdct); |
119 | 64.7k | } |
120 | 64.7k | } |
121 | | |
122 | | void faad_imdct(mdct_info *mdct, real_t *X_in, real_t *X_out) |
123 | 1.05M | { |
124 | 1.05M | uint16_t k; |
125 | | |
126 | 1.05M | complex_t x; |
127 | 1.05M | #ifdef ALLOW_SMALL_FRAMELENGTH |
128 | | #ifdef FIXED_POINT |
129 | | real_t scale = 0, b_scale = 0; |
130 | | #endif |
131 | 1.05M | #endif |
132 | 1.05M | ALIGN complex_t Z1[512]; |
133 | 1.05M | complex_t *sincos = mdct->sincos; |
134 | | |
135 | 1.05M | uint16_t N = mdct->N; |
136 | 1.05M | uint16_t N2 = N >> 1; |
137 | 1.05M | uint16_t N4 = N >> 2; |
138 | 1.05M | uint16_t N8 = N >> 3; |
139 | | |
140 | | #ifdef PROFILE |
141 | | int64_t count1, count2 = faad_get_ts(); |
142 | | #endif |
143 | | |
144 | 1.05M | #ifdef ALLOW_SMALL_FRAMELENGTH |
145 | | #ifdef FIXED_POINT |
146 | | /* detect non-power of 2 */ |
147 | 363k | if (N & (N-1)) |
148 | 58.6k | { |
149 | | /* adjust scale for non-power of 2 MDCT */ |
150 | | /* 2048/1920 */ |
151 | 58.6k | b_scale = 1; |
152 | 58.6k | scale = COEF_CONST(1.0666666666666667); |
153 | 58.6k | } |
154 | | #endif |
155 | 1.05M | #endif |
156 | | |
157 | | /* pre-IFFT complex multiplication */ |
158 | 317M | for (k = 0; k < N4; k++) |
159 | 316M | { |
160 | 316M | ComplexMult(&IM(Z1[k]), &RE(Z1[k]), |
161 | 316M | X_in[2*k], X_in[N2 - 1 - 2*k], RE(sincos[k]), IM(sincos[k])); |
162 | 316M | } |
163 | | |
164 | | #ifdef PROFILE |
165 | | count1 = faad_get_ts(); |
166 | | #endif |
167 | | |
168 | | /* complex IFFT, any non-scaling FFT can be used here */ |
169 | 1.05M | cfftb(mdct->cfft, Z1); |
170 | | |
171 | | #ifdef PROFILE |
172 | | count1 = faad_get_ts() - count1; |
173 | | #endif |
174 | | |
175 | | /* post-IFFT complex multiplication */ |
176 | 317M | for (k = 0; k < N4; k++) |
177 | 316M | { |
178 | 316M | RE(x) = RE(Z1[k]); |
179 | 316M | IM(x) = IM(Z1[k]); |
180 | 316M | ComplexMult(&IM(Z1[k]), &RE(Z1[k]), |
181 | 316M | IM(x), RE(x), RE(sincos[k]), IM(sincos[k])); |
182 | | |
183 | 316M | #ifdef ALLOW_SMALL_FRAMELENGTH |
184 | | #ifdef FIXED_POINT |
185 | | /* non-power of 2 MDCT scaling */ |
186 | 113M | if (b_scale) |
187 | 15.8M | { |
188 | 15.8M | RE(Z1[k]) = MUL_C(RE(Z1[k]), scale); |
189 | 15.8M | IM(Z1[k]) = MUL_C(IM(Z1[k]), scale); |
190 | 15.8M | } |
191 | | #endif |
192 | 316M | #endif |
193 | 316M | } |
194 | | |
195 | | /* reordering */ |
196 | 80.0M | for (k = 0; k < N8; k+=2) |
197 | 79.0M | { |
198 | 79.0M | X_out[ 2*k] = IM(Z1[N8 + k]); |
199 | 79.0M | X_out[ 2 + 2*k] = IM(Z1[N8 + 1 + k]); |
200 | | |
201 | 79.0M | X_out[ 1 + 2*k] = -RE(Z1[N8 - 1 - k]); |
202 | 79.0M | X_out[ 3 + 2*k] = -RE(Z1[N8 - 2 - k]); |
203 | | |
204 | 79.0M | X_out[N4 + 2*k] = RE(Z1[ k]); |
205 | 79.0M | X_out[N4 + + 2 + 2*k] = RE(Z1[ 1 + k]); |
206 | | |
207 | 79.0M | X_out[N4 + 1 + 2*k] = -IM(Z1[N4 - 1 - k]); |
208 | 79.0M | X_out[N4 + 3 + 2*k] = -IM(Z1[N4 - 2 - k]); |
209 | | |
210 | 79.0M | X_out[N2 + 2*k] = RE(Z1[N8 + k]); |
211 | 79.0M | X_out[N2 + + 2 + 2*k] = RE(Z1[N8 + 1 + k]); |
212 | | |
213 | 79.0M | X_out[N2 + 1 + 2*k] = -IM(Z1[N8 - 1 - k]); |
214 | 79.0M | X_out[N2 + 3 + 2*k] = -IM(Z1[N8 - 2 - k]); |
215 | | |
216 | 79.0M | X_out[N2 + N4 + 2*k] = -IM(Z1[ k]); |
217 | 79.0M | X_out[N2 + N4 + 2 + 2*k] = -IM(Z1[ 1 + k]); |
218 | | |
219 | 79.0M | X_out[N2 + N4 + 1 + 2*k] = RE(Z1[N4 - 1 - k]); |
220 | 79.0M | X_out[N2 + N4 + 3 + 2*k] = RE(Z1[N4 - 2 - k]); |
221 | 79.0M | } |
222 | | |
223 | | #ifdef PROFILE |
224 | | count2 = faad_get_ts() - count2; |
225 | | mdct->fft_cycles += count1; |
226 | | mdct->cycles += (count2 - count1); |
227 | | #endif |
228 | 1.05M | } Line | Count | Source | 123 | 363k | { | 124 | 363k | uint16_t k; | 125 | | | 126 | 363k | complex_t x; | 127 | 363k | #ifdef ALLOW_SMALL_FRAMELENGTH | 128 | 363k | #ifdef FIXED_POINT | 129 | 363k | real_t scale = 0, b_scale = 0; | 130 | 363k | #endif | 131 | 363k | #endif | 132 | 363k | ALIGN complex_t Z1[512]; | 133 | 363k | complex_t *sincos = mdct->sincos; | 134 | | | 135 | 363k | uint16_t N = mdct->N; | 136 | 363k | uint16_t N2 = N >> 1; | 137 | 363k | uint16_t N4 = N >> 2; | 138 | 363k | uint16_t N8 = N >> 3; | 139 | | | 140 | | #ifdef PROFILE | 141 | | int64_t count1, count2 = faad_get_ts(); | 142 | | #endif | 143 | | | 144 | 363k | #ifdef ALLOW_SMALL_FRAMELENGTH | 145 | 363k | #ifdef FIXED_POINT | 146 | | /* detect non-power of 2 */ | 147 | 363k | if (N & (N-1)) | 148 | 58.6k | { | 149 | | /* adjust scale for non-power of 2 MDCT */ | 150 | | /* 2048/1920 */ | 151 | 58.6k | b_scale = 1; | 152 | 58.6k | scale = COEF_CONST(1.0666666666666667); | 153 | 58.6k | } | 154 | 363k | #endif | 155 | 363k | #endif | 156 | | | 157 | | /* pre-IFFT complex multiplication */ | 158 | 113M | for (k = 0; k < N4; k++) | 159 | 113M | { | 160 | 113M | ComplexMult(&IM(Z1[k]), &RE(Z1[k]), | 161 | 113M | X_in[2*k], X_in[N2 - 1 - 2*k], RE(sincos[k]), IM(sincos[k])); | 162 | 113M | } | 163 | | | 164 | | #ifdef PROFILE | 165 | | count1 = faad_get_ts(); | 166 | | #endif | 167 | | | 168 | | /* complex IFFT, any non-scaling FFT can be used here */ | 169 | 363k | cfftb(mdct->cfft, Z1); | 170 | | | 171 | | #ifdef PROFILE | 172 | | count1 = faad_get_ts() - count1; | 173 | | #endif | 174 | | | 175 | | /* post-IFFT complex multiplication */ | 176 | 113M | for (k = 0; k < N4; k++) | 177 | 113M | { | 178 | 113M | RE(x) = RE(Z1[k]); | 179 | 113M | IM(x) = IM(Z1[k]); | 180 | 113M | ComplexMult(&IM(Z1[k]), &RE(Z1[k]), | 181 | 113M | IM(x), RE(x), RE(sincos[k]), IM(sincos[k])); | 182 | | | 183 | 113M | #ifdef ALLOW_SMALL_FRAMELENGTH | 184 | 113M | #ifdef FIXED_POINT | 185 | | /* non-power of 2 MDCT scaling */ | 186 | 113M | if (b_scale) | 187 | 15.8M | { | 188 | 15.8M | RE(Z1[k]) = MUL_C(RE(Z1[k]), scale); | 189 | 15.8M | IM(Z1[k]) = MUL_C(IM(Z1[k]), scale); | 190 | 15.8M | } | 191 | 113M | #endif | 192 | 113M | #endif | 193 | 113M | } | 194 | | | 195 | | /* reordering */ | 196 | 28.7M | for (k = 0; k < N8; k+=2) | 197 | 28.3M | { | 198 | 28.3M | X_out[ 2*k] = IM(Z1[N8 + k]); | 199 | 28.3M | X_out[ 2 + 2*k] = IM(Z1[N8 + 1 + k]); | 200 | | | 201 | 28.3M | X_out[ 1 + 2*k] = -RE(Z1[N8 - 1 - k]); | 202 | 28.3M | X_out[ 3 + 2*k] = -RE(Z1[N8 - 2 - k]); | 203 | | | 204 | 28.3M | X_out[N4 + 2*k] = RE(Z1[ k]); | 205 | 28.3M | X_out[N4 + + 2 + 2*k] = RE(Z1[ 1 + k]); | 206 | | | 207 | 28.3M | X_out[N4 + 1 + 2*k] = -IM(Z1[N4 - 1 - k]); | 208 | 28.3M | X_out[N4 + 3 + 2*k] = -IM(Z1[N4 - 2 - k]); | 209 | | | 210 | 28.3M | X_out[N2 + 2*k] = RE(Z1[N8 + k]); | 211 | 28.3M | X_out[N2 + + 2 + 2*k] = RE(Z1[N8 + 1 + k]); | 212 | | | 213 | 28.3M | X_out[N2 + 1 + 2*k] = -IM(Z1[N8 - 1 - k]); | 214 | 28.3M | X_out[N2 + 3 + 2*k] = -IM(Z1[N8 - 2 - k]); | 215 | | | 216 | 28.3M | X_out[N2 + N4 + 2*k] = -IM(Z1[ k]); | 217 | 28.3M | X_out[N2 + N4 + 2 + 2*k] = -IM(Z1[ 1 + k]); | 218 | | | 219 | 28.3M | X_out[N2 + N4 + 1 + 2*k] = RE(Z1[N4 - 1 - k]); | 220 | 28.3M | X_out[N2 + N4 + 3 + 2*k] = RE(Z1[N4 - 2 - k]); | 221 | 28.3M | } | 222 | | | 223 | | #ifdef PROFILE | 224 | | count2 = faad_get_ts() - count2; | 225 | | mdct->fft_cycles += count1; | 226 | | mdct->cycles += (count2 - count1); | 227 | | #endif | 228 | 363k | } |
Line | Count | Source | 123 | 695k | { | 124 | 695k | uint16_t k; | 125 | | | 126 | 695k | complex_t x; | 127 | 695k | #ifdef ALLOW_SMALL_FRAMELENGTH | 128 | | #ifdef FIXED_POINT | 129 | | real_t scale = 0, b_scale = 0; | 130 | | #endif | 131 | 695k | #endif | 132 | 695k | ALIGN complex_t Z1[512]; | 133 | 695k | complex_t *sincos = mdct->sincos; | 134 | | | 135 | 695k | uint16_t N = mdct->N; | 136 | 695k | uint16_t N2 = N >> 1; | 137 | 695k | uint16_t N4 = N >> 2; | 138 | 695k | uint16_t N8 = N >> 3; | 139 | | | 140 | | #ifdef PROFILE | 141 | | int64_t count1, count2 = faad_get_ts(); | 142 | | #endif | 143 | | | 144 | 695k | #ifdef ALLOW_SMALL_FRAMELENGTH | 145 | | #ifdef FIXED_POINT | 146 | | /* detect non-power of 2 */ | 147 | | if (N & (N-1)) | 148 | | { | 149 | | /* adjust scale for non-power of 2 MDCT */ | 150 | | /* 2048/1920 */ | 151 | | b_scale = 1; | 152 | | scale = COEF_CONST(1.0666666666666667); | 153 | | } | 154 | | #endif | 155 | 695k | #endif | 156 | | | 157 | | /* pre-IFFT complex multiplication */ | 158 | 203M | for (k = 0; k < N4; k++) | 159 | 202M | { | 160 | 202M | ComplexMult(&IM(Z1[k]), &RE(Z1[k]), | 161 | 202M | X_in[2*k], X_in[N2 - 1 - 2*k], RE(sincos[k]), IM(sincos[k])); | 162 | 202M | } | 163 | | | 164 | | #ifdef PROFILE | 165 | | count1 = faad_get_ts(); | 166 | | #endif | 167 | | | 168 | | /* complex IFFT, any non-scaling FFT can be used here */ | 169 | 695k | cfftb(mdct->cfft, Z1); | 170 | | | 171 | | #ifdef PROFILE | 172 | | count1 = faad_get_ts() - count1; | 173 | | #endif | 174 | | | 175 | | /* post-IFFT complex multiplication */ | 176 | 203M | for (k = 0; k < N4; k++) | 177 | 202M | { | 178 | 202M | RE(x) = RE(Z1[k]); | 179 | 202M | IM(x) = IM(Z1[k]); | 180 | 202M | ComplexMult(&IM(Z1[k]), &RE(Z1[k]), | 181 | 202M | IM(x), RE(x), RE(sincos[k]), IM(sincos[k])); | 182 | | | 183 | 202M | #ifdef ALLOW_SMALL_FRAMELENGTH | 184 | | #ifdef FIXED_POINT | 185 | | /* non-power of 2 MDCT scaling */ | 186 | | if (b_scale) | 187 | | { | 188 | | RE(Z1[k]) = MUL_C(RE(Z1[k]), scale); | 189 | | IM(Z1[k]) = MUL_C(IM(Z1[k]), scale); | 190 | | } | 191 | | #endif | 192 | 202M | #endif | 193 | 202M | } | 194 | | | 195 | | /* reordering */ | 196 | 51.3M | for (k = 0; k < N8; k+=2) | 197 | 50.6M | { | 198 | 50.6M | X_out[ 2*k] = IM(Z1[N8 + k]); | 199 | 50.6M | X_out[ 2 + 2*k] = IM(Z1[N8 + 1 + k]); | 200 | | | 201 | 50.6M | X_out[ 1 + 2*k] = -RE(Z1[N8 - 1 - k]); | 202 | 50.6M | X_out[ 3 + 2*k] = -RE(Z1[N8 - 2 - k]); | 203 | | | 204 | 50.6M | X_out[N4 + 2*k] = RE(Z1[ k]); | 205 | 50.6M | X_out[N4 + + 2 + 2*k] = RE(Z1[ 1 + k]); | 206 | | | 207 | 50.6M | X_out[N4 + 1 + 2*k] = -IM(Z1[N4 - 1 - k]); | 208 | 50.6M | X_out[N4 + 3 + 2*k] = -IM(Z1[N4 - 2 - k]); | 209 | | | 210 | 50.6M | X_out[N2 + 2*k] = RE(Z1[N8 + k]); | 211 | 50.6M | X_out[N2 + + 2 + 2*k] = RE(Z1[N8 + 1 + k]); | 212 | | | 213 | 50.6M | X_out[N2 + 1 + 2*k] = -IM(Z1[N8 - 1 - k]); | 214 | 50.6M | X_out[N2 + 3 + 2*k] = -IM(Z1[N8 - 2 - k]); | 215 | | | 216 | 50.6M | X_out[N2 + N4 + 2*k] = -IM(Z1[ k]); | 217 | 50.6M | X_out[N2 + N4 + 2 + 2*k] = -IM(Z1[ 1 + k]); | 218 | | | 219 | 50.6M | X_out[N2 + N4 + 1 + 2*k] = RE(Z1[N4 - 1 - k]); | 220 | 50.6M | X_out[N2 + N4 + 3 + 2*k] = RE(Z1[N4 - 2 - k]); | 221 | 50.6M | } | 222 | | | 223 | | #ifdef PROFILE | 224 | | count2 = faad_get_ts() - count2; | 225 | | mdct->fft_cycles += count1; | 226 | | mdct->cycles += (count2 - count1); | 227 | | #endif | 228 | 695k | } |
|
229 | | |
230 | | #ifdef LTP_DEC |
231 | | void faad_mdct(mdct_info *mdct, real_t *X_in, real_t *X_out) |
232 | 12.6k | { |
233 | 12.6k | uint16_t k; |
234 | | |
235 | 12.6k | complex_t x; |
236 | 12.6k | ALIGN complex_t Z1[512]; |
237 | 12.6k | complex_t *sincos = mdct->sincos; |
238 | | |
239 | 12.6k | uint16_t N = mdct->N; |
240 | 12.6k | uint16_t N2 = N >> 1; |
241 | 12.6k | uint16_t N4 = N >> 2; |
242 | 12.6k | uint16_t N8 = N >> 3; |
243 | | |
244 | | #ifndef FIXED_POINT |
245 | 6.82k | real_t scale = REAL_CONST(N); |
246 | | #else |
247 | 5.79k | real_t scale = REAL_CONST(4.0/N); |
248 | | #endif |
249 | | |
250 | 12.6k | #ifdef ALLOW_SMALL_FRAMELENGTH |
251 | | #ifdef FIXED_POINT |
252 | | /* detect non-power of 2 */ |
253 | 5.79k | if (N & (N-1)) |
254 | 3.18k | { |
255 | | /* adjust scale for non-power of 2 MDCT */ |
256 | | /* *= sqrt(2048/1920) */ |
257 | 3.18k | scale = MUL_C(scale, COEF_CONST(1.0327955589886444)); |
258 | 3.18k | } |
259 | | #endif |
260 | 12.6k | #endif |
261 | | |
262 | | /* pre-FFT complex multiplication */ |
263 | 3.07M | for (k = 0; k < N8; k++) |
264 | 3.06M | { |
265 | 3.06M | uint16_t n = k << 1; |
266 | 3.06M | RE(x) = X_in[N - N4 - 1 - n] + X_in[N - N4 + n]; |
267 | 3.06M | IM(x) = X_in[ N4 + n] - X_in[ N4 - 1 - n]; |
268 | | |
269 | 3.06M | ComplexMult(&RE(Z1[k]), &IM(Z1[k]), |
270 | 3.06M | RE(x), IM(x), RE(sincos[k]), IM(sincos[k])); |
271 | | |
272 | 3.06M | RE(Z1[k]) = MUL_R(RE(Z1[k]), scale); |
273 | 3.06M | IM(Z1[k]) = MUL_R(IM(Z1[k]), scale); |
274 | | |
275 | 3.06M | RE(x) = X_in[N2 - 1 - n] - X_in[ n]; |
276 | 3.06M | IM(x) = X_in[N2 + n] + X_in[N - 1 - n]; |
277 | | |
278 | 3.06M | ComplexMult(&RE(Z1[k + N8]), &IM(Z1[k + N8]), |
279 | 3.06M | RE(x), IM(x), RE(sincos[k + N8]), IM(sincos[k + N8])); |
280 | | |
281 | 3.06M | RE(Z1[k + N8]) = MUL_R(RE(Z1[k + N8]), scale); |
282 | 3.06M | IM(Z1[k + N8]) = MUL_R(IM(Z1[k + N8]), scale); |
283 | 3.06M | } |
284 | | |
285 | | /* complex FFT, any non-scaling FFT can be used here */ |
286 | 12.6k | cfftf(mdct->cfft, Z1); |
287 | | |
288 | | /* post-FFT complex multiplication */ |
289 | 6.14M | for (k = 0; k < N4; k++) |
290 | 6.12M | { |
291 | 6.12M | uint16_t n = k << 1; |
292 | 6.12M | ComplexMult(&RE(x), &IM(x), |
293 | 6.12M | RE(Z1[k]), IM(Z1[k]), RE(sincos[k]), IM(sincos[k])); |
294 | | |
295 | 6.12M | X_out[ n] = -RE(x); |
296 | 6.12M | X_out[N2 - 1 - n] = IM(x); |
297 | 6.12M | X_out[N2 + n] = -IM(x); |
298 | 6.12M | X_out[N - 1 - n] = RE(x); |
299 | 6.12M | } |
300 | 12.6k | } Line | Count | Source | 232 | 6.82k | { | 233 | 6.82k | uint16_t k; | 234 | | | 235 | 6.82k | complex_t x; | 236 | 6.82k | ALIGN complex_t Z1[512]; | 237 | 6.82k | complex_t *sincos = mdct->sincos; | 238 | | | 239 | 6.82k | uint16_t N = mdct->N; | 240 | 6.82k | uint16_t N2 = N >> 1; | 241 | 6.82k | uint16_t N4 = N >> 2; | 242 | 6.82k | uint16_t N8 = N >> 3; | 243 | | | 244 | 6.82k | #ifndef FIXED_POINT | 245 | 6.82k | real_t scale = REAL_CONST(N); | 246 | | #else | 247 | | real_t scale = REAL_CONST(4.0/N); | 248 | | #endif | 249 | | | 250 | 6.82k | #ifdef ALLOW_SMALL_FRAMELENGTH | 251 | | #ifdef FIXED_POINT | 252 | | /* detect non-power of 2 */ | 253 | | if (N & (N-1)) | 254 | | { | 255 | | /* adjust scale for non-power of 2 MDCT */ | 256 | | /* *= sqrt(2048/1920) */ | 257 | | scale = MUL_C(scale, COEF_CONST(1.0327955589886444)); | 258 | | } | 259 | | #endif | 260 | 6.82k | #endif | 261 | | | 262 | | /* pre-FFT complex multiplication */ | 263 | 1.65M | for (k = 0; k < N8; k++) | 264 | 1.64M | { | 265 | 1.64M | uint16_t n = k << 1; | 266 | 1.64M | RE(x) = X_in[N - N4 - 1 - n] + X_in[N - N4 + n]; | 267 | 1.64M | IM(x) = X_in[ N4 + n] - X_in[ N4 - 1 - n]; | 268 | | | 269 | 1.64M | ComplexMult(&RE(Z1[k]), &IM(Z1[k]), | 270 | 1.64M | RE(x), IM(x), RE(sincos[k]), IM(sincos[k])); | 271 | | | 272 | 1.64M | RE(Z1[k]) = MUL_R(RE(Z1[k]), scale); | 273 | 1.64M | IM(Z1[k]) = MUL_R(IM(Z1[k]), scale); | 274 | | | 275 | 1.64M | RE(x) = X_in[N2 - 1 - n] - X_in[ n]; | 276 | 1.64M | IM(x) = X_in[N2 + n] + X_in[N - 1 - n]; | 277 | | | 278 | 1.64M | ComplexMult(&RE(Z1[k + N8]), &IM(Z1[k + N8]), | 279 | 1.64M | RE(x), IM(x), RE(sincos[k + N8]), IM(sincos[k + N8])); | 280 | | | 281 | 1.64M | RE(Z1[k + N8]) = MUL_R(RE(Z1[k + N8]), scale); | 282 | 1.64M | IM(Z1[k + N8]) = MUL_R(IM(Z1[k + N8]), scale); | 283 | 1.64M | } | 284 | | | 285 | | /* complex FFT, any non-scaling FFT can be used here */ | 286 | 6.82k | cfftf(mdct->cfft, Z1); | 287 | | | 288 | | /* post-FFT complex multiplication */ | 289 | 3.30M | for (k = 0; k < N4; k++) | 290 | 3.29M | { | 291 | 3.29M | uint16_t n = k << 1; | 292 | 3.29M | ComplexMult(&RE(x), &IM(x), | 293 | 3.29M | RE(Z1[k]), IM(Z1[k]), RE(sincos[k]), IM(sincos[k])); | 294 | | | 295 | 3.29M | X_out[ n] = -RE(x); | 296 | 3.29M | X_out[N2 - 1 - n] = IM(x); | 297 | 3.29M | X_out[N2 + n] = -IM(x); | 298 | 3.29M | X_out[N - 1 - n] = RE(x); | 299 | 3.29M | } | 300 | 6.82k | } |
Line | Count | Source | 232 | 5.79k | { | 233 | 5.79k | uint16_t k; | 234 | | | 235 | 5.79k | complex_t x; | 236 | 5.79k | ALIGN complex_t Z1[512]; | 237 | 5.79k | complex_t *sincos = mdct->sincos; | 238 | | | 239 | 5.79k | uint16_t N = mdct->N; | 240 | 5.79k | uint16_t N2 = N >> 1; | 241 | 5.79k | uint16_t N4 = N >> 2; | 242 | 5.79k | uint16_t N8 = N >> 3; | 243 | | | 244 | | #ifndef FIXED_POINT | 245 | | real_t scale = REAL_CONST(N); | 246 | | #else | 247 | 5.79k | real_t scale = REAL_CONST(4.0/N); | 248 | 5.79k | #endif | 249 | | | 250 | 5.79k | #ifdef ALLOW_SMALL_FRAMELENGTH | 251 | 5.79k | #ifdef FIXED_POINT | 252 | | /* detect non-power of 2 */ | 253 | 5.79k | if (N & (N-1)) | 254 | 3.18k | { | 255 | | /* adjust scale for non-power of 2 MDCT */ | 256 | | /* *= sqrt(2048/1920) */ | 257 | 3.18k | scale = MUL_C(scale, COEF_CONST(1.0327955589886444)); | 258 | 3.18k | } | 259 | 5.79k | #endif | 260 | 5.79k | #endif | 261 | | | 262 | | /* pre-FFT complex multiplication */ | 263 | 1.42M | for (k = 0; k < N8; k++) | 264 | 1.41M | { | 265 | 1.41M | uint16_t n = k << 1; | 266 | 1.41M | RE(x) = X_in[N - N4 - 1 - n] + X_in[N - N4 + n]; | 267 | 1.41M | IM(x) = X_in[ N4 + n] - X_in[ N4 - 1 - n]; | 268 | | | 269 | 1.41M | ComplexMult(&RE(Z1[k]), &IM(Z1[k]), | 270 | 1.41M | RE(x), IM(x), RE(sincos[k]), IM(sincos[k])); | 271 | | | 272 | 1.41M | RE(Z1[k]) = MUL_R(RE(Z1[k]), scale); | 273 | 1.41M | IM(Z1[k]) = MUL_R(IM(Z1[k]), scale); | 274 | | | 275 | 1.41M | RE(x) = X_in[N2 - 1 - n] - X_in[ n]; | 276 | 1.41M | IM(x) = X_in[N2 + n] + X_in[N - 1 - n]; | 277 | | | 278 | 1.41M | ComplexMult(&RE(Z1[k + N8]), &IM(Z1[k + N8]), | 279 | 1.41M | RE(x), IM(x), RE(sincos[k + N8]), IM(sincos[k + N8])); | 280 | | | 281 | 1.41M | RE(Z1[k + N8]) = MUL_R(RE(Z1[k + N8]), scale); | 282 | 1.41M | IM(Z1[k + N8]) = MUL_R(IM(Z1[k + N8]), scale); | 283 | 1.41M | } | 284 | | | 285 | | /* complex FFT, any non-scaling FFT can be used here */ | 286 | 5.79k | cfftf(mdct->cfft, Z1); | 287 | | | 288 | | /* post-FFT complex multiplication */ | 289 | 2.84M | for (k = 0; k < N4; k++) | 290 | 2.83M | { | 291 | 2.83M | uint16_t n = k << 1; | 292 | 2.83M | ComplexMult(&RE(x), &IM(x), | 293 | 2.83M | RE(Z1[k]), IM(Z1[k]), RE(sincos[k]), IM(sincos[k])); | 294 | | | 295 | 2.83M | X_out[ n] = -RE(x); | 296 | 2.83M | X_out[N2 - 1 - n] = IM(x); | 297 | 2.83M | X_out[N2 + n] = -IM(x); | 298 | 2.83M | X_out[N - 1 - n] = RE(x); | 299 | 2.83M | } | 300 | 5.79k | } |
|
301 | | #endif |