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(int, int, float *, int *, 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 (int) 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 (int *) 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 static void makewt(int nw, int *ip, float *w); 290 static void makect(int nc, int *ip, float *c); 291 static void bitrv2(int n, int *ip, float *a); 292 static void bitrv2conj(int n, int *ip, float *a); 293 static void cftfsub(int n, float *a, float *w); 294 static void cftbsub(int n, float *a, float *w); 295 static void cft1st(int n, float *a, float *w); 296 static void cftmdl(int n, int l, float *a, float *w); 297 static void rftfsub(int n, float *a, int nc, float *c); 298 static void rftbsub(int n, float *a, int nc, float *c); 299 #if 0 // Not used. 300 static void dctsub(int n, float *a, int nc, float *c) 301 static void dstsub(int n, float *a, int nc, float *c) 302 #endif 303 304 305 void WebRtc_cdft(int n, int isgn, float *a, int *ip, float *w) 306 { 307 if (n > (ip[0] << 2)) { 308 makewt(n >> 2, ip, w); 309 } 310 if (n > 4) { 311 if (isgn >= 0) { 312 bitrv2(n, ip + 2, a); 313 cftfsub(n, a, w); 314 } else { 315 bitrv2conj(n, ip + 2, a); 316 cftbsub(n, a, w); 317 } 318 } else if (n == 4) { 319 cftfsub(n, a, w); 320 } 321 } 322 323 324 void WebRtc_rdft(int n, int isgn, float *a, int *ip, float *w) 325 { 326 int nw, nc; 327 float xi; 328 329 nw = ip[0]; 330 if (n > (nw << 2)) { 331 nw = n >> 2; 332 makewt(nw, ip, w); 333 } 334 nc = ip[1]; 335 if (n > (nc << 2)) { 336 nc = n >> 2; 337 makect(nc, ip, w + nw); 338 } 339 if (isgn >= 0) { 340 if (n > 4) { 341 bitrv2(n, ip + 2, a); 342 cftfsub(n, a, w); 343 rftfsub(n, a, nc, w + nw); 344 } else if (n == 4) { 345 cftfsub(n, a, w); 346 } 347 xi = a[0] - a[1]; 348 a[0] += a[1]; 349 a[1] = xi; 350 } else { 351 a[1] = 0.5f * (a[0] - a[1]); 352 a[0] -= a[1]; 353 if (n > 4) { 354 rftbsub(n, a, nc, w + nw); 355 bitrv2(n, ip + 2, a); 356 cftbsub(n, a, w); 357 } else if (n == 4) { 358 cftfsub(n, a, w); 359 } 360 } 361 } 362 363 #if 0 // Not used. 364 static void ddct(int n, int isgn, float *a, int *ip, float *w) 365 { 366 int j, nw, nc; 367 float xr; 368 369 nw = ip[0]; 370 if (n > (nw << 2)) { 371 nw = n >> 2; 372 makewt(nw, ip, w); 373 } 374 nc = ip[1]; 375 if (n > nc) { 376 nc = n; 377 makect(nc, ip, w + nw); 378 } 379 if (isgn < 0) { 380 xr = a[n - 1]; 381 for (j = n - 2; j >= 2; j -= 2) { 382 a[j + 1] = a[j] - a[j - 1]; 383 a[j] += a[j - 1]; 384 } 385 a[1] = a[0] - xr; 386 a[0] += xr; 387 if (n > 4) { 388 rftbsub(n, a, nc, w + nw); 389 bitrv2(n, ip + 2, a); 390 cftbsub(n, a, w); 391 } else if (n == 4) { 392 cftfsub(n, a, w); 393 } 394 } 395 dctsub(n, a, nc, w + nw); 396 if (isgn >= 0) { 397 if (n > 4) { 398 bitrv2(n, ip + 2, a); 399 cftfsub(n, a, w); 400 rftfsub(n, a, nc, w + nw); 401 } else if (n == 4) { 402 cftfsub(n, a, w); 403 } 404 xr = a[0] - a[1]; 405 a[0] += a[1]; 406 for (j = 2; j < n; j += 2) { 407 a[j - 1] = a[j] - a[j + 1]; 408 a[j] += a[j + 1]; 409 } 410 a[n - 1] = xr; 411 } 412 } 413 414 415 static void ddst(int n, int isgn, float *a, int *ip, float *w) 416 { 417 int j, nw, nc; 418 float xr; 419 420 nw = ip[0]; 421 if (n > (nw << 2)) { 422 nw = n >> 2; 423 makewt(nw, ip, w); 424 } 425 nc = ip[1]; 426 if (n > nc) { 427 nc = n; 428 makect(nc, ip, w + nw); 429 } 430 if (isgn < 0) { 431 xr = a[n - 1]; 432 for (j = n - 2; j >= 2; j -= 2) { 433 a[j + 1] = -a[j] - a[j - 1]; 434 a[j] -= a[j - 1]; 435 } 436 a[1] = a[0] + xr; 437 a[0] -= xr; 438 if (n > 4) { 439 rftbsub(n, a, nc, w + nw); 440 bitrv2(n, ip + 2, a); 441 cftbsub(n, a, w); 442 } else if (n == 4) { 443 cftfsub(n, a, w); 444 } 445 } 446 dstsub(n, a, nc, w + nw); 447 if (isgn >= 0) { 448 if (n > 4) { 449 bitrv2(n, ip + 2, a); 450 cftfsub(n, a, w); 451 rftfsub(n, a, nc, w + nw); 452 } else if (n == 4) { 453 cftfsub(n, a, w); 454 } 455 xr = a[0] - a[1]; 456 a[0] += a[1]; 457 for (j = 2; j < n; j += 2) { 458 a[j - 1] = -a[j] - a[j + 1]; 459 a[j] -= a[j + 1]; 460 } 461 a[n - 1] = -xr; 462 } 463 } 464 465 466 static void dfct(int n, float *a, float *t, int *ip, float *w) 467 { 468 int j, k, l, m, mh, nw, nc; 469 float xr, xi, yr, yi; 470 471 nw = ip[0]; 472 if (n > (nw << 3)) { 473 nw = n >> 3; 474 makewt(nw, ip, w); 475 } 476 nc = ip[1]; 477 if (n > (nc << 1)) { 478 nc = n >> 1; 479 makect(nc, ip, w + nw); 480 } 481 m = n >> 1; 482 yi = a[m]; 483 xi = a[0] + a[n]; 484 a[0] -= a[n]; 485 t[0] = xi - yi; 486 t[m] = xi + yi; 487 if (n > 2) { 488 mh = m >> 1; 489 for (j = 1; j < mh; j++) { 490 k = m - j; 491 xr = a[j] - a[n - j]; 492 xi = a[j] + a[n - j]; 493 yr = a[k] - a[n - k]; 494 yi = a[k] + a[n - k]; 495 a[j] = xr; 496 a[k] = yr; 497 t[j] = xi - yi; 498 t[k] = xi + yi; 499 } 500 t[mh] = a[mh] + a[n - mh]; 501 a[mh] -= a[n - mh]; 502 dctsub(m, a, nc, w + nw); 503 if (m > 4) { 504 bitrv2(m, ip + 2, a); 505 cftfsub(m, a, w); 506 rftfsub(m, a, nc, w + nw); 507 } else if (m == 4) { 508 cftfsub(m, a, w); 509 } 510 a[n - 1] = a[0] - a[1]; 511 a[1] = a[0] + a[1]; 512 for (j = m - 2; j >= 2; j -= 2) { 513 a[2 * j + 1] = a[j] + a[j + 1]; 514 a[2 * j - 1] = a[j] - a[j + 1]; 515 } 516 l = 2; 517 m = mh; 518 while (m >= 2) { 519 dctsub(m, t, nc, w + nw); 520 if (m > 4) { 521 bitrv2(m, ip + 2, t); 522 cftfsub(m, t, w); 523 rftfsub(m, t, nc, w + nw); 524 } else if (m == 4) { 525 cftfsub(m, t, w); 526 } 527 a[n - l] = t[0] - t[1]; 528 a[l] = t[0] + t[1]; 529 k = 0; 530 for (j = 2; j < m; j += 2) { 531 k += l << 2; 532 a[k - l] = t[j] - t[j + 1]; 533 a[k + l] = t[j] + t[j + 1]; 534 } 535 l <<= 1; 536 mh = m >> 1; 537 for (j = 0; j < mh; j++) { 538 k = m - j; 539 t[j] = t[m + k] - t[m + j]; 540 t[k] = t[m + k] + t[m + j]; 541 } 542 t[mh] = t[m + mh]; 543 m = mh; 544 } 545 a[l] = t[0]; 546 a[n] = t[2] - t[1]; 547 a[0] = t[2] + t[1]; 548 } else { 549 a[1] = a[0]; 550 a[2] = t[0]; 551 a[0] = t[1]; 552 } 553 } 554 555 static void dfst(int n, float *a, float *t, int *ip, float *w) 556 { 557 int j, k, l, m, mh, nw, nc; 558 float xr, xi, yr, yi; 559 560 nw = ip[0]; 561 if (n > (nw << 3)) { 562 nw = n >> 3; 563 makewt(nw, ip, w); 564 } 565 nc = ip[1]; 566 if (n > (nc << 1)) { 567 nc = n >> 1; 568 makect(nc, ip, w + nw); 569 } 570 if (n > 2) { 571 m = n >> 1; 572 mh = m >> 1; 573 for (j = 1; j < mh; j++) { 574 k = m - j; 575 xr = a[j] + a[n - j]; 576 xi = a[j] - a[n - j]; 577 yr = a[k] + a[n - k]; 578 yi = a[k] - a[n - k]; 579 a[j] = xr; 580 a[k] = yr; 581 t[j] = xi + yi; 582 t[k] = xi - yi; 583 } 584 t[0] = a[mh] - a[n - mh]; 585 a[mh] += a[n - mh]; 586 a[0] = a[m]; 587 dstsub(m, a, nc, w + nw); 588 if (m > 4) { 589 bitrv2(m, ip + 2, a); 590 cftfsub(m, a, w); 591 rftfsub(m, a, nc, w + nw); 592 } else if (m == 4) { 593 cftfsub(m, a, w); 594 } 595 a[n - 1] = a[1] - a[0]; 596 a[1] = a[0] + a[1]; 597 for (j = m - 2; j >= 2; j -= 2) { 598 a[2 * j + 1] = a[j] - a[j + 1]; 599 a[2 * j - 1] = -a[j] - a[j + 1]; 600 } 601 l = 2; 602 m = mh; 603 while (m >= 2) { 604 dstsub(m, t, nc, w + nw); 605 if (m > 4) { 606 bitrv2(m, ip + 2, t); 607 cftfsub(m, t, w); 608 rftfsub(m, t, nc, w + nw); 609 } else if (m == 4) { 610 cftfsub(m, t, w); 611 } 612 a[n - l] = t[1] - t[0]; 613 a[l] = t[0] + t[1]; 614 k = 0; 615 for (j = 2; j < m; j += 2) { 616 k += l << 2; 617 a[k - l] = -t[j] - t[j + 1]; 618 a[k + l] = t[j] - t[j + 1]; 619 } 620 l <<= 1; 621 mh = m >> 1; 622 for (j = 1; j < mh; j++) { 623 k = m - j; 624 t[j] = t[m + k] + t[m + j]; 625 t[k] = t[m + k] - t[m + j]; 626 } 627 t[0] = t[m + mh]; 628 m = mh; 629 } 630 a[l] = t[0]; 631 } 632 a[0] = 0; 633 } 634 #endif // Not used. 635 636 637 /* -------- initializing routines -------- */ 638 639 640 #include <math.h> 641 642 static void makewt(int nw, int *ip, float *w) 643 { 644 int j, nwh; 645 float delta, x, y; 646 647 ip[0] = nw; 648 ip[1] = 1; 649 if (nw > 2) { 650 nwh = nw >> 1; 651 delta = (float)atan(1.0f) / nwh; 652 w[0] = 1; 653 w[1] = 0; 654 w[nwh] = (float)cos(delta * nwh); 655 w[nwh + 1] = w[nwh]; 656 if (nwh > 2) { 657 for (j = 2; j < nwh; j += 2) { 658 x = (float)cos(delta * j); 659 y = (float)sin(delta * j); 660 w[j] = x; 661 w[j + 1] = y; 662 w[nw - j] = y; 663 w[nw - j + 1] = x; 664 } 665 bitrv2(nw, ip + 2, w); 666 } 667 } 668 } 669 670 671 static void makect(int nc, int *ip, float *c) 672 { 673 int j, nch; 674 float delta; 675 676 ip[1] = nc; 677 if (nc > 1) { 678 nch = nc >> 1; 679 delta = (float)atan(1.0f) / nch; 680 c[0] = (float)cos(delta * nch); 681 c[nch] = 0.5f * c[0]; 682 for (j = 1; j < nch; j++) { 683 c[j] = 0.5f * (float)cos(delta * j); 684 c[nc - j] = 0.5f * (float)sin(delta * j); 685 } 686 } 687 } 688 689 690 /* -------- child routines -------- */ 691 692 693 static void bitrv2(int n, int *ip, float *a) 694 { 695 int j, j1, k, k1, l, m, m2; 696 float xr, xi, yr, yi; 697 698 ip[0] = 0; 699 l = n; 700 m = 1; 701 while ((m << 3) < l) { 702 l >>= 1; 703 for (j = 0; j < m; j++) { 704 ip[m + j] = ip[j] + l; 705 } 706 m <<= 1; 707 } 708 m2 = 2 * m; 709 if ((m << 3) == l) { 710 for (k = 0; k < m; k++) { 711 for (j = 0; j < k; j++) { 712 j1 = 2 * j + ip[k]; 713 k1 = 2 * k + ip[j]; 714 xr = a[j1]; 715 xi = a[j1 + 1]; 716 yr = a[k1]; 717 yi = a[k1 + 1]; 718 a[j1] = yr; 719 a[j1 + 1] = yi; 720 a[k1] = xr; 721 a[k1 + 1] = xi; 722 j1 += m2; 723 k1 += 2 * m2; 724 xr = a[j1]; 725 xi = a[j1 + 1]; 726 yr = a[k1]; 727 yi = a[k1 + 1]; 728 a[j1] = yr; 729 a[j1 + 1] = yi; 730 a[k1] = xr; 731 a[k1 + 1] = xi; 732 j1 += m2; 733 k1 -= m2; 734 xr = a[j1]; 735 xi = a[j1 + 1]; 736 yr = a[k1]; 737 yi = a[k1 + 1]; 738 a[j1] = yr; 739 a[j1 + 1] = yi; 740 a[k1] = xr; 741 a[k1 + 1] = xi; 742 j1 += m2; 743 k1 += 2 * m2; 744 xr = a[j1]; 745 xi = a[j1 + 1]; 746 yr = a[k1]; 747 yi = a[k1 + 1]; 748 a[j1] = yr; 749 a[j1 + 1] = yi; 750 a[k1] = xr; 751 a[k1 + 1] = xi; 752 } 753 j1 = 2 * k + m2 + ip[k]; 754 k1 = j1 + m2; 755 xr = a[j1]; 756 xi = a[j1 + 1]; 757 yr = a[k1]; 758 yi = a[k1 + 1]; 759 a[j1] = yr; 760 a[j1 + 1] = yi; 761 a[k1] = xr; 762 a[k1 + 1] = xi; 763 } 764 } else { 765 for (k = 1; k < m; k++) { 766 for (j = 0; j < k; j++) { 767 j1 = 2 * j + ip[k]; 768 k1 = 2 * k + ip[j]; 769 xr = a[j1]; 770 xi = a[j1 + 1]; 771 yr = a[k1]; 772 yi = a[k1 + 1]; 773 a[j1] = yr; 774 a[j1 + 1] = yi; 775 a[k1] = xr; 776 a[k1 + 1] = xi; 777 j1 += m2; 778 k1 += m2; 779 xr = a[j1]; 780 xi = a[j1 + 1]; 781 yr = a[k1]; 782 yi = a[k1 + 1]; 783 a[j1] = yr; 784 a[j1 + 1] = yi; 785 a[k1] = xr; 786 a[k1 + 1] = xi; 787 } 788 } 789 } 790 } 791 792 793 static void bitrv2conj(int n, int *ip, float *a) 794 { 795 int j, j1, k, k1, l, m, m2; 796 float xr, xi, yr, yi; 797 798 ip[0] = 0; 799 l = n; 800 m = 1; 801 while ((m << 3) < l) { 802 l >>= 1; 803 for (j = 0; j < m; j++) { 804 ip[m + j] = ip[j] + l; 805 } 806 m <<= 1; 807 } 808 m2 = 2 * m; 809 if ((m << 3) == l) { 810 for (k = 0; k < m; k++) { 811 for (j = 0; j < k; j++) { 812 j1 = 2 * j + ip[k]; 813 k1 = 2 * k + ip[j]; 814 xr = a[j1]; 815 xi = -a[j1 + 1]; 816 yr = a[k1]; 817 yi = -a[k1 + 1]; 818 a[j1] = yr; 819 a[j1 + 1] = yi; 820 a[k1] = xr; 821 a[k1 + 1] = xi; 822 j1 += m2; 823 k1 += 2 * m2; 824 xr = a[j1]; 825 xi = -a[j1 + 1]; 826 yr = a[k1]; 827 yi = -a[k1 + 1]; 828 a[j1] = yr; 829 a[j1 + 1] = yi; 830 a[k1] = xr; 831 a[k1 + 1] = xi; 832 j1 += m2; 833 k1 -= m2; 834 xr = a[j1]; 835 xi = -a[j1 + 1]; 836 yr = a[k1]; 837 yi = -a[k1 + 1]; 838 a[j1] = yr; 839 a[j1 + 1] = yi; 840 a[k1] = xr; 841 a[k1 + 1] = xi; 842 j1 += m2; 843 k1 += 2 * m2; 844 xr = a[j1]; 845 xi = -a[j1 + 1]; 846 yr = a[k1]; 847 yi = -a[k1 + 1]; 848 a[j1] = yr; 849 a[j1 + 1] = yi; 850 a[k1] = xr; 851 a[k1 + 1] = xi; 852 } 853 k1 = 2 * k + ip[k]; 854 a[k1 + 1] = -a[k1 + 1]; 855 j1 = k1 + m2; 856 k1 = j1 + m2; 857 xr = a[j1]; 858 xi = -a[j1 + 1]; 859 yr = a[k1]; 860 yi = -a[k1 + 1]; 861 a[j1] = yr; 862 a[j1 + 1] = yi; 863 a[k1] = xr; 864 a[k1 + 1] = xi; 865 k1 += m2; 866 a[k1 + 1] = -a[k1 + 1]; 867 } 868 } else { 869 a[1] = -a[1]; 870 a[m2 + 1] = -a[m2 + 1]; 871 for (k = 1; k < m; k++) { 872 for (j = 0; j < k; j++) { 873 j1 = 2 * j + ip[k]; 874 k1 = 2 * k + ip[j]; 875 xr = a[j1]; 876 xi = -a[j1 + 1]; 877 yr = a[k1]; 878 yi = -a[k1 + 1]; 879 a[j1] = yr; 880 a[j1 + 1] = yi; 881 a[k1] = xr; 882 a[k1 + 1] = xi; 883 j1 += m2; 884 k1 += m2; 885 xr = a[j1]; 886 xi = -a[j1 + 1]; 887 yr = a[k1]; 888 yi = -a[k1 + 1]; 889 a[j1] = yr; 890 a[j1 + 1] = yi; 891 a[k1] = xr; 892 a[k1 + 1] = xi; 893 } 894 k1 = 2 * k + ip[k]; 895 a[k1 + 1] = -a[k1 + 1]; 896 a[k1 + m2 + 1] = -a[k1 + m2 + 1]; 897 } 898 } 899 } 900 901 902 static void cftfsub(int n, float *a, float *w) 903 { 904 int j, j1, j2, j3, l; 905 float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; 906 907 l = 2; 908 if (n > 8) { 909 cft1st(n, a, w); 910 l = 8; 911 while ((l << 2) < n) { 912 cftmdl(n, l, a, w); 913 l <<= 2; 914 } 915 } 916 if ((l << 2) == n) { 917 for (j = 0; j < l; j += 2) { 918 j1 = j + l; 919 j2 = j1 + l; 920 j3 = j2 + l; 921 x0r = a[j] + a[j1]; 922 x0i = a[j + 1] + a[j1 + 1]; 923 x1r = a[j] - a[j1]; 924 x1i = a[j + 1] - a[j1 + 1]; 925 x2r = a[j2] + a[j3]; 926 x2i = a[j2 + 1] + a[j3 + 1]; 927 x3r = a[j2] - a[j3]; 928 x3i = a[j2 + 1] - a[j3 + 1]; 929 a[j] = x0r + x2r; 930 a[j + 1] = x0i + x2i; 931 a[j2] = x0r - x2r; 932 a[j2 + 1] = x0i - x2i; 933 a[j1] = x1r - x3i; 934 a[j1 + 1] = x1i + x3r; 935 a[j3] = x1r + x3i; 936 a[j3 + 1] = x1i - x3r; 937 } 938 } else { 939 for (j = 0; j < l; j += 2) { 940 j1 = j + l; 941 x0r = a[j] - a[j1]; 942 x0i = a[j + 1] - a[j1 + 1]; 943 a[j] += a[j1]; 944 a[j + 1] += a[j1 + 1]; 945 a[j1] = x0r; 946 a[j1 + 1] = x0i; 947 } 948 } 949 } 950 951 952 static void cftbsub(int n, float *a, float *w) 953 { 954 int j, j1, j2, j3, l; 955 float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; 956 957 l = 2; 958 if (n > 8) { 959 cft1st(n, a, w); 960 l = 8; 961 while ((l << 2) < n) { 962 cftmdl(n, l, a, w); 963 l <<= 2; 964 } 965 } 966 if ((l << 2) == n) { 967 for (j = 0; j < l; j += 2) { 968 j1 = j + l; 969 j2 = j1 + l; 970 j3 = j2 + l; 971 x0r = a[j] + a[j1]; 972 x0i = -a[j + 1] - a[j1 + 1]; 973 x1r = a[j] - a[j1]; 974 x1i = -a[j + 1] + a[j1 + 1]; 975 x2r = a[j2] + a[j3]; 976 x2i = a[j2 + 1] + a[j3 + 1]; 977 x3r = a[j2] - a[j3]; 978 x3i = a[j2 + 1] - a[j3 + 1]; 979 a[j] = x0r + x2r; 980 a[j + 1] = x0i - x2i; 981 a[j2] = x0r - x2r; 982 a[j2 + 1] = x0i + x2i; 983 a[j1] = x1r - x3i; 984 a[j1 + 1] = x1i - x3r; 985 a[j3] = x1r + x3i; 986 a[j3 + 1] = x1i + x3r; 987 } 988 } else { 989 for (j = 0; j < l; j += 2) { 990 j1 = j + l; 991 x0r = a[j] - a[j1]; 992 x0i = -a[j + 1] + a[j1 + 1]; 993 a[j] += a[j1]; 994 a[j + 1] = -a[j + 1] - a[j1 + 1]; 995 a[j1] = x0r; 996 a[j1 + 1] = x0i; 997 } 998 } 999 } 1000 1001 1002 static void cft1st(int n, float *a, float *w) 1003 { 1004 int j, k1, k2; 1005 float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i; 1006 float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; 1007 1008 x0r = a[0] + a[2]; 1009 x0i = a[1] + a[3]; 1010 x1r = a[0] - a[2]; 1011 x1i = a[1] - a[3]; 1012 x2r = a[4] + a[6]; 1013 x2i = a[5] + a[7]; 1014 x3r = a[4] - a[6]; 1015 x3i = a[5] - a[7]; 1016 a[0] = x0r + x2r; 1017 a[1] = x0i + x2i; 1018 a[4] = x0r - x2r; 1019 a[5] = x0i - x2i; 1020 a[2] = x1r - x3i; 1021 a[3] = x1i + x3r; 1022 a[6] = x1r + x3i; 1023 a[7] = x1i - x3r; 1024 wk1r = w[2]; 1025 x0r = a[8] + a[10]; 1026 x0i = a[9] + a[11]; 1027 x1r = a[8] - a[10]; 1028 x1i = a[9] - a[11]; 1029 x2r = a[12] + a[14]; 1030 x2i = a[13] + a[15]; 1031 x3r = a[12] - a[14]; 1032 x3i = a[13] - a[15]; 1033 a[8] = x0r + x2r; 1034 a[9] = x0i + x2i; 1035 a[12] = x2i - x0i; 1036 a[13] = x0r - x2r; 1037 x0r = x1r - x3i; 1038 x0i = x1i + x3r; 1039 a[10] = wk1r * (x0r - x0i); 1040 a[11] = wk1r * (x0r + x0i); 1041 x0r = x3i + x1r; 1042 x0i = x3r - x1i; 1043 a[14] = wk1r * (x0i - x0r); 1044 a[15] = wk1r * (x0i + x0r); 1045 k1 = 0; 1046 for (j = 16; j < n; j += 16) { 1047 k1 += 2; 1048 k2 = 2 * k1; 1049 wk2r = w[k1]; 1050 wk2i = w[k1 + 1]; 1051 wk1r = w[k2]; 1052 wk1i = w[k2 + 1]; 1053 wk3r = wk1r - 2 * wk2i * wk1i; 1054 wk3i = 2 * wk2i * wk1r - wk1i; 1055 x0r = a[j] + a[j + 2]; 1056 x0i = a[j + 1] + a[j + 3]; 1057 x1r = a[j] - a[j + 2]; 1058 x1i = a[j + 1] - a[j + 3]; 1059 x2r = a[j + 4] + a[j + 6]; 1060 x2i = a[j + 5] + a[j + 7]; 1061 x3r = a[j + 4] - a[j + 6]; 1062 x3i = a[j + 5] - a[j + 7]; 1063 a[j] = x0r + x2r; 1064 a[j + 1] = x0i + x2i; 1065 x0r -= x2r; 1066 x0i -= x2i; 1067 a[j + 4] = wk2r * x0r - wk2i * x0i; 1068 a[j + 5] = wk2r * x0i + wk2i * x0r; 1069 x0r = x1r - x3i; 1070 x0i = x1i + x3r; 1071 a[j + 2] = wk1r * x0r - wk1i * x0i; 1072 a[j + 3] = wk1r * x0i + wk1i * x0r; 1073 x0r = x1r + x3i; 1074 x0i = x1i - x3r; 1075 a[j + 6] = wk3r * x0r - wk3i * x0i; 1076 a[j + 7] = wk3r * x0i + wk3i * x0r; 1077 wk1r = w[k2 + 2]; 1078 wk1i = w[k2 + 3]; 1079 wk3r = wk1r - 2 * wk2r * wk1i; 1080 wk3i = 2 * wk2r * wk1r - wk1i; 1081 x0r = a[j + 8] + a[j + 10]; 1082 x0i = a[j + 9] + a[j + 11]; 1083 x1r = a[j + 8] - a[j + 10]; 1084 x1i = a[j + 9] - a[j + 11]; 1085 x2r = a[j + 12] + a[j + 14]; 1086 x2i = a[j + 13] + a[j + 15]; 1087 x3r = a[j + 12] - a[j + 14]; 1088 x3i = a[j + 13] - a[j + 15]; 1089 a[j + 8] = x0r + x2r; 1090 a[j + 9] = x0i + x2i; 1091 x0r -= x2r; 1092 x0i -= x2i; 1093 a[j + 12] = -wk2i * x0r - wk2r * x0i; 1094 a[j + 13] = -wk2i * x0i + wk2r * x0r; 1095 x0r = x1r - x3i; 1096 x0i = x1i + x3r; 1097 a[j + 10] = wk1r * x0r - wk1i * x0i; 1098 a[j + 11] = wk1r * x0i + wk1i * x0r; 1099 x0r = x1r + x3i; 1100 x0i = x1i - x3r; 1101 a[j + 14] = wk3r * x0r - wk3i * x0i; 1102 a[j + 15] = wk3r * x0i + wk3i * x0r; 1103 } 1104 } 1105 1106 1107 static void cftmdl(int n, int l, float *a, float *w) 1108 { 1109 int j, j1, j2, j3, k, k1, k2, m, m2; 1110 float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i; 1111 float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; 1112 1113 m = l << 2; 1114 for (j = 0; j < l; j += 2) { 1115 j1 = j + l; 1116 j2 = j1 + l; 1117 j3 = j2 + l; 1118 x0r = a[j] + a[j1]; 1119 x0i = a[j + 1] + a[j1 + 1]; 1120 x1r = a[j] - a[j1]; 1121 x1i = a[j + 1] - a[j1 + 1]; 1122 x2r = a[j2] + a[j3]; 1123 x2i = a[j2 + 1] + a[j3 + 1]; 1124 x3r = a[j2] - a[j3]; 1125 x3i = a[j2 + 1] - a[j3 + 1]; 1126 a[j] = x0r + x2r; 1127 a[j + 1] = x0i + x2i; 1128 a[j2] = x0r - x2r; 1129 a[j2 + 1] = x0i - x2i; 1130 a[j1] = x1r - x3i; 1131 a[j1 + 1] = x1i + x3r; 1132 a[j3] = x1r + x3i; 1133 a[j3 + 1] = x1i - x3r; 1134 } 1135 wk1r = w[2]; 1136 for (j = m; j < l + m; j += 2) { 1137 j1 = j + l; 1138 j2 = j1 + l; 1139 j3 = j2 + l; 1140 x0r = a[j] + a[j1]; 1141 x0i = a[j + 1] + a[j1 + 1]; 1142 x1r = a[j] - a[j1]; 1143 x1i = a[j + 1] - a[j1 + 1]; 1144 x2r = a[j2] + a[j3]; 1145 x2i = a[j2 + 1] + a[j3 + 1]; 1146 x3r = a[j2] - a[j3]; 1147 x3i = a[j2 + 1] - a[j3 + 1]; 1148 a[j] = x0r + x2r; 1149 a[j + 1] = x0i + x2i; 1150 a[j2] = x2i - x0i; 1151 a[j2 + 1] = x0r - x2r; 1152 x0r = x1r - x3i; 1153 x0i = x1i + x3r; 1154 a[j1] = wk1r * (x0r - x0i); 1155 a[j1 + 1] = wk1r * (x0r + x0i); 1156 x0r = x3i + x1r; 1157 x0i = x3r - x1i; 1158 a[j3] = wk1r * (x0i - x0r); 1159 a[j3 + 1] = wk1r * (x0i + x0r); 1160 } 1161 k1 = 0; 1162 m2 = 2 * m; 1163 for (k = m2; k < n; k += m2) { 1164 k1 += 2; 1165 k2 = 2 * k1; 1166 wk2r = w[k1]; 1167 wk2i = w[k1 + 1]; 1168 wk1r = w[k2]; 1169 wk1i = w[k2 + 1]; 1170 wk3r = wk1r - 2 * wk2i * wk1i; 1171 wk3i = 2 * wk2i * wk1r - wk1i; 1172 for (j = k; j < l + k; j += 2) { 1173 j1 = j + l; 1174 j2 = j1 + l; 1175 j3 = j2 + l; 1176 x0r = a[j] + a[j1]; 1177 x0i = a[j + 1] + a[j1 + 1]; 1178 x1r = a[j] - a[j1]; 1179 x1i = a[j + 1] - a[j1 + 1]; 1180 x2r = a[j2] + a[j3]; 1181 x2i = a[j2 + 1] + a[j3 + 1]; 1182 x3r = a[j2] - a[j3]; 1183 x3i = a[j2 + 1] - a[j3 + 1]; 1184 a[j] = x0r + x2r; 1185 a[j + 1] = x0i + x2i; 1186 x0r -= x2r; 1187 x0i -= x2i; 1188 a[j2] = wk2r * x0r - wk2i * x0i; 1189 a[j2 + 1] = wk2r * x0i + wk2i * x0r; 1190 x0r = x1r - x3i; 1191 x0i = x1i + x3r; 1192 a[j1] = wk1r * x0r - wk1i * x0i; 1193 a[j1 + 1] = wk1r * x0i + wk1i * x0r; 1194 x0r = x1r + x3i; 1195 x0i = x1i - x3r; 1196 a[j3] = wk3r * x0r - wk3i * x0i; 1197 a[j3 + 1] = wk3r * x0i + wk3i * x0r; 1198 } 1199 wk1r = w[k2 + 2]; 1200 wk1i = w[k2 + 3]; 1201 wk3r = wk1r - 2 * wk2r * wk1i; 1202 wk3i = 2 * wk2r * wk1r - wk1i; 1203 for (j = k + m; j < l + (k + m); j += 2) { 1204 j1 = j + l; 1205 j2 = j1 + l; 1206 j3 = j2 + l; 1207 x0r = a[j] + a[j1]; 1208 x0i = a[j + 1] + a[j1 + 1]; 1209 x1r = a[j] - a[j1]; 1210 x1i = a[j + 1] - a[j1 + 1]; 1211 x2r = a[j2] + a[j3]; 1212 x2i = a[j2 + 1] + a[j3 + 1]; 1213 x3r = a[j2] - a[j3]; 1214 x3i = a[j2 + 1] - a[j3 + 1]; 1215 a[j] = x0r + x2r; 1216 a[j + 1] = x0i + x2i; 1217 x0r -= x2r; 1218 x0i -= x2i; 1219 a[j2] = -wk2i * x0r - wk2r * x0i; 1220 a[j2 + 1] = -wk2i * x0i + wk2r * x0r; 1221 x0r = x1r - x3i; 1222 x0i = x1i + x3r; 1223 a[j1] = wk1r * x0r - wk1i * x0i; 1224 a[j1 + 1] = wk1r * x0i + wk1i * x0r; 1225 x0r = x1r + x3i; 1226 x0i = x1i - x3r; 1227 a[j3] = wk3r * x0r - wk3i * x0i; 1228 a[j3 + 1] = wk3r * x0i + wk3i * x0r; 1229 } 1230 } 1231 } 1232 1233 1234 static void rftfsub(int n, float *a, int nc, float *c) 1235 { 1236 int j, k, kk, ks, m; 1237 float wkr, wki, xr, xi, yr, yi; 1238 1239 m = n >> 1; 1240 ks = 2 * nc / m; 1241 kk = 0; 1242 for (j = 2; j < m; j += 2) { 1243 k = n - j; 1244 kk += ks; 1245 wkr = 0.5f - c[nc - kk]; 1246 wki = c[kk]; 1247 xr = a[j] - a[k]; 1248 xi = a[j + 1] + a[k + 1]; 1249 yr = wkr * xr - wki * xi; 1250 yi = wkr * xi + wki * xr; 1251 a[j] -= yr; 1252 a[j + 1] -= yi; 1253 a[k] += yr; 1254 a[k + 1] -= yi; 1255 } 1256 } 1257 1258 1259 static void rftbsub(int n, float *a, int nc, float *c) 1260 { 1261 int j, k, kk, ks, m; 1262 float wkr, wki, xr, xi, yr, yi; 1263 1264 a[1] = -a[1]; 1265 m = n >> 1; 1266 ks = 2 * nc / m; 1267 kk = 0; 1268 for (j = 2; j < m; j += 2) { 1269 k = n - j; 1270 kk += ks; 1271 wkr = 0.5f - c[nc - kk]; 1272 wki = c[kk]; 1273 xr = a[j] - a[k]; 1274 xi = a[j + 1] + a[k + 1]; 1275 yr = wkr * xr + wki * xi; 1276 yi = wkr * xi - wki * xr; 1277 a[j] -= yr; 1278 a[j + 1] = yi - a[j + 1]; 1279 a[k] += yr; 1280 a[k + 1] = yi - a[k + 1]; 1281 } 1282 a[m + 1] = -a[m + 1]; 1283 } 1284 1285 #if 0 // Not used. 1286 static void dctsub(int n, float *a, int nc, float *c) 1287 { 1288 int j, k, kk, ks, m; 1289 float wkr, wki, xr; 1290 1291 m = n >> 1; 1292 ks = nc / n; 1293 kk = 0; 1294 for (j = 1; j < m; j++) { 1295 k = n - j; 1296 kk += ks; 1297 wkr = c[kk] - c[nc - kk]; 1298 wki = c[kk] + c[nc - kk]; 1299 xr = wki * a[j] - wkr * a[k]; 1300 a[j] = wkr * a[j] + wki * a[k]; 1301 a[k] = xr; 1302 } 1303 a[m] *= c[0]; 1304 } 1305 1306 1307 static void dstsub(int n, float *a, int nc, float *c) 1308 { 1309 int j, k, kk, ks, m; 1310 float wkr, wki, xr; 1311 1312 m = n >> 1; 1313 ks = nc / n; 1314 kk = 0; 1315 for (j = 1; j < m; j++) { 1316 k = n - j; 1317 kk += ks; 1318 wkr = c[kk] - c[nc - kk]; 1319 wki = c[kk] + c[nc - kk]; 1320 xr = wki * a[k] - wkr * a[j]; 1321 a[k] = wkr * a[k] + wki * a[j]; 1322 a[j] = xr; 1323 } 1324 a[m] *= c[0]; 1325 } 1326 #endif // Not used. 1327