Coverage Report

Created: 2026-07-16 06:11

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/common/ixheaac_esbr_fft.c
Line
Count
Source
1
/******************************************************************************
2
 *                                                                            *
3
 * Copyright (C) 2018 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
*/
20
21
#include <stdio.h>
22
#include <stdlib.h>
23
#include "ixheaac_type_def.h"
24
#include "ixheaac_constants.h"
25
#include "ixheaac_basic_ops32.h"
26
27
#define PLATFORM_INLINE __inline
28
29
#define DIG_REV(i, m, j)                                    \
30
170M
  do {                                                      \
31
170M
    unsigned _ = (i);                                       \
32
170M
    _ = ((_ & 0x33333333) << 2) | ((_ & ~0x33333333) >> 2); \
33
170M
    _ = ((_ & 0x0F0F0F0F) << 4) | ((_ & ~0x0F0F0F0F) >> 4); \
34
170M
    _ = ((_ & 0x00FF00FF) << 8) | ((_ & ~0x00FF00FF) >> 8); \
35
170M
    (j) = _ >> (m);                                         \
36
170M
  } while (0)
37
38
extern const FLOAT32 ixheaac_twiddle_table_fft_float[514];
39
extern const FLOAT32 ixheaac_twidle_tbl_48[64];
40
extern const FLOAT32 ixheaac_twidle_tbl_24[32];
41
42
28.8M
void ixheaac_real_synth_fft_p2(FLOAT32 *ptr_x, FLOAT32 *ptr_y, WORD32 npoints) {
43
28.8M
  WORD32 i, j, k, n_stages, h2;
44
28.8M
  FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
45
28.8M
  WORD32 del, nodespacing, in_loop_cnt;
46
28.8M
  WORD32 not_power_4;
47
28.8M
  WORD32 dig_rev_shift;
48
28.8M
  const FLOAT32 *ptr_w;
49
50
28.8M
  dig_rev_shift = ixheaac_norm32(npoints) + 1 - 16;
51
28.8M
  n_stages = 30 - ixheaac_norm32(npoints);
52
28.8M
  not_power_4 = n_stages & 1;
53
54
28.8M
  n_stages = n_stages >> 1;
55
56
28.8M
  ptr_w = ixheaac_twiddle_table_fft_float;
57
58
117M
  for (i = 0; i < npoints; i += 4) {
59
88.3M
    FLOAT32 *inp = ptr_x;
60
61
88.3M
    DIG_REV(i, dig_rev_shift, h2);
62
88.3M
    if (not_power_4) {
63
73.6M
      h2 += 1;
64
73.6M
      h2 &= ~1;
65
73.6M
    }
66
88.3M
    inp += (h2 >> 1);
67
68
88.3M
    x0r = *inp;
69
88.3M
    inp += (npoints >> 2);
70
71
88.3M
    x1r = *inp;
72
88.3M
    inp += (npoints >> 2);
73
74
88.3M
    x2r = *inp;
75
88.3M
    inp += (npoints >> 2);
76
77
88.3M
    x3r = *inp;
78
79
88.3M
    x0r = x0r + x2r;
80
88.3M
    x2r = x0r - (x2r * 2);
81
88.3M
    x1r = x1r + x3r;
82
88.3M
    x3r = x1r - (x3r * 2);
83
88.3M
    x0r = x0r + x1r;
84
88.3M
    x1r = x0r - (x1r * 2);
85
86
88.3M
    *ptr_y++ = x0r;
87
88.3M
    *ptr_y++ = 0;
88
88.3M
    *ptr_y++ = x2r;
89
88.3M
    *ptr_y++ = x3r;
90
88.3M
    *ptr_y++ = x1r;
91
88.3M
    *ptr_y++ = 0;
92
88.3M
    *ptr_y++ = x2r;
93
88.3M
    *ptr_y++ = -x3r;
94
88.3M
  }
95
28.8M
  ptr_y -= 2 * npoints;
96
28.8M
  del = 4;
97
28.8M
  nodespacing = 64;
98
28.8M
  in_loop_cnt = npoints >> 4;
99
36.4M
  for (i = n_stages - 1; i > 0; i--) {
100
7.54M
    const FLOAT32 *twiddles = ptr_w;
101
7.54M
    FLOAT32 *data = ptr_y;
102
7.54M
    FLOAT32 W1, W2, W3, W4, W5, W6;
103
7.54M
    WORD32 sec_loop_cnt;
104
105
18.9M
    for (k = in_loop_cnt; k != 0; k--) {
106
11.4M
      x0r = (*data);
107
11.4M
      x0i = (*(data + 1));
108
11.4M
      data += ((SIZE_T)del << 1);
109
110
11.4M
      x1r = (*data);
111
11.4M
      x1i = (*(data + 1));
112
11.4M
      data += ((SIZE_T)del << 1);
113
114
11.4M
      x2r = (*data);
115
11.4M
      x2i = (*(data + 1));
116
11.4M
      data += ((SIZE_T)del << 1);
117
118
11.4M
      x3r = (*data);
119
11.4M
      x3i = (*(data + 1));
120
11.4M
      data -= 3 * ((SIZE_T)del << 1);
121
122
11.4M
      x0r = x0r + x2r;
123
11.4M
      x0i = x0i + x2i;
124
11.4M
      x2r = x0r - (x2r * 2);
125
11.4M
      x2i = x0i - (x2i * 2);
126
11.4M
      x1r = x1r + x3r;
127
11.4M
      x1i = x1i + x3i;
128
11.4M
      x3r = x1r - (x3r * 2);
129
11.4M
      x3i = x1i - (x3i * 2);
130
131
11.4M
      x0r = x0r + x1r;
132
11.4M
      x0i = x0i + x1i;
133
11.4M
      x1r = x0r - (x1r * 2);
134
11.4M
      x1i = x0i - (x1i * 2);
135
11.4M
      x2r = x2r - x3i;
136
11.4M
      x2i = x2i + x3r;
137
11.4M
      x3i = x2r + (x3i * 2);
138
11.4M
      x3r = x2i - (x3r * 2);
139
140
11.4M
      *data = x0r;
141
11.4M
      *(data + 1) = x0i;
142
11.4M
      data += ((SIZE_T)del << 1);
143
144
11.4M
      *data = x2r;
145
11.4M
      *(data + 1) = x2i;
146
11.4M
      data += ((SIZE_T)del << 1);
147
148
11.4M
      *data = x1r;
149
11.4M
      *(data + 1) = x1i;
150
11.4M
      data += ((SIZE_T)del << 1);
151
152
11.4M
      *data = x3i;
153
11.4M
      *(data + 1) = x3r;
154
11.4M
      data += ((SIZE_T)del << 1);
155
11.4M
    }
156
7.54M
    data = ptr_y + 2;
157
158
7.54M
    sec_loop_cnt = (nodespacing * del);
159
7.54M
    sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) - (sec_loop_cnt / 16) +
160
7.54M
                   (sec_loop_cnt / 32) - (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
161
7.54M
                   (sec_loop_cnt / 256);
162
163
15.0M
    for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
164
7.54M
      W1 = *(twiddles + j);
165
7.54M
      W4 = *(twiddles + j + 257);
166
7.54M
      W2 = *(twiddles + ((SIZE_T)j << 1));
167
7.54M
      W5 = *(twiddles + ((SIZE_T)j << 1) + 257);
168
7.54M
      W3 = *(twiddles + j + ((SIZE_T)j << 1));
169
7.54M
      W6 = *(twiddles + j + ((SIZE_T)j << 1) + 257);
170
171
18.9M
      for (k = in_loop_cnt; k != 0; k--) {
172
11.4M
        FLOAT32 tmp;
173
11.4M
        FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
174
175
11.4M
        data += ((SIZE_T)del << 1);
176
177
11.4M
        x1r = *data;
178
11.4M
        x1i = *(data + 1);
179
11.4M
        data += ((SIZE_T)del << 1);
180
181
11.4M
        x2r = *data;
182
11.4M
        x2i = *(data + 1);
183
11.4M
        data += ((SIZE_T)del << 1);
184
185
11.4M
        x3r = *data;
186
11.4M
        x3i = *(data + 1);
187
11.4M
        data -= 3 * ((SIZE_T)del << 1);
188
189
11.4M
        tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
190
11.4M
        x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
191
11.4M
        x1r = tmp;
192
193
11.4M
        tmp = (FLOAT32)(((FLOAT32)x2r * W2) + ((FLOAT32)x2i * W5));
194
11.4M
        x2i = (FLOAT32)(-((FLOAT32)x2r * W5) + (FLOAT32)x2i * W2);
195
11.4M
        x2r = tmp;
196
197
11.4M
        tmp = (FLOAT32)(((FLOAT32)x3r * W3) + ((FLOAT32)x3i * W6));
198
11.4M
        x3i = (FLOAT32)(-((FLOAT32)x3r * W6) + (FLOAT32)x3i * W3);
199
11.4M
        x3r = tmp;
200
201
11.4M
        x0r = (*data);
202
11.4M
        x0i = (*(data + 1));
203
204
11.4M
        x0r = x0r + (x2r);
205
11.4M
        x0i = x0i + (x2i);
206
11.4M
        x2r = x0r - (x2r * 2);
207
11.4M
        x2i = x0i - (x2i * 2);
208
11.4M
        x1r = x1r + x3r;
209
11.4M
        x1i = x1i + x3i;
210
11.4M
        x3r = x1r - (x3r * 2);
211
11.4M
        x3i = x1i - (x3i * 2);
212
213
11.4M
        x0r = x0r + (x1r);
214
11.4M
        x0i = x0i + (x1i);
215
11.4M
        x1r = x0r - (x1r * 2);
216
11.4M
        x1i = x0i - (x1i * 2);
217
11.4M
        x2r = x2r - (x3i);
218
11.4M
        x2i = x2i + (x3r);
219
11.4M
        x3i = x2r + (x3i * 2);
220
11.4M
        x3r = x2i - (x3r * 2);
221
222
11.4M
        *data = x0r;
223
11.4M
        *(data + 1) = x0i;
224
11.4M
        data += ((SIZE_T)del << 1);
225
226
11.4M
        *data = x2r;
227
11.4M
        *(data + 1) = x2i;
228
11.4M
        data += ((SIZE_T)del << 1);
229
230
11.4M
        *data = x1r;
231
11.4M
        *(data + 1) = x1i;
232
11.4M
        data += ((SIZE_T)del << 1);
233
234
11.4M
        *data = x3i;
235
11.4M
        *(data + 1) = x3r;
236
11.4M
        data += ((SIZE_T)del << 1);
237
11.4M
      }
238
7.54M
      data -= 2 * npoints;
239
7.54M
      data += 2;
240
7.54M
    }
241
15.0M
    for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
242
7.54M
      W1 = *(twiddles + j);
243
7.54M
      W4 = *(twiddles + j + 257);
244
7.54M
      W2 = *(twiddles + ((SIZE_T)j << 1));
245
7.54M
      W5 = *(twiddles + ((SIZE_T)j << 1) + 257);
246
7.54M
      W3 = *(twiddles + j + ((SIZE_T)j << 1) - 256);
247
7.54M
      W6 = *(twiddles + j + ((SIZE_T)j << 1) + 1);
248
249
18.9M
      for (k = in_loop_cnt; k != 0; k--) {
250
11.4M
        FLOAT32 tmp;
251
11.4M
        FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
252
253
11.4M
        data += ((SIZE_T)del << 1);
254
255
11.4M
        x1r = *data;
256
11.4M
        x1i = *(data + 1);
257
11.4M
        data += ((SIZE_T)del << 1);
258
259
11.4M
        x2r = *data;
260
11.4M
        x2i = *(data + 1);
261
11.4M
        data += ((SIZE_T)del << 1);
262
263
11.4M
        x3r = *data;
264
11.4M
        x3i = *(data + 1);
265
11.4M
        data -= 3 * ((SIZE_T)del << 1);
266
267
11.4M
        tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
268
11.4M
        x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
269
11.4M
        x1r = tmp;
270
271
11.4M
        tmp = (FLOAT32)(((FLOAT32)x2r * W2) + ((FLOAT32)x2i * W5));
272
11.4M
        x2i = (FLOAT32)(-((FLOAT32)x2r * W5) + (FLOAT32)x2i * W2);
273
11.4M
        x2r = tmp;
274
275
11.4M
        tmp = (FLOAT32)(((FLOAT32)x3r * W6) - ((FLOAT32)x3i * W3));
276
11.4M
        x3i = (FLOAT32)(((FLOAT32)x3r * W3) + ((FLOAT32)x3i * W6));
277
11.4M
        x3r = tmp;
278
279
11.4M
        x0r = (*data);
280
11.4M
        x0i = (*(data + 1));
281
282
11.4M
        x0r = x0r + (x2r);
283
11.4M
        x0i = x0i + (x2i);
284
11.4M
        x2r = x0r - (x2r * 2);
285
11.4M
        x2i = x0i - (x2i * 2);
286
11.4M
        x1r = x1r + x3r;
287
11.4M
        x1i = x1i + x3i;
288
11.4M
        x3r = x1r - (x3r * 2);
289
11.4M
        x3i = x1i - (x3i * 2);
290
291
11.4M
        x0r = x0r + (x1r);
292
11.4M
        x0i = x0i + (x1i);
293
11.4M
        x1r = x0r - (x1r * 2);
294
11.4M
        x1i = x0i - (x1i * 2);
295
11.4M
        x2r = x2r - (x3i);
296
11.4M
        x2i = x2i + (x3r);
297
11.4M
        x3i = x2r + (x3i * 2);
298
11.4M
        x3r = x2i - (x3r * 2);
299
300
11.4M
        *data = x0r;
301
11.4M
        *(data + 1) = x0i;
302
11.4M
        data += ((SIZE_T)del << 1);
303
304
11.4M
        *data = x2r;
305
11.4M
        *(data + 1) = x2i;
306
11.4M
        data += ((SIZE_T)del << 1);
307
308
11.4M
        *data = x1r;
309
11.4M
        *(data + 1) = x1i;
310
11.4M
        data += ((SIZE_T)del << 1);
311
312
11.4M
        *data = x3i;
313
11.4M
        *(data + 1) = x3r;
314
11.4M
        data += ((SIZE_T)del << 1);
315
11.4M
      }
316
7.54M
      data -= 2 * npoints;
317
7.54M
      data += 2;
318
7.54M
    }
