]> git.sesse.net Git - ffmpeg/blob - libavcodec/fft.c
c8acfc6017271c3d825319e4f941ea7ff400b2e0
[ffmpeg] / libavcodec / fft.c
1 /*
2  * FFT/IFFT transforms
3  * Copyright (c) 2008 Loren Merritt
4  * Copyright (c) 2002 Fabrice Bellard.
5  * Partly based on libdjbfft by D. J. Bernstein
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23
24 /**
25  * @file fft.c
26  * FFT/IFFT transforms.
27  */
28
29 #include "dsputil.h"
30
31 /* cos(2*pi*x/n) for 0<=x<=n/4, followed by its reverse */
32 DECLARE_ALIGNED_16(FFTSample, ff_cos_16[8]);
33 DECLARE_ALIGNED_16(FFTSample, ff_cos_32[16]);
34 DECLARE_ALIGNED_16(FFTSample, ff_cos_64[32]);
35 DECLARE_ALIGNED_16(FFTSample, ff_cos_128[64]);
36 DECLARE_ALIGNED_16(FFTSample, ff_cos_256[128]);
37 DECLARE_ALIGNED_16(FFTSample, ff_cos_512[256]);
38 DECLARE_ALIGNED_16(FFTSample, ff_cos_1024[512]);
39 DECLARE_ALIGNED_16(FFTSample, ff_cos_2048[1024]);
40 DECLARE_ALIGNED_16(FFTSample, ff_cos_4096[2048]);
41 DECLARE_ALIGNED_16(FFTSample, ff_cos_8192[4096]);
42 DECLARE_ALIGNED_16(FFTSample, ff_cos_16384[8192]);
43 DECLARE_ALIGNED_16(FFTSample, ff_cos_32768[16384]);
44 DECLARE_ALIGNED_16(FFTSample, ff_cos_65536[32768]);
45 static FFTSample *ff_cos_tabs[] = {
46     ff_cos_16, ff_cos_32, ff_cos_64, ff_cos_128, ff_cos_256, ff_cos_512, ff_cos_1024,
47     ff_cos_2048, ff_cos_4096, ff_cos_8192, ff_cos_16384, ff_cos_32768, ff_cos_65536,
48 };
49
50 static int split_radix_permutation(int i, int n, int inverse)
51 {
52     int m;
53     if(n <= 2) return i&1;
54     m = n >> 1;
55     if(!(i&m))            return split_radix_permutation(i, m, inverse)*2;
56     m >>= 1;
57     if(inverse == !(i&m)) return split_radix_permutation(i, m, inverse)*4 + 1;
58     else                  return split_radix_permutation(i, m, inverse)*4 - 1;
59 }
60
61 /**
62  * The size of the FFT is 2^nbits. If inverse is TRUE, inverse FFT is
63  * done
64  */
65 int ff_fft_init(FFTContext *s, int nbits, int inverse)
66 {
67     int i, j, m, n;
68     float alpha, c1, s1, s2;
69     int split_radix = 1;
70     int av_unused has_vectors;
71
72     if (nbits < 2 || nbits > 16)
73         goto fail;
74     s->nbits = nbits;
75     n = 1 << nbits;
76
77     s->tmp_buf = NULL;
78     s->exptab = av_malloc((n / 2) * sizeof(FFTComplex));
79     if (!s->exptab)
80         goto fail;
81     s->revtab = av_malloc(n * sizeof(uint16_t));
82     if (!s->revtab)
83         goto fail;
84     s->inverse = inverse;
85
86     s2 = inverse ? 1.0 : -1.0;
87
88     s->fft_permute = ff_fft_permute_c;
89     s->fft_calc = ff_fft_calc_c;
90     s->imdct_calc = ff_imdct_calc;
91     s->imdct_half = ff_imdct_half;
92     s->exptab1 = NULL;
93
94 #if defined HAVE_MMX && defined HAVE_YASM
95     has_vectors = mm_support();
96     if (has_vectors & MM_SSE) {
97         /* SSE for P3/P4/K8 */
98         s->imdct_calc = ff_imdct_calc_sse;
99         s->imdct_half = ff_imdct_half_sse;
100         s->fft_permute = ff_fft_permute_sse;
101         s->fft_calc = ff_fft_calc_sse;
102     } else if (has_vectors & MM_3DNOWEXT) {
103         /* 3DNowEx for K7 */
104         s->imdct_calc = ff_imdct_calc_3dn2;
105         s->imdct_half = ff_imdct_half_3dn2;
106         s->fft_calc = ff_fft_calc_3dn2;
107     } else if (has_vectors & MM_3DNOW) {
108         /* 3DNow! for K6-2/3 */
109         s->fft_calc = ff_fft_calc_3dn;
110     }
111 #elif defined HAVE_ALTIVEC && !defined ALTIVEC_USE_REFERENCE_C_CODE
112     has_vectors = mm_support();
113     if (has_vectors & MM_ALTIVEC) {
114         s->fft_calc = ff_fft_calc_altivec;
115         split_radix = 0;
116     }
117 #endif
118
119     if (split_radix) {
120         for(j=4; j<=nbits; j++) {
121             int m = 1<<j;
122             double freq = 2*M_PI/m;
123             FFTSample *tab = ff_cos_tabs[j-4];
124             for(i=0; i<=m/4; i++)
125                 tab[i] = cos(i*freq);
126             for(i=1; i<m/4; i++)
127                 tab[m/2-i] = tab[i];
128         }
129         for(i=0; i<n; i++)
130             s->revtab[-split_radix_permutation(i, n, s->inverse) & (n-1)] = i;
131         s->tmp_buf = av_malloc(n * sizeof(FFTComplex));
132     } else {
133         int np, nblocks, np2, l;
134         FFTComplex *q;
135
136         for(i=0; i<(n/2); i++) {
137             alpha = 2 * M_PI * (float)i / (float)n;
138             c1 = cos(alpha);
139             s1 = sin(alpha) * s2;
140             s->exptab[i].re = c1;
141             s->exptab[i].im = s1;
142         }
143
144         np = 1 << nbits;
145         nblocks = np >> 3;
146         np2 = np >> 1;
147         s->exptab1 = av_malloc(np * 2 * sizeof(FFTComplex));
148         if (!s->exptab1)
149             goto fail;
150         q = s->exptab1;
151         do {
152             for(l = 0; l < np2; l += 2 * nblocks) {
153                 *q++ = s->exptab[l];
154                 *q++ = s->exptab[l + nblocks];
155
156                 q->re = -s->exptab[l].im;
157                 q->im = s->exptab[l].re;
158                 q++;
159                 q->re = -s->exptab[l + nblocks].im;
160                 q->im = s->exptab[l + nblocks].re;
161                 q++;
162             }
163             nblocks = nblocks >> 1;
164         } while (nblocks != 0);
165         av_freep(&s->exptab);
166
167         /* compute bit reverse table */
168         for(i=0;i<n;i++) {
169             m=0;
170             for(j=0;j<nbits;j++) {
171                 m |= ((i >> j) & 1) << (nbits-j-1);
172             }
173             s->revtab[i]=m;
174         }
175     }
176
177     return 0;
178  fail:
179     av_freep(&s->revtab);
180     av_freep(&s->exptab);
181     av_freep(&s->exptab1);
182     av_freep(&s->tmp_buf);
183     return -1;
184 }
185
186 /**
187  * Do the permutation needed BEFORE calling ff_fft_calc()
188  */
189 void ff_fft_permute_c(FFTContext *s, FFTComplex *z)
190 {
191     int j, k, np;
192     FFTComplex tmp;
193     const uint16_t *revtab = s->revtab;
194     np = 1 << s->nbits;
195
196     if (s->tmp_buf) {
197         /* TODO: handle split-radix permute in a more optimal way, probably in-place */
198         for(j=0;j<np;j++) s->tmp_buf[revtab[j]] = z[j];
199         memcpy(z, s->tmp_buf, np * sizeof(FFTComplex));
200         return;
201     }
202
203     /* reverse */
204     for(j=0;j<np;j++) {
205         k = revtab[j];
206         if (k < j) {
207             tmp = z[k];
208             z[k] = z[j];
209             z[j] = tmp;
210         }
211     }
212 }
213
214 void ff_fft_end(FFTContext *s)
215 {
216     av_freep(&s->revtab);
217     av_freep(&s->exptab);
218     av_freep(&s->exptab1);
219     av_freep(&s->tmp_buf);
220 }
221
222 #define sqrthalf (float)M_SQRT1_2
223
224 #define BF(x,y,a,b) {\
225     x = a - b;\
226     y = a + b;\
227 }
228
229 #define BUTTERFLIES(a0,a1,a2,a3) {\
230     BF(t3, t5, t5, t1);\
231     BF(a2.re, a0.re, a0.re, t5);\
232     BF(a3.im, a1.im, a1.im, t3);\
233     BF(t4, t6, t2, t6);\
234     BF(a3.re, a1.re, a1.re, t4);\
235     BF(a2.im, a0.im, a0.im, t6);\
236 }
237
238 // force loading all the inputs before storing any.
239 // this is slightly slower for small data, but avoids store->load aliasing
240 // for addresses separated by large powers of 2.
241 #define BUTTERFLIES_BIG(a0,a1,a2,a3) {\
242     FFTSample r0=a0.re, i0=a0.im, r1=a1.re, i1=a1.im;\
243     BF(t3, t5, t5, t1);\
244     BF(a2.re, a0.re, r0, t5);\
245     BF(a3.im, a1.im, i1, t3);\
246     BF(t4, t6, t2, t6);\
247     BF(a3.re, a1.re, r1, t4);\
248     BF(a2.im, a0.im, i0, t6);\
249 }
250
251 #define TRANSFORM(a0,a1,a2,a3,wre,wim) {\
252     t1 = a2.re * wre + a2.im * wim;\
253     t2 = a2.im * wre - a2.re * wim;\
254     t5 = a3.re * wre - a3.im * wim;\
255     t6 = a3.im * wre + a3.re * wim;\
256     BUTTERFLIES(a0,a1,a2,a3)\
257 }
258
259 #define TRANSFORM_ZERO(a0,a1,a2,a3) {\
260     t1 = a2.re;\
261     t2 = a2.im;\
262     t5 = a3.re;\
263     t6 = a3.im;\
264     BUTTERFLIES(a0,a1,a2,a3)\
265 }
266
267 /* z[0...8n-1], w[1...2n-1] */
268 #define PASS(name)\
269 static void name(FFTComplex *z, const FFTSample *wre, unsigned int n)\
270 {\
271     FFTSample t1, t2, t3, t4, t5, t6;\
272     int o1 = 2*n;\
273     int o2 = 4*n;\
274     int o3 = 6*n;\
275     const FFTSample *wim = wre+o1;\
276     n--;\
277 \
278     TRANSFORM_ZERO(z[0],z[o1],z[o2],z[o3]);\
279     TRANSFORM(z[1],z[o1+1],z[o2+1],z[o3+1],wre[1],wim[-1]);\
280     do {\
281         z += 2;\
282         wre += 2;\
283         wim -= 2;\
284         TRANSFORM(z[0],z[o1],z[o2],z[o3],wre[0],wim[0]);\
285         TRANSFORM(z[1],z[o1+1],z[o2+1],z[o3+1],wre[1],wim[-1]);\
286     } while(--n);\
287 }
288
289 PASS(pass)
290 #undef BUTTERFLIES
291 #define BUTTERFLIES BUTTERFLIES_BIG
292 PASS(pass_big)
293
294 #define DECL_FFT(n,n2,n4)\
295 static void fft##n(FFTComplex *z)\
296 {\
297     fft##n2(z);\
298     fft##n4(z+n4*2);\
299     fft##n4(z+n4*3);\
300     pass(z,ff_cos_##n,n4/2);\
301 }
302
303 static void fft4(FFTComplex *z)
304 {
305     FFTSample t1, t2, t3, t4, t5, t6, t7, t8;
306
307     BF(t3, t1, z[0].re, z[1].re);
308     BF(t8, t6, z[3].re, z[2].re);
309     BF(z[2].re, z[0].re, t1, t6);
310     BF(t4, t2, z[0].im, z[1].im);
311     BF(t7, t5, z[2].im, z[3].im);
312     BF(z[3].im, z[1].im, t4, t8);
313     BF(z[3].re, z[1].re, t3, t7);
314     BF(z[2].im, z[0].im, t2, t5);
315 }
316
317 static void fft8(FFTComplex *z)
318 {
319     FFTSample t1, t2, t3, t4, t5, t6, t7, t8;
320
321     fft4(z);
322
323     BF(t1, z[5].re, z[4].re, -z[5].re);
324     BF(t2, z[5].im, z[4].im, -z[5].im);
325     BF(t3, z[7].re, z[6].re, -z[7].re);
326     BF(t4, z[7].im, z[6].im, -z[7].im);
327     BF(t8, t1, t3, t1);
328     BF(t7, t2, t2, t4);
329     BF(z[4].re, z[0].re, z[0].re, t1);
330     BF(z[4].im, z[0].im, z[0].im, t2);
331     BF(z[6].re, z[2].re, z[2].re, t7);
332     BF(z[6].im, z[2].im, z[2].im, t8);
333
334     TRANSFORM(z[1],z[3],z[5],z[7],sqrthalf,sqrthalf);
335 }
336
337 #ifndef CONFIG_SMALL
338 static void fft16(FFTComplex *z)
339 {
340     FFTSample t1, t2, t3, t4, t5, t6;
341
342     fft8(z);
343     fft4(z+8);
344     fft4(z+12);
345
346     TRANSFORM_ZERO(z[0],z[4],z[8],z[12]);
347     TRANSFORM(z[2],z[6],z[10],z[14],sqrthalf,sqrthalf);
348     TRANSFORM(z[1],z[5],z[9],z[13],ff_cos_16[1],ff_cos_16[3]);
349     TRANSFORM(z[3],z[7],z[11],z[15],ff_cos_16[3],ff_cos_16[1]);
350 }
351 #else
352 DECL_FFT(16,8,4)
353 #endif
354 DECL_FFT(32,16,8)
355 DECL_FFT(64,32,16)
356 DECL_FFT(128,64,32)
357 DECL_FFT(256,128,64)
358 DECL_FFT(512,256,128)
359 #ifndef CONFIG_SMALL
360 #define pass pass_big
361 #endif
362 DECL_FFT(1024,512,256)
363 DECL_FFT(2048,1024,512)
364 DECL_FFT(4096,2048,1024)
365 DECL_FFT(8192,4096,2048)
366 DECL_FFT(16384,8192,4096)
367 DECL_FFT(32768,16384,8192)
368 DECL_FFT(65536,32768,16384)
369
370 static void (*fft_dispatch[])(FFTComplex*) = {
371     fft4, fft8, fft16, fft32, fft64, fft128, fft256, fft512, fft1024,
372     fft2048, fft4096, fft8192, fft16384, fft32768, fft65536,
373 };
374
375 /**
376  * Do a complex FFT with the parameters defined in ff_fft_init(). The
377  * input data must be permuted before with s->revtab table. No
378  * 1.0/sqrt(n) normalization is done.
379  */
380 void ff_fft_calc_c(FFTContext *s, FFTComplex *z)
381 {
382     fft_dispatch[s->nbits-2](z);
383 }
384