fft.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:13k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * FAAC - Freeware Advanced Audio Coder
  3.  * Copyright (C) 2001 Menno Bakker
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2.1 of the License, or (at your option) any later version.
  9.  *
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  * You should have received a copy of the GNU Lesser General Public
  15.  * License along with this library; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  * $Id: fft.c,v 1.3 2001/06/04 23:02:24 wmay Exp $
  19.  */
  20. #include <math.h>
  21. #include <stdlib.h>
  22. #include "fft.h"
  23. #include "util.h"
  24. #define  MAXLOGM     11    /* max FFT length = 2^MAXLOGM */
  25. #define  TWOPI       6.28318530717958647692
  26. #define  SQHALF      0.707106781186547524401
  27. static   double    *tabr[MAXLOGM]; /* tables of butterfly angles */
  28. static void build_table(int logm)
  29. {
  30.    static   int      m, m2, m4, m8, nel, n;
  31.    static   double    *cn, *spcn, *smcn;
  32.    static   double    ang, c, s;
  33.  
  34.    /* Compute a few constants */
  35.    m = 1 << logm; m2 = m / 2; m4 = m2 / 2; m8 = m4 /2;
  36.  
  37.    /* Allocate memory for tables */
  38.    nel = m4 - 2;
  39.    tabr[logm-4] = (double *)AllocMemory(3 * nel * sizeof(double));
  40. /*
  41.    if ((tab[logm-4] = (double *) AllocMemory(3 * nel * sizeof(double))) == NULL) {
  42.       printf("Error : RSFFT : not enough memory for cosine tables.n");
  43.       error_exit();
  44.    }
  45. */
  46.  
  47.    /* Initialize pointers */
  48.    cn  = tabr[logm-4]; spcn  = cn + nel;  smcn  = spcn + nel;
  49.  
  50.    /* Compute tables */
  51.    for (n = 1; n < m4; n++) {
  52.       if (n == m8) continue;
  53.       ang = n * TWOPI / m;
  54.       c = cos(ang); s = sin(ang);
  55.       *cn++ = c; *spcn++ = - (s + c); *smcn++ = s - c;
  56.    }
  57. }
  58.  
  59. /*--------------------------------------------------------------------*
  60.  *    Recursive part of the RSFFT algorithm.  Not externally          *
  61.  *    callable.                                                       *
  62.  *--------------------------------------------------------------------*/
  63.  
  64. static void rsrec(double *x, int logm)
  65. {
  66.    static   int      m, m2, m4, m8, nel, n;
  67.    static   double    *xr1, *xr2, *xi1;
  68.    static   double    *cn, *spcn, *smcn;
  69.    static   double    tmp1, tmp2;
  70.  
  71.    /* Compute trivial cases */
  72.    if (logm < 2) {
  73.       if (logm == 1) {   /* length m = 2 */
  74.          xr2  = x + 1;
  75.          tmp1 = *x + *xr2;
  76.          *xr2 = *x - *xr2;
  77.          *x   = tmp1;
  78.          return;
  79.       }
  80.       else if (logm == 0) return;   /* length m = 1 */
  81.    }
  82.  
  83.    /* Compute a few constants */
  84.    m = 1 << logm; m2 = m / 2; m4 = m2 / 2; m8 = m4 /2;
  85.  
  86.    /* Build tables of butterfly coefficients, if necessary */
  87.    if ((logm >= 4) && (tabr[logm-4] == NULL))
  88.       build_table(logm);
  89.  
  90.    /* Step 1 */
  91.    xr1 = x; xr2 = xr1 + m2;
  92.    for (n = 0; n < m2; n++) {
  93.       tmp1 = *xr1 + *xr2;
  94.       *xr2 = *xr1 - *xr2;
  95.       *xr1 = tmp1;
  96.       xr1++; xr2++;
  97.    }
  98.  
  99.    /* Step 2 */
  100.    xr1 = x + m2 + m4;
  101.    for (n = 0; n < m4; n++) {
  102.       *xr1 = - *xr1;
  103.       xr1++;
  104.    }
  105.  
  106.    /* Step 3: multiplication by W_M^n */
  107.    xr1 = x + m2; xi1 = xr1 + m4;
  108.    if (logm >= 4) {
  109.       nel = m4 - 2;
  110.       cn  = tabr[logm-4]; spcn  = cn + nel;  smcn  = spcn + nel;
  111.    }
  112.    xr1++; xi1++;
  113.    for (n = 1; n < m4; n++) {
  114.       if (n == m8) {
  115.          tmp1 =  SQHALF * (*xr1 + *xi1);
  116.          *xi1 =  SQHALF * (*xi1 - *xr1);
  117.          *xr1 =  tmp1;
  118.       } else {
  119.          tmp2 = *cn++ * (*xr1 + *xi1);
  120.          tmp1 = *spcn++ * *xr1 + tmp2;
  121.          *xr1 = *smcn++ * *xi1 + tmp2;
  122.          *xi1 = tmp1;
  123.       }
  124.       xr1++; xi1++;
  125.    }
  126.  
  127.    /* Call rsrec again with half DFT length */
  128.    rsrec(x, logm-1);
  129.  
  130.    /* Step 4: Call complex DFT routine, with quarter DFT length.
  131.       Constants have to be recomputed, because they are static! */
  132.    m = 1 << logm; m2 = m / 2; m4 = 3 * (m / 4);
  133.    srrec(x + m2, x + m4, logm-2);
  134.  
  135.    /* Step 5: sign change & data reordering */
  136.    m = 1 << logm; m2 = m / 2; m4 = m2 / 2; m8 = m4 / 2;
  137.    xr1 = x + m2 + m4;
  138.    xr2 = x + m - 1;
  139.    for (n = 0; n < m8; n++) {
  140.       tmp1   =    *xr1;
  141.       *xr1++ =  - *xr2;
  142.       *xr2-- =  - tmp1;
  143.    }
  144.    xr1 = x + m2 + 1;
  145.    xr2 = x + m - 2;
  146.    for (n = 0; n < m8; n++) {
  147.       tmp1   =    *xr1;
  148.       *xr1++ =  - *xr2;
  149.       *xr2-- =    tmp1;
  150.       xr1++;
  151.       xr2--;
  152.    }
  153.    if (logm == 2) x[3] = -x[3];
  154. }
  155.  
  156. /*--------------------------------------------------------------------*
  157.  *    Direct transform for real inputs                                *
  158.  *--------------------------------------------------------------------*/
  159.  
  160. /*--------------------------------------------------------------------*
  161.  *    Data unshuffling according to bit-reversed indexing.            *
  162.  *                                                                    *
  163.  *    Bit reversal is done using Evan's algorithm (Ref: D. M. W.      *
  164.  *    Evans, "An improved digit-reversal permutation algorithm ...",  *
  165.  *    IEEE Trans. ASSP, Aug. 1987, pp. 1120-1125).                    *
  166.  *--------------------------------------------------------------------*/
  167. static   int   brseed[256];   /* Evans' seed table */
  168. static   int   brsflg;        /* flag for table building */
  169.  
  170. static void BR_permute(double *x, int logm)
  171. {
  172.    int      i, j, imax, lg2, n;
  173.    int      off, fj, gno, *brp;
  174.    double    tmp, *xp, *xq;
  175.  
  176.    lg2 = logm >> 1;
  177.    n = 1 << lg2;
  178.    if (logm & 1) lg2++;
  179.  
  180.    /* Create seed table if not yet built */
  181.    if (brsflg != logm) {
  182.       brsflg = logm;
  183.       brseed[0] = 0;
  184.       brseed[1] = 1;
  185.       for (j = 2; j <= lg2; j++) {
  186.          imax = 1 << (j - 1);
  187.          for (i = 0; i < imax; i++) {
  188.             brseed[i] <<= 1;
  189.             brseed[i + imax] = brseed[i] + 1;
  190.          }
  191.       }
  192.    }
  193.  
  194.    /* Unshuffling loop */
  195.    for (off = 1; off < n; off++) {
  196.       fj = n * brseed[off]; i = off; j = fj;
  197.       tmp = x[i]; x[i] = x[j]; x[j] = tmp;
  198.       xp = &x[i];
  199.       brp = &brseed[1];
  200.       for (gno = 1; gno < brseed[off]; gno++) {
  201.          xp += n;
  202.          j = fj + *brp++;
  203.          xq = x + j;
  204.          tmp = *xp; *xp = *xq; *xq = tmp;
  205.       }
  206.    }
  207. }
  208.  
  209. /*--------------------------------------------------------------------*
  210.  *    Recursive part of the SRFFT algorithm.                          *
  211.  *--------------------------------------------------------------------*/
  212.  
  213. static void srrec(double *xr, double *xi, int logm)
  214. {
  215.    static   int      m, m2, m4, m8, nel, n;
  216.    static   double    *xr1, *xr2, *xi1, *xi2;
  217.    static   double    *cn, *spcn, *smcn, *c3n, *spc3n, *smc3n;
  218.    static   double    tmp1, tmp2, ang, c, s;
  219.    static   double    *tab[MAXLOGM];
  220.  
  221.    /* Compute trivial cases */
  222.    if (logm < 3) {
  223.       if (logm == 2) {  /* length m = 4 */
  224.          xr2  = xr + 2;
  225.          xi2  = xi + 2;
  226.          tmp1 = *xr + *xr2;
  227.          *xr2 = *xr - *xr2;
  228.          *xr  = tmp1;
  229.          tmp1 = *xi + *xi2;
  230.          *xi2 = *xi - *xi2;
  231.          *xi  = tmp1;
  232.          xr1  = xr + 1;
  233.          xi1  = xi + 1;
  234.          xr2++;
  235.          xi2++;
  236.          tmp1 = *xr1 + *xr2;
  237.          *xr2 = *xr1 - *xr2;
  238.          *xr1 = tmp1;
  239.          tmp1 = *xi1 + *xi2;
  240.          *xi2 = *xi1 - *xi2;
  241.          *xi1 = tmp1;
  242.          xr2  = xr + 1;
  243.          xi2  = xi + 1;
  244.          tmp1 = *xr + *xr2;
  245.          *xr2 = *xr - *xr2;
  246.          *xr  = tmp1;
  247.          tmp1 = *xi + *xi2;
  248.          *xi2 = *xi - *xi2;
  249.          *xi  = tmp1;
  250.          xr1  = xr + 2;
  251.          xi1  = xi + 2;
  252.          xr2  = xr + 3;
  253.          xi2  = xi + 3;
  254.          tmp1 = *xr1 + *xi2;
  255.          tmp2 = *xi1 + *xr2;
  256.          *xi1 = *xi1 - *xr2;
  257.          *xr2 = *xr1 - *xi2;
  258.          *xr1 = tmp1;
  259.          *xi2 = tmp2;
  260.          return;
  261.       }
  262.       else if (logm == 1) {   /* length m = 2 */
  263.          xr2  = xr + 1;
  264.          xi2  = xi + 1;
  265.          tmp1 = *xr + *xr2;
  266.          *xr2 = *xr - *xr2;
  267.          *xr  = tmp1;
  268.          tmp1 = *xi + *xi2;
  269.          *xi2 = *xi - *xi2;
  270.          *xi  = tmp1;
  271.          return;
  272.       }
  273.       else if (logm == 0) return;   /* length m = 1 */
  274.    }
  275.  
  276.    /* Compute a few constants */
  277.    m = 1 << logm; m2 = m / 2; m4 = m2 / 2; m8 = m4 /2;
  278.  
  279.    /* Build tables of butterfly coefficients, if necessary */
  280.    if ((logm >= 4) && (tab[logm-4] == NULL)) {
  281.  
  282.       /* Allocate memory for tables */
  283.       nel = m4 - 2;
  284.   tab[logm-4] = (double *)AllocMemory(6 * nel * sizeof(double));
  285. /*
  286.       if ((tab[logm-4] = (double *)AllocMemory(6 * nel * sizeof(double))) == NULL) {
  287.          error_exit();
  288.       }
  289. */
  290.  
  291.       /* Initialize pointers */
  292.       cn  = tab[logm-4]; spcn  = cn + nel;  smcn  = spcn + nel;
  293.       c3n = smcn + nel;  spc3n = c3n + nel; smc3n = spc3n + nel;
  294.  
  295.       /* Compute tables */
  296.       for (n = 1; n < m4; n++) {
  297.          if (n == m8) continue;
  298.          ang = n * TWOPI / m;
  299.          c = cos(ang); s = sin(ang);
  300.          *cn++ = c; *spcn++ = - (s + c); *smcn++ = s - c;
  301.          ang = 3 * n * TWOPI / m;
  302.          c = cos(ang); s = sin(ang);
  303.          *c3n++ = c; *spc3n++ = - (s + c); *smc3n++ = s - c;
  304.       }
  305.    }
  306.  
  307.    /* Step 1 */
  308.    xr1 = xr; xr2 = xr1 + m2;
  309.    xi1 = xi; xi2 = xi1 + m2;
  310.    for (n = 0; n < m2; n++) {
  311.       tmp1 = *xr1 + *xr2;
  312.       *xr2 = *xr1 - *xr2;
  313.       *xr1 = tmp1;
  314.       tmp2 = *xi1 + *xi2;
  315.       *xi2 = *xi1 - *xi2;
  316.       *xi1 = tmp2;
  317.       xr1++; xr2++; xi1++; xi2++;
  318.    }
  319.  
  320.    /* Step 2 */
  321.    xr1 = xr + m2; xr2 = xr1 + m4;
  322.    xi1 = xi + m2; xi2 = xi1 + m4;
  323.    for (n = 0; n < m4; n++) {
  324.       tmp1 = *xr1 + *xi2;
  325.       tmp2 = *xi1 + *xr2;
  326.       *xi1 = *xi1 - *xr2;
  327.       *xr2 = *xr1 - *xi2;
  328.       *xr1 = tmp1;
  329.       *xi2 = tmp2;
  330.       xr1++; xr2++; xi1++; xi2++;
  331.    }
  332.  
  333.    /* Steps 3 & 4 */
  334.    xr1 = xr + m2; xr2 = xr1 + m4;
  335.    xi1 = xi + m2; xi2 = xi1 + m4;
  336.    if (logm >= 4) {
  337.       nel = m4 - 2;
  338.       cn  = tab[logm-4]; spcn  = cn + nel;  smcn  = spcn + nel;
  339.       c3n = smcn + nel;  spc3n = c3n + nel; smc3n = spc3n + nel;
  340.    }
  341.    xr1++; xr2++; xi1++; xi2++;
  342.    for (n = 1; n < m4; n++) {
  343.       if (n == m8) {
  344.          tmp1 =  SQHALF * (*xr1 + *xi1);
  345.          *xi1 =  SQHALF * (*xi1 - *xr1);
  346.          *xr1 =  tmp1;
  347.          tmp2 =  SQHALF * (*xi2 - *xr2);
  348.          *xi2 = -SQHALF * (*xr2 + *xi2);
  349.          *xr2 =  tmp2;
  350.       } else {
  351.          tmp2 = *cn++ * (*xr1 + *xi1);
  352.          tmp1 = *spcn++ * *xr1 + tmp2;
  353.          *xr1 = *smcn++ * *xi1 + tmp2;
  354.          *xi1 = tmp1;
  355.          tmp2 = *c3n++ * (*xr2 + *xi2);
  356.          tmp1 = *spc3n++ * *xr2 + tmp2;
  357.          *xr2 = *smc3n++ * *xi2 + tmp2;
  358.          *xi2 = tmp1;
  359.       }
  360.       xr1++; xr2++; xi1++; xi2++;
  361.    }
  362.  
  363.    /* Call ssrec again with half DFT length */
  364.    srrec(xr, xi, logm-1);
  365.  
  366.    /* Call ssrec again twice with one quarter DFT length.
  367.       Constants have to be recomputed, because they are static! */
  368.    m = 1 << logm; m2 = m / 2;
  369.    srrec(xr + m2, xi + m2, logm-2);
  370.    m = 1 << logm; m4 = 3 * (m / 4);
  371.    srrec(xr + m4, xi + m4, logm-2);
  372. }
  373.  
  374. /*--------------------------------------------------------------------*
  375.  *    Direct transform                                                *
  376.  *--------------------------------------------------------------------*/
  377. void  srfft(double *xr, double *xi, int logm)
  378. {
  379.    /* Call recursive routine */
  380.    srrec(xr, xi, logm);
  381.  
  382.    /* Output array unshuffling using bit-reversed indices */
  383.    if (logm > 1) {
  384.       BR_permute(xr, logm);
  385.       BR_permute(xi, logm);
  386.    }
  387. }
  388.  
  389. /*--------------------------------------------------------------------*
  390.  *    Inverse transform.  Uses Duhamel's trick (Ref: P. Duhamel       *
  391.  *    et. al., "On computing the inverse DFT", IEEE Trans. ASSP,      *
  392.  *    Feb. 1988, pp. 285-286).                                        *
  393.  *--------------------------------------------------------------------*/
  394. void srifft(double *xr, double *xi, int logm)
  395. {
  396.    int      i, m;
  397.    double    fac, *xrp, *xip;
  398.  
  399.    /* Call direct FFT, swapping real & imaginary addresses */
  400.    srfft(xi, xr, logm);
  401.  
  402.    /* Normalization */
  403.    m = 1 << logm;
  404.    fac = 1.0 / m;
  405.    xrp = xr; xip = xi;
  406.    for (i = 0; i < m; i++) {
  407.       *xrp++ *= fac;
  408.       *xip++ *= fac;
  409.    }
  410. }
  411. void rsfft(double *x, int logm)
  412. {
  413.    /* Call recursive routine */
  414.    rsrec(x, logm);
  415.  
  416.    /* Output array unshuffling using bit-reversed indices */
  417.    if (logm > 1) {
  418.       BR_permute(x, logm);
  419.    }
  420. }