319
7.54M
    for (; j <= sec_loop_cnt * 2; j += nodespacing) {
320
0
      W1 = *(twiddles + j);
321
0
      W4 = *(twiddles + j + 257);
322
0
      W2 = *(twiddles + ((SIZE_T)j << 1) - 256);
323
0
      W5 = *(twiddles + ((SIZE_T)j << 1) + 1);
324
0
      W3 = *(twiddles + j + ((SIZE_T)j << 1) - 256);
325
0
      W6 = *(twiddles + j + ((SIZE_T)j << 1) + 1);
326
327
0
      for (k = in_loop_cnt; k != 0; k--) {
328
0
        FLOAT32 tmp;
329
0
        FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
330
331
0
        data += ((SIZE_T)del << 1);
332
333
0
        x1r = *data;
334
0
        x1i = *(data + 1);
335
0
        data += ((SIZE_T)del << 1);
336
337
0
        x2r = *data;
338
0
        x2i = *(data + 1);
339
0
        data += ((SIZE_T)del << 1);
340
341
0
        x3r = *data;
342
0
        x3i = *(data + 1);
343
0
        data -= 3 * ((SIZE_T)del << 1);
344
345
0
        tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
346
0
        x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
347
0
        x1r = tmp;
348
349
0
        tmp = (FLOAT32)(((FLOAT32)x2r * W5) - ((FLOAT32)x2i * W2));
350
0
        x2i = (FLOAT32)(((FLOAT32)x2r * W2) + ((FLOAT32)x2i * W5));
351
0
        x2r = tmp;
352
353
0
        tmp = (FLOAT32)(((FLOAT32)x3r * W6) - ((FLOAT32)x3i * W3));
354
0
        x3i = (FLOAT32)(((FLOAT32)x3r * W3) + ((FLOAT32)x3i * W6));
355
0
        x3r = tmp;
356
357
0
        x0r = (*data);
358
0
        x0i = (*(data + 1));
359
360
0
        x0r = x0r + (x2r);
361
0
        x0i = x0i + (x2i);
362
0
        x2r = x0r - (x2r * 2);
363
0
        x2i = x0i - (x2i * 2);
364
0
        x1r = x1r + x3r;
365
0
        x1i = x1i + x3i;
366
0
        x3r = x1r - (x3r * 2);
367
0
        x3i = x1i - (x3i * 2);
368
369
0
        x0r = x0r + (x1r);
370
0
        x0i = x0i + (x1i);
371
0
        x1r = x0r - (x1r * 2);
372
0
        x1i = x0i - (x1i * 2);
373
0
        x2r = x2r - (x3i);
374
0
        x2i = x2i + (x3r);
375
0
        x3i = x2r + (x3i * 2);
376
0
        x3r = x2i - (x3r * 2);
377
378
0
        *data = x0r;
379
0
        *(data + 1) = x0i;
380
0
        data += ((SIZE_T)del << 1);
381
382
0
        *data = x2r;
383
0
        *(data + 1) = x2i;
384
0
        data += ((SIZE_T)del << 1);
385
386
0
        *data = x1r;
387
0
        *(data + 1) = x1i;
388
0
        data += ((SIZE_T)del << 1);
389
390
0
        *data = x3i;
391
0
        *(data + 1) = x3r;
392
0
        data += ((SIZE_T)del << 1);
393
0
      }
394
0
      data -= 2 * npoints;
395
0
      data += 2;
396
0
    }
