summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/codecs/libfaad/sbr_dct.c222
1 files changed, 94 insertions, 128 deletions
diff --git a/apps/codecs/libfaad/sbr_dct.c b/apps/codecs/libfaad/sbr_dct.c
index 123514f226..f471745813 100644
--- a/apps/codecs/libfaad/sbr_dct.c
+++ b/apps/codecs/libfaad/sbr_dct.c
@@ -1452,103 +1452,76 @@ void DCT2_32_unscaled(real_t *y, real_t *x)
1452 1452
1453#else /* #ifdef SBR_LOW_POWER */ 1453#else /* #ifdef SBR_LOW_POWER */
1454 1454
1455static const real_t dct4_64_tab[] ICONST_ATTR = { 1455/* table for pre-processing within dct4_kernel() */
1456 COEF_CONST(0.999924719333649), COEF_CONST(0.998118102550507), 1456static const real_t dct4_pre_tab[] ICONST_ATTR = {
1457 COEF_CONST(0.993906974792480), COEF_CONST(0.987301409244537), 1457 COEF_CONST(0.999924719333649), COEF_CONST(-1.01219630241394), COEF_CONST(-0.987653195858002),
1458 COEF_CONST(0.978317379951477), COEF_CONST(0.966976463794708), 1458 COEF_CONST(0.998118102550507), COEF_CONST(-1.05943882465363), COEF_CONST(-0.936797380447388),
1459 COEF_CONST(0.953306019306183), COEF_CONST(0.937339007854462), 1459 COEF_CONST(0.993906974792480), COEF_CONST(-1.10412919521332), COEF_CONST(-0.883684754371643),
1460 COEF_CONST(0.919113874435425), COEF_CONST(0.898674488067627), 1460 COEF_CONST(0.987301409244537), COEF_CONST(-1.14615952968597), COEF_CONST(-0.828443288803101),
1461 COEF_CONST(0.876070082187653), COEF_CONST(0.851355195045471), 1461 COEF_CONST(0.978317379951477), COEF_CONST(-1.18542873859405), COEF_CONST(-0.771206021308899),
1462 COEF_CONST(0.824589252471924), COEF_CONST(0.795836925506592), 1462 COEF_CONST(0.966976463794708), COEF_CONST(-1.22184216976166), COEF_CONST(-0.712110757827759),
1463 COEF_CONST(0.765167236328125), COEF_CONST(0.732654273509979), 1463 COEF_CONST(0.953306019306183), COEF_CONST(-1.25531196594238), COEF_CONST(-0.651300072669983),
1464 COEF_CONST(0.698376238346100), COEF_CONST(0.662415742874146), 1464 COEF_CONST(0.937339007854462), COEF_CONST(-1.28575766086578), COEF_CONST(-0.588920354843140),
1465 COEF_CONST(0.624859452247620), COEF_CONST(0.585797846317291), 1465 COEF_CONST(0.919113874435425), COEF_CONST(-1.31310594081879), COEF_CONST(-0.525121808052063),
1466 COEF_CONST(0.545324981212616), COEF_CONST(0.503538429737091), 1466 COEF_CONST(0.898674488067627), COEF_CONST(-1.33729076385498), COEF_CONST(-0.460058242082596),
1467 COEF_CONST(0.460538715124130), COEF_CONST(0.416429549455643), 1467 COEF_CONST(0.876070082187653), COEF_CONST(-1.35825383663177), COEF_CONST(-0.393886327743530),
1468 COEF_CONST(0.371317148208618), COEF_CONST(0.325310230255127), 1468 COEF_CONST(0.851355195045471), COEF_CONST(-1.37594485282898), COEF_CONST(-0.326765477657318),
1469 COEF_CONST(0.278519600629807), COEF_CONST(0.231058135628700), 1469 COEF_CONST(0.824589252471924), COEF_CONST(-1.39032101631165), COEF_CONST(-0.258857429027557),
1470 COEF_CONST(0.183039888739586), COEF_CONST(0.134580686688423), 1470 COEF_CONST(0.795836925506592), COEF_CONST(-1.40134787559509), COEF_CONST(-0.190325915813446),
1471 COEF_CONST(0.085797272622585), COEF_CONST(0.036807164549828), 1471 COEF_CONST(0.765167236328125), COEF_CONST(-1.40899872779846), COEF_CONST(-0.121335685253143),
1472 COEF_CONST(-1.012196302413940), COEF_CONST(-1.059438824653626), 1472 COEF_CONST(0.732654273509979), COEF_CONST(-1.41325521469116), COEF_CONST(-0.052053272724152),
1473 COEF_CONST(-1.104129195213318), COEF_CONST(-1.146159529685974), 1473 COEF_CONST(0.698376238346100), COEF_CONST(-1.41410708427429), COEF_CONST( 0.017354607582092),
1474 COEF_CONST(-1.185428738594055), COEF_CONST(-1.221842169761658), 1474 COEF_CONST(0.662415742874146), COEF_CONST(-1.41155219078064), COEF_CONST( 0.086720645427704),
1475 COEF_CONST(-1.255311965942383), COEF_CONST(-1.285757660865784), 1475 COEF_CONST(0.624859452247620), COEF_CONST(-1.40559673309326), COEF_CONST( 0.155877828598022),
1476 COEF_CONST(-1.313105940818787), COEF_CONST(-1.337290763854981), 1476 COEF_CONST(0.585797846317291), COEF_CONST(-1.39625501632690), COEF_CONST( 0.224659323692322),
1477 COEF_CONST(-1.358253836631775), COEF_CONST(-1.375944852828980), 1477 COEF_CONST(0.545324981212616), COEF_CONST(-1.38354969024658), COEF_CONST( 0.292899727821350),
1478 COEF_CONST(-1.390321016311646), COEF_CONST(-1.401347875595093), 1478 COEF_CONST(0.503538429737091), COEF_CONST(-1.36751127243042), COEF_CONST( 0.360434412956238),
1479 COEF_CONST(-1.408998727798462), COEF_CONST(-1.413255214691162), 1479 COEF_CONST(0.460538715124130), COEF_CONST(-1.34817838668823), COEF_CONST( 0.427100926637650),
1480 COEF_CONST(-1.414107084274292), COEF_CONST(-1.411552190780640), 1480 COEF_CONST(0.416429549455643), COEF_CONST(-1.32559752464294), COEF_CONST( 0.492738455533981),
1481 COEF_CONST(-1.405596733093262), COEF_CONST(-1.396255016326904), 1481 COEF_CONST(0.371317148208618), COEF_CONST(-1.29982328414917), COEF_CONST( 0.557188928127289),
1482 COEF_CONST(-1.383549690246582), COEF_CONST(-1.367511272430420), 1482 COEF_CONST(0.325310230255127), COEF_CONST(-1.27091765403748), COEF_CONST( 0.620297133922577),
1483 COEF_CONST(-1.348178386688232), COEF_CONST(-1.325597524642944), 1483 COEF_CONST(0.278519600629807), COEF_CONST(-1.23895013332367), COEF_CONST( 0.681910991668701),
1484 COEF_CONST(-1.299823284149170), COEF_CONST(-1.270917654037476), 1484 COEF_CONST(0.231058135628700), COEF_CONST(-1.20399808883667), COEF_CONST( 0.741881847381592),
1485 COEF_CONST(-1.238950133323669), COEF_CONST(-1.203998088836670), 1485 COEF_CONST(0.183039888739586), COEF_CONST(-1.16614532470703), COEF_CONST( 0.800065577030182),
1486 COEF_CONST(-1.166145324707031), COEF_CONST(-1.125483393669128), 1486 COEF_CONST(0.134580686688423), COEF_CONST(-1.12548339366913), COEF_CONST( 0.856321990489960),
1487 COEF_CONST(-1.082109928131104), COEF_CONST(-1.036129593849182), 1487 COEF_CONST(0.085797272622585), COEF_CONST(-1.08210992813110), COEF_CONST( 0.910515367984772),
1488 COEF_CONST(-0.987653195858002), COEF_CONST(-0.936797380447388), 1488 COEF_CONST(0.036807164549828), COEF_CONST(-1.03612959384918), COEF_CONST( 0.962515234947205)
1489 COEF_CONST(-0.883684754371643), COEF_CONST(-0.828443288803101), 1489};
1490 COEF_CONST(-0.771206021308899), COEF_CONST(-0.712110757827759), 1490
1491 COEF_CONST(-0.651300072669983), COEF_CONST(-0.588920354843140), 1491/* table for post-processing within dct4_kernel() */
1492 COEF_CONST(-0.525121808052063), COEF_CONST(-0.460058242082596), 1492static const real_t dct4_post_tab[] ICONST_ATTR = {
1493 COEF_CONST(-0.393886327743530), COEF_CONST(-0.326765477657318), 1493 COEF_CONST(1 ), COEF_CONST(-1 ), COEF_CONST(-1 ),
1494 COEF_CONST(-0.258857429027557), COEF_CONST(-0.190325915813446), 1494 COEF_CONST(0.998795449733734), COEF_CONST(-1.04786312580109), COEF_CONST(-0.949727773666382),
1495 COEF_CONST(-0.121335685253143), COEF_CONST(-0.052053272724152), 1495 COEF_CONST(0.995184719562531), COEF_CONST(-1.09320187568665), COEF_CONST(-0.897167563438416),
1496 COEF_CONST(0.017354607582092), COEF_CONST(0.086720645427704), 1496 COEF_CONST(0.989176511764526), COEF_CONST(-1.13590693473816), COEF_CONST(-0.842446029186249),
1497 COEF_CONST(0.155877828598022), COEF_CONST(0.224659323692322), 1497 COEF_CONST(0.980785250663757), COEF_CONST(-1.17587554454803), COEF_CONST(-0.785694956779480),
1498 COEF_CONST(0.292899727821350), COEF_CONST(0.360434412956238), 1498 COEF_CONST(0.970031261444092), COEF_CONST(-1.21301150321960), COEF_CONST(-0.727051079273224),
1499 COEF_CONST(0.427100926637650), COEF_CONST(0.492738455533981), 1499 COEF_CONST(0.956940352916718), COEF_CONST(-1.24722504615784), COEF_CONST(-0.666655659675598),
1500 COEF_CONST(0.557188928127289), COEF_CONST(0.620297133922577), 1500 COEF_CONST(0.941544055938721), COEF_CONST(-1.27843391895294), COEF_CONST(-0.604654192924500),
1501 COEF_CONST(0.681910991668701), COEF_CONST(0.741881847381592), 1501 COEF_CONST(0.923879504203796), COEF_CONST(-1.30656290054321), COEF_CONST(-0.541196048259735),
1502 COEF_CONST(0.800065577030182), COEF_CONST(0.856321990489960), 1502 COEF_CONST(0.903989315032959), COEF_CONST(-1.33154439926148), COEF_CONST(-0.476434230804443),
1503 COEF_CONST(0.910515367984772), COEF_CONST(0.962515234947205), 1503 COEF_CONST(0.881921231746674), COEF_CONST(-1.35331797599793), COEF_CONST(-0.410524487495422),
1504 COEF_CONST(1.000000000000000), COEF_CONST(0.998795449733734), 1504 COEF_CONST(0.857728600502014), COEF_CONST(-1.37183141708374), COEF_CONST(-0.343625843524933),
1505 COEF_CONST(0.995184719562531), COEF_CONST(0.989176511764526), 1505 COEF_CONST(0.831469595432281), COEF_CONST(-1.38703989982605), COEF_CONST(-0.275899350643158),
1506 COEF_CONST(0.980785250663757), COEF_CONST(0.970031261444092), 1506 COEF_CONST(0.803207516670227), COEF_CONST(-1.39890682697296), COEF_CONST(-0.207508206367493),
1507 COEF_CONST(0.956940352916718), COEF_CONST(0.941544055938721), 1507 COEF_CONST(0.773010432720184), COEF_CONST(-1.40740370750427), COEF_CONST(-0.138617098331451),
1508 COEF_CONST(0.923879504203796), COEF_CONST(0.903989315032959), 1508 COEF_CONST(0.740951120853424), COEF_CONST(-1.41251015663147), COEF_CONST(-0.069392144680023),
1509 COEF_CONST(0.881921231746674), COEF_CONST(0.857728600502014), 1509 COEF_CONST(0.707106769084930), COEF_CONST( 0 ), COEF_CONST( 0 ),
1510 COEF_CONST(0.831469595432281), COEF_CONST(0.803207516670227), 1510 COEF_CONST(0.671558916568756), COEF_CONST(-1.41251015663147), COEF_CONST( 0.069392263889313),
1511 COEF_CONST(0.773010432720184), COEF_CONST(0.740951120853424), 1511 COEF_CONST(0.634393274784088), COEF_CONST(-1.40740370750427), COEF_CONST( 0.138617157936096),
1512 COEF_CONST(0.707106769084930), COEF_CONST(0.671558916568756), 1512 COEF_CONST(0.595699310302734), COEF_CONST(-1.39890682697296), COEF_CONST( 0.207508206367493),
1513 COEF_CONST(0.634393274784088), COEF_CONST(0.595699310302734), 1513 COEF_CONST(0.555570185184479), COEF_CONST(-1.38703989982605), COEF_CONST( 0.275899469852448),
1514 COEF_CONST(0.555570185184479), COEF_CONST(0.514102697372437), 1514 COEF_CONST(0.514102697372437), COEF_CONST(-1.37183141708374), COEF_CONST( 0.343625962734222),
1515 COEF_CONST(0.471396654844284), COEF_CONST(0.427555114030838), 1515 COEF_CONST(0.471396654844284), COEF_CONST(-1.35331797599793), COEF_CONST( 0.410524636507034),
1516 COEF_CONST(0.382683426141739), COEF_CONST(0.336889833211899), 1516 COEF_CONST(0.427555114030838), COEF_CONST(-1.33154439926148), COEF_CONST( 0.476434201002121),
1517 COEF_CONST(0.290284633636475), COEF_CONST(0.242980122566223), 1517 COEF_CONST(0.382683426141739), COEF_CONST(-1.30656290054321), COEF_CONST( 0.541196107864380),
1518 COEF_CONST(0.195090234279633), COEF_CONST(0.146730497479439), 1518 COEF_CONST(0.336889833211899), COEF_CONST(-1.27843391895294), COEF_CONST( 0.604654192924500),
1519 COEF_CONST(0.098017133772373), COEF_CONST(0.049067649990320), 1519 COEF_CONST(0.290284633636475), COEF_CONST(-1.24722504615784), COEF_CONST( 0.666655719280243),
1520 COEF_CONST(-1.000000000000000), COEF_CONST(-1.047863125801086), 1520 COEF_CONST(0.242980122566223), COEF_CONST(-1.21301138401031), COEF_CONST( 0.727051138877869),
1521 COEF_CONST(-1.093201875686646), COEF_CONST(-1.135906934738159), 1521 COEF_CONST(0.195090234279633), COEF_CONST(-1.17587554454803), COEF_CONST( 0.785695075988770),
1522 COEF_CONST(-1.175875544548035), COEF_CONST(-1.213011503219605), 1522 COEF_CONST(0.146730497479439), COEF_CONST(-1.13590705394745), COEF_CONST( 0.842446029186249),
1523 COEF_CONST(-1.247225046157837), COEF_CONST(-1.278433918952942), 1523 COEF_CONST(0.098017133772373), COEF_CONST(-1.09320187568665), COEF_CONST( 0.897167563438416),
1524 COEF_CONST(-1.306562900543213), COEF_CONST(-1.331544399261475), 1524 COEF_CONST(0.049067649990320), COEF_CONST(-1.04786312580109), COEF_CONST( 0.949727773666382)
1525 COEF_CONST(-1.353317975997925), COEF_CONST(-1.371831417083740),
1526 COEF_CONST(-1.387039899826050), COEF_CONST(-1.398906826972961),
1527 COEF_CONST(-1.407403707504273), COEF_CONST(-1.412510156631470),
1528 COEF_CONST(0), COEF_CONST(-1.412510156631470),
1529 COEF_CONST(-1.407403707504273), COEF_CONST(-1.398906826972961),
1530 COEF_CONST(-1.387039899826050), COEF_CONST(-1.371831417083740),
1531 COEF_CONST(-1.353317975997925), COEF_CONST(-1.331544399261475),
1532 COEF_CONST(-1.306562900543213), COEF_CONST(-1.278433918952942),
1533 COEF_CONST(-1.247225046157837), COEF_CONST(-1.213011384010315),
1534 COEF_CONST(-1.175875544548035), COEF_CONST(-1.135907053947449),
1535 COEF_CONST(-1.093201875686646), COEF_CONST(-1.047863125801086),
1536 COEF_CONST(-1.000000000000000), COEF_CONST(-0.949727773666382),
1537 COEF_CONST(-0.897167563438416), COEF_CONST(-0.842446029186249),
1538 COEF_CONST(-0.785694956779480), COEF_CONST(-0.727051079273224),
1539 COEF_CONST(-0.666655659675598), COEF_CONST(-0.604654192924500),
1540 COEF_CONST(-0.541196048259735), COEF_CONST(-0.476434230804443),
1541 COEF_CONST(-0.410524487495422), COEF_CONST(-0.343625843524933),
1542 COEF_CONST(-0.275899350643158), COEF_CONST(-0.207508206367493),
1543 COEF_CONST(-0.138617098331451), COEF_CONST(-0.069392144680023),
1544 COEF_CONST(0), COEF_CONST(0.069392263889313),
1545 COEF_CONST(0.138617157936096), COEF_CONST(0.207508206367493),
1546 COEF_CONST(0.275899469852448), COEF_CONST(0.343625962734222),
1547 COEF_CONST(0.410524636507034), COEF_CONST(0.476434201002121),
1548 COEF_CONST(0.541196107864380), COEF_CONST(0.604654192924500),
1549 COEF_CONST(0.666655719280243), COEF_CONST(0.727051138877869),
1550 COEF_CONST(0.785695075988770), COEF_CONST(0.842446029186249),
1551 COEF_CONST(0.897167563438416), COEF_CONST(0.949727773666382)
1552}; 1525};
1553 1526
1554// Table adapted from codeclib to fit into IRAM 1527// Table adapted from codeclib to fit into IRAM
@@ -1556,59 +1529,52 @@ const uint32_t dct4_revtab[32] ICONST_ATTR = {
1556 0, 24, 12, 22, 6, 30, 11, 19, 3, 27, 15, 21, 5, 29, 9, 17, 1529 0, 24, 12, 22, 6, 30, 11, 19, 3, 27, 15, 21, 5, 29, 9, 17,
1557 1, 25, 13, 23, 7, 31, 10, 18, 2, 26, 14, 20, 4, 28, 8, 16}; 1530 1, 25, 13, 23, 7, 31, 10, 18, 2, 26, 14, 20, 4, 28, 8, 16};
1558 1531
1532// Bufferfly used in dct4_kernel()'s pre- and post-processing
1533#define BUTTERFLY_DCT4(out1, out2, real_part, imag_part, tab, tabidx) \
1534 x_re = real_part; \
1535 x_im = imag_part; \
1536 tmp = MUL_C(x_re + x_im, tab[tabidx++]); \
1537 out1 = MUL_C(x_re , tab[tabidx++]) + tmp; \
1538 out2 = MUL_C(x_im , tab[tabidx++]) + tmp; \
1539
1559/* size 64 only! */ 1540/* size 64 only! */
1560void dct4_kernel(real_t *real, real_t *imag) 1541void dct4_kernel(real_t *real, real_t *imag)
1561{ 1542{
1562 uint32_t i, idx; 1543 uint32_t i, idx, tabidx;
1563 real_t x_re, x_im, tmp; 1544 real_t x_re, x_im, tmp;
1564 FFTComplex xc[32]; /* used for calling codeclib's fft implementation */ 1545 FFTComplex xc[32]; /* used for calling codeclib's fft implementation */
1565 1546
1566 /* Step 2: modulate and pre-rotate for codeclib's fft implementation */ 1547 /* Step 2: modulate and pre-rotate for codeclib's fft implementation */
1567 // 3*32=96 multiplications 1548 // 3*32=96 multiplications
1568 // 3*32=96 additions 1549 // 3*32=96 additions
1569 for (i = 0; i < 32; i++) 1550 for (i = 0, tabidx = 0; i < 32; i++)
1570 { 1551 {
1571 idx = dct4_revtab[i]; 1552 idx = dct4_revtab[i];
1572 x_re = real[i]; 1553 BUTTERFLY_DCT4(xc[idx].im, xc[idx].re, real[i], imag[i], dct4_pre_tab, tabidx);
1573 x_im = imag[i];
1574 tmp = MUL_C(x_re + x_im, dct4_64_tab[i ]);
1575 xc[idx].re = MUL_C(x_im , dct4_64_tab[i + 64]) + tmp;
1576 xc[idx].im = MUL_C(x_re , dct4_64_tab[i + 32]) + tmp;
1577 } 1554 }
1578 1555
1579 /* Step 3: FFT (codeclib's implementation) */ 1556 /* Step 3: FFT (codeclib's implementation) */
1580 ff_fft_calc_c(5, xc); 1557 ff_fft_calc_c(5, xc);
1581 1558
1582 /* Step 4: modulate + reordering */ 1559 /* Step 4: modulate + reordering */
1583 // 3*31+2=95 multiplications 1560 // 3*30+2=92 multiplications
1584 // 3*31+2=95 additions 1561 // 3*30+2=92 additions
1585 x_re = xc[0].re; 1562 imag[0] = xc[0].im;
1586 x_im = xc[0].im; 1563 real[0] = xc[0].re;
1587 tmp = MUL_C(x_re + x_im, dct4_64_tab[0 + 3*32]); 1564 for (i = 1, tabidx = 3*1; i < 16; i++)
1588 real[0] = MUL_C(x_im , dct4_64_tab[0 + 5*32]) + tmp;
1589 imag[0] = MUL_C(x_re , dct4_64_tab[0 + 4*32]) + tmp;
1590 for (i = 1; i < 16; i++)
1591 { 1565 {
1592 idx = 32-i; 1566 idx = 32-i;
1593 x_re = xc[idx].re; 1567 BUTTERFLY_DCT4(imag[i], real[i], xc[idx].re, xc[idx].im, dct4_post_tab, tabidx);
1594 x_im = xc[idx].im;
1595 tmp = MUL_C(x_re + x_im, dct4_64_tab[i + 3*32]);
1596 real[i] = MUL_C(x_im , dct4_64_tab[i + 5*32]) + tmp;
1597 imag[i] = MUL_C(x_re , dct4_64_tab[i + 4*32]) + tmp;
1598 } 1568 }
1599 // i = 16, idx = 16 = reorder_tab[16]; 1569 // i = 16, idx = 16 = reorder_tab[16];
1600 x_re = xc[16].re; 1570 x_re = xc[16].re;
1601 x_im = xc[16].im; 1571 x_im = xc[16].im;
1602 imag[16] = MUL_C(x_im - x_re, dct4_64_tab[16 + 3*32]); 1572 imag[16] = MUL_C(x_im - x_re, COEF_CONST(0.707106769084930));
1603 real[16] = MUL_C(x_re + x_im, dct4_64_tab[16 + 3*32]); 1573 real[16] = MUL_C(x_re + x_im, COEF_CONST(0.707106769084930));
1604 for (i = 17; i < 32; i++) 1574 for (i = 17, tabidx = 3*17; i < 32; i++)
1605 { 1575 {
1606 idx = 32-i; 1576 idx = 32-i;
1607 x_re = xc[idx].re; 1577 BUTTERFLY_DCT4(imag[i], real[i], xc[idx].re, xc[idx].im, dct4_post_tab, tabidx);
1608 x_im = xc[idx].im;
1609 tmp = MUL_C(x_re + x_im, dct4_64_tab[i + 3*32]);
1610 real[i] = MUL_C(x_im , dct4_64_tab[i + 5*32]) + tmp;
1611 imag[i] = MUL_C(x_re , dct4_64_tab[i + 4*32]) + tmp;
1612 } 1578 }
1613} 1579}
1614 1580