300 void cdft2d(
int n1,
int n2,
int isgn,
double **a,
int *ip,
double *w)
302 void makewt(
int nw,
int *ip,
double *w);
303 void bitrv2col(
int n1,
int n,
int *ip,
double **a);
304 void bitrv2row(
int n,
int n2,
int *ip,
double **a);
305 void cftbcol(
int n1,
int n,
double **a,
double *w);
306 void cftbrow(
int n,
int n2,
double **a,
double *w);
307 void cftfcol(
int n1,
int n,
double **a,
double *w);
308 void cftfrow(
int n,
int n2,
double **a,
double *w);
315 if (n > (ip[0] << 2)) {
316 makewt(n >> 2, ip, w);
319 bitrv2col(n1, n2, ip + 2, a);
322 bitrv2row(n1, n2, ip + 2, a);
325 cftfcol(n1, n2, a, w);
326 cftfrow(n1, n2, a, w);
328 cftbcol(n1, n2, a, w);
329 cftbrow(n1, n2, a, w);
334 void rdft2d(
int n1,
int n2,
int isgn,
double **a,
int *ip,
double *w)
336 void makewt(
int nw,
int *ip,
double *w);
337 void makect(
int nc,
int *ip,
double *c);
338 void bitrv2col(
int n1,
int n,
int *ip,
double **a);
339 void bitrv2row(
int n,
int n2,
int *ip,
double **a);
340 void cftbcol(
int n1,
int n,
double **a,
double *w);
341 void cftbrow(
int n,
int n2,
double **a,
double *w);
342 void cftfcol(
int n1,
int n,
double **a,
double *w);
343 void cftfrow(
int n,
int n2,
double **a,
double *w);
344 void rftbcol(
int n1,
int n,
double **a,
int nc,
double *c);
345 void rftfcol(
int n1,
int n,
double **a,
int nc,
double *c);
346 int n, nw, nc, n1h, i, j;
359 if (n2 > (nc << 2)) {
361 makect(nc, ip, w + nw);
365 for (i = 1; i <= n1h - 1; i++) {
367 xi = a[i][0] - a[j][0];
370 xi = a[j][1] - a[i][1];
375 bitrv2row(n1, n2, ip + 2, a);
377 cftfrow(n1, n2, a, w);
378 for (i = 0; i <= n1 - 1; i++) {
379 a[i][1] = 0.5 * (a[i][0] - a[i][1]);
383 rftfcol(n1, n2, a, nc, w + nw);
384 bitrv2col(n1, n2, ip + 2, a);
386 cftfcol(n1, n2, a, w);
389 bitrv2col(n1, n2, ip + 2, a);
391 cftbcol(n1, n2, a, w);
393 rftbcol(n1, n2, a, nc, w + nw);
395 for (i = 0; i <= n1 - 1; i++) {
396 xi = a[i][0] - a[i][1];
401 bitrv2row(n1, n2, ip + 2, a);
403 cftbrow(n1, n2, a, w);
404 for (i = 1; i <= n1h - 1; i++) {
406 a[j][0] = 0.5 * (a[i][0] - a[j][0]);
408 a[j][1] = 0.5 * (a[i][1] + a[j][1]);
415 void ddct2d(
int n1,
int n2,
int isgn,
double **a,
double **t,
418 void makewt(
int nw,
int *ip,
double *w);
419 void makect(
int nc,
int *ip,
double *c);
420 void bitrv2col(
int n1,
int n,
int *ip,
double **a);
421 void bitrv2row(
int n,
int n2,
int *ip,
double **a);
422 void cftbcol(
int n1,
int n,
double **a,
double *w);
423 void cftbrow(
int n,
int n2,
double **a,
double *w);
424 void cftfcol(
int n1,
int n,
double **a,
double *w);
425 void cftfrow(
int n,
int n2,
double **a,
double *w);
426 void rftbcol(
int n1,
int n,
double **a,
int nc,
double *c);
427 void rftfcol(
int n1,
int n,
double **a,
int nc,
double *c);
428 void dctbsub(
int n1,
int n2,
double **a,
int nc,
double *c);
429 void dctfsub(
int n1,
int n2,
double **a,
int nc,
double *c);
430 int n, nw, nc, n1h, n2h, i, ix, ic, j, jx, jc;
443 if (n1 > nc || n2 > nc) {
449 makect(nc, ip, w + nw);
454 for (i = 0; i <= n1 - 1; i++) {
455 for (j = 1; j <= n2h - 1; j++) {
458 t[i][jx + 1] = a[i][n2 - j];
463 t[n1h][0] = a[n1h][0];
464 t[n1h][1] = a[n1h][n2h];
465 for (i = 1; i <= n1h - 1; i++) {
468 t[ic][1] = a[i][n2h];
470 t[ic][0] = a[ic][n2h];
472 dctfsub(n1, n2, t, nc, w + nw);
474 bitrv2row(n1, n2, ip + 2, t);
476 cftfrow(n1, n2, t, w);
477 for (i = 0; i <= n1 - 1; i++) {
478 t[i][1] = 0.5 * (t[i][0] - t[i][1]);
482 rftfcol(n1, n2, t, nc, w + nw);
483 bitrv2col(n1, n2, ip + 2, t);
485 cftfcol(n1, n2, t, w);
486 for (i = 0; i <= n1h - 1; i++) {
489 for (j = 0; j <= n2h - 1; j++) {
493 a[ix][jx + 1] = t[i][jc];
494 a[ix + 1][jx] = t[ic][j];
495 a[ix + 1][jx + 1] = t[ic][jc];
499 for (i = 0; i <= n1h - 1; i++) {
502 for (j = 0; j <= n2h - 1; j++) {
506 t[i][jc] = a[ix][jx + 1];
507 t[ic][j] = a[ix + 1][jx];
508 t[ic][jc] = a[ix + 1][jx + 1];
512 bitrv2col(n1, n2, ip + 2, t);
514 cftbcol(n1, n2, t, w);
516 rftbcol(n1, n2, t, nc, w + nw);
518 for (i = 0; i <= n1 - 1; i++) {
519 xi = t[i][0] - t[i][1];
524 bitrv2row(n1, n2, ip + 2, t);
526 cftbrow(n1, n2, t, w);
527 dctbsub(n1, n2, t, nc, w + nw);
528 for (i = 0; i <= n1 - 1; i++) {
529 for (j = 1; j <= n2h - 1; j++) {
532 a[i][n2 - j] = t[i][jx + 1];
537 a[n1h][0] = t[n1h][0];
538 a[n1h][n2h] = t[n1h][1];
539 for (i = 1; i <= n1h - 1; i++) {
542 a[i][n2h] = t[ic][1];
544 a[ic][n2h] = t[ic][0];
550 void ddst2d(
int n1,
int n2,
int isgn,
double **a,
double **t,
553 void makewt(
int nw,
int *ip,
double *w);
554 void makect(
int nc,
int *ip,
double *c);
555 void bitrv2col(
int n1,
int n,
int *ip,
double **a);
556 void bitrv2row(
int n,
int n2,
int *ip,
double **a);
557 void cftbcol(
int n1,
int n,
double **a,
double *w);
558 void cftbrow(
int n,
int n2,
double **a,
double *w);
559 void cftfcol(
int n1,
int n,
double **a,
double *w);
560 void cftfrow(
int n,
int n2,
double **a,
double *w);
561 void rftbcol(
int n1,
int n,
double **a,
int nc,
double *c);
562 void rftfcol(
int n1,
int n,
double **a,
int nc,
double *c);
563 void dstbsub(
int n1,
int n2,
double **a,
int nc,
double *c);
564 void dstfsub(
int n1,
int n2,
double **a,
int nc,
double *c);
565 int n, nw, nc, n1h, n2h, i, ix, ic, j, jx, jc;
578 if (n1 > nc || n2 > nc) {
584 makect(nc, ip, w + nw);
589 for (i = 0; i <= n1 - 1; i++) {
590 for (j = 1; j <= n2h - 1; j++) {
593 t[i][jx + 1] = a[i][n2 - j];
598 t[n1h][0] = a[n1h][0];
599 t[n1h][1] = a[n1h][n2h];
600 for (i = 1; i <= n1h - 1; i++) {
603 t[ic][1] = a[i][n2h];
605 t[ic][0] = a[ic][n2h];
607 dstfsub(n1, n2, t, nc, w + nw);
609 bitrv2row(n1, n2, ip + 2, t);
611 cftfrow(n1, n2, t, w);
612 for (i = 0; i <= n1 - 1; i++) {
613 t[i][1] = 0.5 * (t[i][0] - t[i][1]);
617 rftfcol(n1, n2, t, nc, w + nw);
618 bitrv2col(n1, n2, ip + 2, t);
620 cftfcol(n1, n2, t, w);
621 for (i = 0; i <= n1h - 1; i++) {
624 for (j = 0; j <= n2h - 1; j++) {
628 a[ix][jx + 1] = -t[i][jc];
629 a[ix + 1][jx] = -t[ic][j];
630 a[ix + 1][jx + 1] = t[ic][jc];
634 for (i = 0; i <= n1h - 1; i++) {
637 for (j = 0; j <= n2h - 1; j++) {
641 t[i][jc] = -a[ix][jx + 1];
642 t[ic][j] = -a[ix + 1][jx];
643 t[ic][jc] = a[ix + 1][jx + 1];
647 bitrv2col(n1, n2, ip + 2, t);
649 cftbcol(n1, n2, t, w);
651 rftbcol(n1, n2, t, nc, w + nw);
653 for (i = 0; i <= n1 - 1; i++) {
654 xi = t[i][0] - t[i][1];
659 bitrv2row(n1, n2, ip + 2, t);
661 cftbrow(n1, n2, t, w);
662 dstbsub(n1, n2, t, nc, w + nw);
663 for (i = 0; i <= n1 - 1; i++) {
664 for (j = 1; j <= n2h - 1; j++) {
667 a[i][n2 - j] = t[i][jx + 1];
672 a[n1h][0] = t[n1h][0];
673 a[n1h][n2h] = t[n1h][1];
674 for (i = 1; i <= n1h - 1; i++) {
677 a[i][n2h] = t[ic][1];
679 a[ic][n2h] = t[ic][0];
690 void makewt(
int nw,
int *ip,
double *w)
692 void bitrv2(
int n,
int *ip,
double *a);
700 delta = atan(1.0) / nwh;
703 w[nwh] = cos(delta * nwh);
705 for (j = 2; j <= nwh - 2; j += 2) {
713 bitrv2(nw, ip + 2, w);
718 void makect(
int nc,
int *ip,
double *c)
726 delta = atan(1.0) / nch;
728 c[nch] = 0.5 * cos(delta * nch);
729 for (j = 1; j <= nch - 1; j++) {
730 c[j] = 0.5 * cos(delta * j);
731 c[nc - j] = 0.5 * sin(delta * j);
740 void bitrv2(
int n,
int *ip,
double *a)
742 int j, j1, k, k1, l, m, m2;
748 while ((m << 2) < l) {
750 for (j = 0; j <= m - 1; j++) {
751 ip[m + j] = ip[j] + l;
756 for (k = 1; k <= m - 1; k++) {
757 for (j = 0; j <= k - 1; j++) {
758 j1 = (j << 1) + ip[k];
759 k1 = (k << 1) + ip[j];
763 a[j1 + 1] = a[k1 + 1];
770 for (k = 1; k <= m - 1; k++) {
771 for (j = 0; j <= k - 1; j++) {
772 j1 = (j << 1) + ip[k];
773 k1 = (k << 1) + ip[j];
777 a[j1 + 1] = a[k1 + 1];
785 a[j1 + 1] = a[k1 + 1];
794 void bitrv2col(
int n1,
int n,
int *ip,
double **a)
796 int i, j, j1, k, k1, l, m, m2;
802 while ((m << 2) < l) {
804 for (j = 0; j <= m - 1; j++) {
805 ip[m + j] = ip[j] + l;
810 for (i = 0; i <= n1 - 1; i++) {
811 for (k = 1; k <= m - 1; k++) {
812 for (j = 0; j <= k - 1; j++) {
813 j1 = (j << 1) + ip[k];
814 k1 = (k << 1) + ip[j];
818 a[i][j1 + 1] = a[i][k1 + 1];
826 for (i = 0; i <= n1 - 1; i++) {
827 for (k = 1; k <= m - 1; k++) {
828 for (j = 0; j <= k - 1; j++) {
829 j1 = (j << 1) + ip[k];
830 k1 = (k << 1) + ip[j];
834 a[i][j1 + 1] = a[i][k1 + 1];
842 a[i][j1 + 1] = a[i][k1 + 1];
852 void bitrv2row(
int n,
int n2,
int *ip,
double **a)
854 int i, j, j1, k, k1, l, m;
860 while ((m << 1) < l) {
862 for (j = 0; j <= m - 1; j++) {
863 ip[m + j] = ip[j] + l;
868 for (k = 1; k <= m - 1; k++) {
869 for (j = 0; j <= k - 1; j++) {
872 for (i = 0; i <= n2 - 2; i += 2) {
876 a[j1][i + 1] = a[k1][i + 1];
883 for (k = 1; k <= m - 1; k++) {
884 for (j = 0; j <= k - 1; j++) {
887 for (i = 0; i <= n2 - 2; i += 2) {
891 a[j1][i + 1] = a[k1][i + 1];
897 for (i = 0; i <= n2 - 2; i += 2) {
901 a[j1][i + 1] = a[k1][i + 1];
911 void cftbcol(
int n1,
int n,
double **a,
double *w)
913 int i, j, j1, j2, j3, k, k1, ks, l, m;
914 double wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
915 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
917 for (i = 0; i <= n1 - 1; i++) {
919 while ((l << 1) < n) {
921 for (j = 0; j <= l - 2; j += 2) {
925 x0r = a[i][j] + a[i][j1];
926 x0i = a[i][j + 1] + a[i][j1 + 1];
927 x1r = a[i][j] - a[i][j1];
928 x1i = a[i][j + 1] - a[i][j1 + 1];
929 x2r = a[i][j2] + a[i][j3];
930 x2i = a[i][j2 + 1] + a[i][j3 + 1];
931 x3r = a[i][j2] - a[i][j3];
932 x3i = a[i][j2 + 1] - a[i][j3 + 1];
934 a[i][j + 1] = x0i + x2i;
935 a[i][j2] = x0r - x2r;
936 a[i][j2 + 1] = x0i - x2i;
937 a[i][j1] = x1r - x3i;
938 a[i][j1 + 1] = x1i + x3r;
939 a[i][j3] = x1r + x3i;
940 a[i][j3 + 1] = x1i - x3r;
944 for (j = m; j <= l + m - 2; j += 2) {
948 x0r = a[i][j] + a[i][j1];
949 x0i = a[i][j + 1] + a[i][j1 + 1];
950 x1r = a[i][j] - a[i][j1];
951 x1i = a[i][j + 1] - a[i][j1 + 1];
952 x2r = a[i][j2] + a[i][j3];
953 x2i = a[i][j2 + 1] + a[i][j3 + 1];
954 x3r = a[i][j2] - a[i][j3];
955 x3i = a[i][j2 + 1] - a[i][j3 + 1];
957 a[i][j + 1] = x0i + x2i;
958 a[i][j2] = x2i - x0i;
959 a[i][j2 + 1] = x0r - x2r;
962 a[i][j1] = wk1r * (x0r - x0i);
963 a[i][j1 + 1] = wk1r * (x0r + x0i);
966 a[i][j3] = wk1r * (x0i - x0r);
967 a[i][j3 + 1] = wk1r * (x0i + x0r);
971 for (k = (m << 1); k <= n - m; k += m) {
975 wk1i = w[(k1 << 1) + 1];
978 wk3r = wk1r - 2 * wk2i * wk1i;
979 wk3i = 2 * wk2i * wk1r - wk1i;
980 for (j = k; j <= l + k - 2; j += 2) {
984 x0r = a[i][j] + a[i][j1];
985 x0i = a[i][j + 1] + a[i][j1 + 1];
986 x1r = a[i][j] - a[i][j1];
987 x1i = a[i][j + 1] - a[i][j1 + 1];
988 x2r = a[i][j2] + a[i][j3];
989 x2i = a[i][j2 + 1] + a[i][j3 + 1];
990 x3r = a[i][j2] - a[i][j3];
991 x3i = a[i][j2 + 1] - a[i][j3 + 1];
993 a[i][j + 1] = x0i + x2i;
996 a[i][j2] = wk2r * x0r - wk2i * x0i;
997 a[i][j2 + 1] = wk2r * x0i + wk2i * x0r;
1000 a[i][j1] = wk1r * x0r - wk1i * x0i;
1001 a[i][j1 + 1] = wk1r * x0i + wk1i * x0r;
1004 a[i][j3] = wk3r * x0r - wk3i * x0i;
1005 a[i][j3 + 1] = wk3r * x0i + wk3i * x0r;
1012 for (j = 0; j <= l - 2; j += 2) {
1014 x0r = a[i][j] - a[i][j1];
1015 x0i = a[i][j + 1] - a[i][j1 + 1];
1016 a[i][j] += a[i][j1];
1017 a[i][j + 1] += a[i][j1 + 1];
1026 void cftbrow(
int n,
int n2,
double **a,
double *w)
1028 int i, j, j1, j2, j3, k, k1, ks, l, m;
1029 double wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
1030 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1033 while ((l << 1) < n) {
1035 for (j = 0; j <= l - 1; j++) {
1039 for (i = 0; i <= n2 - 2; i += 2) {
1040 x0r = a[j][i] + a[j1][i];
1041 x0i = a[j][i + 1] + a[j1][i + 1];
1042 x1r = a[j][i] - a[j1][i];
1043 x1i = a[j][i + 1] - a[j1][i + 1];
1044 x2r = a[j2][i] + a[j3][i];
1045 x2i = a[j2][i + 1] + a[j3][i + 1];
1046 x3r = a[j2][i] - a[j3][i];
1047 x3i = a[j2][i + 1] - a[j3][i + 1];
1048 a[j][i] = x0r + x2r;
1049 a[j][i + 1] = x0i + x2i;
1050 a[j2][i] = x0r - x2r;
1051 a[j2][i + 1] = x0i - x2i;
1052 a[j1][i] = x1r - x3i;
1053 a[j1][i + 1] = x1i + x3r;
1054 a[j3][i] = x1r + x3i;
1055 a[j3][i + 1] = x1i - x3r;
1060 for (j = m; j <= l + m - 1; j++) {
1064 for (i = 0; i <= n2 - 2; i += 2) {
1065 x0r = a[j][i] + a[j1][i];
1066 x0i = a[j][i + 1] + a[j1][i + 1];
1067 x1r = a[j][i] - a[j1][i];
1068 x1i = a[j][i + 1] - a[j1][i + 1];
1069 x2r = a[j2][i] + a[j3][i];
1070 x2i = a[j2][i + 1] + a[j3][i + 1];
1071 x3r = a[j2][i] - a[j3][i];
1072 x3i = a[j2][i + 1] - a[j3][i + 1];
1073 a[j][i] = x0r + x2r;
1074 a[j][i + 1] = x0i + x2i;
1075 a[j2][i] = x2i - x0i;
1076 a[j2][i + 1] = x0r - x2r;
1079 a[j1][i] = wk1r * (x0r - x0i);
1080 a[j1][i + 1] = wk1r * (x0r + x0i);
1083 a[j3][i] = wk1r * (x0i - x0r);
1084 a[j3][i + 1] = wk1r * (x0i + x0r);
1089 for (k = (m << 1); k <= n - m; k += m) {
1093 wk1i = w[(k1 << 1) + 1];
1096 wk3r = wk1r - 2 * wk2i * wk1i;
1097 wk3i = 2 * wk2i * wk1r - wk1i;
1098 for (j = k; j <= l + k - 1; j++) {
1102 for (i = 0; i <= n2 - 2; i += 2) {
1103 x0r = a[j][i] + a[j1][i];
1104 x0i = a[j][i + 1] + a[j1][i + 1];
1105 x1r = a[j][i] - a[j1][i];
1106 x1i = a[j][i + 1] - a[j1][i + 1];
1107 x2r = a[j2][i] + a[j3][i];
1108 x2i = a[j2][i + 1] + a[j3][i + 1];
1109 x3r = a[j2][i] - a[j3][i];
1110 x3i = a[j2][i + 1] - a[j3][i + 1];
1111 a[j][i] = x0r + x2r;
1112 a[j][i + 1] = x0i + x2i;
1115 a[j2][i] = wk2r * x0r - wk2i * x0i;
1116 a[j2][i + 1] = wk2r * x0i + wk2i * x0r;
1119 a[j1][i] = wk1r * x0r - wk1i * x0i;
1120 a[j1][i + 1] = wk1r * x0i + wk1i * x0r;
1123 a[j3][i] = wk3r * x0r - wk3i * x0i;
1124 a[j3][i + 1] = wk3r * x0i + wk3i * x0r;
1132 for (j = 0; j <= l - 1; j++) {
1134 for (i = 0; i <= n2 - 2; i += 2) {
1135 x0r = a[j][i] - a[j1][i];
1136 x0i = a[j][i + 1] - a[j1][i + 1];
1137 a[j][i] += a[j1][i];
1138 a[j][i + 1] += a[j1][i + 1];
1147 void cftfcol(
int n1,
int n,
double **a,
double *w)
1149 int i, j, j1, j2, j3, k, k1, ks, l, m;
1150 double wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
1151 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1153 for (i = 0; i <= n1 - 1; i++) {
1155 while ((l << 1) < n) {
1157 for (j = 0; j <= l - 2; j += 2) {
1161 x0r = a[i][j] + a[i][j1];
1162 x0i = a[i][j + 1] + a[i][j1 + 1];
1163 x1r = a[i][j] - a[i][j1];
1164 x1i = a[i][j + 1] - a[i][j1 + 1];
1165 x2r = a[i][j2] + a[i][j3];
1166 x2i = a[i][j2 + 1] + a[i][j3 + 1];
1167 x3r = a[i][j2] - a[i][j3];
1168 x3i = a[i][j2 + 1] - a[i][j3 + 1];
1169 a[i][j] = x0r + x2r;
1170 a[i][j + 1] = x0i + x2i;
1171 a[i][j2] = x0r - x2r;
1172 a[i][j2 + 1] = x0i - x2i;
1173 a[i][j1] = x1r + x3i;
1174 a[i][j1 + 1] = x1i - x3r;
1175 a[i][j3] = x1r - x3i;
1176 a[i][j3 + 1] = x1i + x3r;
1180 for (j = m; j <= l + m - 2; j += 2) {
1184 x0r = a[i][j] + a[i][j1];
1185 x0i = a[i][j + 1] + a[i][j1 + 1];
1186 x1r = a[i][j] - a[i][j1];
1187 x1i = a[i][j + 1] - a[i][j1 + 1];
1188 x2r = a[i][j2] + a[i][j3];
1189 x2i = a[i][j2 + 1] + a[i][j3 + 1];
1190 x3r = a[i][j2] - a[i][j3];
1191 x3i = a[i][j2 + 1] - a[i][j3 + 1];
1192 a[i][j] = x0r + x2r;
1193 a[i][j + 1] = x0i + x2i;
1194 a[i][j2] = x0i - x2i;
1195 a[i][j2 + 1] = x2r - x0r;
1198 a[i][j1] = wk1r * (x0i + x0r);
1199 a[i][j1 + 1] = wk1r * (x0i - x0r);
1202 a[i][j3] = wk1r * (x0r + x0i);
1203 a[i][j3 + 1] = wk1r * (x0r - x0i);
1207 for (k = (m << 1); k <= n - m; k += m) {
1211 wk1i = w[(k1 << 1) + 1];
1214 wk3r = wk1r - 2 * wk2i * wk1i;
1215 wk3i = 2 * wk2i * wk1r - wk1i;
1216 for (j = k; j <= l + k - 2; j += 2) {
1220 x0r = a[i][j] + a[i][j1];
1221 x0i = a[i][j + 1] + a[i][j1 + 1];
1222 x1r = a[i][j] - a[i][j1];
1223 x1i = a[i][j + 1] - a[i][j1 + 1];
1224 x2r = a[i][j2] + a[i][j3];
1225 x2i = a[i][j2 + 1] + a[i][j3 + 1];
1226 x3r = a[i][j2] - a[i][j3];
1227 x3i = a[i][j2 + 1] - a[i][j3 + 1];
1228 a[i][j] = x0r + x2r;
1229 a[i][j + 1] = x0i + x2i;
1232 a[i][j2] = wk2r * x0r + wk2i * x0i;
1233 a[i][j2 + 1] = wk2r * x0i - wk2i * x0r;
1236 a[i][j1] = wk1r * x0r + wk1i * x0i;
1237 a[i][j1 + 1] = wk1r * x0i - wk1i * x0r;
1240 a[i][j3] = wk3r * x0r + wk3i * x0i;
1241 a[i][j3 + 1] = wk3r * x0i - wk3i * x0r;
1248 for (j = 0; j <= l - 2; j += 2) {
1250 x0r = a[i][j] - a[i][j1];
1251 x0i = a[i][j + 1] - a[i][j1 + 1];
1252 a[i][j] += a[i][j1];
1253 a[i][j + 1] += a[i][j1 + 1];
1262 void cftfrow(
int n,
int n2,
double **a,
double *w)
1264 int i, j, j1, j2, j3, k, k1, ks, l, m;
1265 double wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
1266 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1269 while ((l << 1) < n) {
1271 for (j = 0; j <= l - 1; j++) {
1275 for (i = 0; i <= n2 - 2; i += 2) {
1276 x0r = a[j][i] + a[j1][i];
1277 x0i = a[j][i + 1] + a[j1][i + 1];
1278 x1r = a[j][i] - a[j1][i];
1279 x1i = a[j][i + 1] - a[j1][i + 1];
1280 x2r = a[j2][i] + a[j3][i];
1281 x2i = a[j2][i + 1] + a[j3][i + 1];
1282 x3r = a[j2][i] - a[j3][i];
1283 x3i = a[j2][i + 1] - a[j3][i + 1];
1284 a[j][i] = x0r + x2r;
1285 a[j][i + 1] = x0i + x2i;
1286 a[j2][i] = x0r - x2r;
1287 a[j2][i + 1] = x0i - x2i;
1288 a[j1][i] = x1r + x3i;
1289 a[j1][i + 1] = x1i - x3r;
1290 a[j3][i] = x1r - x3i;
1291 a[j3][i + 1] = x1i + x3r;
1296 for (j = m; j <= l + m - 1; j++) {
1300 for (i = 0; i <= n2 - 2; i += 2) {
1301 x0r = a[j][i] + a[j1][i];
1302 x0i = a[j][i + 1] + a[j1][i + 1];
1303 x1r = a[j][i] - a[j1][i];
1304 x1i = a[j][i + 1] - a[j1][i + 1];
1305 x2r = a[j2][i] + a[j3][i];
1306 x2i = a[j2][i + 1] + a[j3][i + 1];
1307 x3r = a[j2][i] - a[j3][i];
1308 x3i = a[j2][i + 1] - a[j3][i + 1];
1309 a[j][i] = x0r + x2r;
1310 a[j][i + 1] = x0i + x2i;
1311 a[j2][i] = x0i - x2i;
1312 a[j2][i + 1] = x2r - x0r;
1315 a[j1][i] = wk1r * (x0i + x0r);
1316 a[j1][i + 1] = wk1r * (x0i - x0r);
1319 a[j3][i] = wk1r * (x0r + x0i);
1320 a[j3][i + 1] = wk1r * (x0r - x0i);
1325 for (k = (m << 1); k <= n - m; k += m) {
1329 wk1i = w[(k1 << 1) + 1];
1332 wk3r = wk1r - 2 * wk2i * wk1i;
1333 wk3i = 2 * wk2i * wk1r - wk1i;
1334 for (j = k; j <= l + k - 1; j++) {
1338 for (i = 0; i <= n2 - 2; i += 2) {
1339 x0r = a[j][i] + a[j1][i];
1340 x0i = a[j][i + 1] + a[j1][i + 1];
1341 x1r = a[j][i] - a[j1][i];
1342 x1i = a[j][i + 1] - a[j1][i + 1];
1343 x2r = a[j2][i] + a[j3][i];
1344 x2i = a[j2][i + 1] + a[j3][i + 1];
1345 x3r = a[j2][i] - a[j3][i];
1346 x3i = a[j2][i + 1] - a[j3][i + 1];
1347 a[j][i] = x0r + x2r;
1348 a[j][i + 1] = x0i + x2i;
1351 a[j2][i] = wk2r * x0r + wk2i * x0i;
1352 a[j2][i + 1] = wk2r * x0i - wk2i * x0r;
1355 a[j1][i] = wk1r * x0r + wk1i * x0i;
1356 a[j1][i + 1] = wk1r * x0i - wk1i * x0r;
1359 a[j3][i] = wk3r * x0r + wk3i * x0i;
1360 a[j3][i + 1] = wk3r * x0i - wk3i * x0r;
1368 for (j = 0; j <= l - 1; j++) {
1370 for (i = 0; i <= n2 - 2; i += 2) {
1371 x0r = a[j][i] - a[j1][i];
1372 x0i = a[j][i + 1] - a[j1][i + 1];
1373 a[j][i] += a[j1][i];
1374 a[j][i + 1] += a[j1][i + 1];
1383 void rftbcol(
int n1,
int n,
double **a,
int nc,
double *c)
1385 int i, j, k, kk, ks;
1386 double wkr, wki, xr, xi, yr, yi;
1389 for (i = 0; i <= n1 - 1; i++) {
1391 for (k = (n >> 1) - 2; k >= 2; k -= 2) {
1396 xr = a[i][k] - a[i][j];
1397 xi = a[i][k + 1] + a[i][j + 1];
1398 yr = wkr * xr - wki * xi;
1399 yi = wkr * xi + wki * xr;
1409 void rftfcol(
int n1,
int n,
double **a,
int nc,
double *c)
1411 int i, j, k, kk, ks;
1412 double wkr, wki, xr, xi, yr, yi;
1415 for (i = 0; i <= n1 - 1; i++) {
1417 for (k = (n >> 1) - 2; k >= 2; k -= 2) {
1422 xr = a[i][k] - a[i][j];
1423 xi = a[i][k + 1] + a[i][j + 1];
1424 yr = wkr * xr + wki * xi;
1425 yi = wkr * xi - wki * xr;
1435 void dctbsub(
int n1,
int n2,
double **a,
int nc,
double *c)
1437 int kk1, kk2, ks1, ks2, n1h, j1, k1, k2;
1438 double w1r, w1i, wkr, wki, wjr, wji, x0r, x0i, x1r, x1i;
1444 for (k1 = 1; k1 <= n1h - 1; k1++) {
1447 w1i = 2 * c[nc - kk1];
1450 for (k2 = 2; k2 <= n2 - 2; k2 += 2) {
1453 x1r = w1r * c[nc - kk2];
1454 x1i = w1i * c[nc - kk2];
1460 x0r = wkr * a[k1][k2] - wki * a[k1][k2 + 1];
1461 x0i = wkr * a[k1][k2 + 1] + wki * a[k1][k2];
1462 x1r = wjr * a[j1][k2] - wji * a[j1][k2 + 1];
1463 x1i = wjr * a[j1][k2 + 1] + wji * a[j1][k2];
1464 a[k1][k2] = x0r + x1i;
1465 a[k1][k2 + 1] = x0i - x1r;
1466 a[j1][k2] = x1r + x0i;
1467 a[j1][k2 + 1] = x1i - x0r;
1473 x0r = a[k1][0] + a[j1][0];
1474 x0i = a[k1][1] - a[j1][1];
1475 x1r = a[k1][0] - a[j1][0];
1476 x1i = a[k1][1] + a[j1][1];
1477 a[k1][0] = wkr * x0r - wki * x0i;
1478 a[k1][1] = wkr * x0i + wki * x0r;
1479 a[j1][0] = -wjr * x1r + wji * x1i;
1480 a[j1][1] = wjr * x1i + wji * x1r;
1484 for (k2 = 2; k2 <= n2 - 2; k2 += 2) {
1486 wki = 2 * c[nc - kk2];
1490 x0i = wkr * a[0][k2 + 1] + wki * a[0][k2];
1491 a[0][k2] = wkr * a[0][k2] - wki * a[0][k2 + 1];
1493 x0i = wjr * a[n1h][k2 + 1] + wji * a[n1h][k2];
1494 a[n1h][k2] = wjr * a[n1h][k2] - wji * a[n1h][k2 + 1];
1495 a[n1h][k2 + 1] = x0i;
1503 void dctfsub(
int n1,
int n2,
double **a,
int nc,
double *c)
1505 int kk1, kk2, ks1, ks2, n1h, j1, k1, k2;
1506 double w1r, w1i, wkr, wki, wjr, wji, x0r, x0i, x1r, x1i;
1512 for (k1 = 1; k1 <= n1h - 1; k1++) {
1515 w1i = 2 * c[nc - kk1];
1518 for (k2 = 2; k2 <= n2 - 2; k2 += 2) {
1521 x1r = w1r * c[nc - kk2];
1522 x1i = w1i * c[nc - kk2];
1528 x0r = a[k1][k2] - a[j1][k2 + 1];
1529 x0i = a[j1][k2] + a[k1][k2 + 1];
1530 x1r = a[j1][k2] - a[k1][k2 + 1];
1531 x1i = a[k1][k2] + a[j1][k2 + 1];
1532 a[k1][k2] = wkr * x0r + wki * x0i;
1533 a[k1][k2 + 1] = wkr * x0i - wki * x0r;
1534 a[j1][k2] = wjr * x1r + wji * x1i;
1535 a[j1][k2 + 1] = wjr * x1i - wji * x1r;
1540 x0r = w1r * a[k1][0] + w1i * a[k1][1];
1541 x0i = w1r * a[k1][1] - w1i * a[k1][0];
1542 x1r = -wjr * a[j1][0] + wji * a[j1][1];
1543 x1i = wjr * a[j1][1] + wji * a[j1][0];
1544 a[k1][0] = x0r + x1r;
1545 a[k1][1] = x1i + x0i;
1546 a[j1][0] = x0r - x1r;
1547 a[j1][1] = x1i - x0i;
1551 for (k2 = 2; k2 <= n2 - 2; k2 += 2) {
1553 wki = 2 * c[nc - kk2];
1557 x0i = wkr * a[0][k2 + 1] - wki * a[0][k2];
1558 a[0][k2] = wkr * a[0][k2] + wki * a[0][k2 + 1];
1560 x0i = wjr * a[n1h][k2 + 1] - wji * a[n1h][k2];
1561 a[n1h][k2] = wjr * a[n1h][k2] + wji * a[n1h][k2 + 1];
1562 a[n1h][k2 + 1] = x0i;
1571 void dstbsub(
int n1,
int n2,
double **a,
int nc,
double *c)
1573 int kk1, kk2, ks1, ks2, n1h, j1, k1, k2;
1574 double w1r, w1i, wkr, wki, wjr, wji, x0r, x0i, x1r, x1i;
1580 for (k1 = 1; k1 <= n1h - 1; k1++) {
1583 w1i = 2 * c[nc - kk1];
1586 for (k2 = 2; k2 <= n2 - 2; k2 += 2) {
1589 x1r = w1r * c[nc - kk2];
1590 x1i = w1i * c[nc - kk2];
1596 x0r = wkr * a[k1][k2] - wki * a[k1][k2 + 1];
1597 x0i = wkr * a[k1][k2 + 1] + wki * a[k1][k2];
1598 x1r = wjr * a[j1][k2] - wji * a[j1][k2 + 1];
1599 x1i = wjr * a[j1][k2 + 1] + wji * a[j1][k2];
1600 a[k1][k2] = x1i - x0r;
1601 a[k1][k2 + 1] = x1r + x0i;
1602 a[j1][k2] = x0i - x1r;
1603 a[j1][k2 + 1] = x0r + x1i;
1609 x0r = a[k1][0] + a[j1][0];
1610 x0i = a[k1][1] - a[j1][1];
1611 x1r = a[k1][0] - a[j1][0];
1612 x1i = a[k1][1] + a[j1][1];
1613 a[k1][1] = wkr * x0r - wki * x0i;
1614 a[k1][0] = wkr * x0i + wki * x0r;
1615 a[j1][1] = -wjr * x1r + wji * x1i;
1616 a[j1][0] = wjr * x1i + wji * x1r;
1620 for (k2 = 2; k2 <= n2 - 2; k2 += 2) {
1622 wki = 2 * c[nc - kk2];
1626 x0i = wkr * a[0][k2 + 1] + wki * a[0][k2];
1627 a[0][k2 + 1] = wkr * a[0][k2] - wki * a[0][k2 + 1];
1629 x0i = wjr * a[n1h][k2 + 1] + wji * a[n1h][k2];
1630 a[n1h][k2 + 1] = wjr * a[n1h][k2] - wji * a[n1h][k2 + 1];
1639 void dstfsub(
int n1,
int n2,
double **a,
int nc,
double *c)
1641 int kk1, kk2, ks1, ks2, n1h, j1, k1, k2;
1642 double w1r, w1i, wkr, wki, wjr, wji, x0r, x0i, x1r, x1i;
1648 for (k1 = 1; k1 <= n1h - 1; k1++) {
1651 w1i = 2 * c[nc - kk1];
1654 for (k2 = 2; k2 <= n2 - 2; k2 += 2) {
1657 x1r = w1r * c[nc - kk2];
1658 x1i = w1i * c[nc - kk2];
1664 x0r = a[j1][k2 + 1] - a[k1][k2];
1665 x0i = a[k1][k2 + 1] + a[j1][k2];
1666 x1r = a[k1][k2 + 1] - a[j1][k2];
1667 x1i = a[j1][k2 + 1] + a[k1][k2];
1668 a[k1][k2] = wkr * x0r + wki * x0i;
1669 a[k1][k2 + 1] = wkr * x0i - wki * x0r;
1670 a[j1][k2] = wjr * x1r + wji * x1i;
1671 a[j1][k2 + 1] = wjr * x1i - wji * x1r;
1676 x0r = w1r * a[k1][1] + w1i * a[k1][0];
1677 x0i = w1r * a[k1][0] - w1i * a[k1][1];
1678 x1r = -wjr * a[j1][1] + wji * a[j1][0];
1679 x1i = wjr * a[j1][0] + wji * a[j1][1];
1680 a[k1][0] = x0r + x1r;
1681 a[k1][1] = x1i + x0i;
1682 a[j1][0] = x0r - x1r;
1683 a[j1][1] = x1i - x0i;
1687 for (k2 = 2; k2 <= n2 - 2; k2 += 2) {
1689 wki = 2 * c[nc - kk2];
1693 x0i = wkr * a[0][k2] - wki * a[0][k2 + 1];
1694 a[0][k2] = wkr * a[0][k2 + 1] + wki * a[0][k2];
1696 x0i = wjr * a[n1h][k2] - wji * a[n1h][k2 + 1];
1697 a[n1h][k2] = wjr * a[n1h][k2 + 1] + wji * a[n1h][k2];
1698 a[n1h][k2 + 1] = x0i;