397
15.0M
    for (; j < nodespacing * del; j += nodespacing) {
398
7.54M
      W1 = *(twiddles + j);
399
7.54M
      W4 = *(twiddles + j + 257);
400
7.54M
      W2 = *(twiddles + ((SIZE_T)j << 1) - 256);
401
7.54M
      W5 = *(twiddles + ((SIZE_T)j << 1) + 1);
402
7.54M
      W3 = *(twiddles + j + ((SIZE_T)j << 1) - 512);
403
7.54M
      W6 = *(twiddles + j + ((SIZE_T)j << 1) - 512 + 257);
404
405
18.9M
      for (k = in_loop_cnt; k != 0; k--) {
406
11.4M
        FLOAT32 tmp;
407
11.4M
        FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
408
409
11.4M
        data += ((SIZE_T)del << 1);
410
411
11.4M
        x1r = *data;
412
11.4M
        x1i = *(data + 1);
413
11.4M
        data += ((SIZE_T)del << 1);
414
415
11.4M
        x2r = *data;
416
11.4M
        x2i = *(data + 1);
417
11.4M
        data += ((SIZE_T)del << 1);
418
419
11.4M
        x3r = *data;
420
11.4M
        x3i = *(data + 1);
421
11.4M
        data -= 3 * ((SIZE_T)del << 1);
422
423
11.4M
        tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
424
11.4M
        x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
425
11.4M
        x1r = tmp;
426
427
11.4M
        tmp = (FLOAT32)(((FLOAT32)x2r * W5) - ((FLOAT32)x2i * W2));
428
11.4M
        x2i = (FLOAT32)(((FLOAT32)x2r * W2) + ((FLOAT32)x2i * W5));
429
11.4M
        x2r = tmp;
430
431
11.4M
        tmp = (FLOAT32)(-((FLOAT32)x3r * W3) - ((FLOAT32)x3i * W6));
432
11.4M
        x3i = (FLOAT32)(-((FLOAT32)x3r * W6) + (FLOAT32)x3i * W3);
433
11.4M
        x3r = tmp;
434
435
11.4M
        x0r = (*data);
436
11.4M
        x0i = (*(data + 1));
437
438
11.4M
        x0r = x0r + (x2r);
439
11.4M
        x0i = x0i + (x2i);
440
11.4M
        x2r = x0r - (x2r * 2);
441
11.4M
        x2i = x0i - (x2i * 2);
442
11.4M
        x1r = x1r + x3r;
443
11.4M
        x1i = x1i - x3i;
444
11.4M
        x3r = x1r - (x3r * 2);
445
11.4M
        x3i = x1i + (x3i * 2);
446
447
11.4M
        x0r = x0r + (x1r);
448
11.4M
        x0i = x0i + (x1i);
449
11.4M
        x1r = x0r - (x1r * 2);
450
11.4M
        x1i = x0i - (x1i * 2);
451
11.4M
        x2r = x2r - (x3i);
452
11.4M
        x2i = x2i + (x3r);
453
11.4M
        x3i = x2r + (x3i * 2);
454
11.4M
        x3r = x2i - (x3r * 2);
455
456
11.4M
        *data = x0r;
457
11.4M
        *(data + 1) = x0i;
458
11.4M
        data += ((SIZE_T)del << 1);
459
460
11.4M
        *data = x2r;
461
11.4M
        *(data + 1) = x2i;
462
11.4M
        data += ((SIZE_T)del << 1);
463
464
11.4M
        *data = x1r;
465
11.4M
        *(data + 1) = x1i;
466
11.4M
        data += ((SIZE_T)del << 1);
467
468
11.4M
        *data = x3i;
469
11.4M
        *(data + 1) = x3r;
470
11.4M
        data += ((SIZE_T)del << 1);
471
11.4M
      }
472
7.54M
      data -= 2 * npoints;
473
7.54M
      data += 2;
474
7.54M
    }
