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

多媒体编程

开发平台:

Visual C++

  1. /*
  2. ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
  3. ** Copyright (C) 2003-2005 M. Bakker, Ahead Software AG, http://www.nero.com
  4. **  
  5. ** This program is free software; you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation; either version 2 of the License, or
  8. ** (at your option) any later version.
  9. ** 
  10. ** This program 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
  13. ** GNU General Public License for more details.
  14. ** 
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program; if not, write to the Free Software 
  17. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. **
  19. ** Any non-GPL usage of this software or parts of this software is strictly
  20. ** forbidden.
  21. **
  22. ** Software using this code must display the following message visibly in the
  23. ** software:
  24. ** "FAAD2 AAC/HE-AAC/HE-AACv2/DRM decoder (c) Ahead Software, www.nero.com"
  25. ** in, for example, the about-box or help/startup screen.
  26. **
  27. ** Commercial non-GPL licensing of this software is possible.
  28. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
  29. **
  30. ** $Id: cfft.c,v 1.2 2005/11/01 21:41:43 gabest Exp $
  31. **/
  32. /*
  33.  * Algorithmically based on Fortran-77 FFTPACK
  34.  * by Paul N. Swarztrauber(Version 4, 1985).
  35.  *
  36.  * Does even sized fft only
  37.  */
  38. /* isign is +1 for backward and -1 for forward transforms */
  39. #include "common.h"
  40. #include "structs.h"
  41. #include <stdlib.h>
  42. #include "cfft.h"
  43. #include "cfft_tab.h"
  44. /* static function declarations */
  45. static void passf2pos(const uint16_t ido, const uint16_t l1, const complex_t *cc,
  46.                       complex_t *ch, const complex_t *wa);
  47. static void passf2neg(const uint16_t ido, const uint16_t l1, const complex_t *cc,
  48.                       complex_t *ch, const complex_t *wa);
  49. static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc,
  50.                    complex_t *ch, const complex_t *wa1, const complex_t *wa2, const int8_t isign);
  51. static void passf4pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch,
  52.                       const complex_t *wa1, const complex_t *wa2, const complex_t *wa3);
  53. static void passf4neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch,
  54.                       const complex_t *wa1, const complex_t *wa2, const complex_t *wa3);
  55. static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch,
  56.                    const complex_t *wa1, const complex_t *wa2, const complex_t *wa3,
  57.                    const complex_t *wa4, const int8_t isign);
  58. INLINE void cfftf1(uint16_t n, complex_t *c, complex_t *ch,
  59.                    const uint16_t *ifac, const complex_t *wa, const int8_t isign);
  60. static void cffti1(uint16_t n, complex_t *wa, uint16_t *ifac);
  61. /*----------------------------------------------------------------------
  62.    passf2, passf3, passf4, passf5. Complex FFT passes fwd and bwd.
  63.   ----------------------------------------------------------------------*/
  64. static void passf2pos(const uint16_t ido, const uint16_t l1, const complex_t *cc,
  65.                       complex_t *ch, const complex_t *wa)
  66. {
  67.     uint16_t i, k, ah, ac;
  68.     if (ido == 1)
  69.     {
  70.         for (k = 0; k < l1; k++)
  71.         {
  72.             ah = 2*k;
  73.             ac = 4*k;
  74.             RE(ch[ah])    = RE(cc[ac]) + RE(cc[ac+1]);
  75.             RE(ch[ah+l1]) = RE(cc[ac]) - RE(cc[ac+1]);
  76.             IM(ch[ah])    = IM(cc[ac]) + IM(cc[ac+1]);
  77.             IM(ch[ah+l1]) = IM(cc[ac]) - IM(cc[ac+1]);
  78.         }
  79.     } else {
  80.         for (k = 0; k < l1; k++)
  81.         {
  82.             ah = k*ido;
  83.             ac = 2*k*ido;
  84.             for (i = 0; i < ido; i++)
  85.             {
  86.                 complex_t t2;
  87.                 RE(ch[ah+i]) = RE(cc[ac+i]) + RE(cc[ac+i+ido]);
  88.                 RE(t2)       = RE(cc[ac+i]) - RE(cc[ac+i+ido]);
  89.                 IM(ch[ah+i]) = IM(cc[ac+i]) + IM(cc[ac+i+ido]);
  90.                 IM(t2)       = IM(cc[ac+i]) - IM(cc[ac+i+ido]);
  91. #if 1
  92.                 ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]),
  93.                     IM(t2), RE(t2), RE(wa[i]), IM(wa[i]));
  94. #else
  95.                 ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]),
  96.                     RE(t2), IM(t2), RE(wa[i]), IM(wa[i]));
  97. #endif
  98.             }
  99.         }
  100.     }
  101. }
  102. static void passf2neg(const uint16_t ido, const uint16_t l1, const complex_t *cc,
  103.                       complex_t *ch, const complex_t *wa)
  104. {
  105.     uint16_t i, k, ah, ac;
  106.     if (ido == 1)
  107.     {
  108.         for (k = 0; k < l1; k++)
  109.         {
  110.             ah = 2*k;
  111.             ac = 4*k;
  112.             RE(ch[ah])    = RE(cc[ac]) + RE(cc[ac+1]);
  113.             RE(ch[ah+l1]) = RE(cc[ac]) - RE(cc[ac+1]);
  114.             IM(ch[ah])    = IM(cc[ac]) + IM(cc[ac+1]);
  115.             IM(ch[ah+l1]) = IM(cc[ac]) - IM(cc[ac+1]);
  116.         }
  117.     } else {
  118.         for (k = 0; k < l1; k++)
  119.         {
  120.             ah = k*ido;
  121.             ac = 2*k*ido;
  122.             for (i = 0; i < ido; i++)
  123.             {
  124.                 complex_t t2;
  125.                 RE(ch[ah+i]) = RE(cc[ac+i]) + RE(cc[ac+i+ido]);
  126.                 RE(t2)       = RE(cc[ac+i]) - RE(cc[ac+i+ido]);
  127.                 IM(ch[ah+i]) = IM(cc[ac+i]) + IM(cc[ac+i+ido]);
  128.                 IM(t2)       = IM(cc[ac+i]) - IM(cc[ac+i+ido]);
  129. #if 1
  130.                 ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]),
  131.                     RE(t2), IM(t2), RE(wa[i]), IM(wa[i]));
  132. #else
  133.                 ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]),
  134.                     IM(t2), RE(t2), RE(wa[i]), IM(wa[i]));
  135. #endif
  136.             }
  137.         }
  138.     }
  139. }
  140. static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc,
  141.                    complex_t *ch, const complex_t *wa1, const complex_t *wa2,
  142.                    const int8_t isign)
  143. {
  144.     static real_t taur = FRAC_CONST(-0.5);
  145.     static real_t taui = FRAC_CONST(0.866025403784439);
  146.     uint16_t i, k, ac, ah;
  147.     complex_t c2, c3, d2, d3, t2;
  148.     if (ido == 1)
  149.     {
  150.         if (isign == 1)
  151.         {
  152.             for (k = 0; k < l1; k++)
  153.             {
  154.                 ac = 3*k+1;
  155.                 ah = k;
  156.                 RE(t2) = RE(cc[ac]) + RE(cc[ac+1]);
  157.                 IM(t2) = IM(cc[ac]) + IM(cc[ac+1]);
  158.                 RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),taur);
  159.                 IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),taur);
  160.                 RE(ch[ah]) = RE(cc[ac-1]) + RE(t2);
  161.                 IM(ch[ah]) = IM(cc[ac-1]) + IM(t2);
  162.                 RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+1])), taui);
  163.                 IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+1])), taui);
  164.                 RE(ch[ah+l1]) = RE(c2) - IM(c3);
  165.                 IM(ch[ah+l1]) = IM(c2) + RE(c3);
  166.                 RE(ch[ah+2*l1]) = RE(c2) + IM(c3);
  167.                 IM(ch[ah+2*l1]) = IM(c2) - RE(c3);
  168.             }
  169.         } else {
  170.             for (k = 0; k < l1; k++)
  171.             {
  172.                 ac = 3*k+1;
  173.                 ah = k;
  174.                 RE(t2) = RE(cc[ac]) + RE(cc[ac+1]);
  175.                 IM(t2) = IM(cc[ac]) + IM(cc[ac+1]);
  176.                 RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),taur);
  177.                 IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),taur);
  178.                 RE(ch[ah]) = RE(cc[ac-1]) + RE(t2);
  179.                 IM(ch[ah]) = IM(cc[ac-1]) + IM(t2);
  180.                 RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+1])), taui);
  181.                 IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+1])), taui);
  182.                 RE(ch[ah+l1]) = RE(c2) + IM(c3);
  183.                 IM(ch[ah+l1]) = IM(c2) - RE(c3);
  184.                 RE(ch[ah+2*l1]) = RE(c2) - IM(c3);
  185.                 IM(ch[ah+2*l1]) = IM(c2) + RE(c3);
  186.             }
  187.         }
  188.     } else {
  189.         if (isign == 1)
  190.         {
  191.             for (k = 0; k < l1; k++)
  192.             {
  193.                 for (i = 0; i < ido; i++)
  194.                 {
  195.                     ac = i + (3*k+1)*ido;
  196.                     ah = i + k * ido;
  197.                     RE(t2) = RE(cc[ac]) + RE(cc[ac+ido]);
  198.                     RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),taur);
  199.                     IM(t2) = IM(cc[ac]) + IM(cc[ac+ido]);
  200.                     IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),taur);
  201.                     RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2);
  202.                     IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2);
  203.                     RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+ido])), taui);
  204.                     IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+ido])), taui);
  205.                     RE(d2) = RE(c2) - IM(c3);
  206.                     IM(d3) = IM(c2) - RE(c3);
  207.                     RE(d3) = RE(c2) + IM(c3);
  208.                     IM(d2) = IM(c2) + RE(c3);
  209. #if 1
  210.                     ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]),
  211.                         IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i]));
  212.                     ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]),
  213.                         IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i]));
  214. #else
  215.                     ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]),
  216.                         RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i]));
  217.                     ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]),
  218.                         RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i]));
  219. #endif
  220.                 }
  221.             }
  222.         } else {
  223.             for (k = 0; k < l1; k++)
  224.             {
  225.                 for (i = 0; i < ido; i++)
  226.                 {
  227.                     ac = i + (3*k+1)*ido;
  228.                     ah = i + k * ido;
  229.                     RE(t2) = RE(cc[ac]) + RE(cc[ac+ido]);
  230.                     RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),taur);
  231.                     IM(t2) = IM(cc[ac]) + IM(cc[ac+ido]);
  232.                     IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),taur);
  233.                     RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2);
  234.                     IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2);
  235.                     RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+ido])), taui);
  236.                     IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+ido])), taui);
  237.                     RE(d2) = RE(c2) + IM(c3);
  238.                     IM(d3) = IM(c2) + RE(c3);
  239.                     RE(d3) = RE(c2) - IM(c3);
  240.                     IM(d2) = IM(c2) - RE(c3);
  241. #if 1
  242.                     ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]),
  243.                         RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i]));
  244.                     ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]),
  245.                         RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i]));
  246. #else
  247.                     ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]),
  248.                         IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i]));
  249.                     ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]),
  250.                         IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i]));
  251. #endif
  252.                 }
  253.             }
  254.         }
  255.     }
  256. }
  257. static void passf4pos(const uint16_t ido, const uint16_t l1, const complex_t *cc,
  258.                       complex_t *ch, const complex_t *wa1, const complex_t *wa2,
  259.                       const complex_t *wa3)
  260. {
  261.     uint16_t i, k, ac, ah;
  262.     if (ido == 1)
  263.     {
  264.         for (k = 0; k < l1; k++)
  265.         {
  266.             complex_t t1, t2, t3, t4;
  267.             ac = 4*k;
  268.             ah = k;
  269.             RE(t2) = RE(cc[ac])   + RE(cc[ac+2]);
  270.             RE(t1) = RE(cc[ac])   - RE(cc[ac+2]);
  271.             IM(t2) = IM(cc[ac])   + IM(cc[ac+2]);
  272.             IM(t1) = IM(cc[ac])   - IM(cc[ac+2]);
  273.             RE(t3) = RE(cc[ac+1]) + RE(cc[ac+3]);
  274.             IM(t4) = RE(cc[ac+1]) - RE(cc[ac+3]);
  275.             IM(t3) = IM(cc[ac+3]) + IM(cc[ac+1]);
  276.             RE(t4) = IM(cc[ac+3]) - IM(cc[ac+1]);
  277.             RE(ch[ah])      = RE(t2) + RE(t3);
  278.             RE(ch[ah+2*l1]) = RE(t2) - RE(t3);
  279.             IM(ch[ah])      = IM(t2) + IM(t3);
  280.             IM(ch[ah+2*l1]) = IM(t2) - IM(t3);
  281.             RE(ch[ah+l1])   = RE(t1) + RE(t4);
  282.             RE(ch[ah+3*l1]) = RE(t1) - RE(t4);
  283.             IM(ch[ah+l1])   = IM(t1) + IM(t4);
  284.             IM(ch[ah+3*l1]) = IM(t1) - IM(t4);
  285.         }
  286.     } else {
  287.         for (k = 0; k < l1; k++)
  288.         {
  289.             ac = 4*k*ido;
  290.             ah = k*ido;
  291.             for (i = 0; i < ido; i++)
  292.             {
  293.                 complex_t c2, c3, c4, t1, t2, t3, t4;
  294.                 RE(t2) = RE(cc[ac+i]) + RE(cc[ac+i+2*ido]);
  295.                 RE(t1) = RE(cc[ac+i]) - RE(cc[ac+i+2*ido]);
  296.                 IM(t2) = IM(cc[ac+i]) + IM(cc[ac+i+2*ido]);
  297.                 IM(t1) = IM(cc[ac+i]) - IM(cc[ac+i+2*ido]);
  298.                 RE(t3) = RE(cc[ac+i+ido]) + RE(cc[ac+i+3*ido]);
  299.                 IM(t4) = RE(cc[ac+i+ido]) - RE(cc[ac+i+3*ido]);
  300.                 IM(t3) = IM(cc[ac+i+3*ido]) + IM(cc[ac+i+ido]);
  301.                 RE(t4) = IM(cc[ac+i+3*ido]) - IM(cc[ac+i+ido]);
  302.                 RE(c2) = RE(t1) + RE(t4);
  303.                 RE(c4) = RE(t1) - RE(t4);
  304.                 IM(c2) = IM(t1) + IM(t4);
  305.                 IM(c4) = IM(t1) - IM(t4);
  306.                 RE(ch[ah+i]) = RE(t2) + RE(t3);
  307.                 RE(c3)       = RE(t2) - RE(t3);
  308.                 IM(ch[ah+i]) = IM(t2) + IM(t3);
  309.                 IM(c3)       = IM(t2) - IM(t3);
  310. #if 1
  311.                 ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]),
  312.                     IM(c2), RE(c2), RE(wa1[i]), IM(wa1[i]));
  313.                 ComplexMult(&IM(ch[ah+i+2*l1*ido]), &RE(ch[ah+i+2*l1*ido]),
  314.                     IM(c3), RE(c3), RE(wa2[i]), IM(wa2[i]));
  315.                 ComplexMult(&IM(ch[ah+i+3*l1*ido]), &RE(ch[ah+i+3*l1*ido]),
  316.                     IM(c4), RE(c4), RE(wa3[i]), IM(wa3[i]));
  317. #else
  318.                 ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]),
  319.                     RE(c2), IM(c2), RE(wa1[i]), IM(wa1[i]));
  320.                 ComplexMult(&RE(ch[ah+i+2*l1*ido]), &IM(ch[ah+i+2*l1*ido]),
  321.                     RE(c3), IM(c3), RE(wa2[i]), IM(wa2[i]));
  322.                 ComplexMult(&RE(ch[ah+i+3*l1*ido]), &IM(ch[ah+i+3*l1*ido]),
  323.                     RE(c4), IM(c4), RE(wa3[i]), IM(wa3[i]));
  324. #endif
  325.             }
  326.         }
  327.     }
  328. }
  329. static void passf4neg(const uint16_t ido, const uint16_t l1, const complex_t *cc,
  330.                       complex_t *ch, const complex_t *wa1, const complex_t *wa2,
  331.                       const complex_t *wa3)
  332. {
  333.     uint16_t i, k, ac, ah;
  334.     if (ido == 1)
  335.     {
  336.         for (k = 0; k < l1; k++)
  337.         {
  338.             complex_t t1, t2, t3, t4;
  339.             ac = 4*k;
  340.             ah = k;
  341.             RE(t2) = RE(cc[ac])   + RE(cc[ac+2]);
  342.             RE(t1) = RE(cc[ac])   - RE(cc[ac+2]);
  343.             IM(t2) = IM(cc[ac])   + IM(cc[ac+2]);
  344.             IM(t1) = IM(cc[ac])   - IM(cc[ac+2]);
  345.             RE(t3) = RE(cc[ac+1]) + RE(cc[ac+3]);
  346.             IM(t4) = RE(cc[ac+1]) - RE(cc[ac+3]);
  347.             IM(t3) = IM(cc[ac+3]) + IM(cc[ac+1]);
  348.             RE(t4) = IM(cc[ac+3]) - IM(cc[ac+1]);
  349.             RE(ch[ah])      = RE(t2) + RE(t3);
  350.             RE(ch[ah+2*l1]) = RE(t2) - RE(t3);
  351.             IM(ch[ah])      = IM(t2) + IM(t3);
  352.             IM(ch[ah+2*l1]) = IM(t2) - IM(t3);
  353.             RE(ch[ah+l1])   = RE(t1) - RE(t4);
  354.             RE(ch[ah+3*l1]) = RE(t1) + RE(t4);
  355.             IM(ch[ah+l1])   = IM(t1) - IM(t4);
  356.             IM(ch[ah+3*l1]) = IM(t1) + IM(t4);
  357.         }
  358.     } else {
  359.         for (k = 0; k < l1; k++)
  360.         {
  361.             ac = 4*k*ido;
  362.             ah = k*ido;
  363.             for (i = 0; i < ido; i++)
  364.             {
  365.                 complex_t c2, c3, c4, t1, t2, t3, t4;
  366.                 RE(t2) = RE(cc[ac+i]) + RE(cc[ac+i+2*ido]);
  367.                 RE(t1) = RE(cc[ac+i]) - RE(cc[ac+i+2*ido]);
  368.                 IM(t2) = IM(cc[ac+i]) + IM(cc[ac+i+2*ido]);
  369.                 IM(t1) = IM(cc[ac+i]) - IM(cc[ac+i+2*ido]);
  370.                 RE(t3) = RE(cc[ac+i+ido]) + RE(cc[ac+i+3*ido]);
  371.                 IM(t4) = RE(cc[ac+i+ido]) - RE(cc[ac+i+3*ido]);
  372.                 IM(t3) = IM(cc[ac+i+3*ido]) + IM(cc[ac+i+ido]);
  373.                 RE(t4) = IM(cc[ac+i+3*ido]) - IM(cc[ac+i+ido]);
  374.                 RE(c2) = RE(t1) - RE(t4);
  375.                 RE(c4) = RE(t1) + RE(t4);
  376.                 IM(c2) = IM(t1) - IM(t4);
  377.                 IM(c4) = IM(t1) + IM(t4);
  378.                 RE(ch[ah+i]) = RE(t2) + RE(t3);
  379.                 RE(c3)       = RE(t2) - RE(t3);
  380.                 IM(ch[ah+i]) = IM(t2) + IM(t3);
  381.                 IM(c3)       = IM(t2) - IM(t3);
  382. #if 1
  383.                 ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]),
  384.                     RE(c2), IM(c2), RE(wa1[i]), IM(wa1[i]));
  385.                 ComplexMult(&RE(ch[ah+i+2*l1*ido]), &IM(ch[ah+i+2*l1*ido]),
  386.                     RE(c3), IM(c3), RE(wa2[i]), IM(wa2[i]));
  387.                 ComplexMult(&RE(ch[ah+i+3*l1*ido]), &IM(ch[ah+i+3*l1*ido]),
  388.                     RE(c4), IM(c4), RE(wa3[i]), IM(wa3[i]));
  389. #else
  390.                 ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]),
  391.                     IM(c2), RE(c2), RE(wa1[i]), IM(wa1[i]));
  392.                 ComplexMult(&IM(ch[ah+i+2*l1*ido]), &RE(ch[ah+i+2*l1*ido]),
  393.                     IM(c3), RE(c3), RE(wa2[i]), IM(wa2[i]));
  394.                 ComplexMult(&IM(ch[ah+i+3*l1*ido]), &RE(ch[ah+i+3*l1*ido]),
  395.                     IM(c4), RE(c4), RE(wa3[i]), IM(wa3[i]));
  396. #endif
  397.             }
  398.         }
  399.     }
  400. }
  401. static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc,
  402.                    complex_t *ch, const complex_t *wa1, const complex_t *wa2, const complex_t *wa3,
  403.                    const complex_t *wa4, const int8_t isign)
  404. {
  405.     static real_t tr11 = FRAC_CONST(0.309016994374947);
  406.     static real_t ti11 = FRAC_CONST(0.951056516295154);
  407.     static real_t tr12 = FRAC_CONST(-0.809016994374947);
  408.     static real_t ti12 = FRAC_CONST(0.587785252292473);
  409.     uint16_t i, k, ac, ah;
  410.     complex_t c2, c3, c4, c5, d3, d4, d5, d2, t2, t3, t4, t5;
  411.     if (ido == 1)
  412.     {
  413.         if (isign == 1)
  414.         {
  415.             for (k = 0; k < l1; k++)
  416.             {
  417.                 ac = 5*k + 1;
  418.                 ah = k;
  419.                 RE(t2) = RE(cc[ac]) + RE(cc[ac+3]);
  420.                 IM(t2) = IM(cc[ac]) + IM(cc[ac+3]);
  421.                 RE(t3) = RE(cc[ac+1]) + RE(cc[ac+2]);
  422.                 IM(t3) = IM(cc[ac+1]) + IM(cc[ac+2]);
  423.                 RE(t4) = RE(cc[ac+1]) - RE(cc[ac+2]);
  424.                 IM(t4) = IM(cc[ac+1]) - IM(cc[ac+2]);
  425.                 RE(t5) = RE(cc[ac]) - RE(cc[ac+3]);
  426.                 IM(t5) = IM(cc[ac]) - IM(cc[ac+3]);
  427.                 RE(ch[ah]) = RE(cc[ac-1]) + RE(t2) + RE(t3);
  428.                 IM(ch[ah]) = IM(cc[ac-1]) + IM(t2) + IM(t3);
  429.                 RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12);
  430.                 IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12);
  431.                 RE(c3) = RE(cc[ac-1]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11);
  432.                 IM(c3) = IM(cc[ac-1]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11);
  433.                 ComplexMult(&RE(c5), &RE(c4),
  434.                     ti11, ti12, RE(t5), RE(t4));
  435.                 ComplexMult(&IM(c5), &IM(c4),
  436.                     ti11, ti12, IM(t5), IM(t4));
  437.                 RE(ch[ah+l1]) = RE(c2) - IM(c5);
  438.                 IM(ch[ah+l1]) = IM(c2) + RE(c5);
  439.                 RE(ch[ah+2*l1]) = RE(c3) - IM(c4);
  440.                 IM(ch[ah+2*l1]) = IM(c3) + RE(c4);
  441.                 RE(ch[ah+3*l1]) = RE(c3) + IM(c4);
  442.                 IM(ch[ah+3*l1]) = IM(c3) - RE(c4);
  443.                 RE(ch[ah+4*l1]) = RE(c2) + IM(c5);
  444.                 IM(ch[ah+4*l1]) = IM(c2) - RE(c5);
  445.             }
  446.         } else {
  447.             for (k = 0; k < l1; k++)
  448.             {
  449.                 ac = 5*k + 1;
  450.                 ah = k;
  451.                 RE(t2) = RE(cc[ac]) + RE(cc[ac+3]);
  452.                 IM(t2) = IM(cc[ac]) + IM(cc[ac+3]);
  453.                 RE(t3) = RE(cc[ac+1]) + RE(cc[ac+2]);
  454.                 IM(t3) = IM(cc[ac+1]) + IM(cc[ac+2]);
  455.                 RE(t4) = RE(cc[ac+1]) - RE(cc[ac+2]);
  456.                 IM(t4) = IM(cc[ac+1]) - IM(cc[ac+2]);
  457.                 RE(t5) = RE(cc[ac]) - RE(cc[ac+3]);
  458.                 IM(t5) = IM(cc[ac]) - IM(cc[ac+3]);
  459.                 RE(ch[ah]) = RE(cc[ac-1]) + RE(t2) + RE(t3);
  460.                 IM(ch[ah]) = IM(cc[ac-1]) + IM(t2) + IM(t3);
  461.                 RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12);
  462.                 IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12);
  463.                 RE(c3) = RE(cc[ac-1]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11);
  464.                 IM(c3) = IM(cc[ac-1]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11);
  465.                 ComplexMult(&RE(c4), &RE(c5),
  466.                     ti12, ti11, RE(t5), RE(t4));
  467.                 ComplexMult(&IM(c4), &IM(c5),
  468.                     ti12, ti12, IM(t5), IM(t4));
  469.                 RE(ch[ah+l1]) = RE(c2) + IM(c5);
  470.                 IM(ch[ah+l1]) = IM(c2) - RE(c5);
  471.                 RE(ch[ah+2*l1]) = RE(c3) + IM(c4);
  472.                 IM(ch[ah+2*l1]) = IM(c3) - RE(c4);
  473.                 RE(ch[ah+3*l1]) = RE(c3) - IM(c4);
  474.                 IM(ch[ah+3*l1]) = IM(c3) + RE(c4);
  475.                 RE(ch[ah+4*l1]) = RE(c2) - IM(c5);
  476.                 IM(ch[ah+4*l1]) = IM(c2) + RE(c5);
  477.             }
  478.         }
  479.     } else {
  480.         if (isign == 1)
  481.         {
  482.             for (k = 0; k < l1; k++)
  483.             {
  484.                 for (i = 0; i < ido; i++)
  485.                 {
  486.                     ac = i + (k*5 + 1) * ido;
  487.                     ah = i + k * ido;
  488.                     RE(t2) = RE(cc[ac]) + RE(cc[ac+3*ido]);
  489.                     IM(t2) = IM(cc[ac]) + IM(cc[ac+3*ido]);
  490.                     RE(t3) = RE(cc[ac+ido]) + RE(cc[ac+2*ido]);
  491.                     IM(t3) = IM(cc[ac+ido]) + IM(cc[ac+2*ido]);
  492.                     RE(t4) = RE(cc[ac+ido]) - RE(cc[ac+2*ido]);
  493.                     IM(t4) = IM(cc[ac+ido]) - IM(cc[ac+2*ido]);
  494.                     RE(t5) = RE(cc[ac]) - RE(cc[ac+3*ido]);
  495.                     IM(t5) = IM(cc[ac]) - IM(cc[ac+3*ido]);
  496.                     RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2) + RE(t3);
  497.                     IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2) + IM(t3);
  498.                     RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12);
  499.                     IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12);
  500.                     RE(c3) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11);
  501.                     IM(c3) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11);
  502.                     ComplexMult(&RE(c5), &RE(c4),
  503.                         ti11, ti12, RE(t5), RE(t4));
  504.                     ComplexMult(&IM(c5), &IM(c4),
  505.                         ti11, ti12, IM(t5), IM(t4));
  506.                     IM(d2) = IM(c2) + RE(c5);
  507.                     IM(d3) = IM(c3) + RE(c4);
  508.                     RE(d4) = RE(c3) + IM(c4);
  509.                     RE(d5) = RE(c2) + IM(c5);
  510.                     RE(d2) = RE(c2) - IM(c5);
  511.                     IM(d5) = IM(c2) - RE(c5);
  512.                     RE(d3) = RE(c3) - IM(c4);
  513.                     IM(d4) = IM(c3) - RE(c4);
  514. #if 1
  515.                     ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]),
  516.                         IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i]));
  517.                     ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]),
  518.                         IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i]));
  519.                     ComplexMult(&IM(ch[ah+3*l1*ido]), &RE(ch[ah+3*l1*ido]),
  520.                         IM(d4), RE(d4), RE(wa3[i]), IM(wa3[i]));
  521.                     ComplexMult(&IM(ch[ah+4*l1*ido]), &RE(ch[ah+4*l1*ido]),
  522.                         IM(d5), RE(d5), RE(wa4[i]), IM(wa4[i]));
  523. #else
  524.                     ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]),
  525.                         RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i]));
  526.                     ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]),
  527.                         RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i]));
  528.                     ComplexMult(&RE(ch[ah+3*l1*ido]), &IM(ch[ah+3*l1*ido]),
  529.                         RE(d4), IM(d4), RE(wa3[i]), IM(wa3[i]));
  530.                     ComplexMult(&RE(ch[ah+4*l1*ido]), &IM(ch[ah+4*l1*ido]),
  531.                         RE(d5), IM(d5), RE(wa4[i]), IM(wa4[i]));
  532. #endif
  533.                 }
  534.             }
  535.         } else {
  536.             for (k = 0; k < l1; k++)
  537.             {
  538.                 for (i = 0; i < ido; i++)
  539.                 {
  540.                     ac = i + (k*5 + 1) * ido;
  541.                     ah = i + k * ido;
  542.                     RE(t2) = RE(cc[ac]) + RE(cc[ac+3*ido]);
  543.                     IM(t2) = IM(cc[ac]) + IM(cc[ac+3*ido]);
  544.                     RE(t3) = RE(cc[ac+ido]) + RE(cc[ac+2*ido]);
  545.                     IM(t3) = IM(cc[ac+ido]) + IM(cc[ac+2*ido]);
  546.                     RE(t4) = RE(cc[ac+ido]) - RE(cc[ac+2*ido]);
  547.                     IM(t4) = IM(cc[ac+ido]) - IM(cc[ac+2*ido]);
  548.                     RE(t5) = RE(cc[ac]) - RE(cc[ac+3*ido]);
  549.                     IM(t5) = IM(cc[ac]) - IM(cc[ac+3*ido]);
  550.                     RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2) + RE(t3);
  551.                     IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2) + IM(t3);
  552.                     RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12);
  553.                     IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12);
  554.                     RE(c3) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11);
  555.                     IM(c3) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11);
  556.                     ComplexMult(&RE(c4), &RE(c5),
  557.                         ti12, ti11, RE(t5), RE(t4));
  558.                     ComplexMult(&IM(c4), &IM(c5),
  559.                         ti12, ti12, IM(t5), IM(t4));
  560.                     IM(d2) = IM(c2) - RE(c5);
  561.                     IM(d3) = IM(c3) - RE(c4);
  562.                     RE(d4) = RE(c3) - IM(c4);
  563.                     RE(d5) = RE(c2) - IM(c5);
  564.                     RE(d2) = RE(c2) + IM(c5);
  565.                     IM(d5) = IM(c2) + RE(c5);
  566.                     RE(d3) = RE(c3) + IM(c4);
  567.                     IM(d4) = IM(c3) + RE(c4);
  568. #if 1
  569.                     ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]),
  570.                         RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i]));
  571.                     ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]),
  572.                         RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i]));
  573.                     ComplexMult(&RE(ch[ah+3*l1*ido]), &IM(ch[ah+3*l1*ido]),
  574.                         RE(d4), IM(d4), RE(wa3[i]), IM(wa3[i]));
  575.                     ComplexMult(&RE(ch[ah+4*l1*ido]), &IM(ch[ah+4*l1*ido]),
  576.                         RE(d5), IM(d5), RE(wa4[i]), IM(wa4[i]));
  577. #else
  578.                     ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]),
  579.                         IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i]));
  580.                     ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]),
  581.                         IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i]));
  582.                     ComplexMult(&IM(ch[ah+3*l1*ido]), &RE(ch[ah+3*l1*ido]),
  583.                         IM(d4), RE(d4), RE(wa3[i]), IM(wa3[i]));
  584.                     ComplexMult(&IM(ch[ah+4*l1*ido]), &RE(ch[ah+4*l1*ido]),
  585.                         IM(d5), RE(d5), RE(wa4[i]), IM(wa4[i]));
  586. #endif
  587.                 }
  588.             }
  589.         }
  590.     }
  591. }
  592. /*----------------------------------------------------------------------
  593.    cfftf1, cfftf, cfftb, cffti1, cffti. Complex FFTs.
  594.   ----------------------------------------------------------------------*/
  595. static INLINE void cfftf1pos(uint16_t n, complex_t *c, complex_t *ch,
  596.                              const uint16_t *ifac, const complex_t *wa,
  597.                              const int8_t isign)
  598. {
  599.     uint16_t i;
  600.     uint16_t k1, l1, l2;
  601.     uint16_t na, nf, ip, iw, ix2, ix3, ix4, ido, idl1;
  602.     nf = ifac[1];
  603.     na = 0;
  604.     l1 = 1;
  605.     iw = 0;
  606.     for (k1 = 2; k1 <= nf+1; k1++)
  607.     {
  608.         ip = ifac[k1];
  609.         l2 = ip*l1;
  610.         ido = n / l2;
  611.         idl1 = ido*l1;
  612.         switch (ip)
  613.         {
  614.         case 4:
  615.             ix2 = iw + ido;
  616.             ix3 = ix2 + ido;
  617.             if (na == 0)
  618.                 passf4pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3]);
  619.             else
  620.                 passf4pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3]);
  621.             na = 1 - na;
  622.             break;
  623.         case 2:
  624.             if (na == 0)
  625.                 passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]);
  626.             else
  627.                 passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]);
  628.             na = 1 - na;
  629.             break;
  630.         case 3:
  631.             ix2 = iw + ido;
  632.             if (na == 0)
  633.                 passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], isign);
  634.             else
  635.                 passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], isign);
  636.             na = 1 - na;
  637.             break;
  638.         case 5:
  639.             ix2 = iw + ido;
  640.             ix3 = ix2 + ido;
  641.             ix4 = ix3 + ido;
  642.             if (na == 0)
  643.                 passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign);
  644.             else
  645.                 passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign);
  646.             na = 1 - na;
  647.             break;
  648.         }
  649.         l1 = l2;
  650.         iw += (ip-1) * ido;
  651.     }
  652.     if (na == 0)
  653.         return;
  654.     for (i = 0; i < n; i++)
  655.     {
  656.         RE(c[i]) = RE(ch[i]);
  657.         IM(c[i]) = IM(ch[i]);
  658.     }
  659. }
  660. static INLINE void cfftf1neg(uint16_t n, complex_t *c, complex_t *ch,
  661.                              const uint16_t *ifac, const complex_t *wa,
  662.                              const int8_t isign)
  663. {
  664.     uint16_t i;
  665.     uint16_t k1, l1, l2;
  666.     uint16_t na, nf, ip, iw, ix2, ix3, ix4, ido, idl1;
  667.     nf = ifac[1];
  668.     na = 0;
  669.     l1 = 1;
  670.     iw = 0;
  671.     for (k1 = 2; k1 <= nf+1; k1++)
  672.     {
  673.         ip = ifac[k1];
  674.         l2 = ip*l1;
  675.         ido = n / l2;
  676.         idl1 = ido*l1;
  677.         switch (ip)
  678.         {
  679.         case 4:
  680.             ix2 = iw + ido;
  681.             ix3 = ix2 + ido;
  682.             if (na == 0)
  683.                 passf4neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3]);
  684.             else
  685.                 passf4neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3]);
  686.             na = 1 - na;
  687.             break;
  688.         case 2:
  689.             if (na == 0)
  690.                 passf2neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]);
  691.             else
  692.                 passf2neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]);
  693.             na = 1 - na;
  694.             break;
  695.         case 3:
  696.             ix2 = iw + ido;
  697.             if (na == 0)
  698.                 passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], isign);
  699.             else
  700.                 passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], isign);
  701.             na = 1 - na;
  702.             break;
  703.         case 5:
  704.             ix2 = iw + ido;
  705.             ix3 = ix2 + ido;
  706.             ix4 = ix3 + ido;
  707.             if (na == 0)
  708.                 passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign);
  709.             else
  710.                 passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign);
  711.             na = 1 - na;
  712.             break;
  713.         }
  714.         l1 = l2;
  715.         iw += (ip-1) * ido;
  716.     }
  717.     if (na == 0)
  718.         return;
  719.     for (i = 0; i < n; i++)
  720.     {
  721.         RE(c[i]) = RE(ch[i]);
  722.         IM(c[i]) = IM(ch[i]);
  723.     }
  724. }
  725. void cfftf(cfft_info *cfft, complex_t *c)
  726. {
  727.     cfftf1neg(cfft->n, c, cfft->work, (const uint16_t*)cfft->ifac, (const complex_t*)cfft->tab, -1);
  728. }
  729. void cfftb(cfft_info *cfft, complex_t *c)
  730. {
  731.     cfftf1pos(cfft->n, c, cfft->work, (const uint16_t*)cfft->ifac, (const complex_t*)cfft->tab, +1);
  732. }
  733. static void cffti1(uint16_t n, complex_t *wa, uint16_t *ifac)
  734. {
  735.     static uint16_t ntryh[4] = {3, 4, 2, 5};
  736. #ifndef FIXED_POINT
  737.     real_t arg, argh, argld, fi;
  738.     uint16_t ido, ipm;
  739.     uint16_t i1, k1, l1, l2;
  740.     uint16_t ld, ii, ip;
  741. #endif
  742.     uint16_t ntry = 0, i, j;
  743.     uint16_t ib;
  744.     uint16_t nf, nl, nq, nr;
  745.     nl = n;
  746.     nf = 0;
  747.     j = 0;
  748. startloop:
  749.     j++;
  750.     if (j <= 4)
  751.         ntry = ntryh[j-1];
  752.     else
  753.         ntry += 2;
  754.     do
  755.     {
  756.         nq = nl / ntry;
  757.         nr = nl - ntry*nq;
  758.         if (nr != 0)
  759.             goto startloop;
  760.         nf++;
  761.         ifac[nf+1] = ntry;
  762.         nl = nq;
  763.         if (ntry == 2 && nf != 1)
  764.         {
  765.             for (i = 2; i <= nf; i++)
  766.             {
  767.                 ib = nf - i + 2;
  768.                 ifac[ib+1] = ifac[ib];
  769.             }
  770.             ifac[2] = 2;
  771.         }
  772.     } while (nl != 1);
  773.     ifac[0] = n;
  774.     ifac[1] = nf;
  775. #ifndef FIXED_POINT
  776.     argh = (real_t)2.0*(real_t)M_PI / (real_t)n;
  777.     i = 0;
  778.     l1 = 1;
  779.     for (k1 = 1; k1 <= nf; k1++)
  780.     {
  781.         ip = ifac[k1+1];
  782.         ld = 0;
  783.         l2 = l1*ip;
  784.         ido = n / l2;
  785.         ipm = ip - 1;
  786.         for (j = 0; j < ipm; j++)
  787.         {
  788.             i1 = i;
  789.             RE(wa[i]) = 1.0;
  790.             IM(wa[i]) = 0.0;
  791.             ld += l1;
  792.             fi = 0;
  793.             argld = ld*argh;
  794.             for (ii = 0; ii < ido; ii++)
  795.             {
  796.                 i++;
  797.                 fi++;
  798.                 arg = fi * argld;
  799.                 RE(wa[i]) = (real_t)cos(arg);
  800. #if 1
  801.                 IM(wa[i]) = (real_t)sin(arg);
  802. #else
  803.                 IM(wa[i]) = (real_t)-sin(arg);
  804. #endif
  805.             }
  806.             if (ip > 5)
  807.             {
  808.                 RE(wa[i1]) = RE(wa[i]);
  809.                 IM(wa[i1]) = IM(wa[i]);
  810.             }
  811.         }
  812.         l1 = l2;
  813.     }
  814. #endif
  815. }
  816. cfft_info *cffti(uint16_t n)
  817. {
  818.     cfft_info *cfft = (cfft_info*)faad_malloc(sizeof(cfft_info));
  819.     cfft->n = n;
  820.     cfft->work = (complex_t*)faad_malloc(n*sizeof(complex_t));
  821. #ifndef FIXED_POINT
  822.     cfft->tab = (complex_t*)faad_malloc(n*sizeof(complex_t));
  823.     cffti1(n, cfft->tab, cfft->ifac);
  824. #else
  825.     cffti1(n, NULL, cfft->ifac);
  826.     switch (n)
  827.     {
  828.     case 64: cfft->tab = (complex_t*)cfft_tab_64; break;
  829.     case 512: cfft->tab = (complex_t*)cfft_tab_512; break;
  830. #ifdef LD_DEC
  831.     case 256: cfft->tab = (complex_t*)cfft_tab_256; break;
  832. #endif
  833. #ifdef ALLOW_SMALL_FRAMELENGTH
  834.     case 60: cfft->tab = (complex_t*)cfft_tab_60; break;
  835.     case 480: cfft->tab = (complex_t*)cfft_tab_480; break;
  836. #ifdef LD_DEC
  837.     case 240: cfft->tab = (complex_t*)cfft_tab_240; break;
  838. #endif
  839. #endif
  840.     case 128: cfft->tab = (complex_t*)cfft_tab_128; break;
  841.     }
  842. #endif
  843.     return cfft;
  844. }
  845. void cfftu(cfft_info *cfft)
  846. {
  847.     if (cfft->work) faad_free(cfft->work);
  848. #ifndef FIXED_POINT
  849.     if (cfft->tab) faad_free(cfft->tab);
  850. #endif
  851.     if (cfft) faad_free(cfft);
  852. }