annotate src/ooura/fftsg.c @ 285:89fe52066db1 tip master

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