475
7.54M
    nodespacing >>= 2;
476
7.54M
    del <<= 2;
477
7.54M
    in_loop_cnt >>= 2;
478
7.54M
  }
479
480
28.8M
  if (not_power_4) {
481
25.1M
    const FLOAT32 *twiddles = ptr_w;
482
25.1M
    nodespacing <<= 1;
483
484
98.8M
    for (j = del / 2; j != 0; j--) {
485
73.6M
      FLOAT32 W1 = *twiddles;
486
73.6M
      FLOAT32 W4 = *(twiddles + 257);
487
73.6M
      FLOAT32 tmp;
488
73.6M
      twiddles += nodespacing;
489
490
73.6M
      x0r = *ptr_y;
491
73.6M
      x0i = *(ptr_y + 1);
492
73.6M
      ptr_y += ((SIZE_T)del << 1);
493
494
73.6M
      x1r = *ptr_y;
495
73.6M
      x1i = *(ptr_y + 1);
496
497
73.6M
      tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
498
73.6M
      x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
499
73.6M
      x1r = tmp;
500
501
73.6M
      *ptr_y = (x0r) - (x1r);
502
73.6M
      *(ptr_y + 1) = (x0i) - (x1i);
503
73.6M
      ptr_y -= ((SIZE_T)del << 1);
504
505
73.6M
      *ptr_y = (x0r) + (x1r);
506
73.6M
      *(ptr_y + 1) = (x0i) + (x1i);
507
73.6M
      ptr_y += 2;
508
73.6M
    }
509
25.1M
    twiddles = ptr_w;
510
98.8M
    for (j = del / 2; j != 0; j--) {
511
73.6M
      FLOAT32 W1 = *twiddles;
512
73.6M
      FLOAT32 W4 = *(twiddles + 257);
513
73.6M
      FLOAT32 tmp;
514
73.6M
      twiddles += nodespacing;
515
516
73.6M
      x0r = *ptr_y;
517
73.6M
      x0i = *(ptr_y + 1);
518
73.6M
      ptr_y += ((SIZE_T)del << 1);
519
520
73.6M
      x1r = *ptr_y;
521
73.6M
      x1i = *(ptr_y + 1);
522
73.6M
      tmp = (FLOAT32)(((FLOAT32)x1r * W4) - ((FLOAT32)x1i * W1));
523
73.6M
      x1i = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
524
73.6M
      x1r = tmp;
525
526
73.6M
      *ptr_y = (x0r) - (x1r);
527
73.6M
      *(ptr_y + 1) = (x0i) - (x1i);
528
73.6M
      ptr_y -= ((SIZE_T)del << 1);
529
530
73.6M
      *ptr_y = (x0r) + (x1r);
531
73.6M
      *(ptr_y + 1) = (x0i) + (x1i);
532
73.6M
      ptr_y += 2;
533
73.6M
    }
534
25.1M
  }
