00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
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
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
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
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
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
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
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
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
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
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
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