1 /* 2 * http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html 3 * Copyright Takuya OOURA, 1996-2001 4 * 5 * You may use, copy, modify and distribute this code for any purpose (include 6 * commercial use) and without fee. Please refer to this package when you modify 7 * this code. 8 * 9 * Changes: 10 * Trivial type modifications by the WebRTC authors. 11 */ 12 13 /* 14 Fast Fourier/Cosine/Sine Transform 15 dimension :one 16 data length :power of 2 17 decimation :frequency 18 radix :4, 2 19 data :inplace 20 table :use 21 functions 22 cdft: Complex Discrete Fourier Transform 23 rdft: Real Discrete Fourier Transform 24 ddct: Discrete Cosine Transform 25 ddst: Discrete Sine Transform 26 dfct: Cosine Transform of RDFT (Real Symmetric DFT) 27 dfst: Sine Transform of RDFT (Real Anti-symmetric DFT) 28 function prototypes 29 void cdft(int, int, float *, int *, float *); 30 void rdft(size_t, int, float *, size_t *, float *); 31 void ddct(int, int, float *, int *, float *); 32 void ddst(int, int, float *, int *, float *); 33 void dfct(int, float *, float *, int *, float *); 34 void dfst(int, float *, float *, int *, float *); 35 36 37 -------- Complex DFT (Discrete Fourier Transform) -------- 38 [definition] 39 <case1> 40 X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k<n 41 <case2> 42 X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k<n 43 (notes: sum_j=0^n-1 is a summation from j=0 to n-1) 44 [usage] 45 <case1> 46 ip[0] = 0; // first time only 47 cdft(2*n, 1, a, ip, w); 48 <case2> 49 ip[0] = 0; // first time only 50 cdft(2*n, -1, a, ip, w); 51 [parameters] 52 2*n :data length (int) 53 n >= 1, n = power of 2 54 a[0...2*n-1] :input/output data (float *) 55 input data 56 a[2*j] = Re(x[j]), 57 a[2*j+1] = Im(x[j]), 0<=j<n 58 output data 59 a[2*k] = Re(X[k]), 60 a[2*k+1] = Im(X[k]), 0<=k<n 61 ip[0...*] :work area for bit reversal (int *) 62 length of ip >= 2+sqrt(n) 63 strictly, 64 length of ip >= 65 2+(1<<(int)(log(n+0.5)/log(2))/2). 66 ip[0],ip[1] are pointers of the cos/sin table. 67 w[0...n/2-1] :cos/sin table (float *) 68 w[],ip[] are initialized if ip[0] == 0. 69 [remark] 70 Inverse of 71 cdft(2*n, -1, a, ip, w); 72 is 73 cdft(2*n, 1, a, ip, w); 74 for (j = 0; j <= 2 * n - 1; j++) { 75 a[j] *= 1.0 / n; 76 } 77 . 78 79 80 -------- Real DFT / Inverse of Real DFT -------- 81 [definition] 82 <case1> RDFT 83 R[k] = sum_j=0^n-1 a[j]*cos(2*pi*j*k/n), 0<=k<=n/2 84 I[k] = sum_j=0^n-1 a[j]*sin(2*pi*j*k/n), 0<k<n/2 85 <case2> IRDFT (excluding scale) 86 a[k] = (R[0] + R[n/2]*cos(pi*k))/2 + 87 sum_j=1^n/2-1 R[j]*cos(2*pi*j*k/n) + 88 sum_j=1^n/2-1 I[j]*sin(2*pi*j*k/n), 0<=k<n 89 [usage] 90 <case1> 91 ip[0] = 0; // first time only 92 rdft(n, 1, a, ip, w); 93 <case2> 94 ip[0] = 0; // first time only 95 rdft(n, -1, a, ip, w); 96 [parameters] 97 n :data length (size_t) 98 n >= 2, n = power of 2 99 a[0...n-1] :input/output data (float *) 100 <case1> 101 output data 102 a[2*k] = R[k], 0<=k<n/2 103 a[2*k+1] = I[k], 0<k<n/2 104 a[1] = R[n/2] 105 <case2> 106 input data 107 a[2*j] = R[j], 0<=j<n/2 108 a[2*j+1] = I[j], 0<j<n/2 109 a[1] = R[n/2] 110 ip[0...*] :work area for bit reversal (size_t *) 111 length of ip >= 2+sqrt(n/2) 112 strictly, 113 length of ip >= 114 2+(1<<(int)(log(n/2+0.5)/log(2))/2). 115 ip[0],ip[1] are pointers of the cos/sin table. 116 w[0...n/2-1] :cos/sin table (float *) 117 w[],ip[] are initialized if ip[0] == 0. 118 [remark] 119 Inverse of 120 rdft(n, 1, a, ip, w); 121 is 122 rdft(n, -1, a, ip, w); 123 for (j = 0; j <= n - 1; j++) { 124 a[j] *= 2.0 / n; 125 } 126 . 127 128 129 -------- DCT (Discrete Cosine Transform) / Inverse of DCT -------- 130 [definition] 131 <case1> IDCT (excluding scale) 132 C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k<n 133 <case2> DCT 134 C[k] = sum_j=0^n-1 a[j]*cos(pi*(j+1/2)*k/n), 0<=k<n 135 [usage] 136 <case1> 137 ip[0] = 0; // first time only 138 ddct(n, 1, a, ip, w); 139 <case2> 140 ip[0] = 0; // first time only 141 ddct(n, -1, a, ip, w); 142 [parameters] 143 n :data length (int) 144 n >= 2, n = power of 2 145 a[0...n-1] :input/output data (float *) 146 output data 147 a[k] = C[k], 0<=k<n 148 ip[0...*] :work area for bit reversal (int *) 149 length of ip >= 2+sqrt(n/2) 150 strictly, 151 length of ip >= 152 2+(1<<(int)(log(n/2+0.5)/log(2))/2). 153 ip[0],ip[1] are pointers of the cos/sin table. 154 w[0...n*5/4-1] :cos/sin table (float *) 155 w[],ip[] are initialized if ip[0] == 0. 156 [remark] 157 Inverse of 158 ddct(n, -1, a, ip, w); 159 is 160 a[0] *= 0.5; 161 ddct(n, 1, a, ip, w); 162 for (j = 0; j <= n - 1; j++) { 163 a[j] *= 2.0 / n; 164 } 165 . 166 167 168 -------- DST (Discrete Sine Transform) / Inverse of DST -------- 169 [definition] 170 <case1> IDST (excluding scale) 171 S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k<n 172 <case2> DST 173 S[k] = sum_j=0^n-1 a[j]*sin(pi*(j+1/2)*k/n), 0<k<=n 174 [usage] 175 <case1> 176 ip[0] = 0; // first time only 177 ddst(n, 1, a, ip, w); 178 <case2> 179 ip[0] = 0; // first time only 180 ddst(n, -1, a, ip, w); 181 [parameters] 182 n :data length (int) 183 n >= 2, n = power of 2 184 a[0...n-1] :input/output data (float *) 185 <case1> 186 input data 187 a[j] = A[j], 0<j<n 188 a[0] = A[n] 189 output data 190 a[k] = S[k], 0<=k<n 191 <case2> 192 output data 193 a[k] = S[k], 0<k<n 194 a[0] = S[n] 195 ip[0...*] :work area for bit reversal (int *) 196 length of ip >= 2+sqrt(n/2) 197 strictly, 198 length of ip >= 199 2+(1<<(int)(log(n/2+0.5)/log(2))/2). 200 ip[0],ip[1] are pointers of the cos/sin table. 201 w[0...n*5/4-1] :cos/sin table (float *) 202 w[],ip[] are initialized if ip[0] == 0. 203 [remark] 204 Inverse of 205 ddst(n, -1, a, ip, w); 206 is 207 a[0] *= 0.5; 208 ddst(n, 1, a, ip, w); 209 for (j = 0; j <= n - 1; j++) { 210 a[j] *= 2.0 / n; 211 } 212 . 213 214 215 -------- Cosine Transform of RDFT (Real Symmetric DFT) -------- 216 [definition] 217 C[k] = sum_j=0^n a[j]*cos(pi*j*k/n), 0<=k<=n 218 [usage] 219 ip[0] = 0; // first time only 220 dfct(n, a, t, ip, w); 221 [parameters] 222 n :data length - 1 (int) 223 n >= 2, n = power of 2 224 a[0...n] :input/output data (float *) 225 output data 226 a[k] = C[k], 0<=k<=n 227 t[0...n/2] :work area (float *) 228 ip[0...*] :work area for bit reversal (int *) 229 length of ip >= 2+sqrt(n/4) 230 strictly, 231 length of ip >= 232 2+(1<<(int)(log(n/4+0.5)/log(2))/2). 233 ip[0],ip[1] are pointers of the cos/sin table. 234 w[0...n*5/8-1] :cos/sin table (float *) 235 w[],ip[] are initialized if ip[0] == 0. 236 [remark] 237 Inverse of 238 a[0] *= 0.5; 239 a[n] *= 0.5; 240 dfct(n, a, t, ip, w); 241 is 242 a[0] *= 0.5; 243 a[n] *= 0.5; 244 dfct(n, a, t, ip, w); 245 for (j = 0; j <= n; j++) { 246 a[j] *= 2.0 / n; 247 } 248 . 249 250 251 -------- Sine Transform of RDFT (Real Anti-symmetric DFT) -------- 252 [definition] 253 S[k] = sum_j=1^n-1 a[j]*sin(pi*j*k/n), 0<k<n 254 [usage] 255 ip[0] = 0; // first time only 256 dfst(n, a, t, ip, w); 257 [parameters] 258 n :data length + 1 (int) 259 n >= 2, n = power of 2 260 a[0...n-1] :input/output data (float *) 261 output data 262 a[k] = S[k], 0<k<n 263 (a[0] is used for work area) 264 t[0...n/2-1] :work area (float *) 265 ip[0...*] :work area for bit reversal (int *) 266 length of ip >= 2+sqrt(n/4) 267 strictly, 268 length of ip >= 269 2+(1<<(int)(log(n/4+0.5)/log(2))/2). 270 ip[0],ip[1] are pointers of the cos/sin table. 271 w[0...n*5/8-1] :cos/sin table (float *) 272 w[],ip[] are initialized if ip[0] == 0. 273 [remark] 274 Inverse of 275 dfst(n, a, t, ip, w); 276 is 277 dfst(n, a, t, ip, w); 278 for (j = 1; j <= n - 1; j++) { 279 a[j] *= 2.0 / n; 280 } 281 . 282 283 284 Appendix : 285 The cos/sin table is recalculated when the larger table required. 286 w[] and ip[] are compatible with all routines. 287 */ 288 289 #include <stddef.h> 290 291 static void makewt(size_t nw, size_t *ip, float *w); 292 static void makect(size_t nc, size_t *ip, float *c); 293 static void bitrv2(size_t n, size_t *ip, float *a); 294 #if 0 // Not used. 295 static void bitrv2conj(int n, int *ip, float *a); 296 #endif 297 static void cftfsub(size_t n, float *a, float *w); 298 static void cftbsub(size_t n, float *a, float *w); 299 static void cft1st(size_t n, float *a, float *w); 300 static void cftmdl(size_t n, size_t l, float *a, float *w); 301 static void rftfsub(size_t n, float *a, size_t nc, float *c); 302 static void rftbsub(size_t n, float *a, size_t nc, float *c); 303 #if 0 // Not used. 304 static void dctsub(int n, float *a, int nc, float *c) 305 static void dstsub(int n, float *a, int nc, float *c) 306 #endif 307 308 309 #if 0 // Not used. 310 void WebRtc_cdft(int n, int isgn, float *a, int *ip, float *w) 311 { 312 if (n > (ip[0] << 2)) { 313 makewt(n >> 2, ip, w); 314 } 315 if (n > 4) { 316 if (isgn >= 0) { 317 bitrv2(n, ip + 2, a); 318 cftfsub(n, a, w); 319 } else { 320 bitrv2conj(n, ip + 2, a); 321 cftbsub(n, a, w); 322 } 323 } else if (n == 4) { 324 cftfsub(n, a, w); 325 } 326 } 327 #endif 328 329 330 void WebRtc_rdft(size_t n, int isgn, float *a, size_t *ip, float *w) 331 { 332 size_t nw, nc; 333 float xi; 334 335 nw = ip[0]; 336 if (n > (nw << 2)) { 337 nw = n >> 2; 338 makewt(nw, ip, w); 339 } 340 nc = ip[1]; 341 if (n > (nc << 2)) { 342 nc = n >> 2; 343 makect(nc, ip, w + nw); 344 } 345 if (isgn >= 0) { 346 if (n > 4) { 347 bitrv2(n, ip + 2, a); 348 cftfsub(n, a, w); 349 rftfsub(n, a, nc, w + nw); 350 } else if (n == 4) { 351 cftfsub(n, a, w); 352 } 353 xi = a[0] - a[1]; 354 a[0] += a[1]; 355 a[1] = xi; 356 } else { 357 a[1] = 0.5f * (a[0] - a[1]); 358 a[0] -= a[1]; 359 if (n > 4) { 360 rftbsub(n, a, nc, w + nw); 361 bitrv2(n, ip + 2, a); 362 cftbsub(n, a, w); 363 } else if (n == 4) { 364 cftfsub(n, a, w); 365 } 366 } 367 } 368 369 #if 0 // Not used. 370 static void ddct(int n, int isgn, float *a, int *ip, float *w) 371 { 372 int j, nw, nc; 373 float xr; 374 375 nw = ip[0]; 376 if (n > (nw << 2)) { 377 nw = n >> 2; 378 makewt(nw, ip, w); 379 } 380 nc = ip[1]; 381 if (n > nc) { 382 nc = n; 383 makect(nc, ip, w + nw); 384 } 385 if (isgn < 0) { 386 xr = a[n - 1]; 387 for (j = n - 2; j >= 2; j -= 2) { 388 a[j + 1] = a[j] - a[j - 1]; 389 a[j] += a[j - 1]; 390 } 391 a[1] = a[0] - xr; 392 a[0] += xr; 393 if (n > 4) { 394 rftbsub(n, a, nc, w + nw); 395 bitrv2(n, ip + 2, a); 396 cftbsub(n, a, w); 397 } else if (n == 4) { 398 cftfsub(n, a, w); 399 } 400 } 401 dctsub(n, a, nc, w + nw); 402 if (isgn >= 0) { 403 if (n > 4) { 404 bitrv2(n, ip + 2, a); 405 cftfsub(n, a, w); 406 rftfsub(n, a, nc, w + nw); 407 } else if (n == 4) { 408 cftfsub(n, a, w); 409 } 410 xr = a[0] - a[1]; 411 a[0] += a[1]; 412 for (j = 2; j < n; j += 2) { 413 a[j - 1] = a[j] - a[j + 1]; 414 a[j] += a[j + 1]; 415 } 416 a[n - 1] = xr; 417 } 418 } 419 420 421 static void ddst(int n, int isgn, float *a, int *ip, float *w) 422 { 423 int j, nw, nc; 424 float xr; 425 426 nw = ip[0]; 427 if (n > (nw << 2)) { 428 nw = n >> 2; 429 makewt(nw, ip, w); 430 } 431 nc = ip[1]; 432 if (n > nc) { 433 nc = n; 434 makect(nc, ip, w + nw); 435 } 436 if (isgn < 0) { 437 xr = a[n - 1]; 438 for (j = n - 2; j >= 2; j -= 2) { 439 a[j + 1] = -a[j] - a[j - 1]; 440 a[j] -= a[j - 1]; 441 } 442 a[1] = a[0] + xr; 443 a[0] -= xr; 444 if (n > 4) { 445 rftbsub(n, a, nc, w + nw); 446 bitrv2(n, ip + 2, a); 447 cftbsub(n, a, w); 448 } else if (n == 4) { 449 cftfsub(n, a, w); 450 } 451 } 452 dstsub(n, a, nc, w + nw); 453 if (isgn >= 0) { 454 if (n > 4) { 455 bitrv2(n, ip + 2, a); 456 cftfsub(n, a, w); 457 rftfsub(n, a, nc, w + nw); 458 } else if (n == 4) { 459 cftfsub(n, a, w); 460 } 461 xr = a[0] - a[1]; 462 a[0] += a[1]; 463 for (j = 2; j < n; j += 2) { 464 a[j - 1] = -a[j] - a[j + 1]; 465 a[j] -= a[j + 1]; 466 } 467 a[n - 1] = -xr; 468 } 469 } 470 471 472 static void dfct(int n, float *a, float *t, int *ip, float *w) 473 { 474 int j, k, l, m, mh, nw, nc; 475 float xr, xi, yr, yi; 476 477 nw = ip[0]; 478 if (n > (nw << 3)) { 479 nw = n >> 3; 480 makewt(nw, ip, w); 481 } 482 nc = ip[1]; 483 if (n > (nc << 1)) { 484 nc = n >> 1; 485 makect(nc, ip, w + nw); 486 } 487 m = n >> 1; 488 yi = a[m]; 489 xi = a[0] + a[n]; 490 a[0] -= a[n]; 491 t[0] = xi - yi; 492 t[m] = xi + yi; 493 if (n > 2) { 494 mh = m >> 1; 495 for (j = 1; j < mh; j++) { 496 k = m - j; 497 xr = a[j] - a[n - j]; 498 xi = a[j] + a[n - j]; 499 yr = a[k] - a[n - k]; 500 yi = a[k] + a[n - k]; 501 a[j] = xr; 502 a[k] = yr; 503 t[j] = xi - yi; 504 t[k] = xi + yi; 505 } 506 t[mh] = a[mh] + a[n - mh]; 507 a[mh] -= a[n - mh]; 508 dctsub(m, a, nc, w + nw); 509 if (m > 4) { 510 bitrv2(m, ip + 2, a); 511 cftfsub(m, a, w); 512 rftfsub(m, a, nc, w + nw); 513 } else if (m == 4) { 514 cftfsub(m, a, w); 515 } 516 a[n - 1] = a[0] - a[1]; 517 a[1] = a[0] + a[1]; 518 for (j = m - 2; j >= 2; j -= 2) { 519 a[2 * j + 1] = a[j] + a[j + 1]; 520 a[2 * j - 1] = a[j] - a[j + 1]; 521 } 522 l = 2; 523 m = mh; 524 while (m >= 2) { 525 dctsub(m, t, nc, w + nw); 526 if (m > 4) { 527 bitrv2(m, ip + 2, t); 528 cftfsub(m, t, w); 529 rftfsub(m, t, nc, w + nw); 530 } else if (m == 4) { 531 cftfsub(m, t, w); 532 } 533 a[n - l] = t[0] - t[1]; 534 a[l] = t[0] + t[1]; 535 k = 0; 536 for (j = 2; j < m; j += 2) { 537 k += l << 2; 538 a[k - l] = t[j] - t[j + 1]; 539 a[k + l] = t[j] + t[j + 1]; 540 } 541 l <<= 1; 542 mh = m >> 1; 543 for (j = 0; j < mh; j++) { 544 k = m - j; 545 t[j] = t[m + k] - t[m + j]; 546 t[k] = t[m + k] + t[m + j]; 547 } 548 t[mh] = t[m + mh]; 549 m = mh; 550 } 551 a[l] = t[0]; 552 a[n] = t[2] - t[1]; 553 a[0] = t[2] + t[1]; 554 } else { 555 a[1] = a[0]; 556 a[2] = t[0]; 557 a[0] = t[1]; 558 } 559 } 560 561 static void dfst(int n, float *a, float *t, int *ip, float *w) 562 { 563 int j, k, l, m, mh, nw, nc; 564 float xr, xi, yr, yi; 565 566 nw = ip[0]; 567 if (n > (nw << 3)) { 568 nw = n >> 3; 569 makewt(nw, ip, w); 570 } 571 nc = ip[1]; 572 if (n > (nc << 1)) { 573 nc = n >> 1; 574 makect(nc, ip, w + nw); 575 } 576 if (n > 2) { 577 m = n >> 1; 578 mh = m >> 1; 579 for (j = 1; j < mh; j++) { 580 k = m - j; 581 xr = a[j] + a[n - j]; 582 xi = a[j] - a[n - j]; 583 yr = a[k] + a[n - k]; 584 yi = a[k] - a[n - k]; 585 a[j] = xr; 586 a[k] = yr; 587 t[j] = xi + yi; 588 t[k] = xi - yi; 589 } 590 t[0] = a[mh] - a[n - mh]; 591 a[mh] += a[n - mh]; 592 a[0] = a[m]; 593 dstsub(m, a, nc, w + nw); 594 if (m > 4) { 595 bitrv2(m, ip + 2, a); 596 cftfsub(m, a, w); 597 rftfsub(m, a, nc, w + nw); 598 } else if (m == 4) { 599 cftfsub(m, a, w); 600 } 601 a[n - 1] = a[1] - a[0]; 602 a[1] = a[0] + a[1]; 603 for (j = m - 2; j >= 2; j -= 2) { 604 a[2 * j + 1] = a[j] - a[j + 1]; 605 a[2 * j - 1] = -a[j] - a[j + 1]; 606 } 607 l = 2; 608 m = mh; 609 while (m >= 2) { 610 dstsub(m, t, nc, w + nw); 611 if (m > 4) { 612 bitrv2(m, ip + 2, t); 613 cftfsub(m, t, w); 614 rftfsub(m, t, nc, w + nw); 615 } else if (m == 4) { 616 cftfsub(m, t, w); 617 } 618 a[n - l] = t[1] - t[0]; 619 a[l] = t[0] + t[1]; 620 k = 0; 621 for (j = 2; j < m; j += 2) { 622 k += l << 2; 623 a[k - l] = -t[j] - t[j + 1]; 624 a[k + l] = t[j] - t[j + 1]; 625 } 626 l <<= 1; 627 mh = m >> 1; 628 for (j = 1; j < mh; j++) { 629 k = m - j; 630 t[j] = t[m + k] + t[m + j]; 631 t[k] = t[m + k] - t[m + j]; 632 } 633 t[0] = t[m + mh]; 634 m = mh; 635 } 636 a[l] = t[0]; 637 } 638 a[0] = 0; 639 } 640 #endif // Not used. 641 642 643 /* -------- initializing routines -------- */ 644 645 646 #include <math.h> 647 648 static void makewt(size_t nw, size_t *ip, float *w) 649 { 650 size_t j, nwh; 651 float delta, x, y; 652 653 ip[0] = nw; 654 ip[1] = 1; 655 if (nw > 2) { 656 nwh = nw >> 1; 657 delta = atanf(1.0f) / nwh; 658 w[0] = 1; 659 w[1] = 0; 660 w[nwh] = (float)cos(delta * nwh); 661 w[nwh + 1] = w[nwh]; 662 if (nwh > 2) { 663 for (j = 2; j < nwh; j += 2) { 664 x = (float)cos(delta * j); 665 y = (float)sin(delta * j); 666 w[j] = x; 667 w[j + 1] = y; 668 w[nw - j] = y; 669 w[nw - j + 1] = x; 670 } 671 bitrv2(nw, ip + 2, w); 672 } 673 } 674 } 675 676 677 static void makect(size_t nc, size_t *ip, float *c) 678 { 679 size_t j, nch; 680 float delta; 681 682 ip[1] = nc; 683 if (nc > 1) { 684 nch = nc >> 1; 685 delta = atanf(1.0f) / nch; 686 c[0] = (float)cos(delta * nch); 687 c[nch] = 0.5f * c[0]; 688 for (j = 1; j < nch; j++) { 689 c[j] = 0.5f * (float)cos(delta * j); 690 c[nc - j] = 0.5f * (float)sin(delta * j); 691 } 692 } 693 } 694 695 696 /* -------- child routines -------- */ 697 698 699 static void bitrv2(size_t n, size_t *ip, float *a) 700 { 701 size_t j, j1, k, k1, l, m, m2; 702 float xr, xi, yr, yi; 703 704 ip[0] = 0; 705 l = n; 706 m = 1; 707 while ((m << 3) < l) { 708 l >>= 1; 709 for (j = 0; j < m; j++) { 710 ip[m + j] = ip[j] + l; 711 } 712 m <<= 1; 713 } 714 m2 = 2 * m; 715 if ((m << 3) == l) { 716 for (k = 0; k < m; k++) { 717 for (j = 0; j < k; j++) { 718 j1 = 2 * j + ip[k]; 719 k1 = 2 * k + ip[j]; 720 xr = a[j1]; 721 xi = a[j1 + 1]; 722 yr = a[k1]; 723 yi = a[k1 + 1]; 724 a[j1] = yr; 725 a[j1 + 1] = yi; 726 a[k1] = xr; 727 a[k1 + 1] = xi; 728 j1 += m2; 729 k1 += 2 * m2; 730 xr = a[j1]; 731 xi = a[j1 + 1]; 732 yr = a[k1]; 733 yi = a[k1 + 1]; 734 a[j1] = yr; 735 a[j1 + 1] = yi; 736 a[k1] = xr; 737 a[k1 + 1] = xi; 738 j1 += m2; 739 k1 -= m2; 740 xr = a[j1]; 741 xi = a[j1 + 1]; 742 yr = a[k1]; 743 yi = a[k1 + 1]; 744 a[j1] = yr; 745 a[j1 + 1] = yi; 746 a[k1] = xr; 747 a[k1 + 1] = xi; 748 j1 += m2; 749 k1 += 2 * m2; 750 xr = a[j1]; 751 xi = a[j1 + 1]; 752 yr = a[k1]; 753 yi = a[k1 + 1]; 754 a[j1] = yr; 755 a[j1 + 1] = yi; 756 a[k1] = xr; 757 a[k1 + 1] = xi; 758 } 759 j1 = 2 * k + m2 + ip[k]; 760 k1 = j1 + m2; 761 xr = a[j1]; 762 xi = a[j1 + 1]; 763 yr = a[k1]; 764 yi = a[k1 + 1]; 765 a[j1] = yr; 766 a[j1 + 1] = yi; 767 a[k1] = xr; 768 a[k1 + 1] = xi; 769 } 770 } else { 771 for (k = 1; k < m; k++) { 772 for (j = 0; j < k; j++) { 773 j1 = 2 * j + ip[k]; 774 k1 = 2 * k + ip[j]; 775 xr = a[j1]; 776 xi = a[j1 + 1]; 777 yr = a[k1]; 778 yi = a[k1 + 1]; 779 a[j1] = yr; 780 a[j1 + 1] = yi; 781 a[k1] = xr; 782 a[k1 + 1] = xi; 783 j1 += m2; 784 k1 += m2; 785 xr = a[j1]; 786 xi = a[j1 + 1]; 787 yr = a[k1]; 788 yi = a[k1 + 1]; 789 a[j1] = yr; 790 a[j1 + 1] = yi; 791 a[k1] = xr; 792 a[k1 + 1] = xi; 793 } 794 } 795 } 796 } 797 798 #if 0 // Not used. 799 static void bitrv2conj(int n, int *ip, float *a) 800 { 801 int j, j1, k, k1, l, m, m2; 802 float xr, xi, yr, yi; 803 804 ip[0] = 0; 805 l = n; 806 m = 1; 807 while ((m << 3) < l) { 808 l >>= 1; 809 for (j = 0; j < m; j++) { 810 ip[m + j] = ip[j] + l; 811 } 812 m <<= 1; 813 } 814 m2 = 2 * m; 815 if ((m << 3) == l) { 816 for (k = 0; k < m; k++) { 817 for (j = 0; j < k; j++) { 818 j1 = 2 * j + ip[k]; 819 k1 = 2 * k + ip[j]; 820 xr = a[j1]; 821 xi = -a[j1 + 1]; 822 yr = a[k1]; 823 yi = -a[k1 + 1]; 824 a[j1] = yr; 825 a[j1 + 1] = yi; 826 a[k1] = xr; 827 a[k1 + 1] = xi; 828 j1 += m2; 829 k1 += 2 * m2; 830 xr = a[j1]; 831 xi = -a[j1 + 1]; 832 yr = a[k1]; 833 yi = -a[k1 + 1]; 834 a[j1] = yr; 835 a[j1 + 1] = yi; 836 a[k1] = xr; 837 a[k1 + 1] = xi; 838 j1 += m2; 839 k1 -= m2; 840 xr = a[j1]; 841 xi = -a[j1 + 1]; 842 yr = a[k1]; 843 yi = -a[k1 + 1]; 844 a[j1] = yr; 845 a[j1 + 1] = yi; 846 a[k1] = xr; 847 a[k1 + 1] = xi; 848 j1 += m2; 849 k1 += 2 * m2; 850 xr = a[j1]; 851 xi = -a[j1 + 1]; 852 yr = a[k1]; 853 yi = -a[k1 + 1]; 854 a[j1] = yr; 855 a[j1 + 1] = yi; 856 a[k1] = xr; 857 a[k1 + 1] = xi; 858 } 859 k1 = 2 * k + ip[k]; 860 a[k1 + 1] = -a[k1 + 1]; 861 j1 = k1 + m2; 862 k1 = j1 + m2; 863 xr = a[j1]; 864 xi = -a[j1 + 1]; 865 yr = a[k1]; 866 yi = -a[k1 + 1]; 867 a[j1] = yr; 868 a[j1 + 1] = yi; 869 a[k1] = xr; 870 a[k1 + 1] = xi; 871 k1 += m2; 872 a[k1 + 1] = -a[k1 + 1]; 873 } 874 } else { 875 a[1] = -a[1]; 876 a[m2 + 1] = -a[m2 + 1]; 877 for (k = 1; k < m; k++) { 878 for (j = 0; j < k; j++) { 879 j1 = 2 * j + ip[k]; 880 k1 = 2 * k + ip[j]; 881 xr = a[j1]; 882 xi = -a[j1 + 1]; 883 yr = a[k1]; 884 yi = -a[k1 + 1]; 885 a[j1] = yr; 886 a[j1 + 1] = yi; 887 a[k1] = xr; 888 a[k1 + 1] = xi; 889 j1 += m2; 890 k1 += m2; 891 xr = a[j1]; 892 xi = -a[j1 + 1]; 893 yr = a[k1]; 894 yi = -a[k1 + 1]; 895 a[j1] = yr; 896 a[j1 + 1] = yi; 897 a[k1] = xr; 898 a[k1 + 1] = xi; 899 } 900 k1 = 2 * k + ip[k]; 901 a[k1 + 1] = -a[k1 + 1]; 902 a[k1 + m2 + 1] = -a[k1 + m2 + 1]; 903 } 904 } 905 } 906 #endif 907 908 static void cftfsub(size_t n, float *a, float *w) 909 { 910 size_t j, j1, j2, j3, l; 911 float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; 912 913 l = 2; 914 if (n > 8) { 915 cft1st(n, a, w); 916 l = 8; 917 while ((l << 2) < n) { 918 cftmdl(n, l, a, w); 919 l <<= 2; 920 } 921 } 922 if ((l << 2) == n) { 923 for (j = 0; j < l; j += 2) { 924 j1 = j + l; 925 j2 = j1 + l; 926 j3 = j2 + l; 927 x0r = a[j] + a[j1]; 928 x0i = a[j + 1] + a[j1 + 1]; 929 x1r = a[j] - a[j1]; 930 x1i = a[j + 1] - a[j1 + 1]; 931 x2r = a[j2] + a[j3]; 932 x2i = a[j2 + 1] + a[j3 + 1]; 933 x3r = a[j2] - a[j3]; 934 x3i = a[j2 + 1] - a[j3 + 1]; 935 a[j] = x0r + x2r; 936 a[j + 1] = x0i + x2i; 937 a[j2] = x0r - x2r; 938 a[j2 + 1] = x0i - x2i; 939 a[j1] = x1r - x3i; 940 a[j1 + 1] = x1i + x3r; 941 a[j3] = x1r + x3i; 942 a[j3 + 1] = x1i - x3r; 943 } 944 } else { 945 for (j = 0; j < l; j += 2) { 946 j1 = j + l; 947 x0r = a[j] - a[j1]; 948 x0i = a[j + 1] - a[j1 + 1]; 949 a[j] += a[j1]; 950 a[j + 1] += a[j1 + 1]; 951 a[j1] = x0r; 952 a[j1 + 1] = x0i; 953 } 954 } 955 } 956 957 958 static void cftbsub(size_t n, float *a, float *w) 959 { 960 size_t j, j1, j2, j3, l; 961 float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; 962 963 l = 2; 964 if (n > 8) { 965 cft1st(n, a, w); 966 l = 8; 967 while ((l << 2) < n) { 968 cftmdl(n, l, a, w); 969 l <<= 2; 970 } 971 } 972 if ((l << 2) == n) { 973 for (j = 0; j < l; j += 2) { 974 j1 = j + l; 975 j2 = j1 + l; 976 j3 = j2 + l; 977 x0r = a[j] + a[j1]; 978 x0i = -a[j + 1] - a[j1 + 1]; 979 x1r = a[j] - a[j1]; 980 x1i = -a[j + 1] + a[j1 + 1]; 981 x2r = a[j2] + a[j3]; 982 x2i = a[j2 + 1] + a[j3 + 1]; 983 x3r = a[j2] - a[j3]; 984 x3i = a[j2 + 1] - a[j3 + 1]; 985 a[j] = x0r + x2r; 986 a[j + 1] = x0i - x2i; 987 a[j2] = x0r - x2r; 988 a[j2 + 1] = x0i + x2i; 989 a[j1] = x1r - x3i; 990 a[j1 + 1] = x1i - x3r; 991 a[j3] = x1r + x3i; 992 a[j3 + 1] = x1i + x3r; 993 } 994 } else { 995 for (j = 0; j < l; j += 2) { 996 j1 = j + l; 997 x0r = a[j] - a[j1]; 998 x0i = -a[j + 1] + a[j1 + 1]; 999 a[j] += a[j1]; 1000 a[j + 1] = -a[j + 1] - a[j1 + 1]; 1001 a[j1] = x0r; 1002 a[j1 + 1] = x0i; 1003 } 1004 } 1005 } 1006 1007 1008 static void cft1st(size_t n, float *a, float *w) 1009 { 1010 size_t j, k1, k2; 1011 float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i; 1012 float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; 1013 1014 x0r = a[0] + a[2]; 1015 x0i = a[1] + a[3]; 1016 x1r = a[0] - a[2]; 1017 x1i = a[1] - a[3]; 1018 x2r = a[4] + a[6]; 1019 x2i = a[5] + a[7]; 1020 x3r = a[4] - a[6]; 1021 x3i = a[5] - a[7]; 1022 a[0] = x0r + x2r; 1023 a[1] = x0i + x2i; 1024 a[4] = x0r - x2r; 1025 a[5] = x0i - x2i; 1026 a[2] = x1r - x3i; 1027 a[3] = x1i + x3r; 1028 a[6] = x1r + x3i; 1029 a[7] = x1i - x3r; 1030 wk1r = w[2]; 1031 x0r = a[8] + a[10]; 1032 x0i = a[9] + a[11]; 1033 x1r = a[8] - a[10]; 1034 x1i = a[9] - a[11]; 1035 x2r = a[12] + a[14]; 1036 x2i = a[13] + a[15]; 1037 x3r = a[12] - a[14]; 1038 x3i = a[13] - a[15]; 1039 a[8] = x0r + x2r; 1040 a[9] = x0i + x2i; 1041 a[12] = x2i - x0i; 1042 a[13] = x0r - x2r; 1043 x0r = x1r - x3i; 1044 x0i = x1i + x3r; 1045 a[10] = wk1r * (x0r - x0i); 1046 a[11] = wk1r * (x0r + x0i); 1047 x0r = x3i + x1r; 1048 x0i = x3r - x1i; 1049 a[14] = wk1r * (x0i - x0r); 1050 a[15] = wk1r * (x0i + x0r); 1051 k1 = 0; 1052 for (j = 16; j < n; j += 16) { 1053 k1 += 2; 1054 k2 = 2 * k1; 1055 wk2r = w[k1]; 1056 wk2i = w[k1 + 1]; 1057 wk1r = w[k2]; 1058 wk1i = w[k2 + 1]; 1059 wk3r = wk1r - 2 * wk2i * wk1i; 1060 wk3i = 2 * wk2i * wk1r - wk1i; 1061 x0r = a[j] + a[j + 2]; 1062 x0i = a[j + 1] + a[j + 3]; 1063 x1r = a[j] - a[j + 2]; 1064 x1i = a[j + 1] - a[j + 3]; 1065 x2r = a[j + 4] + a[j + 6]; 1066 x2i = a[j + 5] + a[j + 7]; 1067 x3r = a[j + 4] - a[j + 6]; 1068 x3i = a[j + 5] - a[j + 7]; 1069 a[j] = x0r + x2r; 1070 a[j + 1] = x0i + x2i; 1071 x0r -= x2r; 1072 x0i -= x2i; 1073 a[j + 4] = wk2r * x0r - wk2i * x0i; 1074 a[j + 5] = wk2r * x0i + wk2i * x0r; 1075 x0r = x1r - x3i; 1076 x0i = x1i + x3r; 1077 a[j + 2] = wk1r * x0r - wk1i * x0i; 1078 a[j + 3] = wk1r * x0i + wk1i * x0r; 1079 x0r = x1r + x3i; 1080 x0i = x1i - x3r; 1081 a[j + 6] = wk3r * x0r - wk3i * x0i; 1082 a[j + 7] = wk3r * x0i + wk3i * x0r; 1083 wk1r = w[k2 + 2]; 1084 wk1i = w[k2 + 3]; 1085 wk3r = wk1r - 2 * wk2r * wk1i; 1086 wk3i = 2 * wk2r * wk1r - wk1i; 1087 x0r = a[j + 8] + a[j + 10]; 1088 x0i = a[j + 9] + a[j + 11]; 1089 x1r = a[j + 8] - a[j + 10]; 1090 x1i = a[j + 9] - a[j + 11]; 1091 x2r = a[j + 12] + a[j + 14]; 1092 x2i = a[j + 13] + a[j + 15]; 1093 x3r = a[j + 12] - a[j + 14]; 1094 x3i = a[j + 13] - a[j + 15]; 1095 a[j + 8] = x0r + x2r; 1096 a[j + 9] = x0i + x2i; 1097 x0r -= x2r; 1098 x0i -= x2i; 1099 a[j + 12] = -wk2i * x0r - wk2r * x0i; 1100 a[j + 13] = -wk2i * x0i + wk2r * x0r; 1101 x0r = x1r - x3i; 1102 x0i = x1i + x3r; 1103 a[j + 10] = wk1r * x0r - wk1i * x0i; 1104 a[j + 11] = wk1r * x0i + wk1i * x0r; 1105 x0r = x1r + x3i; 1106 x0i = x1i - x3r; 1107 a[j + 14] = wk3r * x0r - wk3i * x0i; 1108 a[j + 15] = wk3r * x0i + wk3i * x0r; 1109 } 1110 } 1111 1112 1113 static void cftmdl(size_t n, size_t l, float *a, float *w) 1114 { 1115 size_t j, j1, j2, j3, k, k1, k2, m, m2; 1116 float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i; 1117 float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; 1118 1119 m = l << 2; 1120 for (j = 0; j < l; j += 2) { 1121 j1 = j + l; 1122 j2 = j1 + l; 1123 j3 = j2 + l; 1124 x0r = a[j] + a[j1]; 1125 x0i = a[j + 1] + a[j1 + 1]; 1126 x1r = a[j] - a[j1]; 1127 x1i = a[j + 1] - a[j1 + 1]; 1128 x2r = a[j2] + a[j3]; 1129 x2i = a[j2 + 1] + a[j3 + 1]; 1130 x3r = a[j2] - a[j3]; 1131 x3i = a[j2 + 1] - a[j3 + 1]; 1132 a[j] = x0r + x2r; 1133 a[j + 1] = x0i + x2i; 1134 a[j2] = x0r - x2r; 1135 a[j2 + 1] = x0i - x2i; 1136 a[j1] = x1r - x3i; 1137 a[j1 + 1] = x1i + x3r; 1138 a[j3] = x1r + x3i; 1139 a[j3 + 1] = x1i - x3r; 1140 } 1141 wk1r = w[2]; 1142 for (j = m; j < l + m; j += 2) { 1143 j1 = j + l; 1144 j2 = j1 + l; 1145 j3 = j2 + l; 1146 x0r = a[j] + a[j1]; 1147 x0i = a[j + 1] + a[j1 + 1]; 1148 x1r = a[j] - a[j1]; 1149 x1i = a[j + 1] - a[j1 + 1]; 1150 x2r = a[j2] + a[j3]; 1151 x2i = a[j2 + 1] + a[j3 + 1]; 1152 x3r = a[j2] - a[j3]; 1153 x3i = a[j2 + 1] - a[j3 + 1]; 1154 a[j] = x0r + x2r; 1155 a[j + 1] = x0i + x2i; 1156 a[j2] = x2i - x0i; 1157 a[j2 + 1] = x0r - x2r; 1158 x0r = x1r - x3i; 1159 x0i = x1i + x3r; 1160 a[j1] = wk1r * (x0r - x0i); 1161 a[j1 + 1] = wk1r * (x0r + x0i); 1162 x0r = x3i + x1r; 1163 x0i = x3r - x1i; 1164 a[j3] = wk1r * (x0i - x0r); 1165 a[j3 + 1] = wk1r * (x0i + x0r); 1166 } 1167 k1 = 0; 1168 m2 = 2 * m; 1169 for (k = m2; k < n; k += m2) { 1170 k1 += 2; 1171 k2 = 2 * k1; 1172 wk2r = w[k1]; 1173 wk2i = w[k1 + 1]; 1174 wk1r = w[k2]; 1175 wk1i = w[k2 + 1]; 1176 wk3r = wk1r - 2 * wk2i * wk1i; 1177 wk3i = 2 * wk2i * wk1r - wk1i; 1178 for (j = k; j < l + k; j += 2) { 1179 j1 = j + l; 1180 j2 = j1 + l; 1181 j3 = j2 + l; 1182 x0r = a[j] + a[j1]; 1183 x0i = a[j + 1] + a[j1 + 1]; 1184 x1r = a[j] - a[j1]; 1185 x1i = a[j + 1] - a[j1 + 1]; 1186 x2r = a[j2] + a[j3]; 1187 x2i = a[j2 + 1] + a[j3 + 1]; 1188 x3r = a[j2] - a[j3]; 1189 x3i = a[j2 + 1] - a[j3 + 1]; 1190 a[j] = x0r + x2r; 1191 a[j + 1] = x0i + x2i; 1192 x0r -= x2r; 1193 x0i -= x2i; 1194 a[j2] = wk2r * x0r - wk2i * x0i; 1195 a[j2 + 1] = wk2r * x0i + wk2i * x0r; 1196 x0r = x1r - x3i; 1197 x0i = x1i + x3r; 1198 a[j1] = wk1r * x0r - wk1i * x0i; 1199 a[j1 + 1] = wk1r * x0i + wk1i * x0r; 1200 x0r = x1r + x3i; 1201 x0i = x1i - x3r; 1202 a[j3] = wk3r * x0r - wk3i * x0i; 1203 a[j3 + 1] = wk3r * x0i + wk3i * x0r; 1204 } 1205 wk1r = w[k2 + 2]; 1206 wk1i = w[k2 + 3]; 1207 wk3r = wk1r - 2 * wk2r * wk1i; 1208 wk3i = 2 * wk2r * wk1r - wk1i; 1209 for (j = k + m; j < l + (k + m); j += 2) { 1210 j1 = j + l; 1211 j2 = j1 + l; 1212 j3 = j2 + l; 1213 x0r = a[j] + a[j1]; 1214 x0i = a[j + 1] + a[j1 + 1]; 1215 x1r = a[j] - a[j1]; 1216 x1i = a[j + 1] - a[j1 + 1]; 1217 x2r = a[j2] + a[j3]; 1218 x2i = a[j2 + 1] + a[j3 + 1]; 1219 x3r = a[j2] - a[j3]; 1220 x3i = a[j2 + 1] - a[j3 + 1]; 1221 a[j] = x0r + x2r; 1222 a[j + 1] = x0i + x2i; 1223 x0r -= x2r; 1224 x0i -= x2i; 1225 a[j2] = -wk2i * x0r - wk2r * x0i; 1226 a[j2 + 1] = -wk2i * x0i + wk2r * x0r; 1227 x0r = x1r - x3i; 1228 x0i = x1i + x3r; 1229 a[j1] = wk1r * x0r - wk1i * x0i; 1230 a[j1 + 1] = wk1r * x0i + wk1i * x0r; 1231 x0r = x1r + x3i; 1232 x0i = x1i - x3r; 1233 a[j3] = wk3r * x0r - wk3i * x0i; 1234 a[j3 + 1] = wk3r * x0i + wk3i * x0r; 1235 } 1236 } 1237 } 1238 1239 1240 static void rftfsub(size_t n, float *a, size_t nc, float *c) 1241 { 1242 size_t j, k, kk, ks, m; 1243 float wkr, wki, xr, xi, yr, yi; 1244 1245 m = n >> 1; 1246 ks = 2 * nc / m; 1247 kk = 0; 1248 for (j = 2; j < m; j += 2) { 1249 k = n - j; 1250 kk += ks; 1251 wkr = 0.5f - c[nc - kk]; 1252 wki = c[kk]; 1253 xr = a[j] - a[k]; 1254 xi = a[j + 1] + a[k + 1]; 1255 yr = wkr * xr - wki * xi; 1256 yi = wkr * xi + wki * xr; 1257 a[j] -= yr; 1258 a[j + 1] -= yi; 1259 a[k] += yr; 1260 a[k + 1] -= yi; 1261 } 1262 } 1263 1264 1265 static void rftbsub(size_t n, float *a, size_t nc, float *c) 1266 { 1267 size_t j, k, kk, ks, m; 1268 float wkr, wki, xr, xi, yr, yi; 1269 1270 a[1] = -a[1]; 1271 m = n >> 1; 1272 ks = 2 * nc / m; 1273 kk = 0; 1274 for (j = 2; j < m; j += 2) { 1275 k = n - j; 1276 kk += ks; 1277 wkr = 0.5f - c[nc - kk]; 1278 wki = c[kk]; 1279 xr = a[j] - a[k]; 1280 xi = a[j + 1] + a[k + 1]; 1281 yr = wkr * xr + wki * xi; 1282 yi = wkr * xi - wki * xr; 1283 a[j] -= yr; 1284 a[j + 1] = yi - a[j + 1]; 1285 a[k] += yr; 1286 a[k + 1] = yi - a[k + 1]; 1287 } 1288 a[m + 1] = -a[m + 1]; 1289 } 1290 1291 #if 0 // Not used. 1292 static void dctsub(int n, float *a, int nc, float *c) 1293 { 1294 int j, k, kk, ks, m; 1295 float wkr, wki, xr; 1296 1297 m = n >> 1; 1298 ks = nc / n; 1299 kk = 0; 1300 for (j = 1; j < m; j++) { 1301 k = n - j; 1302 kk += ks; 1303 wkr = c[kk] - c[nc - kk]; 1304 wki = c[kk] + c[nc - kk]; 1305 xr = wki * a[j] - wkr * a[k]; 1306 a[j] = wkr * a[j] + wki * a[k]; 1307 a[k] = xr; 1308 } 1309 a[m] *= c[0]; 1310 } 1311 1312 1313 static void dstsub(int n, float *a, int nc, float *c) 1314 { 1315 int j, k, kk, ks, m; 1316 float wkr, wki, xr; 1317 1318 m = n >> 1; 1319 ks = nc / n; 1320 kk = 0; 1321 for (j = 1; j < m; j++) { 1322 k = n - j; 1323 kk += ks; 1324 wkr = c[kk] - c[nc - kk]; 1325 wki = c[kk] + c[nc - kk]; 1326 xr = wki * a[k] - wkr * a[j]; 1327 a[k] = wkr * a[k] + wki * a[j]; 1328 a[j] = xr; 1329 } 1330 a[m] *= c[0]; 1331 } 1332 #endif // Not used. 1333