535
28.8M
}
536
537
13.5M
void ixheaac_cmplx_anal_fft_p2(FLOAT32 *ptr_x, FLOAT32 *ptr_y, WORD32 npoints) {
538
13.5M
  WORD32 i, j, k, n_stages, h2;
539
13.5M
  FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
540
13.5M
  WORD32 del, nodespacing, in_loop_cnt;
541
13.5M
  WORD32 not_power_4;
542
13.5M
  WORD32 dig_rev_shift;
543
13.5M
  const FLOAT32 *ptr_w;
544
545
13.5M
  dig_rev_shift = ixheaac_norm32(npoints) + 1 - 16;
546
13.5M
  n_stages = 30 - ixheaac_norm32(npoints);
547
13.5M
  not_power_4 = n_stages & 1;
548
549
13.5M
  n_stages = n_stages >> 1;
550
551
13.5M
  ptr_w = ixheaac_twiddle_table_fft_float;
552
553
95.8M
  for (i = 0; i < npoints; i += 4) {
554
82.3M
    FLOAT32 *inp = ptr_x;
555
556
82.3M
    DIG_REV(i, dig_rev_shift, h2);
557
82.3M
    if (not_power_4) {
558
14.6M
      h2 += 1;
559
14.6M
      h2 &= ~1;
560
14.6M
    }
561
82.3M
    inp += (h2);
562
563
82.3M
    x0r = *inp;
564
82.3M
    x0i = *(inp + 1);
565
82.3M
    inp += (npoints >> 1);
566
567
82.3M
    x1r = *inp;
568
82.3M
    x1i = *(inp + 1);
569
82.3M
    inp += (npoints >> 1);
570
571
82.3M
    x2r = *inp;
572
82.3M
    x2i = *(inp + 1);
573
82.3M
    inp += (npoints >> 1);
574
575
82.3M
    x3r = *inp;
576
82.3M
    x3i = *(inp + 1);
577
578
82.3M
    x0r = x0r + x2r;
579
82.3M
    x0i = x0i + x2i;
580
82.3M
    x2r = x0r - (x2r * 2);
581
82.3M
    x2i = x0i - (x2i * 2);
582
82.3M
    x1r = x1r + x3r;
583
82.3M
    x1i = x1i + x3i;
584
82.3M
    x3r = x1r - (x3r * 2);
585
82.3M
    x3i = x1i - (x3i * 2);
586
587
82.3M
    x0r = x0r + x1r;
588
82.3M
    x0i = x0i + x1i;
589
82.3M
    x1r = x0r - (x1r * 2);
590
82.3M
    x1i = x0i - (x1i * 2);
591
82.3M
    x2r = x2r - x3i;
592
82.3M
    x2i = x2i + x3r;
593
82.3M
    x3i = x2r + (x3i * 2);
594
82.3M
    x3r = x2i - (x3r * 2);
595
596
82.3M
    *ptr_y++ = x0r;
597
82.3M
    *ptr_y++ = x0i;
598
82.3M
    *ptr_y++ = x2r;
599
82.3M
    *ptr_y++ = x2i;
600
82.3M
    *ptr_y++ = x1r;
601
82.3M
    *ptr_y++ = x1i;
602
82.3M
    *ptr_y++ = x3i;
603
82.3M
    *ptr_y++ = x3r;
604
82.3M
  }
605
13.5M
  ptr_y -= 2 * npoints;
606
13.5M
  del = 4;
607
13.5M
  nodespacing = 64;
608
13.5M
  in_loop_cnt = npoints >> 4;
609
28.7M
  for (i = n_stages - 1; i > 0; i--) {
610
15.2M
    const FLOAT32 *twiddles = ptr_w;
611
15.2M
    FLOAT32 *data = ptr_y;
612
15.2M
    FLOAT32 W1, W2, W3, W4, W5, W6;
613
15.2M
    WORD32 sec_loop_cnt;
614
615
37.5M
    for (k = in_loop_cnt; k != 0; k--) {
616
22.3M
      x0r = (*data);
617
22.3M
      x0i = (*(data + 1));
618
22.3M
      data += ((SIZE_T)del << 1);
619
620
22.3M
      x1r = (*data);
621
22.3M
      x1i = (*(data + 1));
622
22.3M
      data += ((SIZE_T)del << 1);
623
624
22.3M
      x2r = (*data);
625
22.3M
      x2i = (*(data + 1));
626
22.3M
      data += ((SIZE_T)del << 1);
627
628
22.3M
      x3r = (*data);
629
22.3M
      x3i = (*(data + 1));
630
22.3M
      data -= 3 * ((SIZE_T)del << 1);
631
632
22.3M
      x0r = x0r + x2r;
633
22.3M
      x0i = x0i + x2i;
634
22.3M
      x2r = x0r - (x2r * 2);
635
22.3M
      x2i = x0i - (x2i * 2);
636
22.3M
      x1r = x1r + x3r;
637
22.3M
      x1i = x1i + x3i;
638
22.3M
      x3r = x1r - (x3r * 2);
639
22.3M
      x3i = x1i - (x3i * 2);
640
641
22.3M
      x0r = x0r + x1r;
642
22.3M
      x0i = x0i + x1i;
643
22.3M
      x1r = x0r - (x1r * 2);
644
22.3M
      x1i = x0i - (x1i * 2);
645
22.3M
      x2r = x2r - x3i;
646
22.3M
      x2i = x2i + x3r;
647
22.3M
      x3i = x2r + (x3i * 2);
648
22.3M
      x3r = x2i - (x3r * 2);
649
650
22.3M
      *data = x0r;
651
22.3M
      *(data + 1) = x0i;
652
22.3M
      data += ((SIZE_T)del << 1);
653
654
22.3M
      *data = x2r;
655
22.3M
      *(data + 1) = x2i;
656
22.3M
      data += ((SIZE_T)del << 1);
657
658
22.3M
      *data = x1r;
659
22.3M
      *(data + 1) = x1i;
660
22.3M
      data += ((SIZE_T)del << 1);
661
662
22.3M
      *data = x3i;
663
22.3M
      *(data + 1) = x3r;
664
22.3M
      data += ((SIZE_T)del << 1);
665
22.3M
    }
666
15.2M
    data = ptr_y + 2;
667
668
15.2M
    sec_loop_cnt = (nodespacing * del);
669
15.2M
    sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) - (sec_loop_cnt / 16) +
670
15.2M
                   (sec_loop_cnt / 32) - (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
671
15.2M
                   (sec_loop_cnt / 256);
672
673
37.5M
    for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
674
22.2M
      W1 = *(twiddles + j);
675
22.2M
      W4 = *(twiddles + j + 257);
676
22.2M
      W2 = *(twiddles + ((SIZE_T)j << 1));
677
22.2M
      W5 = *(twiddles + ((SIZE_T)j << 1) + 257);
678
22.2M
      W3 = *(twiddles + j + ((SIZE_T)j << 1));
679
22.2M
      W6 = *(twiddles + j + ((SIZE_T)j << 1) + 257);
680
681
51.5M
      for (k = in_loop_cnt; k != 0; k--) {
682
29.3M
        FLOAT32 tmp;
683
29.3M
        FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
684
685
29.3M
        data += ((SIZE_T)del << 1);
686
687
29.3M
        x1r = *data;
688
29.3M
        x1i = *(data + 1);
689
29.3M
        data += ((SIZE_T)del << 1);
690
691
29.3M
        x2r = *data;
692
29.3M
        x2i = *(data + 1);
693
29.3M
        data += ((SIZE_T)del << 1);
694
695
29.3M
        x3r = *data;
696
29.3M
        x3i = *(data + 1);
697
29.3M
        data -= 3 * ((SIZE_T)del << 1);
698
699
29.3M
        tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
700
29.3M
        x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
701
29.3M
        x1r = tmp;
702
703
29.3M
        tmp = (FLOAT32)(((FLOAT32)x2r * W2) + ((FLOAT32)x2i * W5));
704
29.3M
        x2i = (FLOAT32)(-((FLOAT32)x2r * W5) + (FLOAT32)x2i * W2);
705
29.3M
        x2r = tmp;
706
707
29.3M
        tmp = (FLOAT32)(((FLOAT32)x3r * W3) + ((FLOAT32)x3i * W6));
708
29.3M
        x3i = (FLOAT32)(-((FLOAT32)x3r * W6) + (FLOAT32)x3i * W3);
709
29.3M
        x3r = tmp;
710
711
29.3M
        x0r = (*data);
712
29.3M
        x0i = (*(data + 1));
713
714
29.3M
        x0r = x0r + (x2r);
715
29.3M
        x0i = x0i + (x2i);
716
29.3M
        x2r = x0r - (x2r * 2);
717
29.3M
        x2i = x0i - (x2i * 2);
718
29.3M
        x1r = x1r + x3r;
719
29.3M
        x1i = x1i + x3i;
720
29.3M
        x3r = x1r - (x3r * 2);
721
29.3M
        x3i = x1i - (x3i * 2);
722
723
29.3M
        x0r = x0r + (x1r);
724
29.3M
        x0i = x0i + (x1i);
725
29.3M
        x1r = x0r - (x1r * 2);
726
29.3M
        x1i = x0i - (x1i * 2);
727
29.3M
        x2r = x2r - (x3i);
728
29.3M
        x2i = x2i + (x3r);
729
29.3M
        x3i = x2r + (x3i * 2);
730
29.3M
        x3r = x2i - (x3r * 2);
731
732
29.3M
        *data = x0r;
733
29.3M
        *(data + 1) = x0i;
734
29.3M
        data += ((SIZE_T)del << 1);
735
736
29.3M
        *data = x2r;
737
29.3M
        *(data + 1) = x2i;
738
29.3M
        data += ((SIZE_T)del << 1);
739
740
29.3M
        *data = x1r;
741
29.3M
        *(data + 1) = x1i;
742
29.3M
        data += ((SIZE_T)del << 1);
743
744
29.3M
        *data = x3i;
745
29.3M
        *(data + 1) = x3r;
746
29.3M
        data += ((SIZE_T)del << 1);
747
29.3M
      }
748
22.2M
      data -= 2 * npoints;
749
22.2M
      data += 2;
750
22.2M
    }
751
34.0M
    for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
752
18.7M
      W1 = *(twiddles + j);
753
18.7M
      W4 = *(twiddles + j + 257);
754
18.7M
      W2 = *(twiddles + ((SIZE_T)j << 1));
755
18.7M
      W5 = *(twiddles + ((SIZE_T)j << 1) + 257);
756
18.7M
      W3 = *(twiddles + j + ((SIZE_T)j << 1) - 256);
757
18.7M
      W6 = *(twiddles + j + ((SIZE_T)j << 1) + 1);
758
759
44.5M
      for (k = in_loop_cnt; k != 0; k--) {
760
25.8M
        FLOAT32 tmp;
761
25.8M
        FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
762
763
25.8M
        data += ((SIZE_T)del << 1);
764
765
25.8M
        x1r = *data;
766
25.8M
        x1i = *(data + 1);
767
25.8M
        data += ((SIZE_T)del << 1);
768
769
25.8M
        x2r = *data;
770
25.8M
        x2i = *(data + 1);
771
25.8M
        data += ((SIZE_T)del << 1);
772
773
25.8M
        x3r = *data;
774
25.8M
        x3i = *(data + 1);
775
25.8M
        data -= 3 * ((SIZE_T)del << 1);
776
777
25.8M
        tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
778
25.8M
        x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
779
25.8M
        x1r = tmp;
780
781
25.8M
        tmp = (FLOAT32)(((FLOAT32)x2r * W2) + ((FLOAT32)x2i * W5));
782
25.8M
        x2i = (FLOAT32)(-((FLOAT32)x2r * W5) + (FLOAT32)x2i * W2);
783
25.8M
        x2r = tmp;
784
785
25.8M
        tmp = (FLOAT32)(((FLOAT32)x3r * W6) - ((FLOAT32)x3i * W3));
786
25.8M
        x3i = (FLOAT32)(((FLOAT32)x3r * W3) + ((FLOAT32)x3i * W6));
787
25.8M
        x3r = tmp;
788
789
25.8M
        x0r = (*data);
790
25.8M
        x0i = (*(data + 1));
791
792
25.8M
        x0r = x0r + (x2r);
793
25.8M
        x0i = x0i + (x2i);
794
25.8M
        x2r = x0r - (x2r * 2);
795
25.8M
        x2i = x0i - (x2i * 2);
796
25.8M
        x1r = x1r + x3r;
797
25.8M
        x1i = x1i + x3i;
798
25.8M
        x3r = x1r - (x3r * 2);
799
25.8M
        x3i = x1i - (x3i * 2);
800
801
25.8M
        x0r = x0r + (x1r);
802
25.8M
        x0i = x0i + (x1i);
803
25.8M
        x1r = x0r - (x1r * 2);
804
25.8M
        x1i = x0i - (x1i * 2);
805
25.8M
        x2r = x2r - (x3i);
806
25.8M
        x2i = x2i + (x3r);
807
25.8M
        x3i = x2r + (x3i * 2);
808
25.8M
        x3r = x2i - (x3r * 2);
809
810
25.8M
        *data = x0r;
811
25.8M
        *(data + 1) = x0i;
812
25.8M
        data += ((SIZE_T)del << 1);
813
814
25.8M
        *data = x2r;
815
25.8M
        *(data + 1) = x2i;
816
25.8M
        data += ((SIZE_T)del << 1);
817
818
25.8M
        *data = x1r;
819
25.8M
        *(data + 1) = x1i;
820
25.8M
        data += ((SIZE_T)del << 1);
821
822
25.8M
        *data = x3i;
823
25.8M
        *(data + 1) = x3r;
824
25.8M
        data += ((SIZE_T)del << 1);
825
25.8M
      }
826
18.7M
      data -= 2 * npoints;
827
18.7M
      data += 2;
828
18.7M
    }
