imdct.c
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:12k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*
  2.  * imdct.c
  3.  * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
  4.  * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
  5.  *
  6.  * The ifft algorithms in this file have been largely inspired by Dan
  7.  * Bernstein's work, djbfft, available at http://cr.yp.to/djbfft.html
  8.  *
  9.  * This file is part of a52dec, a free ATSC A-52 stream decoder.
  10.  * See http://liba52.sourceforge.net/ for updates.
  11.  *
  12.  * a52dec is free software; you can redistribute it and/or modify
  13.  * it under the terms of the GNU General Public License as published by
  14.  * the Free Software Foundation; either version 2 of the License, or
  15.  * (at your option) any later version.
  16.  *
  17.  * a52dec is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  * GNU General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU General Public License
  23.  * along with this program; if not, write to the Free Software
  24.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  25.  */
  26. #include "config.h"
  27. #include <math.h>
  28. #include <stdio.h>
  29. #ifdef LIBA52_DJBFFT
  30. #include <fftc4.h>
  31. #endif
  32. #ifndef M_PI
  33. #define M_PI 3.1415926535897932384626433832795029
  34. #endif
  35. #include <inttypes.h>
  36. #include "a52.h"
  37. #include "a52_internal.h"
  38. //#include "mm_accel.h"
  39. typedef struct complex_s {
  40.     sample_t real;
  41.     sample_t imag;
  42. } complex_t;
  43. static uint8_t fftorder[] = {
  44.       0,128, 64,192, 32,160,224, 96, 16,144, 80,208,240,112, 48,176,
  45.       8,136, 72,200, 40,168,232,104,248,120, 56,184, 24,152,216, 88,
  46.       4,132, 68,196, 36,164,228,100, 20,148, 84,212,244,116, 52,180,
  47.     252,124, 60,188, 28,156,220, 92, 12,140, 76,204,236,108, 44,172,
  48.       2,130, 66,194, 34,162,226, 98, 18,146, 82,210,242,114, 50,178,
  49.      10,138, 74,202, 42,170,234,106,250,122, 58,186, 26,154,218, 90,
  50.     254,126, 62,190, 30,158,222, 94, 14,142, 78,206,238,110, 46,174,
  51.       6,134, 70,198, 38,166,230,102,246,118, 54,182, 22,150,214, 86
  52. };
  53. /* Root values for IFFT */
  54. static sample_t roots16[3];
  55. static sample_t roots32[7];
  56. static sample_t roots64[15];
  57. static sample_t roots128[31];
  58. /* Twiddle factors for IMDCT */
  59. static complex_t pre1[128];
  60. static complex_t post1[64];
  61. static complex_t pre2[64];
  62. static complex_t post2[32];
  63. static sample_t a52_imdct_window[256];
  64. static void (* ifft128) (complex_t * buf);
  65. static void (* ifft64) (complex_t * buf);
  66. static inline void ifft2 (complex_t * buf)
  67. {
  68.     double r, i;
  69.     r = buf[0].real;
  70.     i = buf[0].imag;
  71.     buf[0].real += buf[1].real;
  72.     buf[0].imag += buf[1].imag;
  73.     buf[1].real = r - buf[1].real;
  74.     buf[1].imag = i - buf[1].imag;
  75. }
  76. static inline void ifft4 (complex_t * buf)
  77. {
  78.     double tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
  79.     tmp1 = buf[0].real + buf[1].real;
  80.     tmp2 = buf[3].real + buf[2].real;
  81.     tmp3 = buf[0].imag + buf[1].imag;
  82.     tmp4 = buf[2].imag + buf[3].imag;
  83.     tmp5 = buf[0].real - buf[1].real;
  84.     tmp6 = buf[0].imag - buf[1].imag;
  85.     tmp7 = buf[2].imag - buf[3].imag;
  86.     tmp8 = buf[3].real - buf[2].real;
  87.     buf[0].real = tmp1 + tmp2;
  88.     buf[0].imag = tmp3 + tmp4;
  89.     buf[2].real = tmp1 - tmp2;
  90.     buf[2].imag = tmp3 - tmp4;
  91.     buf[1].real = tmp5 + tmp7;
  92.     buf[1].imag = tmp6 + tmp8;
  93.     buf[3].real = tmp5 - tmp7;
  94.     buf[3].imag = tmp6 - tmp8;
  95. }
  96. /* the basic split-radix ifft butterfly */
  97. #define BUTTERFLY(a0,a1,a2,a3,wr,wi) do {
  98.     tmp5 = a2.real * wr + a2.imag * wi;
  99.     tmp6 = a2.imag * wr - a2.real * wi;
  100.     tmp7 = a3.real * wr - a3.imag * wi;
  101.     tmp8 = a3.imag * wr + a3.real * wi;
  102.     tmp1 = tmp5 + tmp7;
  103.     tmp2 = tmp6 + tmp8;
  104.     tmp3 = tmp6 - tmp8;
  105.     tmp4 = tmp7 - tmp5;
  106.     a2.real = a0.real - tmp1;
  107.     a2.imag = a0.imag - tmp2;
  108.     a3.real = a1.real - tmp3;
  109.     a3.imag = a1.imag - tmp4;
  110.     a0.real += tmp1;
  111.     a0.imag += tmp2;
  112.     a1.real += tmp3;
  113.     a1.imag += tmp4;
  114. } while (0)
  115. /* split-radix ifft butterfly, specialized for wr=1 wi=0 */
  116. #define BUTTERFLY_ZERO(a0,a1,a2,a3) do {
  117.     tmp1 = a2.real + a3.real;
  118.     tmp2 = a2.imag + a3.imag;
  119.     tmp3 = a2.imag - a3.imag;
  120.     tmp4 = a3.real - a2.real;
  121.     a2.real = a0.real - tmp1;
  122.     a2.imag = a0.imag - tmp2;
  123.     a3.real = a1.real - tmp3;
  124.     a3.imag = a1.imag - tmp4;
  125.     a0.real += tmp1;
  126.     a0.imag += tmp2;
  127.     a1.real += tmp3;
  128.     a1.imag += tmp4;
  129. } while (0)
  130. /* split-radix ifft butterfly, specialized for wr=wi */
  131. #define BUTTERFLY_HALF(a0,a1,a2,a3,w) do {
  132.     tmp5 = (a2.real + a2.imag) * w;
  133.     tmp6 = (a2.imag - a2.real) * w;
  134.     tmp7 = (a3.real - a3.imag) * w;
  135.     tmp8 = (a3.imag + a3.real) * w;
  136.     tmp1 = tmp5 + tmp7;
  137.     tmp2 = tmp6 + tmp8;
  138.     tmp3 = tmp6 - tmp8;
  139.     tmp4 = tmp7 - tmp5;
  140.     a2.real = a0.real - tmp1;
  141.     a2.imag = a0.imag - tmp2;
  142.     a3.real = a1.real - tmp3;
  143.     a3.imag = a1.imag - tmp4;
  144.     a0.real += tmp1;
  145.     a0.imag += tmp2;
  146.     a1.real += tmp3;
  147.     a1.imag += tmp4;
  148. } while (0)
  149. static inline void ifft8 (complex_t * buf)
  150. {
  151.     double tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
  152.     ifft4 (buf);
  153.     ifft2 (buf + 4);
  154.     ifft2 (buf + 6);
  155.     BUTTERFLY_ZERO (buf[0], buf[2], buf[4], buf[6]);
  156.     BUTTERFLY_HALF (buf[1], buf[3], buf[5], buf[7], roots16[1]);
  157. }
  158. static void ifft_pass (complex_t * buf, sample_t * weight, int n)
  159. {
  160.     complex_t * buf1;
  161.     complex_t * buf2;
  162.     complex_t * buf3;
  163.     double tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
  164.     int i;
  165.     buf++;
  166.     buf1 = buf + n;
  167.     buf2 = buf + 2 * n;
  168.     buf3 = buf + 3 * n;
  169.     BUTTERFLY_ZERO (buf[-1], buf1[-1], buf2[-1], buf3[-1]);
  170.     i = n - 1;
  171.     do {
  172. BUTTERFLY (buf[0], buf1[0], buf2[0], buf3[0], weight[n], weight[2*i]);
  173. buf++;
  174. buf1++;
  175. buf2++;
  176. buf3++;
  177. weight++;
  178.     } while (--i);
  179. }
  180. static void ifft16 (complex_t * buf)
  181. {
  182.     ifft8 (buf);
  183.     ifft4 (buf + 8);
  184.     ifft4 (buf + 12);
  185.     ifft_pass (buf, roots16 - 4, 4);
  186. }
  187. static void ifft32 (complex_t * buf)
  188. {
  189.     ifft16 (buf);
  190.     ifft8 (buf + 16);
  191.     ifft8 (buf + 24);
  192.     ifft_pass (buf, roots32 - 8, 8);
  193. }
  194. static void ifft64_c (complex_t * buf)
  195. {
  196.     ifft32 (buf);
  197.     ifft16 (buf + 32);
  198.     ifft16 (buf + 48);
  199.     ifft_pass (buf, roots64 - 16, 16);
  200. }
  201. static void ifft128_c (complex_t * buf)
  202. {
  203.     ifft32 (buf);
  204.     ifft16 (buf + 32);
  205.     ifft16 (buf + 48);
  206.     ifft_pass (buf, roots64 - 16, 16);
  207.     ifft32 (buf + 64);
  208.     ifft32 (buf + 96);
  209.     ifft_pass (buf, roots128 - 32, 32);
  210. }
  211. void a52_imdct_512 (sample_t * data, sample_t * delay, sample_t bias)
  212. {
  213.     int i, k;
  214.     sample_t t_r, t_i, a_r, a_i, b_r, b_i, w_1, w_2;
  215.     const sample_t * window = a52_imdct_window;
  216.     complex_t buf[128];
  217.     for (i = 0; i < 128; i++) {
  218. k = fftorder[i];
  219. t_r = pre1[i].real;
  220. t_i = pre1[i].imag;
  221. buf[i].real = t_i * data[255-k] + t_r * data[k];
  222. buf[i].imag = t_r * data[255-k] - t_i * data[k];
  223.     }
  224.     ifft128 (buf);
  225.     /* Post IFFT complex multiply plus IFFT complex conjugate*/
  226.     /* Window and convert to real valued signal */
  227.     for (i = 0; i < 64; i++) {
  228. /* y[n] = z[n] * (xcos1[n] + j * xsin1[n]) ; */
  229. t_r = post1[i].real;
  230. t_i = post1[i].imag;
  231. a_r = t_r * buf[i].real     + t_i * buf[i].imag;
  232. a_i = t_i * buf[i].real     - t_r * buf[i].imag;
  233. b_r = t_i * buf[127-i].real + t_r * buf[127-i].imag;
  234. b_i = t_r * buf[127-i].real - t_i * buf[127-i].imag;
  235. w_1 = window[2*i];
  236. w_2 = window[255-2*i];
  237. data[2*i]     = delay[2*i] * w_2 - a_r * w_1 + bias;
  238. data[255-2*i] = delay[2*i] * w_1 + a_r * w_2 + bias;
  239. delay[2*i] = a_i;
  240. w_1 = window[2*i+1];
  241. w_2 = window[254-2*i];
  242. data[2*i+1]   = delay[2*i+1] * w_2 + b_r * w_1 + bias;
  243. data[254-2*i] = delay[2*i+1] * w_1 - b_r * w_2 + bias;
  244. delay[2*i+1] = b_i;
  245.     }
  246. }
  247. void a52_imdct_256(sample_t * data, sample_t * delay, sample_t bias)
  248. {
  249.     int i, k;
  250.     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;
  251.     const sample_t * window = a52_imdct_window;
  252.     complex_t buf1[64], buf2[64];
  253.     /* Pre IFFT complex multiply plus IFFT cmplx conjugate */
  254.     for (i = 0; i < 64; i++) {
  255. k = fftorder[i];
  256. t_r = pre2[i].real;
  257. t_i = pre2[i].imag;
  258. buf1[i].real = t_i * data[254-k] + t_r * data[k];
  259. buf1[i].imag = t_r * data[254-k] - t_i * data[k];
  260. buf2[i].real = t_i * data[255-k] + t_r * data[k+1];
  261. buf2[i].imag = t_r * data[255-k] - t_i * data[k+1];
  262.     }
  263.     ifft64 (buf1);
  264.     ifft64 (buf2);
  265.     /* Post IFFT complex multiply */
  266.     /* Window and convert to real valued signal */
  267.     for (i = 0; i < 32; i++) {
  268. /* y1[n] = z1[n] * (xcos2[n] + j * xs in2[n]) ; */ 
  269. t_r = post2[i].real;
  270. t_i = post2[i].imag;
  271. a_r = t_r * buf1[i].real    + t_i * buf1[i].imag;
  272. a_i = t_i * buf1[i].real    - t_r * buf1[i].imag;
  273. b_r = t_i * buf1[63-i].real + t_r * buf1[63-i].imag;
  274. b_i = t_r * buf1[63-i].real - t_i * buf1[63-i].imag;
  275. c_r = t_r * buf2[i].real    + t_i * buf2[i].imag;
  276. c_i = t_i * buf2[i].real    - t_r * buf2[i].imag;
  277. d_r = t_i * buf2[63-i].real + t_r * buf2[63-i].imag;
  278. d_i = t_r * buf2[63-i].real - t_i * buf2[63-i].imag;
  279. w_1 = window[2*i];
  280. w_2 = window[255-2*i];
  281. data[2*i]     = delay[2*i] * w_2 - a_r * w_1 + bias;
  282. data[255-2*i] = delay[2*i] * w_1 + a_r * w_2 + bias;
  283. delay[2*i] = c_i;
  284. w_1 = window[128+2*i];
  285. w_2 = window[127-2*i];
  286. data[128+2*i] = delay[127-2*i] * w_2 + a_i * w_1 + bias;
  287. data[127-2*i] = delay[127-2*i] * w_1 - a_i * w_2 + bias;
  288. delay[127-2*i] = c_r;
  289. w_1 = window[2*i+1];
  290. w_2 = window[254-2*i];
  291. data[2*i+1]   = delay[2*i+1] * w_2 - b_i * w_1 + bias;
  292. data[254-2*i] = delay[2*i+1] * w_1 + b_i * w_2 + bias;
  293. delay[2*i+1] = d_r;
  294. w_1 = window[129+2*i];
  295. w_2 = window[126-2*i];
  296. data[129+2*i] = delay[126-2*i] * w_2 + b_r * w_1 + bias;
  297. data[126-2*i] = delay[126-2*i] * w_1 - b_r * w_2 + bias;
  298. delay[126-2*i] = d_i;
  299.     }
  300. }
  301. static double besselI0 (double x)
  302. {
  303.     double bessel = 1;
  304.     int i = 100;
  305.     do
  306. bessel = bessel * x / (i * i) + 1;
  307.     while (--i);
  308.     return bessel;
  309. }
  310. void a52_imdct_init (uint32_t mm_accel)
  311. {
  312.     int i, k;
  313.     double sum;
  314.     /* compute imdct window - kaiser-bessel derived window, alpha = 5.0 */
  315.     sum = 0;
  316.     for (i = 0; i < 256; i++) {
  317. sum += besselI0 (i * (256 - i) * (5 * M_PI / 256) * (5 * M_PI / 256));
  318. a52_imdct_window[i] = sum;
  319.     }
  320.     sum++;
  321.     for (i = 0; i < 256; i++)
  322. a52_imdct_window[i] = sqrt (a52_imdct_window[i] / sum);
  323.     for (i = 0; i < 3; i++)
  324. roots16[i] = cos ((M_PI / 8) * (i + 1));
  325.     for (i = 0; i < 7; i++)
  326. roots32[i] = cos ((M_PI / 16) * (i + 1));
  327.     for (i = 0; i < 15; i++)
  328. roots64[i] = cos ((M_PI / 32) * (i + 1));
  329.     for (i = 0; i < 31; i++)
  330. roots128[i] = cos ((M_PI / 64) * (i + 1));
  331.     for (i = 0; i < 64; i++) {
  332. k = fftorder[i] / 2 + 64;
  333. pre1[i].real = cos ((M_PI / 256) * (k - 0.25));
  334. pre1[i].imag = sin ((M_PI / 256) * (k - 0.25));
  335.     }
  336.     for (i = 64; i < 128; i++) {
  337. k = fftorder[i] / 2 + 64;
  338. pre1[i].real = -cos ((M_PI / 256) * (k - 0.25));
  339. pre1[i].imag = -sin ((M_PI / 256) * (k - 0.25));
  340.     }
  341.     for (i = 0; i < 64; i++) {
  342. post1[i].real = cos ((M_PI / 256) * (i + 0.5));
  343. post1[i].imag = sin ((M_PI / 256) * (i + 0.5));
  344.     }
  345.     for (i = 0; i < 64; i++) {
  346. k = fftorder[i] / 4;
  347. pre2[i].real = cos ((M_PI / 128) * (k - 0.25));
  348. pre2[i].imag = sin ((M_PI / 128) * (k - 0.25));
  349.     }
  350.     for (i = 0; i < 32; i++) {
  351. post2[i].real = cos ((M_PI / 128) * (i + 0.5));
  352. post2[i].imag = sin ((M_PI / 128) * (i + 0.5));
  353.     }
  354. #ifdef LIBA52_DJBFFT
  355.     if (mm_accel & MM_ACCEL_DJBFFT) {
  356. fprintf (stderr, "Using djbfft for IMDCT transformn");
  357. ifft128 = (void (*) (complex_t *)) fftc4_un128;
  358. ifft64 = (void (*) (complex_t *)) fftc4_un64;
  359.     } else
  360. #endif
  361.     {
  362. fprintf (stderr, "No accelerated IMDCT transform foundn");
  363. ifft128 = ifft128_c;
  364. ifft64 = ifft64_c;
  365.     }
  366. }