Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

TransformS.cc

Go to the documentation of this file.
00001 /*
00002 
00003     DFT, DCT and DST routines
00004     Copyright (C) 1996-2001 Takuya OOURA
00005     Copyright (C) 1999-2003 Jussi Laako
00006 
00007     This program is free software; you can redistribute it and/or modify
00008     it under the terms of the GNU General Public License as published by
00009     the Free Software Foundation; either version 2 of the License, or
00010     (at your option) any later version.
00011 
00012     This program is distributed in the hope that it will be useful,
00013     but WITHOUT ANY WARRANTY; without even the implied warranty of
00014     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015     GNU General Public License for more details.
00016 
00017     You should have received a copy of the GNU General Public License
00018     along with this program; if not, write to the Free Software
00019     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00020  
00021     Version 1.0 : Converted T.OOURA's functions to C++ class
00022     Version 1.1 : Updated to match T.OOURA's Oct/99 code and all versions
00023     Version 1.2 : Some conversion and precision updates
00024     Version 1.3 : Updated to match T.OOURA's Oct/01 code
00025 
00026 */
00027 
00028 
00029 /* This is decimation-in-frequency split-radix transform */
00030 
00031 
00032 #include <stdio.h>
00033 #include <stdlib.h>
00034 #ifdef USE_INTEL_MATH
00035     #include <mathimf.h>
00036 #else
00037     #include <math.h>
00038 #endif
00039 #include <float.h>
00040 
00041 #include "dsp/TransformS.hh"
00042 
00043 
00044 #ifdef USE_CDFT_THREADS
00045 
00046 #include <pthread.h>
00047 
00048 
00049 void * cftrec1f_th_cb(void *p)
00050 {
00051     clTransformS *TS = (clTransformS *) ((cdft_arg_t *) p)->klass;
00052     
00053     return TS->cftrec1f_th(p);
00054 }
00055 
00056 
00057 void * cftrec2f_th_cb(void *p)
00058 {
00059     clTransformS *TS = (clTransformS *) ((cdft_arg_t *) p)->klass;
00060     
00061     return TS->cftrec2f_th(p);
00062 }
00063 
00064 
00065 void * cftrec1_th_cb(void *p)
00066 {
00067     clTransformS *TS = (clTransformS *) ((cdft_arg_t *) p)->klass;
00068     
00069     return TS->cftrec1_th(p);
00070 }
00071 
00072 
00073 void * cftrec2_th_cb(void *p)
00074 {
00075     clTransformS *TS = (clTransformS *) ((cdft_arg_t *) p)->klass;
00076     
00077     return TS->cftrec2_th(p);
00078 }
00079 
00080 
00081 void clTransformS::cdft_thread_create(cdft_thread_t *thp, 
00082     void * (*func)(void *), cdft_arg_t *argp)
00083 {
00084     argp->klass = (void *) this;
00085     if (pthread_create(thp, NULL, func, (void *) argp) != 0) {
00086         fprintf(stderr, "clTransformS::cdft_thread_create() error\n");
00087         exit(1);
00088     }
00089 }
00090 
00091 
00092 void clTransformS::cdft_thread_wait(cdft_thread_t th)
00093 {
00094     if (pthread_join(th, NULL) != 0) {
00095         fprintf(stderr, "clTransformS::cdft_thread_wait() error\n");
00096         exit(1);
00097     }
00098 }
00099 
00100 
00101 #endif /* USE_CDFT_THREADS */
00102 
00103 
00104 void clTransformS::makeipt(long nw, long *ip)
00105 {
00106     long j, l, m, m2, p, q;
00107     
00108     ip[2] = 0;
00109     ip[3] = 16;
00110     m = 2;
00111     for (l = nw; l > 32; l >>= 2) {
00112         m2 = m << 1;
00113         q = m2 << 3;
00114         for (j = m; j < m2; j++) {
00115             p = ip[j] << 2;
00116             ip[m + j] = p;
00117             ip[m2 + j] = p + q;
00118         }
00119         m = m2;
00120     }
00121 }
00122 
00123 
00124 // -----
00125 
00126 
00127 void clTransformS::cdft(long n, long isgn, float *a, long *ip, float *w)
00128 {
00129     long nw;
00130     
00131     nw = ip[0];
00132     if (n > (nw << 2)) {
00133         nw = n >> 2;
00134         makewt(nw, ip, w);
00135     }
00136     if (isgn >= 0) {
00137         cftfsub(n, a, ip, nw, w);
00138     } else {
00139         cftbsub(n, a, ip, nw, w);
00140     }
00141 }
00142 
00143 
00144 void clTransformS::rdft(long n, long isgn, float *a, long *ip, float *w)
00145 {
00146     long nw, nc;
00147     float xi;
00148     
00149     nw = ip[0];
00150     if (n > (nw << 2)) {
00151         nw = n >> 2;
00152         makewt(nw, ip, w);
00153     }
00154     nc = ip[1];
00155     if (n > (nc << 2)) {
00156         nc = n >> 2;
00157         makect(nc, ip, w + nw);
00158     }
00159     if (isgn >= 0) {
00160         if (n > 4) {
00161             cftfsub(n, a, ip, nw, w);
00162             rftfsub(n, a, nc, w + nw);
00163         } else if (n == 4) {
00164             cftfsub(n, a, ip, nw, w);
00165         }
00166         xi = a[0] - a[1];
00167         a[0] += a[1];
00168         a[1] = xi;
00169     } else {
00170         a[1] = 0.5f * (a[0] - a[1]);
00171         a[0] -= a[1];
00172         if (n > 4) {
00173             rftbsub(n, a, nc, w + nw);
00174             cftbsub(n, a, ip, nw, w);
00175         } else if (n == 4) {
00176             cftbsub(n, a, ip, nw, w);
00177         }
00178     }
00179 }
00180 
00181 
00182 void clTransformS::ddct(long n, long isgn, float *a, long *ip, float *w)
00183 {
00184     long j, nw, nc;
00185     float xr;
00186     
00187     nw = ip[0];
00188     if (n > (nw << 2)) {
00189         nw = n >> 2;
00190         makewt(nw, ip, w);
00191     }
00192     nc = ip[1];
00193     if (n > nc) {
00194         nc = n;
00195         makect(nc, ip, w + nw);
00196     }
00197     if (isgn < 0) {
00198         xr = a[n - 1];
00199         for (j = n - 2; j >= 2; j -= 2) {
00200             a[j + 1] = a[j] - a[j - 1];
00201             a[j] += a[j - 1];
00202         }
00203         a[1] = a[0] - xr;
00204         a[0] += xr;
00205         if (n > 4) {
00206             rftbsub(n, a, nc, w + nw);
00207             cftbsub(n, a, ip, nw, w);
00208         } else if (n == 4) {
00209             cftbsub(n, a, ip, nw, w);
00210         }
00211     }
00212     dctsub(n, a, nc, w + nw);
00213     if (isgn >= 0) {
00214         if (n > 4) {
00215             cftfsub(n, a, ip, nw, w);
00216             rftfsub(n, a, nc, w + nw);
00217         } else if (n == 4) {
00218             cftfsub(n, a, ip, nw, w);
00219         }
00220         xr = a[0] - a[1];
00221         a[0] += a[1];
00222         for (j = 2; j < n; j += 2) {
00223             a[j - 1] = a[j] - a[j + 1];
00224             a[j] += a[j + 1];
00225         }
00226         a[n - 1] = xr;
00227     }
00228 }
00229 
00230 
00231 void clTransformS::ddst(long n, long isgn, float *a, long *ip, float *w)
00232 {
00233     long j, nw, nc;
00234     float xr;
00235     
00236     nw = ip[0];
00237     if (n > (nw << 2)) {
00238         nw = n >> 2;
00239         makewt(nw, ip, w);
00240     }
00241     nc = ip[1];
00242     if (n > nc) {
00243         nc = n;
00244         makect(nc, ip, w + nw);
00245     }
00246     if (isgn < 0) {
00247         xr = a[n - 1];
00248         for (j = n - 2; j >= 2; j -= 2) {
00249             a[j + 1] = -a[j] - a[j - 1];
00250             a[j] -= a[j - 1];
00251         }
00252         a[1] = a[0] + xr;
00253         a[0] -= xr;
00254         if (n > 4) {
00255             rftbsub(n, a, nc, w + nw);
00256             cftbsub(n, a, ip, nw, w);
00257         } else if (n == 4) {
00258             cftbsub(n, a, ip, nw, w);
00259         }
00260     }
00261     dstsub(n, a, nc, w + nw);
00262     if (isgn >= 0) {
00263         if (n > 4) {
00264             cftfsub(n, a, ip, nw, w);
00265             rftfsub(n, a, nc, w + nw);
00266         } else if (n == 4) {
00267             cftfsub(n, a, ip, nw, w);
00268         }
00269         xr = a[0] - a[1];
00270         a[0] += a[1];
00271         for (j = 2; j < n; j += 2) {
00272             a[j - 1] = -a[j] - a[j + 1];
00273             a[j] -= a[j + 1];
00274         }
00275         a[n - 1] = -xr;
00276     }
00277 }
00278 
00279 
00280 void clTransformS::dfct(long n, float *a, float *t, long *ip, float *w)
00281 {
00282     long j, k, l, m, mh, nw, nc;
00283     float xr, xi, yr, yi;
00284     
00285     nw = ip[0];
00286     if (n > (nw << 3)) {
00287         nw = n >> 3;
00288         makewt(nw, ip, w);
00289     }
00290     nc = ip[1];
00291     if (n > (nc << 1)) {
00292         nc = n >> 1;
00293         makect(nc, ip, w + nw);
00294     }
00295     m = n >> 1;
00296     yi = a[m];
00297     xi = a[0] + a[n];
00298     a[0] -= a[n];
00299     t[0] = xi - yi;
00300     t[m] = xi + yi;
00301     if (n > 2) {
00302         mh = m >> 1;
00303         for (j = 1; j < mh; j++) {
00304             k = m - j;
00305             xr = a[j] - a[n - j];
00306             xi = a[j] + a[n - j];
00307             yr = a[k] - a[n - k];
00308             yi = a[k] + a[n - k];
00309             a[j] = xr;
00310             a[k] = yr;
00311             t[j] = xi - yi;
00312             t[k] = xi + yi;
00313         }
00314         t[mh] = a[mh] + a[n - mh];
00315         a[mh] -= a[n - mh];
00316         dctsub(m, a, nc, w + nw);
00317         if (m > 4) {
00318             cftfsub(m, a, ip, nw, w);
00319             rftfsub(m, a, nc, w + nw);
00320         } else if (m == 4) {
00321             cftfsub(m, a, ip, nw, w);
00322         }
00323         a[n - 1] = a[0] - a[1];
00324         a[1] = a[0] + a[1];
00325         for (j = m - 2; j >= 2; j -= 2) {
00326             a[2 * j + 1] = a[j] + a[j + 1];
00327             a[2 * j - 1] = a[j] - a[j + 1];
00328         }
00329         l = 2;
00330         m = mh;
00331         while (m >= 2) {
00332             dctsub(m, t, nc, w + nw);
00333             if (m > 4) {
00334                 cftfsub(m, t, ip, nw, w);
00335                 rftfsub(m, t, nc, w + nw);
00336             } else if (m == 4) {
00337                 cftfsub(m, t, ip, nw, w);
00338             }
00339             a[n - l] = t[0] - t[1];
00340             a[l] = t[0] + t[1];
00341             k = 0;
00342             for (j = 2; j < m; j += 2) {
00343                 k += l << 2;
00344                 a[k - l] = t[j] - t[j + 1];
00345                 a[k + l] = t[j] + t[j + 1];
00346             }
00347             l <<= 1;
00348             mh = m >> 1;
00349             for (j = 0; j < mh; j++) {
00350                 k = m - j;
00351                 t[j] = t[m + k] - t[m + j];
00352                 t[k] = t[m + k] + t[m + j];
00353             }
00354             t[mh] = t[m + mh];
00355             m = mh;
00356         }
00357         a[l] = t[0];
00358         a[n] = t[2] - t[1];
00359         a[0] = t[2] + t[1];
00360     } else {
00361         a[1] = a[0];
00362         a[2] = t[0];
00363         a[0] = t[1];
00364     }
00365 }
00366 
00367 
00368 void clTransformS::dfst(long n, float *a, float *t, long *ip, float *w)
00369 {
00370     long j, k, l, m, mh, nw, nc;
00371     float xr, xi, yr, yi;
00372     
00373     nw = ip[0];
00374     if (n > (nw << 3)) {
00375         nw = n >> 3;
00376         makewt(nw, ip, w);
00377     }
00378     nc = ip[1];
00379     if (n > (nc << 1)) {
00380         nc = n >> 1;
00381         makect(nc, ip, w + nw);
00382     }
00383     if (n > 2) {
00384         m = n >> 1;
00385         mh = m >> 1;
00386         for (j = 1; j < mh; j++) {
00387             k = m - j;
00388             xr = a[j] + a[n - j];
00389             xi = a[j] - a[n - j];
00390             yr = a[k] + a[n - k];
00391             yi = a[k] - a[n - k];
00392             a[j] = xr;
00393             a[k] = yr;
00394             t[j] = xi + yi;
00395             t[k] = xi - yi;
00396         }
00397         t[0] = a[mh] - a[n - mh];
00398         a[mh] += a[n - mh];
00399         a[0] = a[m];
00400         dstsub(m, a, nc, w + nw);
00401         if (m > 4) {
00402             cftfsub(m, a, ip, nw, w);
00403             rftfsub(m, a, nc, w + nw);
00404         } else if (m == 4) {
00405             cftfsub(m, a, ip, nw, w);
00406         }
00407         a[n - 1] = a[1] - a[0];
00408         a[1] = a[0] + a[1];
00409         for (j = m - 2; j >= 2; j -= 2) {
00410             a[2 * j + 1] = a[j] - a[j + 1];
00411             a[2 * j - 1] = -a[j] - a[j + 1];
00412         }
00413         l = 2;
00414         m = mh;
00415         while (m >= 2) {
00416             dstsub(m, t, nc, w + nw);
00417             if (m > 4) {
00418                 cftfsub(m, t, ip, nw, w);
00419                 rftfsub(m, t, nc, w + nw);
00420             } else if (m == 4) {
00421                 cftfsub(m, t, ip, nw, w);
00422             }
00423             a[n - l] = t[1] - t[0];
00424             a[l] = t[0] + t[1];
00425             k = 0;
00426             for (j = 2; j < m; j += 2) {
00427                 k += l << 2;
00428                 a[k - l] = -t[j] - t[j + 1];
00429                 a[k + l] = t[j] - t[j + 1];
00430             }
00431             l <<= 1;
00432             mh = m >> 1;
00433             for (j = 1; j < mh; j++) {
00434                 k = m - j;
00435                 t[j] = t[m + k] + t[m + j];
00436                 t[k] = t[m + k] - t[m + j];
00437             }
00438             t[0] = t[m + mh];
00439             m = mh;
00440         }
00441         a[l] = t[0];
00442     }
00443     a[0] = 0;
00444 }
00445 
00446 
00447 /* -------- initializing routines -------- */
00448 
00449 
00450 void clTransformS::makewt(long nw, long *ip, float *w)
00451 {
00452     long j, nwh, nw0, nw1;
00453     float delta, wn4r, wk1r, wk1i, wk3r, wk3i;
00454     
00455     ip[0] = nw;
00456     ip[1] = 1;
00457     if (nw > 2) {
00458         nwh = nw >> 1;
00459 #       ifndef TRANSFORM_EXT_PREC
00460         delta = atanf(1.0f) / nwh;
00461         wn4r = cosf(delta * nwh);
00462 #       else
00463         delta = (float) atan(1.0) / nwh;
00464         wn4r = (float) cos(delta * nwh);
00465 #       endif
00466         w[0] = 1;
00467         w[1] = wn4r;
00468         if (nwh == 4) {
00469 #           ifndef TRANSFORM_EXT_PREC
00470             w[2] = cosf(delta * 2.0f);
00471             w[3] = sinf(delta * 2.0f);
00472 #           else
00473             w[2] = (float) cos(delta * 2.0);
00474             w[3] = (float) sin(delta * 2.0);
00475 #           endif
00476         } else if (nwh > 4) {
00477             makeipt(nw, ip);
00478 #           ifndef TRANSFORM_EXT_PREC
00479             w[2] = 0.5f / cosf(delta * 2.0f);
00480             w[3] = 0.5f / cosf(delta * 6.0f);
00481 #           else
00482             w[2] = (float) (0.5 / cos(delta * 2.0));
00483             w[3] = (float) (0.5 / cos(delta * 6.0));
00484 #           endif
00485             for (j = 4; j < nwh; j += 4) {
00486 #               ifndef TRANSFORM_EXT_PREC
00487                 w[j] = cosf(delta * j);
00488                 w[j + 1] = sinf(delta * j);
00489                 w[j + 2] = cosf(3.0f * delta * j);
00490                 w[j + 3] = -sinf(3.0f * delta * j);
00491 #               else
00492                 w[j] = (float) cos(delta * j);
00493                 w[j + 1] = (float) sin(delta * j);
00494                 w[j + 2] = (float) cos(3.0 * delta * j);
00495                 w[j + 3] = (float) -sin(3.0 * delta * j);
00496 #               endif
00497             }
00498         }
00499         nw0 = 0;
00500         while (nwh > 2) {
00501             nw1 = nw0 + nwh;
00502             nwh >>= 1;
00503             w[nw1] = 1;
00504             w[nw1 + 1] = wn4r;
00505             if (nwh == 4) {
00506                 wk1r = w[nw0 + 4];
00507                 wk1i = w[nw0 + 5];
00508                 w[nw1 + 2] = wk1r;
00509                 w[nw1 + 3] = wk1i;
00510             } else if (nwh > 4) {
00511                 wk1r = w[nw0 + 4];
00512                 wk3r = w[nw0 + 6];
00513                 w[nw1 + 2] = 0.5f / wk1r;
00514                 w[nw1 + 3] = 0.5f / wk3r;
00515                 for (j = 4; j < nwh; j += 4) {
00516                     wk1r = w[nw0 + 2 * j];
00517                     wk1i = w[nw0 + 2 * j + 1];
00518                     wk3r = w[nw0 + 2 * j + 2];
00519                     wk3i = w[nw0 + 2 * j + 3];
00520                     w[nw1 + j] = wk1r;
00521                     w[nw1 + j + 1] = wk1i;
00522                     w[nw1 + j + 2] = wk3r;
00523                     w[nw1 + j + 3] = wk3i;
00524                 }
00525             }
00526             nw0 = nw1;
00527         }
00528     }
00529 }
00530 
00531 
00532 void clTransformS::makect(long nc, long *ip, float *c)
00533 {
00534     long j, nch;
00535     float delta;
00536     
00537     ip[1] = nc;
00538     if (nc > 1) {
00539         nch = nc >> 1;
00540 #       ifndef TRANSFORM_EXT_PREC
00541         delta = atanf(1.0f) / nch;
00542         c[0] = cosf(delta * nch);
00543 #       else
00544         delta = (float) atan(1.0) / nch;
00545         c[0] = (float) cos(delta * nch);
00546 #       endif
00547         c[nch] = 0.5f * c[0];
00548         for (j = 1; j < nch; j++) {
00549 #           ifndef TRANSFORM_EXT_PREC
00550             c[j] = 0.5f * cosf(delta * j);
00551             c[nc - j] = 0.5f * sinf(delta * j);
00552 #           else
00553             c[j] = (float) (0.5 * cos(delta * j));
00554             c[nc - j] = (float) (0.5 * sin(delta * j));
00555 #           endif
00556         }
00557     }
00558 }
00559 
00560 
00561 /* -------- child routines -------- */
00562 
00563 
00564 void clTransformS::cftfsub(long n, float *a, long *ip, long nw, float *w)
00565 {
00566     if (n > 8) {
00567         if (n > 32) {
00568             cftf1st(n, a, &w[nw - (n >> 2)]);
00569 #           ifdef USE_CDFT_THREADS
00570             if (n > CDFT_THREADS_BEGIN_N) {
00571                 cftrec4_th(n, a, nw, w);
00572             } else 
00573 #           endif /* USE_CDFT_THREADS */
00574             if (n > 512) {
00575                 cftrec4(n, a, nw, w);
00576             } else if (n > 128) {
00577                 cftleaf(n, 1, a, nw, w);
00578             } else {
00579                 cftfx41(n, a, nw, w);
00580             }
00581             bitrv2(n, ip, a);
00582         } else if (n == 32) {
00583             cftf161(a, &w[nw - 8]);
00584             bitrv216(a);
00585         } else {
00586             cftf081(a, w);
00587             bitrv208(a);
00588         }
00589     } else if (n == 8) {
00590         cftf040(a);
00591     } else if (n == 4) {
00592         cftx020(a);
00593     }
00594 }
00595 
00596 
00597 void clTransformS::cftbsub(long n, float *a, long *ip, long nw, float *w)
00598 {
00599     if (n > 8) {
00600         if (n > 32) {
00601             cftb1st(n, a, &w[nw - (n >> 2)]);
00602 #           ifdef USE_CDFT_THREADS
00603             if (n > CDFT_THREADS_BEGIN_N) {
00604                 cftrec4_th(n, a, nw, w);
00605             } else 
00606 #           endif /* USE_CDFT_THREADS */
00607             if (n > 512) {
00608                 cftrec4(n, a, nw, w);
00609             } else if (n > 128) {
00610                 cftleaf(n, 1, a, nw, w);
00611             } else {
00612                 cftfx41(n, a, nw, w);
00613             }
00614             bitrv2conj(n, ip, a);
00615         } else if (n == 32) {
00616             cftf161(a, &w[nw - 8]);
00617             bitrv216neg(a);
00618         } else {
00619             cftf081(a, w);
00620             bitrv208neg(a);
00621         }
00622     } else if (n == 8) {
00623         cftb040(a);
00624     } else if (n == 4) {
00625         cftx020(a);
00626     }
00627 }
00628 
00629 
00630 TS_INLINE void clTransformS::bitrv2(long n, long *ip, float *a)
00631 {
00632     long j, j1, k, k1, l, m, nh, nm;
00633     float xr, xi, yr, yi;
00634     
00635     m = 1;
00636     for (l = n >> 2; l > 8; l >>= 2) {
00637         m <<= 1;
00638     }
00639     nh = n >> 1;
00640     nm = 4 * m;
00641     if (l == 8) {
00642         for (k = 0; k < m; k++) {
00643             for (j = 0; j < k; j++) {
00644                 j1 = 4 * j + 2 * ip[m + k];
00645                 k1 = 4 * k + 2 * ip[m + j];
00646                 xr = a[j1];
00647                 xi = a[j1 + 1];
00648                 yr = a[k1];
00649                 yi = a[k1 + 1];
00650                 a[j1] = yr;
00651                 a[j1 + 1] = yi;
00652                 a[k1] = xr;
00653                 a[k1 + 1] = xi;
00654                 j1 += nm;
00655                 k1 += 2 * nm;
00656                 xr = a[j1];
00657                 xi = a[j1 + 1];
00658                 yr = a[k1];
00659                 yi = a[k1 + 1];
00660                 a[j1] = yr;
00661                 a[j1 + 1] = yi;
00662                 a[k1] = xr;
00663                 a[k1 + 1] = xi;
00664                 j1 += nm;
00665                 k1 -= nm;
00666                 xr = a[j1];
00667                 xi = a[j1 + 1];
00668                 yr = a[k1];
00669                 yi = a[k1 + 1];
00670                 a[j1] = yr;
00671                 a[j1 + 1] = yi;
00672                 a[k1] = xr;
00673                 a[k1 + 1] = xi;
00674                 j1 += nm;
00675                 k1 += 2 * nm;
00676                 xr = a[j1];
00677                 xi = a[j1 + 1];
00678                 yr = a[k1];
00679                 yi = a[k1 + 1];
00680                 a[j1] = yr;
00681                 a[j1 + 1] = yi;
00682                 a[k1] = xr;
00683                 a[k1 + 1] = xi;
00684                 j1 += nh;
00685                 k1 += 2;
00686                 xr = a[j1];
00687                 xi = a[j1 + 1];
00688                 yr = a[k1];
00689                 yi = a[k1 + 1];
00690                 a[j1] = yr;
00691                 a[j1 + 1] = yi;
00692                 a[k1] = xr;
00693                 a[k1 + 1] = xi;
00694                 j1 -= nm;
00695                 k1 -= 2 * nm;
00696                 xr = a[j1];
00697                 xi = a[j1 + 1];
00698                 yr = a[k1];
00699                 yi = a[k1 + 1];
00700                 a[j1] = yr;
00701                 a[j1 + 1] = yi;
00702                 a[k1] = xr;
00703                 a[k1 + 1] = xi;
00704                 j1 -= nm;
00705                 k1 += nm;
00706                 xr = a[j1];
00707                 xi = a[j1 + 1];
00708                 yr = a[k1];
00709                 yi = a[k1 + 1];
00710                 a[j1] = yr;
00711                 a[j1 + 1] = yi;
00712                 a[k1] = xr;
00713                 a[k1 + 1] = xi;
00714                 j1 -= nm;
00715                 k1 -= 2 * nm;
00716                 xr = a[j1];
00717                 xi = a[j1 + 1];
00718                 yr = a[k1];
00719                 yi = a[k1 + 1];
00720                 a[j1] = yr;
00721                 a[j1 + 1] = yi;
00722                 a[k1] = xr;
00723                 a[k1 + 1] = xi;
00724                 j1 += 2;
00725                 k1 += nh;
00726                 xr = a[j1];
00727                 xi = a[j1 + 1];
00728                 yr = a[k1];
00729                 yi = a[k1 + 1];
00730                 a[j1] = yr;
00731                 a[j1 + 1] = yi;
00732                 a[k1] = xr;
00733                 a[k1 + 1] = xi;
00734                 j1 += nm;
00735                 k1 += 2 * nm;
00736                 xr = a[j1];
00737                 xi = a[j1 + 1];
00738                 yr = a[k1];
00739                 yi = a[k1 + 1];
00740                 a[j1] = yr;
00741                 a[j1 + 1] = yi;
00742                 a[k1] = xr;
00743                 a[k1 + 1] = xi;
00744                 j1 += nm;
00745                 k1 -= nm;
00746                 xr = a[j1];
00747                 xi = a[j1 + 1];
00748                 yr = a[k1];
00749                 yi = a[k1 + 1];
00750                 a[j1] = yr;
00751                 a[j1 + 1] = yi;
00752                 a[k1] = xr;
00753                 a[k1 + 1] = xi;
00754                 j1 += nm;
00755                 k1 += 2 * nm;
00756                 xr = a[j1];
00757                 xi = a[j1 + 1];
00758                 yr = a[k1];
00759                 yi = a[k1 + 1];
00760                 a[j1] = yr;
00761                 a[j1 + 1] = yi;
00762                 a[k1] = xr;
00763                 a[k1 + 1] = xi;
00764                 j1 -= nh;
00765                 k1 -= 2;
00766                 xr = a[j1];
00767                 xi = a[j1 + 1];
00768                 yr = a[k1];
00769                 yi = a[k1 + 1];
00770                 a[j1] = yr;
00771                 a[j1 + 1] = yi;
00772                 a[k1] = xr;
00773                 a[k1 + 1] = xi;
00774                 j1 -= nm;
00775                 k1 -= 2 * nm;
00776                 xr = a[j1];
00777                 xi = a[j1 + 1];
00778                 yr = a[k1];
00779                 yi = a[k1 + 1];
00780                 a[j1] = yr;
00781                 a[j1 + 1] = yi;
00782                 a[k1] = xr;
00783                 a[k1 + 1] = xi;
00784                 j1 -= nm;
00785                 k1 += nm;
00786                 xr = a[j1];
00787                 xi = a[j1 + 1];
00788                 yr = a[k1];
00789                 yi = a[k1 + 1];
00790                 a[j1] = yr;
00791                 a[j1 + 1] = yi;
00792                 a[k1] = xr;
00793                 a[k1 + 1] = xi;
00794                 j1 -= nm;
00795                 k1 -= 2 * nm;
00796                 xr = a[j1];
00797                 xi = a[j1 + 1];
00798                 yr = a[k1];
00799                 yi = a[k1 + 1];
00800                 a[j1] = yr;
00801                 a[j1 + 1] = yi;
00802                 a[k1] = xr;
00803                 a[k1 + 1] = xi;
00804             }
00805             k1 = 4 * k + 2 * ip[m + k];
00806             j1 = k1 + 2;
00807             k1 += nh;
00808             xr = a[j1];
00809             xi = a[j1 + 1];
00810             yr = a[k1];
00811             yi = a[k1 + 1];
00812             a[j1] = yr;
00813             a[j1 + 1] = yi;
00814             a[k1] = xr;
00815             a[k1 + 1] = xi;
00816             j1 += nm;
00817             k1 += 2 * nm;
00818             xr = a[j1];
00819             xi = a[j1 + 1];
00820             yr = a[k1];
00821             yi = a[k1 + 1];
00822             a[j1] = yr;
00823             a[j1 + 1] = yi;
00824             a[k1] = xr;
00825             a[k1 + 1] = xi;
00826             j1 += nm;
00827             k1 -= nm;
00828             xr = a[j1];
00829             xi = a[j1 + 1];
00830             yr = a[k1];
00831             yi = a[k1 + 1];
00832             a[j1] = yr;
00833             a[j1 + 1] = yi;
00834             a[k1] = xr;
00835             a[k1 + 1] = xi;
00836             j1 -= 2;
00837             k1 -= nh;
00838             xr = a[j1];
00839             xi = a[j1 + 1];
00840             yr = a[k1];
00841             yi = a[k1 + 1];
00842             a[j1] = yr;
00843             a[j1 + 1] = yi;
00844             a[k1] = xr;
00845             a[k1 + 1] = xi;
00846             j1 += nh + 2;
00847             k1 += nh + 2;
00848             xr = a[j1];
00849             xi = a[j1 + 1];
00850             yr = a[k1];
00851             yi = a[k1 + 1];
00852             a[j1] = yr;
00853             a[j1 + 1] = yi;
00854             a[k1] = xr;
00855             a[k1 + 1] = xi;
00856             j1 -= nh - nm;
00857             k1 += 2 * nm - 2;
00858             xr = a[j1];
00859             xi = a[j1 + 1];
00860             yr = a[k1];
00861             yi = a[k1 + 1];
00862             a[j1] = yr;
00863             a[j1 + 1] = yi;
00864             a[k1] = xr;
00865             a[k1 + 1] = xi;
00866         }
00867     } else {
00868         for (k = 0; k < m; k++) {
00869             for (j = 0; j < k; j++) {
00870                 j1 = 4 * j + ip[m + k];
00871                 k1 = 4 * k + ip[m + j];
00872                 xr = a[j1];
00873                 xi = a[j1 + 1];
00874                 yr = a[k1];
00875                 yi = a[k1 + 1];
00876                 a[j1] = yr;
00877                 a[j1 + 1] = yi;
00878                 a[k1] = xr;
00879                 a[k1 + 1] = xi;
00880                 j1 += nm;
00881                 k1 += nm;
00882                 xr = a[j1];
00883                 xi = a[j1 + 1];
00884                 yr = a[k1];
00885                 yi = a[k1 + 1];
00886                 a[j1] = yr;
00887                 a[j1 + 1] = yi;
00888                 a[k1] = xr;
00889                 a[k1 + 1] = xi;
00890                 j1 += nh;
00891                 k1 += 2;
00892                 xr = a[j1];
00893                 xi = a[j1 + 1];
00894                 yr = a[k1];
00895                 yi = a[k1 + 1];
00896                 a[j1] = yr;
00897                 a[j1 + 1] = yi;
00898                 a[k1] = xr;
00899                 a[k1 + 1] = xi;
00900                 j1 -= nm;
00901                 k1 -= nm;
00902                 xr = a[j1];
00903                 xi = a[j1 + 1];
00904                 yr = a[k1];
00905                 yi = a[k1 + 1];
00906                 a[j1] = yr;
00907                 a[j1 + 1] = yi;
00908                 a[k1] = xr;
00909                 a[k1 + 1] = xi;
00910                 j1 += 2;
00911                 k1 += nh;
00912                 xr = a[j1];
00913                 xi = a[j1 + 1];
00914                 yr = a[k1];
00915                 yi = a[k1 + 1];
00916                 a[j1] = yr;
00917                 a[j1 + 1] = yi;
00918                 a[k1] = xr;
00919                 a[k1 + 1] = xi;
00920                 j1 += nm;
00921                 k1 += nm;
00922                 xr = a[j1];
00923                 xi = a[j1 + 1];
00924                 yr = a[k1];
00925                 yi = a[k1 + 1];
00926                 a[j1] = yr;
00927                 a[j1 + 1] = yi;
00928                 a[k1] = xr;
00929                 a[k1 + 1] = xi;
00930                 j1 -= nh;
00931                 k1 -= 2;
00932                 xr = a[j1];
00933                 xi = a[j1 + 1];
00934                 yr = a[k1];
00935                 yi = a[k1 + 1];
00936                 a[j1] = yr;
00937                 a[j1 + 1] = yi;
00938                 a[k1] = xr;
00939                 a[k1 + 1] = xi;
00940                 j1 -= nm;
00941                 k1 -= nm;
00942                 xr = a[j1];
00943                 xi = a[j1 + 1];
00944                 yr = a[k1];
00945                 yi = a[k1 + 1];
00946                 a[j1] = yr;
00947                 a[j1 + 1] = yi;
00948                 a[k1] = xr;
00949                 a[k1 + 1] = xi;
00950             }
00951             k1 = 4 * k + ip[m + k];
00952             j1 = k1 + 2;
00953             k1 += nh;
00954             xr = a[j1];
00955             xi = a[j1 + 1];
00956             yr = a[k1];
00957             yi = a[k1 + 1];
00958             a[j1] = yr;
00959             a[j1 + 1] = yi;
00960             a[k1] = xr;
00961             a[k1 + 1] = xi;
00962             j1 += nm;
00963             k1 += nm;
00964             xr = a[j1];
00965             xi = a[j1 + 1];
00966             yr = a[k1];
00967             yi = a[k1 + 1];
00968             a[j1] = yr;
00969             a[j1 + 1] = yi;
00970             a[k1] = xr;
00971             a[k1 + 1] = xi;
00972         }
00973     }
00974 }
00975 
00976 
00977 TS_INLINE void clTransformS::bitrv2conj(long n, long *ip, float *a)
00978 {
00979     long j, j1, k, k1, l, m, nh, nm;
00980     float xr, xi, yr, yi;
00981     
00982     m = 1;
00983     for (l = n >> 2; l > 8; l >>= 2) {
00984         m <<= 1;
00985     }
00986     nh = n >> 1;
00987     nm = 4 * m;
00988     if (l == 8) {
00989         for (k = 0; k < m; k++) {
00990             for (j = 0; j < k; j++) {
00991                 j1 = 4 * j + 2 * ip[m + k];
00992                 k1 = 4 * k + 2 * ip[m + j];
00993                 xr = a[j1];
00994                 xi = -a[j1 + 1];
00995                 yr = a[k1];
00996                 yi = -a[k1 + 1];
00997                 a[j1] = yr;
00998                 a[j1 + 1] = yi;
00999                 a[k1] = xr;
01000                 a[k1 + 1] = xi;
01001                 j1 += nm;
01002                 k1 += 2 * nm;
01003                 xr = a[j1];
01004                 xi = -a[j1 + 1];
01005                 yr = a[k1];
01006                 yi = -a[k1 + 1];
01007                 a[j1] = yr;
01008                 a[j1 + 1] = yi;
01009                 a[k1] = xr;
01010                 a[k1 + 1] = xi;
01011                 j1 += nm;
01012                 k1 -= nm;
01013                 xr = a[j1];
01014                 xi = -a[j1 + 1];
01015                 yr = a[k1];
01016                 yi = -a[k1 + 1];
01017                 a[j1] = yr;
01018                 a[j1 + 1] = yi;
01019                 a[k1] = xr;
01020                 a[k1 + 1] = xi;
01021                 j1 += nm;
01022                 k1 += 2 * nm;
01023                 xr = a[j1];
01024                 xi = -a[j1 + 1];
01025                 yr = a[k1];
01026                 yi = -a[k1 + 1];
01027                 a[j1] = yr;
01028                 a[j1 + 1] = yi;
01029                 a[k1] = xr;
01030                 a[k1 + 1] = xi;
01031                 j1 += nh;
01032                 k1 += 2;
01033                 xr = a[j1];
01034                 xi = -a[j1 + 1];
01035                 yr = a[k1];
01036                 yi = -a[k1 + 1];
01037                 a[j1] = yr;
01038                 a[j1 + 1] = yi;
01039                 a[k1] = xr;
01040                 a[k1 + 1] = xi;
01041                 j1 -= nm;
01042                 k1 -= 2 * nm;
01043                 xr = a[j1];
01044                 xi = -a[j1 + 1];
01045                 yr = a[k1];
01046                 yi = -a[k1 + 1];
01047                 a[j1] = yr;
01048                 a[j1 + 1] = yi;
01049                 a[k1] = xr;
01050                 a[k1 + 1] = xi;
01051                 j1 -= nm;
01052                 k1 += nm;
01053                 xr = a[j1];
01054                 xi = -a[j1 + 1];
01055                 yr = a[k1];
01056                 yi = -a[k1 + 1];
01057                 a[j1] = yr;
01058                 a[j1 + 1] = yi;
01059                 a[k1] = xr;
01060                 a[k1 + 1] = xi;
01061                 j1 -= nm;
01062                 k1 -= 2 * nm;
01063                 xr = a[j1];
01064                 xi = -a[j1 + 1];
01065                 yr = a[k1];
01066                 yi = -a[k1 + 1];
01067                 a[j1] = yr;
01068                 a[j1 + 1] = yi;
01069                 a[k1] = xr;
01070                 a[k1 + 1] = xi;
01071                 j1 += 2;
01072                 k1 += nh;
01073                 xr = a[j1];
01074                 xi = -a[j1 + 1];
01075                 yr = a[k1];
01076                 yi = -a[k1 + 1];
01077                 a[j1] = yr;
01078                 a[j1 + 1] = yi;
01079                 a[k1] = xr;
01080                 a[k1 + 1] = xi;
01081                 j1 += nm;
01082                 k1 += 2 * nm;
01083                 xr = a[j1];
01084                 xi = -a[j1 + 1];
01085                 yr = a[k1];
01086                 yi = -a[k1 + 1];
01087                 a[j1] = yr;
01088                 a[j1 + 1] = yi;
01089                 a[k1] = xr;
01090                 a[k1 + 1] = xi;
01091                 j1 += nm;
01092                 k1 -= nm;
01093                 xr = a[j1];
01094                 xi = -a[j1 + 1];
01095                 yr = a[k1];
01096                 yi = -a[k1 + 1];
01097                 a[j1] = yr;
01098                 a[j1 + 1] = yi;
01099                 a[k1] = xr;
01100                 a[k1 + 1] = xi;
01101                 j1 += nm;
01102                 k1 += 2 * nm;
01103                 xr = a[j1];
01104                 xi = -a[j1 + 1];
01105                 yr = a[k1];
01106                 yi = -a[k1 + 1];
01107                 a[j1] = yr;
01108                 a[j1 + 1] = yi;
01109                 a[k1] = xr;
01110                 a[k1 + 1] = xi;
01111                 j1 -= nh;
01112                 k1 -= 2;
01113                 xr = a[j1];
01114                 xi = -a[j1 + 1];
01115                 yr = a[k1];
01116                 yi = -a[k1 + 1];
01117                 a[j1] = yr;
01118                 a[j1 + 1] = yi;
01119                 a[k1] = xr;
01120                 a[k1 + 1] = xi;
01121                 j1 -= nm;
01122                 k1 -= 2 * nm;
01123                 xr = a[j1];
01124                 xi = -a[j1 + 1];
01125                 yr = a[k1];
01126                 yi = -a[k1 + 1];
01127                 a[j1] = yr;
01128                 a[j1 + 1] = yi;
01129                 a[k1] = xr;
01130                 a[k1 + 1] = xi;
01131                 j1 -= nm;
01132                 k1 += nm;
01133                 xr = a[j1];
01134                 xi = -a[j1 + 1];
01135                 yr = a[k1];
01136                 yi = -a[k1 + 1];
01137                 a[j1] = yr;
01138                 a[j1 + 1] = yi;
01139                 a[k1] = xr;
01140                 a[k1 + 1] = xi;
01141                 j1 -= nm;
01142                 k1 -= 2 * nm;
01143                 xr = a[j1];
01144                 xi = -a[j1 + 1];
01145                 yr = a[k1];
01146                 yi = -a[k1 + 1];
01147                 a[j1] = yr;
01148                 a[j1 + 1] = yi;
01149                 a[k1] = xr;
01150                 a[k1 + 1] = xi;
01151             }
01152             k1 = 4 * k + 2 * ip[m + k];
01153             j1 = k1 + 2;
01154             k1 += nh;
01155             a[j1 - 1] = -a[j1 - 1];
01156             xr = a[j1];
01157             xi = -a[j1 + 1];
01158             yr = a[k1];
01159             yi = -a[k1 + 1];
01160             a[j1] = yr;
01161             a[j1 + 1] = yi;
01162             a[k1] = xr;
01163             a[k1 + 1] = xi;
01164             a[k1 + 3] = -a[k1 + 3];
01165             j1 += nm;
01166             k1 += 2 * nm;
01167             xr = a[j1];
01168             xi = -a[j1 + 1];
01169             yr = a[k1];
01170             yi = -a[k1 + 1];
01171             a[j1] = yr;
01172             a[j1 + 1] = yi;
01173             a[k1] = xr;
01174             a[k1 + 1] = xi;
01175             j1 += nm;
01176             k1 -= nm;
01177             xr = a[j1];
01178             xi = -a[j1 + 1];
01179             yr = a[k1];
01180             yi = -a[k1 + 1];
01181             a[j1] = yr;
01182             a[j1 + 1] = yi;
01183             a[k1] = xr;
01184             a[k1 + 1] = xi;
01185             j1 -= 2;
01186             k1 -= nh;
01187             xr = a[j1];
01188             xi = -a[j1 + 1];
01189             yr = a[k1];
01190             yi = -a[k1 + 1];
01191             a[j1] = yr;
01192             a[j1 + 1] = yi;
01193             a[k1] = xr;
01194             a[k1 + 1] = xi;
01195             j1 += nh + 2;
01196             k1 += nh + 2;
01197             xr = a[j1];
01198             xi = -a[j1 + 1];
01199             yr = a[k1];
01200             yi = -a[k1 + 1];
01201             a[j1] = yr;
01202             a[j1 + 1] = yi;
01203             a[k1] = xr;
01204             a[k1 + 1] = xi;
01205             j1 -= nh - nm;
01206             k1 += 2 * nm - 2;
01207             a[j1 - 1] = -a[j1 - 1];
01208             xr = a[j1];
01209             xi = -a[j1 + 1];
01210             yr = a[k1];
01211             yi = -a[k1 + 1];
01212             a[j1] = yr;
01213             a[j1 + 1] = yi;
01214             a[k1] = xr;
01215             a[k1 + 1] = xi;
01216             a[k1 + 3] = -a[k1 + 3];
01217         }
01218     } else {
01219         for (k = 0; k < m; k++) {
01220             for (j = 0; j < k; j++) {
01221                 j1 = 4 * j + ip[m + k];
01222                 k1 = 4 * k + ip[m + j];
01223                 xr = a[j1];
01224                 xi = -a[j1 + 1];
01225                 yr = a[k1];
01226                 yi = -a[k1 + 1];
01227                 a[j1] = yr;
01228                 a[j1 + 1] = yi;
01229                 a[k1] = xr;
01230                 a[k1 + 1] = xi;
01231                 j1 += nm;
01232                 k1 += nm;
01233                 xr = a[j1];
01234                 xi = -a[j1 + 1];
01235                 yr = a[k1];
01236                 yi = -a[k1 + 1];
01237                 a[j1] = yr;
01238                 a[j1 + 1] = yi;
01239                 a[k1] = xr;
01240                 a[k1 + 1] = xi;
01241                 j1 += nh;
01242                 k1 += 2;
01243                 xr = a[j1];
01244                 xi = -a[j1 + 1];
01245                 yr = a[k1];
01246                 yi = -a[k1 + 1];
01247                 a[j1] = yr;
01248                 a[j1 + 1] = yi;
01249                 a[k1] = xr;
01250                 a[k1 + 1] = xi;
01251                 j1 -= nm;
01252                 k1 -= nm;
01253                 xr = a[j1];
01254                 xi = -a[j1 + 1];
01255                 yr = a[k1];
01256                 yi = -a[k1 + 1];
01257                 a[j1] = yr;
01258                 a[j1 + 1] = yi;
01259                 a[k1] = xr;
01260                 a[k1 + 1] = xi;
01261                 j1 += 2;
01262                 k1 += nh;
01263                 xr = a[j1];
01264                 xi = -a[j1 + 1];
01265                 yr = a[k1];
01266                 yi = -a[k1 + 1];
01267                 a[j1] = yr;
01268                 a[j1 + 1] = yi;
01269                 a[k1] = xr;
01270                 a[k1 + 1] = xi;
01271                 j1 += nm;
01272                 k1 += nm;
01273                 xr = a[j1];
01274                 xi = -a[j1 + 1];
01275                 yr = a[k1];
01276                 yi = -a[k1 + 1];
01277                 a[j1] = yr;
01278                 a[j1 + 1] = yi;
01279                 a[k1] = xr;
01280                 a[k1 + 1] = xi;
01281                 j1 -= nh;
01282                 k1 -= 2;
01283                 xr = a[j1];
01284                 xi = -a[j1 + 1];
01285                 yr = a[k1];
01286                 yi = -a[k1 + 1];
01287                 a[j1] = yr;
01288                 a[j1 + 1] = yi;
01289                 a[k1] = xr;
01290                 a[k1 + 1] = xi;
01291                 j1 -= nm;
01292                 k1 -= nm;
01293                 xr = a[j1];
01294                 xi = -a[j1 + 1];
01295                 yr = a[k1];
01296                 yi = -a[k1 + 1];
01297                 a[j1] = yr;
01298                 a[j1 + 1] = yi;
01299                 a[k1] = xr;
01300                 a[k1 + 1] = xi;
01301             }
01302             k1 = 4 * k + ip[m + k];
01303             j1 = k1 + 2;
01304             k1 += nh;
01305             a[j1 - 1] = -a[j1 - 1];
01306             xr = a[j1];
01307             xi = -a[j1 + 1];
01308             yr = a[k1];
01309             yi = -a[k1 + 1];
01310             a[j1] = yr;
01311             a[j1 + 1] = yi;
01312             a[k1] = xr;
01313             a[k1 + 1] = xi;
01314             a[k1 + 3] = -a[k1 + 3];
01315             j1 += nm;
01316             k1 += nm;
01317             a[j1 - 1] = -a[j1 - 1];
01318             xr = a[j1];
01319             xi = -a[j1 + 1];
01320             yr = a[k1];
01321             yi = -a[k1 + 1];
01322             a[j1] = yr;
01323             a[j1 + 1] = yi;
01324             a[k1] = xr;
01325             a[k1 + 1] = xi;
01326             a[k1 + 3] = -a[k1 + 3];
01327         }
01328     }
01329 }
01330 
01331 
01332 TS_INLINE void clTransformS::bitrv216(float *a)
01333 {
01334     float x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, 
01335         x5r, x5i, x7r, x7i, x8r, x8i, x10r, x10i, 
01336         x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i;
01337     
01338     x1r = a[2];
01339     x1i = a[3];
01340     x2r = a[4];
01341     x2i = a[5];
01342     x3r = a[6];
01343     x3i = a[7];
01344     x4r = a[8];
01345     x4i = a[9];
01346     x5r = a[10];
01347     x5i = a[11];
01348     x7r = a[14];
01349     x7i = a[15];
01350     x8r = a[16];
01351     x8i = a[17];
01352     x10r = a[20];
01353     x10i = a[21];
01354     x11r = a[22];
01355     x11i = a[23];
01356     x12r = a[24];
01357     x12i = a[25];
01358     x13r = a[26];
01359     x13i = a[27];
01360     x14r = a[28];
01361     x14i = a[29];
01362     a[2] = x8r;
01363     a[3] = x8i;
01364     a[4] = x4r;
01365     a[5] = x4i;
01366     a[6] = x12r;
01367     a[7] = x12i;
01368     a[8] = x2r;
01369     a[9] = x2i;
01370     a[10] = x10r;
01371     a[11] = x10i;
01372     a[14] = x14r;
01373     a[15] = x14i;
01374     a[16] = x1r;
01375     a[17] = x1i;
01376     a[20] = x5r;
01377     a[21] = x5i;
01378     a[22] = x13r;
01379     a[23] = x13i;
01380     a[24] = x3r;
01381     a[25] = x3i;
01382     a[26] = x11r;
01383     a[27] = x11i;
01384     a[28] = x7r;
01385     a[29] = x7i;
01386 }
01387 
01388 
01389 TS_INLINE void clTransformS::bitrv216neg(float *a)
01390 {
01391     float x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, 
01392         x5r, x5i, x6r, x6i, x7r, x7i, x8r, x8i, 
01393         x9r, x9i, x10r, x10i, x11r, x11i, x12r, x12i, 
01394         x13r, x13i, x14r, x14i, x15r, x15i;
01395     
01396     x1r = a[2];
01397     x1i = a[3];
01398     x2r = a[4];
01399     x2i = a[5];
01400     x3r = a[6];
01401     x3i = a[7];
01402     x4r = a[8];
01403     x4i = a[9];
01404     x5r = a[10];
01405     x5i = a[11];
01406     x6r = a[12];
01407     x6i = a[13];
01408     x7r = a[14];
01409     x7i = a[15];
01410     x8r = a[16];
01411     x8i = a[17];
01412     x9r = a[18];
01413     x9i = a[19];
01414     x10r = a[20];
01415     x10i = a[21];
01416     x11r = a[22];
01417     x11i = a[23];
01418     x12r = a[24];
01419     x12i = a[25];
01420     x13r = a[26];
01421     x13i = a[27];
01422     x14r = a[28];
01423     x14i = a[29];
01424     x15r = a[30];
01425     x15i = a[31];
01426     a[2] = x15r;
01427     a[3] = x15i;
01428     a[4] = x7r;
01429     a[5] = x7i;
01430     a[6] = x11r;
01431     a[7] = x11i;
01432     a[8] = x3r;
01433     a[9] = x3i;
01434     a[10] = x13r;
01435     a[11] = x13i;
01436     a[12] = x5r;
01437     a[13] = x5i;
01438     a[14] = x9r;
01439     a[15] = x9i;
01440     a[16] = x1r;
01441     a[17] = x1i;
01442     a[18] = x14r;
01443     a[19] = x14i;
01444     a[20] = x6r;
01445     a[21] = x6i;
01446     a[22] = x10r;
01447     a[23] = x10i;
01448     a[24] = x2r;
01449     a[25] = x2i;
01450     a[26] = x12r;
01451     a[27] = x12i;
01452     a[28] = x4r;
01453     a[29] = x4i;
01454     a[30] = x8r;
01455     a[31] = x8i;
01456 }
01457 
01458 
01459 TS_INLINE void clTransformS::bitrv208(float *a)
01460 {
01461     float x1r, x1i, x3r, x3i, x4r, x4i, x6r, x6i;
01462     
01463     x1r = a[2];
01464     x1i = a[3];
01465     x3r = a[6];
01466     x3i = a[7];
01467     x4r = a[8];
01468     x4i = a[9];
01469     x6r = a[12];
01470     x6i = a[13];
01471     a[2] = x4r;
01472     a[3] = x4i;
01473     a[6] = x6r;
01474     a[7] = x6i;
01475     a[8] = x1r;
01476     a[9] = x1i;
01477     a[12] = x3r;
01478     a[13] = x3i;
01479 }
01480 
01481 
01482 TS_INLINE void clTransformS::bitrv208neg(float *a)
01483 {
01484     float x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, 
01485         x5r, x5i, x6r, x6i, x7r, x7i;
01486     
01487     x1r = a[2];
01488     x1i = a[3];
01489     x2r = a[4];
01490     x2i = a[5];
01491     x3r = a[6];
01492     x3i = a[7];
01493     x4r = a[8];
01494     x4i = a[9];
01495     x5r = a[10];
01496     x5i = a[11];
01497     x6r = a[12];
01498     x6i = a[13];
01499     x7r = a[14];
01500     x7i = a[15];
01501     a[2] = x7r;
01502     a[3] = x7i;
01503     a[4] = x3r;
01504     a[5] = x3i;
01505     a[6] = x5r;
01506     a[7] = x5i;
01507     a[8] = x1r;
01508     a[9] = x1i;
01509     a[10] = x6r;
01510     a[11] = x6i;
01511     a[12] = x2r;
01512     a[13] = x2i;
01513     a[14] = x4r;
01514     a[15] = x4i;
01515 }
01516 
01517 
01518 TS_INLINE void clTransformS::cftf1st(long n, float *a, float *w)
01519 {
01520     long j, j0, j1, j2, j3, k, m, mh;
01521     float wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, 
01522         wd1r, wd1i, wd3r, wd3i;
01523     float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
01524         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i;
01525     
01526     mh = n >> 3;
01527     m = 2 * mh;
01528     j1 = m;
01529     j2 = j1 + m;
01530     j3 = j2 + m;
01531     x0r = a[0] + a[j2];
01532     x0i = a[1] + a[j2 + 1];
01533     x1r = a[0] - a[j2];
01534     x1i = a[1] - a[j2 + 1];
01535     x2r = a[j1] + a[j3];
01536     x2i = a[j1 + 1] + a[j3 + 1];
01537     x3r = a[j1] - a[j3];
01538     x3i = a[j1 + 1] - a[j3 + 1];
01539     a[0] = x0r + x2r;
01540     a[1] = x0i + x2i;
01541     a[j1] = x0r - x2r;
01542     a[j1 + 1] = x0i - x2i;
01543     a[j2] = x1r - x3i;
01544     a[j2 + 1] = x1i + x3r;
01545     a[j3] = x1r + x3i;
01546     a[j3 + 1] = x1i - x3r;
01547     wn4r = w[1];
01548     csc1 = w[2];
01549     csc3 = w[3];
01550     wd1r = 1;
01551     wd1i = 0;
01552     wd3r = 1;
01553     wd3i = 0;
01554     k = 0;
01555     for (j = 2; j < mh - 2; j += 4) {
01556         k += 4;
01557         wk1r = csc1 * (wd1r + w[k]);
01558         wk1i = csc1 * (wd1i + w[k + 1]);
01559         wk3r = csc3 * (wd3r + w[k + 2]);
01560         wk3i = csc3 * (wd3i + w[k + 3]);
01561         wd1r = w[k];
01562         wd1i = w[k + 1];
01563         wd3r = w[k + 2];
01564         wd3i = w[k + 3];
01565         j1 = j + m;
01566         j2 = j1 + m;
01567         j3 = j2 + m;
01568         x0r = a[j] + a[j2];
01569         x0i = a[j + 1] + a[j2 + 1];
01570         x1r = a[j] - a[j2];
01571         x1i = a[j + 1] - a[j2 + 1];
01572         y0r = a[j + 2] + a[j2 + 2];
01573         y0i = a[j + 3] + a[j2 + 3];
01574         y1r = a[j + 2] - a[j2 + 2];
01575         y1i = a[j + 3] - a[j2 + 3];
01576         x2r = a[j1] + a[j3];
01577         x2i = a[j1 + 1] + a[j3 + 1];
01578         x3r = a[j1] - a[j3];
01579         x3i = a[j1 + 1] - a[j3 + 1];
01580         y2r = a[j1 + 2] + a[j3 + 2];
01581         y2i = a[j1 + 3] + a[j3 + 3];
01582         y3r = a[j1 + 2] - a[j3 + 2];
01583         y3i = a[j1 + 3] - a[j3 + 3];
01584         a[j] = x0r + x2r;
01585         a[j + 1] = x0i + x2i;
01586         a[j + 2] = y0r + y2r;
01587         a[j + 3] = y0i + y2i;
01588         a[j1] = x0r - x2r;
01589         a[j1 + 1] = x0i - x2i;
01590         a[j1 + 2] = y0r - y2r;
01591         a[j1 + 3] = y0i - y2i;
01592         x0r = x1r - x3i;
01593         x0i = x1i + x3r;
01594         a[j2] = wk1r * x0r - wk1i * x0i;
01595         a[j2 + 1] = wk1r * x0i + wk1i * x0r;
01596         x0r = y1r - y3i;
01597         x0i = y1i + y3r;
01598         a[j2 + 2] = wd1r * x0r - wd1i * x0i;
01599         a[j2 + 3] = wd1r * x0i + wd1i * x0r;
01600         x0r = x1r + x3i;
01601         x0i = x1i - x3r;
01602         a[j3] = wk3r * x0r + wk3i * x0i;
01603         a[j3 + 1] = wk3r * x0i - wk3i * x0r;
01604         x0r = y1r + y3i;
01605         x0i = y1i - y3r;
01606         a[j3 + 2] = wd3r * x0r + wd3i * x0i;
01607         a[j3 + 3] = wd3r * x0i - wd3i * x0r;
01608         j0 = m - j;
01609         j1 = j0 + m;
01610         j2 = j1 + m;
01611         j3 = j2 + m;
01612         x0r = a[j0] + a[j2];
01613         x0i = a[j0 + 1] + a[j2 + 1];
01614         x1r = a[j0] - a[j2];
01615         x1i = a[j0 + 1] - a[j2 + 1];
01616         y0r = a[j0 - 2] + a[j2 - 2];
01617         y0i = a[j0 - 1] + a[j2 - 1];
01618         y1r = a[j0 - 2] - a[j2 - 2];
01619         y1i = a[j0 - 1] - a[j2 - 1];
01620         x2r = a[j1] + a[j3];
01621         x2i = a[j1 + 1] + a[j3 + 1];
01622         x3r = a[j1] - a[j3];
01623         x3i = a[j1 + 1] - a[j3 + 1];
01624         y2r = a[j1 - 2] + a[j3 - 2];
01625         y2i = a[j1 - 1] + a[j3 - 1];
01626         y3r = a[j1 - 2] - a[j3 - 2];
01627         y3i = a[j1 - 1] - a[j3 - 1];
01628         a[j0] = x0r + x2r;
01629         a[j0 + 1] = x0i + x2i;
01630         a[j0 - 2] = y0r + y2r;
01631         a[j0 - 1] = y0i + y2i;
01632         a[j1] = x0r - x2r;
01633         a[j1 + 1] = x0i - x2i;
01634         a[j1 - 2] = y0r - y2r;
01635         a[j1 - 1] = y0i - y2i;
01636         x0r = x1r - x3i;
01637         x0i = x1i + x3r;
01638         a[j2] = wk1i * x0r - wk1r * x0i;
01639         a[j2 + 1] = wk1i * x0i + wk1r * x0r;
01640         x0r = y1r - y3i;
01641         x0i = y1i + y3r;
01642         a[j2 - 2] = wd1i * x0r - wd1r * x0i;
01643         a[j2 - 1] = wd1i * x0i + wd1r * x0r;
01644         x0r = x1r + x3i;
01645         x0i = x1i - x3r;
01646         a[j3] = wk3i * x0r + wk3r * x0i;
01647         a[j3 + 1] = wk3i * x0i - wk3r * x0r;
01648         x0r = y1r + y3i;
01649         x0i = y1i - y3r;
01650         a[j3 - 2] = wd3i * x0r + wd3r * x0i;
01651         a[j3 - 1] = wd3i * x0i - wd3r * x0r;
01652     }
01653     wk1r = csc1 * (wd1r + wn4r);
01654     wk1i = csc1 * (wd1i + wn4r);
01655     wk3r = csc3 * (wd3r - wn4r);
01656     wk3i = csc3 * (wd3i - wn4r);
01657     j0 = mh;
01658     j1 = j0 + m;
01659     j2 = j1 + m;
01660     j3 = j2 + m;
01661     x0r = a[j0 - 2] + a[j2 - 2];
01662     x0i = a[j0 - 1] + a[j2 - 1];
01663     x1r = a[j0 - 2] - a[j2 - 2];
01664     x1i = a[j0 - 1] - a[j2 - 1];
01665     x2r = a[j1 - 2] + a[j3 - 2];
01666     x2i = a[j1 - 1] + a[j3 - 1];
01667     x3r = a[j1 - 2] - a[j3 - 2];
01668     x3i = a[j1 - 1] - a[j3 - 1];
01669     a[j0 - 2] = x0r + x2r;
01670     a[j0 - 1] = x0i + x2i;
01671     a[j1 - 2] = x0r - x2r;
01672     a[j1 - 1] = x0i - x2i;
01673     x0r = x1r - x3i;
01674     x0i = x1i + x3r;
01675     a[j2 - 2] = wk1r * x0r - wk1i * x0i;
01676     a[j2 - 1] = wk1r * x0i + wk1i * x0r;
01677     x0r = x1r + x3i;
01678     x0i = x1i - x3r;
01679     a[j3 - 2] = wk3r * x0r + wk3i * x0i;
01680     a[j3 - 1] = wk3r * x0i - wk3i * x0r;
01681     x0r = a[j0] + a[j2];
01682     x0i = a[j0 + 1] + a[j2 + 1];
01683     x1r = a[j0] - a[j2];
01684     x1i = a[j0 + 1] - a[j2 + 1];
01685     x2r = a[j1] + a[j3];
01686     x2i = a[j1 + 1] + a[j3 + 1];
01687     x3r = a[j1] - a[j3];
01688     x3i = a[j1 + 1] - a[j3 + 1];
01689     a[j0] = x0r + x2r;
01690     a[j0 + 1] = x0i + x2i;
01691     a[j1] = x0r - x2r;
01692     a[j1 + 1] = x0i - x2i;
01693     x0r = x1r - x3i;
01694     x0i = x1i + x3r;
01695     a[j2] = wn4r * (x0r - x0i);
01696     a[j2 + 1] = wn4r * (x0i + x0r);
01697     x0r = x1r + x3i;
01698     x0i = x1i - x3r;
01699     a[j3] = -wn4r * (x0r + x0i);
01700     a[j3 + 1] = -wn4r * (x0i - x0r);
01701     x0r = a[j0 + 2] + a[j2 + 2];
01702     x0i = a[j0 + 3] + a[j2 + 3];
01703     x1r = a[j0 + 2] - a[j2 + 2];
01704     x1i = a[j0 + 3] - a[j2 + 3];
01705     x2r = a[j1 + 2] + a[j3 + 2];
01706     x2i = a[j1 + 3] + a[j3 + 3];
01707     x3r = a[j1 + 2] - a[j3 + 2];
01708     x3i = a[j1 + 3] - a[j3 + 3];
01709     a[j0 + 2] = x0r + x2r;
01710     a[j0 + 3] = x0i + x2i;
01711     a[j1 + 2] = x0r - x2r;
01712     a[j1 + 3] = x0i - x2i;
01713     x0r = x1r - x3i;
01714     x0i = x1i + x3r;
01715     a[j2 + 2] = wk1i * x0r - wk1r * x0i;
01716     a[j2 + 3] = wk1i * x0i + wk1r * x0r;
01717     x0r = x1r + x3i;
01718     x0i = x1i - x3r;
01719     a[j3 + 2] = wk3i * x0r + wk3r * x0i;
01720     a[j3 + 3] = wk3i * x0i - wk3r * x0r;
01721 }
01722 
01723 
01724 TS_INLINE void clTransformS::cftb1st(long n, float *a, float *w)
01725 {
01726     long j, j0, j1, j2, j3, k, m, mh;
01727     float wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, 
01728         wd1r, wd1i, wd3r, wd3i;
01729     float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
01730         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i;
01731     
01732     mh = n >> 3;
01733     m = 2 * mh;
01734     j1 = m;
01735     j2 = j1 + m;
01736     j3 = j2 + m;
01737     x0r = a[0] + a[j2];
01738     x0i = -a[1] - a[j2 + 1];
01739     x1r = a[0] - a[j2];
01740     x1i = -a[1] + a[j2 + 1];
01741     x2r = a[j1] + a[j3];
01742     x2i = a[j1 + 1] + a[j3 + 1];
01743     x3r = a[j1] - a[j3];
01744     x3i = a[j1 + 1] - a[j3 + 1];
01745     a[0] = x0r + x2r;
01746     a[1] = x0i - x2i;
01747     a[j1] = x0r - x2r;
01748     a[j1 + 1] = x0i + x2i;
01749     a[j2] = x1r + x3i;
01750     a[j2 + 1] = x1i + x3r;
01751     a[j3] = x1r - x3i;
01752     a[j3 + 1] = x1i - x3r;
01753     wn4r = w[1];
01754     csc1 = w[2];
01755     csc3 = w[3];
01756     wd1r = 1;
01757     wd1i = 0;
01758     wd3r = 1;
01759     wd3i = 0;
01760     k = 0;
01761     for (j = 2; j < mh - 2; j += 4) {
01762         k += 4;
01763         wk1r = csc1 * (wd1r + w[k]);
01764         wk1i = csc1 * (wd1i + w[k + 1]);
01765         wk3r = csc3 * (wd3r + w[k + 2]);
01766         wk3i = csc3 * (wd3i + w[k + 3]);
01767         wd1r = w[k];
01768         wd1i = w[k + 1];
01769         wd3r = w[k + 2];
01770         wd3i = w[k + 3];
01771         j1 = j + m;
01772         j2 = j1 + m;
01773         j3 = j2 + m;
01774         x0r = a[j] + a[j2];
01775         x0i = -a[j + 1] - a[j2 + 1];
01776         x1r = a[j] - a[j2];
01777         x1i = -a[j + 1] + a[j2 + 1];
01778         y0r = a[j + 2] + a[j2 + 2];
01779         y0i = -a[j + 3] - a[j2 + 3];
01780         y1r = a[j + 2] - a[j2 + 2];
01781         y1i = -a[j + 3] + a[j2 + 3];
01782         x2r = a[j1] + a[j3];
01783         x2i = a[j1 + 1] + a[j3 + 1];
01784         x3r = a[j1] - a[j3];
01785         x3i = a[j1 + 1] - a[j3 + 1];
01786         y2r = a[j1 + 2] + a[j3 + 2];
01787         y2i = a[j1 + 3] + a[j3 + 3];
01788         y3r = a[j1 + 2] - a[j3 + 2];
01789         y3i = a[j1 + 3] - a[j3 + 3];
01790         a[j] = x0r + x2r;
01791         a[j + 1] = x0i - x2i;
01792         a[j + 2] = y0r + y2r;
01793         a[j + 3] = y0i - y2i;
01794         a[j1] = x0r - x2r;
01795         a[j1 + 1] = x0i + x2i;
01796         a[j1 + 2] = y0r - y2r;
01797         a[j1 + 3] = y0i + y2i;
01798         x0r = x1r + x3i;
01799         x0i = x1i + x3r;
01800         a[j2] = wk1r * x0r - wk1i * x0i;
01801         a[j2 + 1] = wk1r * x0i + wk1i * x0r;
01802         x0r = y1r + y3i;
01803         x0i = y1i + y3r;
01804         a[j2 + 2] = wd1r * x0r - wd1i * x0i;
01805         a[j2 + 3] = wd1r * x0i + wd1i * x0r;
01806         x0r = x1r - x3i;
01807         x0i = x1i - x3r;
01808         a[j3] = wk3r * x0r + wk3i * x0i;
01809         a[j3 + 1] = wk3r * x0i - wk3i * x0r;
01810         x0r = y1r - y3i;
01811         x0i = y1i - y3r;
01812         a[j3 + 2] = wd3r * x0r + wd3i * x0i;
01813         a[j3 + 3] = wd3r * x0i - wd3i * x0r;
01814         j0 = m - j;
01815         j1 = j0 + m;
01816         j2 = j1 + m;
01817         j3 = j2 + m;
01818         x0r = a[j0] + a[j2];
01819         x0i = -a[j0 + 1] - a[j2 + 1];
01820         x1r = a[j0] - a[j2];
01821         x1i = -a[j0 + 1] + a[j2 + 1];
01822         y0r = a[j0 - 2] + a[j2 - 2];
01823         y0i = -a[j0 - 1] - a[j2 - 1];
01824         y1r = a[j0 - 2] - a[j2 - 2];
01825         y1i = -a[j0 - 1] + a[j2 - 1];
01826         x2r = a[j1] + a[j3];
01827         x2i = a[j1 + 1] + a[j3 + 1];
01828         x3r = a[j1] - a[j3];
01829         x3i = a[j1 + 1] - a[j3 + 1];
01830         y2r = a[j1 - 2] + a[j3 - 2];
01831         y2i = a[j1 - 1] + a[j3 - 1];
01832         y3r = a[j1 - 2] - a[j3 - 2];
01833         y3i = a[j1 - 1] - a[j3 - 1];
01834         a[j0] = x0r + x2r;
01835         a[j0 + 1] = x0i - x2i;
01836         a[j0 - 2] = y0r + y2r;
01837         a[j0 - 1] = y0i - y2i;
01838         a[j1] = x0r - x2r;
01839         a[j1 + 1] = x0i + x2i;
01840         a[j1 - 2] = y0r - y2r;
01841         a[j1 - 1] = y0i + y2i;
01842         x0r = x1r + x3i;
01843         x0i = x1i + x3r;
01844         a[j2] = wk1i * x0r - wk1r * x0i;
01845         a[j2 + 1] = wk1i * x0i + wk1r * x0r;
01846         x0r = y1r + y3i;
01847         x0i = y1i + y3r;
01848         a[j2 - 2] = wd1i * x0r - wd1r * x0i;
01849         a[j2 - 1] = wd1i * x0i + wd1r * x0r;
01850         x0r = x1r - x3i;
01851         x0i = x1i - x3r;
01852         a[j3] = wk3i * x0r + wk3r * x0i;
01853         a[j3 + 1] = wk3i * x0i - wk3r * x0r;
01854         x0r = y1r - y3i;
01855         x0i = y1i - y3r;
01856         a[j3 - 2] = wd3i * x0r + wd3r * x0i;
01857         a[j3 - 1] = wd3i * x0i - wd3r * x0r;
01858     }
01859     wk1r = csc1 * (wd1r + wn4r);
01860     wk1i = csc1 * (wd1i + wn4r);
01861     wk3r = csc3 * (wd3r - wn4r);
01862     wk3i = csc3 * (wd3i - wn4r);
01863     j0 = mh;
01864     j1 = j0 + m;
01865     j2 = j1 + m;
01866     j3 = j2 + m;
01867     x0r = a[j0 - 2] + a[j2 - 2];
01868     x0i = -a[j0 - 1] - a[j2 - 1];
01869     x1r = a[j0 - 2] - a[j2 - 2];
01870     x1i = -a[j0 - 1] + a[j2 - 1];
01871     x2r = a[j1 - 2] + a[j3 - 2];
01872     x2i = a[j1 - 1] + a[j3 - 1];
01873     x3r = a[j1 - 2] - a[j3 - 2];
01874     x3i = a[j1 - 1] - a[j3 - 1];
01875     a[j0 - 2] = x0r + x2r;
01876     a[j0 - 1] = x0i - x2i;
01877     a[j1 - 2] = x0r - x2r;
01878     a[j1 - 1] = x0i + x2i;
01879     x0r = x1r + x3i;
01880     x0i = x1i + x3r;
01881     a[j2 - 2] = wk1r * x0r - wk1i * x0i;
01882     a[j2 - 1] = wk1r * x0i + wk1i * x0r;
01883     x0r = x1r - x3i;
01884     x0i = x1i - x3r;
01885     a[j3 - 2] = wk3r * x0r + wk3i * x0i;
01886     a[j3 - 1] = wk3r * x0i - wk3i * x0r;
01887     x0r = a[j0] + a[j2];
01888     x0i = -a[j0 + 1] - a[j2 + 1];
01889     x1r = a[j0] - a[j2];
01890     x1i = -a[j0 + 1] + a[j2 + 1];
01891     x2r = a[j1] + a[j3];
01892     x2i = a[j1 + 1] + a[j3 + 1];
01893     x3r = a[j1] - a[j3];
01894     x3i = a[j1 + 1] - a[j3 + 1];
01895     a[j0] = x0r + x2r;
01896     a[j0 + 1] = x0i - x2i;
01897     a[j1] = x0r - x2r;
01898     a[j1 + 1] = x0i + x2i;
01899     x0r = x1r + x3i;
01900     x0i = x1i + x3r;
01901     a[j2] = wn4r * (x0r - x0i);
01902     a[j2 + 1] = wn4r * (x0i + x0r);
01903     x0r = x1r - x3i;
01904     x0i = x1i - x3r;
01905     a[j3] = -wn4r * (x0r + x0i);
01906     a[j3 + 1] = -wn4r * (x0i - x0r);
01907     x0r = a[j0 + 2] + a[j2 + 2];
01908     x0i = -a[j0 + 3] - a[j2 + 3];
01909     x1r = a[j0 + 2] - a[j2 + 2];
01910     x1i = -a[j0 + 3] + a[j2 + 3];
01911     x2r = a[j1 + 2] + a[j3 + 2];
01912     x2i = a[j1 + 3] + a[j3 + 3];
01913     x3r = a[j1 + 2] - a[j3 + 2];
01914     x3i = a[j1 + 3] - a[j3 + 3];
01915     a[j0 + 2] = x0r + x2r;
01916     a[j0 + 3] = x0i - x2i;
01917     a[j1 + 2] = x0r - x2r;
01918     a[j1 + 3] = x0i + x2i;
01919     x0r = x1r + x3i;
01920     x0i = x1i + x3r;
01921     a[j2 + 2] = wk1i * x0r - wk1r * x0i;
01922     a[j2 + 3] = wk1i * x0i + wk1r * x0r;
01923     x0r = x1r - x3i;
01924     x0i = x1i - x3r;
01925     a[j3 + 2] = wk3i * x0r + wk3r * x0i;
01926     a[j3 + 3] = wk3i * x0i - wk3r * x0r;
01927 }
01928 
01929 
01930 TS_INLINE void clTransformS::cftrec4(long n, float *a, long nw, float *w)
01931 {
01932     long isplt, j, k, m;
01933     
01934     m = n;
01935     while (m > 512) {
01936         m >>= 2;
01937         cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]);
01938     }
01939     cftleaf(m, 1, &a[n - m], nw, w);
01940     k = 0;
01941     for (j = n - m; j > 0; j -= m) {
01942         k++;
01943         isplt = cfttree(m, j, k, a, nw, w);
01944         cftleaf(m, isplt, &a[j - m], nw, w);
01945     }
01946 }
01947 
01948 
01949 TS_INLINE long clTransformS::cfttree(long n, long j, long k, float *a, 
01950     long nw, float *w)
01951 {
01952     long i, isplt, m;
01953     
01954     if ((k & 3) != 0) {
01955         isplt = k & 1;
01956         if (isplt != 0) {
01957             cftmdl1(n, &a[j - n], &w[nw - (n >> 1)]);
01958         } else {
01959             cftmdl2(n, &a[j - n], &w[nw - n]);
01960         }
01961     } else {
01962         m = n;
01963         for (i = k; (i & 3) == 0; i >>= 2) {
01964             m <<= 2;
01965         }
01966         isplt = i & 1;
01967         if (isplt != 0) {
01968             while (m > 128) {
01969                 cftmdl1(m, &a[j - m], &w[nw - (m >> 1)]);
01970                 m >>= 2;
01971             }
01972         } else {
01973             while (m > 128) {
01974                 cftmdl2(m, &a[j - m], &w[nw - m]);
01975                 m >>= 2;
01976             }
01977         }
01978     }
01979     return isplt;
01980 }
01981 
01982 
01983 TS_INLINE void clTransformS::cftleaf(long n, long isplt, float *a, long nw, 
01984     float *w)
01985 {
01986     if (n == 512) {
01987         cftmdl1(128, a, &w[nw - 64]);
01988         cftf161(a, &w[nw - 8]);
01989         cftf162(&a[32], &w[nw - 32]);
01990         cftf161(&a[64], &w[nw - 8]);
01991         cftf161(&a[96], &w[nw - 8]);
01992         cftmdl2(128, &a[128], &w[nw - 128]);
01993         cftf161(&a[128], &w[nw - 8]);
01994         cftf162(&a[160], &w[nw - 32]);
01995         cftf161(&a[192], &w[nw - 8]);
01996         cftf162(&a[224], &w[nw - 32]);
01997         cftmdl1(128, &a[256], &w[nw - 64]);
01998         cftf161(&a[256], &w[nw - 8]);
01999         cftf162(&a[288], &w[nw - 32]);
02000         cftf161(&a[320], &w[nw - 8]);
02001         cftf161(&a[352], &w[nw - 8]);
02002         if (isplt != 0) {
02003             cftmdl1(128, &a[384], &w[nw - 64]);
02004             cftf161(&a[480], &w[nw - 8]);
02005         } else {
02006             cftmdl2(128, &a[384], &w[nw - 128]);
02007             cftf162(&a[480], &w[nw - 32]);
02008         }
02009         cftf161(&a[384], &w[nw - 8]);
02010         cftf162(&a[416], &w[nw - 32]);
02011         cftf161(&a[448], &w[nw - 8]);
02012     } else {
02013         cftmdl1(64, a, &w[nw - 32]);
02014         cftf081(a, &w[nw - 8]);
02015         cftf082(&a[16], &w[nw - 8]);
02016         cftf081(&a[32], &w[nw - 8]);
02017         cftf081(&a[48], &w[nw - 8]);
02018         cftmdl2(64, &a[64], &w[nw - 64]);
02019         cftf081(&a[64], &w[nw - 8]);
02020         cftf082(&a[80], &w[nw - 8]);
02021         cftf081(&a[96], &w[nw - 8]);
02022         cftf082(&a[112], &w[nw - 8]);
02023         cftmdl1(64, &a[128], &w[nw - 32]);
02024         cftf081(&a[128], &w[nw - 8]);
02025         cftf082(&a[144], &w[nw - 8]);
02026         cftf081(&a[160], &w[nw - 8]);
02027         cftf081(&a[176], &w[nw - 8]);
02028         if (isplt != 0) {
02029             cftmdl1(64, &a[192], &w[nw - 32]);
02030             cftf081(&a[240], &w[nw - 8]);
02031         } else {
02032             cftmdl2(64, &a[192], &w[nw - 64]);
02033             cftf082(&a[240], &w[nw - 8]);
02034         }
02035         cftf081(&a[192], &w[nw - 8]);
02036         cftf082(&a[208], &w[nw - 8]);
02037         cftf081(&a[224], &w[nw - 8]);
02038     }
02039 }
02040 
02041 
02042 TS_INLINE void clTransformS::cftmdl1(long n, float *a, float *w)
02043 {
02044     long j, j0, j1, j2, j3, k, m, mh;
02045     float wn4r, wk1r, wk1i, wk3r, wk3i;
02046     float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
02047     
02048     mh = n >> 3;
02049     m = 2 * mh;
02050     j1 = m;
02051     j2 = j1 + m;
02052     j3 = j2 + m;
02053     x0r = a[0] + a[j2];
02054     x0i = a[1] + a[j2 + 1];
02055     x1r = a[0] - a[j2];
02056     x1i = a[1] - a[j2 + 1];
02057     x2r = a[j1] + a[j3];
02058     x2i = a[j1 + 1] + a[j3 + 1];
02059     x3r = a[j1] - a[j3];
02060     x3i = a[j1 + 1] - a[j3 + 1];
02061     a[0] = x0r + x2r;
02062     a[1] = x0i + x2i;
02063     a[j1] = x0r - x2r;
02064     a[j1 + 1] = x0i - x2i;
02065     a[j2] = x1r - x3i;
02066     a[j2 + 1] = x1i + x3r;
02067     a[j3] = x1r + x3i;
02068     a[j3 + 1] = x1i - x3r;
02069     wn4r = w[1];
02070     k = 0;
02071     for (j = 2; j < mh; j += 2) {
02072         k += 4;
02073         wk1r = w[k];
02074         wk1i = w[k + 1];
02075         wk3r = w[k + 2];
02076         wk3i = w[k + 3];
02077         j1 = j + m;
02078         j2 = j1 + m;
02079         j3 = j2 + m;
02080         x0r = a[j] + a[j2];
02081         x0i = a[j + 1] + a[j2 + 1];
02082         x1r = a[j] - a[j2];
02083         x1i = a[j + 1] - a[j2 + 1];
02084         x2r = a[j1] + a[j3];
02085         x2i = a[j1 + 1] + a[j3 + 1];
02086         x3r = a[j1] - a[j3];
02087         x3i = a[j1 + 1] - a[j3 + 1];
02088         a[j] = x0r + x2r;
02089         a[j + 1] = x0i + x2i;
02090         a[j1] = x0r - x2r;
02091         a[j1 + 1] = x0i - x2i;
02092         x0r = x1r - x3i;
02093         x0i = x1i + x3r;
02094         a[j2] = wk1r * x0r - wk1i * x0i;
02095         a[j2 + 1] = wk1r * x0i + wk1i * x0r;
02096         x0r = x1r + x3i;
02097         x0i = x1i - x3r;
02098         a[j3] = wk3r * x0r + wk3i * x0i;
02099         a[j3 + 1] = wk3r * x0i - wk3i * x0r;
02100         j0 = m - j;
02101         j1 = j0 + m;
02102         j2 = j1 + m;
02103         j3 = j2 + m;
02104         x0r = a[j0] + a[j2];
02105         x0i = a[j0 + 1] + a[j2 + 1];
02106         x1r = a[j0] - a[j2];
02107         x1i = a[j0 + 1] - a[j2 + 1];
02108         x2r = a[j1] + a[j3];
02109         x2i = a[j1 + 1] + a[j3 + 1];
02110         x3r = a[j1] - a[j3];
02111         x3i = a[j1 + 1] - a[j3 + 1];
02112         a[j0] = x0r + x2r;
02113         a[j0 + 1] = x0i + x2i;
02114         a[j1] = x0r - x2r;
02115         a[j1 + 1] = x0i - x2i;
02116         x0r = x1r - x3i;
02117         x0i = x1i + x3r;
02118         a[j2] = wk1i * x0r - wk1r * x0i;
02119         a[j2 + 1] = wk1i * x0i + wk1r * x0r;
02120         x0r = x1r + x3i;
02121         x0i = x1i - x3r;
02122         a[j3] = wk3i * x0r + wk3r * x0i;
02123         a[j3 + 1] = wk3i * x0i - wk3r * x0r;
02124     }
02125     j0 = mh;
02126     j1 = j0 + m;
02127     j2 = j1 + m;
02128     j3 = j2 + m;
02129     x0r = a[j0] + a[j2];
02130     x0i = a[j0 + 1] + a[j2 + 1];
02131     x1r = a[j0] - a[j2];
02132     x1i = a[j0 + 1] - a[j2 + 1];
02133     x2r = a[j1] + a[j3];
02134     x2i = a[j1 + 1] + a[j3 + 1];
02135     x3r = a[j1] - a[j3];
02136     x3i = a[j1 + 1] - a[j3 + 1];
02137     a[j0] = x0r + x2r;
02138     a[j0 + 1] = x0i + x2i;
02139     a[j1] = x0r - x2r;
02140     a[j1 + 1] = x0i - x2i;
02141     x0r = x1r - x3i;
02142     x0i = x1i + x3r;
02143     a[j2] = wn4r * (x0r - x0i);
02144     a[j2 + 1] = wn4r * (x0i + x0r);
02145     x0r = x1r + x3i;
02146     x0i = x1i - x3r;
02147     a[j3] = -wn4r * (x0r + x0i);
02148     a[j3 + 1] = -wn4r * (x0i - x0r);
02149 }
02150 
02151 
02152 TS_INLINE void clTransformS::cftmdl2(long n, float *a, float *w)
02153 {
02154     long j, j0, j1, j2, j3, k, kr, m, mh;
02155     float wn4r, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i;
02156     float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y2r, y2i;
02157     
02158     mh = n >> 3;
02159     m = 2 * mh;
02160     wn4r = w[1];
02161     j1 = m;
02162     j2 = j1 + m;
02163     j3 = j2 + m;
02164     x0r = a[0] - a[j2 + 1];
02165     x0i = a[1] + a[j2];
02166     x1r = a[0] + a[j2 + 1];
02167     x1i = a[1] - a[j2];
02168     x2r = a[j1] - a[j3 + 1];
02169     x2i = a[j1 + 1] + a[j3];
02170     x3r = a[j1] + a[j3 + 1];
02171     x3i = a[j1 + 1] - a[j3];
02172     y0r = wn4r * (x2r - x2i);
02173     y0i = wn4r * (x2i + x2r);
02174     a[0] = x0r + y0r;
02175     a[1] = x0i + y0i;
02176     a[j1] = x0r - y0r;
02177     a[j1 + 1] = x0i - y0i;
02178     y0r = wn4r * (x3r - x3i);
02179     y0i = wn4r * (x3i + x3r);
02180     a[j2] = x1r - y0i;
02181     a[j2 + 1] = x1i + y0r;
02182     a[j3] = x1r + y0i;
02183     a[j3 + 1] = x1i - y0r;
02184     k = 0;
02185     kr = 2 * m;
02186     for (j = 2; j < mh; j += 2) {
02187         k += 4;
02188         wk1r = w[k];
02189         wk1i = w[k + 1];
02190         wk3r = w[k + 2];
02191         wk3i = w[k + 3];
02192         kr -= 4;
02193         wd1i = w[kr];
02194         wd1r = w[kr + 1];
02195         wd3i = w[kr + 2];
02196         wd3r = w[kr + 3];
02197         j1 = j + m;
02198         j2 = j1 + m;
02199         j3 = j2 + m;
02200         x0r = a[j] - a[j2 + 1];
02201         x0i = a[j + 1] + a[j2];
02202         x1r = a[j] + a[j2 + 1];
02203         x1i = a[j + 1] - a[j2];
02204         x2r = a[j1] - a[j3 + 1];
02205         x2i = a[j1 + 1] + a[j3];
02206         x3r = a[j1] + a[j3 + 1];
02207         x3i = a[j1 + 1] - a[j3];
02208         y0r = wk1r * x0r - wk1i * x0i;
02209         y0i = wk1r * x0i + wk1i * x0r;
02210         y2r = wd1r * x2r - wd1i * x2i;
02211         y2i = wd1r * x2i + wd1i * x2r;
02212         a[j] = y0r + y2r;
02213         a[j + 1] = y0i + y2i;
02214         a[j1] = y0r - y2r;
02215         a[j1 + 1] = y0i - y2i;
02216         y0r = wk3r * x1r + wk3i * x1i;
02217         y0i = wk3r * x1i - wk3i * x1r;
02218         y2r = wd3r * x3r + wd3i * x3i;
02219         y2i = wd3r * x3i - wd3i * x3r;
02220         a[j2] = y0r + y2r;
02221         a[j2 + 1] = y0i + y2i;
02222         a[j3] = y0r - y2r;
02223         a[j3 + 1] = y0i - y2i;
02224         j0 = m - j;
02225         j1 = j0 + m;
02226         j2 = j1 + m;
02227         j3 = j2 + m;
02228         x0r = a[j0] - a[j2 + 1];
02229         x0i = a[j0 + 1] + a[j2];
02230         x1r = a[j0] + a[j2 + 1];
02231         x1i = a[j0 + 1] - a[j2];
02232         x2r = a[j1] - a[j3 + 1];
02233         x2i = a[j1 + 1] + a[j3];
02234         x3r = a[j1] + a[j3 + 1];
02235         x3i = a[j1 + 1] - a[j3];
02236         y0r = wd1i * x0r - wd1r * x0i;
02237         y0i = wd1i * x0i + wd1r * x0r;
02238         y2r = wk1i * x2r - wk1r * x2i;
02239         y2i = wk1i * x2i + wk1r * x2r;
02240         a[j0] = y0r + y2r;
02241         a[j0 + 1] = y0i + y2i;
02242         a[j1] = y0r - y2r;
02243         a[j1 + 1] = y0i - y2i;
02244         y0r = wd3i * x1r + wd3r * x1i;
02245         y0i = wd3i * x1i - wd3r * x1r;
02246         y2r = wk3i * x3r + wk3r * x3i;
02247         y2i = wk3i * x3i - wk3r * x3r;
02248         a[j2] = y0r + y2r;
02249         a[j2 + 1] = y0i + y2i;
02250         a[j3] = y0r - y2r;
02251         a[j3 + 1] = y0i - y2i;
02252     }
02253     wk1r = w[m];
02254     wk1i = w[m + 1];
02255     j0 = mh;
02256     j1 = j0 + m;
02257     j2 = j1 + m;
02258     j3 = j2 + m;
02259     x0r = a[j0] - a[j2 + 1];
02260     x0i = a[j0 + 1] + a[j2];
02261     x1r = a[j0] + a[j2 + 1];
02262     x1i = a[j0 + 1] - a[j2];
02263     x2r = a[j1] - a[j3 + 1];
02264     x2i = a[j1 + 1] + a[j3];
02265     x3r = a[j1] + a[j3 + 1];
02266     x3i = a[j1 + 1] - a[j3];
02267     y0r = wk1r * x0r - wk1i * x0i;
02268     y0i = wk1r * x0i + wk1i * x0r;
02269     y2r = wk1i * x2r - wk1r * x2i;
02270     y2i = wk1i * x2i + wk1r * x2r;
02271     a[j0] = y0r + y2r;
02272     a[j0 + 1] = y0i + y2i;
02273     a[j1] = y0r - y2r;
02274     a[j1 + 1] = y0i - y2i;
02275     y0r = wk1i * x1r - wk1r * x1i;
02276     y0i = wk1i * x1i + wk1r * x1r;
02277     y2r = wk1r * x3r - wk1i * x3i;
02278     y2i = wk1r * x3i + wk1i * x3r;
02279     a[j2] = y0r - y2r;
02280     a[j2 + 1] = y0i - y2i;
02281     a[j3] = y0r + y2r;
02282     a[j3 + 1] = y0i + y2i;
02283 }
02284 
02285 
02286 TS_INLINE void clTransformS::cftfx41(long n, float *a, long nw, float *w)
02287 {
02288     if (n == 128) {
02289         cftf161(a, &w[nw - 8]);
02290         cftf162(&a[32], &w[nw - 32]);
02291         cftf161(&a[64], &w[nw - 8]);
02292         cftf161(&a[96], &w[nw - 8]);
02293     } else {
02294         cftf081(a, &w[nw - 8]);
02295         cftf082(&a[16], &w[nw - 8]);
02296         cftf081(&a[32], &w[nw - 8]);
02297         cftf081(&a[48], &w[nw - 8]);
02298     }
02299 }
02300 
02301 
02302 TS_INLINE void clTransformS::cftf161(float *a, float *w)
02303 {
02304     float wn4r, wk1r, wk1i, 
02305         x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
02306         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
02307         y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, 
02308         y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, 
02309         y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;
02310     
02311     wn4r = w[1];
02312     wk1r = w[2];
02313     wk1i = w[3];
02314     x0r = a[0] + a[16];
02315     x0i = a[1] + a[17];
02316     x1r = a[0] - a[16];
02317     x1i = a[1] - a[17];
02318     x2r = a[8] + a[24];
02319     x2i = a[9] + a[25];
02320     x3r = a[8] - a[24];
02321     x3i = a[9] - a[25];
02322     y0r = x0r + x2r;
02323     y0i = x0i + x2i;
02324     y4r = x0r - x2r;
02325     y4i = x0i - x2i;
02326     y8r = x1r - x3i;
02327     y8i = x1i + x3r;
02328     y12r = x1r + x3i;
02329     y12i = x1i - x3r;
02330     x0r = a[2] + a[18];
02331     x0i = a[3] + a[19];
02332     x1r = a[2] - a[18];
02333     x1i = a[3] - a[19];
02334     x2r = a[10] + a[26];
02335     x2i = a[11] + a[27];
02336     x3r = a[10] - a[26];
02337     x3i = a[11] - a[27];
02338     y1r = x0r + x2r;
02339     y1i = x0i + x2i;
02340     y5r = x0r - x2r;
02341     y5i = x0i - x2i;
02342     x0r = x1r - x3i;
02343     x0i = x1i + x3r;
02344     y9r = wk1r * x0r - wk1i * x0i;
02345     y9i = wk1r * x0i + wk1i * x0r;
02346     x0r = x1r + x3i;
02347     x0i = x1i - x3r;
02348     y13r = wk1i * x0r - wk1r * x0i;
02349     y13i = wk1i * x0i + wk1r * x0r;
02350     x0r = a[4] + a[20];
02351     x0i = a[5] + a[21];
02352     x1r = a[4] - a[20];
02353     x1i = a[5] - a[21];
02354     x2r = a[12] + a[28];
02355     x2i = a[13] + a[29];
02356     x3r = a[12] - a[28];
02357     x3i = a[13] - a[29];
02358     y2r = x0r + x2r;
02359     y2i = x0i + x2i;
02360     y6r = x0r - x2r;
02361     y6i = x0i - x2i;
02362     x0r = x1r - x3i;
02363     x0i = x1i + x3r;
02364     y10r = wn4r * (x0r - x0i);
02365     y10i = wn4r * (x0i + x0r);
02366     x0r = x1r + x3i;
02367     x0i = x1i - x3r;
02368     y14r = wn4r * (x0r + x0i);
02369     y14i = wn4r * (x0i - x0r);
02370     x0r = a[6] + a[22];
02371     x0i = a[7] + a[23];
02372     x1r = a[6] - a[22];
02373     x1i = a[7] - a[23];
02374     x2r = a[14] + a[30];
02375     x2i = a[15] + a[31];
02376     x3r = a[14] - a[30];
02377     x3i = a[15] - a[31];
02378     y3r = x0r + x2r;
02379     y3i = x0i + x2i;
02380     y7r = x0r - x2r;
02381     y7i = x0i - x2i;
02382     x0r = x1r - x3i;
02383     x0i = x1i + x3r;
02384     y11r = wk1i * x0r - wk1r * x0i;
02385     y11i = wk1i * x0i + wk1r * x0r;
02386     x0r = x1r + x3i;
02387     x0i = x1i - x3r;
02388     y15r = wk1r * x0r - wk1i * x0i;
02389     y15i = wk1r * x0i + wk1i * x0r;
02390     x0r = y12r - y14r;
02391     x0i = y12i - y14i;
02392     x1r = y12r + y14r;
02393     x1i = y12i + y14i;
02394     x2r = y13r - y15r;
02395     x2i = y13i - y15i;
02396     x3r = y13r + y15r;
02397     x3i = y13i + y15i;
02398     a[24] = x0r + x2r;
02399     a[25] = x0i + x2i;
02400     a[26] = x0r - x2r;
02401     a[27] = x0i - x2i;
02402     a[28] = x1r - x3i;
02403     a[29] = x1i + x3r;
02404     a[30] = x1r + x3i;
02405     a[31] = x1i - x3r;
02406     x0r = y8r + y10r;
02407     x0i = y8i + y10i;
02408     x1r = y8r - y10r;
02409     x1i = y8i - y10i;
02410     x2r = y9r + y11r;
02411     x2i = y9i + y11i;
02412     x3r = y9r - y11r;
02413     x3i = y9i - y11i;
02414     a[16] = x0r + x2r;
02415     a[17] = x0i + x2i;
02416     a[18] = x0r - x2r;
02417     a[19] = x0i - x2i;
02418     a[20] = x1r - x3i;
02419     a[21] = x1i + x3r;
02420     a[22] = x1r + x3i;
02421     a[23] = x1i - x3r;
02422     x0r = y5r - y7i;
02423     x0i = y5i + y7r;
02424     x2r = wn4r * (x0r - x0i);
02425     x2i = wn4r * (x0i + x0r);
02426     x0r = y5r + y7i;
02427     x0i = y5i - y7r;
02428     x3r = wn4r * (x0r - x0i);
02429     x3i = wn4r * (x0i + x0r);
02430     x0r = y4r - y6i;
02431     x0i = y4i + y6r;
02432     x1r = y4r + y6i;
02433     x1i = y4i - y6r;
02434     a[8] = x0r + x2r;
02435     a[9] = x0i + x2i;
02436     a[10] = x0r - x2r;
02437     a[11] = x0i - x2i;
02438     a[12] = x1r - x3i;
02439     a[13] = x1i + x3r;
02440     a[14] = x1r + x3i;
02441     a[15] = x1i - x3r;
02442     x0r = y0r + y2r;
02443     x0i = y0i + y2i;
02444     x1r = y0r - y2r;
02445     x1i = y0i - y2i;
02446     x2r = y1r + y3r;
02447     x2i = y1i + y3i;
02448     x3r = y1r - y3r;
02449     x3i = y1i - y3i;
02450     a[0] = x0r + x2r;
02451     a[1] = x0i + x2i;
02452     a[2] = x0r - x2r;
02453     a[3] = x0i - x2i;
02454     a[4] = x1r - x3i;
02455     a[5] = x1i + x3r;
02456     a[6] = x1r + x3i;
02457     a[7] = x1i - x3r;
02458 }
02459 
02460 
02461 TS_INLINE void clTransformS::cftf162(float *a, float *w)
02462 {
02463     float wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, 
02464         x0r, x0i, x1r, x1i, x2r, x2i, 
02465         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
02466         y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, 
02467         y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, 
02468         y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;
02469     
02470     wn4r = w[1];
02471     wk1r = w[4];
02472     wk1i = w[5];
02473     wk3r = w[6];
02474     wk3i = -w[7];
02475     wk2r = w[8];
02476     wk2i = w[9];
02477     x1r = a[0] - a[17];
02478     x1i = a[1] + a[16];
02479     x0r = a[8] - a[25];
02480     x0i = a[9] + a[24];
02481     x2r = wn4r * (x0r - x0i);
02482     x2i = wn4r * (x0i + x0r);
02483     y0r = x1r + x2r;
02484     y0i = x1i + x2i;
02485     y4r = x1r - x2r;
02486     y4i = x1i - x2i;
02487     x1r = a[0] + a[17];
02488     x1i = a[1] - a[16];
02489     x0r = a[8] + a[25];
02490     x0i = a[9] - a[24];
02491     x2r = wn4r * (x0r - x0i);
02492     x2i = wn4r * (x0i + x0r);
02493     y8r = x1r - x2i;
02494     y8i = x1i + x2r;
02495     y12r = x1r + x2i;
02496     y12i = x1i - x2r;
02497     x0r = a[2] - a[19];
02498     x0i = a[3] + a[18];
02499     x1r = wk1r * x0r - wk1i * x0i;
02500     x1i = wk1r * x0i + wk1i * x0r;
02501     x0r = a[10] - a[27];
02502     x0i = a[11] + a[26];
02503     x2r = wk3i * x0r - wk3r * x0i;
02504     x2i = wk3i * x0i + wk3r * x0r;
02505     y1r = x1r + x2r;
02506     y1i = x1i + x2i;
02507     y5r = x1r - x2r;
02508     y5i = x1i - x2i;
02509     x0r = a[2] + a[19];
02510     x0i = a[3] - a[18];
02511     x1r = wk3r * x0r - wk3i * x0i;
02512     x1i = wk3r * x0i + wk3i * x0r;
02513     x0r = a[10] + a[27];
02514     x0i = a[11] - a[26];
02515     x2r = wk1r * x0r + wk1i * x0i;
02516     x2i = wk1r * x0i - wk1i * x0r;
02517     y9r = x1r - x2r;
02518     y9i = x1i - x2i;
02519     y13r = x1r + x2r;
02520     y13i = x1i + x2i;
02521     x0r = a[4] - a[21];
02522     x0i = a[5] + a[20];
02523     x1r = wk2r * x0r - wk2i * x0i;
02524     x1i = wk2r * x0i + wk2i * x0r;
02525     x0r = a[12] - a[29];
02526     x0i = a[13] + a[28];
02527     x2r = wk2i * x0r - wk2r * x0i;
02528     x2i = wk2i * x0i + wk2r * x0r;
02529     y2r = x1r + x2r;
02530     y2i = x1i + x2i;
02531     y6r = x1r - x2r;
02532     y6i = x1i - x2i;
02533     x0r = a[4] + a[21];
02534     x0i = a[5] - a[20];
02535     x1r = wk2i * x0r - wk2r * x0i;
02536     x1i = wk2i * x0i + wk2r * x0r;
02537     x0r = a[12] + a[29];
02538     x0i = a[13] - a[28];
02539     x2r = wk2r * x0r - wk2i * x0i;
02540     x2i = wk2r * x0i + wk2i * x0r;
02541     y10r = x1r - x2r;
02542     y10i = x1i - x2i;
02543     y14r = x1r + x2r;
02544     y14i = x1i + x2i;
02545     x0r = a[6] - a[23];
02546     x0i = a[7] + a[22];
02547     x1r = wk3r * x0r - wk3i * x0i;
02548     x1i = wk3r * x0i + wk3i * x0r;
02549     x0r = a[14] - a[31];
02550     x0i = a[15] + a[30];
02551     x2r = wk1i * x0r - wk1r * x0i;
02552     x2i = wk1i * x0i + wk1r * x0r;
02553     y3r = x1r + x2r;
02554     y3i = x1i + x2i;
02555     y7r = x1r - x2r;
02556     y7i = x1i - x2i;
02557     x0r = a[6] + a[23];
02558     x0i = a[7] - a[22];
02559     x1r = wk1i * x0r + wk1r * x0i;
02560     x1i = wk1i * x0i - wk1r * x0r;
02561     x0r = a[14] + a[31];
02562     x0i = a[15] - a[30];
02563     x2r = wk3i * x0r - wk3r * x0i;
02564     x2i = wk3i * x0i + wk3r * x0r;
02565     y11r = x1r + x2r;
02566     y11i = x1i + x2i;
02567     y15r = x1r - x2r;
02568     y15i = x1i - x2i;
02569     x1r = y0r + y2r;
02570     x1i = y0i + y2i;
02571     x2r = y1r + y3r;
02572     x2i = y1i + y3i;
02573     a[0] = x1r + x2r;
02574     a[1] = x1i + x2i;
02575     a[2] = x1r - x2r;
02576     a[3] = x1i - x2i;
02577     x1r = y0r - y2r;
02578     x1i = y0i - y2i;
02579     x2r = y1r - y3r;
02580     x2i = y1i - y3i;
02581     a[4] = x1r - x2i;
02582     a[5] = x1i + x2r;
02583     a[6] = x1r + x2i;
02584     a[7] = x1i - x2r;
02585     x1r = y4r - y6i;
02586     x1i = y4i + y6r;
02587     x0r = y5r - y7i;
02588     x0i = y5i + y7r;
02589     x2r = wn4r * (x0r - x0i);
02590     x2i = wn4r * (x0i + x0r);
02591     a[8] = x1r + x2r;
02592     a[9] = x1i + x2i;
02593     a[10] = x1r - x2r;
02594     a[11] = x1i - x2i;
02595     x1r = y4r + y6i;
02596     x1i = y4i - y6r;
02597     x0r = y5r + y7i;
02598     x0i = y5i - y7r;
02599     x2r = wn4r * (x0r - x0i);
02600     x2i = wn4r * (x0i + x0r);
02601     a[12] = x1r - x2i;
02602     a[13] = x1i + x2r;
02603     a[14] = x1r + x2i;
02604     a[15] = x1i - x2r;
02605     x1r = y8r + y10r;
02606     x1i = y8i + y10i;
02607     x2r = y9r - y11r;
02608     x2i = y9i - y11i;
02609     a[16] = x1r + x2r;
02610     a[17] = x1i + x2i;
02611     a[18] = x1r - x2r;
02612     a[19] = x1i - x2i;
02613     x1r = y8r - y10r;
02614     x1i = y8i - y10i;
02615     x2r = y9r + y11r;
02616     x2i = y9i + y11i;
02617     a[20] = x1r - x2i;
02618     a[21] = x1i + x2r;
02619     a[22] = x1r + x2i;
02620     a[23] = x1i - x2r;
02621     x1r = y12r - y14i;
02622     x1i = y12i + y14r;
02623     x0r = y13r + y15i;
02624     x0i = y13i - y15r;
02625     x2r = wn4r * (x0r - x0i);
02626     x2i = wn4r * (x0i + x0r);
02627     a[24] = x1r + x2r;
02628     a[25] = x1i + x2i;
02629     a[26] = x1r - x2r;
02630     a[27] = x1i - x2i;
02631     x1r = y12r + y14i;
02632     x1i = y12i - y14r;
02633     x0r = y13r - y15i;
02634     x0i = y13i + y15r;
02635     x2r = wn4r * (x0r - x0i);
02636     x2i = wn4r * (x0i + x0r);
02637     a[28] = x1r - x2i;
02638     a[29] = x1i + x2r;
02639     a[30] = x1r + x2i;
02640     a[31] = x1i - x2r;
02641 }
02642 
02643 
02644 TS_INLINE void clTransformS::cftf081(float *a, float *w)
02645 {
02646     float wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
02647         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
02648         y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;
02649     
02650     wn4r = w[1];
02651     x0r = a[0] + a[8];
02652     x0i = a[1] + a[9];
02653     x1r = a[0] - a[8];
02654     x1i = a[1] - a[9];
02655     x2r = a[4] + a[12];
02656     x2i = a[5] + a[13];
02657     x3r = a[4] - a[12];
02658     x3i = a[5] - a[13];
02659     y0r = x0r + x2r;
02660     y0i = x0i + x2i;
02661     y2r = x0r - x2r;
02662     y2i = x0i - x2i;
02663     y1r = x1r - x3i;
02664     y1i = x1i + x3r;
02665     y3r = x1r + x3i;
02666     y3i = x1i - x3r;
02667     x0r = a[2] + a[10];
02668     x0i = a[3] + a[11];
02669     x1r = a[2] - a[10];
02670     x1i = a[3] - a[11];
02671     x2r = a[6] + a[14];
02672     x2i = a[7] + a[15];
02673     x3r = a[6] - a[14];
02674     x3i = a[7] - a[15];
02675     y4r = x0r + x2r;
02676     y4i = x0i + x2i;
02677     y6r = x0r - x2r;
02678     y6i = x0i - x2i;
02679     x0r = x1r - x3i;
02680     x0i = x1i + x3r;
02681     x2r = x1r + x3i;
02682     x2i = x1i - x3r;
02683     y5r = wn4r * (x0r - x0i);
02684     y5i = wn4r * (x0r + x0i);
02685     y7r = wn4r * (x2r - x2i);
02686     y7i = wn4r * (x2r + x2i);
02687     a[8] = y1r + y5r;
02688     a[9] = y1i + y5i;
02689     a[10] = y1r - y5r;
02690     a[11] = y1i - y5i;
02691     a[12] = y3r - y7i;
02692     a[13] = y3i + y7r;
02693     a[14] = y3r + y7i;
02694     a[15] = y3i - y7r;
02695     a[0] = y0r + y4r;
02696     a[1] = y0i + y4i;
02697     a[2] = y0r - y4r;
02698     a[3] = y0i - y4i;
02699     a[4] = y2r - y6i;
02700     a[5] = y2i + y6r;
02701     a[6] = y2r + y6i;
02702     a[7] = y2i - y6r;
02703 }
02704 
02705 
02706 TS_INLINE void clTransformS::cftf082(float *a, float *w)
02707 {
02708     float wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i, 
02709         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
02710         y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;
02711     
02712     wn4r = w[1];
02713     wk1r = w[2];
02714     wk1i = w[3];
02715     y0r = a[0] - a[9];
02716     y0i = a[1] + a[8];
02717     y1r = a[0] + a[9];
02718     y1i = a[1] - a[8];
02719     x0r = a[4] - a[13];
02720     x0i = a[5] + a[12];
02721     y2r = wn4r * (x0r - x0i);
02722     y2i = wn4r * (x0i + x0r);
02723     x0r = a[4] + a[13];
02724     x0i = a[5] - a[12];
02725     y3r = wn4r * (x0r - x0i);
02726     y3i = wn4r * (x0i + x0r);
02727     x0r = a[2] - a[11];
02728     x0i = a[3] + a[10];
02729     y4r = wk1r * x0r - wk1i * x0i;
02730     y4i = wk1r * x0i + wk1i * x0r;
02731     x0r = a[2] + a[11];
02732     x0i = a[3] - a[10];
02733     y5r = wk1i * x0r - wk1r * x0i;
02734     y5i = wk1i * x0i + wk1r * x0r;
02735     x0r = a[6] - a[15];
02736     x0i = a[7] + a[14];
02737     y6r = wk1i * x0r - wk1r * x0i;
02738     y6i = wk1i * x0i + wk1r * x0r;
02739     x0r = a[6] + a[15];
02740     x0i = a[7] - a[14];
02741     y7r = wk1r * x0r - wk1i * x0i;
02742     y7i = wk1r * x0i + wk1i * x0r;
02743     x0r = y0r + y2r;
02744     x0i = y0i + y2i;
02745     x1r = y4r + y6r;
02746     x1i = y4i + y6i;
02747     a[0] = x0r + x1r;
02748     a[1] = x0i + x1i;
02749     a[2] = x0r - x1r;
02750     a[3] = x0i - x1i;
02751     x0r = y0r - y2r;
02752     x0i = y0i - y2i;
02753     x1r = y4r - y6r;
02754     x1i = y4i - y6i;
02755     a[4] = x0r - x1i;
02756     a[5] = x0i + x1r;
02757     a[6] = x0r + x1i;
02758     a[7] = x0i - x1r;
02759     x0r = y1r - y3i;
02760     x0i = y1i + y3r;
02761     x1r = y5r - y7r;
02762     x1i = y5i - y7i;
02763     a[8] = x0r + x1r;
02764     a[9] = x0i + x1i;
02765     a[10] = x0r - x1r;
02766     a[11] = x0i - x1i;
02767     x0r = y1r + y3i;
02768     x0i = y1i - y3r;
02769     x1r = y5r + y7r;
02770     x1i = y5i + y7i;
02771     a[12] = x0r - x1i;
02772     a[13] = x0i + x1r;
02773     a[14] = x0r + x1i;
02774     a[15] = x0i - x1r;
02775 }
02776 
02777 
02778 TS_INLINE void clTransformS::cftf040(float *a)
02779 {
02780     float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
02781     
02782     x0r = a[0] + a[4];
02783     x0i = a[1] + a[5];
02784     x1r = a[0] - a[4];
02785     x1i = a[1] - a[5];
02786     x2r = a[2] + a[6];
02787     x2i = a[3] + a[7];
02788     x3r = a[2] - a[6];
02789     x3i = a[3] - a[7];
02790     a[0] = x0r + x2r;
02791     a[1] = x0i + x2i;
02792     a[2] = x1r - x3i;
02793     a[3] = x1i + x3r;
02794     a[4] = x0r - x2r;
02795     a[5] = x0i - x2i;
02796     a[6] = x1r + x3i;
02797     a[7] = x1i - x3r;
02798 }
02799 
02800 
02801 TS_INLINE void clTransformS::cftb040(float *a)
02802 {
02803     float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
02804     
02805     x0r = a[0] + a[4];
02806     x0i = a[1] + a[5];
02807     x1r = a[0] - a[4];
02808     x1i = a[1] - a[5];
02809     x2r = a[2] + a[6];
02810     x2i = a[3] + a[7];
02811     x3r = a[2] - a[6];
02812     x3i = a[3] - a[7];
02813     a[0] = x0r + x2r;
02814     a[1] = x0i + x2i;
02815     a[2] = x1r + x3i;
02816     a[3] = x1i - x3r;
02817     a[4] = x0r - x2r;
02818     a[5] = x0i - x2i;
02819     a[6] = x1r - x3i;
02820     a[7] = x1i + x3r;
02821 }
02822 
02823 
02824 TS_INLINE void clTransformS::cftx020(float *a)
02825 {
02826     float x0r, x0i;
02827     
02828     x0r = a[0] - a[2];
02829     x0i = a[1] - a[3];
02830     a[0] += a[2];
02831     a[1] += a[3];
02832     a[2] = x0r;
02833     a[3] = x0i;
02834 }
02835 
02836 
02837 TS_INLINE void clTransformS::rftfsub(long n, float *a, long nc, float *c)
02838 {
02839     long j, k, kk, ks, m;
02840     float wkr, wki, xr, xi, yr, yi;
02841     
02842     m = n >> 1;
02843     ks = 2 * nc / m;
02844     kk = 0;
02845     for (j = 2; j < m; j += 2) {
02846         k = n - j;
02847         kk += ks;
02848         wkr = 0.5f - c[nc - kk];
02849         wki = c[kk];
02850         xr = a[j] - a[k];
02851         xi = a[j + 1] + a[k + 1];
02852         yr = wkr * xr - wki * xi;
02853         yi = wkr * xi + wki * xr;
02854         a[j] -= yr;
02855         a[j + 1] -= yi;
02856         a[k] += yr;
02857         a[k + 1] -= yi;
02858     }
02859 }
02860 
02861 
02862 TS_INLINE void clTransformS::rftbsub(long n, float *a, long nc, float *c)
02863 {
02864     long j, k, kk, ks, m;
02865     float wkr, wki, xr, xi, yr, yi;
02866     
02867     m = n >> 1;
02868     ks = 2 * nc / m;
02869     kk = 0;
02870     for (j = 2; j < m; j += 2) {
02871         k = n - j;
02872         kk += ks;
02873         wkr = 0.5f - c[nc - kk];
02874         wki = c[kk];
02875         xr = a[j] - a[k];
02876         xi = a[j + 1] + a[k + 1];
02877         yr = wkr * xr + wki * xi;
02878         yi = wkr * xi - wki * xr;
02879         a[j] -= yr;
02880         a[j + 1] -= yi;
02881         a[k] += yr;
02882         a[k + 1] -= yi;
02883     }
02884 }
02885 
02886 
02887 TS_INLINE void clTransformS::dctsub(long n, float *a, long nc, float *c)
02888 {
02889     long j, k, kk, ks, m;
02890     float wkr, wki, xr;
02891     
02892     m = n >> 1;
02893     ks = nc / n;
02894     kk = 0;
02895     for (j = 1; j < m; j++) {
02896         k = n - j;
02897         kk += ks;
02898         wkr = c[kk] - c[nc - kk];
02899         wki = c[kk] + c[nc - kk];
02900         xr = wki * a[j] - wkr * a[k];
02901         a[j] = wkr * a[j] + wki * a[k];
02902         a[k] = xr;
02903     }
02904     a[m] *= c[0];
02905 }
02906 
02907 
02908 TS_INLINE void clTransformS::dstsub(long n, float *a, long nc, float *c)
02909 {
02910     long j, k, kk, ks, m;
02911     float wkr, wki, xr;
02912     
02913     m = n >> 1;
02914     ks = nc / n;
02915     kk = 0;
02916     for (j = 1; j < m; j++) {
02917         k = n - j;
02918         kk += ks;
02919         wkr = c[kk] - c[nc - kk];
02920         wki = c[kk] + c[nc - kk];
02921         xr = wki * a[k] - wkr * a[j];
02922         a[k] = wkr * a[k] + wki * a[j];
02923         a[j] = xr;
02924     }
02925     a[m] *= c[0];
02926 }
02927 
02928 
02929 #ifdef USE_CDFT_THREADS
02930 
02931 
02932 void clTransformS::cftrec4_th(long n, float *a, long nw, float *w)
02933 {
02934     long i, idiv4, m, nthread;
02935     cdft_thread_t th[4];
02936     cdft_arg_t ag[4];
02937     
02938     nthread = 2;
02939     idiv4 = 0;
02940     m = n >> 1;
02941     if (n > CDFT_4THREADS_BEGIN_N) {
02942         nthread = 4;
02943         idiv4 = 1;
02944         m >>= 1;
02945     }
02946     for (i = 0; i < nthread; i++) {
02947         ag[i].n0 = n;
02948         ag[i].n = m;
02949         ag[i].a = &a[i * m];
02950         ag[i].nw = nw;
02951         ag[i].w = w;
02952         if (i != idiv4) {
02953             cdft_thread_create(&th[i], cftrec1f_th_cb, &ag[i]);
02954         } else {
02955             cdft_thread_create(&th[i], cftrec2f_th_cb, &ag[i]);
02956         }
02957     }
02958     for (i = 0; i < nthread; i++) {
02959         cdft_thread_wait(th[i]);
02960     }
02961 }
02962 
02963 
02964 void * clTransformS::cftrec1f_th(void *p)
02965 {
02966     long isplt, j, k, m, n, n0, nw;
02967     float *a, *w;
02968     
02969     n0 = ((cdft_arg_t *) p)->n0;
02970     n = ((cdft_arg_t *) p)->n;
02971     a = (float *) ((cdft_arg_t *) p)->a;
02972     nw = ((cdft_arg_t *) p)->nw;
02973     w = (float *) ((cdft_arg_t *) p)->w;
02974     m = n0;
02975     while (m > 512) {
02976         m >>= 2;
02977         cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]);
02978     }
02979     cftleaf(m, 1, &a[n - m], nw, w);
02980     k = 0;
02981     for (j = n - m; j > 0; j -= m) {
02982         k++;
02983         isplt = cfttree(m, j, k, a, nw, w);
02984         cftleaf(m, isplt, &a[j - m], nw, w);
02985     }
02986     return (void *) 0;
02987 }
02988 
02989 
02990 void * clTransformS::cftrec2f_th(void *p)
02991 {
02992     long isplt, j, k, m, n, n0, nw;
02993     float *a, *w;
02994     
02995     n0 = ((cdft_arg_t *) p)->n0;
02996     n = ((cdft_arg_t *) p)->n;
02997     a = (float *) ((cdft_arg_t *) p)->a;
02998     nw = ((cdft_arg_t *) p)->nw;
02999     w = (float *) ((cdft_arg_t *) p)->w;
03000     k = 1;
03001     m = n0;
03002     while (m > 512) {
03003         m >>= 2;
03004         k <<= 2;
03005         cftmdl2(m, &a[n - m], &w[nw - m]);
03006     }
03007     cftleaf(m, 0, &a[n - m], nw, w);
03008     k >>= 1;
03009     for (j = n - m; j > 0; j -= m) {
03010         k++;
03011         isplt = cfttree(m, j, k, a, nw, w);
03012         cftleaf(m, isplt, &a[j - m], nw, w);
03013     }
03014     return (void *) 0;
03015 }
03016 
03017 
03018 #endif /* USE_CDFT_THREADS */
03019 
03020 
03021 /* ##### ===== ##### ===== ##### */
03022 
03023 
03024 void clTransformS::cdft(long n, long isgn, double *a, long *ip, double *w)
03025 {
03026     long nw;
03027     
03028     nw = ip[0];
03029     if (n > (nw << 2)) {
03030         nw = n >> 2;
03031         makewt(nw, ip, w);
03032     }
03033     if (isgn >= 0) {
03034         cftfsub(n, a, ip, nw, w);
03035     } else {
03036         cftbsub(n, a, ip, nw, w);
03037     }
03038 }
03039 
03040 
03041 void clTransformS::rdft(long n, long isgn, double *a, long *ip, double *w)
03042 {
03043     long nw, nc;
03044     double xi;
03045     
03046     nw = ip[0];
03047     if (n > (nw << 2)) {
03048         nw = n >> 2;
03049         makewt(nw, ip, w);
03050     }
03051     nc = ip[1];
03052     if (n > (nc << 2)) {
03053         nc = n >> 2;
03054         makect(nc, ip, w + nw);
03055     }
03056     if (isgn >= 0) {
03057         if (n > 4) {
03058             cftfsub(n, a, ip, nw, w);
03059             rftfsub(n, a, nc, w + nw);
03060         } else if (n == 4) {
03061             cftfsub(n, a, ip, nw, w);
03062         }
03063         xi = a[0] - a[1];
03064         a[0] += a[1];
03065         a[1] = xi;
03066     } else {
03067         a[1] = 0.5 * (a[0] - a[1]);
03068         a[0] -= a[1];
03069         if (n > 4) {
03070             rftbsub(n, a, nc, w + nw);
03071             cftbsub(n, a, ip, nw, w);
03072         } else if (n == 4) {
03073             cftbsub(n, a, ip, nw, w);
03074         }
03075     }
03076 }
03077 
03078 
03079 void clTransformS::ddct(long n, long isgn, double *a, long *ip, double *w)
03080 {
03081     long j, nw, nc;
03082     double xr;
03083     
03084     nw = ip[0];
03085     if (n > (nw << 2)) {
03086         nw = n >> 2;
03087         makewt(nw, ip, w);
03088     }
03089     nc = ip[1];
03090     if (n > nc) {
03091         nc = n;
03092         makect(nc, ip, w + nw);
03093     }
03094     if (isgn < 0) {
03095         xr = a[n - 1];
03096         for (j = n - 2; j >= 2; j -= 2) {
03097             a[j + 1] = a[j] - a[j - 1];
03098             a[j] += a[j - 1];
03099         }
03100         a[1] = a[0] - xr;
03101         a[0] += xr;
03102         if (n > 4) {
03103             rftbsub(n, a, nc, w + nw);
03104             cftbsub(n, a, ip, nw, w);
03105         } else if (n == 4) {
03106             cftbsub(n, a, ip, nw, w);
03107         }
03108     }
03109     dctsub(n, a, nc, w + nw);
03110     if (isgn >= 0) {
03111         if (n > 4) {
03112             cftfsub(n, a, ip, nw, w);
03113             rftfsub(n, a, nc, w + nw);
03114         } else if (n == 4) {
03115             cftfsub(n, a, ip, nw, w);
03116         }
03117         xr = a[0] - a[1];
03118         a[0] += a[1];
03119         for (j = 2; j < n; j += 2) {
03120             a[j - 1] = a[j] - a[j + 1];
03121             a[j] += a[j + 1];
03122         }
03123         a[n - 1] = xr;
03124     }
03125 }
03126 
03127 
03128 void clTransformS::ddst(long n, long isgn, double *a, long *ip, double *w)
03129 {
03130     long j, nw, nc;
03131     double xr;
03132     
03133     nw = ip[0];
03134     if (n > (nw << 2)) {
03135         nw = n >> 2;
03136         makewt(nw, ip, w);
03137     }
03138     nc = ip[1];
03139     if (n > nc) {
03140         nc = n;
03141         makect(nc, ip, w + nw);
03142     }
03143     if (isgn < 0) {
03144         xr = a[n - 1];
03145         for (j = n - 2; j >= 2; j -= 2) {
03146             a[j + 1] = -a[j] - a[j - 1];
03147             a[j] -= a[j - 1];
03148         }
03149         a[1] = a[0] + xr;
03150         a[0] -= xr;
03151         if (n > 4) {
03152             rftbsub(n, a, nc, w + nw);
03153             cftbsub(n, a, ip, nw, w);
03154         } else if (n == 4) {
03155             cftbsub(n, a, ip, nw, w);
03156         }
03157     }
03158     dstsub(n, a, nc, w + nw);
03159     if (isgn >= 0) {
03160         if (n > 4) {
03161             cftfsub(n, a, ip, nw, w);
03162             rftfsub(n, a, nc, w + nw);
03163         } else if (n == 4) {
03164             cftfsub(n, a, ip, nw, w);
03165         }
03166         xr = a[0] - a[1];
03167         a[0] += a[1];
03168         for (j = 2; j < n; j += 2) {
03169             a[j - 1] = -a[j] - a[j + 1];
03170             a[j] -= a[j + 1];
03171         }
03172         a[n - 1] = -xr;
03173     }
03174 }
03175 
03176 
03177 void clTransformS::dfct(long n, double *a, double *t, long *ip, double *w)
03178 {
03179     long j, k, l, m, mh, nw, nc;
03180     double xr, xi, yr, yi;
03181     
03182     nw = ip[0];
03183     if (n > (nw << 3)) {
03184         nw = n >> 3;
03185         makewt(nw, ip, w);
03186     }
03187     nc = ip[1];
03188     if (n > (nc << 1)) {
03189         nc = n >> 1;
03190         makect(nc, ip, w + nw);
03191     }
03192     m = n >> 1;
03193     yi = a[m];
03194     xi = a[0] + a[n];
03195     a[0] -= a[n];
03196     t[0] = xi - yi;
03197     t[m] = xi + yi;
03198     if (n > 2) {
03199         mh = m >> 1;
03200         for (j = 1; j < mh; j++) {
03201             k = m - j;
03202             xr = a[j] - a[n - j];
03203             xi = a[j] + a[n - j];
03204             yr = a[k] - a[n - k];
03205             yi = a[k] + a[n - k];
03206             a[j] = xr;
03207             a[k] = yr;
03208             t[j] = xi - yi;
03209             t[k] = xi + yi;
03210         }
03211         t[mh] = a[mh] + a[n - mh];
03212         a[mh] -= a[n - mh];
03213         dctsub(m, a, nc, w + nw);
03214         if (m > 4) {
03215             cftfsub(m, a, ip, nw, w);
03216             rftfsub(m, a, nc, w + nw);
03217         } else if (m == 4) {
03218             cftfsub(m, a, ip, nw, w);
03219         }
03220         a[n - 1] = a[0] - a[1];
03221         a[1] = a[0] + a[1];
03222         for (j = m - 2; j >= 2; j -= 2) {
03223             a[2 * j + 1] = a[j] + a[j + 1];
03224             a[2 * j - 1] = a[j] - a[j + 1];
03225         }
03226         l = 2;
03227         m = mh;
03228         while (m >= 2) {
03229             dctsub(m, t, nc, w + nw);
03230             if (m > 4) {
03231                 cftfsub(m, t, ip, nw, w);
03232                 rftfsub(m, t, nc, w + nw);
03233             } else if (m == 4) {
03234                 cftfsub(m, t, ip, nw, w);
03235             }
03236             a[n - l] = t[0] - t[1];
03237             a[l] = t[0] + t[1];
03238             k = 0;
03239             for (j = 2; j < m; j += 2) {
03240                 k += l << 2;
03241                 a[k - l] = t[j] - t[j + 1];
03242                 a[k + l] = t[j] + t[j + 1];
03243             }
03244             l <<= 1;
03245             mh = m >> 1;
03246             for (j = 0; j < mh; j++) {
03247                 k = m - j;
03248                 t[j] = t[m + k] - t[m + j];
03249                 t[k] = t[m + k] + t[m + j];
03250             }
03251             t[mh] = t[m + mh];
03252             m = mh;
03253         }
03254         a[l] = t[0];
03255         a[n] = t[2] - t[1];
03256         a[0] = t[2] + t[1];
03257     } else {
03258         a[1] = a[0];
03259         a[2] = t[0];
03260         a[0] = t[1];
03261     }
03262 }
03263 
03264 
03265 void clTransformS::dfst(long n, double *a, double *t, long *ip, double *w)
03266 {
03267     long j, k, l, m, mh, nw, nc;
03268     double xr, xi, yr, yi;
03269     
03270     nw = ip[0];
03271     if (n > (nw << 3)) {
03272         nw = n >> 3;
03273         makewt(nw, ip, w);
03274     }
03275     nc = ip[1];
03276     if (n > (nc << 1)) {
03277         nc = n >> 1;
03278         makect(nc, ip, w + nw);
03279     }
03280     if (n > 2) {
03281         m = n >> 1;
03282         mh = m >> 1;
03283         for (j = 1; j < mh; j++) {
03284             k = m - j;
03285             xr = a[j] + a[n - j];
03286             xi = a[j] - a[n - j];
03287             yr = a[k] + a[n - k];
03288             yi = a[k] - a[n - k];
03289             a[j] = xr;
03290             a[k] = yr;
03291             t[j] = xi + yi;
03292             t[k] = xi - yi;
03293         }
03294         t[0] = a[mh] - a[n - mh];
03295         a[mh] += a[n - mh];
03296         a[0] = a[m];
03297         dstsub(m, a, nc, w + nw);
03298         if (m > 4) {
03299             cftfsub(m, a, ip, nw, w);
03300             rftfsub(m, a, nc, w + nw);
03301         } else if (m == 4) {
03302             cftfsub(m, a, ip, nw, w);
03303         }
03304         a[n - 1] = a[1] - a[0];
03305         a[1] = a[0] + a[1];
03306         for (j = m - 2; j >= 2; j -= 2) {
03307             a[2 * j + 1] = a[j] - a[j + 1];
03308             a[2 * j - 1] = -a[j] - a[j + 1];
03309         }
03310         l = 2;
03311         m = mh;
03312         while (m >= 2) {
03313             dstsub(m, t, nc, w + nw);
03314             if (m > 4) {
03315                 cftfsub(m, t, ip, nw, w);
03316                 rftfsub(m, t, nc, w + nw);
03317             } else if (m == 4) {
03318                 cftfsub(m, t, ip, nw, w);
03319             }
03320             a[n - l] = t[1] - t[0];
03321             a[l] = t[0] + t[1];
03322             k = 0;
03323             for (j = 2; j < m; j += 2) {
03324                 k += l << 2;
03325                 a[k - l] = -t[j] - t[j + 1];
03326                 a[k + l] = t[j] - t[j + 1];
03327             }
03328             l <<= 1;
03329             mh = m >> 1;
03330             for (j = 1; j < mh; j++) {
03331                 k = m - j;
03332                 t[j] = t[m + k] + t[m + j];
03333                 t[k] = t[m + k] - t[m + j];
03334             }
03335             t[0] = t[m + mh];
03336             m = mh;
03337         }
03338         a[l] = t[0];
03339     }
03340     a[0] = 0;
03341 }
03342 
03343 
03344 /* -------- initializing routines -------- */
03345 
03346 
03347 void clTransformS::makewt(long nw, long *ip, double *w)
03348 {
03349     long j, nwh, nw0, nw1;
03350     double delta, wn4r, wk1r, wk1i, wk3r, wk3i;
03351     
03352     ip[0] = nw;
03353     ip[1] = 1;
03354     if (nw > 2) {
03355         nwh = nw >> 1;
03356 #       ifndef TRANSFORM_EXT_PREC
03357         delta = atan(1.0) / nwh;
03358         wn4r = cos(delta * nwh);
03359 #       else
03360         delta = (double) atanl(1.0l) / nwh;
03361         wn4r = (double) cosl(delta * nwh);
03362 #       endif
03363         w[0] = 1;
03364         w[1] = wn4r;
03365         if (nwh == 4) {
03366 #           ifndef TRANSFORM_EXT_PREC
03367             w[2] = cos(delta * 2);
03368             w[3] = sin(delta * 2);
03369 #           else
03370             w[2] = (double) cosl(delta * 2.0l);
03371             w[3] = (double) sinl(delta * 2.0l);
03372 #           endif
03373         } else if (nwh > 4) {
03374             makeipt(nw, ip);
03375 #           ifndef TRANSFORM_EXT_PREC
03376             w[2] = 0.5 / cos(delta * 2);
03377             w[3] = 0.5 / cos(delta * 6);
03378 #           else
03379             w[2] = (double) (0.5l / cosl(delta * 2.0l));
03380             w[3] = (double) (0.5l / cosl(delta * 6.0l));
03381 #           endif
03382             for (j = 4; j < nwh; j += 4) {
03383 #               ifndef TRANSFORM_EXT_PREC
03384                 w[j] = cos(delta * j);
03385                 w[j + 1] = sin(delta * j);
03386                 w[j + 2] = cos(3 * delta * j);
03387                 w[j + 3] = -sin(3 * delta * j);
03388 #               else
03389                 w[j] = (double) cosl(delta * j);
03390                 w[j + 1] = (double) sinl(delta * j);
03391                 w[j + 2] = (double) cosl(3.0l * delta * j);
03392                 w[j + 3] = (double) -sinl(3.0l * delta * j);
03393 #               endif
03394             }
03395         }
03396         nw0 = 0;
03397         while (nwh > 2) {
03398             nw1 = nw0 + nwh;
03399             nwh >>= 1;
03400             w[nw1] = 1;
03401             w[nw1 + 1] = wn4r;
03402             if (nwh == 4) {
03403                 wk1r = w[nw0 + 4];
03404                 wk1i = w[nw0 + 5];
03405                 w[nw1 + 2] = wk1r;
03406                 w[nw1 + 3] = wk1i;
03407             } else if (nwh > 4) {
03408                 wk1r = w[nw0 + 4];
03409                 wk3r = w[nw0 + 6];
03410                 w[nw1 + 2] = 0.5 / wk1r;
03411                 w[nw1 + 3] = 0.5 / wk3r;
03412                 for (j = 4; j < nwh; j += 4) {
03413                     wk1r = w[nw0 + 2 * j];
03414                     wk1i = w[nw0 + 2 * j + 1];
03415                     wk3r = w[nw0 + 2 * j + 2];
03416                     wk3i = w[nw0 + 2 * j + 3];
03417                     w[nw1 + j] = wk1r;
03418                     w[nw1 + j + 1] = wk1i;
03419                     w[nw1 + j + 2] = wk3r;
03420                     w[nw1 + j + 3] = wk3i;
03421                 }
03422             }
03423             nw0 = nw1;
03424         }
03425     }
03426 }
03427 
03428 
03429 void clTransformS::makect(long nc, long *ip, double *c)
03430 {
03431     long j, nch;
03432     double delta;
03433     
03434     ip[1] = nc;
03435     if (nc > 1) {
03436         nch = nc >> 1;
03437 #       ifndef TRANSFORM_EXT_PREC
03438         delta = atan(1.0) / nch;
03439         c[0] = cos(delta * nch);
03440 #       else
03441         delta = (double) atanl(1.0l) / nch;
03442         c[0] = (double) cosl(delta * nch);
03443 #       endif
03444         c[nch] = 0.5 * c[0];
03445         for (j = 1; j < nch; j++) {
03446 #           ifndef TRANSFORM_EXT_PREC
03447             c[j] = 0.5 * cos(delta * j);
03448             c[nc - j] = 0.5 * sin(delta * j);
03449 #           else
03450             c[j] = (double) (0.5l * cosl(delta * j));
03451             c[nc - j] = (double) (0.5l * sinl(delta * j));
03452 #           endif
03453         }
03454     }
03455 }
03456 
03457 
03458 /* -------- child routines -------- */
03459 
03460 
03461 void clTransformS::cftfsub(long n, double *a, long *ip, long nw, double *w)
03462 {
03463     if (n > 8) {
03464         if (n > 32) {
03465             cftf1st(n, a, &w[nw - (n >> 2)]);
03466 #           ifdef USE_CDFT_THREADS
03467             if (n > CDFT_THREADS_BEGIN_N) {
03468                 cftrec4_th(n, a, nw, w);
03469             } else 
03470 #           endif /* USE_CDFT_THREADS */
03471             if (n > 512) {
03472                 cftrec4(n, a, nw, w);
03473             } else if (n > 128) {
03474                 cftleaf(n, 1, a, nw, w);
03475             } else {
03476                 cftfx41(n, a, nw, w);
03477             }
03478             bitrv2(n, ip, a);
03479         } else if (n == 32) {
03480             cftf161(a, &w[nw - 8]);
03481             bitrv216(a);
03482         } else {
03483             cftf081(a, w);
03484             bitrv208(a);
03485         }
03486     } else if (n == 8) {
03487         cftf040(a);
03488     } else if (n == 4) {
03489         cftx020(a);
03490     }
03491 }
03492 
03493 
03494 void clTransformS::cftbsub(long n, double *a, long *ip, long nw, double *w)
03495 {
03496     if (n > 8) {
03497         if (n > 32) {
03498             cftb1st(n, a, &w[nw - (n >> 2)]);
03499 #           ifdef USE_CDFT_THREADS
03500             if (n > CDFT_THREADS_BEGIN_N) {
03501                 cftrec4_th(n, a, nw, w);
03502             } else 
03503 #           endif /* USE_CDFT_THREADS */
03504             if (n > 512) {
03505                 cftrec4(n, a, nw, w);
03506             } else if (n > 128) {
03507                 cftleaf(n, 1, a, nw, w);
03508             } else {
03509                 cftfx41(n, a, nw, w);
03510             }
03511             bitrv2conj(n, ip, a);
03512         } else if (n == 32) {
03513             cftf161(a, &w[nw - 8]);
03514             bitrv216neg(a);
03515         } else {
03516             cftf081(a, w);
03517             bitrv208neg(a);
03518         }
03519     } else if (n == 8) {
03520         cftb040(a);
03521     } else if (n == 4) {
03522         cftx020(a);
03523     }
03524 }
03525 
03526 
03527 TS_INLINE void clTransformS::bitrv2(long n, long *ip, double *a)
03528 {
03529     long j, j1, k, k1, l, m, nh, nm;
03530     double xr, xi, yr, yi;
03531     
03532     m = 1;
03533     for (l = n >> 2; l > 8; l >>= 2) {
03534         m <<= 1;
03535     }
03536     nh = n >> 1;
03537     nm = 4 * m;
03538     if (l == 8) {
03539         for (k = 0; k < m; k++) {
03540             for (j = 0; j < k; j++) {
03541                 j1 = 4 * j + 2 * ip[m + k];
03542                 k1 = 4 * k + 2 * ip[m + j];
03543                 xr = a[j1];
03544                 xi = a[j1 + 1];
03545                 yr = a[k1];
03546                 yi = a[k1 + 1];
03547                 a[j1] = yr;
03548                 a[j1 + 1] = yi;
03549                 a[k1] = xr;
03550                 a[k1 + 1] = xi;
03551                 j1 += nm;
03552                 k1 += 2 * nm;
03553                 xr = a[j1];
03554                 xi = a[j1 + 1];
03555                 yr = a[k1];
03556                 yi = a[k1 + 1];
03557                 a[j1] = yr;
03558                 a[j1 + 1] = yi;
03559                 a[k1] = xr;
03560                 a[k1 + 1] = xi;
03561                 j1 += nm;
03562                 k1 -= nm;
03563                 xr = a[j1];
03564                 xi = a[j1 + 1];
03565                 yr = a[k1];
03566                 yi = a[k1 + 1];
03567                 a[j1] = yr;
03568                 a[j1 + 1] = yi;
03569                 a[k1] = xr;
03570                 a[k1 + 1] = xi;
03571                 j1 += nm;
03572                 k1 += 2 * nm;
03573                 xr = a[j1];
03574                 xi = a[j1 + 1];
03575                 yr = a[k1];
03576                 yi = a[k1 + 1];
03577                 a[j1] = yr;
03578                 a[j1 + 1] = yi;
03579                 a[k1] = xr;
03580                 a[k1 + 1] = xi;
03581                 j1 += nh;
03582                 k1 += 2;
03583                 xr = a[j1];
03584                 xi = a[j1 + 1];
03585                 yr = a[k1];
03586                 yi = a[k1 + 1];
03587                 a[j1] = yr;
03588                 a[j1 + 1] = yi;
03589                 a[k1] = xr;
03590                 a[k1 + 1] = xi;
03591                 j1 -= nm;
03592                 k1 -= 2 * nm;
03593                 xr = a[j1];
03594                 xi = a[j1 + 1];
03595                 yr = a[k1];
03596                 yi = a[k1 + 1];
03597                 a[j1] = yr;
03598                 a[j1 + 1] = yi;
03599                 a[k1] = xr;
03600                 a[k1 + 1] = xi;
03601                 j1 -= nm;
03602                 k1 += nm;
03603                 xr = a[j1];
03604                 xi = a[j1 + 1];
03605                 yr = a[k1];
03606                 yi = a[k1 + 1];
03607                 a[j1] = yr;
03608                 a[j1 + 1] = yi;
03609                 a[k1] = xr;
03610                 a[k1 + 1] = xi;
03611                 j1 -= nm;
03612                 k1 -= 2 * nm;
03613                 xr = a[j1];
03614                 xi = a[j1 + 1];
03615                 yr = a[k1];
03616                 yi = a[k1 + 1];
03617                 a[j1] = yr;
03618                 a[j1 + 1] = yi;
03619                 a[k1] = xr;
03620                 a[k1 + 1] = xi;
03621                 j1 += 2;
03622                 k1 += nh;
03623                 xr = a[j1];
03624                 xi = a[j1 + 1];
03625                 yr = a[k1];
03626                 yi = a[k1 + 1];
03627                 a[j1] = yr;
03628                 a[j1 + 1] = yi;
03629                 a[k1] = xr;
03630                 a[k1 + 1] = xi;
03631                 j1 += nm;
03632                 k1 += 2 * nm;
03633                 xr = a[j1];
03634                 xi = a[j1 + 1];
03635                 yr = a[k1];
03636                 yi = a[k1 + 1];
03637                 a[j1] = yr;
03638                 a[j1 + 1] = yi;
03639                 a[k1] = xr;
03640                 a[k1 + 1] = xi;
03641                 j1 += nm;
03642                 k1 -= nm;
03643                 xr = a[j1];
03644                 xi = a[j1 + 1];
03645                 yr = a[k1];
03646                 yi = a[k1 + 1];
03647                 a[j1] = yr;
03648                 a[j1 + 1] = yi;
03649                 a[k1] = xr;
03650                 a[k1 + 1] = xi;
03651                 j1 += nm;
03652                 k1 += 2 * nm;
03653                 xr = a[j1];
03654                 xi = a[j1 + 1];
03655                 yr = a[k1];
03656                 yi = a[k1 + 1];
03657                 a[j1] = yr;
03658                 a[j1 + 1] = yi;
03659                 a[k1] = xr;
03660                 a[k1 + 1] = xi;
03661                 j1 -= nh;
03662                 k1 -= 2;
03663                 xr = a[j1];
03664                 xi = a[j1 + 1];
03665                 yr = a[k1];
03666                 yi = a[k1 + 1];
03667                 a[j1] = yr;
03668                 a[j1 + 1] = yi;
03669                 a[k1] = xr;
03670                 a[k1 + 1] = xi;
03671                 j1 -= nm;
03672                 k1 -= 2 * nm;
03673                 xr = a[j1];
03674                 xi = a[j1 + 1];
03675                 yr = a[k1];
03676                 yi = a[k1 + 1];
03677                 a[j1] = yr;
03678                 a[j1 + 1] = yi;
03679                 a[k1] = xr;
03680                 a[k1 + 1] = xi;
03681                 j1 -= nm;
03682                 k1 += nm;
03683                 xr = a[j1];
03684                 xi = a[j1 + 1];
03685                 yr = a[k1];
03686                 yi = a[k1 + 1];
03687                 a[j1] = yr;
03688                 a[j1 + 1] = yi;
03689                 a[k1] = xr;
03690                 a[k1 + 1] = xi;
03691                 j1 -= nm;
03692                 k1 -= 2 * nm;
03693                 xr = a[j1];
03694                 xi = a[j1 + 1];
03695                 yr = a[k1];
03696                 yi = a[k1 + 1];
03697                 a[j1] = yr;
03698                 a[j1 + 1] = yi;
03699                 a[k1] = xr;
03700                 a[k1 + 1] = xi;
03701             }
03702             k1 = 4 * k + 2 * ip[m + k];
03703             j1 = k1 + 2;
03704             k1 += nh;
03705             xr = a[j1];
03706             xi = a[j1 + 1];
03707             yr = a[k1];
03708             yi = a[k1 + 1];
03709             a[j1] = yr;
03710             a[j1 + 1] = yi;
03711             a[k1] = xr;
03712             a[k1 + 1] = xi;
03713             j1 += nm;
03714             k1 += 2 * nm;
03715             xr = a[j1];
03716             xi = a[j1 + 1];
03717             yr = a[k1];
03718             yi = a[k1 + 1];
03719             a[j1] = yr;
03720             a[j1 + 1] = yi;
03721             a[k1] = xr;
03722             a[k1 + 1] = xi;
03723             j1 += nm;
03724             k1 -= nm;
03725             xr = a[j1];
03726             xi = a[j1 + 1];
03727             yr = a[k1];
03728             yi = a[k1 + 1];
03729             a[j1] = yr;
03730             a[j1 + 1] = yi;
03731             a[k1] = xr;
03732             a[k1 + 1] = xi;
03733             j1 -= 2;
03734             k1 -= nh;
03735             xr = a[j1];
03736             xi = a[j1 + 1];
03737             yr = a[k1];
03738             yi = a[k1 + 1];
03739             a[j1] = yr;
03740             a[j1 + 1] = yi;
03741             a[k1] = xr;
03742             a[k1 + 1] = xi;
03743             j1 += nh + 2;
03744             k1 += nh + 2;
03745             xr = a[j1];
03746             xi = a[j1 + 1];
03747             yr = a[k1];
03748             yi = a[k1 + 1];
03749             a[j1] = yr;
03750             a[j1 + 1] = yi;
03751             a[k1] = xr;
03752             a[k1 + 1] = xi;
03753             j1 -= nh - nm;
03754             k1 += 2 * nm - 2;
03755             xr = a[j1];
03756             xi = a[j1 + 1];
03757             yr = a[k1];
03758             yi = a[k1 + 1];
03759             a[j1] = yr;
03760             a[j1 + 1] = yi;
03761             a[k1] = xr;
03762             a[k1 + 1] = xi;
03763         }
03764     } else {
03765         for (k = 0; k < m; k++) {
03766             for (j = 0; j < k; j++) {
03767                 j1 = 4 * j + ip[m + k];
03768                 k1 = 4 * k + ip[m + j];
03769                 xr = a[j1];
03770                 xi = a[j1 + 1];
03771                 yr = a[k1];
03772                 yi = a[k1 + 1];
03773                 a[j1] = yr;
03774                 a[j1 + 1] = yi;
03775                 a[k1] = xr;
03776                 a[k1 + 1] = xi;
03777                 j1 += nm;
03778                 k1 += nm;
03779                 xr = a[j1];
03780                 xi = a[j1 + 1];
03781                 yr = a[k1];
03782                 yi = a[k1 + 1];
03783                 a[j1] = yr;
03784                 a[j1 + 1] = yi;
03785                 a[k1] = xr;
03786                 a[k1 + 1] = xi;
03787                 j1 += nh;
03788                 k1 += 2;
03789                 xr = a[j1];
03790                 xi = a[j1 + 1];
03791                 yr = a[k1];
03792                 yi = a[k1 + 1];
03793                 a[j1] = yr;
03794                 a[j1 + 1] = yi;
03795                 a[k1] = xr;
03796                 a[k1 + 1] = xi;
03797                 j1 -= nm;
03798                 k1 -= nm;
03799                 xr = a[j1];
03800                 xi = a[j1 + 1];
03801                 yr = a[k1];
03802                 yi = a[k1 + 1];
03803                 a[j1] = yr;
03804                 a[j1 + 1] = yi;
03805                 a[k1] = xr;
03806                 a[k1 + 1] = xi;
03807                 j1 += 2;
03808                 k1 += nh;
03809                 xr = a[j1];
03810                 xi = a[j1 + 1];
03811                 yr = a[k1];
03812                 yi = a[k1 + 1];
03813                 a[j1] = yr;
03814                 a[j1 + 1] = yi;
03815                 a[k1] = xr;
03816                 a[k1 + 1] = xi;
03817                 j1 += nm;
03818                 k1 += nm;
03819                 xr = a[j1];
03820                 xi = a[j1 + 1];
03821                 yr = a[k1];
03822                 yi = a[k1 + 1];
03823                 a[j1] = yr;
03824                 a[j1 + 1] = yi;
03825                 a[k1] = xr;
03826                 a[k1 + 1] = xi;
03827                 j1 -= nh;
03828                 k1 -= 2;
03829                 xr = a[j1];
03830                 xi = a[j1 + 1];
03831                 yr = a[k1];
03832                 yi = a[k1 + 1];
03833                 a[j1] = yr;
03834                 a[j1 + 1] = yi;
03835                 a[k1] = xr;
03836                 a[k1 + 1] = xi;
03837                 j1 -= nm;
03838                 k1 -= nm;
03839                 xr = a[j1];
03840                 xi = a[j1 + 1];
03841                 yr = a[k1];
03842                 yi = a[k1 + 1];
03843                 a[j1] = yr;
03844                 a[j1 + 1] = yi;
03845                 a[k1] = xr;
03846                 a[k1 + 1] = xi;
03847             }
03848             k1 = 4 * k + ip[m + k];
03849             j1 = k1 + 2;
03850             k1 += nh;
03851             xr = a[j1];
03852             xi = a[j1 + 1];
03853             yr = a[k1];
03854             yi = a[k1 + 1];
03855             a[j1] = yr;
03856             a[j1 + 1] = yi;
03857             a[k1] = xr;
03858             a[k1 + 1] = xi;
03859             j1 += nm;
03860             k1 += nm;
03861             xr = a[j1];
03862             xi = a[j1 + 1];
03863             yr = a[k1];
03864             yi = a[k1 + 1];
03865             a[j1] = yr;
03866             a[j1 + 1] = yi;
03867             a[k1] = xr;
03868             a[k1 + 1] = xi;
03869         }
03870     }
03871 }
03872 
03873 
03874 TS_INLINE void clTransformS::bitrv2conj(long n, long *ip, double *a)
03875 {
03876     long j, j1, k, k1, l, m, nh, nm;
03877     double xr, xi, yr, yi;
03878     
03879     m = 1;
03880     for (l = n >> 2; l > 8; l >>= 2) {
03881         m <<= 1;
03882     }
03883     nh = n >> 1;
03884     nm = 4 * m;
03885     if (l == 8) {
03886         for (k = 0; k < m; k++) {
03887             for (j = 0; j < k; j++) {
03888                 j1 = 4 * j + 2 * ip[m + k];
03889                 k1 = 4 * k + 2 * ip[m + j];
03890                 xr = a[j1];
03891                 xi = -a[j1 + 1];
03892                 yr = a[k1];
03893                 yi = -a[k1 + 1];
03894                 a[j1] = yr;
03895                 a[j1 + 1] = yi;
03896                 a[k1] = xr;
03897                 a[k1 + 1] = xi;
03898                 j1 += nm;
03899                 k1 += 2 * nm;
03900                 xr = a[j1];
03901                 xi = -a[j1 + 1];
03902                 yr = a[k1];
03903                 yi = -a[k1 + 1];
03904                 a[j1] = yr;
03905                 a[j1 + 1] = yi;
03906                 a[k1] = xr;
03907                 a[k1 + 1] = xi;
03908                 j1 += nm;
03909                 k1 -= nm;
03910                 xr = a[j1];
03911                 xi = -a[j1 + 1];
03912                 yr = a[k1];
03913                 yi = -a[k1 + 1];
03914                 a[j1] = yr;
03915                 a[j1 + 1] = yi;
03916                 a[k1] = xr;
03917                 a[k1 + 1] = xi;
03918                 j1 += nm;
03919                 k1 += 2 * nm;
03920                 xr = a[j1];
03921                 xi = -a[j1 + 1];
03922                 yr = a[k1];
03923                 yi = -a[k1 + 1];
03924                 a[j1] = yr;
03925                 a[j1 + 1] = yi;
03926                 a[k1] = xr;
03927                 a[k1 + 1] = xi;
03928                 j1 += nh;
03929                 k1 += 2;
03930                 xr = a[j1];
03931                 xi = -a[j1 + 1];
03932                 yr = a[k1];
03933                 yi = -a[k1 + 1];
03934                 a[j1] = yr;
03935                 a[j1 + 1] = yi;
03936                 a[k1] = xr;
03937                 a[k1 + 1] = xi;
03938                 j1 -= nm;
03939                 k1 -= 2 * nm;
03940                 xr = a[j1];
03941                 xi = -a[j1 + 1];
03942                 yr = a[k1];
03943                 yi = -a[k1 + 1];
03944                 a[j1] = yr;
03945                 a[j1 + 1] = yi;
03946                 a[k1] = xr;
03947                 a[k1 + 1] = xi;
03948                 j1 -= nm;
03949                 k1 += nm;
03950                 xr = a[j1];
03951                 xi = -a[j1 + 1];
03952                 yr = a[k1];
03953                 yi = -a[k1 + 1];
03954                 a[j1] = yr;
03955                 a[j1 + 1] = yi;
03956                 a[k1] = xr;
03957                 a[k1 + 1] = xi;
03958                 j1 -= nm;
03959                 k1 -= 2 * nm;
03960                 xr = a[j1];
03961                 xi = -a[j1 + 1];
03962                 yr = a[k1];
03963                 yi = -a[k1 + 1];
03964                 a[j1] = yr;
03965                 a[j1 + 1] = yi;
03966                 a[k1] = xr;
03967                 a[k1 + 1] = xi;
03968                 j1 += 2;
03969                 k1 += nh;
03970                 xr = a[j1];
03971                 xi = -a[j1 + 1];
03972                 yr = a[k1];
03973                 yi = -a[k1 + 1];
03974                 a[j1] = yr;
03975                 a[j1 + 1] = yi;
03976                 a[k1] = xr;
03977                 a[k1 + 1] = xi;
03978                 j1 += nm;
03979                 k1 += 2 * nm;
03980                 xr = a[j1];
03981                 xi = -a[j1 + 1];
03982                 yr = a[k1];
03983                 yi = -a[k1 + 1];
03984                 a[j1] = yr;
03985                 a[j1 + 1] = yi;
03986                 a[k1] = xr;
03987                 a[k1 + 1] = xi;
03988                 j1 += nm;
03989                 k1 -= nm;
03990                 xr = a[j1];
03991                 xi = -a[j1 + 1];
03992                 yr = a[k1];
03993                 yi = -a[k1 + 1];
03994                 a[j1] = yr;
03995                 a[j1 + 1] = yi;
03996                 a[k1] = xr;
03997                 a[k1 + 1] = xi;
03998                 j1 += nm;
03999                 k1 += 2 * nm;
04000                 xr = a[j1];
04001                 xi = -a[j1 + 1];
04002                 yr = a[k1];
04003                 yi = -a[k1 + 1];
04004                 a[j1] = yr;
04005                 a[j1 + 1] = yi;
04006                 a[k1] = xr;
04007                 a[k1 + 1] = xi;
04008                 j1 -= nh;
04009                 k1 -= 2;
04010                 xr = a[j1];
04011                 xi = -a[j1 + 1];
04012                 yr = a[k1];
04013                 yi = -a[k1 + 1];
04014                 a[j1] = yr;
04015                 a[j1 + 1] = yi;
04016                 a[k1] = xr;
04017                 a[k1 + 1] = xi;
04018                 j1 -= nm;
04019                 k1 -= 2 * nm;
04020                 xr = a[j1];
04021                 xi = -a[j1 + 1];
04022                 yr = a[k1];
04023                 yi = -a[k1 + 1];
04024                 a[j1] = yr;
04025                 a[j1 + 1] = yi;
04026                 a[k1] = xr;
04027                 a[k1 + 1] = xi;
04028                 j1 -= nm;
04029                 k1 += nm;
04030                 xr = a[j1];
04031                 xi = -a[j1 + 1];
04032                 yr = a[k1];
04033                 yi = -a[k1 + 1];
04034                 a[j1] = yr;
04035                 a[j1 + 1] = yi;
04036                 a[k1] = xr;
04037                 a[k1 + 1] = xi;
04038                 j1 -= nm;
04039                 k1 -= 2 * nm;
04040                 xr = a[j1];
04041                 xi = -a[j1 + 1];
04042                 yr = a[k1];
04043                 yi = -a[k1 + 1];
04044                 a[j1] = yr;
04045                 a[j1 + 1] = yi;
04046                 a[k1] = xr;
04047                 a[k1 + 1] = xi;
04048             }
04049             k1 = 4 * k + 2 * ip[m + k];
04050             j1 = k1 + 2;
04051             k1 += nh;
04052             a[j1 - 1] = -a[j1 - 1];
04053             xr = a[j1];
04054             xi = -a[j1 + 1];
04055             yr = a[k1];
04056             yi = -a[k1 + 1];
04057             a[j1] = yr;
04058             a[j1 + 1] = yi;
04059             a[k1] = xr;
04060             a[k1 + 1] = xi;
04061             a[k1 + 3] = -a[k1 + 3];
04062             j1 += nm;
04063             k1 += 2 * nm;
04064             xr = a[j1];
04065             xi = -a[j1 + 1];
04066             yr = a[k1];
04067             yi = -a[k1 + 1];
04068             a[j1] = yr;
04069             a[j1 + 1] = yi;
04070             a[k1] = xr;
04071             a[k1 + 1] = xi;
04072             j1 += nm;
04073             k1 -= nm;
04074             xr = a[j1];
04075             xi = -a[j1 + 1];
04076             yr = a[k1];
04077             yi = -a[k1 + 1];
04078             a[j1] = yr;
04079             a[j1 + 1] = yi;
04080             a[k1] = xr;
04081             a[k1 + 1] = xi;
04082             j1 -= 2;
04083             k1 -= nh;
04084             xr = a[j1];
04085             xi = -a[j1 + 1];
04086             yr = a[k1];
04087             yi = -a[k1 + 1];
04088             a[j1] = yr;
04089             a[j1 + 1] = yi;
04090             a[k1] = xr;
04091             a[k1 + 1] = xi;
04092             j1 += nh + 2;
04093             k1 += nh + 2;
04094             xr = a[j1];
04095             xi = -a[j1 + 1];
04096             yr = a[k1];
04097             yi = -a[k1 + 1];
04098             a[j1] = yr;
04099             a[j1 + 1] = yi;
04100             a[k1] = xr;
04101             a[k1 + 1] = xi;
04102             j1 -= nh - nm;
04103             k1 += 2 * nm - 2;
04104             a[j1 - 1] = -a[j1 - 1];
04105             xr = a[j1];
04106             xi = -a[j1 + 1];
04107             yr = a[k1];
04108             yi = -a[k1 + 1];
04109             a[j1] = yr;
04110             a[j1 + 1] = yi;
04111             a[k1] = xr;
04112             a[k1 + 1] = xi;
04113             a[k1 + 3] = -a[k1 + 3];
04114         }
04115     } else {
04116         for (k = 0; k < m; k++) {
04117             for (j = 0; j < k; j++) {
04118                 j1 = 4 * j + ip[m + k];
04119                 k1 = 4 * k + ip[m + j];
04120                 xr = a[j1];
04121                 xi = -a[j1 + 1];
04122                 yr = a[k1];
04123                 yi = -a[k1 + 1];
04124                 a[j1] = yr;
04125                 a[j1 + 1] = yi;
04126                 a[k1] = xr;
04127                 a[k1 + 1] = xi;
04128                 j1 += nm;
04129                 k1 += nm;
04130                 xr = a[j1];
04131                 xi = -a[j1 + 1];
04132                 yr = a[k1];
04133                 yi = -a[k1 + 1];
04134                 a[j1] = yr;
04135                 a[j1 + 1] = yi;
04136                 a[k1] = xr;
04137                 a[k1 + 1] = xi;
04138                 j1 += nh;
04139                 k1 += 2;
04140                 xr = a[j1];
04141                 xi = -a[j1 + 1];
04142                 yr = a[k1];
04143                 yi = -a[k1 + 1];
04144                 a[j1] = yr;
04145                 a[j1 + 1] = yi;
04146                 a[k1] = xr;
04147                 a[k1 + 1] = xi;
04148                 j1 -= nm;
04149                 k1 -= nm;
04150                 xr = a[j1];
04151                 xi = -a[j1 + 1];
04152                 yr = a[k1];
04153                 yi = -a[k1 + 1];
04154                 a[j1] = yr;
04155                 a[j1 + 1] = yi;
04156                 a[k1] = xr;
04157                 a[k1 + 1] = xi;
04158                 j1 += 2;
04159                 k1 += nh;
04160                 xr = a[j1];
04161                 xi = -a[j1 + 1];
04162                 yr = a[k1];
04163                 yi = -a[k1 + 1];
04164                 a[j1] = yr;
04165                 a[j1 + 1] = yi;
04166                 a[k1] = xr;
04167                 a[k1 + 1] = xi;
04168                 j1 += nm;
04169                 k1 += nm;
04170                 xr = a[j1];
04171                 xi = -a[j1 + 1];
04172                 yr = a[k1];
04173                 yi = -a[k1 + 1];
04174                 a[j1] = yr;
04175                 a[j1 + 1] = yi;
04176                 a[k1] = xr;
04177                 a[k1 + 1] = xi;
04178                 j1 -= nh;
04179                 k1 -= 2;
04180                 xr = a[j1];
04181                 xi = -a[j1 + 1];
04182                 yr = a[k1];
04183                 yi = -a[k1 + 1];
04184                 a[j1] = yr;
04185                 a[j1 + 1] = yi;
04186                 a[k1] = xr;
04187                 a[k1 + 1] = xi;
04188                 j1 -= nm;
04189                 k1 -= nm;
04190                 xr = a[j1];
04191                 xi = -a[j1 + 1];
04192                 yr = a[k1];
04193                 yi = -a[k1 + 1];
04194                 a[j1] = yr;
04195                 a[j1 + 1] = yi;
04196                 a[k1] = xr;
04197                 a[k1 + 1] = xi;
04198             }
04199             k1 = 4 * k + ip[m + k];
04200             j1 = k1 + 2;
04201             k1 += nh;
04202             a[j1 - 1] = -a[j1 - 1];
04203             xr = a[j1];
04204             xi = -a[j1 + 1];
04205             yr = a[k1];
04206             yi = -a[k1 + 1];
04207             a[j1] = yr;
04208             a[j1 + 1] = yi;
04209             a[k1] = xr;
04210             a[k1 + 1] = xi;
04211             a[k1 + 3] = -a[k1 + 3];
04212             j1 += nm;
04213             k1 += nm;
04214             a[j1 - 1] = -a[j1 - 1];
04215             xr = a[j1];
04216             xi = -a[j1 + 1];
04217             yr = a[k1];
04218             yi = -a[k1 + 1];
04219             a[j1] = yr;
04220             a[j1 + 1] = yi;
04221             a[k1] = xr;
04222             a[k1 + 1] = xi;
04223             a[k1 + 3] = -a[k1 + 3];
04224         }
04225     }
04226 }
04227 
04228 
04229 TS_INLINE void clTransformS::bitrv216(double *a)
04230 {
04231     double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, 
04232         x5r, x5i, x7r, x7i, x8r, x8i, x10r, x10i, 
04233         x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i;
04234     
04235     x1r = a[2];
04236     x1i = a[3];
04237     x2r = a[4];
04238     x2i = a[5];
04239     x3r = a[6];
04240     x3i = a[7];
04241     x4r = a[8];
04242     x4i = a[9];
04243     x5r = a[10];
04244     x5i = a[11];
04245     x7r = a[14];
04246     x7i = a[15];
04247     x8r = a[16];
04248     x8i = a[17];
04249     x10r = a[20];
04250     x10i = a[21];
04251     x11r = a[22];
04252     x11i = a[23];
04253     x12r = a[24];
04254     x12i = a[25];
04255     x13r = a[26];
04256     x13i = a[27];
04257     x14r = a[28];
04258     x14i = a[29];
04259     a[2] = x8r;
04260     a[3] = x8i;
04261     a[4] = x4r;
04262     a[5] = x4i;
04263     a[6] = x12r;
04264     a[7] = x12i;
04265     a[8] = x2r;
04266     a[9] = x2i;
04267     a[10] = x10r;
04268     a[11] = x10i;
04269     a[14] = x14r;
04270     a[15] = x14i;
04271     a[16] = x1r;
04272     a[17] = x1i;
04273     a[20] = x5r;
04274     a[21] = x5i;
04275     a[22] = x13r;
04276     a[23] = x13i;
04277     a[24] = x3r;
04278     a[25] = x3i;
04279     a[26] = x11r;
04280     a[27] = x11i;
04281     a[28] = x7r;
04282     a[29] = x7i;
04283 }
04284 
04285 
04286 TS_INLINE void clTransformS::bitrv216neg(double *a)
04287 {
04288     double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, 
04289         x5r, x5i, x6r, x6i, x7r, x7i, x8r, x8i, 
04290         x9r, x9i, x10r, x10i, x11r, x11i, x12r, x12i, 
04291         x13r, x13i, x14r, x14i, x15r, x15i;
04292     
04293     x1r = a[2];
04294     x1i = a[3];
04295     x2r = a[4];
04296     x2i = a[5];
04297     x3r = a[6];
04298     x3i = a[7];
04299     x4r = a[8];
04300     x4i = a[9];
04301     x5r = a[10];
04302     x5i = a[11];
04303     x6r = a[12];
04304     x6i = a[13];
04305     x7r = a[14];
04306     x7i = a[15];
04307     x8r = a[16];
04308     x8i = a[17];
04309     x9r = a[18];
04310     x9i = a[19];
04311     x10r = a[20];
04312     x10i = a[21];
04313     x11r = a[22];
04314     x11i = a[23];
04315     x12r = a[24];
04316     x12i = a[25];
04317     x13r = a[26];
04318     x13i = a[27];
04319     x14r = a[28];
04320     x14i = a[29];
04321     x15r = a[30];
04322     x15i = a[31];
04323     a[2] = x15r;
04324     a[3] = x15i;
04325     a[4] = x7r;
04326     a[5] = x7i;
04327     a[6] = x11r;
04328     a[7] = x11i;
04329     a[8] = x3r;
04330     a[9] = x3i;
04331     a[10] = x13r;
04332     a[11] = x13i;
04333     a[12] = x5r;
04334     a[13] = x5i;
04335     a[14] = x9r;
04336     a[15] = x9i;
04337     a[16] = x1r;
04338     a[17] = x1i;
04339     a[18] = x14r;
04340     a[19] = x14i;
04341     a[20] = x6r;
04342     a[21] = x6i;
04343     a[22] = x10r;
04344     a[23] = x10i;
04345     a[24] = x2r;
04346     a[25] = x2i;
04347     a[26] = x12r;
04348     a[27] = x12i;
04349     a[28] = x4r;
04350     a[29] = x4i;
04351     a[30] = x8r;
04352     a[31] = x8i;
04353 }
04354 
04355 
04356 TS_INLINE void clTransformS::bitrv208(double *a)
04357 {
04358     double x1r, x1i, x3r, x3i, x4r, x4i, x6r, x6i;
04359     
04360     x1r = a[2];
04361     x1i = a[3];
04362     x3r = a[6];
04363     x3i = a[7];
04364     x4r = a[8];
04365     x4i = a[9];
04366     x6r = a[12];
04367     x6i = a[13];
04368     a[2] = x4r;
04369     a[3] = x4i;
04370     a[6] = x6r;
04371     a[7] = x6i;
04372     a[8] = x1r;
04373     a[9] = x1i;
04374     a[12] = x3r;
04375     a[13] = x3i;
04376 }
04377 
04378 
04379 TS_INLINE void clTransformS::bitrv208neg(double *a)
04380 {
04381     double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, 
04382         x5r, x5i, x6r, x6i, x7r, x7i;
04383     
04384     x1r = a[2];
04385     x1i = a[3];
04386     x2r = a[4];
04387     x2i = a[5];
04388     x3r = a[6];
04389     x3i = a[7];
04390     x4r = a[8];
04391     x4i = a[9];
04392     x5r = a[10];
04393     x5i = a[11];
04394     x6r = a[12];
04395     x6i = a[13];
04396     x7r = a[14];
04397     x7i = a[15];
04398     a[2] = x7r;
04399     a[3] = x7i;
04400     a[4] = x3r;
04401     a[5] = x3i;
04402     a[6] = x5r;
04403     a[7] = x5i;
04404     a[8] = x1r;
04405     a[9] = x1i;
04406     a[10] = x6r;
04407     a[11] = x6i;
04408     a[12] = x2r;
04409     a[13] = x2i;
04410     a[14] = x4r;
04411     a[15] = x4i;
04412 }
04413 
04414 
04415 TS_INLINE void clTransformS::cftf1st(long n, double *a, double *w)
04416 {
04417     long j, j0, j1, j2, j3, k, m, mh;
04418     double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, 
04419         wd1r, wd1i, wd3r, wd3i;
04420     double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
04421         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i;
04422     
04423     mh = n >> 3;
04424     m = 2 * mh;
04425     j1 = m;
04426     j2 = j1 + m;
04427     j3 = j2 + m;
04428     x0r = a[0] + a[j2];
04429     x0i = a[1] + a[j2 + 1];
04430     x1r = a[0] - a[j2];
04431     x1i = a[1] - a[j2 + 1];
04432     x2r = a[j1] + a[j3];
04433     x2i = a[j1 + 1] + a[j3 + 1];
04434     x3r = a[j1] - a[j3];
04435     x3i = a[j1 + 1] - a[j3 + 1];
04436     a[0] = x0r + x2r;
04437     a[1] = x0i + x2i;
04438     a[j1] = x0r - x2r;
04439     a[j1 + 1] = x0i - x2i;
04440     a[j2] = x1r - x3i;
04441     a[j2 + 1] = x1i + x3r;
04442     a[j3] = x1r + x3i;
04443     a[j3 + 1] = x1i - x3r;
04444     wn4r = w[1];
04445     csc1 = w[2];
04446     csc3 = w[3];
04447     wd1r = 1;
04448     wd1i = 0;
04449     wd3r = 1;
04450     wd3i = 0;
04451     k = 0;
04452     for (j = 2; j < mh - 2; j += 4) {
04453         k += 4;
04454         wk1r = csc1 * (wd1r + w[k]);
04455         wk1i = csc1 * (wd1i + w[k + 1]);
04456         wk3r = csc3 * (wd3r + w[k + 2]);
04457         wk3i = csc3 * (wd3i + w[k + 3]);
04458         wd1r = w[k];
04459         wd1i = w[k + 1];
04460         wd3r = w[k + 2];
04461         wd3i = w[k + 3];
04462         j1 = j + m;
04463         j2 = j1 + m;
04464         j3 = j2 + m;
04465         x0r = a[j] + a[j2];
04466         x0i = a[j + 1] + a[j2 + 1];
04467         x1r = a[j] - a[j2];
04468         x1i = a[j + 1] - a[j2 + 1];
04469         y0r = a[j + 2] + a[j2 + 2];
04470         y0i = a[j + 3] + a[j2 + 3];
04471         y1r = a[j + 2] - a[j2 + 2];
04472         y1i = a[j + 3] - a[j2 + 3];
04473         x2r = a[j1] + a[j3];
04474         x2i = a[j1 + 1] + a[j3 + 1];
04475         x3r = a[j1] - a[j3];
04476         x3i = a[j1 + 1] - a[j3 + 1];
04477         y2r = a[j1 + 2] + a[j3 + 2];
04478         y2i = a[j1 + 3] + a[j3 + 3];
04479         y3r = a[j1 + 2] - a[j3 + 2];
04480         y3i = a[j1 + 3] - a[j3 + 3];
04481         a[j] = x0r + x2r;
04482         a[j + 1] = x0i + x2i;
04483         a[j + 2] = y0r + y2r;
04484         a[j + 3] = y0i + y2i;
04485         a[j1] = x0r - x2r;
04486         a[j1 + 1] = x0i - x2i;
04487         a[j1 + 2] = y0r - y2r;
04488         a[j1 + 3] = y0i - y2i;
04489         x0r = x1r - x3i;
04490         x0i = x1i + x3r;
04491         a[j2] = wk1r * x0r - wk1i * x0i;
04492         a[j2 + 1] = wk1r * x0i + wk1i * x0r;
04493         x0r = y1r - y3i;
04494         x0i = y1i + y3r;
04495         a[j2 + 2] = wd1r * x0r - wd1i * x0i;
04496         a[j2 + 3] = wd1r * x0i + wd1i * x0r;
04497         x0r = x1r + x3i;
04498         x0i = x1i - x3r;
04499         a[j3] = wk3r * x0r + wk3i * x0i;
04500         a[j3 + 1] = wk3r * x0i - wk3i * x0r;
04501         x0r = y1r + y3i;
04502         x0i = y1i - y3r;
04503         a[j3 + 2] = wd3r * x0r + wd3i * x0i;
04504         a[j3 + 3] = wd3r * x0i - wd3i * x0r;
04505         j0 = m - j;
04506         j1 = j0 + m;
04507         j2 = j1 + m;
04508         j3 = j2 + m;
04509         x0r = a[j0] + a[j2];
04510         x0i = a[j0 + 1] + a[j2 + 1];
04511         x1r = a[j0] - a[j2];
04512         x1i = a[j0 + 1] - a[j2 + 1];
04513         y0r = a[j0 - 2] + a[j2 - 2];
04514         y0i = a[j0 - 1] + a[j2 - 1];
04515         y1r = a[j0 - 2] - a[j2 - 2];
04516         y1i = a[j0 - 1] - a[j2 - 1];
04517         x2r = a[j1] + a[j3];
04518         x2i = a[j1 + 1] + a[j3 + 1];
04519         x3r = a[j1] - a[j3];
04520         x3i = a[j1 + 1] - a[j3 + 1];
04521         y2r = a[j1 - 2] + a[j3 - 2];
04522         y2i = a[j1 - 1] + a[j3 - 1];
04523         y3r = a[j1 - 2] - a[j3 - 2];
04524         y3i = a[j1 - 1] - a[j3 - 1];
04525         a[j0] = x0r + x2r;
04526         a[j0 + 1] = x0i + x2i;
04527         a[j0 - 2] = y0r + y2r;
04528         a[j0 - 1] = y0i + y2i;
04529         a[j1] = x0r - x2r;
04530         a[j1 + 1] = x0i - x2i;
04531         a[j1 - 2] = y0r - y2r;
04532         a[j1 - 1] = y0i - y2i;
04533         x0r = x1r - x3i;
04534         x0i = x1i + x3r;
04535         a[j2] = wk1i * x0r - wk1r * x0i;
04536         a[j2 + 1] = wk1i * x0i + wk1r * x0r;
04537         x0r = y1r - y3i;
04538         x0i = y1i + y3r;
04539         a[j2 - 2] = wd1i * x0r - wd1r * x0i;
04540         a[j2 - 1] = wd1i * x0i + wd1r * x0r;
04541         x0r = x1r + x3i;
04542         x0i = x1i - x3r;
04543         a[j3] = wk3i * x0r + wk3r * x0i;
04544         a[j3 + 1] = wk3i * x0i - wk3r * x0r;
04545         x0r = y1r + y3i;
04546         x0i = y1i - y3r;
04547         a[j3 - 2] = wd3i * x0r + wd3r * x0i;
04548         a[j3 - 1] = wd3i * x0i - wd3r * x0r;
04549     }
04550     wk1r = csc1 * (wd1r + wn4r);
04551     wk1i = csc1 * (wd1i + wn4r);
04552     wk3r = csc3 * (wd3r - wn4r);
04553     wk3i = csc3 * (wd3i - wn4r);
04554     j0 = mh;
04555     j1 = j0 + m;
04556     j2 = j1 + m;
04557     j3 = j2 + m;
04558     x0r = a[j0 - 2] + a[j2 - 2];
04559     x0i = a[j0 - 1] + a[j2 - 1];
04560     x1r = a[j0 - 2] - a[j2 - 2];
04561     x1i = a[j0 - 1] - a[j2 - 1];
04562     x2r = a[j1 - 2] + a[j3 - 2];
04563     x2i = a[j1 - 1] + a[j3 - 1];
04564     x3r = a[j1 - 2] - a[j3 - 2];
04565     x3i = a[j1 - 1] - a[j3 - 1];
04566     a[j0 - 2] = x0r + x2r;
04567     a[j0 - 1] = x0i + x2i;
04568     a[j1 - 2] = x0r - x2r;
04569     a[j1 - 1] = x0i - x2i;
04570     x0r = x1r - x3i;
04571     x0i = x1i + x3r;
04572     a[j2 - 2] = wk1r * x0r - wk1i * x0i;
04573     a[j2 - 1] = wk1r * x0i + wk1i * x0r;
04574     x0r = x1r + x3i;
04575     x0i = x1i - x3r;
04576     a[j3 - 2] = wk3r * x0r + wk3i * x0i;
04577     a[j3 - 1] = wk3r * x0i - wk3i * x0r;
04578     x0r = a[j0] + a[j2];
04579     x0i = a[j0 + 1] + a[j2 + 1];
04580     x1r = a[j0] - a[j2];
04581     x1i = a[j0 + 1] - a[j2 + 1];
04582     x2r = a[j1] + a[j3];
04583     x2i = a[j1 + 1] + a[j3 + 1];
04584     x3r = a[j1] - a[j3];
04585     x3i = a[j1 + 1] - a[j3 + 1];
04586     a[j0] = x0r + x2r;
04587     a[j0 + 1] = x0i + x2i;
04588     a[j1] = x0r - x2r;
04589     a[j1 + 1] = x0i - x2i;
04590     x0r = x1r - x3i;
04591     x0i = x1i + x3r;
04592     a[j2] = wn4r * (x0r - x0i);
04593     a[j2 + 1] = wn4r * (x0i + x0r);
04594     x0r = x1r + x3i;
04595     x0i = x1i - x3r;
04596     a[j3] = -wn4r * (x0r + x0i);
04597     a[j3 + 1] = -wn4r * (x0i - x0r);
04598     x0r = a[j0 + 2] + a[j2 + 2];
04599     x0i = a[j0 + 3] + a[j2 + 3];
04600     x1r = a[j0 + 2] - a[j2 + 2];
04601     x1i = a[j0 + 3] - a[j2 + 3];
04602     x2r = a[j1 + 2] + a[j3 + 2];
04603     x2i = a[j1 + 3] + a[j3 + 3];
04604     x3r = a[j1 + 2] - a[j3 + 2];
04605     x3i = a[j1 + 3] - a[j3 + 3];
04606     a[j0 + 2] = x0r + x2r;
04607     a[j0 + 3] = x0i + x2i;
04608     a[j1 + 2] = x0r - x2r;
04609     a[j1 + 3] = x0i - x2i;
04610     x0r = x1r - x3i;
04611     x0i = x1i + x3r;
04612     a[j2 + 2] = wk1i * x0r - wk1r * x0i;
04613     a[j2 + 3] = wk1i * x0i + wk1r * x0r;
04614     x0r = x1r + x3i;
04615     x0i = x1i - x3r;
04616     a[j3 + 2] = wk3i * x0r + wk3r * x0i;
04617     a[j3 + 3] = wk3i * x0i - wk3r * x0r;
04618 }
04619 
04620 
04621 TS_INLINE void clTransformS::cftb1st(long n, double *a, double *w)
04622 {
04623     long j, j0, j1, j2, j3, k, m, mh;
04624     double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, 
04625         wd1r, wd1i, wd3r, wd3i;
04626     double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
04627         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i;
04628     
04629     mh = n >> 3;
04630     m = 2 * mh;
04631     j1 = m;
04632     j2 = j1 + m;
04633     j3 = j2 + m;
04634     x0r = a[0] + a[j2];
04635     x0i = -a[1] - a[j2 + 1];
04636     x1r = a[0] - a[j2];
04637     x1i = -a[1] + a[j2 + 1];
04638     x2r = a[j1] + a[j3];
04639     x2i = a[j1 + 1] + a[j3 + 1];
04640     x3r = a[j1] - a[j3];
04641     x3i = a[j1 + 1] - a[j3 + 1];
04642     a[0] = x0r + x2r;
04643     a[1] = x0i - x2i;
04644     a[j1] = x0r - x2r;
04645     a[j1 + 1] = x0i + x2i;
04646     a[j2] = x1r + x3i;
04647     a[j2 + 1] = x1i + x3r;
04648     a[j3] = x1r - x3i;
04649     a[j3 + 1] = x1i - x3r;
04650     wn4r = w[1];
04651     csc1 = w[2];
04652     csc3 = w[3];
04653     wd1r = 1;
04654     wd1i = 0;
04655     wd3r = 1;
04656     wd3i = 0;
04657     k = 0;
04658     for (j = 2; j < mh - 2; j += 4) {
04659         k += 4;
04660         wk1r = csc1 * (wd1r + w[k]);
04661         wk1i = csc1 * (wd1i + w[k + 1]);
04662         wk3r = csc3 * (wd3r + w[k + 2]);
04663         wk3i = csc3 * (wd3i + w[k + 3]);
04664         wd1r = w[k];
04665         wd1i = w[k + 1];
04666         wd3r = w[k + 2];
04667         wd3i = w[k + 3];
04668         j1 = j + m;
04669         j2 = j1 + m;
04670         j3 = j2 + m;
04671         x0r = a[j] + a[j2];
04672         x0i = -a[j + 1] - a[j2 + 1];
04673         x1r = a[j] - a[j2];
04674         x1i = -a[j + 1] + a[j2 + 1];
04675         y0r = a[j + 2] + a[j2 + 2];
04676         y0i = -a[j + 3] - a[j2 + 3];
04677         y1r = a[j + 2] - a[j2 + 2];
04678         y1i = -a[j + 3] + a[j2 + 3];
04679         x2r = a[j1] + a[j3];
04680         x2i = a[j1 + 1] + a[j3 + 1];
04681         x3r = a[j1] - a[j3];
04682         x3i = a[j1 + 1] - a[j3 + 1];
04683         y2r = a[j1 + 2] + a[j3 + 2];
04684         y2i = a[j1 + 3] + a[j3 + 3];
04685         y3r = a[j1 + 2] - a[j3 + 2];
04686         y3i = a[j1 + 3] - a[j3 + 3];
04687         a[j] = x0r + x2r;
04688         a[j + 1] = x0i - x2i;
04689         a[j + 2] = y0r + y2r;
04690         a[j + 3] = y0i - y2i;
04691         a[j1] = x0r - x2r;
04692         a[j1 + 1] = x0i + x2i;
04693         a[j1 + 2] = y0r - y2r;
04694         a[j1 + 3] = y0i + y2i;
04695         x0r = x1r + x3i;
04696         x0i = x1i + x3r;
04697         a[j2] = wk1r * x0r - wk1i * x0i;
04698         a[j2 + 1] = wk1r * x0i + wk1i * x0r;
04699         x0r = y1r + y3i;
04700         x0i = y1i + y3r;
04701         a[j2 + 2] = wd1r * x0r - wd1i * x0i;
04702         a[j2 + 3] = wd1r * x0i + wd1i * x0r;
04703         x0r = x1r - x3i;
04704         x0i = x1i - x3r;
04705         a[j3] = wk3r * x0r + wk3i * x0i;
04706         a[j3 + 1] = wk3r * x0i - wk3i * x0r;
04707         x0r = y1r - y3i;
04708         x0i = y1i - y3r;
04709         a[j3 + 2] = wd3r * x0r + wd3i * x0i;
04710         a[j3 + 3] = wd3r * x0i - wd3i * x0r;
04711         j0 = m - j;
04712         j1 = j0 + m;
04713         j2 = j1 + m;
04714         j3 = j2 + m;
04715         x0r = a[j0] + a[j2];
04716         x0i = -a[j0 + 1] - a[j2 + 1];
04717         x1r = a[j0] - a[j2];
04718         x1i = -a[j0 + 1] + a[j2 + 1];
04719         y0r = a[j0 - 2] + a[j2 - 2];
04720         y0i = -a[j0 - 1] - a[j2 - 1];
04721         y1r = a[j0 - 2] - a[j2 - 2];
04722         y1i = -a[j0 - 1] + a[j2 - 1];
04723         x2r = a[j1] + a[j3];
04724         x2i = a[j1 + 1] + a[j3 + 1];
04725         x3r = a[j1] - a[j3];
04726         x3i = a[j1 + 1] - a[j3 + 1];
04727         y2r = a[j1 - 2] + a[j3 - 2];
04728         y2i = a[j1 - 1] + a[j3 - 1];
04729         y3r = a[j1 - 2] - a[j3 - 2];
04730         y3i = a[j1 - 1] - a[j3 - 1];
04731         a[j0] = x0r + x2r;
04732         a[j0 + 1] = x0i - x2i;
04733         a[j0 - 2] = y0r + y2r;
04734         a[j0 - 1] = y0i - y2i;
04735         a[j1] = x0r - x2r;
04736         a[j1 + 1] = x0i + x2i;
04737         a[j1 - 2] = y0r - y2r;
04738         a[j1 - 1] = y0i + y2i;
04739         x0r = x1r + x3i;
04740         x0i = x1i + x3r;
04741         a[j2] = wk1i * x0r - wk1r * x0i;
04742         a[j2 + 1] = wk1i * x0i + wk1r * x0r;
04743         x0r = y1r + y3i;
04744         x0i = y1i + y3r;
04745         a[j2 - 2] = wd1i * x0r - wd1r * x0i;
04746         a[j2 - 1] = wd1i * x0i + wd1r * x0r;
04747         x0r = x1r - x3i;
04748         x0i = x1i - x3r;
04749         a[j3] = wk3i * x0r + wk3r * x0i;
04750         a[j3 + 1] = wk3i * x0i - wk3r * x0r;
04751         x0r = y1r - y3i;
04752         x0i = y1i - y3r;
04753         a[j3 - 2] = wd3i * x0r + wd3r * x0i;
04754         a[j3 - 1] = wd3i * x0i - wd3r * x0r;
04755     }
04756     wk1r = csc1 * (wd1r + wn4r);
04757     wk1i = csc1 * (wd1i + wn4r);
04758     wk3r = csc3 * (wd3r - wn4r);
04759     wk3i = csc3 * (wd3i - wn4r);
04760     j0 = mh;
04761     j1 = j0 + m;
04762     j2 = j1 + m;
04763     j3 = j2 + m;
04764     x0r = a[j0 - 2] + a[j2 - 2];
04765     x0i = -a[j0 - 1] - a[j2 - 1];
04766     x1r = a[j0 - 2] - a[j2 - 2];
04767     x1i = -a[j0 - 1] + a[j2 - 1];
04768     x2r = a[j1 - 2] + a[j3 - 2];
04769     x2i = a[j1 - 1] + a[j3 - 1];
04770     x3r = a[j1 - 2] - a[j3 - 2];
04771     x3i = a[j1 - 1] - a[j3 - 1];
04772     a[j0 - 2] = x0r + x2r;
04773     a[j0 - 1] = x0i - x2i;
04774     a[j1 - 2] = x0r - x2r;
04775     a[j1 - 1] = x0i + x2i;
04776     x0r = x1r + x3i;
04777     x0i = x1i + x3r;
04778     a[j2 - 2] = wk1r * x0r - wk1i * x0i;
04779     a[j2 - 1] = wk1r * x0i + wk1i * x0r;
04780     x0r = x1r - x3i;
04781     x0i = x1i - x3r;
04782     a[j3 - 2] = wk3r * x0r + wk3i * x0i;
04783     a[j3 - 1] = wk3r * x0i - wk3i * x0r;
04784     x0r = a[j0] + a[j2];
04785     x0i = -a[j0 + 1] - a[j2 + 1];
04786     x1r = a[j0] - a[j2];
04787     x1i = -a[j0 + 1] + a[j2 + 1];
04788     x2r = a[j1] + a[j3];
04789     x2i = a[j1 + 1] + a[j3 + 1];
04790     x3r = a[j1] - a[j3];
04791     x3i = a[j1 + 1] - a[j3 + 1];
04792     a[j0] = x0r + x2r;
04793     a[j0 + 1] = x0i - x2i;
04794     a[j1] = x0r - x2r;
04795     a[j1 + 1] = x0i + x2i;
04796     x0r = x1r + x3i;
04797     x0i = x1i + x3r;
04798     a[j2] = wn4r * (x0r - x0i);
04799     a[j2 + 1] = wn4r * (x0i + x0r);
04800     x0r = x1r - x3i;
04801     x0i = x1i - x3r;
04802     a[j3] = -wn4r * (x0r + x0i);
04803     a[j3 + 1] = -wn4r * (x0i - x0r);
04804     x0r = a[j0 + 2] + a[j2 + 2];
04805     x0i = -a[j0 + 3] - a[j2 + 3];
04806     x1r = a[j0 + 2] - a[j2 + 2];
04807     x1i = -a[j0 + 3] + a[j2 + 3];
04808     x2r = a[j1 + 2] + a[j3 + 2];
04809     x2i = a[j1 + 3] + a[j3 + 3];
04810     x3r = a[j1 + 2] - a[j3 + 2];
04811     x3i = a[j1 + 3] - a[j3 + 3];
04812     a[j0 + 2] = x0r + x2r;
04813     a[j0 + 3] = x0i - x2i;
04814     a[j1 + 2] = x0r - x2r;
04815     a[j1 + 3] = x0i + x2i;
04816     x0r = x1r + x3i;
04817     x0i = x1i + x3r;
04818     a[j2 + 2] = wk1i * x0r - wk1r * x0i;
04819     a[j2 + 3] = wk1i * x0i + wk1r * x0r;
04820     x0r = x1r - x3i;
04821     x0i = x1i - x3r;
04822     a[j3 + 2] = wk3i * x0r + wk3r * x0i;
04823     a[j3 + 3] = wk3i * x0i - wk3r * x0r;
04824 }
04825 
04826 
04827 TS_INLINE void clTransformS::cftrec4(long n, double *a, long nw, double *w)
04828 {
04829     long isplt, j, k, m;
04830     
04831     m = n;
04832     while (m > 512) {
04833         m >>= 2;
04834         cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]);
04835     }
04836     cftleaf(m, 1, &a[n - m], nw, w);
04837     k = 0;
04838     for (j = n - m; j > 0; j -= m) {
04839         k++;
04840         isplt = cfttree(m, j, k, a, nw, w);
04841         cftleaf(m, isplt, &a[j - m], nw, w);
04842     }
04843 }
04844 
04845 
04846 TS_INLINE long clTransformS::cfttree(long n, long j, long k, double *a, 
04847     long nw, double *w)
04848 {
04849     long i, isplt, m;
04850     
04851     if ((k & 3) != 0) {
04852         isplt = k & 1;
04853         if (isplt != 0) {
04854             cftmdl1(n, &a[j - n], &w[nw - (n >> 1)]);
04855         } else {
04856             cftmdl2(n, &a[j - n], &w[nw - n]);
04857         }
04858     } else {
04859         m = n;
04860         for (i = k; (i & 3) == 0; i >>= 2) {
04861             m <<= 2;
04862         }
04863         isplt = i & 1;
04864         if (isplt != 0) {
04865             while (m > 128) {
04866                 cftmdl1(m, &a[j - m], &w[nw - (m >> 1)]);
04867                 m >>= 2;
04868             }
04869         } else {
04870             while (m > 128) {
04871                 cftmdl2(m, &a[j - m], &w[nw - m]);
04872                 m >>= 2;
04873             }
04874         }
04875     }
04876     return isplt;
04877 }
04878 
04879 
04880 TS_INLINE void clTransformS::cftleaf(long n, long isplt, double *a, long nw, 
04881     double *w)
04882 {
04883     if (n == 512) {
04884         cftmdl1(128, a, &w[nw - 64]);
04885         cftf161(a, &w[nw - 8]);
04886         cftf162(&a[32], &w[nw - 32]);
04887         cftf161(&a[64], &w[nw - 8]);
04888         cftf161(&a[96], &w[nw - 8]);
04889         cftmdl2(128, &a[128], &w[nw - 128]);
04890         cftf161(&a[128], &w[nw - 8]);
04891         cftf162(&a[160], &w[nw - 32]);
04892         cftf161(&a[192], &w[nw - 8]);
04893         cftf162(&a[224], &w[nw - 32]);
04894         cftmdl1(128, &a[256], &w[nw - 64]);
04895         cftf161(&a[256], &w[nw - 8]);
04896         cftf162(&a[288], &w[nw - 32]);
04897         cftf161(&a[320], &w[nw - 8]);
04898         cftf161(&a[352], &w[nw - 8]);
04899         if (isplt != 0) {
04900             cftmdl1(128, &a[384], &w[nw - 64]);
04901             cftf161(&a[480], &w[nw - 8]);
04902         } else {
04903             cftmdl2(128, &a[384], &w[nw - 128]);
04904             cftf162(&a[480], &w[nw - 32]);
04905         }
04906         cftf161(&a[384], &w[nw - 8]);
04907         cftf162(&a[416], &w[nw - 32]);
04908         cftf161(&a[448], &w[nw - 8]);
04909     } else {
04910         cftmdl1(64, a, &w[nw - 32]);
04911         cftf081(a, &w[nw - 8]);
04912         cftf082(&a[16], &w[nw - 8]);
04913         cftf081(&a[32], &w[nw - 8]);
04914         cftf081(&a[48], &w[nw - 8]);
04915         cftmdl2(64, &a[64], &w[nw - 64]);
04916         cftf081(&a[64], &w[nw - 8]);
04917         cftf082(&a[80], &w[nw - 8]);
04918         cftf081(&a[96], &w[nw - 8]);
04919         cftf082(&a[112], &w[nw - 8]);
04920         cftmdl1(64, &a[128], &w[nw - 32]);
04921         cftf081(&a[128], &w[nw - 8]);
04922         cftf082(&a[144], &w[nw - 8]);
04923         cftf081(&a[160], &w[nw - 8]);
04924         cftf081(&a[176], &w[nw - 8]);
04925         if (isplt != 0) {
04926             cftmdl1(64, &a[192], &w[nw - 32]);
04927             cftf081(&a[240], &w[nw - 8]);
04928         } else {
04929             cftmdl2(64, &a[192], &w[nw - 64]);
04930             cftf082(&a[240], &w[nw - 8]);
04931         }
04932         cftf081(&a[192], &w[nw - 8]);
04933         cftf082(&a[208], &w[nw - 8]);
04934         cftf081(&a[224], &w[nw - 8]);
04935     }
04936 }
04937 
04938 
04939 TS_INLINE void clTransformS::cftmdl1(long n, double *a, double *w)
04940 {
04941     long j, j0, j1, j2, j3, k, m, mh;
04942     double wn4r, wk1r, wk1i, wk3r, wk3i;
04943     double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
04944     
04945     mh = n >> 3;
04946     m = 2 * mh;
04947     j1 = m;
04948     j2 = j1 + m;
04949     j3 = j2 + m;
04950     x0r = a[0] + a[j2];
04951     x0i = a[1] + a[j2 + 1];
04952     x1r = a[0] - a[j2];
04953     x1i = a[1] - a[j2 + 1];
04954     x2r = a[j1] + a[j3];
04955     x2i = a[j1 + 1] + a[j3 + 1];
04956     x3r = a[j1] - a[j3];
04957     x3i = a[j1 + 1] - a[j3 + 1];
04958     a[0] = x0r + x2r;
04959     a[1] = x0i + x2i;
04960     a[j1] = x0r - x2r;
04961     a[j1 + 1] = x0i - x2i;
04962     a[j2] = x1r - x3i;
04963     a[j2 + 1] = x1i + x3r;
04964     a[j3] = x1r + x3i;
04965     a[j3 + 1] = x1i - x3r;
04966     wn4r = w[1];
04967     k = 0;
04968     for (j = 2; j < mh; j += 2) {
04969         k += 4;
04970         wk1r = w[k];
04971         wk1i = w[k + 1];
04972         wk3r = w[k + 2];
04973         wk3i = w[k + 3];
04974         j1 = j + m;
04975         j2 = j1 + m;
04976         j3 = j2 + m;
04977         x0r = a[j] + a[j2];
04978         x0i = a[j + 1] + a[j2 + 1];
04979         x1r = a[j] - a[j2];
04980         x1i = a[j + 1] - a[j2 + 1];
04981         x2r = a[j1] + a[j3];
04982         x2i = a[j1 + 1] + a[j3 + 1];
04983         x3r = a[j1] - a[j3];
04984         x3i = a[j1 + 1] - a[j3 + 1];
04985         a[j] = x0r + x2r;
04986         a[j + 1] = x0i + x2i;
04987         a[j1] = x0r - x2r;
04988         a[j1 + 1] = x0i - x2i;
04989         x0r = x1r - x3i;
04990         x0i = x1i + x3r;
04991         a[j2] = wk1r * x0r - wk1i * x0i;
04992         a[j2 + 1] = wk1r * x0i + wk1i * x0r;
04993         x0r = x1r + x3i;
04994         x0i = x1i - x3r;
04995         a[j3] = wk3r * x0r + wk3i * x0i;
04996         a[j3 + 1] = wk3r * x0i - wk3i * x0r;
04997         j0 = m - j;
04998         j1 = j0 + m;
04999         j2 = j1 + m;
05000         j3 = j2 + m;
05001         x0r = a[j0] + a[j2];
05002         x0i = a[j0 + 1] + a[j2 + 1];
05003         x1r = a[j0] - a[j2];
05004         x1i = a[j0 + 1] - a[j2 + 1];
05005         x2r = a[j1] + a[j3];
05006         x2i = a[j1 + 1] + a[j3 + 1];
05007         x3r = a[j1] - a[j3];
05008         x3i = a[j1 + 1] - a[j3 + 1];
05009         a[j0] = x0r + x2r;
05010         a[j0 + 1] = x0i + x2i;
05011         a[j1] = x0r - x2r;
05012         a[j1 + 1] = x0i - x2i;
05013         x0r = x1r - x3i;
05014         x0i = x1i + x3r;
05015         a[j2] = wk1i * x0r - wk1r * x0i;
05016         a[j2 + 1] = wk1i * x0i + wk1r * x0r;
05017         x0r = x1r + x3i;
05018         x0i = x1i - x3r;
05019         a[j3] = wk3i * x0r + wk3r * x0i;
05020         a[j3 + 1] = wk3i * x0i - wk3r * x0r;
05021     }
05022     j0 = mh;
05023     j1 = j0 + m;
05024     j2 = j1 + m;
05025     j3 = j2 + m;
05026     x0r = a[j0] + a[j2];
05027     x0i = a[j0 + 1] + a[j2 + 1];
05028     x1r = a[j0] - a[j2];
05029     x1i = a[j0 + 1] - a[j2 + 1];
05030     x2r = a[j1] + a[j3];
05031     x2i = a[j1 + 1] + a[j3 + 1];
05032     x3r = a[j1] - a[j3];
05033     x3i = a[j1 + 1] - a[j3 + 1];
05034     a[j0] = x0r + x2r;
05035     a[j0 + 1] = x0i + x2i;
05036     a[j1] = x0r - x2r;
05037     a[j1 + 1] = x0i - x2i;
05038     x0r = x1r - x3i;
05039     x0i = x1i + x3r;
05040     a[j2] = wn4r * (x0r - x0i);
05041     a[j2 + 1] = wn4r * (x0i + x0r);
05042     x0r = x1r + x3i;
05043     x0i = x1i - x3r;
05044     a[j3] = -wn4r * (x0r + x0i);
05045     a[j3 + 1] = -wn4r * (x0i - x0r);
05046 }
05047 
05048 
05049 TS_INLINE void clTransformS::cftmdl2(long n, double *a, double *w)
05050 {
05051     long j, j0, j1, j2, j3, k, kr, m, mh;
05052     double wn4r, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i;
05053     double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y2r, y2i;
05054     
05055     mh = n >> 3;
05056     m = 2 * mh;
05057     wn4r = w[1];
05058     j1 = m;
05059     j2 = j1 + m;
05060     j3 = j2 + m;
05061     x0r = a[0] - a[j2 + 1];
05062     x0i = a[1] + a[j2];
05063     x1r = a[0] + a[j2 + 1];
05064     x1i = a[1] - a[j2];
05065     x2r = a[j1] - a[j3 + 1];
05066     x2i = a[j1 + 1] + a[j3];
05067     x3r = a[j1] + a[j3 + 1];
05068     x3i = a[j1 + 1] - a[j3];
05069     y0r = wn4r * (x2r - x2i);
05070     y0i = wn4r * (x2i + x2r);
05071     a[0] = x0r + y0r;
05072     a[1] = x0i + y0i;
05073     a[j1] = x0r - y0r;
05074     a[j1 + 1] = x0i - y0i;
05075     y0r = wn4r * (x3r - x3i);
05076     y0i = wn4r * (x3i + x3r);
05077     a[j2] = x1r - y0i;
05078     a[j2 + 1] = x1i + y0r;
05079     a[j3] = x1r + y0i;
05080     a[j3 + 1] = x1i - y0r;
05081     k = 0;
05082     kr = 2 * m;
05083     for (j = 2; j < mh; j += 2) {
05084         k += 4;
05085         wk1r = w[k];
05086         wk1i = w[k + 1];
05087         wk3r = w[k + 2];
05088         wk3i = w[k + 3];
05089         kr -= 4;
05090         wd1i = w[kr];
05091         wd1r = w[kr + 1];
05092         wd3i = w[kr + 2];
05093         wd3r = w[kr + 3];
05094         j1 = j + m;
05095         j2 = j1 + m;
05096         j3 = j2 + m;
05097         x0r = a[j] - a[j2 + 1];
05098         x0i = a[j + 1] + a[j2];
05099         x1r = a[j] + a[j2 + 1];
05100         x1i = a[j + 1] - a[j2];
05101         x2r = a[j1] - a[j3 + 1];
05102         x2i = a[j1 + 1] + a[j3];
05103         x3r = a[j1] + a[j3 + 1];
05104         x3i = a[j1 + 1] - a[j3];
05105         y0r = wk1r * x0r - wk1i * x0i;
05106         y0i = wk1r * x0i + wk1i * x0r;
05107         y2r = wd1r * x2r - wd1i * x2i;
05108         y2i = wd1r * x2i + wd1i * x2r;
05109         a[j] = y0r + y2r;
05110         a[j + 1] = y0i + y2i;
05111         a[j1] = y0r - y2r;
05112         a[j1 + 1] = y0i - y2i;
05113         y0r = wk3r * x1r + wk3i * x1i;
05114         y0i = wk3r * x1i - wk3i * x1r;
05115         y2r = wd3r * x3r + wd3i * x3i;
05116         y2i = wd3r * x3i - wd3i * x3r;
05117         a[j2] = y0r + y2r;
05118         a[j2 + 1] = y0i + y2i;
05119         a[j3] = y0r - y2r;
05120         a[j3 + 1] = y0i - y2i;
05121         j0 = m - j;
05122         j1 = j0 + m;
05123         j2 = j1 + m;
05124         j3 = j2 + m;
05125         x0r = a[j0] - a[j2 + 1];
05126         x0i = a[j0 + 1] + a[j2];
05127         x1r = a[j0] + a[j2 + 1];
05128         x1i = a[j0 + 1] - a[j2];
05129         x2r = a[j1] - a[j3 + 1];
05130         x2i = a[j1 + 1] + a[j3];
05131         x3r = a[j1] + a[j3 + 1];
05132         x3i = a[j1 + 1] - a[j3];
05133         y0r = wd1i * x0r - wd1r * x0i;
05134         y0i = wd1i * x0i + wd1r * x0r;
05135         y2r = wk1i * x2r - wk1r * x2i;
05136         y2i = wk1i * x2i + wk1r * x2r;
05137         a[j0] = y0r + y2r;
05138         a[j0 + 1] = y0i + y2i;
05139         a[j1] = y0r - y2r;
05140         a[j1 + 1] = y0i - y2i;
05141         y0r = wd3i * x1r + wd3r * x1i;
05142         y0i = wd3i * x1i - wd3r * x1r;
05143         y2r = wk3i * x3r + wk3r * x3i;
05144         y2i = wk3i * x3i - wk3r * x3r;
05145         a[j2] = y0r + y2r;
05146         a[j2 + 1] = y0i + y2i;
05147         a[j3] = y0r - y2r;
05148         a[j3 + 1] = y0i - y2i;
05149     }
05150     wk1r = w[m];
05151     wk1i = w[m + 1];
05152     j0 = mh;
05153     j1 = j0 + m;
05154     j2 = j1 + m;
05155     j3 = j2 + m;
05156     x0r = a[j0] - a[j2 + 1];
05157     x0i = a[j0 + 1] + a[j2];
05158     x1r = a[j0] + a[j2 + 1];
05159     x1i = a[j0 + 1] - a[j2];
05160     x2r = a[j1] - a[j3 + 1];
05161     x2i = a[j1 + 1] + a[j3];
05162     x3r = a[j1] + a[j3 + 1];
05163     x3i = a[j1 + 1] - a[j3];
05164     y0r = wk1r * x0r - wk1i * x0i;
05165     y0i = wk1r * x0i + wk1i * x0r;
05166     y2r = wk1i * x2r - wk1r * x2i;
05167     y2i = wk1i * x2i + wk1r * x2r;
05168     a[j0] = y0r + y2r;
05169     a[j0 + 1] = y0i + y2i;
05170     a[j1] = y0r - y2r;
05171     a[j1 + 1] = y0i - y2i;
05172     y0r = wk1i * x1r - wk1r * x1i;
05173     y0i = wk1i * x1i + wk1r * x1r;
05174     y2r = wk1r * x3r - wk1i * x3i;
05175     y2i = wk1r * x3i + wk1i * x3r;
05176     a[j2] = y0r - y2r;
05177     a[j2 + 1] = y0i - y2i;
05178     a[j3] = y0r + y2r;
05179     a[j3 + 1] = y0i + y2i;
05180 }
05181 
05182 
05183 TS_INLINE void clTransformS::cftfx41(long n, double *a, long nw, double *w)
05184 {
05185     if (n == 128) {
05186         cftf161(a, &w[nw - 8]);
05187         cftf162(&a[32], &w[nw - 32]);
05188         cftf161(&a[64], &w[nw - 8]);
05189         cftf161(&a[96], &w[nw - 8]);
05190     } else {
05191         cftf081(a, &w[nw - 8]);
05192         cftf082(&a[16], &w[nw - 8]);
05193         cftf081(&a[32], &w[nw - 8]);
05194         cftf081(&a[48], &w[nw - 8]);
05195     }
05196 }
05197 
05198 
05199 TS_INLINE void clTransformS::cftf161(double *a, double *w)
05200 {
05201     double wn4r, wk1r, wk1i, 
05202         x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
05203         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
05204         y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, 
05205         y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, 
05206         y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;
05207     
05208     wn4r = w[1];
05209     wk1r = w[2];
05210     wk1i = w[3];
05211     x0r = a[0] + a[16];
05212     x0i = a[1] + a[17];
05213     x1r = a[0] - a[16];
05214     x1i = a[1] - a[17];
05215     x2r = a[8] + a[24];
05216     x2i = a[9] + a[25];
05217     x3r = a[8] - a[24];
05218     x3i = a[9] - a[25];
05219     y0r = x0r + x2r;
05220     y0i = x0i + x2i;
05221     y4r = x0r - x2r;
05222     y4i = x0i - x2i;
05223     y8r = x1r - x3i;
05224     y8i = x1i + x3r;
05225     y12r = x1r + x3i;
05226     y12i = x1i - x3r;
05227     x0r = a[2] + a[18];
05228     x0i = a[3] + a[19];
05229     x1r = a[2] - a[18];
05230     x1i = a[3] - a[19];
05231     x2r = a[10] + a[26];
05232     x2i = a[11] + a[27];
05233     x3r = a[10] - a[26];
05234     x3i = a[11] - a[27];
05235     y1r = x0r + x2r;
05236     y1i = x0i + x2i;
05237     y5r = x0r - x2r;
05238     y5i = x0i - x2i;
05239     x0r = x1r - x3i;
05240     x0i = x1i + x3r;
05241     y9r = wk1r * x0r - wk1i * x0i;
05242     y9i = wk1r * x0i + wk1i * x0r;
05243     x0r = x1r + x3i;
05244     x0i = x1i - x3r;
05245     y13r = wk1i * x0r - wk1r * x0i;
05246     y13i = wk1i * x0i + wk1r * x0r;
05247     x0r = a[4] + a[20];
05248     x0i = a[5] + a[21];
05249     x1r = a[4] - a[20];
05250     x1i = a[5] - a[21];
05251     x2r = a[12] + a[28];
05252     x2i = a[13] + a[29];
05253     x3r = a[12] - a[28];
05254     x3i = a[13] - a[29];
05255     y2r = x0r + x2r;
05256     y2i = x0i + x2i;
05257     y6r = x0r - x2r;
05258     y6i = x0i - x2i;
05259     x0r = x1r - x3i;
05260     x0i = x1i + x3r;
05261     y10r = wn4r * (x0r - x0i);
05262     y10i = wn4r * (x0i + x0r);
05263     x0r = x1r + x3i;
05264     x0i = x1i - x3r;
05265     y14r = wn4r * (x0r + x0i);
05266     y14i = wn4r * (x0i - x0r);
05267     x0r = a[6] + a[22];
05268     x0i = a[7] + a[23];
05269     x1r = a[6] - a[22];
05270     x1i = a[7] - a[23];
05271     x2r = a[14] + a[30];
05272     x2i = a[15] + a[31];
05273     x3r = a[14] - a[30];
05274     x3i = a[15] - a[31];
05275     y3r = x0r + x2r;
05276     y3i = x0i + x2i;
05277     y7r = x0r - x2r;
05278     y7i = x0i - x2i;
05279     x0r = x1r - x3i;
05280     x0i = x1i + x3r;
05281     y11r = wk1i * x0r - wk1r * x0i;
05282     y11i = wk1i * x0i + wk1r * x0r;
05283     x0r = x1r + x3i;
05284     x0i = x1i - x3r;
05285     y15r = wk1r * x0r - wk1i * x0i;
05286     y15i = wk1r * x0i + wk1i * x0r;
05287     x0r = y12r - y14r;
05288     x0i = y12i - y14i;
05289     x1r = y12r + y14r;
05290     x1i = y12i + y14i;
05291     x2r = y13r - y15r;
05292     x2i = y13i - y15i;
05293     x3r = y13r + y15r;
05294     x3i = y13i + y15i;
05295     a[24] = x0r + x2r;
05296     a[25] = x0i + x2i;
05297     a[26] = x0r - x2r;
05298     a[27] = x0i - x2i;
05299     a[28] = x1r - x3i;
05300     a[29] = x1i + x3r;
05301     a[30] = x1r + x3i;
05302     a[31] = x1i - x3r;
05303     x0r = y8r + y10r;
05304     x0i = y8i + y10i;
05305     x1r = y8r - y10r;
05306     x1i = y8i - y10i;
05307     x2r = y9r + y11r;
05308     x2i = y9i + y11i;
05309     x3r = y9r - y11r;
05310     x3i = y9i - y11i;
05311     a[16] = x0r + x2r;
05312     a[17] = x0i + x2i;
05313     a[18] = x0r - x2r;
05314     a[19] = x0i - x2i;
05315     a[20] = x1r - x3i;
05316     a[21] = x1i + x3r;
05317     a[22] = x1r + x3i;
05318     a[23] = x1i - x3r;
05319     x0r = y5r - y7i;
05320     x0i = y5i + y7r;
05321     x2r = wn4r * (x0r - x0i);
05322     x2i = wn4r * (x0i + x0r);
05323     x0r = y5r + y7i;
05324     x0i = y5i - y7r;
05325     x3r = wn4r * (x0r - x0i);
05326     x3i = wn4r * (x0i + x0r);
05327     x0r = y4r - y6i;
05328     x0i = y4i + y6r;
05329     x1r = y4r + y6i;
05330     x1i = y4i - y6r;
05331     a[8] = x0r + x2r;
05332     a[9] = x0i + x2i;
05333     a[10] = x0r - x2r;
05334     a[11] = x0i - x2i;
05335     a[12] = x1r - x3i;
05336     a[13] = x1i + x3r;
05337     a[14] = x1r + x3i;
05338     a[15] = x1i - x3r;
05339     x0r = y0r + y2r;
05340     x0i = y0i + y2i;
05341     x1r = y0r - y2r;
05342     x1i = y0i - y2i;
05343     x2r = y1r + y3r;
05344     x2i = y1i + y3i;
05345     x3r = y1r - y3r;
05346     x3i = y1i - y3i;
05347     a[0] = x0r + x2r;
05348     a[1] = x0i + x2i;
05349     a[2] = x0r - x2r;
05350     a[3] = x0i - x2i;
05351     a[4] = x1r - x3i;
05352     a[5] = x1i + x3r;
05353     a[6] = x1r + x3i;
05354     a[7] = x1i - x3r;
05355 }
05356 
05357 
05358 TS_INLINE void clTransformS::cftf162(double *a, double *w)
05359 {
05360     double wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, 
05361         x0r, x0i, x1r, x1i, x2r, x2i, 
05362         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
05363         y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, 
05364         y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, 
05365         y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;
05366     
05367     wn4r = w[1];
05368     wk1r = w[4];
05369     wk1i = w[5];
05370     wk3r = w[6];
05371     wk3i = -w[7];
05372     wk2r = w[8];
05373     wk2i = w[9];
05374     x1r = a[0] - a[17];
05375     x1i = a[1] + a[16];
05376     x0r = a[8] - a[25];
05377     x0i = a[9] + a[24];
05378     x2r = wn4r * (x0r - x0i);
05379     x2i = wn4r * (x0i + x0r);
05380     y0r = x1r + x2r;
05381     y0i = x1i + x2i;
05382     y4r = x1r - x2r;
05383     y4i = x1i - x2i;
05384     x1r = a[0] + a[17];
05385     x1i = a[1] - a[16];
05386     x0r = a[8] + a[25];
05387     x0i = a[9] - a[24];
05388     x2r = wn4r * (x0r - x0i);
05389     x2i = wn4r * (x0i + x0r);
05390     y8r = x1r - x2i;
05391     y8i = x1i + x2r;
05392     y12r = x1r + x2i;
05393     y12i = x1i - x2r;
05394     x0r = a[2] - a[19];
05395     x0i = a[3] + a[18];
05396     x1r = wk1r * x0r - wk1i * x0i;
05397     x1i = wk1r * x0i + wk1i * x0r;
05398     x0r = a[10] - a[27];
05399     x0i = a[11] + a[26];
05400     x2r = wk3i * x0r - wk3r * x0i;
05401     x2i = wk3i * x0i + wk3r * x0r;
05402     y1r = x1r + x2r;
05403     y1i = x1i + x2i;
05404     y5r = x1r - x2r;
05405     y5i = x1i - x2i;
05406     x0r = a[2] + a[19];
05407     x0i = a[3] - a[18];
05408     x1r = wk3r * x0r - wk3i * x0i;
05409     x1i = wk3r * x0i + wk3i * x0r;
05410     x0r = a[10] + a[27];
05411     x0i = a[11] - a[26];
05412     x2r = wk1r * x0r + wk1i * x0i;
05413     x2i = wk1r * x0i - wk1i * x0r;
05414     y9r = x1r - x2r;
05415     y9i = x1i - x2i;
05416     y13r = x1r + x2r;
05417     y13i = x1i + x2i;
05418     x0r = a[4] - a[21];
05419     x0i = a[5] + a[20];
05420     x1r = wk2r * x0r - wk2i * x0i;
05421     x1i = wk2r * x0i + wk2i * x0r;
05422     x0r = a[12] - a[29];
05423     x0i = a[13] + a[28];
05424     x2r = wk2i * x0r - wk2r * x0i;
05425     x2i = wk2i * x0i + wk2r * x0r;
05426     y2r = x1r + x2r;
05427     y2i = x1i + x2i;
05428     y6r = x1r - x2r;
05429     y6i = x1i - x2i;
05430     x0r = a[4] + a[21];
05431     x0i = a[5] - a[20];
05432     x1r = wk2i * x0r - wk2r * x0i;
05433     x1i = wk2i * x0i + wk2r * x0r;
05434     x0r = a[12] + a[29];
05435     x0i = a[13] - a[28];
05436     x2r = wk2r * x0r - wk2i * x0i;
05437     x2i = wk2r * x0i + wk2i * x0r;
05438     y10r = x1r - x2r;
05439     y10i = x1i - x2i;
05440     y14r = x1r + x2r;
05441     y14i = x1i + x2i;
05442     x0r = a[6] - a[23];
05443     x0i = a[7] + a[22];
05444     x1r = wk3r * x0r - wk3i * x0i;
05445     x1i = wk3r * x0i + wk3i * x0r;
05446     x0r = a[14] - a[31];
05447     x0i = a[15] + a[30];
05448     x2r = wk1i * x0r - wk1r * x0i;
05449     x2i = wk1i * x0i + wk1r * x0r;
05450     y3r = x1r + x2r;
05451     y3i = x1i + x2i;
05452     y7r = x1r - x2r;
05453     y7i = x1i - x2i;
05454     x0r = a[6] + a[23];
05455     x0i = a[7] - a[22];
05456     x1r = wk1i * x0r + wk1r * x0i;
05457     x1i = wk1i * x0i - wk1r * x0r;
05458     x0r = a[14] + a[31];
05459     x0i = a[15] - a[30];
05460     x2r = wk3i * x0r - wk3r * x0i;
05461     x2i = wk3i * x0i + wk3r * x0r;
05462     y11r = x1r + x2r;
05463     y11i = x1i + x2i;
05464     y15r = x1r - x2r;
05465     y15i = x1i - x2i;
05466     x1r = y0r + y2r;
05467     x1i = y0i + y2i;
05468     x2r = y1r + y3r;
05469     x2i = y1i + y3i;
05470     a[0] = x1r + x2r;
05471     a[1] = x1i + x2i;
05472     a[2] = x1r - x2r;
05473     a[3] = x1i - x2i;
05474     x1r = y0r - y2r;
05475     x1i = y0i - y2i;
05476     x2r = y1r - y3r;
05477     x2i = y1i - y3i;
05478     a[4] = x1r - x2i;
05479     a[5] = x1i + x2r;
05480     a[6] = x1r + x2i;
05481     a[7] = x1i - x2r;
05482     x1r = y4r - y6i;
05483     x1i = y4i + y6r;
05484     x0r = y5r - y7i;
05485     x0i = y5i + y7r;
05486     x2r = wn4r * (x0r - x0i);
05487     x2i = wn4r * (x0i + x0r);
05488     a[8] = x1r + x2r;
05489     a[9] = x1i + x2i;
05490     a[10] = x1r - x2r;
05491     a[11] = x1i - x2i;
05492     x1r = y4r + y6i;
05493     x1i = y4i - y6r;
05494     x0r = y5r + y7i;
05495     x0i = y5i - y7r;
05496     x2r = wn4r * (x0r - x0i);
05497     x2i = wn4r * (x0i + x0r);
05498     a[12] = x1r - x2i;
05499     a[13] = x1i + x2r;
05500     a[14] = x1r + x2i;
05501     a[15] = x1i - x2r;
05502     x1r = y8r + y10r;
05503     x1i = y8i + y10i;
05504     x2r = y9r - y11r;
05505     x2i = y9i - y11i;
05506     a[16] = x1r + x2r;
05507     a[17] = x1i + x2i;
05508     a[18] = x1r - x2r;
05509     a[19] = x1i - x2i;
05510     x1r = y8r - y10r;
05511     x1i = y8i - y10i;
05512     x2r = y9r + y11r;
05513     x2i = y9i + y11i;
05514     a[20] = x1r - x2i;
05515     a[21] = x1i + x2r;
05516     a[22] = x1r + x2i;
05517     a[23] = x1i - x2r;
05518     x1r = y12r - y14i;
05519     x1i = y12i + y14r;
05520     x0r = y13r + y15i;
05521     x0i = y13i - y15r;
05522     x2r = wn4r * (x0r - x0i);
05523     x2i = wn4r * (x0i + x0r);
05524     a[24] = x1r + x2r;
05525     a[25] = x1i + x2i;
05526     a[26] = x1r - x2r;
05527     a[27] = x1i - x2i;
05528     x1r = y12r + y14i;
05529     x1i = y12i - y14r;
05530     x0r = y13r - y15i;
05531     x0i = y13i + y15r;
05532     x2r = wn4r * (x0r - x0i);
05533     x2i = wn4r * (x0i + x0r);
05534     a[28] = x1r - x2i;
05535     a[29] = x1i + x2r;
05536     a[30] = x1r + x2i;
05537     a[31] = x1i - x2r;
05538 }
05539 
05540 
05541 TS_INLINE void clTransformS::cftf081(double *a, double *w)
05542 {
05543     double wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, 
05544         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
05545         y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;
05546     
05547     wn4r = w[1];
05548     x0r = a[0] + a[8];
05549     x0i = a[1] + a[9];
05550     x1r = a[0] - a[8];
05551     x1i = a[1] - a[9];
05552     x2r = a[4] + a[12];
05553     x2i = a[5] + a[13];
05554     x3r = a[4] - a[12];
05555     x3i = a[5] - a[13];
05556     y0r = x0r + x2r;
05557     y0i = x0i + x2i;
05558     y2r = x0r - x2r;
05559     y2i = x0i - x2i;
05560     y1r = x1r - x3i;
05561     y1i = x1i + x3r;
05562     y3r = x1r + x3i;
05563     y3i = x1i - x3r;
05564     x0r = a[2] + a[10];
05565     x0i = a[3] + a[11];
05566     x1r = a[2] - a[10];
05567     x1i = a[3] - a[11];
05568     x2r = a[6] + a[14];
05569     x2i = a[7] + a[15];
05570     x3r = a[6] - a[14];
05571     x3i = a[7] - a[15];
05572     y4r = x0r + x2r;
05573     y4i = x0i + x2i;
05574     y6r = x0r - x2r;
05575     y6i = x0i - x2i;
05576     x0r = x1r - x3i;
05577     x0i = x1i + x3r;
05578     x2r = x1r + x3i;
05579     x2i = x1i - x3r;
05580     y5r = wn4r * (x0r - x0i);
05581     y5i = wn4r * (x0r + x0i);
05582     y7r = wn4r * (x2r - x2i);
05583     y7i = wn4r * (x2r + x2i);
05584     a[8] = y1r + y5r;
05585     a[9] = y1i + y5i;
05586     a[10] = y1r - y5r;
05587     a[11] = y1i - y5i;
05588     a[12] = y3r - y7i;
05589     a[13] = y3i + y7r;
05590     a[14] = y3r + y7i;
05591     a[15] = y3i - y7r;
05592     a[0] = y0r + y4r;
05593     a[1] = y0i + y4i;
05594     a[2] = y0r - y4r;
05595     a[3] = y0i - y4i;
05596     a[4] = y2r - y6i;
05597     a[5] = y2i + y6r;
05598     a[6] = y2r + y6i;
05599     a[7] = y2i - y6r;
05600 }
05601 
05602 
05603 TS_INLINE void clTransformS::cftf082(double *a, double *w)
05604 {
05605     double wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i, 
05606         y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, 
05607         y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;
05608     
05609     wn4r = w[1];
05610     wk1r = w[2];
05611     wk1i = w[3];
05612     y0r = a[0] - a[9];
05613     y0i = a[1] + a[8];
05614     y1r = a[0] + a[9];
05615     y1i = a[1] - a[8];
05616     x0r = a[4] - a[13];
05617     x0i = a[5] + a[12];
05618     y2r = wn4r * (x0r - x0i);
05619     y2i = wn4r * (x0i + x0r);
05620     x0r = a[4] + a[13];
05621     x0i = a[5] - a[12];
05622     y3r = wn4r * (x0r - x0i);
05623     y3i = wn4r * (x0i + x0r);
05624     x0r = a[2] - a[11];
05625     x0i = a[3] + a[10];
05626     y4r = wk1r * x0r - wk1i * x0i;
05627     y4i = wk1r * x0i + wk1i * x0r;
05628     x0r = a[2] + a[11];
05629     x0i = a[3] - a[10];
05630     y5r = wk1i * x0r - wk1r * x0i;
05631     y5i = wk1i * x0i + wk1r * x0r;
05632     x0r = a[6] - a[15];
05633     x0i = a[7] + a[14];
05634     y6r = wk1i * x0r - wk1r * x0i;
05635     y6i = wk1i * x0i + wk1r * x0r;
05636     x0r = a[6] + a[15];
05637     x0i = a[7] - a[14];
05638     y7r = wk1r * x0r - wk1i * x0i;
05639     y7i = wk1r * x0i + wk1i * x0r;
05640     x0r = y0r + y2r;
05641     x0i = y0i + y2i;
05642     x1r = y4r + y6r;
05643     x1i = y4i + y6i;
05644     a[0] = x0r + x1r;
05645     a[1] = x0i + x1i;
05646     a[2] = x0r - x1r;
05647     a[3] = x0i - x1i;
05648     x0r = y0r - y2r;
05649     x0i = y0i - y2i;
05650     x1r = y4r - y6r;
05651     x1i = y4i - y6i;
05652     a[4] = x0r - x1i;
05653     a[5] = x0i + x1r;
05654     a[6] = x0r + x1i;
05655     a[7] = x0i - x1r;
05656     x0r = y1r - y3i;
05657     x0i = y1i + y3r;
05658     x1r = y5r - y7r;
05659     x1i = y5i - y7i;
05660     a[8] = x0r + x1r;
05661     a[9] = x0i + x1i;
05662     a[10] = x0r - x1r;
05663     a[11] = x0i - x1i;
05664     x0r = y1r + y3i;
05665     x0i = y1i - y3r;
05666     x1r = y5r + y7r;
05667     x1i = y5i + y7i;
05668     a[12] = x0r - x1i;
05669     a[13] = x0i + x1r;
05670     a[14] = x0r + x1i;
05671     a[15] = x0i - x1r;
05672 }
05673 
05674 
05675 TS_INLINE void clTransformS::cftf040(double *a)
05676 {
05677     double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
05678     
05679     x0r = a[0] + a[4];
05680     x0i = a[1] + a[5];
05681     x1r = a[0] - a[4];
05682     x1i = a[1] - a[5];
05683     x2r = a[2] + a[6];
05684     x2i = a[3] + a[7];
05685     x3r = a[2] - a[6];
05686     x3i = a[3] - a[7];
05687     a[0] = x0r + x2r;
05688     a[1] = x0i + x2i;
05689     a[2] = x1r - x3i;
05690     a[3] = x1i + x3r;
05691     a[4] = x0r - x2r;
05692     a[5] = x0i - x2i;
05693     a[6] = x1r + x3i;
05694     a[7] = x1i - x3r;
05695 }
05696 
05697 
05698 TS_INLINE void clTransformS::cftb040(double *a)
05699 {
05700     double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
05701     
05702     x0r = a[0] + a[4];
05703     x0i = a[1] + a[5];
05704     x1r = a[0] - a[4];
05705     x1i = a[1] - a[5];
05706     x2r = a[2] + a[6];
05707     x2i = a[3] + a[7];
05708     x3r = a[2] - a[6];
05709     x3i = a[3] - a[7];
05710     a[0] = x0r + x2r;
05711     a[1] = x0i + x2i;
05712     a[2] = x1r + x3i;
05713     a[3] = x1i - x3r;
05714     a[4] = x0r - x2r;
05715     a[5] = x0i - x2i;
05716     a[6] = x1r - x3i;
05717     a[7] = x1i + x3r;
05718 }
05719 
05720 
05721 TS_INLINE void clTransformS::cftx020(double *a)
05722 {
05723     double x0r, x0i;
05724     
05725     x0r = a[0] - a[2];
05726     x0i = a[1] - a[3];
05727     a[0] += a[2];
05728     a[1] += a[3];
05729     a[2] = x0r;
05730     a[3] = x0i;
05731 }
05732 
05733 
05734 TS_INLINE void clTransformS::rftfsub(long n, double *a, long nc, double *c)
05735 {
05736     long j, k, kk, ks, m;
05737     double wkr, wki, xr, xi, yr, yi;
05738     
05739     m = n >> 1;
05740     ks = 2 * nc / m;
05741     kk = 0;
05742     for (j = 2; j < m; j += 2) {
05743         k = n - j;
05744         kk += ks;
05745         wkr = 0.5 - c[nc - kk];
05746         wki = c[kk];
05747         xr = a[j] - a[k];
05748         xi = a[j + 1] + a[k + 1];
05749         yr = wkr * xr - wki * xi;
05750         yi = wkr * xi + wki * xr;
05751         a[j] -= yr;
05752         a[j + 1] -= yi;
05753         a[k] += yr;
05754         a[k + 1] -= yi;
05755     }
05756 }
05757 
05758 
05759 TS_INLINE void clTransformS::rftbsub(long n, double *a, long nc, double *c)
05760 {
05761     long j, k, kk, ks, m;
05762     double wkr, wki, xr, xi, yr, yi;
05763     
05764     m = n >> 1;
05765     ks = 2 * nc / m;
05766     kk = 0;
05767     for (j = 2; j < m; j += 2) {
05768         k = n - j;
05769         kk += ks;
05770         wkr = 0.5 - c[nc - kk];
05771         wki = c[kk];
05772         xr = a[j] - a[k];
05773         xi = a[j + 1] + a[k + 1];
05774         yr = wkr * xr + wki * xi;
05775         yi = wkr * xi - wki * xr;
05776         a[j] -= yr;
05777         a[j + 1] -= yi;
05778         a[k] += yr;
05779         a[k + 1] -= yi;
05780     }
05781 }
05782 
05783 
05784 TS_INLINE void clTransformS::dctsub(long n, double *a, long nc, double *c)
05785 {
05786     long j, k, kk, ks, m;
05787     double wkr, wki, xr;
05788     
05789     m = n >> 1;
05790     ks = nc / n;
05791     kk = 0;
05792     for (j = 1; j < m; j++) {
05793         k = n - j;
05794         kk += ks;
05795         wkr = c[kk] - c[nc - kk];
05796         wki = c[kk] + c[nc - kk];
05797         xr = wki * a[j] - wkr * a[k];
05798         a[j] = wkr * a[j] + wki * a[k];
05799         a[k] = xr;
05800     }
05801     a[m] *= c[0];
05802 }
05803 
05804 
05805 TS_INLINE void clTransformS::dstsub(long n, double *a, long nc, double *c)
05806 {
05807     long j, k, kk, ks, m;
05808     double wkr, wki, xr;
05809     
05810     m = n >> 1;
05811     ks = nc / n;
05812     kk = 0;
05813     for (j = 1; j < m; j++) {
05814         k = n - j;
05815         kk += ks;
05816         wkr = c[kk] - c[nc - kk];
05817         wki = c[kk] + c[nc - kk];
05818         xr = wki * a[k] - wkr * a[j];
05819         a[k] = wkr * a[k] + wki * a[j];
05820         a[j] = xr;
05821     }
05822     a[m] *= c[0];
05823 }
05824 
05825 
05826 #ifdef USE_CDFT_THREADS
05827 
05828 
05829 void clTransformS::cftrec4_th(long n, double *a, long nw, double *w)
05830 {
05831     long i, idiv4, m, nthread;
05832     cdft_thread_t th[4];
05833     cdft_arg_t ag[4];
05834     
05835     nthread = 2;
05836     idiv4 = 0;
05837     m = n >> 1;
05838     if (n > CDFT_4THREADS_BEGIN_N) {
05839         nthread = 4;
05840         idiv4 = 1;
05841         m >>= 1;
05842     }
05843     for (i = 0; i < nthread; i++) {
05844         ag[i].n0 = n;
05845         ag[i].n = m;
05846         ag[i].a = &a[i * m];
05847         ag[i].nw = nw;
05848         ag[i].w = w;
05849         if (i != idiv4) {
05850             cdft_thread_create(&th[i], cftrec1_th_cb, &ag[i]);
05851         } else {
05852             cdft_thread_create(&th[i], cftrec2_th_cb, &ag[i]);
05853         }
05854     }
05855     for (i = 0; i < nthread; i++) {
05856         cdft_thread_wait(th[i]);
05857     }
05858 }
05859 
05860 
05861 void * clTransformS::cftrec1_th(void *p)
05862 {
05863     long isplt, j, k, m, n, n0, nw;
05864     double *a, *w;
05865     
05866     n0 = ((cdft_arg_t *) p)->n0;
05867     n = ((cdft_arg_t *) p)->n;
05868     a = (double *) ((cdft_arg_t *) p)->a;
05869     nw = ((cdft_arg_t *) p)->nw;
05870     w = (double *) ((cdft_arg_t *) p)->w;
05871     m = n0;
05872     while (m > 512) {
05873         m >>= 2;
05874         cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]);
05875     }
05876     cftleaf(m, 1, &a[n - m], nw, w);
05877     k = 0;
05878     for (j = n - m; j > 0; j -= m) {
05879         k++;
05880         isplt = cfttree(m, j, k, a, nw, w);
05881         cftleaf(m, isplt, &a[j - m], nw, w);
05882     }
05883     return (void *) 0;
05884 }
05885 
05886 
05887 void * clTransformS::cftrec2_th(void *p)
05888 {
05889     long isplt, j, k, m, n, n0, nw;
05890     double *a, *w;
05891     
05892     n0 = ((cdft_arg_t *) p)->n0;
05893     n = ((cdft_arg_t *) p)->n;
05894     a = (double *) ((cdft_arg_t *) p)->a;
05895     nw = ((cdft_arg_t *) p)->nw;
05896     w = (double *) ((cdft_arg_t *) p)->w;
05897     k = 1;
05898     m = n0;
05899     while (m > 512) {
05900         m >>= 2;
05901         k <<= 2;
05902         cftmdl2(m, &a[n - m], &w[nw - m]);
05903     }
05904     cftleaf(m, 0, &a[n - m], nw, w);
05905     k >>= 1;
05906     for (j = n - m; j > 0; j -= m) {
05907         k++;
05908         isplt = cfttree(m, j, k, a, nw, w);
05909         cftleaf(m, isplt, &a[j - m], nw, w);
05910     }
05911     return (void *) 0;
05912 }
05913 
05914 
05915 #endif /* USE_CDFT_THREADS */

Generated on Tue Mar 2 19:46:46 2004 for libDSP by doxygen 1.3.6