829
18.7M
    for (; j <= sec_loop_cnt * 2; j += nodespacing) {
830
3.49M
      W1 = *(twiddles + j);
831
3.49M
      W4 = *(twiddles + j + 257);
832
3.49M
      W2 = *(twiddles + ((SIZE_T)j << 1) - 256);
833
3.49M
      W5 = *(twiddles + ((SIZE_T)j << 1) + 1);
834
3.49M
      W3 = *(twiddles + j + ((SIZE_T)j << 1) - 256);
835
3.49M
      W6 = *(twiddles + j + ((SIZE_T)j << 1) + 1);
836
837
6.98M
      for (k = in_loop_cnt; k != 0; k--) {
838
3.49M
        FLOAT32 tmp;
839
3.49M
        FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
840
841
3.49M
        data += ((SIZE_T)del << 1);
842
843
3.49M
        x1r = *data;
844
3.49M
        x1i = *(data + 1);
845
3.49M
        data += ((SIZE_T)del << 1);
846
847
3.49M
        x2r = *data;
848
3.49M
        x2i = *(data + 1);
849
3.49M
        data += ((SIZE_T)del << 1);
850
851
3.49M
        x3r = *data;
852
3.49M
        x3i = *(data + 1);
853
3.49M
        data -= 3 * ((SIZE_T)del << 1);
854
855
3.49M
        tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
856
3.49M
        x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
857
3.49M
        x1r = tmp;
858
859
3.49M
        tmp = (FLOAT32)(((FLOAT32)x2r * W5) - ((FLOAT32)x2i * W2));
860
3.49M
        x2i = (FLOAT32)(((FLOAT32)x2r * W2) + ((FLOAT32)x2i * W5));
861
3.49M
        x2r = tmp;
862
863
3.49M
        tmp = (FLOAT32)(((FLOAT32)x3r * W6) - ((FLOAT32)x3i * W3));
864
3.49M
        x3i = (FLOAT32)(((FLOAT32)x3r * W3) + ((FLOAT32)x3i * W6));
865
3.49M
        x3r = tmp;
866
867
3.49M
        x0r = (*data);
868
3.49M
        x0i = (*(data + 1));
869
870
3.49M
        x0r = x0r + (x2r);
871
3.49M
        x0i = x0i + (x2i);
872
3.49M
        x2r = x0r - (x2r * 2);
873
3.49M
        x2i = x0i - (x2i * 2);
874
3.49M
        x1r = x1r + x3r;
875
3.49M
        x1i = x1i + x3i;
876
3.49M
        x3r = x1r - (x3r * 2);
877
3.49M
        x3i = x1i - (x3i * 2);
878
879
3.49M
        x0r = x0r + (x1r);
880
3.49M
        x0i = x0i + (x1i);
881
3.49M
        x1r = x0r - (x1r * 2);
882
3.49M
        x1i = x0i - (x1i * 2);
883
3.49M
        x2r = x2r - (x3i);
884
3.49M
        x2i = x2i + (x3r);
885
3.49M
        x3i = x2r + (x3i * 2);
886
3.49M
        x3r = x2i - (x3r * 2);
887
888
3.49M
        *data = x0r;
889
3.49M
        *(data + 1) = x0i;
890
3.49M
        data += ((SIZE_T)del << 1);
891
892
3.49M
        *data = x2r;
893
3.49M
        *(data + 1) = x2i;
894
3.49M
        data += ((SIZE_T)del << 1);
895
896
3.49M
        *data = x1r;
897
3.49M
        *(data + 1) = x1i;
898
3.49M
        data += ((SIZE_T)del << 1);
899
900
3.49M
        *data = x3i;
901
3.49M
        *(data + 1) = x3r;
902
3.49M
        data += ((SIZE_T)del << 1);
903
3.49M
      }
904
3.49M
      data -= 2 * npoints;
905
3.49M
      data += 2;
906
3.49M
    }
