diff options
Diffstat (limited to 'apps/codecs/liba52/imdct.c')
-rw-r--r-- | apps/codecs/liba52/imdct.c | 133 |
1 files changed, 71 insertions, 62 deletions
diff --git a/apps/codecs/liba52/imdct.c b/apps/codecs/liba52/imdct.c index d1035030fd..4483bd0667 100644 --- a/apps/codecs/liba52/imdct.c +++ b/apps/codecs/liba52/imdct.c | |||
@@ -72,6 +72,8 @@ static const uint8_t fftorder[] = { | |||
72 | //static sample_t a52_imdct_window[256]; | 72 | //static sample_t a52_imdct_window[256]; |
73 | #include "imdct_lookups.h" | 73 | #include "imdct_lookups.h" |
74 | 74 | ||
75 | |||
76 | /* | ||
75 | static void (* ifft128) (complex_t * buf); | 77 | static void (* ifft128) (complex_t * buf); |
76 | static void (* ifft64) (complex_t * buf); | 78 | static void (* ifft64) (complex_t * buf); |
77 | 79 | ||
@@ -109,7 +111,7 @@ static inline void ifft4 (complex_t * buf) | |||
109 | buf[3].real = tmp5 - tmp7; | 111 | buf[3].real = tmp5 - tmp7; |
110 | buf[3].imag = tmp6 - tmp8; | 112 | buf[3].imag = tmp6 - tmp8; |
111 | } | 113 | } |
112 | 114 | */ | |
113 | /* basic radix-2 ifft butterfly */ | 115 | /* basic radix-2 ifft butterfly */ |
114 | 116 | ||
115 | #define BUTTERFLY_0(t0,t1,W0,W1,d0,d1) do { \ | 117 | #define BUTTERFLY_0(t0,t1,W0,W1,d0,d1) do { \ |
@@ -161,7 +163,7 @@ static inline void ifft4 (complex_t * buf) | |||
161 | } while (0) | 163 | } while (0) |
162 | 164 | ||
163 | /* split-radix ifft butterfly, specialized for wr=wi */ | 165 | /* split-radix ifft butterfly, specialized for wr=wi */ |
164 | 166 | /* | |
165 | #define BUTTERFLY_HALF(a0,a1,a2,a3,w) do { \ | 167 | #define BUTTERFLY_HALF(a0,a1,a2,a3,w) do { \ |
166 | tmp5 = MUL (a2.real + a2.imag, w); \ | 168 | tmp5 = MUL (a2.real + a2.imag, w); \ |
167 | tmp6 = MUL (a2.imag - a2.real, w); \ | 169 | tmp6 = MUL (a2.imag - a2.real, w); \ |
@@ -255,93 +257,96 @@ static void ifft128_c (complex_t * buf) | |||
255 | ifft32 (buf + 96); | 257 | ifft32 (buf + 96); |
256 | ifft_pass (buf, roots128, 32); | 258 | ifft_pass (buf, roots128, 32); |
257 | } | 259 | } |
258 | 260 | */ | |
259 | void a52_imdct_512 (sample_t * data, sample_t * delay, sample_t bias) | 261 | void a52_imdct_512 (sample_t * data, sample_t * delay) |
260 | { | 262 | { |
261 | int i, k; | 263 | int i, k; |
262 | sample_t t_r, t_i, a_r, a_i, b_r, b_i, w_1, w_2; | 264 | sample_t t_r, t_i, a_r, a_i, b_r, b_i, w_1, w_2; |
263 | const sample_t * window = a52_imdct_window; | 265 | const sample_t * window = a52_imdct_window; |
264 | complex_t buf[128]; | 266 | FFTComplex buf[128]; |
265 | 267 | ||
266 | for (i = 0; i < 128; i++) { | 268 | for (i = 0; i < 128; i++) { |
267 | k = fftorder[i]; | 269 | k = fftorder[i]; |
268 | t_r = pre1[i].real; | 270 | t_r = pre1[i].real; |
269 | t_i = pre1[i].imag; | 271 | t_i = pre1[i].imag; |
270 | BUTTERFLY_0 (buf[i].real, buf[i].imag, t_r, t_i, data[k], data[255-k]); | 272 | BUTTERFLY_0 (buf[i].re, buf[i].im, t_r, t_i, data[k], data[255-k]); |
271 | } | 273 | } |
272 | 274 | ||
273 | ifft128 (buf); | 275 | //ifft128 (buf); |
276 | ff_fft_calc_c(7, (FFTComplex *)&buf); | ||
274 | 277 | ||
275 | /* Post IFFT complex multiply plus IFFT complex conjugate*/ | 278 | /* Post IFFT complex multiply plus IFFT complex conjugate*/ |
276 | /* Window and convert to real valued signal */ | 279 | /* Window and convert to real valued signal */ |
277 | for (i = 0; i < 64; i++) { | 280 | for (i = 0; i < 64; i++) { |
278 | /* y[n] = z[n] * (xcos1[n] + j * xsin1[n]) ; */ | 281 | /* y[n] = z[n] * (xcos1[n] + j * xsin1[n]) ; */ |
279 | t_r = post1[i].real; | 282 | t_r = post1[i].real; |
280 | t_i = post1[i].imag; | 283 | t_i = post1[i].imag; |
281 | BUTTERFLY_0 (a_r, a_i, t_i, t_r, buf[i].imag, buf[i].real); | 284 | BUTTERFLY_0 (a_r, a_i, t_i, t_r, buf[i].im, buf[i].re); |
282 | BUTTERFLY_0 (b_r, b_i, t_r, t_i, buf[127-i].imag, buf[127-i].real); | 285 | BUTTERFLY_0 (b_r, b_i, t_r, t_i, buf[127-i].im, buf[127-i].re); |
283 | 286 | ||
284 | w_1 = window[2*i]; | 287 | w_1 = window[2*i]; |
285 | w_2 = window[255-2*i]; | 288 | w_2 = window[255-2*i]; |
286 | BUTTERFLY_B (data[255-2*i], data[2*i], w_2, w_1, a_r, delay[2*i]); | 289 | BUTTERFLY_B (data[255-2*i], data[2*i], w_2, w_1, a_r, delay[2*i]); |
287 | delay[2*i] = a_i; | 290 | delay[2*i] = a_i; |
288 | 291 | ||
289 | w_1 = window[2*i+1]; | 292 | w_1 = window[2*i+1]; |
290 | w_2 = window[254-2*i]; | 293 | w_2 = window[254-2*i]; |
291 | BUTTERFLY_B (data[2*i+1], data[254-2*i], w_1, w_2, b_r, delay[2*i+1]); | 294 | BUTTERFLY_B (data[2*i+1], data[254-2*i], w_1, w_2, b_r, delay[2*i+1]); |
292 | delay[2*i+1] = b_i; | 295 | delay[2*i+1] = b_i; |
293 | } | 296 | } |
294 | } | 297 | } |
295 | 298 | ||
296 | void a52_imdct_256 (sample_t * data, sample_t * delay, sample_t bias) | 299 | void a52_imdct_256 (sample_t * data, sample_t * delay) |
297 | { | 300 | { |
298 | int i, k; | 301 | int i, k; |
299 | sample_t t_r, t_i, a_r, a_i, b_r, b_i, c_r, c_i, d_r, d_i, w_1, w_2; | 302 | sample_t t_r, t_i, a_r, a_i, b_r, b_i, c_r, c_i, d_r, d_i, w_1, w_2; |
300 | const sample_t * window = a52_imdct_window; | 303 | const sample_t * window = a52_imdct_window; |
301 | complex_t buf1[64], buf2[64]; | 304 | FFTComplex buf1[64], buf2[64]; |
302 | 305 | ||
303 | /* Pre IFFT complex multiply plus IFFT cmplx conjugate */ | 306 | /* Pre IFFT complex multiply plus IFFT cmplx conjugate */ |
304 | for (i = 0; i < 64; i++) { | 307 | for (i = 0; i < 64; i++) { |
305 | k = fftorder[i]; | 308 | k = fftorder[i]; |
306 | t_r = pre2[i].real; | 309 | t_r = pre2[i].real; |
307 | t_i = pre2[i].imag; | 310 | t_i = pre2[i].imag; |
308 | BUTTERFLY_0 (buf1[i].real, buf1[i].imag, t_r, t_i, data[k], data[254-k]); | 311 | BUTTERFLY_0 (buf1[i].re, buf1[i].im, t_r, t_i, data[k], data[254-k]); |
309 | BUTTERFLY_0 (buf2[i].real, buf2[i].imag, t_r, t_i, data[k+1], data[255-k]); | 312 | BUTTERFLY_0 (buf2[i].re, buf2[i].im, t_r, t_i, data[k+1], data[255-k]); |
310 | } | 313 | } |
311 | 314 | ||
312 | ifft64 (buf1); | 315 | //ifft64 (buf1); |
313 | ifft64 (buf2); | 316 | //ifft64 (buf2); |
317 | ff_fft_calc_c(6, (FFTComplex *)&buf1); | ||
318 | ff_fft_calc_c(6, (FFTComplex *)&buf2); | ||
314 | 319 | ||
315 | /* Post IFFT complex multiply */ | 320 | /* Post IFFT complex multiply */ |
316 | /* Window and convert to real valued signal */ | 321 | /* Window and convert to real valued signal */ |
317 | for (i = 0; i < 32; i++) { | 322 | for (i = 0; i < 32; i++) { |
318 | /* y1[n] = z1[n] * (xcos2[n] + j * xs in2[n]) ; */ | 323 | /* y1[n] = z1[n] * (xcos2[n] + j * xs in2[n]) ; */ |
319 | t_r = post2[i].real; | 324 | t_r = post2[i].real; |
320 | t_i = post2[i].imag; | 325 | t_i = post2[i].imag; |
321 | BUTTERFLY_0 (a_r, a_i, t_i, t_r, buf1[i].imag, buf1[i].real); | 326 | BUTTERFLY_0 (a_r, a_i, t_i, t_r, buf1[i].im, buf1[i].re); |
322 | BUTTERFLY_0 (b_r, b_i, t_r, t_i, buf1[63-i].imag, buf1[63-i].real); | 327 | BUTTERFLY_0 (b_r, b_i, t_r, t_i, buf1[63-i].im, buf1[63-i].re); |
323 | BUTTERFLY_0 (c_r, c_i, t_i, t_r, buf2[i].imag, buf2[i].real); | 328 | BUTTERFLY_0 (c_r, c_i, t_i, t_r, buf2[i].im, buf2[i].re); |
324 | BUTTERFLY_0 (d_r, d_i, t_r, t_i, buf2[63-i].imag, buf2[63-i].real); | 329 | BUTTERFLY_0 (d_r, d_i, t_r, t_i, buf2[63-i].im, buf2[63-i].re); |
325 | 330 | ||
326 | w_1 = window[2*i]; | 331 | w_1 = window[2*i]; |
327 | w_2 = window[255-2*i]; | 332 | w_2 = window[255-2*i]; |
328 | BUTTERFLY_B (data[255-2*i], data[2*i], w_2, w_1, a_r, delay[2*i]); | 333 | BUTTERFLY_B (data[255-2*i], data[2*i], w_2, w_1, a_r, delay[2*i]); |
329 | delay[2*i] = c_i; | 334 | delay[2*i] = c_i; |
330 | 335 | ||
331 | w_1 = window[128+2*i]; | 336 | w_1 = window[128+2*i]; |
332 | w_2 = window[127-2*i]; | 337 | w_2 = window[127-2*i]; |
333 | BUTTERFLY_B (data[128+2*i], data[127-2*i], w_1, w_2, a_i, delay[127-2*i]); | 338 | BUTTERFLY_B (data[128+2*i], data[127-2*i], w_1, w_2, a_i, delay[127-2*i]); |
334 | delay[127-2*i] = c_r; | 339 | delay[127-2*i] = c_r; |
335 | 340 | ||
336 | w_1 = window[2*i+1]; | 341 | w_1 = window[2*i+1]; |
337 | w_2 = window[254-2*i]; | 342 | w_2 = window[254-2*i]; |
338 | BUTTERFLY_B (data[254-2*i], data[2*i+1], w_2, w_1, b_i, delay[2*i+1]); | 343 | BUTTERFLY_B (data[254-2*i], data[2*i+1], w_2, w_1, b_i, delay[2*i+1]); |
339 | delay[2*i+1] = d_r; | 344 | delay[2*i+1] = d_r; |
340 | 345 | ||
341 | w_1 = window[129+2*i]; | 346 | w_1 = window[129+2*i]; |
342 | w_2 = window[126-2*i]; | 347 | w_2 = window[126-2*i]; |
343 | BUTTERFLY_B (data[129+2*i], data[126-2*i], w_1, w_2, b_r, delay[126-2*i]); | 348 | BUTTERFLY_B (data[129+2*i], data[126-2*i], w_1, w_2, b_r, delay[126-2*i]); |
344 | delay[126-2*i] = d_i; | 349 | delay[126-2*i] = d_i; |
345 | } | 350 | } |
346 | } | 351 | } |
347 | 352 | ||
@@ -361,6 +366,9 @@ static double besselI0 (double x) | |||
361 | void a52_imdct_init (uint32_t mm_accel) | 366 | void a52_imdct_init (uint32_t mm_accel) |
362 | { | 367 | { |
363 | (void)mm_accel; | 368 | (void)mm_accel; |
369 | //ff_fft_init(&s128, 7, 1); | ||
370 | //ff_fft_init(&s64, 6, 1); | ||
371 | |||
364 | /* int i, k; | 372 | /* int i, k; |
365 | double sum; | 373 | double sum; |
366 | double local_imdct_window[256];*/ | 374 | double local_imdct_window[256];*/ |
@@ -457,7 +465,7 @@ void a52_imdct_init (uint32_t mm_accel) | |||
457 | printf("static complex_t post2[32]={"); | 465 | printf("static complex_t post2[32]={"); |
458 | for (i=0;i<32;i++) { printf("{%d,%d}%s",post2[i].real,post2[i].imag,(i < 31 ? "," : "")); } | 466 | for (i=0;i<32;i++) { printf("{%d,%d}%s",post2[i].real,post2[i].imag,(i < 31 ? "," : "")); } |
459 | printf("};\n"); | 467 | printf("};\n"); |
460 | */ | 468 | |
461 | 469 | ||
462 | #ifdef LIBA52_DJBFFT | 470 | #ifdef LIBA52_DJBFFT |
463 | if (mm_accel & MM_ACCEL_DJBFFT) { | 471 | if (mm_accel & MM_ACCEL_DJBFFT) { |
@@ -474,4 +482,5 @@ void a52_imdct_init (uint32_t mm_accel) | |||
474 | ifft128 = ifft128_c; | 482 | ifft128 = ifft128_c; |
475 | ifft64 = ifft64_c; | 483 | ifft64 = ifft64_c; |
476 | } | 484 | } |
485 | */ | ||
477 | } | 486 | } |