summaryrefslogtreecommitdiff
path: root/apps/codecs/liba52/imdct.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/liba52/imdct.c')
-rw-r--r--apps/codecs/liba52/imdct.c133
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/*
75static void (* ifft128) (complex_t * buf); 77static void (* ifft128) (complex_t * buf);
76static void (* ifft64) (complex_t * buf); 78static 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*/
259void a52_imdct_512 (sample_t * data, sample_t * delay, sample_t bias) 261void 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
296void a52_imdct_256 (sample_t * data, sample_t * delay, sample_t bias) 299void 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)
361void a52_imdct_init (uint32_t mm_accel) 366void 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}