907
37.5M
    for (; j < nodespacing * del; j += nodespacing) {
908
22.2M
      W1 = *(twiddles + j);
909
22.2M
      W4 = *(twiddles + j + 257);
910
22.2M
      W2 = *(twiddles + ((SIZE_T)j << 1) - 256);
911
22.2M
      W5 = *(twiddles + ((SIZE_T)j << 1) + 1);
912
22.2M
      W3 = *(twiddles + j + ((SIZE_T)j << 1) - 512);
913
22.2M
      W6 = *(twiddles + j + ((SIZE_T)j << 1) - 512 + 257);
914
915
51.5M
      for (k = in_loop_cnt; k != 0; k--) {
916
29.3M
        FLOAT32 tmp;
917
29.3M
        FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
918
919
29.3M
        data += ((SIZE_T)del << 1);
920
921
29.3M
        x1r = *data;
922
29.3M
        x1i = *(data + 1);
923
29.3M
        data += ((SIZE_T)del << 1);
924
925
29.3M
        x2r = *data;
926
29.3M
        x2i = *(data + 1);
927
29.3M
        data += ((SIZE_T)del << 1);
928
929
29.3M
        x3r = *data;
930
29.3M
        x3i = *(data + 1);
931
29.3M
        data -= 3 * ((SIZE_T)del << 1);
932
933
29.3M
        tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
934
29.3M
        x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
935
29.3M
        x1r = tmp;
936
937
29.3M
        tmp = (FLOAT32)(((FLOAT32)x2r * W5) - ((FLOAT32)x2i * W2));
938
29.3M
        x2i = (FLOAT32)(((FLOAT32)x2r * W2) + ((FLOAT32)x2i * W5));
939
29.3M
        x2r = tmp;
940
941
29.3M
        tmp = (FLOAT32)(-((FLOAT32)x3r * W3) - ((FLOAT32)x3i * W6));
942
29.3M
        x3i = (FLOAT32)(-((FLOAT32)x3r * W6) + (FLOAT32)x3i * W3);
943
29.3M
        x3r = tmp;
944
945
29.3M
        x0r = (*data);
946
29.3M
        x0i = (*(data + 1));
947
948
29.3M
        x0r = x0r + (x2r);
949
29.3M
        x0i = x0i + (x2i);
950
29.3M
        x2r = x0r - (x2r * 2);
951
29.3M
        x2i = x0i - (x2i * 2);
952
29.3M
        x1r = x1r + x3r;
953
29.3M
        x1i = x1i - x3i;
954
29.3M
        x3r = x1r - (x3r * 2);
955
29.3M
        x3i = x1i + (x3i * 2);
956
957
29.3M
        x0r = x0r + (x1r);
958
29.3M
        x0i = x0i + (x1i);
959
29.3M
        x1r = x0r - (x1r * 2);
960
29.3M
        x1i = x0i - (x1i * 2);
961
29.3M
        x2r = x2r - (x3i);
962
29.3M
        x2i = x2i + (x3r);
963
29.3M
        x3i = x2r + (x3i * 2);
964
29.3M
        x3r = x2i - (x3r * 2);
965
966
29.3M
        *data = x0r;
967
29.3M
        *(data + 1) = x0i;
968
29.3M
        data += ((SIZE_T)del << 1);
969
970
29.3M
        *data = x2r;
971
29.3M
        *(data + 1) = x2i;
972
29.3M
        data += ((SIZE_T)del << 1);
973
974
29.3M
        *data = x1r;
975
29.3M
        *(data + 1) = x1i;
976
29.3M
        data += ((SIZE_T)del << 1);
977
978
29.3M
        *data = x3i;
979
29.3M
        *(data + 1) = x3r;
980
29.3M
        data += ((SIZE_T)del << 1);
981
29.3M
      }
982
22.2M
      data -= 2 * npoints;
983
22.2M
      data += 2;
984
22.2M
    }
985
15.2M
    nodespacing >>= 2;
986
15.2M
    del <<= 2;
987
15.2M
    in_loop_cnt >>= 2;
988
15.2M
  }
989
990
13.5M
  if (not_power_4) {
991
1.83M
    const FLOAT32 *twiddles = ptr_w;
992
1.83M
    nodespacing <<= 1;
993
994
16.5M
    for (j = del / 2; j != 0; j--) {
995
14.6M
      FLOAT32 W1 = *twiddles;
996
14.6M
      FLOAT32 W4 = *(twiddles + 257);
997
14.6M
      FLOAT32 tmp;
998
14.6M
      twiddles += nodespacing;
999
1000
14.6M
      x0r = *ptr_y;
1001
14.6M
      x0i = *(ptr_y + 1);
1002
14.6M
      ptr_y += ((SIZE_T)del << 1);
1003
1004
14.6M
      x1r = *ptr_y;
1005
14.6M
      x1i = *(ptr_y + 1);
1006
1007
14.6M
      tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
1008
14.6M
      x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
1009
14.6M
      x1r = tmp;
1010
1011
14.6M
      *ptr_y = (x0r) - (x1r);
1012
14.6M
      *(ptr_y + 1) = (x0i) - (x1i);
1013
14.6M
      ptr_y -= ((SIZE_T)del << 1);
1014
1015
14.6M
      *ptr_y = (x0r) + (x1r);
1016
14.6M
      *(ptr_y + 1) = (x0i) + (x1i);
1017
14.6M
      ptr_y += 2;
1018
14.6M
    }
1019
1.83M
    twiddles = ptr_w;
1020
16.5M
    for (j = del / 2; j != 0; j--) {
1021
14.6M
      FLOAT32 W1 = *twiddles;
1022
14.6M
      FLOAT32 W4 = *(twiddles + 257);
1023
14.6M
      FLOAT32 tmp;
1024
14.6M
      twiddles += nodespacing;
1025
1026
14.6M
      x0r = *ptr_y;
1027
14.6M
      x0i = *(ptr_y + 1);
1028
14.6M
      ptr_y += ((SIZE_T)del << 1);
1029
1030
14.6M
      x1r = *ptr_y;
1031
14.6M
      x1i = *(ptr_y + 1);
1032
1033
14.6M
      tmp = (FLOAT32)(((FLOAT32)x1r * W4) - ((FLOAT32)x1i * W1));
1034
14.6M
      x1i = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
1035
14.6M
      x1r = tmp;
1036
1037
14.6M
      *ptr_y = (x0r) - (x1r);
1038
14.6M
      *(ptr_y + 1) = (x0i) - (x1i);
1039
14.6M
      ptr_y -= ((SIZE_T)del << 1);
1040
1041
14.6M
      *ptr_y = (x0r) + (x1r);
1042
14.6M
      *(ptr_y + 1) = (x0i) + (x1i);
1043
14.6M
      ptr_y += 2;
1044
14.6M
    }
1045
1.83M
  }
