Mercurial > libavcodec.hg
comparison fft.c @ 2967:ef2149182f1c libavcodec
COSMETICS: Remove all trailing whitespace.
author | diego |
---|---|
date | Sat, 17 Dec 2005 18:14:38 +0000 |
parents | dd63cb7e5080 |
children | bfabfdf9ce55 |
comparison
equal
deleted
inserted
replaced
2966:564788471dd4 | 2967:ef2149182f1c |
---|---|
24 | 24 |
25 #include "dsputil.h" | 25 #include "dsputil.h" |
26 | 26 |
27 /** | 27 /** |
28 * The size of the FFT is 2^nbits. If inverse is TRUE, inverse FFT is | 28 * The size of the FFT is 2^nbits. If inverse is TRUE, inverse FFT is |
29 * done | 29 * done |
30 */ | 30 */ |
31 int ff_fft_init(FFTContext *s, int nbits, int inverse) | 31 int ff_fft_init(FFTContext *s, int nbits, int inverse) |
32 { | 32 { |
33 int i, j, m, n; | 33 int i, j, m, n; |
34 float alpha, c1, s1, s2; | 34 float alpha, c1, s1, s2; |
35 | 35 |
36 s->nbits = nbits; | 36 s->nbits = nbits; |
37 n = 1 << nbits; | 37 n = 1 << nbits; |
38 | 38 |
39 s->exptab = av_malloc((n / 2) * sizeof(FFTComplex)); | 39 s->exptab = av_malloc((n / 2) * sizeof(FFTComplex)); |
40 if (!s->exptab) | 40 if (!s->exptab) |
43 if (!s->revtab) | 43 if (!s->revtab) |
44 goto fail; | 44 goto fail; |
45 s->inverse = inverse; | 45 s->inverse = inverse; |
46 | 46 |
47 s2 = inverse ? 1.0 : -1.0; | 47 s2 = inverse ? 1.0 : -1.0; |
48 | 48 |
49 for(i=0;i<(n/2);i++) { | 49 for(i=0;i<(n/2);i++) { |
50 alpha = 2 * M_PI * (float)i / (float)n; | 50 alpha = 2 * M_PI * (float)i / (float)n; |
51 c1 = cos(alpha); | 51 c1 = cos(alpha); |
52 s1 = sin(alpha) * s2; | 52 s1 = sin(alpha) * s2; |
53 s->exptab[i].re = c1; | 53 s->exptab[i].re = c1; |
68 has_vectors = mm_support() & MM_ALTIVEC; | 68 has_vectors = mm_support() & MM_ALTIVEC; |
69 #endif | 69 #endif |
70 if (has_vectors) { | 70 if (has_vectors) { |
71 int np, nblocks, np2, l; | 71 int np, nblocks, np2, l; |
72 FFTComplex *q; | 72 FFTComplex *q; |
73 | 73 |
74 np = 1 << nbits; | 74 np = 1 << nbits; |
75 nblocks = np >> 3; | 75 nblocks = np >> 3; |
76 np2 = np >> 1; | 76 np2 = np >> 1; |
77 s->exptab1 = av_malloc(np * 2 * sizeof(FFTComplex)); | 77 s->exptab1 = av_malloc(np * 2 * sizeof(FFTComplex)); |
78 if (!s->exptab1) | 78 if (!s->exptab1) |
142 } | 142 } |
143 | 143 |
144 /** | 144 /** |
145 * Do a complex FFT with the parameters defined in ff_fft_init(). The | 145 * Do a complex FFT with the parameters defined in ff_fft_init(). The |
146 * input data must be permuted before with s->revtab table. No | 146 * input data must be permuted before with s->revtab table. No |
147 * 1.0/sqrt(n) normalization is done. | 147 * 1.0/sqrt(n) normalization is done. |
148 */ | 148 */ |
149 void ff_fft_calc_c(FFTContext *s, FFTComplex *z) | 149 void ff_fft_calc_c(FFTContext *s, FFTComplex *z) |
150 { | 150 { |
151 int ln = s->nbits; | 151 int ln = s->nbits; |
152 int j, np, np2; | 152 int j, np, np2; |
161 /* pass 0 */ | 161 /* pass 0 */ |
162 | 162 |
163 p=&z[0]; | 163 p=&z[0]; |
164 j=(np >> 1); | 164 j=(np >> 1); |
165 do { | 165 do { |
166 BF(p[0].re, p[0].im, p[1].re, p[1].im, | 166 BF(p[0].re, p[0].im, p[1].re, p[1].im, |
167 p[0].re, p[0].im, p[1].re, p[1].im); | 167 p[0].re, p[0].im, p[1].re, p[1].im); |
168 p+=2; | 168 p+=2; |
169 } while (--j != 0); | 169 } while (--j != 0); |
170 | 170 |
171 /* pass 1 */ | 171 /* pass 1 */ |
172 | 172 |
173 | 173 |
174 p=&z[0]; | 174 p=&z[0]; |
175 j=np >> 2; | 175 j=np >> 2; |
176 if (s->inverse) { | 176 if (s->inverse) { |
177 do { | 177 do { |
178 BF(p[0].re, p[0].im, p[2].re, p[2].im, | 178 BF(p[0].re, p[0].im, p[2].re, p[2].im, |
179 p[0].re, p[0].im, p[2].re, p[2].im); | 179 p[0].re, p[0].im, p[2].re, p[2].im); |
180 BF(p[1].re, p[1].im, p[3].re, p[3].im, | 180 BF(p[1].re, p[1].im, p[3].re, p[3].im, |
181 p[1].re, p[1].im, -p[3].im, p[3].re); | 181 p[1].re, p[1].im, -p[3].im, p[3].re); |
182 p+=4; | 182 p+=4; |
183 } while (--j != 0); | 183 } while (--j != 0); |
184 } else { | 184 } else { |
185 do { | 185 do { |
186 BF(p[0].re, p[0].im, p[2].re, p[2].im, | 186 BF(p[0].re, p[0].im, p[2].re, p[2].im, |
187 p[0].re, p[0].im, p[2].re, p[2].im); | 187 p[0].re, p[0].im, p[2].re, p[2].im); |
188 BF(p[1].re, p[1].im, p[3].re, p[3].im, | 188 BF(p[1].re, p[1].im, p[3].re, p[3].im, |
189 p[1].re, p[1].im, p[3].im, -p[3].re); | 189 p[1].re, p[1].im, p[3].im, -p[3].re); |
190 p+=4; | 190 p+=4; |
191 } while (--j != 0); | 191 } while (--j != 0); |
192 } | 192 } |
193 /* pass 2 .. ln-1 */ | 193 /* pass 2 .. ln-1 */ |
199 p = z; | 199 p = z; |
200 q = z + nloops; | 200 q = z + nloops; |
201 for (j = 0; j < nblocks; ++j) { | 201 for (j = 0; j < nblocks; ++j) { |
202 BF(p->re, p->im, q->re, q->im, | 202 BF(p->re, p->im, q->re, q->im, |
203 p->re, p->im, q->re, q->im); | 203 p->re, p->im, q->re, q->im); |
204 | 204 |
205 p++; | 205 p++; |
206 q++; | 206 q++; |
207 for(l = nblocks; l < np2; l += nblocks) { | 207 for(l = nblocks; l < np2; l += nblocks) { |
208 CMUL(tmp_re, tmp_im, exptab[l].re, exptab[l].im, q->re, q->im); | 208 CMUL(tmp_re, tmp_im, exptab[l].re, exptab[l].im, q->re, q->im); |
209 BF(p->re, p->im, q->re, q->im, | 209 BF(p->re, p->im, q->re, q->im, |
226 void ff_fft_permute(FFTContext *s, FFTComplex *z) | 226 void ff_fft_permute(FFTContext *s, FFTComplex *z) |
227 { | 227 { |
228 int j, k, np; | 228 int j, k, np; |
229 FFTComplex tmp; | 229 FFTComplex tmp; |
230 const uint16_t *revtab = s->revtab; | 230 const uint16_t *revtab = s->revtab; |
231 | 231 |
232 /* reverse */ | 232 /* reverse */ |
233 np = 1 << s->nbits; | 233 np = 1 << s->nbits; |
234 for(j=0;j<np;j++) { | 234 for(j=0;j<np;j++) { |
235 k = revtab[j]; | 235 k = revtab[j]; |
236 if (k < j) { | 236 if (k < j) { |