Coverage Report

Created: 2026-07-10 07:01

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/proc/self/cwd/libfaad/mdct.c
Line
Count
Source
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
20.5k
{
64
20.5k
    mdct_info *mdct = (mdct_info*)faad_malloc(sizeof(mdct_info));
65
66
20.5k
    assert(N % 8 == 0);
67
68
20.5k
    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
20.5k
    switch (N)
77
20.5k
    {
78
7.54k
    case 2048: mdct->sincos = (complex_t*)mdct_tab_2048; break;
79
7.54k
    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.73k
    case 1920: mdct->sincos = (complex_t*)mdct_tab_1920; break;
85
2.73k
    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
20.5k
#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
20.5k
    }
95
96
    /* initialise fft */
97
20.5k
    mdct->cfft = cffti(N/4);
98
99
#ifdef PROFILE
100
    mdct->cycles = 0;
101
    mdct->fft_cycles = 0;
102
#endif
103
104
20.5k
    return mdct;
105
20.5k
}
106
107
void faad_mdct_end(mdct_info *mdct)
108
66.4k
{
109
66.4k
    if (mdct != NULL)
110
66.4k
    {
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
66.4k
        cfftu(mdct->cfft);
117
118
66.4k
        faad_free(mdct);
119
66.4k
    }
120
66.4k
}
121
122
void faad_imdct(mdct_info *mdct, real_t *X_in, real_t *X_out)
123
1.13M
{
124
1.13M
    uint16_t k;
125
126
1.13M
    complex_t x;
127
1.13M
#ifdef ALLOW_SMALL_FRAMELENGTH
128
#ifdef FIXED_POINT
129
    real_t scale = 0, b_scale = 0;
130
#endif
131
1.13M
#endif
132
1.13M
    ALIGN complex_t Z1[512];
133
1.13M
    complex_t *sincos = mdct->sincos;
134
135
1.13M
    uint16_t N  = mdct->N;
136
1.13M
    uint16_t N2 = N >> 1;
137
1.13M
    uint16_t N4 = N >> 2;
138
1.13M
    uint16_t N8 = N >> 3;
139
140
#ifdef PROFILE
141
    int64_t count1, count2 = faad_get_ts();
142
#endif
143
144
1.13M
#ifdef ALLOW_SMALL_FRAMELENGTH
145
#ifdef FIXED_POINT
146
    /* detect non-power of 2 */
147
420k
    if (N & (N-1))
148
70.2k
    {
149
        /* adjust scale for non-power of 2 MDCT */
150
        /* 2048/1920 */
151
70.2k
        b_scale = 1;
152
70.2k
        scale = COEF_CONST(1.0666666666666667);
153
70.2k
    }
154
#endif
155
1.13M
#endif
156
157
    /* pre-IFFT complex multiplication */
158
328M
    for (k = 0; k < N4; k++)
159
327M
    {
160
327M
        ComplexMult(&IM(Z1[k]), &RE(Z1[k]),
161
327M
            X_in[2*k], X_in[N2 - 1 - 2*k], RE(sincos[k]), IM(sincos[k]));
162
327M
    }
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.13M
    cfftb(mdct->cfft, Z1);
170
171
#ifdef PROFILE
172
    count1 = faad_get_ts() - count1;
173
#endif
174
175
    /* post-IFFT complex multiplication */
176
328M
    for (k = 0; k < N4; k++)
177
327M
    {
178
327M
        RE(x) = RE(Z1[k]);
179
327M
        IM(x) = IM(Z1[k]);
180
327M
        ComplexMult(&IM(Z1[k]), &RE(Z1[k]),
181
327M
            IM(x), RE(x), RE(sincos[k]), IM(sincos[k]));
182
183
327M
#ifdef ALLOW_SMALL_FRAMELENGTH
184
#ifdef FIXED_POINT
185
        /* non-power of 2 MDCT scaling */
186
117M
        if (b_scale)
187
18.1M
        {
188
18.1M
            RE(Z1[k]) = MUL_C(RE(Z1[k]), scale);
189
18.1M
            IM(Z1[k]) = MUL_C(IM(Z1[k]), scale);
190
18.1M
        }
191
#endif
192
327M
#endif
193
327M
    }
194
195
    /* reordering */
196
82.9M
    for (k = 0; k < N8; k+=2)
197
81.8M
    {
198
81.8M
        X_out[              2*k] =  IM(Z1[N8 +     k]);
199
81.8M
        X_out[          2 + 2*k] =  IM(Z1[N8 + 1 + k]);
200
201
81.8M
        X_out[          1 + 2*k] = -RE(Z1[N8 - 1 - k]);
202
81.8M
        X_out[          3 + 2*k] = -RE(Z1[N8 - 2 - k]);
203
204
81.8M
        X_out[N4 +          2*k] =  RE(Z1[         k]);
205
81.8M
        X_out[N4 +    + 2 + 2*k] =  RE(Z1[     1 + k]);
206
207
81.8M
        X_out[N4 +      1 + 2*k] = -IM(Z1[N4 - 1 - k]);
208
81.8M
        X_out[N4 +      3 + 2*k] = -IM(Z1[N4 - 2 - k]);
209
210
81.8M
        X_out[N2 +          2*k] =  RE(Z1[N8 +     k]);
211
81.8M
        X_out[N2 +    + 2 + 2*k] =  RE(Z1[N8 + 1 + k]);
212
213
81.8M
        X_out[N2 +      1 + 2*k] = -IM(Z1[N8 - 1 - k]);
214
81.8M
        X_out[N2 +      3 + 2*k] = -IM(Z1[N8 - 2 - k]);
215
216
81.8M
        X_out[N2 + N4 +     2*k] = -IM(Z1[         k]);
217
81.8M
        X_out[N2 + N4 + 2 + 2*k] = -IM(Z1[     1 + k]);
218
219
81.8M
        X_out[N2 + N4 + 1 + 2*k] =  RE(Z1[N4 - 1 - k]);
220
81.8M
        X_out[N2 + N4 + 3 + 2*k] =  RE(Z1[N4 - 2 - k]);
221
81.8M
    }
222
223
#ifdef PROFILE
224
    count2 = faad_get_ts() - count2;
225
    mdct->fft_cycles += count1;
226
    mdct->cycles += (count2 - count1);
227
#endif
228
1.13M
}
faad_imdct
Line
Count
Source
123
420k
{
124
420k
    uint16_t k;
125
126
420k
    complex_t x;
127
420k
#ifdef ALLOW_SMALL_FRAMELENGTH
128
420k
#ifdef FIXED_POINT
129
420k
    real_t scale = 0, b_scale = 0;
130
420k
#endif
131
420k
#endif
132
420k
    ALIGN complex_t Z1[512];
133
420k
    complex_t *sincos = mdct->sincos;
134
135
420k
    uint16_t N  = mdct->N;
136
420k
    uint16_t N2 = N >> 1;
137
420k
    uint16_t N4 = N >> 2;
138
420k
    uint16_t N8 = N >> 3;
139
140
#ifdef PROFILE
141
    int64_t count1, count2 = faad_get_ts();
142
#endif
143
144
420k
#ifdef ALLOW_SMALL_FRAMELENGTH
145
420k
#ifdef FIXED_POINT
146
    /* detect non-power of 2 */
147
420k
    if (N & (N-1))
148
70.2k
    {
149
        /* adjust scale for non-power of 2 MDCT */
150
        /* 2048/1920 */
151
70.2k
        b_scale = 1;
152
70.2k
        scale = COEF_CONST(1.0666666666666667);
153
70.2k
    }
154
420k
#endif
155
420k
#endif
156
157
    /* pre-IFFT complex multiplication */
158
118M
    for (k = 0; k < N4; k++)
159
117M
    {
160
117M
        ComplexMult(&IM(Z1[k]), &RE(Z1[k]),
161
117M
            X_in[2*k], X_in[N2 - 1 - 2*k], RE(sincos[k]), IM(sincos[k]));
162
117M
    }
163
164
#ifdef PROFILE
165
    count1 = faad_get_ts();
166
#endif
167
168
    /* complex IFFT, any non-scaling FFT can be used here */
169
420k
    cfftb(mdct->cfft, Z1);
170
171
#ifdef PROFILE
172
    count1 = faad_get_ts() - count1;
173
#endif
174
175
    /* post-IFFT complex multiplication */
176
118M
    for (k = 0; k < N4; k++)
177
117M
    {
178
117M
        RE(x) = RE(Z1[k]);
179
117M
        IM(x) = IM(Z1[k]);
180
117M
        ComplexMult(&IM(Z1[k]), &RE(Z1[k]),
181
117M
            IM(x), RE(x), RE(sincos[k]), IM(sincos[k]));
182
183
117M
#ifdef ALLOW_SMALL_FRAMELENGTH
184
117M
#ifdef FIXED_POINT
185
        /* non-power of 2 MDCT scaling */
186
117M
        if (b_scale)
187
18.1M
        {
188
18.1M
            RE(Z1[k]) = MUL_C(RE(Z1[k]), scale);
189
18.1M
            IM(Z1[k]) = MUL_C(IM(Z1[k]), scale);
190
18.1M
        }
191
117M
#endif
192
117M
#endif
193
117M
    }
194
195
    /* reordering */
196
29.8M
    for (k = 0; k < N8; k+=2)
197
29.4M
    {
198
29.4M
        X_out[              2*k] =  IM(Z1[N8 +     k]);
199
29.4M
        X_out[          2 + 2*k] =  IM(Z1[N8 + 1 + k]);
200
201
29.4M
        X_out[          1 + 2*k] = -RE(Z1[N8 - 1 - k]);
202
29.4M
        X_out[          3 + 2*k] = -RE(Z1[N8 - 2 - k]);
203
204
29.4M
        X_out[N4 +          2*k] =  RE(Z1[         k]);
205
29.4M
        X_out[N4 +    + 2 + 2*k] =  RE(Z1[     1 + k]);
206
207
29.4M
        X_out[N4 +      1 + 2*k] = -IM(Z1[N4 - 1 - k]);
208
29.4M
        X_out[N4 +      3 + 2*k] = -IM(Z1[N4 - 2 - k]);
209
210
29.4M
        X_out[N2 +          2*k] =  RE(Z1[N8 +     k]);
211
29.4M
        X_out[N2 +    + 2 + 2*k] =  RE(Z1[N8 + 1 + k]);
212
213
29.4M
        X_out[N2 +      1 + 2*k] = -IM(Z1[N8 - 1 - k]);
214
29.4M
        X_out[N2 +      3 + 2*k] = -IM(Z1[N8 - 2 - k]);
215
216
29.4M
        X_out[N2 + N4 +     2*k] = -IM(Z1[         k]);
217
29.4M
        X_out[N2 + N4 + 2 + 2*k] = -IM(Z1[     1 + k]);
218
219
29.4M
        X_out[N2 + N4 + 1 + 2*k] =  RE(Z1[N4 - 1 - k]);
220
29.4M
        X_out[N2 + N4 + 3 + 2*k] =  RE(Z1[N4 - 2 - k]);
221
29.4M
    }
222
223
#ifdef PROFILE
224
    count2 = faad_get_ts() - count2;
225
    mdct->fft_cycles += count1;
226
    mdct->cycles += (count2 - count1);
227
#endif
228
420k
}
faad_imdct
Line
Count
Source
123
716k
{
124
716k
    uint16_t k;
125
126
716k
    complex_t x;
127
716k
#ifdef ALLOW_SMALL_FRAMELENGTH
128
#ifdef FIXED_POINT
129
    real_t scale = 0, b_scale = 0;
130
#endif
131
716k
#endif
132
716k
    ALIGN complex_t Z1[512];
133
716k
    complex_t *sincos = mdct->sincos;
134
135
716k
    uint16_t N  = mdct->N;
136
716k
    uint16_t N2 = N >> 1;
137
716k
    uint16_t N4 = N >> 2;
138
716k
    uint16_t N8 = N >> 3;
139
140
#ifdef PROFILE
141
    int64_t count1, count2 = faad_get_ts();
142
#endif
143
144
716k
#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
716k
#endif
156
157
    /* pre-IFFT complex multiplication */
158
210M
    for (k = 0; k < N4; k++)
159
209M
    {
160
209M
        ComplexMult(&IM(Z1[k]), &RE(Z1[k]),
161
209M
            X_in[2*k], X_in[N2 - 1 - 2*k], RE(sincos[k]), IM(sincos[k]));
162
209M
    }
163
164
#ifdef PROFILE
165
    count1 = faad_get_ts();
166
#endif
167
168
    /* complex IFFT, any non-scaling FFT can be used here */
169
716k
    cfftb(mdct->cfft, Z1);
170
171
#ifdef PROFILE
172
    count1 = faad_get_ts() - count1;
173
#endif
174
175
    /* post-IFFT complex multiplication */
176
210M
    for (k = 0; k < N4; k++)
177
209M
    {
178
209M
        RE(x) = RE(Z1[k]);
179
209M
        IM(x) = IM(Z1[k]);
180
209M
        ComplexMult(&IM(Z1[k]), &RE(Z1[k]),
181
209M
            IM(x), RE(x), RE(sincos[k]), IM(sincos[k]));
182
183
209M
#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
209M
#endif
193
209M
    }
194
195
    /* reordering */
196
53.1M
    for (k = 0; k < N8; k+=2)
197
52.4M
    {
198
52.4M
        X_out[              2*k] =  IM(Z1[N8 +     k]);
199
52.4M
        X_out[          2 + 2*k] =  IM(Z1[N8 + 1 + k]);
200
201
52.4M
        X_out[          1 + 2*k] = -RE(Z1[N8 - 1 - k]);
202
52.4M
        X_out[          3 + 2*k] = -RE(Z1[N8 - 2 - k]);
203
204
52.4M
        X_out[N4 +          2*k] =  RE(Z1[         k]);
205
52.4M
        X_out[N4 +    + 2 + 2*k] =  RE(Z1[     1 + k]);
206
207
52.4M
        X_out[N4 +      1 + 2*k] = -IM(Z1[N4 - 1 - k]);
208
52.4M
        X_out[N4 +      3 + 2*k] = -IM(Z1[N4 - 2 - k]);
209
210
52.4M
        X_out[N2 +          2*k] =  RE(Z1[N8 +     k]);
211
52.4M
        X_out[N2 +    + 2 + 2*k] =  RE(Z1[N8 + 1 + k]);
212
213
52.4M
        X_out[N2 +      1 + 2*k] = -IM(Z1[N8 - 1 - k]);
214
52.4M
        X_out[N2 +      3 + 2*k] = -IM(Z1[N8 - 2 - k]);
215
216
52.4M
        X_out[N2 + N4 +     2*k] = -IM(Z1[         k]);
217
52.4M
        X_out[N2 + N4 + 2 + 2*k] = -IM(Z1[     1 + k]);
218
219
52.4M
        X_out[N2 + N4 + 1 + 2*k] =  RE(Z1[N4 - 1 - k]);
220
52.4M
        X_out[N2 + N4 + 3 + 2*k] =  RE(Z1[N4 - 2 - k]);
221
52.4M
    }
222
223
#ifdef PROFILE
224
    count2 = faad_get_ts() - count2;
225
    mdct->fft_cycles += count1;
226
    mdct->cycles += (count2 - count1);
227
#endif
228
716k
}
229
230
#ifdef LTP_DEC
231
void faad_mdct(mdct_info *mdct, real_t *X_in, real_t *X_out)
232
12.1k
{
233
12.1k
    uint16_t k;
234
235
12.1k
    complex_t x;
236
12.1k
    ALIGN complex_t Z1[512];
237
12.1k
    complex_t *sincos = mdct->sincos;
238
239
12.1k
    uint16_t N  = mdct->N;
240
12.1k
    uint16_t N2 = N >> 1;
241
12.1k
    uint16_t N4 = N >> 2;
242
12.1k
    uint16_t N8 = N >> 3;
243
244
#ifndef FIXED_POINT
245
7.22k
  real_t scale = REAL_CONST(N);
246
#else
247
4.97k
  real_t scale = REAL_CONST(4.0/N);
248
#endif
249
250
12.1k
#ifdef ALLOW_SMALL_FRAMELENGTH
251
#ifdef FIXED_POINT
252
    /* detect non-power of 2 */
253
4.97k
    if (N & (N-1))
254
2.66k
    {
255
        /* adjust scale for non-power of 2 MDCT */
256
        /* *= sqrt(2048/1920) */
257
2.66k
        scale = MUL_C(scale, COEF_CONST(1.0327955589886444));
258
2.66k
    }
259
#endif
260
12.1k
#endif
261
262
    /* pre-FFT complex multiplication */
263
2.96M
    for (k = 0; k < N8; k++)
264
2.94M
    {
265
2.94M
        uint16_t n = k << 1;
266
2.94M
        RE(x) = X_in[N - N4 - 1 - n] + X_in[N - N4 +     n];
267
2.94M
        IM(x) = X_in[    N4 +     n] - X_in[    N4 - 1 - n];
268
269
2.94M
        ComplexMult(&RE(Z1[k]), &IM(Z1[k]),
270
2.94M
            RE(x), IM(x), RE(sincos[k]), IM(sincos[k]));
271
272
2.94M
        RE(Z1[k]) = MUL_R(RE(Z1[k]), scale);
273
2.94M
        IM(Z1[k]) = MUL_R(IM(Z1[k]), scale);
274
275
2.94M
        RE(x) =  X_in[N2 - 1 - n] - X_in[        n];
276
2.94M
        IM(x) =  X_in[N2 +     n] + X_in[N - 1 - n];
277
278
2.94M
        ComplexMult(&RE(Z1[k + N8]), &IM(Z1[k + N8]),
279
2.94M
            RE(x), IM(x), RE(sincos[k + N8]), IM(sincos[k + N8]));
280
281
2.94M
        RE(Z1[k + N8]) = MUL_R(RE(Z1[k + N8]), scale);
282
2.94M
        IM(Z1[k + N8]) = MUL_R(IM(Z1[k + N8]), scale);
283
2.94M
    }
284
285
    /* complex FFT, any non-scaling FFT can be used here  */
286
12.1k
    cfftf(mdct->cfft, Z1);
287
288
    /* post-FFT complex multiplication */
289
5.91M
    for (k = 0; k < N4; k++)
290
5.89M
    {
291
5.89M
        uint16_t n = k << 1;
292
5.89M
        ComplexMult(&RE(x), &IM(x),
293
5.89M
            RE(Z1[k]), IM(Z1[k]), RE(sincos[k]), IM(sincos[k]));
294
295
5.89M
        X_out[         n] = -RE(x);
296
5.89M
        X_out[N2 - 1 - n] =  IM(x);
297
5.89M
        X_out[N2 +     n] = -IM(x);
298
5.89M
        X_out[N  - 1 - n] =  RE(x);
299
5.89M
    }
300
12.1k
}
faad_mdct
Line
Count
Source
232
7.22k
{
233
7.22k
    uint16_t k;
234
235
7.22k
    complex_t x;
236
7.22k
    ALIGN complex_t Z1[512];
237
7.22k
    complex_t *sincos = mdct->sincos;
238
239
7.22k
    uint16_t N  = mdct->N;
240
7.22k
    uint16_t N2 = N >> 1;
241
7.22k
    uint16_t N4 = N >> 2;
242
7.22k
    uint16_t N8 = N >> 3;
243
244
7.22k
#ifndef FIXED_POINT
245
7.22k
  real_t scale = REAL_CONST(N);
246
#else
247
  real_t scale = REAL_CONST(4.0/N);
248
#endif
249
250
7.22k
#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
7.22k
#endif
261
262
    /* pre-FFT complex multiplication */
263
1.74M
    for (k = 0; k < N8; k++)
264
1.74M
    {
265
1.74M
        uint16_t n = k << 1;
266
1.74M
        RE(x) = X_in[N - N4 - 1 - n] + X_in[N - N4 +     n];
267
1.74M
        IM(x) = X_in[    N4 +     n] - X_in[    N4 - 1 - n];
268
269
1.74M
        ComplexMult(&RE(Z1[k]), &IM(Z1[k]),
270
1.74M
            RE(x), IM(x), RE(sincos[k]), IM(sincos[k]));
271
272
1.74M
        RE(Z1[k]) = MUL_R(RE(Z1[k]), scale);
273
1.74M
        IM(Z1[k]) = MUL_R(IM(Z1[k]), scale);
274
275
1.74M
        RE(x) =  X_in[N2 - 1 - n] - X_in[        n];
276
1.74M
        IM(x) =  X_in[N2 +     n] + X_in[N - 1 - n];
277
278
1.74M
        ComplexMult(&RE(Z1[k + N8]), &IM(Z1[k + N8]),
279
1.74M
            RE(x), IM(x), RE(sincos[k + N8]), IM(sincos[k + N8]));
280
281
1.74M
        RE(Z1[k + N8]) = MUL_R(RE(Z1[k + N8]), scale);
282
1.74M
        IM(Z1[k + N8]) = MUL_R(IM(Z1[k + N8]), scale);
283
1.74M
    }
284
285
    /* complex FFT, any non-scaling FFT can be used here  */
286
7.22k
    cfftf(mdct->cfft, Z1);
287
288
    /* post-FFT complex multiplication */
289
3.48M
    for (k = 0; k < N4; k++)
290
3.48M
    {
291
3.48M
        uint16_t n = k << 1;
292
3.48M
        ComplexMult(&RE(x), &IM(x),
293
3.48M
            RE(Z1[k]), IM(Z1[k]), RE(sincos[k]), IM(sincos[k]));
294
295
3.48M
        X_out[         n] = -RE(x);
296
3.48M
        X_out[N2 - 1 - n] =  IM(x);
297
3.48M
        X_out[N2 +     n] = -IM(x);
298
3.48M
        X_out[N  - 1 - n] =  RE(x);
299
3.48M
    }
300
7.22k
}
faad_mdct
Line
Count
Source
232
4.97k
{
233
4.97k
    uint16_t k;
234
235
4.97k
    complex_t x;
236
4.97k
    ALIGN complex_t Z1[512];
237
4.97k
    complex_t *sincos = mdct->sincos;
238
239
4.97k
    uint16_t N  = mdct->N;
240
4.97k
    uint16_t N2 = N >> 1;
241
4.97k
    uint16_t N4 = N >> 2;
242
4.97k
    uint16_t N8 = N >> 3;
243
244
#ifndef FIXED_POINT
245
  real_t scale = REAL_CONST(N);
246
#else
247
4.97k
  real_t scale = REAL_CONST(4.0/N);
248
4.97k
#endif
249
250
4.97k
#ifdef ALLOW_SMALL_FRAMELENGTH
251
4.97k
#ifdef FIXED_POINT
252
    /* detect non-power of 2 */
253
4.97k
    if (N & (N-1))
254
2.66k
    {
255
        /* adjust scale for non-power of 2 MDCT */
256
        /* *= sqrt(2048/1920) */
257
2.66k
        scale = MUL_C(scale, COEF_CONST(1.0327955589886444));
258
2.66k
    }
259
4.97k
#endif
260
4.97k
#endif
261
262
    /* pre-FFT complex multiplication */
263
1.21M
    for (k = 0; k < N8; k++)
264
1.20M
    {
265
1.20M
        uint16_t n = k << 1;
266
1.20M
        RE(x) = X_in[N - N4 - 1 - n] + X_in[N - N4 +     n];
267
1.20M
        IM(x) = X_in[    N4 +     n] - X_in[    N4 - 1 - n];
268
269
1.20M
        ComplexMult(&RE(Z1[k]), &IM(Z1[k]),
270
1.20M
            RE(x), IM(x), RE(sincos[k]), IM(sincos[k]));
271
272
1.20M
        RE(Z1[k]) = MUL_R(RE(Z1[k]), scale);
273
1.20M
        IM(Z1[k]) = MUL_R(IM(Z1[k]), scale);
274
275
1.20M
        RE(x) =  X_in[N2 - 1 - n] - X_in[        n];
276
1.20M
        IM(x) =  X_in[N2 +     n] + X_in[N - 1 - n];
277
278
1.20M
        ComplexMult(&RE(Z1[k + N8]), &IM(Z1[k + N8]),
279
1.20M
            RE(x), IM(x), RE(sincos[k + N8]), IM(sincos[k + N8]));
280
281
1.20M
        RE(Z1[k + N8]) = MUL_R(RE(Z1[k + N8]), scale);
282
1.20M
        IM(Z1[k + N8]) = MUL_R(IM(Z1[k + N8]), scale);
283
1.20M
    }
284
285
    /* complex FFT, any non-scaling FFT can be used here  */
286
4.97k
    cfftf(mdct->cfft, Z1);
287
288
    /* post-FFT complex multiplication */
289
2.42M
    for (k = 0; k < N4; k++)
290
2.41M
    {
291
2.41M
        uint16_t n = k << 1;
292
2.41M
        ComplexMult(&RE(x), &IM(x),
293
2.41M
            RE(Z1[k]), IM(Z1[k]), RE(sincos[k]), IM(sincos[k]));
294
295
2.41M
        X_out[         n] = -RE(x);
296
2.41M
        X_out[N2 - 1 - n] =  IM(x);
297
2.41M
        X_out[N2 +     n] = -IM(x);
298
2.41M
        X_out[N  - 1 - n] =  RE(x);
299
2.41M
    }
300
4.97k
}
301
#endif