fftsg.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:88k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * fftsg.c:
  3.  *****************************************************************************
  4.  * Copyright (C) 2004 VideoLAN
  5.  * $Id: fftsg.c 8205 2004-07-17 13:55:48Z asmax $
  6.  *
  7.  * Authors: Cyril Deguet <asmax@videolan.org>
  8.  *          code from projectM http://xmms-projectm.sourceforge.net
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. /*
  25. Fast Fourier/Cosine/Sine Transform
  26.     dimension   :one
  27.     data length :power of 2
  28.     decimation  :frequency
  29.     radix       :split-radix
  30.     data        :inplace
  31.     table       :use
  32. functions
  33.     cdft: Complex Discrete Fourier Transform
  34.     rdft: Real Discrete Fourier Transform
  35.     ddct: Discrete Cosine Transform
  36.     ddst: Discrete Sine Transform
  37.     dfct: Cosine Transform of RDFT (Real Symmetric DFT)
  38.     dfst: Sine Transform of RDFT (Real Anti-symmetric DFT)
  39. function prototypes
  40.     void cdft(int, int, double *, int *, double *);
  41.     void rdft(int, int, double *, int *, double *);
  42.     void ddct(int, int, double *, int *, double *);
  43.     void ddst(int, int, double *, int *, double *);
  44.     void dfct(int, double *, double *, int *, double *);
  45.     void dfst(int, double *, double *, int *, double *);
  46. macro definitions
  47.     USE_CDFT_PTHREADS : default=not defined
  48.         CDFT_THREADS_BEGIN_N  : must be >= 512, default=8192
  49.         CDFT_4THREADS_BEGIN_N : must be >= 512, default=65536
  50.     USE_CDFT_WINTHREADS : default=not defined
  51.         CDFT_THREADS_BEGIN_N  : must be >= 512, default=32768
  52.         CDFT_4THREADS_BEGIN_N : must be >= 512, default=524288
  53. -------- Complex DFT (Discrete Fourier Transform) --------
  54.     [definition]
  55.         <case1>
  56.             X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k<n
  57.         <case2>
  58.             X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k<n
  59.         (notes: sum_j=0^n-1 is a summation from j=0 to n-1)
  60.     [usage]
  61.         <case1>
  62.             ip[0] = 0; // first time only
  63.             cdft(2*n, 1, a, ip, w);
  64.         <case2>
  65.             ip[0] = 0; // first time only
  66.             cdft(2*n, -1, a, ip, w);
  67.     [parameters]
  68.         2*n            :data length (int)
  69.                         n >= 1, n = power of 2
  70.         a[0...2*n-1]   :input/output data (double *)
  71.                         input data
  72.                             a[2*j] = Re(x[j]), 
  73.                             a[2*j+1] = Im(x[j]), 0<=j<n
  74.                         output data
  75.                             a[2*k] = Re(X[k]), 
  76.                             a[2*k+1] = Im(X[k]), 0<=k<n
  77.         ip[0...*]      :work area for bit reversal (int *)
  78.                         length of ip >= 2+sqrt(n)
  79.                         strictly, 
  80.                         length of ip >= 
  81.                             2+(1<<(int)(log(n+0.5)/log(2))/2).
  82.                         ip[0],ip[1] are pointers of the cos/sin table.
  83.         w[0...n/2-1]   :cos/sin table (double *)
  84.                         w[],ip[] are initialized if ip[0] == 0.
  85.     [remark]
  86.         Inverse of 
  87.             cdft(2*n, -1, a, ip, w);
  88.         is 
  89.             cdft(2*n, 1, a, ip, w);
  90.             for (j = 0; j <= 2 * n - 1; j++) {
  91.                 a[j] *= 1.0 / n;
  92.             }
  93.         .
  94. -------- Real DFT / Inverse of Real DFT --------
  95.     [definition]
  96.         <case1> RDFT
  97.             R[k] = sum_j=0^n-1 a[j]*cos(2*pi*j*k/n), 0<=k<=n/2
  98.             I[k] = sum_j=0^n-1 a[j]*sin(2*pi*j*k/n), 0<k<n/2
  99.         <case2> IRDFT (excluding scale)
  100.             a[k] = (R[0] + R[n/2]*cos(pi*k))/2 + 
  101.                    sum_j=1^n/2-1 R[j]*cos(2*pi*j*k/n) + 
  102.                    sum_j=1^n/2-1 I[j]*sin(2*pi*j*k/n), 0<=k<n
  103.     [usage]
  104.         <case1>
  105.             ip[0] = 0; // first time only
  106.             rdft(n, 1, a, ip, w);
  107.         <case2>
  108.             ip[0] = 0; // first time only
  109.             rdft(n, -1, a, ip, w);
  110.     [parameters]
  111.         n              :data length (int)
  112.                         n >= 2, n = power of 2
  113.         a[0...n-1]     :input/output data (double *)
  114.                         <case1>
  115.                             output data
  116.                                 a[2*k] = R[k], 0<=k<n/2
  117.                                 a[2*k+1] = I[k], 0<k<n/2
  118.                                 a[1] = R[n/2]
  119.                         <case2>
  120.                             input data
  121.                                 a[2*j] = R[j], 0<=j<n/2
  122.                                 a[2*j+1] = I[j], 0<j<n/2
  123.                                 a[1] = R[n/2]
  124.         ip[0...*]      :work area for bit reversal (int *)
  125.                         length of ip >= 2+sqrt(n/2)
  126.                         strictly, 
  127.                         length of ip >= 
  128.                             2+(1<<(int)(log(n/2+0.5)/log(2))/2).
  129.                         ip[0],ip[1] are pointers of the cos/sin table.
  130.         w[0...n/2-1]   :cos/sin table (double *)
  131.                         w[],ip[] are initialized if ip[0] == 0.
  132.     [remark]
  133.         Inverse of 
  134.             rdft(n, 1, a, ip, w);
  135.         is 
  136.             rdft(n, -1, a, ip, w);
  137.             for (j = 0; j <= n - 1; j++) {
  138.                 a[j] *= 2.0 / n;
  139.             }
  140.         .
  141. -------- DCT (Discrete Cosine Transform) / Inverse of DCT --------
  142.     [definition]
  143.         <case1> IDCT (excluding scale)
  144.             C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k<n
  145.         <case2> DCT
  146.             C[k] = sum_j=0^n-1 a[j]*cos(pi*(j+1/2)*k/n), 0<=k<n
  147.     [usage]
  148.         <case1>
  149.             ip[0] = 0; // first time only
  150.             ddct(n, 1, a, ip, w);
  151.         <case2>
  152.             ip[0] = 0; // first time only
  153.             ddct(n, -1, a, ip, w);
  154.     [parameters]
  155.         n              :data length (int)
  156.                         n >= 2, n = power of 2
  157.         a[0...n-1]     :input/output data (double *)
  158.                         output data
  159.                             a[k] = C[k], 0<=k<n
  160.         ip[0...*]      :work area for bit reversal (int *)
  161.                         length of ip >= 2+sqrt(n/2)
  162.                         strictly, 
  163.                         length of ip >= 
  164.                             2+(1<<(int)(log(n/2+0.5)/log(2))/2).
  165.                         ip[0],ip[1] are pointers of the cos/sin table.
  166.         w[0...n*5/4-1] :cos/sin table (double *)
  167.                         w[],ip[] are initialized if ip[0] == 0.
  168.     [remark]
  169.         Inverse of 
  170.             ddct(n, -1, a, ip, w);
  171.         is 
  172.             a[0] *= 0.5;
  173.             ddct(n, 1, a, ip, w);
  174.             for (j = 0; j <= n - 1; j++) {
  175.                 a[j] *= 2.0 / n;
  176.             }
  177.         .
  178. -------- DST (Discrete Sine Transform) / Inverse of DST --------
  179.     [definition]
  180.         <case1> IDST (excluding scale)
  181.             S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k<n
  182.         <case2> DST
  183.             S[k] = sum_j=0^n-1 a[j]*sin(pi*(j+1/2)*k/n), 0<k<=n
  184.     [usage]
  185.         <case1>
  186.             ip[0] = 0; // first time only
  187.             ddst(n, 1, a, ip, w);
  188.         <case2>
  189.             ip[0] = 0; // first time only
  190.             ddst(n, -1, a, ip, w);
  191.     [parameters]
  192.         n              :data length (int)
  193.                         n >= 2, n = power of 2
  194.         a[0...n-1]     :input/output data (double *)
  195.                         <case1>
  196.                             input data
  197.                                 a[j] = A[j], 0<j<n
  198.                                 a[0] = A[n]
  199.                             output data
  200.                                 a[k] = S[k], 0<=k<n
  201.                         <case2>
  202.                             output data
  203.                                 a[k] = S[k], 0<k<n
  204.                                 a[0] = S[n]
  205.         ip[0...*]      :work area for bit reversal (int *)
  206.                         length of ip >= 2+sqrt(n/2)
  207.                         strictly, 
  208.                         length of ip >= 
  209.                             2+(1<<(int)(log(n/2+0.5)/log(2))/2).
  210.                         ip[0],ip[1] are pointers of the cos/sin table.
  211.         w[0...n*5/4-1] :cos/sin table (double *)
  212.                         w[],ip[] are initialized if ip[0] == 0.
  213.     [remark]
  214.         Inverse of 
  215.             ddst(n, -1, a, ip, w);
  216.         is 
  217.             a[0] *= 0.5;
  218.             ddst(n, 1, a, ip, w);
  219.             for (j = 0; j <= n - 1; j++) {
  220.                 a[j] *= 2.0 / n;
  221.             }
  222.         .
  223. -------- Cosine Transform of RDFT (Real Symmetric DFT) --------
  224.     [definition]
  225.         C[k] = sum_j=0^n a[j]*cos(pi*j*k/n), 0<=k<=n
  226.     [usage]
  227.         ip[0] = 0; // first time only
  228.         dfct(n, a, t, ip, w);
  229.     [parameters]
  230.         n              :data length - 1 (int)
  231.                         n >= 2, n = power of 2
  232.         a[0...n]       :input/output data (double *)
  233.                         output data
  234.                             a[k] = C[k], 0<=k<=n
  235.         t[0...n/2]     :work area (double *)
  236.         ip[0...*]      :work area for bit reversal (int *)
  237.                         length of ip >= 2+sqrt(n/4)
  238.                         strictly, 
  239.                         length of ip >= 
  240.                             2+(1<<(int)(log(n/4+0.5)/log(2))/2).
  241.                         ip[0],ip[1] are pointers of the cos/sin table.
  242.         w[0...n*5/8-1] :cos/sin table (double *)
  243.                         w[],ip[] are initialized if ip[0] == 0.
  244.     [remark]
  245.         Inverse of 
  246.             a[0] *= 0.5;
  247.             a[n] *= 0.5;
  248.             dfct(n, a, t, ip, w);
  249.         is 
  250.             a[0] *= 0.5;
  251.             a[n] *= 0.5;
  252.             dfct(n, a, t, ip, w);
  253.             for (j = 0; j <= n; j++) {
  254.                 a[j] *= 2.0 / n;
  255.             }
  256.         .
  257. -------- Sine Transform of RDFT (Real Anti-symmetric DFT) --------
  258.     [definition]
  259.         S[k] = sum_j=1^n-1 a[j]*sin(pi*j*k/n), 0<k<n
  260.     [usage]
  261.         ip[0] = 0; // first time only
  262.         dfst(n, a, t, ip, w);
  263.     [parameters]
  264.         n              :data length + 1 (int)
  265.                         n >= 2, n = power of 2
  266.         a[0...n-1]     :input/output data (double *)
  267.                         output data
  268.                             a[k] = S[k], 0<k<n
  269.                         (a[0] is used for work area)
  270.         t[0...n/2-1]   :work area (double *)
  271.         ip[0...*]      :work area for bit reversal (int *)
  272.                         length of ip >= 2+sqrt(n/4)
  273.                         strictly, 
  274.                         length of ip >= 
  275.                             2+(1<<(int)(log(n/4+0.5)/log(2))/2).
  276.                         ip[0],ip[1] are pointers of the cos/sin table.
  277.         w[0...n*5/8-1] :cos/sin table (double *)
  278.                         w[],ip[] are initialized if ip[0] == 0.
  279.     [remark]
  280.         Inverse of 
  281.             dfst(n, a, t, ip, w);
  282.         is 
  283.             dfst(n, a, t, ip, w);
  284.             for (j = 1; j <= n - 1; j++) {
  285.                 a[j] *= 2.0 / n;
  286.             }
  287.         .
  288. Appendix :
  289.     The cos/sin table is recalculated when the larger table required.
  290.     w[] and ip[] are compatible with all routines.
  291. */
  292. void cdft(int n, int isgn, double *a, int *ip, double *w)
  293. {
  294.     void makewt(int nw, int *ip, double *w);
  295.     void cftfsub(int n, double *a, int *ip, int nw, double *w);
  296.     void cftbsub(int n, double *a, int *ip, int nw, double *w);
  297.     int nw;
  298.     
  299.     nw = ip[0];
  300.     if (n > (nw << 2)) {
  301.         nw = n >> 2;
  302.         makewt(nw, ip, w);
  303.     }
  304.     if (isgn >= 0) {
  305.         cftfsub(n, a, ip, nw, w);
  306.     } else {
  307.         cftbsub(n, a, ip, nw, w);
  308.     }
  309. }
  310. void rdft(int n, int isgn, double *a, int *ip, double *w)
  311. {
  312.     void makewt(int nw, int *ip, double *w);
  313.     void makect(int nc, int *ip, double *c);
  314.     void cftfsub(int n, double *a, int *ip, int nw, double *w);
  315.     void cftbsub(int n, double *a, int *ip, int nw, double *w);
  316.     void rftfsub(int n, double *a, int nc, double *c);
  317.     void rftbsub(int n, double *a, int nc, double *c);
  318.     int nw, nc;
  319.     double xi;
  320.     
  321.     nw = ip[0];
  322.     if (n > (nw << 2)) {
  323.         nw = n >> 2;
  324.         makewt(nw, ip, w);
  325.     }
  326.     nc = ip[1];
  327.     if (n > (nc << 2)) {
  328.         nc = n >> 2;
  329.         makect(nc, ip, w + nw);
  330.     }
  331.     if (isgn >= 0) {
  332.         if (n > 4) {
  333.             cftfsub(n, a, ip, nw, w);
  334.             rftfsub(n, a, nc, w + nw);
  335.         } else if (n == 4) {
  336.             cftfsub(n, a, ip, nw, w);
  337.         }
  338.         xi = a[0] - a[1];
  339.         a[0] += a[1];
  340.         a[1] = xi;
  341.     } else {
  342.         a[1] = 0.5 * (a[0] - a[1]);
  343.         a[0] -= a[1];
  344.         if (n > 4) {
  345.             rftbsub(n, a, nc, w + nw);
  346.             cftbsub(n, a, ip, nw, w);
  347.         } else if (n == 4) {
  348.             cftbsub(n, a, ip, nw, w);
  349.         }
  350.     }
  351. }
  352. void ddct(int n, int isgn, double *a, int *ip, double *w)
  353. {
  354.     void makewt(int nw, int *ip, double *w);
  355.     void makect(int nc, int *ip, double *c);
  356.     void cftfsub(int n, double *a, int *ip, int nw, double *w);
  357.     void cftbsub(int n, double *a, int *ip, int nw, double *w);
  358.     void rftfsub(int n, double *a, int nc, double *c);
  359.     void rftbsub(int n, double *a, int nc, double *c);
  360.     void dctsub(int n, double *a, int nc, double *c);
  361.     int j, nw, nc;
  362.     double xr;
  363.     
  364.     nw = ip[0];
  365.     if (n > (nw << 2)) {
  366.         nw = n >> 2;
  367.         makewt(nw, ip, w);
  368.     }
  369.     nc = ip[1];
  370.     if (n > nc) {
  371.         nc = n;
  372.         makect(nc, ip, w + nw);
  373.     }
  374.     if (isgn < 0) {
  375.         xr = a[n - 1];
  376.         for (j = n - 2; j >= 2; j -= 2) {
  377.             a[j + 1] = a[j] - a[j - 1];
  378.             a[j] += a[j - 1];
  379.         }
  380.         a[1] = a[0] - xr;
  381.         a[0] += xr;
  382.         if (n > 4) {
  383.             rftbsub(n, a, nc, w + nw);
  384.             cftbsub(n, a, ip, nw, w);
  385.         } else if (n == 4) {
  386.             cftbsub(n, a, ip, nw, w);
  387.         }
  388.     }
  389.     dctsub(n, a, nc, w + nw);
  390.     if (isgn >= 0) {
  391.         if (n > 4) {
  392.             cftfsub(n, a, ip, nw, w);
  393.             rftfsub(n, a, nc, w + nw);
  394.         } else if (n == 4) {
  395.             cftfsub(n, a, ip, nw, w);
  396.         }
  397.         xr = a[0] - a[1];
  398.         a[0] += a[1];
  399.         for (j = 2; j < n; j += 2) {
  400.             a[j - 1] = a[j] - a[j + 1];
  401.             a[j] += a[j + 1];
  402.         }
  403.         a[n - 1] = xr;
  404.     }
  405. }
  406. void ddst(int n, int isgn, double *a, int *ip, double *w)
  407. {
  408.     void makewt(int nw, int *ip, double *w);
  409.     void makect(int nc, int *ip, double *c);
  410.     void cftfsub(int n, double *a, int *ip, int nw, double *w);
  411.     void cftbsub(int n, double *a, int *ip, int nw, double *w);
  412.     void rftfsub(int n, double *a, int nc, double *c);
  413.     void rftbsub(int n, double *a, int nc, double *c);
  414.     void dstsub(int n, double *a, int nc, double *c);
  415.     int j, nw, nc;
  416.     double xr;
  417.     
  418.     nw = ip[0];
  419.     if (n > (nw << 2)) {
  420.         nw = n >> 2;
  421.         makewt(nw, ip, w);
  422.     }
  423.     nc = ip[1];
  424.     if (n > nc) {
  425.         nc = n;
  426.         makect(nc, ip, w + nw);
  427.     }
  428.     if (isgn < 0) {
  429.         xr = a[n - 1];
  430.         for (j = n - 2; j >= 2; j -= 2) {
  431.             a[j + 1] = -a[j] - a[j - 1];
  432.             a[j] -= a[j - 1];
  433.         }
  434.         a[1] = a[0] + xr;
  435.         a[0] -= xr;
  436.         if (n > 4) {
  437.             rftbsub(n, a, nc, w + nw);
  438.             cftbsub(n, a, ip, nw, w);
  439.         } else if (n == 4) {
  440.             cftbsub(n, a, ip, nw, w);
  441.         }
  442.     }
  443.     dstsub(n, a, nc, w + nw);
  444.     if (isgn >= 0) {
  445.         if (n > 4) {
  446.             cftfsub(n, a, ip, nw, w);
  447.             rftfsub(n, a, nc, w + nw);
  448.         } else if (n == 4) {
  449.             cftfsub(n, a, ip, nw, w);
  450.         }
  451.         xr = a[0] - a[1];
  452.         a[0] += a[1];
  453.         for (j = 2; j < n; j += 2) {
  454.             a[j - 1] = -a[j] - a[j + 1];
  455.             a[j] -= a[j + 1];
  456.         }
  457.         a[n - 1] = -xr;
  458.     }
  459. }
  460. void dfct(int n, double *a, double *t, int *ip, double *w)
  461. {
  462.     void makewt(int nw, int *ip, double *w);
  463.     void makect(int nc, int *ip, double *c);
  464.     void cftfsub(int n, double *a, int *ip, int nw, double *w);
  465.     void rftfsub(int n, double *a, int nc, double *c);
  466.     void dctsub(int n, double *a, int nc, double *c);
  467.     int j, k, l, m, mh, nw, nc;
  468.     double xr, xi, yr, yi;
  469.     
  470.     nw = ip[0];
  471.     if (n > (nw << 3)) {
  472.         nw = n >> 3;
  473.         makewt(nw, ip, w);
  474.     }
  475.     nc = ip[1];
  476.     if (n > (nc << 1)) {
  477.         nc = n >> 1;
  478.         makect(nc, ip, w + nw);
  479.     }
  480.     m = n >> 1;
  481.     yi = a[m];
  482.     xi = a[0] + a[n];
  483.     a[0] -= a[n];
  484.     t[0] = xi - yi;
  485.     t[m] = xi + yi;
  486.     if (n > 2) {
  487.         mh = m >> 1;
  488.         for (j = 1; j < mh; j++) {
  489.             k = m - j;
  490.             xr = a[j] - a[n - j];
  491.             xi = a[j] + a[n - j];
  492.             yr = a[k] - a[n - k];
  493.             yi = a[k] + a[n - k];
  494.             a[j] = xr;
  495.             a[k] = yr;
  496.             t[j] = xi - yi;
  497.             t[k] = xi + yi;
  498.         }
  499.         t[mh] = a[mh] + a[n - mh];
  500.         a[mh] -= a[n - mh];
  501.         dctsub(m, a, nc, w + nw);
  502.         if (m > 4) {
  503.             cftfsub(m, a, ip, nw, w);
  504.             rftfsub(m, a, nc, w + nw);
  505.         } else if (m == 4) {
  506.             cftfsub(m, a, ip, nw, w);
  507.         }
  508.         a[n - 1] = a[0] - a[1];
  509.         a[1] = a[0] + a[1];
  510.         for (j = m - 2; j >= 2; j -= 2) {
  511.             a[2 * j + 1] = a[j] + a[j + 1];
  512.             a[2 * j - 1] = a[j] - a[j + 1];
  513.         }
  514.         l = 2;
  515.         m = mh;
  516.         while (m >= 2) {
  517.             dctsub(m, t, nc, w + nw);
  518.             if (m > 4) {
  519.                 cftfsub(m, t, ip, nw, w);
  520.                 rftfsub(m, t, nc, w + nw);
  521.             } else if (m == 4) {
  522.                 cftfsub(m, t, ip, nw, w);
  523.             }
  524.             a[n - l] = t[0] - t[1];
  525.             a[l] = t[0] + t[1];
  526.             k = 0;
  527.             for (j = 2; j < m; j += 2) {
  528.                 k += l << 2;
  529.                 a[k - l] = t[j] - t[j + 1];
  530.                 a[k + l] = t[j] + t[j + 1];
  531.             }
  532.             l <<= 1;
  533.             mh = m >> 1;
  534.             for (j = 0; j < mh; j++) {
  535.                 k = m - j;
  536.                 t[j] = t[m + k] - t[m + j];
  537.                 t[k] = t[m + k] + t[m + j];
  538.             }
  539.             t[mh] = t[m + mh];
  540.             m = mh;
  541.         }
  542.         a[l] = t[0];
  543.         a[n] = t[2] - t[1];
  544.         a[0] = t[2] + t[1];
  545.     } else {
  546.         a[1] = a[0];
  547.         a[2] = t[0];
  548.         a[0] = t[1];
  549.     }
  550. }
  551. void dfst(int n, double *a, double *t, int *ip, double *w)
  552. {
  553.     void makewt(int nw, int *ip, double *w);
  554.     void makect(int nc, int *ip, double *c);
  555.     void cftfsub(int n, double *a, int *ip, int nw, double *w);
  556.     void rftfsub(int n, double *a, int nc, double *c);
  557.     void dstsub(int n, double *a, int nc, double *c);
  558.     int j, k, l, m, mh, nw, nc;
  559.     double xr, xi, yr, yi;
  560.     
  561.     nw = ip[0];
  562.     if (n > (nw << 3)) {
  563.         nw = n >> 3;
  564.         makewt(nw, ip, w);
  565.     }
  566.     nc = ip[1];
  567.     if (n > (nc << 1)) {
  568.         nc = n >> 1;
  569.         makect(nc, ip, w + nw);
  570.     }
  571.     if (n > 2) {
  572.         m = n >> 1;
  573.         mh = m >> 1;
  574.         for (j = 1; j < mh; j++) {
  575.             k = m - j;
  576.             xr = a[j] + a[n - j];
  577.             xi = a[j] - a[n - j];
  578.             yr = a[k] + a[n - k];
  579.             yi = a[k] - a[n - k];
  580.             a[j] = xr;
  581.             a[k] = yr;
  582.             t[j] = xi + yi;
  583.             t[k] = xi - yi;
  584.         }
  585.         t[0] = a[mh] - a[n - mh];
  586.         a[mh] += a[n - mh];
  587.         a[0] = a[m];
  588.         dstsub(m, a, nc, w + nw);
  589.         if (m > 4) {
  590.             cftfsub(m, a, ip, nw, w);
  591.             rftfsub(m, a, nc, w + nw);
  592.         } else if (m == 4) {
  593.             cftfsub(m, a, ip, nw, w);
  594.         }
  595.         a[n - 1] = a[1] - a[0];
  596.         a[1] = a[0] + a[1];
  597.         for (j = m - 2; j >= 2; j -= 2) {
  598.             a[2 * j + 1] = a[j] - a[j + 1];
  599.             a[2 * j - 1] = -a[j] - a[j + 1];
  600.         }
  601.         l = 2;
  602.         m = mh;
  603.         while (m >= 2) {
  604.             dstsub(m, t, nc, w + nw);
  605.             if (m > 4) {
  606.                 cftfsub(m, t, ip, nw, w);
  607.                 rftfsub(m, t, nc, w + nw);
  608.             } else if (m == 4) {
  609.                 cftfsub(m, t, ip, nw, w);
  610.             }
  611.             a[n - l] = t[1] - t[0];
  612.             a[l] = t[0] + t[1];
  613.             k = 0;
  614.             for (j = 2; j < m; j += 2) {
  615.                 k += l << 2;
  616.                 a[k - l] = -t[j] - t[j + 1];
  617.                 a[k + l] = t[j] - t[j + 1];
  618.             }
  619.             l <<= 1;
  620.             mh = m >> 1;
  621.             for (j = 1; j < mh; j++) {
  622.                 k = m - j;
  623.                 t[j] = t[m + k] + t[m + j];
  624.                 t[k] = t[m + k] - t[m + j];
  625.             }
  626.             t[0] = t[m + mh];
  627.             m = mh;
  628.         }
  629.         a[l] = t[0];
  630.     }
  631.     a[0] = 0;
  632. }
  633. /* -------- initializing routines -------- */
  634. #include <math.h>
  635. void makewt(int nw, int *ip, double *w)
  636. {
  637.     void makeipt(int nw, int *ip);
  638.     int j, nwh, nw0, nw1;
  639.     double delta, wn4r, wk1r, wk1i, wk3r, wk3i;
  640.     
  641.     ip[0] = nw;
  642.     ip[1] = 1;
  643.     if (nw > 2) {
  644.         nwh = nw >> 1;
  645.         delta = atan(1.0) / nwh;
  646.         wn4r = cos(delta * nwh);
  647.         w[0] = 1;
  648.         w[1] = wn4r;
  649.         if (nwh == 4) {
  650.             w[2] = cos(delta * 2);
  651.             w[3] = sin(delta * 2);
  652.         } else if (nwh > 4) {
  653.             makeipt(nw, ip);
  654.             w[2] = 0.5 / cos(delta * 2);
  655.             w[3] = 0.5 / cos(delta * 6);
  656.             for (j = 4; j < nwh; j += 4) {
  657.                 w[j] = cos(delta * j);
  658.                 w[j + 1] = sin(delta * j);
  659.                 w[j + 2] = cos(3 * delta * j);
  660.                 w[j + 3] = -sin(3 * delta * j);
  661.             }
  662.         }
  663.         nw0 = 0;
  664.         while (nwh > 2) {
  665.             nw1 = nw0 + nwh;
  666.             nwh >>= 1;
  667.             w[nw1] = 1;
  668.             w[nw1 + 1] = wn4r;
  669.             if (nwh == 4) {
  670.                 wk1r = w[nw0 + 4];
  671.                 wk1i = w[nw0 + 5];
  672.                 w[nw1 + 2] = wk1r;
  673.                 w[nw1 + 3] = wk1i;
  674.             } else if (nwh > 4) {
  675.                 wk1r = w[nw0 + 4];
  676.                 wk3r = w[nw0 + 6];
  677.                 w[nw1 + 2] = 0.5 / wk1r;
  678.                 w[nw1 + 3] = 0.5 / wk3r;
  679.                 for (j = 4; j < nwh; j += 4) {
  680.                     wk1r = w[nw0 + 2 * j];
  681.                     wk1i = w[nw0 + 2 * j + 1];
  682.                     wk3r = w[nw0 + 2 * j + 2];
  683.                     wk3i = w[nw0 + 2 * j + 3];
  684.                     w[nw1 + j] = wk1r;
  685.                     w[nw1 + j + 1] = wk1i;
  686.                     w[nw1 + j + 2] = wk3r;
  687.                     w[nw1 + j + 3] = wk3i;
  688.                 }
  689.             }
  690.             nw0 = nw1;
  691.         }
  692.     }
  693. }
  694. void makeipt(int nw, int *ip)
  695. {
  696.     int j, l, m, m2, p, q;
  697.     
  698.     ip[2] = 0;
  699.     ip[3] = 16;
  700.     m = 2;
  701.     for (l = nw; l > 32; l >>= 2) {
  702.         m2 = m << 1;
  703.         q = m2 << 3;
  704.         for (j = m; j < m2; j++) {
  705.             p = ip[j] << 2;
  706.             ip[m + j] = p;
  707.             ip[m2 + j] = p + q;
  708.         }
  709.         m = m2;
  710.     }
  711. }
  712. void makect(int nc, int *ip, double *c)
  713. {
  714.     int j, nch;
  715.     double delta;
  716.     
  717.     ip[1] = nc;
  718.     if (nc > 1) {
  719.         nch = nc >> 1;
  720.         delta = atan(1.0) / nch;
  721.         c[0] = cos(delta * nch);
  722.         c[nch] = 0.5 * c[0];
  723.         for (j = 1; j < nch; j++) {
  724.             c[j] = 0.5 * cos(delta * j);
  725.             c[nc - j] = 0.5 * sin(delta * j);
  726.         }
  727.     }
  728. }
  729. /* -------- child routines -------- */
  730. #ifdef USE_CDFT_PTHREADS
  731. #define USE_CDFT_THREADS
  732. #ifndef CDFT_THREADS_BEGIN_N
  733. #define CDFT_THREADS_BEGIN_N 8192
  734. #endif
  735. #ifndef CDFT_4THREADS_BEGIN_N
  736. #define CDFT_4THREADS_BEGIN_N 65536
  737. #endif
  738. #include <pthread.h>
  739. #include <stdio.h>
  740. #include <stdlib.h>
  741. #define cdft_thread_t pthread_t
  742. #define cdft_thread_create(thp,func,argp) { 
  743.     if (pthread_create(thp, NULL, func, (void *) argp) != 0) { 
  744.         fprintf(stderr, "cdft thread errorn"); 
  745.         exit(1); 
  746.     } 
  747. }
  748. #define cdft_thread_wait(th) { 
  749.     if (pthread_join(th, NULL) != 0) { 
  750.         fprintf(stderr, "cdft thread errorn"); 
  751.         exit(1); 
  752.     } 
  753. }
  754. #endif /* USE_CDFT_PTHREADS */
  755. #ifdef USE_CDFT_WINTHREADS
  756. #define USE_CDFT_THREADS
  757. #ifndef CDFT_THREADS_BEGIN_N
  758. #define CDFT_THREADS_BEGIN_N 32768
  759. #endif
  760. #ifndef CDFT_4THREADS_BEGIN_N
  761. #define CDFT_4THREADS_BEGIN_N 524288
  762. #endif
  763. #include <windows.h>
  764. #include <stdio.h>
  765. #include <stdlib.h>
  766. #define cdft_thread_t HANDLE
  767. #define cdft_thread_create(thp,func,argp) { 
  768.     DWORD thid; 
  769.     *(thp) = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) func, (LPVOID) argp, 0, &thid); 
  770.     if (*(thp) == 0) { 
  771.         fprintf(stderr, "cdft thread errorn"); 
  772.         exit(1); 
  773.     } 
  774. }
  775. #define cdft_thread_wait(th) { 
  776.     WaitForSingleObject(th, INFINITE); 
  777.     CloseHandle(th); 
  778. }
  779. #endif /* USE_CDFT_WINTHREADS */
  780. void cftfsub(int n, double *a, int *ip, int nw, double *w)
  781. {
  782.     void bitrv2(int n, int *ip, double *a);
  783.     void bitrv216(double *a);
  784.     void bitrv208(double *a);
  785.     void cftf1st(int n, double *a, double *w);
  786.     void cftrec4(int n, double *a, int nw, double *w);
  787.     void cftleaf(int n, int isplt, double *a, int nw, double *w);
  788.     void cftfx41(int n, double *a, int nw, double *w);
  789.     void cftf161(double *a, double *w);
  790.     void cftf081(double *a, double *w);
  791.     void cftf040(double *a);
  792.     void cftx020(double *a);
  793. #ifdef USE_CDFT_THREADS
  794.     void cftrec4_th(int n, double *a, int nw, double *w);
  795. #endif /* USE_CDFT_THREADS */
  796.     
  797.     if (n > 8) {
  798.         if (n > 32) {
  799.             cftf1st(n, a, &w[nw - (n >> 2)]);
  800. #ifdef USE_CDFT_THREADS
  801.             if (n > CDFT_THREADS_BEGIN_N) {
  802.                 cftrec4_th(n, a, nw, w);
  803.             } else 
  804. #endif /* USE_CDFT_THREADS */
  805.             if (n > 512) {
  806.                 cftrec4(n, a, nw, w);
  807.             } else if (n > 128) {
  808.                 cftleaf(n, 1, a, nw, w);
  809.             } else {
  810.                 cftfx41(n, a, nw, w);
  811.             }
  812.             bitrv2(n, ip, a);
  813.         } else if (n == 32) {
  814.             cftf161(a, &w[nw - 8]);
  815.             bitrv216(a);
  816.         } else {
  817.             cftf081(a, w);
  818.             bitrv208(a);
  819.         }
  820.     } else if (n == 8) {
  821.         cftf040(a);
  822.     } else if (n == 4) {
  823.         cftx020(a);
  824.     }
  825. }
  826. void cftbsub(int n, double *a, int *ip, int nw, double *w)
  827. {
  828.     void bitrv2conj(int n, int *ip, double *a);
  829.     void bitrv216neg(double *a);
  830.     void bitrv208neg(double *a);
  831.     void cftb1st(int n, double *a, double *w);
  832.     void cftrec4(int n, double *a, int nw, double *w);
  833.     void cftleaf(int n, int isplt, double *a, int nw, double *w);
  834.     void cftfx41(int n, double *a, int nw, double *w);
  835.     void cftf161(double *a, double *w);
  836.     void cftf081(double *a, double *w);
  837.     void cftb040(double *a);
  838.     void cftx020(double *a);
  839. #ifdef USE_CDFT_THREADS
  840.     void cftrec4_th(int n, double *a, int nw, double *w);
  841. #endif /* USE_CDFT_THREADS */
  842.     
  843.     if (n > 8) {
  844.         if (n > 32) {
  845.             cftb1st(n, a, &w[nw - (n >> 2)]);
  846. #ifdef USE_CDFT_THREADS
  847.             if (n > CDFT_THREADS_BEGIN_N) {
  848.                 cftrec4_th(n, a, nw, w);
  849.             } else 
  850. #endif /* USE_CDFT_THREADS */
  851.             if (n > 512) {
  852.                 cftrec4(n, a, nw, w);
  853.             } else if (n > 128) {
  854.                 cftleaf(n, 1, a, nw, w);
  855.             } else {
  856.                 cftfx41(n, a, nw, w);
  857.             }
  858.             bitrv2conj(n, ip, a);
  859.         } else if (n == 32) {
  860.             cftf161(a, &w[nw - 8]);
  861.             bitrv216neg(a);
  862.         } else {
  863.             cftf081(a, w);
  864.             bitrv208neg(a);
  865.         }
  866.     } else if (n == 8) {
  867.         cftb040(a);
  868.     } else if (n == 4) {
  869.         cftx020(a);
  870.     }
  871. }
  872. void bitrv2(int n, int *ip, double *a)
  873. {
  874.     int j, j1, k, k1, l, m, nh, nm;
  875.     double xr, xi, yr, yi;
  876.     
  877.     m = 1;
  878.     for (l = n >> 2; l > 8; l >>= 2) {
  879.         m <<= 1;
  880.     }
  881.     nh = n >> 1;
  882.     nm = 4 * m;
  883.     if (l == 8) {
  884.         for (k = 0; k < m; k++) {
  885.             for (j = 0; j < k; j++) {
  886.                 j1 = 4 * j + 2 * ip[m + k];
  887.                 k1 = 4 * k + 2 * ip[m + j];
  888.                 xr = a[j1];
  889.                 xi = a[j1 + 1];
  890.                 yr = a[k1];
  891.                 yi = a[k1 + 1];
  892.                 a[j1] = yr;
  893.                 a[j1 + 1] = yi;
  894.                 a[k1] = xr;
  895.                 a[k1 + 1] = xi;
  896.                 j1 += nm;
  897.                 k1 += 2 * nm;
  898.                 xr = a[j1];
  899.                 xi = a[j1 + 1];
  900.                 yr = a[k1];
  901.                 yi = a[k1 + 1];
  902.                 a[j1] = yr;
  903.                 a[j1 + 1] = yi;
  904.                 a[k1] = xr;
  905.                 a[k1 + 1] = xi;
  906.                 j1 += nm;
  907.                 k1 -= nm;
  908.                 xr = a[j1];
  909.                 xi = a[j1 + 1];
  910.                 yr = a[k1];
  911.                 yi = a[k1 + 1];
  912.                 a[j1] = yr;
  913.                 a[j1 + 1] = yi;
  914.                 a[k1] = xr;
  915.                 a[k1 + 1] = xi;
  916.                 j1 += nm;
  917.                 k1 += 2 * nm;
  918.                 xr = a[j1];
  919.                 xi = a[j1 + 1];
  920.                 yr = a[k1];
  921.                 yi = a[k1 + 1];
  922.                 a[j1] = yr;
  923.                 a[j1 + 1] = yi;
  924.                 a[k1] = xr;
  925.                 a[k1 + 1] = xi;
  926.                 j1 += nh;
  927.                 k1 += 2;
  928.                 xr = a[j1];
  929.                 xi = a[j1 + 1];
  930.                 yr = a[k1];
  931.                 yi = a[k1 + 1];
  932.                 a[j1] = yr;
  933.                 a[j1 + 1] = yi;
  934.                 a[k1] = xr;
  935.                 a[k1 + 1] = xi;
  936.                 j1 -= nm;
  937.                 k1 -= 2 * nm;
  938.                 xr = a[j1];
  939.                 xi = a[j1 + 1];
  940.                 yr = a[k1];
  941.                 yi = a[k1 + 1];
  942.                 a[j1] = yr;
  943.                 a[j1 + 1] = yi;
  944.                 a[k1] = xr;
  945.                 a[k1 + 1] = xi;
  946.                 j1 -= nm;
  947.                 k1 += nm;
  948.                 xr = a[j1];
  949.                 xi = a[j1 + 1];
  950.                 yr = a[k1];
  951.                 yi = a[k1 + 1];
  952.                 a[j1] = yr;
  953.                 a[j1 + 1] = yi;
  954.                 a[k1] = xr;
  955.                 a[k1 + 1] = xi;
  956.                 j1 -= nm;
  957.                 k1 -= 2 * nm;
  958.                 xr = a[j1];
  959.                 xi = a[j1 + 1];
  960.                 yr = a[k1];
  961.                 yi = a[k1 + 1];
  962.                 a[j1] = yr;
  963.                 a[j1 + 1] = yi;
  964.                 a[k1] = xr;
  965.                 a[k1 + 1] = xi;
  966.                 j1 += 2;
  967.                 k1 += nh;
  968.                 xr = a[j1];
  969.                 xi = a[j1 + 1];
  970.                 yr = a[k1];
  971.                 yi = a[k1 + 1];
  972.                 a[j1] = yr;
  973.                 a[j1 + 1] = yi;
  974.                 a[k1] = xr;
  975.                 a[k1 + 1] = xi;
  976.                 j1 += nm;
  977.                 k1 += 2 * nm;
  978.                 xr = a[j1];
  979.                 xi = a[j1 + 1];
  980.                 yr = a[k1];
  981.                 yi = a[k1 + 1];
  982.                 a[j1] = yr;
  983.                 a[j1 + 1] = yi;
  984.                 a[k1] = xr;
  985.                 a[k1 + 1] = xi;
  986.                 j1 += nm;
  987.                 k1 -= nm;
  988.                 xr = a[j1];
  989.                 xi = a[j1 + 1];
  990.                 yr = a[k1];
  991.                 yi = a[k1 + 1];
  992.                 a[j1] = yr;
  993.                 a[j1 + 1] = yi;
  994.                 a[k1] = xr;
  995.                 a[k1 + 1] = xi;
  996.                 j1 += nm;
  997.                 k1 += 2 * nm;
  998.                 xr = a[j1];
  999.                 xi = a[j1 + 1];
  1000.                 yr = a[k1];
  1001.                 yi = a[k1 + 1];
  1002.                 a[j1] = yr;
  1003.                 a[j1 + 1] = yi;
  1004.                 a[k1] = xr;
  1005.                 a[k1 + 1] = xi;
  1006.                 j1 -= nh;
  1007.                 k1 -= 2;
  1008.                 xr = a[j1];
  1009.                 xi = a[j1 + 1];
  1010.                 yr = a[k1];
  1011.                 yi = a[k1 + 1];
  1012.                 a[j1] = yr;
  1013.                 a[j1 + 1] = yi;
  1014.                 a[k1] = xr;
  1015.                 a[k1 + 1] = xi;
  1016.                 j1 -= nm;
  1017.                 k1 -= 2 * nm;
  1018.                 xr = a[j1];
  1019.                 xi = a[j1 + 1];
  1020.                 yr = a[k1];
  1021.                 yi = a[k1 + 1];
  1022.                 a[j1] = yr;
  1023.                 a[j1 + 1] = yi;
  1024.                 a[k1] = xr;
  1025.                 a[k1 + 1] = xi;
  1026.                 j1 -= nm;
  1027.                 k1 += nm;
  1028.                 xr = a[j1];
  1029.                 xi = a[j1 + 1];
  1030.                 yr = a[k1];
  1031.                 yi = a[k1 + 1];
  1032.                 a[j1] = yr;
  1033.                 a[j1 + 1] = yi;
  1034.                 a[k1] = xr;
  1035.                 a[k1 + 1] = xi;
  1036.                 j1 -= nm;
  1037.                 k1 -= 2 * nm;
  1038.                 xr = a[j1];
  1039.                 xi = a[j1 + 1];
  1040.                 yr = a[k1];
  1041.                 yi = a[k1 + 1];
  1042.                 a[j1] = yr;
  1043.                 a[j1 + 1] = yi;
  1044.                 a[k1] = xr;
  1045.                 a[k1 + 1] = xi;
  1046.             }
  1047.             k1 = 4 * k + 2 * ip[m + k];
  1048.             j1 = k1 + 2;
  1049.             k1 += nh;
  1050.             xr = a[j1];
  1051.             xi = a[j1 + 1];
  1052.             yr = a[k1];
  1053.             yi = a[k1 + 1];
  1054.             a[j1] = yr;
  1055.             a[j1 + 1] = yi;
  1056.             a[k1] = xr;
  1057.             a[k1 + 1] = xi;
  1058.             j1 += nm;
  1059.             k1 += 2 * nm;
  1060.             xr = a[j1];
  1061.             xi = a[j1 + 1];
  1062.             yr = a[k1];
  1063.             yi = a[k1 + 1];
  1064.             a[j1] = yr;
  1065.             a[j1 + 1] = yi;
  1066.             a[k1] = xr;
  1067.             a[k1 + 1] = xi;
  1068.             j1 += nm;
  1069.             k1 -= nm;
  1070.             xr = a[j1];
  1071.             xi = a[j1 + 1];
  1072.             yr = a[k1];
  1073.             yi = a[k1 + 1];
  1074.             a[j1] = yr;
  1075.             a[j1 + 1] = yi;
  1076.             a[k1] = xr;
  1077.             a[k1 + 1] = xi;
  1078.             j1 -= 2;
  1079.             k1 -= nh;
  1080.             xr = a[j1];
  1081.             xi = a[j1 + 1];
  1082.             yr = a[k1];
  1083.             yi = a[k1 + 1];
  1084.             a[j1] = yr;
  1085.             a[j1 + 1] = yi;
  1086.             a[k1] = xr;
  1087.             a[k1 + 1] = xi;
  1088.             j1 += nh + 2;
  1089.             k1 += nh + 2;
  1090.             xr = a[j1];
  1091.             xi = a[j1 + 1];
  1092.             yr = a[k1];
  1093.             yi = a[k1 + 1];
  1094.             a[j1] = yr;
  1095.             a[j1 + 1] = yi;
  1096.             a[k1] = xr;
  1097.             a[k1 + 1] = xi;
  1098.             j1 -= nh - nm;
  1099.             k1 += 2 * nm - 2;
  1100.             xr = a[j1];
  1101.             xi = a[j1 + 1];
  1102.             yr = a[k1];
  1103.             yi = a[k1 + 1];
  1104.             a[j1] = yr;
  1105.             a[j1 + 1] = yi;
  1106.             a[k1] = xr;
  1107.             a[k1 + 1] = xi;
  1108.         }
  1109.     } else {
  1110.         for (k = 0; k < m; k++) {
  1111.             for (j = 0; j < k; j++) {
  1112.                 j1 = 4 * j + ip[m + k];
  1113.                 k1 = 4 * k + ip[m + j];
  1114.                 xr = a[j1];
  1115.                 xi = a[j1 + 1];
  1116.                 yr = a[k1];
  1117.                 yi = a[k1 + 1];
  1118.                 a[j1] = yr;
  1119.                 a[j1 + 1] = yi;
  1120.                 a[k1] = xr;
  1121.                 a[k1 + 1] = xi;
  1122.                 j1 += nm;
  1123.                 k1 += nm;
  1124.                 xr = a[j1];
  1125.                 xi = a[j1 + 1];
  1126.                 yr = a[k1];
  1127.                 yi = a[k1 + 1];
  1128.                 a[j1] = yr;
  1129.                 a[j1 + 1] = yi;
  1130.                 a[k1] = xr;
  1131.                 a[k1 + 1] = xi;
  1132.                 j1 += nh;
  1133.                 k1 += 2;
  1134.                 xr = a[j1];
  1135.                 xi = a[j1 + 1];
  1136.                 yr = a[k1];
  1137.                 yi = a[k1 + 1];
  1138.                 a[j1] = yr;
  1139.                 a[j1 + 1] = yi;
  1140.                 a[k1] = xr;
  1141.                 a[k1 + 1] = xi;
  1142.                 j1 -= nm;
  1143.                 k1 -= nm;
  1144.                 xr = a[j1];
  1145.                 xi = a[j1 + 1];
  1146.                 yr = a[k1];
  1147.                 yi = a[k1 + 1];
  1148.                 a[j1] = yr;
  1149.                 a[j1 + 1] = yi;
  1150.                 a[k1] = xr;
  1151.                 a[k1 + 1] = xi;
  1152.                 j1 += 2;
  1153.                 k1 += nh;
  1154.                 xr = a[j1];
  1155.                 xi = a[j1 + 1];
  1156.                 yr = a[k1];
  1157.                 yi = a[k1 + 1];
  1158.                 a[j1] = yr;
  1159.                 a[j1 + 1] = yi;
  1160.                 a[k1] = xr;
  1161.                 a[k1 + 1] = xi;
  1162.                 j1 += nm;
  1163.                 k1 += nm;
  1164.                 xr = a[j1];
  1165.                 xi = a[j1 + 1];
  1166.                 yr = a[k1];
  1167.                 yi = a[k1 + 1];
  1168.                 a[j1] = yr;
  1169.                 a[j1 + 1] = yi;
  1170.                 a[k1] = xr;
  1171.                 a[k1 + 1] = xi;
  1172.                 j1 -= nh;
  1173.                 k1 -= 2;
  1174.                 xr = a[j1];
  1175.                 xi = a[j1 + 1];
  1176.                 yr = a[k1];
  1177.                 yi = a[k1 + 1];
  1178.                 a[j1] = yr;
  1179.                 a[j1 + 1] = yi;
  1180.                 a[k1] = xr;
  1181.                 a[k1 + 1] = xi;
  1182.                 j1 -= nm;
  1183.                 k1 -= nm;
  1184.                 xr = a[j1];
  1185.                 xi = a[j1 + 1];
  1186.                 yr = a[k1];
  1187.                 yi = a[k1 + 1];
  1188.                 a[j1] = yr;
  1189.                 a[j1 + 1] = yi;
  1190.                 a[k1] = xr;
  1191.                 a[k1 + 1] = xi;
  1192.             }
  1193.             k1 = 4 * k + ip[m + k];
  1194.             j1 = k1 + 2;
  1195.             k1 += nh;
  1196.             xr = a[j1];
  1197.             xi = a[j1 + 1];
  1198.             yr = a[k1];
  1199.             yi = a[k1 + 1];
  1200.             a[j1] = yr;
  1201.             a[j1 + 1] = yi;
  1202.             a[k1] = xr;
  1203.             a[k1 + 1] = xi;
  1204.             j1 += nm;
  1205.             k1 += nm;
  1206.             xr = a[j1];
  1207.             xi = a[j1 + 1];
  1208.             yr = a[k1];
  1209.             yi = a[k1 + 1];
  1210.             a[j1] = yr;
  1211.             a[j1 + 1] = yi;
  1212.             a[k1] = xr;
  1213.             a[k1 + 1] = xi;
  1214.         }
  1215.     }
  1216. }
  1217. void bitrv2conj(int n, int *ip, double *a)
  1218. {
  1219.     int j, j1, k, k1, l, m, nh, nm;
  1220.     double xr, xi, yr, yi;
  1221.     
  1222.     m = 1;
  1223.     for (l = n >> 2; l > 8; l >>= 2) {
  1224.         m <<= 1;
  1225.     }
  1226.     nh = n >> 1;
  1227.     nm = 4 * m;
  1228.     if (l == 8) {
  1229.         for (k = 0; k < m; k++) {
  1230.             for (j = 0; j < k; j++) {
  1231.                 j1 = 4 * j + 2 * ip[m + k];
  1232.                 k1 = 4 * k + 2 * ip[m + j];
  1233.                 xr = a[j1];
  1234.                 xi = -a[j1 + 1];
  1235.                 yr = a[k1];
  1236.                 yi = -a[k1 + 1];
  1237.                 a[j1] = yr;
  1238.                 a[j1 + 1] = yi;
  1239.                 a[k1] = xr;
  1240.                 a[k1 + 1] = xi;
  1241.                 j1 += nm;
  1242.                 k1 += 2 * nm;
  1243.                 xr = a[j1];
  1244.                 xi = -a[j1 + 1];
  1245.                 yr = a[k1];
  1246.                 yi = -a[k1 + 1];
  1247.                 a[j1] = yr;
  1248.                 a[j1 + 1] = yi;
  1249.                 a[k1] = xr;
  1250.                 a[k1 + 1] = xi;
  1251.                 j1 += nm;
  1252.                 k1 -= nm;
  1253.                 xr = a[j1];
  1254.                 xi = -a[j1 + 1];
  1255.                 yr = a[k1];
  1256.                 yi = -a[k1 + 1];
  1257.                 a[j1] = yr;
  1258.                 a[j1 + 1] = yi;
  1259.                 a[k1] = xr;
  1260.                 a[k1 + 1] = xi;
  1261.                 j1 += nm;
  1262.                 k1 += 2 * nm;
  1263.                 xr = a[j1];
  1264.                 xi = -a[j1 + 1];
  1265.                 yr = a[k1];
  1266.                 yi = -a[k1 + 1];
  1267.                 a[j1] = yr;
  1268.                 a[j1 + 1] = yi;
  1269.                 a[k1] = xr;
  1270.                 a[k1 + 1] = xi;
  1271.                 j1 += nh;
  1272.                 k1 += 2;
  1273.                 xr = a[j1];
  1274.                 xi = -a[j1 + 1];
  1275.                 yr = a[k1];
  1276.                 yi = -a[k1 + 1];
  1277.                 a[j1] = yr;
  1278.                 a[j1 + 1] = yi;
  1279.                 a[k1] = xr;
  1280.                 a[k1 + 1] = xi;
  1281.                 j1 -= nm;
  1282.                 k1 -= 2 * nm;
  1283.                 xr = a[j1];
  1284.                 xi = -a[j1 + 1];
  1285.                 yr = a[k1];
  1286.                 yi = -a[k1 + 1];
  1287.                 a[j1] = yr;
  1288.                 a[j1 + 1] = yi;
  1289.                 a[k1] = xr;
  1290.                 a[k1 + 1] = xi;
  1291.                 j1 -= nm;
  1292.                 k1 += nm;
  1293.                 xr = a[j1];
  1294.                 xi = -a[j1 + 1];
  1295.                 yr = a[k1];
  1296.                 yi = -a[k1 + 1];
  1297.                 a[j1] = yr;
  1298.                 a[j1 + 1] = yi;
  1299.                 a[k1] = xr;
  1300.                 a[k1 + 1] = xi;
  1301.                 j1 -= nm;
  1302.                 k1 -= 2 * nm;
  1303.                 xr = a[j1];
  1304.                 xi = -a[j1 + 1];
  1305.                 yr = a[k1];
  1306.                 yi = -a[k1 + 1];
  1307.                 a[j1] = yr;
  1308.                 a[j1 + 1] = yi;
  1309.                 a[k1] = xr;
  1310.                 a[k1 + 1] = xi;
  1311.                 j1 += 2;
  1312.                 k1 += nh;
  1313.                 xr = a[j1];
  1314.                 xi = -a[j1 + 1];
  1315.                 yr = a[k1];
  1316.                 yi = -a[k1 + 1];
  1317.                 a[j1] = yr;
  1318.                 a[j1 + 1] = yi;
  1319.                 a[k1] = xr;
  1320.                 a[k1 + 1] = xi;
  1321.                 j1 += nm;
  1322.                 k1 += 2 * nm;
  1323.                 xr = a[j1];
  1324.                 xi = -a[j1 + 1];
  1325.                 yr = a[k1];
  1326.                 yi = -a[k1 + 1];
  1327.                 a[j1] = yr;
  1328.                 a[j1 + 1] = yi;
  1329.                 a[k1] = xr;
  1330.                 a[k1 + 1] = xi;
  1331.                 j1 += nm;
  1332.                 k1 -= nm;
  1333.                 xr = a[j1];
  1334.                 xi = -a[j1 + 1];
  1335.                 yr = a[k1];
  1336.                 yi = -a[k1 + 1];
  1337.                 a[j1] = yr;
  1338.                 a[j1 + 1] = yi;
  1339.                 a[k1] = xr;
  1340.                 a[k1 + 1] = xi;
  1341.                 j1 += nm;
  1342.                 k1 += 2 * nm;
  1343.                 xr = a[j1];
  1344.                 xi = -a[j1 + 1];
  1345.                 yr = a[k1];
  1346.                 yi = -a[k1 + 1];
  1347.                 a[j1] = yr;
  1348.                 a[j1 + 1] = yi;
  1349.                 a[k1] = xr;
  1350.                 a[k1 + 1] = xi;
  1351.                 j1 -= nh;
  1352.                 k1 -= 2;
  1353.                 xr = a[j1];
  1354.                 xi = -a[j1 + 1];
  1355.                 yr = a[k1];
  1356.                 yi = -a[k1 + 1];
  1357.                 a[j1] = yr;
  1358.                 a[j1 + 1] = yi;
  1359.                 a[k1] = xr;
  1360.                 a[k1 + 1] = xi;
  1361.                 j1 -= nm;
  1362.                 k1 -= 2 * nm;
  1363.                 xr = a[j1];
  1364.                 xi = -a[j1 + 1];
  1365.                 yr = a[k1];
  1366.                 yi = -a[k1 + 1];
  1367.                 a[j1] = yr;
  1368.                 a[j1 + 1] = yi;
  1369.                 a[k1] = xr;
  1370.                 a[k1 + 1] = xi;
  1371.                 j1 -= nm;
  1372.                 k1 += nm;
  1373.                 xr = a[j1];
  1374.                 xi = -a[j1 + 1];
  1375.                 yr = a[k1];
  1376.                 yi = -a[k1 + 1];
  1377.                 a[j1] = yr;
  1378.                 a[j1 + 1] = yi;
  1379.                 a[k1] = xr;
  1380.                 a[k1 + 1] = xi;
  1381.                 j1 -= nm;
  1382.                 k1 -= 2 * nm;
  1383.                 xr = a[j1];
  1384.                 xi = -a[j1 + 1];
  1385.                 yr = a[k1];
  1386.                 yi = -a[k1 + 1];
  1387.                 a[j1] = yr;
  1388.                 a[j1 + 1] = yi;
  1389.                 a[k1] = xr;
  1390.                 a[k1 + 1] = xi;
  1391.             }
  1392.             k1 = 4 * k + 2 * ip[m + k];
  1393.             j1 = k1 + 2;
  1394.             k1 += nh;
  1395.             a[j1 - 1] = -a[j1 - 1];
  1396.             xr = a[j1];
  1397.             xi = -a[j1 + 1];
  1398.             yr = a[k1];
  1399.             yi = -a[k1 + 1];
  1400.             a[j1] = yr;
  1401.             a[j1 + 1] = yi;
  1402.             a[k1] = xr;
  1403.             a[k1 + 1] = xi;
  1404.             a[k1 + 3] = -a[k1 + 3];
  1405.             j1 += nm;
  1406.             k1 += 2 * nm;
  1407.             xr = a[j1];
  1408.             xi = -a[j1 + 1];
  1409.             yr = a[k1];
  1410.             yi = -a[k1 + 1];
  1411.             a[j1] = yr;
  1412.             a[j1 + 1] = yi;
  1413.             a[k1] = xr;
  1414.             a[k1 + 1] = xi;
  1415.             j1 += nm;
  1416.             k1 -= nm;
  1417.             xr = a[j1];
  1418.             xi = -a[j1 + 1];
  1419.             yr = a[k1];
  1420.             yi = -a[k1 + 1];
  1421.             a[j1] = yr;
  1422.             a[j1 + 1] = yi;
  1423.             a[k1] = xr;
  1424.             a[k1 + 1] = xi;
  1425.             j1 -= 2;
  1426.             k1 -= nh;
  1427.             xr = a[j1];
  1428.             xi = -a[j1 + 1];
  1429.             yr = a[k1];
  1430.             yi = -a[k1 + 1];
  1431.             a[j1] = yr;
  1432.             a[j1 + 1] = yi;
  1433.             a[k1] = xr;
  1434.             a[k1 + 1] = xi;
  1435.             j1 += nh + 2;
  1436.             k1 += nh + 2;
  1437.             xr = a[j1];
  1438.             xi = -a[j1 + 1];
  1439.             yr = a[k1];
  1440.             yi = -a[k1 + 1];
  1441.             a[j1] = yr;
  1442.             a[j1 + 1] = yi;
  1443.             a[k1] = xr;
  1444.             a[k1 + 1] = xi;
  1445.             j1 -= nh - nm;
  1446.             k1 += 2 * nm - 2;
  1447.             a[j1 - 1] = -a[j1 - 1];
  1448.             xr = a[j1];
  1449.             xi = -a[j1 + 1];
  1450.             yr = a[k1];
  1451.             yi = -a[k1 + 1];
  1452.             a[j1] = yr;
  1453.             a[j1 + 1] = yi;
  1454.             a[k1] = xr;
  1455.             a[k1 + 1] = xi;
  1456.             a[k1 + 3] = -a[k1 + 3];
  1457.         }
  1458.     } else {
  1459.         for (k = 0; k < m; k++) {
  1460.             for (j = 0; j < k; j++) {
  1461.                 j1 = 4 * j + ip[m + k];
  1462.                 k1 = 4 * k + ip[m + j];
  1463.                 xr = a[j1];
  1464.                 xi = -a[j1 + 1];
  1465.                 yr = a[k1];
  1466.                 yi = -a[k1 + 1];
  1467.                 a[j1] = yr;
  1468.                 a[j1 + 1] = yi;
  1469.                 a[k1] = xr;
  1470.                 a[k1 + 1] = xi;
  1471.                 j1 += nm;
  1472.                 k1 += nm;
  1473.                 xr = a[j1];
  1474.                 xi = -a[j1 + 1];
  1475.                 yr = a[k1];
  1476.                 yi = -a[k1 + 1];
  1477.                 a[j1] = yr;
  1478.                 a[j1 + 1] = yi;
  1479.                 a[k1] = xr;
  1480.                 a[k1 + 1] = xi;
  1481.                 j1 += nh;
  1482.                 k1 += 2;
  1483.                 xr = a[j1];
  1484.                 xi = -a[j1 + 1];
  1485.                 yr = a[k1];
  1486.                 yi = -a[k1 + 1];
  1487.                 a[j1] = yr;
  1488.                 a[j1 + 1] = yi;
  1489.                 a[k1] = xr;
  1490.                 a[k1 + 1] = xi;
  1491.                 j1 -= nm;
  1492.                 k1 -= nm;
  1493.                 xr = a[j1];
  1494.                 xi = -a[j1 + 1];
  1495.                 yr = a[k1];
  1496.                 yi = -a[k1 + 1];
  1497.                 a[j1] = yr;
  1498.                 a[j1 + 1] = yi;
  1499.                 a[k1] = xr;
  1500.                 a[k1 + 1] = xi;
  1501.                 j1 += 2;
  1502.                 k1 += nh;
  1503.                 xr = a[j1];
  1504.                 xi = -a[j1 + 1];
  1505.                 yr = a[k1];
  1506.                 yi = -a[k1 + 1];
  1507.                 a[j1] = yr;
  1508.                 a[j1 + 1] = yi;
  1509.                 a[k1] = xr;
  1510.                 a[k1 + 1] = xi;
  1511.                 j1 += nm;
  1512.                 k1 += nm;
  1513.                 xr = a[j1];
  1514.                 xi = -a[j1 + 1];
  1515.                 yr = a[k1];
  1516.                 yi = -a[k1 + 1];
  1517.                 a[j1] = yr;
  1518.                 a[j1 + 1] = yi;
  1519.                 a[k1] = xr;
  1520.                 a[k1 + 1] = xi;
  1521.                 j1 -= nh;
  1522.                 k1 -= 2;
  1523.                 xr = a[j1];
  1524.                 xi = -a[j1 + 1];
  1525.                 yr = a[k1];
  1526.                 yi = -a[k1 + 1];
  1527.                 a[j1] = yr;
  1528.                 a[j1 + 1] = yi;
  1529.                 a[k1] = xr;
  1530.                 a[k1 + 1] = xi;
  1531.                 j1 -= nm;
  1532.                 k1 -= nm;
  1533.                 xr = a[j1];
  1534.                 xi = -a[j1 + 1];
  1535.                 yr = a[k1];
  1536.                 yi = -a[k1 + 1];
  1537.                 a[j1] = yr;
  1538.                 a[j1 + 1] = yi;
  1539.                 a[k1] = xr;
  1540.                 a[k1 + 1] = xi;
  1541.             }
  1542.             k1 = 4 * k + ip[m + k];
  1543.             j1 = k1 + 2;
  1544.             k1 += nh;
  1545.             a[j1 - 1] = -a[j1 - 1];
  1546.             xr = a[j1];
  1547.             xi = -a[j1 + 1];
  1548.             yr = a[k1];
  1549.             yi = -a[k1 + 1];
  1550.             a[j1] = yr;
  1551.             a[j1 + 1] = yi;
  1552.             a[k1] = xr;
  1553.             a[k1 + 1] = xi;
  1554.             a[k1 + 3] = -a[k1 + 3];
  1555.             j1 += nm;
  1556.             k1 += nm;
  1557.             a[j1 - 1] = -a[j1 - 1];
  1558.             xr = a[j1];
  1559.             xi = -a[j1 + 1];
  1560.             yr = a[k1];
  1561.             yi = -a[k1 + 1];
  1562.             a[j1] = yr;
  1563.             a[j1 + 1] = yi;
  1564.             a[k1] = xr;
  1565.             a[k1 + 1] = xi;
  1566.             a[k1 + 3] = -a[k1 + 3];
  1567.         }
  1568.     }
  1569. }
  1570. void bitrv216(double *a)
  1571. {
  1572.     double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, 
  1573.         x5r, x5i, x7r, x7i, x8r, x8i, x10r, x10i, 
  1574.         x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i;
  1575.     
  1576.     x1r = a[2];
  1577.     x1i = a[3];
  1578.     x2r = a[4];
  1579.     x2i = a[5];
  1580.     x3r = a[6];
  1581.     x3i = a[7];
  1582.     x4r = a[8];
  1583.     x4i = a[9];
  1584.     x5r = a[10];
  1585.     x5i = a[11];
  1586.     x7r = a[14];
  1587.     x7i = a[15];
  1588.     x8r = a[16];
  1589.     x8i = a[17];
  1590.     x10r = a[20];
  1591.     x10i = a[21];
  1592.     x11r = a[22];
  1593.     x11i = a[23];
  1594.     x12r = a[24];
  1595.     x12i = a[25];
  1596.     x13r = a[26];
  1597.     x13i = a[27];
  1598.     x14r = a[28];
  1599.     x14i = a[29];
  1600.     a[2] = x8r;
  1601.     a[3] = x8i;
  1602.     a[4] = x4r;
  1603.     a[5] = x4i;
  1604.     a[6] = x12r;
  1605.     a[7] = x12i;
  1606.     a[8] = x2r;
  1607.     a[9] = x2i;
  1608.     a[10] = x10r;
  1609.     a[11] = x10i;
  1610.     a[14] = x14r;
  1611.     a[15] = x14i;
  1612.     a[16] = x1r;
  1613.     a[17] = x1i;
  1614.     a[20] = x5r;
  1615.     a[21] = x5i;
  1616.     a[22] = x13r;
  1617.     a[23] = x13i;
  1618.     a[24] = x3r;
  1619.     a[25] = x3i;
  1620.     a[26] = x11r;
  1621.     a[27] = x11i;
  1622.     a[28] = x7r;
  1623.     a[29] = x7i;
  1624. }
  1625. void bitrv216neg(double *a)
  1626. {
  1627.     double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, 
  1628.         x5r, x5i, x6r, x6i, x7r, x7i, x8r, x8i, 
  1629.         x9r, x9i, x10r, x10i, x11r, x11i, x12r, x12i, 
  1630.         x13r, x13i, x14r, x14i, x15r, x15i;
  1631.     
  1632.     x1r = a[2];
  1633.     x1i = a[3];
  1634.     x2r = a[4];
  1635.     x2i = a[5];
  1636.     x3r = a[6];
  1637.     x3i = a[7];
  1638.     x4r = a[8];
  1639.     x4i = a[9];
  1640.     x5r = a[10];
  1641.     x5i = a[11];
  1642.     x6r = a[12];
  1643.     x6i = a[13];
  1644.     x7r = a[14];
  1645.     x7i = a[15];
  1646.     x8r = a[16];
  1647.     x8i = a[17];
  1648.     x9r = a[18];
  1649.     x9i = a[19];
  1650.     x10r = a[20];
  1651.     x10i = a[21];
  1652.     x11r = a[22];
  1653.     x11i = a[23];
  1654.     x12r = a[24];
  1655.     x12i = a[25];
  1656.     x13r = a[26];
  1657.     x13i = a[27];
  1658.     x14r = a[28];
  1659.     x14i = a[29];
  1660.     x15r = a[30];
  1661.     x15i = a[31];
  1662.     a[2] = x15r;
  1663.     a[3] = x15i;
  1664.     a[4] = x7r;
  1665.     a[5] = x7i;
  1666.     a[6] = x11r;
  1667.     a[7] = x11i;
  1668.     a[8] = x3r;
  1669.     a[9] = x3i;
  1670.     a[10] = x13r;
  1671.     a[11] = x13i;
  1672.     a[12] = x5r;
  1673.     a[13] = x5i;
  1674.     a[14] = x9r;
  1675.     a[15] = x9i;
  1676.     a[16] = x1r;
  1677.     a[17] = x1i;
  1678.     a[18] = x14r;
  1679.     a[19] = x14i;
  1680.     a[20] = x6r;
  1681.     a[21] = x6i;
  1682.     a[22] = x10r;
  1683.     a[23] = x10i;
  1684.     a[24] = x2r;
  1685.     a[25] = x2i;
  1686.     a[26] = x12r;
  1687.     a[27] = x12i;
  1688.     a[28] = x4r;
  1689.     a[29] = x4i;
  1690.     a[30] = x8r;
  1691.     a[31] = x8i;
  1692. }
  1693. void bitrv208(double *a)
  1694. {
  1695.     double x1r, x1i, x3r, x3i, x4r, x4i, x6r, x6i;
  1696.     
  1697.     x1r = a[2];
  1698.     x1i = a[3];
  1699.     x3r = a[6];
  1700.     x3i = a[7];
  1701.     x4r = a[8];
  1702.     x4i = a[9];
  1703.     x6r = a[12];
  1704.     x6i = a[13];
  1705.     a[2] = x4r;
  1706.     a[3] = x4i;
  1707.     a[6] = x6r;
  1708.     a[7] = x6i;
  1709.     a[8] = x1r;
  1710.     a[9] = x1i;
  1711.     a[12] = x3r;
  1712.     a[13] = x3i;
  1713. }
  1714. void bitrv208neg(double *a)
  1715. {
  1716.     double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, 
  1717.         x5r, x5i, x6r, x6i, x7r, x7i;
  1718.     
  1719.     x1r = a[2];
  1720.     x1i = a[3];
  1721.     x2r = a[4];
  1722.     x2i = a[5];
  1723.     x3r = a[6];
  1724.     x3i = a[7];
  1725.     x4r = a[8];
  1726.     x4i = a[9];
  1727.     x5r = a[10];
  1728.     x5i = a[11];
  1729.     x6r = a[12];
  1730.     x6i = a[13];
  1731.     x7r = a[14];
  1732.     x7i = a[15];
  1733.     a[2] = x7r;
  1734.     a[3] = x7i;
  1735.     a[4] = x3r;
  1736.     a[5] = x3i;
  1737.     a[6] = x5r;
  1738.     a[7] = x5i;
  1739.     a[8] = x1r;
  1740.     a[9] = x1i;
  1741.     a[10] = x6r;
  1742.     a[11] = x6i;
  1743.     a[12] = x2r;
  1744.     a[13] = x2i;
  1745.     a[14] = x4r;
  1746.     a[15] = x4i;
  1747. }
  1748. void cftf1st(int n, double *a, double *w)
  1749. {
  1750.     int j, j0, j1, j2, j3, k, m, mh;
  1751.     double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, 
  1752.         wd1r, wd1i, wd3r, wd3i;
  1753.     double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
  1754.         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i;
  1755.     
  1756.     mh = n >> 3;
  1757.     m = 2 * mh;
  1758.     j1 = m;
  1759.     j2 = j1 + m;
  1760.     j3 = j2 + m;
  1761.     x0r = a[0] + a[j2];
  1762.     x0i = a[1] + a[j2 + 1];
  1763.     x1r = a[0] - a[j2];
  1764.     x1i = a[1] - a[j2 + 1];
  1765.     x2r = a[j1] + a[j3];
  1766.     x2i = a[j1 + 1] + a[j3 + 1];
  1767.     x3r = a[j1] - a[j3];
  1768.     x3i = a[j1 + 1] - a[j3 + 1];
  1769.     a[0] = x0r + x2r;
  1770.     a[1] = x0i + x2i;
  1771.     a[j1] = x0r - x2r;
  1772.     a[j1 + 1] = x0i - x2i;
  1773.     a[j2] = x1r - x3i;
  1774.     a[j2 + 1] = x1i + x3r;
  1775.     a[j3] = x1r + x3i;
  1776.     a[j3 + 1] = x1i - x3r;
  1777.     wn4r = w[1];
  1778.     csc1 = w[2];
  1779.     csc3 = w[3];
  1780.     wd1r = 1;
  1781.     wd1i = 0;
  1782.     wd3r = 1;
  1783.     wd3i = 0;
  1784.     k = 0;
  1785.     for (j = 2; j < mh - 2; j += 4) {
  1786.         k += 4;
  1787.         wk1r = csc1 * (wd1r + w[k]);
  1788.         wk1i = csc1 * (wd1i + w[k + 1]);
  1789.         wk3r = csc3 * (wd3r + w[k + 2]);
  1790.         wk3i = csc3 * (wd3i + w[k + 3]);
  1791.         wd1r = w[k];
  1792.         wd1i = w[k + 1];
  1793.         wd3r = w[k + 2];
  1794.         wd3i = w[k + 3];
  1795.         j1 = j + m;
  1796.         j2 = j1 + m;
  1797.         j3 = j2 + m;
  1798.         x0r = a[j] + a[j2];
  1799.         x0i = a[j + 1] + a[j2 + 1];
  1800.         x1r = a[j] - a[j2];
  1801.         x1i = a[j + 1] - a[j2 + 1];
  1802.         y0r = a[j + 2] + a[j2 + 2];
  1803.         y0i = a[j + 3] + a[j2 + 3];
  1804.         y1r = a[j + 2] - a[j2 + 2];
  1805.         y1i = a[j + 3] - a[j2 + 3];
  1806.         x2r = a[j1] + a[j3];
  1807.         x2i = a[j1 + 1] + a[j3 + 1];
  1808.         x3r = a[j1] - a[j3];
  1809.         x3i = a[j1 + 1] - a[j3 + 1];
  1810.         y2r = a[j1 + 2] + a[j3 + 2];
  1811.         y2i = a[j1 + 3] + a[j3 + 3];
  1812.         y3r = a[j1 + 2] - a[j3 + 2];
  1813.         y3i = a[j1 + 3] - a[j3 + 3];
  1814.         a[j] = x0r + x2r;
  1815.         a[j + 1] = x0i + x2i;
  1816.         a[j + 2] = y0r + y2r;
  1817.         a[j + 3] = y0i + y2i;
  1818.         a[j1] = x0r - x2r;
  1819.         a[j1 + 1] = x0i - x2i;
  1820.         a[j1 + 2] = y0r - y2r;
  1821.         a[j1 + 3] = y0i - y2i;
  1822.         x0r = x1r - x3i;
  1823.         x0i = x1i + x3r;
  1824.         a[j2] = wk1r * x0r - wk1i * x0i;
  1825.         a[j2 + 1] = wk1r * x0i + wk1i * x0r;
  1826.         x0r = y1r - y3i;
  1827.         x0i = y1i + y3r;
  1828.         a[j2 + 2] = wd1r * x0r - wd1i * x0i;
  1829.         a[j2 + 3] = wd1r * x0i + wd1i * x0r;
  1830.         x0r = x1r + x3i;
  1831.         x0i = x1i - x3r;
  1832.         a[j3] = wk3r * x0r + wk3i * x0i;
  1833.         a[j3 + 1] = wk3r * x0i - wk3i * x0r;
  1834.         x0r = y1r + y3i;
  1835.         x0i = y1i - y3r;
  1836.         a[j3 + 2] = wd3r * x0r + wd3i * x0i;
  1837.         a[j3 + 3] = wd3r * x0i - wd3i * x0r;
  1838.         j0 = m - j;
  1839.         j1 = j0 + m;
  1840.         j2 = j1 + m;
  1841.         j3 = j2 + m;
  1842.         x0r = a[j0] + a[j2];
  1843.         x0i = a[j0 + 1] + a[j2 + 1];
  1844.         x1r = a[j0] - a[j2];
  1845.         x1i = a[j0 + 1] - a[j2 + 1];
  1846.         y0r = a[j0 - 2] + a[j2 - 2];
  1847.         y0i = a[j0 - 1] + a[j2 - 1];
  1848.         y1r = a[j0 - 2] - a[j2 - 2];
  1849.         y1i = a[j0 - 1] - a[j2 - 1];
  1850.         x2r = a[j1] + a[j3];
  1851.         x2i = a[j1 + 1] + a[j3 + 1];
  1852.         x3r = a[j1] - a[j3];
  1853.         x3i = a[j1 + 1] - a[j3 + 1];
  1854.         y2r = a[j1 - 2] + a[j3 - 2];
  1855.         y2i = a[j1 - 1] + a[j3 - 1];
  1856.         y3r = a[j1 - 2] - a[j3 - 2];
  1857.         y3i = a[j1 - 1] - a[j3 - 1];
  1858.         a[j0] = x0r + x2r;
  1859.         a[j0 + 1] = x0i + x2i;
  1860.         a[j0 - 2] = y0r + y2r;
  1861.         a[j0 - 1] = y0i + y2i;
  1862.         a[j1] = x0r - x2r;
  1863.         a[j1 + 1] = x0i - x2i;
  1864.         a[j1 - 2] = y0r - y2r;
  1865.         a[j1 - 1] = y0i - y2i;
  1866.         x0r = x1r - x3i;
  1867.         x0i = x1i + x3r;
  1868.         a[j2] = wk1i * x0r - wk1r * x0i;
  1869.         a[j2 + 1] = wk1i * x0i + wk1r * x0r;
  1870.         x0r = y1r - y3i;
  1871.         x0i = y1i + y3r;
  1872.         a[j2 - 2] = wd1i * x0r - wd1r * x0i;
  1873.         a[j2 - 1] = wd1i * x0i + wd1r * x0r;
  1874.         x0r = x1r + x3i;
  1875.         x0i = x1i - x3r;
  1876.         a[j3] = wk3i * x0r + wk3r * x0i;
  1877.         a[j3 + 1] = wk3i * x0i - wk3r * x0r;
  1878.         x0r = y1r + y3i;
  1879.         x0i = y1i - y3r;
  1880.         a[j3 - 2] = wd3i * x0r + wd3r * x0i;
  1881.         a[j3 - 1] = wd3i * x0i - wd3r * x0r;
  1882.     }
  1883.     wk1r = csc1 * (wd1r + wn4r);
  1884.     wk1i = csc1 * (wd1i + wn4r);
  1885.     wk3r = csc3 * (wd3r - wn4r);
  1886.     wk3i = csc3 * (wd3i - wn4r);
  1887.     j0 = mh;
  1888.     j1 = j0 + m;
  1889.     j2 = j1 + m;
  1890.     j3 = j2 + m;
  1891.     x0r = a[j0 - 2] + a[j2 - 2];
  1892.     x0i = a[j0 - 1] + a[j2 - 1];
  1893.     x1r = a[j0 - 2] - a[j2 - 2];
  1894.     x1i = a[j0 - 1] - a[j2 - 1];
  1895.     x2r = a[j1 - 2] + a[j3 - 2];
  1896.     x2i = a[j1 - 1] + a[j3 - 1];
  1897.     x3r = a[j1 - 2] - a[j3 - 2];
  1898.     x3i = a[j1 - 1] - a[j3 - 1];
  1899.     a[j0 - 2] = x0r + x2r;
  1900.     a[j0 - 1] = x0i + x2i;
  1901.     a[j1 - 2] = x0r - x2r;
  1902.     a[j1 - 1] = x0i - x2i;
  1903.     x0r = x1r - x3i;
  1904.     x0i = x1i + x3r;
  1905.     a[j2 - 2] = wk1r * x0r - wk1i * x0i;
  1906.     a[j2 - 1] = wk1r * x0i + wk1i * x0r;
  1907.     x0r = x1r + x3i;
  1908.     x0i = x1i - x3r;
  1909.     a[j3 - 2] = wk3r * x0r + wk3i * x0i;
  1910.     a[j3 - 1] = wk3r * x0i - wk3i * x0r;
  1911.     x0r = a[j0] + a[j2];
  1912.     x0i = a[j0 + 1] + a[j2 + 1];
  1913.     x1r = a[j0] - a[j2];
  1914.     x1i = a[j0 + 1] - a[j2 + 1];
  1915.     x2r = a[j1] + a[j3];
  1916.     x2i = a[j1 + 1] + a[j3 + 1];
  1917.     x3r = a[j1] - a[j3];
  1918.     x3i = a[j1 + 1] - a[j3 + 1];
  1919.     a[j0] = x0r + x2r;
  1920.     a[j0 + 1] = x0i + x2i;
  1921.     a[j1] = x0r - x2r;
  1922.     a[j1 + 1] = x0i - x2i;
  1923.     x0r = x1r - x3i;
  1924.     x0i = x1i + x3r;
  1925.     a[j2] = wn4r * (x0r - x0i);
  1926.     a[j2 + 1] = wn4r * (x0i + x0r);
  1927.     x0r = x1r + x3i;
  1928.     x0i = x1i - x3r;
  1929.     a[j3] = -wn4r * (x0r + x0i);
  1930.     a[j3 + 1] = -wn4r * (x0i - x0r);
  1931.     x0r = a[j0 + 2] + a[j2 + 2];
  1932.     x0i = a[j0 + 3] + a[j2 + 3];
  1933.     x1r = a[j0 + 2] - a[j2 + 2];
  1934.     x1i = a[j0 + 3] - a[j2 + 3];
  1935.     x2r = a[j1 + 2] + a[j3 + 2];
  1936.     x2i = a[j1 + 3] + a[j3 + 3];
  1937.     x3r = a[j1 + 2] - a[j3 + 2];
  1938.     x3i = a[j1 + 3] - a[j3 + 3];
  1939.     a[j0 + 2] = x0r + x2r;
  1940.     a[j0 + 3] = x0i + x2i;
  1941.     a[j1 + 2] = x0r - x2r;
  1942.     a[j1 + 3] = x0i - x2i;
  1943.     x0r = x1r - x3i;
  1944.     x0i = x1i + x3r;
  1945.     a[j2 + 2] = wk1i * x0r - wk1r * x0i;
  1946.     a[j2 + 3] = wk1i * x0i + wk1r * x0r;
  1947.     x0r = x1r + x3i;
  1948.     x0i = x1i - x3r;
  1949.     a[j3 + 2] = wk3i * x0r + wk3r * x0i;
  1950.     a[j3 + 3] = wk3i * x0i - wk3r * x0r;
  1951. }
  1952. void cftb1st(int n, double *a, double *w)
  1953. {
  1954.     int j, j0, j1, j2, j3, k, m, mh;
  1955.     double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, 
  1956.         wd1r, wd1i, wd3r, wd3i;
  1957.     double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
  1958.         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i;
  1959.     
  1960.     mh = n >> 3;
  1961.     m = 2 * mh;
  1962.     j1 = m;
  1963.     j2 = j1 + m;
  1964.     j3 = j2 + m;
  1965.     x0r = a[0] + a[j2];
  1966.     x0i = -a[1] - a[j2 + 1];
  1967.     x1r = a[0] - a[j2];
  1968.     x1i = -a[1] + a[j2 + 1];
  1969.     x2r = a[j1] + a[j3];
  1970.     x2i = a[j1 + 1] + a[j3 + 1];
  1971.     x3r = a[j1] - a[j3];
  1972.     x3i = a[j1 + 1] - a[j3 + 1];
  1973.     a[0] = x0r + x2r;
  1974.     a[1] = x0i - x2i;
  1975.     a[j1] = x0r - x2r;
  1976.     a[j1 + 1] = x0i + x2i;
  1977.     a[j2] = x1r + x3i;
  1978.     a[j2 + 1] = x1i + x3r;
  1979.     a[j3] = x1r - x3i;
  1980.     a[j3 + 1] = x1i - x3r;
  1981.     wn4r = w[1];
  1982.     csc1 = w[2];
  1983.     csc3 = w[3];
  1984.     wd1r = 1;
  1985.     wd1i = 0;
  1986.     wd3r = 1;
  1987.     wd3i = 0;
  1988.     k = 0;
  1989.     for (j = 2; j < mh - 2; j += 4) {
  1990.         k += 4;
  1991.         wk1r = csc1 * (wd1r + w[k]);
  1992.         wk1i = csc1 * (wd1i + w[k + 1]);
  1993.         wk3r = csc3 * (wd3r + w[k + 2]);
  1994.         wk3i = csc3 * (wd3i + w[k + 3]);
  1995.         wd1r = w[k];
  1996.         wd1i = w[k + 1];
  1997.         wd3r = w[k + 2];
  1998.         wd3i = w[k + 3];
  1999.         j1 = j + m;
  2000.         j2 = j1 + m;
  2001.         j3 = j2 + m;
  2002.         x0r = a[j] + a[j2];
  2003.         x0i = -a[j + 1] - a[j2 + 1];
  2004.         x1r = a[j] - a[j2];
  2005.         x1i = -a[j + 1] + a[j2 + 1];
  2006.         y0r = a[j + 2] + a[j2 + 2];
  2007.         y0i = -a[j + 3] - a[j2 + 3];
  2008.         y1r = a[j + 2] - a[j2 + 2];
  2009.         y1i = -a[j + 3] + a[j2 + 3];
  2010.         x2r = a[j1] + a[j3];
  2011.         x2i = a[j1 + 1] + a[j3 + 1];
  2012.         x3r = a[j1] - a[j3];
  2013.         x3i = a[j1 + 1] - a[j3 + 1];
  2014.         y2r = a[j1 + 2] + a[j3 + 2];
  2015.         y2i = a[j1 + 3] + a[j3 + 3];
  2016.         y3r = a[j1 + 2] - a[j3 + 2];
  2017.         y3i = a[j1 + 3] - a[j3 + 3];
  2018.         a[j] = x0r + x2r;
  2019.         a[j + 1] = x0i - x2i;
  2020.         a[j + 2] = y0r + y2r;
  2021.         a[j + 3] = y0i - y2i;
  2022.         a[j1] = x0r - x2r;
  2023.         a[j1 + 1] = x0i + x2i;
  2024.         a[j1 + 2] = y0r - y2r;
  2025.         a[j1 + 3] = y0i + y2i;
  2026.         x0r = x1r + x3i;
  2027.         x0i = x1i + x3r;
  2028.         a[j2] = wk1r * x0r - wk1i * x0i;
  2029.         a[j2 + 1] = wk1r * x0i + wk1i * x0r;
  2030.         x0r = y1r + y3i;
  2031.         x0i = y1i + y3r;
  2032.         a[j2 + 2] = wd1r * x0r - wd1i * x0i;
  2033.         a[j2 + 3] = wd1r * x0i + wd1i * x0r;
  2034.         x0r = x1r - x3i;
  2035.         x0i = x1i - x3r;
  2036.         a[j3] = wk3r * x0r + wk3i * x0i;
  2037.         a[j3 + 1] = wk3r * x0i - wk3i * x0r;
  2038.         x0r = y1r - y3i;
  2039.         x0i = y1i - y3r;
  2040.         a[j3 + 2] = wd3r * x0r + wd3i * x0i;
  2041.         a[j3 + 3] = wd3r * x0i - wd3i * x0r;
  2042.         j0 = m - j;
  2043.         j1 = j0 + m;
  2044.         j2 = j1 + m;
  2045.         j3 = j2 + m;
  2046.         x0r = a[j0] + a[j2];
  2047.         x0i = -a[j0 + 1] - a[j2 + 1];
  2048.         x1r = a[j0] - a[j2];
  2049.         x1i = -a[j0 + 1] + a[j2 + 1];
  2050.         y0r = a[j0 - 2] + a[j2 - 2];
  2051.         y0i = -a[j0 - 1] - a[j2 - 1];
  2052.         y1r = a[j0 - 2] - a[j2 - 2];
  2053.         y1i = -a[j0 - 1] + a[j2 - 1];
  2054.         x2r = a[j1] + a[j3];
  2055.         x2i = a[j1 + 1] + a[j3 + 1];
  2056.         x3r = a[j1] - a[j3];
  2057.         x3i = a[j1 + 1] - a[j3 + 1];
  2058.         y2r = a[j1 - 2] + a[j3 - 2];
  2059.         y2i = a[j1 - 1] + a[j3 - 1];
  2060.         y3r = a[j1 - 2] - a[j3 - 2];
  2061.         y3i = a[j1 - 1] - a[j3 - 1];
  2062.         a[j0] = x0r + x2r;
  2063.         a[j0 + 1] = x0i - x2i;
  2064.         a[j0 - 2] = y0r + y2r;
  2065.         a[j0 - 1] = y0i - y2i;
  2066.         a[j1] = x0r - x2r;
  2067.         a[j1 + 1] = x0i + x2i;
  2068.         a[j1 - 2] = y0r - y2r;
  2069.         a[j1 - 1] = y0i + y2i;
  2070.         x0r = x1r + x3i;
  2071.         x0i = x1i + x3r;
  2072.         a[j2] = wk1i * x0r - wk1r * x0i;
  2073.         a[j2 + 1] = wk1i * x0i + wk1r * x0r;
  2074.         x0r = y1r + y3i;
  2075.         x0i = y1i + y3r;
  2076.         a[j2 - 2] = wd1i * x0r - wd1r * x0i;
  2077.         a[j2 - 1] = wd1i * x0i + wd1r * x0r;
  2078.         x0r = x1r - x3i;
  2079.         x0i = x1i - x3r;
  2080.         a[j3] = wk3i * x0r + wk3r * x0i;
  2081.         a[j3 + 1] = wk3i * x0i - wk3r * x0r;
  2082.         x0r = y1r - y3i;
  2083.         x0i = y1i - y3r;
  2084.         a[j3 - 2] = wd3i * x0r + wd3r * x0i;
  2085.         a[j3 - 1] = wd3i * x0i - wd3r * x0r;
  2086.     }
  2087.     wk1r = csc1 * (wd1r + wn4r);
  2088.     wk1i = csc1 * (wd1i + wn4r);
  2089.     wk3r = csc3 * (wd3r - wn4r);
  2090.     wk3i = csc3 * (wd3i - wn4r);
  2091.     j0 = mh;
  2092.     j1 = j0 + m;
  2093.     j2 = j1 + m;
  2094.     j3 = j2 + m;
  2095.     x0r = a[j0 - 2] + a[j2 - 2];
  2096.     x0i = -a[j0 - 1] - a[j2 - 1];
  2097.     x1r = a[j0 - 2] - a[j2 - 2];
  2098.     x1i = -a[j0 - 1] + a[j2 - 1];
  2099.     x2r = a[j1 - 2] + a[j3 - 2];
  2100.     x2i = a[j1 - 1] + a[j3 - 1];
  2101.     x3r = a[j1 - 2] - a[j3 - 2];
  2102.     x3i = a[j1 - 1] - a[j3 - 1];
  2103.     a[j0 - 2] = x0r + x2r;
  2104.     a[j0 - 1] = x0i - x2i;
  2105.     a[j1 - 2] = x0r - x2r;
  2106.     a[j1 - 1] = x0i + x2i;
  2107.     x0r = x1r + x3i;
  2108.     x0i = x1i + x3r;
  2109.     a[j2 - 2] = wk1r * x0r - wk1i * x0i;
  2110.     a[j2 - 1] = wk1r * x0i + wk1i * x0r;
  2111.     x0r = x1r - x3i;
  2112.     x0i = x1i - x3r;
  2113.     a[j3 - 2] = wk3r * x0r + wk3i * x0i;
  2114.     a[j3 - 1] = wk3r * x0i - wk3i * x0r;
  2115.     x0r = a[j0] + a[j2];
  2116.     x0i = -a[j0 + 1] - a[j2 + 1];
  2117.     x1r = a[j0] - a[j2];
  2118.     x1i = -a[j0 + 1] + a[j2 + 1];
  2119.     x2r = a[j1] + a[j3];
  2120.     x2i = a[j1 + 1] + a[j3 + 1];
  2121.     x3r = a[j1] - a[j3];
  2122.     x3i = a[j1 + 1] - a[j3 + 1];
  2123.     a[j0] = x0r + x2r;
  2124.     a[j0 + 1] = x0i - x2i;
  2125.     a[j1] = x0r - x2r;
  2126.     a[j1 + 1] = x0i + x2i;
  2127.     x0r = x1r + x3i;
  2128.     x0i = x1i + x3r;
  2129.     a[j2] = wn4r * (x0r - x0i);
  2130.     a[j2 + 1] = wn4r * (x0i + x0r);
  2131.     x0r = x1r - x3i;
  2132.     x0i = x1i - x3r;
  2133.     a[j3] = -wn4r * (x0r + x0i);
  2134.     a[j3 + 1] = -wn4r * (x0i - x0r);
  2135.     x0r = a[j0 + 2] + a[j2 + 2];
  2136.     x0i = -a[j0 + 3] - a[j2 + 3];
  2137.     x1r = a[j0 + 2] - a[j2 + 2];
  2138.     x1i = -a[j0 + 3] + a[j2 + 3];
  2139.     x2r = a[j1 + 2] + a[j3 + 2];
  2140.     x2i = a[j1 + 3] + a[j3 + 3];
  2141.     x3r = a[j1 + 2] - a[j3 + 2];
  2142.     x3i = a[j1 + 3] - a[j3 + 3];
  2143.     a[j0 + 2] = x0r + x2r;
  2144.     a[j0 + 3] = x0i - x2i;
  2145.     a[j1 + 2] = x0r - x2r;
  2146.     a[j1 + 3] = x0i + x2i;
  2147.     x0r = x1r + x3i;
  2148.     x0i = x1i + x3r;
  2149.     a[j2 + 2] = wk1i * x0r - wk1r * x0i;
  2150.     a[j2 + 3] = wk1i * x0i + wk1r * x0r;
  2151.     x0r = x1r - x3i;
  2152.     x0i = x1i - x3r;
  2153.     a[j3 + 2] = wk3i * x0r + wk3r * x0i;
  2154.     a[j3 + 3] = wk3i * x0i - wk3r * x0r;
  2155. }
  2156. #ifdef USE_CDFT_THREADS
  2157. struct cdft_arg_st {
  2158.     int n0;
  2159.     int n;
  2160.     double *a;
  2161.     int nw;
  2162.     double *w;
  2163. };
  2164. typedef struct cdft_arg_st cdft_arg_t;
  2165. void cftrec4_th(int n, double *a, int nw, double *w)
  2166. {
  2167.     void *cftrec1_th(void *p);
  2168.     void *cftrec2_th(void *p);
  2169.     int i, idiv4, m, nthread;
  2170.     cdft_thread_t th[4];
  2171.     cdft_arg_t ag[4];
  2172.     
  2173.     nthread = 2;
  2174.     idiv4 = 0;
  2175.     m = n >> 1;
  2176.     if (n > CDFT_4THREADS_BEGIN_N) {
  2177.         nthread = 4;
  2178.         idiv4 = 1;
  2179.         m >>= 1;
  2180.     }
  2181.     for (i = 0; i < nthread; i++) {
  2182.         ag[i].n0 = n;
  2183.         ag[i].n = m;
  2184.         ag[i].a = &a[i * m];
  2185.         ag[i].nw = nw;
  2186.         ag[i].w = w;
  2187.         if (i != idiv4) {
  2188.             cdft_thread_create(&th[i], cftrec1_th, &ag[i]);
  2189.         } else {
  2190.             cdft_thread_create(&th[i], cftrec2_th, &ag[i]);
  2191.         }
  2192.     }
  2193.     for (i = 0; i < nthread; i++) {
  2194.         cdft_thread_wait(th[i]);
  2195.     }
  2196. }
  2197. void *cftrec1_th(void *p)
  2198. {
  2199.     int cfttree(int n, int j, int k, double *a, int nw, double *w);
  2200.     void cftleaf(int n, int isplt, double *a, int nw, double *w);
  2201.     void cftmdl1(int n, double *a, double *w);
  2202.     int isplt, j, k, m, n, n0, nw;
  2203.     double *a, *w;
  2204.     
  2205.     n0 = ((cdft_arg_t *) p)->n0;
  2206.     n = ((cdft_arg_t *) p)->n;
  2207.     a = ((cdft_arg_t *) p)->a;
  2208.     nw = ((cdft_arg_t *) p)->nw;
  2209.     w = ((cdft_arg_t *) p)->w;
  2210.     m = n0;
  2211.     while (m > 512) {
  2212.         m >>= 2;
  2213.         cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]);
  2214.     }
  2215.     cftleaf(m, 1, &a[n - m], nw, w);
  2216.     k = 0;
  2217.     for (j = n - m; j > 0; j -= m) {
  2218.         k++;
  2219.         isplt = cfttree(m, j, k, a, nw, w);
  2220.         cftleaf(m, isplt, &a[j - m], nw, w);
  2221.     }
  2222.     return (void *) 0;
  2223. }
  2224. void *cftrec2_th(void *p)
  2225. {
  2226.     int cfttree(int n, int j, int k, double *a, int nw, double *w);
  2227.     void cftleaf(int n, int isplt, double *a, int nw, double *w);
  2228.     void cftmdl2(int n, double *a, double *w);
  2229.     int isplt, j, k, m, n, n0, nw;
  2230.     double *a, *w;
  2231.     
  2232.     n0 = ((cdft_arg_t *) p)->n0;
  2233.     n = ((cdft_arg_t *) p)->n;
  2234.     a = ((cdft_arg_t *) p)->a;
  2235.     nw = ((cdft_arg_t *) p)->nw;
  2236.     w = ((cdft_arg_t *) p)->w;
  2237.     k = 1;
  2238.     m = n0;
  2239.     while (m > 512) {
  2240.         m >>= 2;
  2241.         k <<= 2;
  2242.         cftmdl2(m, &a[n - m], &w[nw - m]);
  2243.     }
  2244.     cftleaf(m, 0, &a[n - m], nw, w);
  2245.     k >>= 1;
  2246.     for (j = n - m; j > 0; j -= m) {
  2247.         k++;
  2248.         isplt = cfttree(m, j, k, a, nw, w);
  2249.         cftleaf(m, isplt, &a[j - m], nw, w);
  2250.     }
  2251.     return (void *) 0;
  2252. }
  2253. #endif /* USE_CDFT_THREADS */
  2254. void cftrec4(int n, double *a, int nw, double *w)
  2255. {
  2256.     int cfttree(int n, int j, int k, double *a, int nw, double *w);
  2257.     void cftleaf(int n, int isplt, double *a, int nw, double *w);
  2258.     void cftmdl1(int n, double *a, double *w);
  2259.     int isplt, j, k, m;
  2260.     
  2261.     m = n;
  2262.     while (m > 512) {
  2263.         m >>= 2;
  2264.         cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]);
  2265.     }
  2266.     cftleaf(m, 1, &a[n - m], nw, w);
  2267.     k = 0;
  2268.     for (j = n - m; j > 0; j -= m) {
  2269.         k++;
  2270.         isplt = cfttree(m, j, k, a, nw, w);
  2271.         cftleaf(m, isplt, &a[j - m], nw, w);
  2272.     }
  2273. }
  2274. int cfttree(int n, int j, int k, double *a, int nw, double *w)
  2275. {
  2276.     void cftmdl1(int n, double *a, double *w);
  2277.     void cftmdl2(int n, double *a, double *w);
  2278.     int i, isplt, m;
  2279.     
  2280.     if ((k & 3) != 0) {
  2281.         isplt = k & 1;
  2282.         if (isplt != 0) {
  2283.             cftmdl1(n, &a[j - n], &w[nw - (n >> 1)]);
  2284.         } else {
  2285.             cftmdl2(n, &a[j - n], &w[nw - n]);
  2286.         }
  2287.     } else {
  2288.         m = n;
  2289.         for (i = k; (i & 3) == 0; i >>= 2) {
  2290.             m <<= 2;
  2291.         }
  2292.         isplt = i & 1;
  2293.         if (isplt != 0) {
  2294.             while (m > 128) {
  2295.                 cftmdl1(m, &a[j - m], &w[nw - (m >> 1)]);
  2296.                 m >>= 2;
  2297.             }
  2298.         } else {
  2299.             while (m > 128) {
  2300.                 cftmdl2(m, &a[j - m], &w[nw - m]);
  2301.                 m >>= 2;
  2302.             }
  2303.         }
  2304.     }
  2305.     return isplt;
  2306. }
  2307. void cftleaf(int n, int isplt, double *a, int nw, double *w)
  2308. {
  2309.     void cftmdl1(int n, double *a, double *w);
  2310.     void cftmdl2(int n, double *a, double *w);
  2311.     void cftf161(double *a, double *w);
  2312.     void cftf162(double *a, double *w);
  2313.     void cftf081(double *a, double *w);
  2314.     void cftf082(double *a, double *w);
  2315.     
  2316.     if (n == 512) {
  2317.         cftmdl1(128, a, &w[nw - 64]);
  2318.         cftf161(a, &w[nw - 8]);
  2319.         cftf162(&a[32], &w[nw - 32]);
  2320.         cftf161(&a[64], &w[nw - 8]);
  2321.         cftf161(&a[96], &w[nw - 8]);
  2322.         cftmdl2(128, &a[128], &w[nw - 128]);
  2323.         cftf161(&a[128], &w[nw - 8]);
  2324.         cftf162(&a[160], &w[nw - 32]);
  2325.         cftf161(&a[192], &w[nw - 8]);
  2326.         cftf162(&a[224], &w[nw - 32]);
  2327.         cftmdl1(128, &a[256], &w[nw - 64]);
  2328.         cftf161(&a[256], &w[nw - 8]);
  2329.         cftf162(&a[288], &w[nw - 32]);
  2330.         cftf161(&a[320], &w[nw - 8]);
  2331.         cftf161(&a[352], &w[nw - 8]);
  2332.         if (isplt != 0) {
  2333.             cftmdl1(128, &a[384], &w[nw - 64]);
  2334.             cftf161(&a[480], &w[nw - 8]);
  2335.         } else {
  2336.             cftmdl2(128, &a[384], &w[nw - 128]);
  2337.             cftf162(&a[480], &w[nw - 32]);
  2338.         }
  2339.         cftf161(&a[384], &w[nw - 8]);
  2340.         cftf162(&a[416], &w[nw - 32]);
  2341.         cftf161(&a[448], &w[nw - 8]);
  2342.     } else {
  2343.         cftmdl1(64, a, &w[nw - 32]);
  2344.         cftf081(a, &w[nw - 8]);
  2345.         cftf082(&a[16], &w[nw - 8]);
  2346.         cftf081(&a[32], &w[nw - 8]);
  2347.         cftf081(&a[48], &w[nw - 8]);
  2348.         cftmdl2(64, &a[64], &w[nw - 64]);
  2349.         cftf081(&a[64], &w[nw - 8]);
  2350.         cftf082(&a[80], &w[nw - 8]);
  2351.         cftf081(&a[96], &w[nw - 8]);
  2352.         cftf082(&a[112], &w[nw - 8]);
  2353.         cftmdl1(64, &a[128], &w[nw - 32]);
  2354.         cftf081(&a[128], &w[nw - 8]);
  2355.         cftf082(&a[144], &w[nw - 8]);
  2356.         cftf081(&a[160], &w[nw - 8]);
  2357.         cftf081(&a[176], &w[nw - 8]);
  2358.         if (isplt != 0) {
  2359.             cftmdl1(64, &a[192], &w[nw - 32]);
  2360.             cftf081(&a[240], &w[nw - 8]);
  2361.         } else {
  2362.             cftmdl2(64, &a[192], &w[nw - 64]);
  2363.             cftf082(&a[240], &w[nw - 8]);
  2364.         }
  2365.         cftf081(&a[192], &w[nw - 8]);
  2366.         cftf082(&a[208], &w[nw - 8]);
  2367.         cftf081(&a[224], &w[nw - 8]);
  2368.     }
  2369. }
  2370. void cftmdl1(int n, double *a, double *w)
  2371. {
  2372.     int j, j0, j1, j2, j3, k, m, mh;
  2373.     double wn4r, wk1r, wk1i, wk3r, wk3i;
  2374.     double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
  2375.     
  2376.     mh = n >> 3;
  2377.     m = 2 * mh;
  2378.     j1 = m;
  2379.     j2 = j1 + m;
  2380.     j3 = j2 + m;
  2381.     x0r = a[0] + a[j2];
  2382.     x0i = a[1] + a[j2 + 1];
  2383.     x1r = a[0] - a[j2];
  2384.     x1i = a[1] - a[j2 + 1];
  2385.     x2r = a[j1] + a[j3];
  2386.     x2i = a[j1 + 1] + a[j3 + 1];
  2387.     x3r = a[j1] - a[j3];
  2388.     x3i = a[j1 + 1] - a[j3 + 1];
  2389.     a[0] = x0r + x2r;
  2390.     a[1] = x0i + x2i;
  2391.     a[j1] = x0r - x2r;
  2392.     a[j1 + 1] = x0i - x2i;
  2393.     a[j2] = x1r - x3i;
  2394.     a[j2 + 1] = x1i + x3r;
  2395.     a[j3] = x1r + x3i;
  2396.     a[j3 + 1] = x1i - x3r;
  2397.     wn4r = w[1];
  2398.     k = 0;
  2399.     for (j = 2; j < mh; j += 2) {
  2400.         k += 4;
  2401.         wk1r = w[k];
  2402.         wk1i = w[k + 1];
  2403.         wk3r = w[k + 2];
  2404.         wk3i = w[k + 3];
  2405.         j1 = j + m;
  2406.         j2 = j1 + m;
  2407.         j3 = j2 + m;
  2408.         x0r = a[j] + a[j2];
  2409.         x0i = a[j + 1] + a[j2 + 1];
  2410.         x1r = a[j] - a[j2];
  2411.         x1i = a[j + 1] - a[j2 + 1];
  2412.         x2r = a[j1] + a[j3];
  2413.         x2i = a[j1 + 1] + a[j3 + 1];
  2414.         x3r = a[j1] - a[j3];
  2415.         x3i = a[j1 + 1] - a[j3 + 1];
  2416.         a[j] = x0r + x2r;
  2417.         a[j + 1] = x0i + x2i;
  2418.         a[j1] = x0r - x2r;
  2419.         a[j1 + 1] = x0i - x2i;
  2420.         x0r = x1r - x3i;
  2421.         x0i = x1i + x3r;
  2422.         a[j2] = wk1r * x0r - wk1i * x0i;
  2423.         a[j2 + 1] = wk1r * x0i + wk1i * x0r;
  2424.         x0r = x1r + x3i;
  2425.         x0i = x1i - x3r;
  2426.         a[j3] = wk3r * x0r + wk3i * x0i;
  2427.         a[j3 + 1] = wk3r * x0i - wk3i * x0r;
  2428.         j0 = m - j;
  2429.         j1 = j0 + m;
  2430.         j2 = j1 + m;
  2431.         j3 = j2 + m;
  2432.         x0r = a[j0] + a[j2];
  2433.         x0i = a[j0 + 1] + a[j2 + 1];
  2434.         x1r = a[j0] - a[j2];
  2435.         x1i = a[j0 + 1] - a[j2 + 1];
  2436.         x2r = a[j1] + a[j3];
  2437.         x2i = a[j1 + 1] + a[j3 + 1];
  2438.         x3r = a[j1] - a[j3];
  2439.         x3i = a[j1 + 1] - a[j3 + 1];
  2440.         a[j0] = x0r + x2r;
  2441.         a[j0 + 1] = x0i + x2i;
  2442.         a[j1] = x0r - x2r;
  2443.         a[j1 + 1] = x0i - x2i;
  2444.         x0r = x1r - x3i;
  2445.         x0i = x1i + x3r;
  2446.         a[j2] = wk1i * x0r - wk1r * x0i;
  2447.         a[j2 + 1] = wk1i * x0i + wk1r * x0r;
  2448.         x0r = x1r + x3i;
  2449.         x0i = x1i - x3r;
  2450.         a[j3] = wk3i * x0r + wk3r * x0i;
  2451.         a[j3 + 1] = wk3i * x0i - wk3r * x0r;
  2452.     }
  2453.     j0 = mh;
  2454.     j1 = j0 + m;
  2455.     j2 = j1 + m;
  2456.     j3 = j2 + m;
  2457.     x0r = a[j0] + a[j2];
  2458.     x0i = a[j0 + 1] + a[j2 + 1];
  2459.     x1r = a[j0] - a[j2];
  2460.     x1i = a[j0 + 1] - a[j2 + 1];
  2461.     x2r = a[j1] + a[j3];
  2462.     x2i = a[j1 + 1] + a[j3 + 1];
  2463.     x3r = a[j1] - a[j3];
  2464.     x3i = a[j1 + 1] - a[j3 + 1];
  2465.     a[j0] = x0r + x2r;
  2466.     a[j0 + 1] = x0i + x2i;
  2467.     a[j1] = x0r - x2r;
  2468.     a[j1 + 1] = x0i - x2i;
  2469.     x0r = x1r - x3i;
  2470.     x0i = x1i + x3r;
  2471.     a[j2] = wn4r * (x0r - x0i);
  2472.     a[j2 + 1] = wn4r * (x0i + x0r);
  2473.     x0r = x1r + x3i;
  2474.     x0i = x1i - x3r;
  2475.     a[j3] = -wn4r * (x0r + x0i);
  2476.     a[j3 + 1] = -wn4r * (x0i - x0r);
  2477. }
  2478. void cftmdl2(int n, double *a, double *w)
  2479. {
  2480.     int j, j0, j1, j2, j3, k, kr, m, mh;
  2481.     double wn4r, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i;
  2482.     double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y2r, y2i;
  2483.     
  2484.     mh = n >> 3;
  2485.     m = 2 * mh;
  2486.     wn4r = w[1];
  2487.     j1 = m;
  2488.     j2 = j1 + m;
  2489.     j3 = j2 + m;
  2490.     x0r = a[0] - a[j2 + 1];
  2491.     x0i = a[1] + a[j2];
  2492.     x1r = a[0] + a[j2 + 1];
  2493.     x1i = a[1] - a[j2];
  2494.     x2r = a[j1] - a[j3 + 1];
  2495.     x2i = a[j1 + 1] + a[j3];
  2496.     x3r = a[j1] + a[j3 + 1];
  2497.     x3i = a[j1 + 1] - a[j3];
  2498.     y0r = wn4r * (x2r - x2i);
  2499.     y0i = wn4r * (x2i + x2r);
  2500.     a[0] = x0r + y0r;
  2501.     a[1] = x0i + y0i;
  2502.     a[j1] = x0r - y0r;
  2503.     a[j1 + 1] = x0i - y0i;
  2504.     y0r = wn4r * (x3r - x3i);
  2505.     y0i = wn4r * (x3i + x3r);
  2506.     a[j2] = x1r - y0i;
  2507.     a[j2 + 1] = x1i + y0r;
  2508.     a[j3] = x1r + y0i;
  2509.     a[j3 + 1] = x1i - y0r;
  2510.     k = 0;
  2511.     kr = 2 * m;
  2512.     for (j = 2; j < mh; j += 2) {
  2513.         k += 4;
  2514.         wk1r = w[k];
  2515.         wk1i = w[k + 1];
  2516.         wk3r = w[k + 2];
  2517.         wk3i = w[k + 3];
  2518.         kr -= 4;
  2519.         wd1i = w[kr];
  2520.         wd1r = w[kr + 1];
  2521.         wd3i = w[kr + 2];
  2522.         wd3r = w[kr + 3];
  2523.         j1 = j + m;
  2524.         j2 = j1 + m;
  2525.         j3 = j2 + m;
  2526.         x0r = a[j] - a[j2 + 1];
  2527.         x0i = a[j + 1] + a[j2];
  2528.         x1r = a[j] + a[j2 + 1];
  2529.         x1i = a[j + 1] - a[j2];
  2530.         x2r = a[j1] - a[j3 + 1];
  2531.         x2i = a[j1 + 1] + a[j3];
  2532.         x3r = a[j1] + a[j3 + 1];
  2533.         x3i = a[j1 + 1] - a[j3];
  2534.         y0r = wk1r * x0r - wk1i * x0i;
  2535.         y0i = wk1r * x0i + wk1i * x0r;
  2536.         y2r = wd1r * x2r - wd1i * x2i;
  2537.         y2i = wd1r * x2i + wd1i * x2r;
  2538.         a[j] = y0r + y2r;
  2539.         a[j + 1] = y0i + y2i;
  2540.         a[j1] = y0r - y2r;
  2541.         a[j1 + 1] = y0i - y2i;
  2542.         y0r = wk3r * x1r + wk3i * x1i;
  2543.         y0i = wk3r * x1i - wk3i * x1r;
  2544.         y2r = wd3r * x3r + wd3i * x3i;
  2545.         y2i = wd3r * x3i - wd3i * x3r;
  2546.         a[j2] = y0r + y2r;
  2547.         a[j2 + 1] = y0i + y2i;
  2548.         a[j3] = y0r - y2r;
  2549.         a[j3 + 1] = y0i - y2i;
  2550.         j0 = m - j;
  2551.         j1 = j0 + m;
  2552.         j2 = j1 + m;
  2553.         j3 = j2 + m;
  2554.         x0r = a[j0] - a[j2 + 1];
  2555.         x0i = a[j0 + 1] + a[j2];
  2556.         x1r = a[j0] + a[j2 + 1];
  2557.         x1i = a[j0 + 1] - a[j2];
  2558.         x2r = a[j1] - a[j3 + 1];
  2559.         x2i = a[j1 + 1] + a[j3];
  2560.         x3r = a[j1] + a[j3 + 1];
  2561.         x3i = a[j1 + 1] - a[j3];
  2562.         y0r = wd1i * x0r - wd1r * x0i;
  2563.         y0i = wd1i * x0i + wd1r * x0r;
  2564.         y2r = wk1i * x2r - wk1r * x2i;
  2565.         y2i = wk1i * x2i + wk1r * x2r;
  2566.         a[j0] = y0r + y2r;
  2567.         a[j0 + 1] = y0i + y2i;
  2568.         a[j1] = y0r - y2r;
  2569.         a[j1 + 1] = y0i - y2i;
  2570.         y0r = wd3i * x1r + wd3r * x1i;
  2571.         y0i = wd3i * x1i - wd3r * x1r;
  2572.         y2r = wk3i * x3r + wk3r * x3i;
  2573.         y2i = wk3i * x3i - wk3r * x3r;
  2574.         a[j2] = y0r + y2r;
  2575.         a[j2 + 1] = y0i + y2i;
  2576.         a[j3] = y0r - y2r;
  2577.         a[j3 + 1] = y0i - y2i;
  2578.     }
  2579.     wk1r = w[m];
  2580.     wk1i = w[m + 1];
  2581.     j0 = mh;
  2582.     j1 = j0 + m;
  2583.     j2 = j1 + m;
  2584.     j3 = j2 + m;
  2585.     x0r = a[j0] - a[j2 + 1];
  2586.     x0i = a[j0 + 1] + a[j2];
  2587.     x1r = a[j0] + a[j2 + 1];
  2588.     x1i = a[j0 + 1] - a[j2];
  2589.     x2r = a[j1] - a[j3 + 1];
  2590.     x2i = a[j1 + 1] + a[j3];
  2591.     x3r = a[j1] + a[j3 + 1];
  2592.     x3i = a[j1 + 1] - a[j3];
  2593.     y0r = wk1r * x0r - wk1i * x0i;
  2594.     y0i = wk1r * x0i + wk1i * x0r;
  2595.     y2r = wk1i * x2r - wk1r * x2i;
  2596.     y2i = wk1i * x2i + wk1r * x2r;
  2597.     a[j0] = y0r + y2r;
  2598.     a[j0 + 1] = y0i + y2i;
  2599.     a[j1] = y0r - y2r;
  2600.     a[j1 + 1] = y0i - y2i;
  2601.     y0r = wk1i * x1r - wk1r * x1i;
  2602.     y0i = wk1i * x1i + wk1r * x1r;
  2603.     y2r = wk1r * x3r - wk1i * x3i;
  2604.     y2i = wk1r * x3i + wk1i * x3r;
  2605.     a[j2] = y0r - y2r;
  2606.     a[j2 + 1] = y0i - y2i;
  2607.     a[j3] = y0r + y2r;
  2608.     a[j3 + 1] = y0i + y2i;
  2609. }
  2610. void cftfx41(int n, double *a, int nw, double *w)
  2611. {
  2612.     void cftf161(double *a, double *w);
  2613.     void cftf162(double *a, double *w);
  2614.     void cftf081(double *a, double *w);
  2615.     void cftf082(double *a, double *w);
  2616.     
  2617.     if (n == 128) {
  2618.         cftf161(a, &w[nw - 8]);
  2619.         cftf162(&a[32], &w[nw - 32]);
  2620.         cftf161(&a[64], &w[nw - 8]);
  2621.         cftf161(&a[96], &w[nw - 8]);
  2622.     } else {
  2623.         cftf081(a, &w[nw - 8]);
  2624.         cftf082(&a[16], &w[nw - 8]);
  2625.         cftf081(&a[32], &w[nw - 8]);
  2626.         cftf081(&a[48], &w[nw - 8]);
  2627.     }
  2628. }
  2629. void cftf161(double *a, double *w)
  2630. {
  2631.     double wn4r, wk1r, wk1i, 
  2632.         x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
  2633.         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
  2634.         y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, 
  2635.         y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, 
  2636.         y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;
  2637.     
  2638.     wn4r = w[1];
  2639.     wk1r = w[2];
  2640.     wk1i = w[3];
  2641.     x0r = a[0] + a[16];
  2642.     x0i = a[1] + a[17];
  2643.     x1r = a[0] - a[16];
  2644.     x1i = a[1] - a[17];
  2645.     x2r = a[8] + a[24];
  2646.     x2i = a[9] + a[25];
  2647.     x3r = a[8] - a[24];
  2648.     x3i = a[9] - a[25];
  2649.     y0r = x0r + x2r;
  2650.     y0i = x0i + x2i;
  2651.     y4r = x0r - x2r;
  2652.     y4i = x0i - x2i;
  2653.     y8r = x1r - x3i;
  2654.     y8i = x1i + x3r;
  2655.     y12r = x1r + x3i;
  2656.     y12i = x1i - x3r;
  2657.     x0r = a[2] + a[18];
  2658.     x0i = a[3] + a[19];
  2659.     x1r = a[2] - a[18];
  2660.     x1i = a[3] - a[19];
  2661.     x2r = a[10] + a[26];
  2662.     x2i = a[11] + a[27];
  2663.     x3r = a[10] - a[26];
  2664.     x3i = a[11] - a[27];
  2665.     y1r = x0r + x2r;
  2666.     y1i = x0i + x2i;
  2667.     y5r = x0r - x2r;
  2668.     y5i = x0i - x2i;
  2669.     x0r = x1r - x3i;
  2670.     x0i = x1i + x3r;
  2671.     y9r = wk1r * x0r - wk1i * x0i;
  2672.     y9i = wk1r * x0i + wk1i * x0r;
  2673.     x0r = x1r + x3i;
  2674.     x0i = x1i - x3r;
  2675.     y13r = wk1i * x0r - wk1r * x0i;
  2676.     y13i = wk1i * x0i + wk1r * x0r;
  2677.     x0r = a[4] + a[20];
  2678.     x0i = a[5] + a[21];
  2679.     x1r = a[4] - a[20];
  2680.     x1i = a[5] - a[21];
  2681.     x2r = a[12] + a[28];
  2682.     x2i = a[13] + a[29];
  2683.     x3r = a[12] - a[28];
  2684.     x3i = a[13] - a[29];
  2685.     y2r = x0r + x2r;
  2686.     y2i = x0i + x2i;
  2687.     y6r = x0r - x2r;
  2688.     y6i = x0i - x2i;
  2689.     x0r = x1r - x3i;
  2690.     x0i = x1i + x3r;
  2691.     y10r = wn4r * (x0r - x0i);
  2692.     y10i = wn4r * (x0i + x0r);
  2693.     x0r = x1r + x3i;
  2694.     x0i = x1i - x3r;
  2695.     y14r = wn4r * (x0r + x0i);
  2696.     y14i = wn4r * (x0i - x0r);
  2697.     x0r = a[6] + a[22];
  2698.     x0i = a[7] + a[23];
  2699.     x1r = a[6] - a[22];
  2700.     x1i = a[7] - a[23];
  2701.     x2r = a[14] + a[30];
  2702.     x2i = a[15] + a[31];
  2703.     x3r = a[14] - a[30];
  2704.     x3i = a[15] - a[31];
  2705.     y3r = x0r + x2r;
  2706.     y3i = x0i + x2i;
  2707.     y7r = x0r - x2r;
  2708.     y7i = x0i - x2i;
  2709.     x0r = x1r - x3i;
  2710.     x0i = x1i + x3r;
  2711.     y11r = wk1i * x0r - wk1r * x0i;
  2712.     y11i = wk1i * x0i + wk1r * x0r;
  2713.     x0r = x1r + x3i;
  2714.     x0i = x1i - x3r;
  2715.     y15r = wk1r * x0r - wk1i * x0i;
  2716.     y15i = wk1r * x0i + wk1i * x0r;
  2717.     x0r = y12r - y14r;
  2718.     x0i = y12i - y14i;
  2719.     x1r = y12r + y14r;
  2720.     x1i = y12i + y14i;
  2721.     x2r = y13r - y15r;
  2722.     x2i = y13i - y15i;
  2723.     x3r = y13r + y15r;
  2724.     x3i = y13i + y15i;
  2725.     a[24] = x0r + x2r;
  2726.     a[25] = x0i + x2i;
  2727.     a[26] = x0r - x2r;
  2728.     a[27] = x0i - x2i;
  2729.     a[28] = x1r - x3i;
  2730.     a[29] = x1i + x3r;
  2731.     a[30] = x1r + x3i;
  2732.     a[31] = x1i - x3r;
  2733.     x0r = y8r + y10r;
  2734.     x0i = y8i + y10i;
  2735.     x1r = y8r - y10r;
  2736.     x1i = y8i - y10i;
  2737.     x2r = y9r + y11r;
  2738.     x2i = y9i + y11i;
  2739.     x3r = y9r - y11r;
  2740.     x3i = y9i - y11i;
  2741.     a[16] = x0r + x2r;
  2742.     a[17] = x0i + x2i;
  2743.     a[18] = x0r - x2r;
  2744.     a[19] = x0i - x2i;
  2745.     a[20] = x1r - x3i;
  2746.     a[21] = x1i + x3r;
  2747.     a[22] = x1r + x3i;
  2748.     a[23] = x1i - x3r;
  2749.     x0r = y5r - y7i;
  2750.     x0i = y5i + y7r;
  2751.     x2r = wn4r * (x0r - x0i);
  2752.     x2i = wn4r * (x0i + x0r);
  2753.     x0r = y5r + y7i;
  2754.     x0i = y5i - y7r;
  2755.     x3r = wn4r * (x0r - x0i);
  2756.     x3i = wn4r * (x0i + x0r);
  2757.     x0r = y4r - y6i;
  2758.     x0i = y4i + y6r;
  2759.     x1r = y4r + y6i;
  2760.     x1i = y4i - y6r;
  2761.     a[8] = x0r + x2r;
  2762.     a[9] = x0i + x2i;
  2763.     a[10] = x0r - x2r;
  2764.     a[11] = x0i - x2i;
  2765.     a[12] = x1r - x3i;
  2766.     a[13] = x1i + x3r;
  2767.     a[14] = x1r + x3i;
  2768.     a[15] = x1i - x3r;
  2769.     x0r = y0r + y2r;
  2770.     x0i = y0i + y2i;
  2771.     x1r = y0r - y2r;
  2772.     x1i = y0i - y2i;
  2773.     x2r = y1r + y3r;
  2774.     x2i = y1i + y3i;
  2775.     x3r = y1r - y3r;
  2776.     x3i = y1i - y3i;
  2777.     a[0] = x0r + x2r;
  2778.     a[1] = x0i + x2i;
  2779.     a[2] = x0r - x2r;
  2780.     a[3] = x0i - x2i;
  2781.     a[4] = x1r - x3i;
  2782.     a[5] = x1i + x3r;
  2783.     a[6] = x1r + x3i;
  2784.     a[7] = x1i - x3r;
  2785. }
  2786. void cftf162(double *a, double *w)
  2787. {
  2788.     double wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, 
  2789.         x0r, x0i, x1r, x1i, x2r, x2i, 
  2790.         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
  2791.         y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, 
  2792.         y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, 
  2793.         y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;
  2794.     
  2795.     wn4r = w[1];
  2796.     wk1r = w[4];
  2797.     wk1i = w[5];
  2798.     wk3r = w[6];
  2799.     wk3i = -w[7];
  2800.     wk2r = w[8];
  2801.     wk2i = w[9];
  2802.     x1r = a[0] - a[17];
  2803.     x1i = a[1] + a[16];
  2804.     x0r = a[8] - a[25];
  2805.     x0i = a[9] + a[24];
  2806.     x2r = wn4r * (x0r - x0i);
  2807.     x2i = wn4r * (x0i + x0r);
  2808.     y0r = x1r + x2r;
  2809.     y0i = x1i + x2i;
  2810.     y4r = x1r - x2r;
  2811.     y4i = x1i - x2i;
  2812.     x1r = a[0] + a[17];
  2813.     x1i = a[1] - a[16];
  2814.     x0r = a[8] + a[25];
  2815.     x0i = a[9] - a[24];
  2816.     x2r = wn4r * (x0r - x0i);
  2817.     x2i = wn4r * (x0i + x0r);
  2818.     y8r = x1r - x2i;
  2819.     y8i = x1i + x2r;
  2820.     y12r = x1r + x2i;
  2821.     y12i = x1i - x2r;
  2822.     x0r = a[2] - a[19];
  2823.     x0i = a[3] + a[18];
  2824.     x1r = wk1r * x0r - wk1i * x0i;
  2825.     x1i = wk1r * x0i + wk1i * x0r;
  2826.     x0r = a[10] - a[27];
  2827.     x0i = a[11] + a[26];
  2828.     x2r = wk3i * x0r - wk3r * x0i;
  2829.     x2i = wk3i * x0i + wk3r * x0r;
  2830.     y1r = x1r + x2r;
  2831.     y1i = x1i + x2i;
  2832.     y5r = x1r - x2r;
  2833.     y5i = x1i - x2i;
  2834.     x0r = a[2] + a[19];
  2835.     x0i = a[3] - a[18];
  2836.     x1r = wk3r * x0r - wk3i * x0i;
  2837.     x1i = wk3r * x0i + wk3i * x0r;
  2838.     x0r = a[10] + a[27];
  2839.     x0i = a[11] - a[26];
  2840.     x2r = wk1r * x0r + wk1i * x0i;
  2841.     x2i = wk1r * x0i - wk1i * x0r;
  2842.     y9r = x1r - x2r;
  2843.     y9i = x1i - x2i;
  2844.     y13r = x1r + x2r;
  2845.     y13i = x1i + x2i;
  2846.     x0r = a[4] - a[21];
  2847.     x0i = a[5] + a[20];
  2848.     x1r = wk2r * x0r - wk2i * x0i;
  2849.     x1i = wk2r * x0i + wk2i * x0r;
  2850.     x0r = a[12] - a[29];
  2851.     x0i = a[13] + a[28];
  2852.     x2r = wk2i * x0r - wk2r * x0i;
  2853.     x2i = wk2i * x0i + wk2r * x0r;
  2854.     y2r = x1r + x2r;
  2855.     y2i = x1i + x2i;
  2856.     y6r = x1r - x2r;
  2857.     y6i = x1i - x2i;
  2858.     x0r = a[4] + a[21];
  2859.     x0i = a[5] - a[20];
  2860.     x1r = wk2i * x0r - wk2r * x0i;
  2861.     x1i = wk2i * x0i + wk2r * x0r;
  2862.     x0r = a[12] + a[29];
  2863.     x0i = a[13] - a[28];
  2864.     x2r = wk2r * x0r - wk2i * x0i;
  2865.     x2i = wk2r * x0i + wk2i * x0r;
  2866.     y10r = x1r - x2r;
  2867.     y10i = x1i - x2i;
  2868.     y14r = x1r + x2r;
  2869.     y14i = x1i + x2i;
  2870.     x0r = a[6] - a[23];
  2871.     x0i = a[7] + a[22];
  2872.     x1r = wk3r * x0r - wk3i * x0i;
  2873.     x1i = wk3r * x0i + wk3i * x0r;
  2874.     x0r = a[14] - a[31];
  2875.     x0i = a[15] + a[30];
  2876.     x2r = wk1i * x0r - wk1r * x0i;
  2877.     x2i = wk1i * x0i + wk1r * x0r;
  2878.     y3r = x1r + x2r;
  2879.     y3i = x1i + x2i;
  2880.     y7r = x1r - x2r;
  2881.     y7i = x1i - x2i;
  2882.     x0r = a[6] + a[23];
  2883.     x0i = a[7] - a[22];
  2884.     x1r = wk1i * x0r + wk1r * x0i;
  2885.     x1i = wk1i * x0i - wk1r * x0r;
  2886.     x0r = a[14] + a[31];
  2887.     x0i = a[15] - a[30];
  2888.     x2r = wk3i * x0r - wk3r * x0i;
  2889.     x2i = wk3i * x0i + wk3r * x0r;
  2890.     y11r = x1r + x2r;
  2891.     y11i = x1i + x2i;
  2892.     y15r = x1r - x2r;
  2893.     y15i = x1i - x2i;
  2894.     x1r = y0r + y2r;
  2895.     x1i = y0i + y2i;
  2896.     x2r = y1r + y3r;
  2897.     x2i = y1i + y3i;
  2898.     a[0] = x1r + x2r;
  2899.     a[1] = x1i + x2i;
  2900.     a[2] = x1r - x2r;
  2901.     a[3] = x1i - x2i;
  2902.     x1r = y0r - y2r;
  2903.     x1i = y0i - y2i;
  2904.     x2r = y1r - y3r;
  2905.     x2i = y1i - y3i;
  2906.     a[4] = x1r - x2i;
  2907.     a[5] = x1i + x2r;
  2908.     a[6] = x1r + x2i;
  2909.     a[7] = x1i - x2r;
  2910.     x1r = y4r - y6i;
  2911.     x1i = y4i + y6r;
  2912.     x0r = y5r - y7i;
  2913.     x0i = y5i + y7r;
  2914.     x2r = wn4r * (x0r - x0i);
  2915.     x2i = wn4r * (x0i + x0r);
  2916.     a[8] = x1r + x2r;
  2917.     a[9] = x1i + x2i;
  2918.     a[10] = x1r - x2r;
  2919.     a[11] = x1i - x2i;
  2920.     x1r = y4r + y6i;
  2921.     x1i = y4i - y6r;
  2922.     x0r = y5r + y7i;
  2923.     x0i = y5i - y7r;
  2924.     x2r = wn4r * (x0r - x0i);
  2925.     x2i = wn4r * (x0i + x0r);
  2926.     a[12] = x1r - x2i;
  2927.     a[13] = x1i + x2r;
  2928.     a[14] = x1r + x2i;
  2929.     a[15] = x1i - x2r;
  2930.     x1r = y8r + y10r;
  2931.     x1i = y8i + y10i;
  2932.     x2r = y9r - y11r;
  2933.     x2i = y9i - y11i;
  2934.     a[16] = x1r + x2r;
  2935.     a[17] = x1i + x2i;
  2936.     a[18] = x1r - x2r;
  2937.     a[19] = x1i - x2i;
  2938.     x1r = y8r - y10r;
  2939.     x1i = y8i - y10i;
  2940.     x2r = y9r + y11r;
  2941.     x2i = y9i + y11i;
  2942.     a[20] = x1r - x2i;
  2943.     a[21] = x1i + x2r;
  2944.     a[22] = x1r + x2i;
  2945.     a[23] = x1i - x2r;
  2946.     x1r = y12r - y14i;
  2947.     x1i = y12i + y14r;
  2948.     x0r = y13r + y15i;
  2949.     x0i = y13i - y15r;
  2950.     x2r = wn4r * (x0r - x0i);
  2951.     x2i = wn4r * (x0i + x0r);
  2952.     a[24] = x1r + x2r;
  2953.     a[25] = x1i + x2i;
  2954.     a[26] = x1r - x2r;
  2955.     a[27] = x1i - x2i;
  2956.     x1r = y12r + y14i;
  2957.     x1i = y12i - y14r;
  2958.     x0r = y13r - y15i;
  2959.     x0i = y13i + y15r;
  2960.     x2r = wn4r * (x0r - x0i);
  2961.     x2i = wn4r * (x0i + x0r);
  2962.     a[28] = x1r - x2i;
  2963.     a[29] = x1i + x2r;
  2964.     a[30] = x1r + x2i;
  2965.     a[31] = x1i - x2r;
  2966. }
  2967. void cftf081(double *a, double *w)
  2968. {
  2969.     double wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
  2970.         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
  2971.         y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;
  2972.     
  2973.     wn4r = w[1];
  2974.     x0r = a[0] + a[8];
  2975.     x0i = a[1] + a[9];
  2976.     x1r = a[0] - a[8];
  2977.     x1i = a[1] - a[9];
  2978.     x2r = a[4] + a[12];
  2979.     x2i = a[5] + a[13];
  2980.     x3r = a[4] - a[12];
  2981.     x3i = a[5] - a[13];
  2982.     y0r = x0r + x2r;
  2983.     y0i = x0i + x2i;
  2984.     y2r = x0r - x2r;
  2985.     y2i = x0i - x2i;
  2986.     y1r = x1r - x3i;
  2987.     y1i = x1i + x3r;
  2988.     y3r = x1r + x3i;
  2989.     y3i = x1i - x3r;
  2990.     x0r = a[2] + a[10];
  2991.     x0i = a[3] + a[11];
  2992.     x1r = a[2] - a[10];
  2993.     x1i = a[3] - a[11];
  2994.     x2r = a[6] + a[14];
  2995.     x2i = a[7] + a[15];
  2996.     x3r = a[6] - a[14];
  2997.     x3i = a[7] - a[15];
  2998.     y4r = x0r + x2r;
  2999.     y4i = x0i + x2i;
  3000.     y6r = x0r - x2r;
  3001.     y6i = x0i - x2i;
  3002.     x0r = x1r - x3i;
  3003.     x0i = x1i + x3r;
  3004.     x2r = x1r + x3i;
  3005.     x2i = x1i - x3r;
  3006.     y5r = wn4r * (x0r - x0i);
  3007.     y5i = wn4r * (x0r + x0i);
  3008.     y7r = wn4r * (x2r - x2i);
  3009.     y7i = wn4r * (x2r + x2i);
  3010.     a[8] = y1r + y5r;
  3011.     a[9] = y1i + y5i;
  3012.     a[10] = y1r - y5r;
  3013.     a[11] = y1i - y5i;
  3014.     a[12] = y3r - y7i;
  3015.     a[13] = y3i + y7r;
  3016.     a[14] = y3r + y7i;
  3017.     a[15] = y3i - y7r;
  3018.     a[0] = y0r + y4r;
  3019.     a[1] = y0i + y4i;
  3020.     a[2] = y0r - y4r;
  3021.     a[3] = y0i - y4i;
  3022.     a[4] = y2r - y6i;
  3023.     a[5] = y2i + y6r;
  3024.     a[6] = y2r + y6i;
  3025.     a[7] = y2i - y6r;
  3026. }
  3027. void cftf082(double *a, double *w)
  3028. {
  3029.     double wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i, 
  3030.         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
  3031.         y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;
  3032.     
  3033.     wn4r = w[1];
  3034.     wk1r = w[2];
  3035.     wk1i = w[3];
  3036.     y0r = a[0] - a[9];
  3037.     y0i = a[1] + a[8];
  3038.     y1r = a[0] + a[9];
  3039.     y1i = a[1] - a[8];
  3040.     x0r = a[4] - a[13];
  3041.     x0i = a[5] + a[12];
  3042.     y2r = wn4r * (x0r - x0i);
  3043.     y2i = wn4r * (x0i + x0r);
  3044.     x0r = a[4] + a[13];
  3045.     x0i = a[5] - a[12];
  3046.     y3r = wn4r * (x0r - x0i);
  3047.     y3i = wn4r * (x0i + x0r);
  3048.     x0r = a[2] - a[11];
  3049.     x0i = a[3] + a[10];
  3050.     y4r = wk1r * x0r - wk1i * x0i;
  3051.     y4i = wk1r * x0i + wk1i * x0r;
  3052.     x0r = a[2] + a[11];
  3053.     x0i = a[3] - a[10];
  3054.     y5r = wk1i * x0r - wk1r * x0i;
  3055.     y5i = wk1i * x0i + wk1r * x0r;
  3056.     x0r = a[6] - a[15];
  3057.     x0i = a[7] + a[14];
  3058.     y6r = wk1i * x0r - wk1r * x0i;
  3059.     y6i = wk1i * x0i + wk1r * x0r;
  3060.     x0r = a[6] + a[15];
  3061.     x0i = a[7] - a[14];
  3062.     y7r = wk1r * x0r - wk1i * x0i;
  3063.     y7i = wk1r * x0i + wk1i * x0r;
  3064.     x0r = y0r + y2r;
  3065.     x0i = y0i + y2i;
  3066.     x1r = y4r + y6r;
  3067.     x1i = y4i + y6i;
  3068.     a[0] = x0r + x1r;
  3069.     a[1] = x0i + x1i;
  3070.     a[2] = x0r - x1r;
  3071.     a[3] = x0i - x1i;
  3072.     x0r = y0r - y2r;
  3073.     x0i = y0i - y2i;
  3074.     x1r = y4r - y6r;
  3075.     x1i = y4i - y6i;
  3076.     a[4] = x0r - x1i;
  3077.     a[5] = x0i + x1r;
  3078.     a[6] = x0r + x1i;
  3079.     a[7] = x0i - x1r;
  3080.     x0r = y1r - y3i;
  3081.     x0i = y1i + y3r;
  3082.     x1r = y5r - y7r;
  3083.     x1i = y5i - y7i;
  3084.     a[8] = x0r + x1r;
  3085.     a[9] = x0i + x1i;
  3086.     a[10] = x0r - x1r;
  3087.     a[11] = x0i - x1i;
  3088.     x0r = y1r + y3i;
  3089.     x0i = y1i - y3r;
  3090.     x1r = y5r + y7r;
  3091.     x1i = y5i + y7i;
  3092.     a[12] = x0r - x1i;
  3093.     a[13] = x0i + x1r;
  3094.     a[14] = x0r + x1i;
  3095.     a[15] = x0i - x1r;
  3096. }
  3097. void cftf040(double *a)
  3098. {
  3099.     double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
  3100.     
  3101.     x0r = a[0] + a[4];
  3102.     x0i = a[1] + a[5];
  3103.     x1r = a[0] - a[4];
  3104.     x1i = a[1] - a[5];
  3105.     x2r = a[2] + a[6];
  3106.     x2i = a[3] + a[7];
  3107.     x3r = a[2] - a[6];
  3108.     x3i = a[3] - a[7];
  3109.     a[0] = x0r + x2r;
  3110.     a[1] = x0i + x2i;
  3111.     a[2] = x1r - x3i;
  3112.     a[3] = x1i + x3r;
  3113.     a[4] = x0r - x2r;
  3114.     a[5] = x0i - x2i;
  3115.     a[6] = x1r + x3i;
  3116.     a[7] = x1i - x3r;
  3117. }
  3118. void cftb040(double *a)
  3119. {
  3120.     double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
  3121.     
  3122.     x0r = a[0] + a[4];
  3123.     x0i = a[1] + a[5];
  3124.     x1r = a[0] - a[4];
  3125.     x1i = a[1] - a[5];
  3126.     x2r = a[2] + a[6];
  3127.     x2i = a[3] + a[7];
  3128.     x3r = a[2] - a[6];
  3129.     x3i = a[3] - a[7];
  3130.     a[0] = x0r + x2r;
  3131.     a[1] = x0i + x2i;
  3132.     a[2] = x1r + x3i;
  3133.     a[3] = x1i - x3r;
  3134.     a[4] = x0r - x2r;
  3135.     a[5] = x0i - x2i;
  3136.     a[6] = x1r - x3i;
  3137.     a[7] = x1i + x3r;
  3138. }
  3139. void cftx020(double *a)
  3140. {
  3141.     double x0r, x0i;
  3142.     
  3143.     x0r = a[0] - a[2];
  3144.     x0i = a[1] - a[3];
  3145.     a[0] += a[2];
  3146.     a[1] += a[3];
  3147.     a[2] = x0r;
  3148.     a[3] = x0i;
  3149. }
  3150. void rftfsub(int n, double *a, int nc, double *c)
  3151. {
  3152.     int j, k, kk, ks, m;
  3153.     double wkr, wki, xr, xi, yr, yi;
  3154.     
  3155.     m = n >> 1;
  3156.     ks = 2 * nc / m;
  3157.     kk = 0;
  3158.     for (j = 2; j < m; j += 2) {
  3159.         k = n - j;
  3160.         kk += ks;
  3161.         wkr = 0.5 - c[nc - kk];
  3162.         wki = c[kk];
  3163.         xr = a[j] - a[k];
  3164.         xi = a[j + 1] + a[k + 1];
  3165.         yr = wkr * xr - wki * xi;
  3166.         yi = wkr * xi + wki * xr;
  3167.         a[j] -= yr;
  3168.         a[j + 1] -= yi;
  3169.         a[k] += yr;
  3170.         a[k + 1] -= yi;
  3171.     }
  3172. }
  3173. void rftbsub(int n, double *a, int nc, double *c)
  3174. {
  3175.     int j, k, kk, ks, m;
  3176.     double wkr, wki, xr, xi, yr, yi;
  3177.     
  3178.     m = n >> 1;
  3179.     ks = 2 * nc / m;
  3180.     kk = 0;
  3181.     for (j = 2; j < m; j += 2) {
  3182.         k = n - j;
  3183.         kk += ks;
  3184.         wkr = 0.5 - c[nc - kk];
  3185.         wki = c[kk];
  3186.         xr = a[j] - a[k];
  3187.         xi = a[j + 1] + a[k + 1];
  3188.         yr = wkr * xr + wki * xi;
  3189.         yi = wkr * xi - wki * xr;
  3190.         a[j] -= yr;
  3191.         a[j + 1] -= yi;
  3192.         a[k] += yr;
  3193.         a[k + 1] -= yi;
  3194.     }
  3195. }
  3196. void dctsub(int n, double *a, int nc, double *c)
  3197. {
  3198.     int j, k, kk, ks, m;
  3199.     double wkr, wki, xr;
  3200.     
  3201.     m = n >> 1;
  3202.     ks = nc / n;
  3203.     kk = 0;
  3204.     for (j = 1; j < m; j++) {
  3205.         k = n - j;
  3206.         kk += ks;
  3207.         wkr = c[kk] - c[nc - kk];
  3208.         wki = c[kk] + c[nc - kk];
  3209.         xr = wki * a[j] - wkr * a[k];
  3210.         a[j] = wkr * a[j] + wki * a[k];
  3211.         a[k] = xr;
  3212.     }
  3213.     a[m] *= c[0];
  3214. }
  3215. void dstsub(int n, double *a, int nc, double *c)
  3216. {
  3217.     int j, k, kk, ks, m;
  3218.     double wkr, wki, xr;
  3219.     
  3220.     m = n >> 1;
  3221.     ks = nc / n;
  3222.     kk = 0;
  3223.     for (j = 1; j < m; j++) {
  3224.         k = n - j;
  3225.         kk += ks;
  3226.         wkr = c[kk] - c[nc - kk];
  3227.         wki = c[kk] + c[nc - kk];
  3228.         xr = wki * a[k] - wkr * a[j];
  3229.         a[k] = wkr * a[k] + wki * a[j];
  3230.         a[j] = xr;
  3231.     }
  3232.     a[m] *= c[0];
  3233. }