2 * MDCT/IMDCT transforms
3 * Copyright (c) 2002 Fabrice Bellard.
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * MDCT/IMDCT transforms.
29 * init MDCT or IMDCT computation.
31 int ff_mdct_init(MDCTContext
*s
, int nbits
, int inverse
)
36 memset(s
, 0, sizeof(*s
));
41 s
->tcos
= av_malloc(n4
* sizeof(FFTSample
));
44 s
->tsin
= av_malloc(n4
* sizeof(FFTSample
));
49 alpha
= 2 * M_PI
* (i
+ 1.0 / 8.0) / n
;
50 s
->tcos
[i
] = -cos(alpha
);
51 s
->tsin
[i
] = -sin(alpha
);
53 if (ff_fft_init(&s
->fft
, s
->nbits
- 2, inverse
) < 0)
62 /* complex multiplication: p = a * b */
63 #define CMUL(pre, pim, are, aim, bre, bim) \
69 (pre) = _are * _bre - _aim * _bim;\
70 (pim) = _are * _bim + _aim * _bre;\
74 * Compute inverse MDCT of size N = 2^nbits
75 * @param output N samples
76 * @param input N/2 samples
77 * @param tmp N/2 samples
79 void ff_imdct_calc(MDCTContext
*s
, FFTSample
*output
,
80 const FFTSample
*input
, FFTSample
*tmp
)
82 int k
, n8
, n4
, n2
, n
, j
;
83 const uint16_t *revtab
= s
->fft
.revtab
;
84 const FFTSample
*tcos
= s
->tcos
;
85 const FFTSample
*tsin
= s
->tsin
;
86 const FFTSample
*in1
, *in2
;
87 FFTComplex
*z
= (FFTComplex
*)tmp
;
97 for(k
= 0; k
< n4
; k
++) {
99 CMUL(z
[j
].re
, z
[j
].im
, *in2
, *in1
, tcos
[k
], tsin
[k
]);
103 ff_fft_calc(&s
->fft
, z
);
105 /* post rotation + reordering */
107 for(k
= 0; k
< n4
; k
++) {
108 CMUL(z
[k
].re
, z
[k
].im
, z
[k
].re
, z
[k
].im
, tcos
[k
], tsin
[k
]);
110 for(k
= 0; k
< n8
; k
++) {
111 output
[2*k
] = -z
[n8
+ k
].im
;
112 output
[n2
-1-2*k
] = z
[n8
+ k
].im
;
114 output
[2*k
+1] = z
[n8
-1-k
].re
;
115 output
[n2
-1-2*k
-1] = -z
[n8
-1-k
].re
;
117 output
[n2
+ 2*k
]=-z
[k
+n8
].re
;
118 output
[n
-1- 2*k
]=-z
[k
+n8
].re
;
120 output
[n2
+ 2*k
+1]=z
[n8
-k
-1].im
;
121 output
[n
-2 - 2 * k
] = z
[n8
-k
-1].im
;
126 * Compute MDCT of size N = 2^nbits
127 * @param input N samples
128 * @param out N/2 samples
129 * @param tmp temporary storage of N/2 samples
131 void ff_mdct_calc(MDCTContext
*s
, FFTSample
*out
,
132 const FFTSample
*input
, FFTSample
*tmp
)
134 int i
, j
, n
, n8
, n4
, n2
, n3
;
135 FFTSample re
, im
, re1
, im1
;
136 const uint16_t *revtab
= s
->fft
.revtab
;
137 const FFTSample
*tcos
= s
->tcos
;
138 const FFTSample
*tsin
= s
->tsin
;
139 FFTComplex
*x
= (FFTComplex
*)tmp
;
149 re
= -input
[2*i
+3*n4
] - input
[n3
-1-2*i
];
150 im
= -input
[n4
+2*i
] + input
[n4
-1-2*i
];
152 CMUL(x
[j
].re
, x
[j
].im
, re
, im
, -tcos
[i
], tsin
[i
]);
154 re
= input
[2*i
] - input
[n2
-1-2*i
];
155 im
= -(input
[n2
+2*i
] + input
[n
-1-2*i
]);
157 CMUL(x
[j
].re
, x
[j
].im
, re
, im
, -tcos
[n8
+ i
], tsin
[n8
+ i
]);
160 ff_fft_calc(&s
->fft
, x
);
166 CMUL(re1
, im1
, re
, im
, -tsin
[i
], -tcos
[i
]);
172 void ff_mdct_end(MDCTContext
*s
)