1046
13.5M
}
1047
1048
109M
static PLATFORM_INLINE void ixheaac_aac_ld_dec_fft_3_float(FLOAT32 *inp, FLOAT32 *op) {
1049
109M
  FLOAT32 add_r, sub_r;
1050
109M
  FLOAT32 add_i, sub_i;
1051
109M
  FLOAT32 temp_real, temp_imag, temp;
1052
1053
109M
  FLOAT32 p1, p2, p3, p4;
1054
1055
109M
  FLOAT32 sinmu;
1056
109M
  sinmu = -0.866025403784439f;
1057
1058
109M
  temp_real = inp[0] + inp[2];
1059
109M
  temp_imag = inp[1] + inp[3];
1060
1061
109M
  add_r = inp[2] + inp[4];
1062
109M
  add_i = inp[3] + inp[5];
1063
1064
109M
  sub_r = inp[2] - inp[4];
1065
109M
  sub_i = inp[3] - inp[5];
1066
1067
109M
  p1 = add_r / 2.0f;
1068
109M
  p4 = add_i / 2.0f;
1069
109M
  p2 = sub_i * sinmu;
1070
109M
  p3 = sub_r * sinmu;
1071
1072
109M
  temp = inp[0] - p1;
1073
1074
109M
  op[0] = temp_real + inp[4];
1075
109M
  op[1] = temp_imag + inp[5];
1076
109M
  op[2] = temp + p2;
1077
109M
  op[3] = (inp[1] - p3) - p4;
1078
109M
  op[4] = temp - p2;
1079
109M
  op[5] = (inp[1] + p3) - p4;
1080
1081
109M
  return;
1082
109M
}
1083
1084
7.05M
void ixheaac_real_synth_fft_p3(FLOAT32 *x_in, FLOAT32 *x_out, WORD32 npoints) {
1085
7.05M
  WORD32 i, j;
1086
7.05M
  FLOAT32 x_3[8];
1087
7.05M
  FLOAT32 y_3[16];
1088
7.05M
  FLOAT32 y[48];
1089
7.05M
  FLOAT32 x[48];
1090
7.05M
  FLOAT32 *ptr_y = y;
1091
7.05M
  FLOAT32 *y_p3 = y;
1092
7.05M
  FLOAT32 *x_p3 = x;
1093
1094
28.2M
  for (i = 0; i < 3; i += 1) {
1095
190M
    for (j = 0; j < (npoints / 3); j++) {
1096
169M
      x_3[j] = x_in[3 * j + i];
1097
169M
    }
1098
1099
21.1M
    ixheaac_real_synth_fft_p2(x_3, y_3, 8);
1100
1101
190M
    for (j = 0; j < 16; j += 2) {
1102
169M
      x[3 * j + 2 * i] = y_3[j];
1103
169M
      x[3 * j + 2 * i + 1] = y_3[j + 1];
1104
169M
    }
1105
21.1M
  }
1106
1107
7.05M
  {
1108
7.05M
    FLOAT32 *wr;
1109
7.05M
    FLOAT32 tmp;
1110
7.05M
    FLOAT32 *x_tw = x;
1111
7.05M
    wr = (FLOAT32 *)ixheaac_twidle_tbl_24;
1112
7.05M
    x_tw += 2;
1113
1114
63.5M
    for (i = 0; i < (npoints / 3); i++) {
1115
56.4M
      tmp = ((*x_tw) * (*wr) + (*(x_tw + 1)) * (*(wr + 1)));
1116
56.4M
      *(x_tw + 1) = (-(*x_tw) * (*(wr + 1)) + (*(x_tw + 1)) * (*wr));
1117
56.4M
      *x_tw = tmp;
1118
1119
56.4M
      wr += 2;
1120
56.4M
      x_tw += 2;
1121
1122
56.4M
      tmp = ((*x_tw) * (*wr) + (*(x_tw + 1)) * (*(wr + 1)));
1123
56.4M
      *(x_tw + 1) = (-(*x_tw) * (*(wr + 1)) + (*(x_tw + 1)) * (*wr));
1124
56.4M
      *x_tw = tmp;
1125
1126
56.4M
      wr += 2;
1127
56.4M
      x_tw += 4;
1128
56.4M
    }
1129
7.05M
  }
1130
1131
63.5M
  for (i = 0; i < (npoints / 3); i++) {
1132
56.4M
    ixheaac_aac_ld_dec_fft_3_float(x_p3, y_p3);
1133
1134
56.4M
    x_p3 = x_p3 + 6;
1135
56.4M
    y_p3 = y_p3 + 6;
1136
56.4M
  }
1137
1138
63.5M
  for (i = 0; i < 16; i += 2) {
1139
56.4M
    x_out[i] = *ptr_y++;
1140
56.4M
    x_out[i + 1] = *ptr_y++;
1141
56.4M
    x_out[16 + i] = *ptr_y++;
1142
56.4M
    x_out[16 + i + 1] = *ptr_y++;
1143
56.4M
    x_out[32 + i] = *ptr_y++;
1144
56.4M
    x_out[32 + i + 1] = *ptr_y++;
1145
56.4M
  }
1146
7.05M
}
1147
1148
3.28M
void ixheaac_cmplx_anal_fft_p3(FLOAT32 *x_in, FLOAT32 *x_out, WORD32 npoints) {
1149
3.28M
  WORD32 i, j;
1150
3.28M
  FLOAT32 x_3[32];
1151
3.28M
  FLOAT32 y_3[32];
1152
3.28M
  FLOAT32 y[96];
1153
3.28M
  FLOAT32 *ptr_x = x_in;
1154
3.28M
  FLOAT32 *ptr_y = y;
1155
3.28M
  FLOAT32 *y_p3 = y;
1156
1157
13.1M
  for (i = 0; i < 6; i += 2) {
1158
167M
    for (j = 0; j < 32; j += 2) {
1159
157M
      x_3[j] = x_in[3 * j + i];
1160
157M
      x_3[j + 1] = x_in[3 * j + i + 1];
1161
157M
    }
1162
1163
9.86M
    ixheaac_cmplx_anal_fft_p2(x_3, y_3, 16);
1164
1165
167M
    for (j = 0; j < 32; j += 2) {
1166
157M
      x_in[3 * j + i] = y_3[j];
1167
157M
      x_in[3 * j + i + 1] = y_3[j + 1];
1168
157M
    }
1169
9.86M
  }
1170
1171
3.28M
  {
1172
3.28M
    FLOAT32 *wr;
1173
3.28M
    FLOAT32 tmp;
1174
3.28M
    wr = (FLOAT32 *)ixheaac_twidle_tbl_48;
1175
3.28M
    x_in += 2;
1176
1177
55.8M
    for (i = 0; i < (npoints / 3); i++) {
1178
52.6M
      tmp = ((*x_in) * (*wr) + (*(x_in + 1)) * (*(wr + 1)));
1179
52.6M
      *(x_in + 1) = (-(*x_in) * (*(wr + 1)) + (*(x_in + 1)) * (*wr));
1180
52.6M
      *x_in = tmp;
1181
1182
52.6M
      wr += 2;
1183
52.6M
      x_in += 2;
1184
1185
52.6M
      tmp = ((*x_in) * (*wr) + (*(x_in + 1)) * (*(wr + 1)));
1186
52.6M
      *(x_in + 1) = (-(*x_in) * (*(wr + 1)) + (*(x_in + 1)) * (*wr));
1187
52.6M
      *x_in = tmp;
1188
1189
52.6M
      wr += 2;
1190
52.6M
      x_in += 4;
1191
52.6M
    }
1192
3.28M
  }
1193
1194
55.8M
  for (i = 0; i < (npoints / 3); i++) {
1195
52.6M
    ixheaac_aac_ld_dec_fft_3_float(ptr_x, ptr_y);
1196
1197
52.6M
    ptr_x = ptr_x + 6;
1198
52.6M
    ptr_y = ptr_y + 6;
1199
52.6M
  }
1200
1201
55.8M
  for (i = 0; i < 32; i += 2) {
1202
52.6M
    x_out[i] = *y_p3++;
1203
52.6M
    x_out[i + 1] = *y_p3++;
1204
52.6M
    x_out[32 + i] = *y_p3++;
1205
52.6M
    x_out[32 + i + 1] = *y_p3++;
1206
52.6M
    x_out[64 + i] = *y_p3++;
1207
52.6M
    x_out[64 + i + 1] = *y_p3++;
1208
52.6M
  }
1209
3.28M
}