278 void cdft(
int n,
int isgn,
double *a,
int *ip,
double *w)
280 void makewt(
int nw,
int *ip,
double *w);
281 void bitrv2(
int n,
int *ip,
double *a);
282 void bitrv2conj(
int n,
int *ip,
double *a);
283 void cftfsub(
int n,
double *a,
double *w);
284 void cftbsub(
int n,
double *a,
double *w);
286 if (n > (ip[0] << 2)) {
287 makewt(n >> 2, ip, w);
291 bitrv2(n, ip + 2, a);
294 bitrv2conj(n, ip + 2, a);
303 void rdft(
int n,
int isgn,
double *a,
int *ip,
double *w)
305 void makewt(
int nw,
int *ip,
double *w);
306 void makect(
int nc,
int *ip,
double *c);
307 void bitrv2(
int n,
int *ip,
double *a);
308 void cftfsub(
int n,
double *a,
double *w);
309 void cftbsub(
int n,
double *a,
double *w);
310 void rftfsub(
int n,
double *a,
int nc,
double *c);
311 void rftbsub(
int n,
double *a,
int nc,
double *c);
323 makect(nc, ip, w + nw);
327 bitrv2(n, ip + 2, a);
329 rftfsub(n, a, nc, w + nw);
337 a[1] = 0.5 * (a[0] - a[1]);
340 rftbsub(n, a, nc, w + nw);
341 bitrv2(n, ip + 2, a);
350 void ddct(
int n,
int isgn,
double *a,
int *ip,
double *w)
352 void makewt(
int nw,
int *ip,
double *w);
353 void makect(
int nc,
int *ip,
double *c);
354 void bitrv2(
int n,
int *ip,
double *a);
355 void cftfsub(
int n,
double *a,
double *w);
356 void cftbsub(
int n,
double *a,
double *w);
357 void rftfsub(
int n,
double *a,
int nc,
double *c);
358 void rftbsub(
int n,
double *a,
int nc,
double *c);
359 void dctsub(
int n,
double *a,
int nc,
double *c);
371 makect(nc, ip, w + nw);
375 for (j = n - 2; j >= 2; j -= 2) {
376 a[j + 1] = a[j] - a[j - 1];
382 rftbsub(n, a, nc, w + nw);
383 bitrv2(n, ip + 2, a);
389 dctsub(n, a, nc, w + nw);
392 bitrv2(n, ip + 2, a);
394 rftfsub(n, a, nc, w + nw);
400 for (j = 2; j < n; j += 2) {
401 a[j - 1] = a[j] - a[j + 1];
409 void ddst(
int n,
int isgn,
double *a,
int *ip,
double *w)
411 void makewt(
int nw,
int *ip,
double *w);
412 void makect(
int nc,
int *ip,
double *c);
413 void bitrv2(
int n,
int *ip,
double *a);
414 void cftfsub(
int n,
double *a,
double *w);
415 void cftbsub(
int n,
double *a,
double *w);
416 void rftfsub(
int n,
double *a,
int nc,
double *c);
417 void rftbsub(
int n,
double *a,
int nc,
double *c);
418 void dstsub(
int n,
double *a,
int nc,
double *c);
430 makect(nc, ip, w + nw);
434 for (j = n - 2; j >= 2; j -= 2) {
435 a[j + 1] = -a[j] - a[j - 1];
441 rftbsub(n, a, nc, w + nw);
442 bitrv2(n, ip + 2, a);
448 dstsub(n, a, nc, w + nw);
451 bitrv2(n, ip + 2, a);
453 rftfsub(n, a, nc, w + nw);
459 for (j = 2; j < n; j += 2) {
460 a[j - 1] = -a[j] - a[j + 1];
468 void dfct(
int n,
double *a,
double *t,
int *ip,
double *w)
470 void makewt(
int nw,
int *ip,
double *w);
471 void makect(
int nc,
int *ip,
double *c);
472 void bitrv2(
int n,
int *ip,
double *a);
473 void cftfsub(
int n,
double *a,
double *w);
474 void rftfsub(
int n,
double *a,
int nc,
double *c);
475 void dctsub(
int n,
double *a,
int nc,
double *c);
476 int j, k, l, m, mh, nw, nc;
477 double xr, xi, yr, yi;
487 makect(nc, ip, w + nw);
497 for (j = 1; j < mh; j++) {
499 xr = a[j] - a[n - j];
500 xi = a[j] + a[n - j];
501 yr = a[k] - a[n - k];
502 yi = a[k] + a[n - k];
508 t[mh] = a[mh] + a[n - mh];
510 dctsub(m, a, nc, w + nw);
512 bitrv2(m, ip + 2, a);
514 rftfsub(m, a, nc, w + nw);
518 a[n - 1] = a[0] - a[1];
520 for (j = m - 2; j >= 2; j -= 2) {
521 a[2 * j + 1] = a[j] + a[j + 1];
522 a[2 * j - 1] = a[j] - a[j + 1];
527 dctsub(m, t, nc, w + nw);
529 bitrv2(m, ip + 2, t);
531 rftfsub(m, t, nc, w + nw);
535 a[n - l] = t[0] - t[1];
538 for (j = 2; j < m; j += 2) {
540 a[k - l] = t[j] - t[j + 1];
541 a[k + l] = t[j] + t[j + 1];
545 for (j = 0; j < mh; j++) {
547 t[j] = t[m + k] - t[m + j];
548 t[k] = t[m + k] + t[m + j];
564 void dfst(
int n,
double *a,
double *t,
int *ip,
double *w)
566 void makewt(
int nw,
int *ip,
double *w);
567 void makect(
int nc,
int *ip,
double *c);
568 void bitrv2(
int n,
int *ip,
double *a);
569 void cftfsub(
int n,
double *a,
double *w);
570 void rftfsub(
int n,
double *a,
int nc,
double *c);
571 void dstsub(
int n,
double *a,
int nc,
double *c);
572 int j, k, l, m, mh, nw, nc;
573 double xr, xi, yr, yi;
583 makect(nc, ip, w + nw);
588 for (j = 1; j < mh; j++) {
590 xr = a[j] + a[n - j];
591 xi = a[j] - a[n - j];
592 yr = a[k] + a[n - k];
593 yi = a[k] - a[n - k];
599 t[0] = a[mh] - a[n - mh];
602 dstsub(m, a, nc, w + nw);
604 bitrv2(m, ip + 2, a);
606 rftfsub(m, a, nc, w + nw);
610 a[n - 1] = a[1] - a[0];
612 for (j = m - 2; j >= 2; j -= 2) {
613 a[2 * j + 1] = a[j] - a[j + 1];
614 a[2 * j - 1] = -a[j] - a[j + 1];
619 dstsub(m, t, nc, w + nw);
621 bitrv2(m, ip + 2, t);
623 rftfsub(m, t, nc, w + nw);
627 a[n - l] = t[1] - t[0];
630 for (j = 2; j < m; j += 2) {
632 a[k - l] = -t[j] - t[j + 1];
633 a[k + l] = t[j] - t[j + 1];
637 for (j = 1; j < mh; j++) {
639 t[j] = t[m + k] + t[m + j];
640 t[k] = t[m + k] - t[m + j];
656 void makewt(
int nw,
int *ip,
double *w)
658 void bitrv2(
int n,
int *ip,
double *a);
666 delta = atan(1.0) / nwh;
669 w[nwh] = cos(delta * nwh);
672 for (j = 2; j < nwh; j += 2) {
680 bitrv2(nw, ip + 2, w);
686 void makect(
int nc,
int *ip,
double *c)
694 delta = atan(1.0) / nch;
695 c[0] = cos(delta * nch);
697 for (j = 1; j < nch; j++) {
698 c[j] = 0.5 * cos(delta * j);
699 c[nc - j] = 0.5 * sin(delta * j);
708 void bitrv2(
int n,
int *ip,
double *a)
710 int j, j1, k, k1, l, m, m2;
711 double xr, xi, yr, yi;
716 while ((m << 3) < l) {
718 for (j = 0; j < m; j++) {
719 ip[m + j] = ip[j] + l;
725 for (k = 0; k < m; k++) {
726 for (j = 0; j < k; j++) {
768 j1 = 2 * k + m2 + ip[k];
780 for (k = 1; k < m; k++) {
781 for (j = 0; j < k; j++) {
808 void bitrv2conj(
int n,
int *ip,
double *a)
810 int j, j1, k, k1, l, m, m2;
811 double xr, xi, yr, yi;
816 while ((m << 3) < l) {
818 for (j = 0; j < m; j++) {
819 ip[m + j] = ip[j] + l;
825 for (k = 0; k < m; k++) {
826 for (j = 0; j < k; j++) {
869 a[k1 + 1] = -a[k1 + 1];
881 a[k1 + 1] = -a[k1 + 1];
885 a[m2 + 1] = -a[m2 + 1];
886 for (k = 1; k < m; k++) {
887 for (j = 0; j < k; j++) {
910 a[k1 + 1] = -a[k1 + 1];
911 a[k1 + m2 + 1] = -a[k1 + m2 + 1];
917 void cftfsub(
int n,
double *a,
double *w)
919 void cft1st(
int n,
double *a,
double *w);
920 void cftmdl(
int n,
int l,
double *a,
double *w);
921 int j, j1, j2, j3, l;
922 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
928 while ((l << 2) < n) {
934 for (j = 0; j < l; j += 2) {
939 x0i = a[j + 1] + a[j1 + 1];
941 x1i = a[j + 1] - a[j1 + 1];
943 x2i = a[j2 + 1] + a[j3 + 1];
945 x3i = a[j2 + 1] - a[j3 + 1];
947 a[j + 1] = x0i + x2i;
949 a[j2 + 1] = x0i - x2i;
951 a[j1 + 1] = x1i + x3r;
953 a[j3 + 1] = x1i - x3r;
956 for (j = 0; j < l; j += 2) {
959 x0i = a[j + 1] - a[j1 + 1];
961 a[j + 1] += a[j1 + 1];
969 void cftbsub(
int n,
double *a,
double *w)
971 void cft1st(
int n,
double *a,
double *w);
972 void cftmdl(
int n,
int l,
double *a,
double *w);
973 int j, j1, j2, j3, l;
974 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
980 while ((l << 2) < n) {
986 for (j = 0; j < l; j += 2) {
991 x0i = -a[j + 1] - a[j1 + 1];
993 x1i = -a[j + 1] + a[j1 + 1];
995 x2i = a[j2 + 1] + a[j3 + 1];
997 x3i = a[j2 + 1] - a[j3 + 1];
999 a[j + 1] = x0i - x2i;
1001 a[j2 + 1] = x0i + x2i;
1003 a[j1 + 1] = x1i - x3r;
1005 a[j3 + 1] = x1i + x3r;
1008 for (j = 0; j < l; j += 2) {
1011 x0i = -a[j + 1] + a[j1 + 1];
1013 a[j + 1] = -a[j + 1] - a[j1 + 1];
1021 void cft1st(
int n,
double *a,
double *w)
1024 double wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
1025 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1048 x2r = a[12] + a[14];
1049 x2i = a[13] + a[15];
1050 x3r = a[12] - a[14];
1051 x3i = a[13] - a[15];
1058 a[10] = wk1r * (x0r - x0i);
1059 a[11] = wk1r * (x0r + x0i);
1062 a[14] = wk1r * (x0i - x0r);
1063 a[15] = wk1r * (x0i + x0r);
1065 for (j = 16; j < n; j += 16) {
1072 wk3r = wk1r - 2 * wk2i * wk1i;
1073 wk3i = 2 * wk2i * wk1r - wk1i;
1074 x0r = a[j] + a[j + 2];
1075 x0i = a[j + 1] + a[j + 3];
1076 x1r = a[j] - a[j + 2];
1077 x1i = a[j + 1] - a[j + 3];
1078 x2r = a[j + 4] + a[j + 6];
1079 x2i = a[j + 5] + a[j + 7];
1080 x3r = a[j + 4] - a[j + 6];
1081 x3i = a[j + 5] - a[j + 7];
1083 a[j + 1] = x0i + x2i;
1086 a[j + 4] = wk2r * x0r - wk2i * x0i;
1087 a[j + 5] = wk2r * x0i + wk2i * x0r;
1090 a[j + 2] = wk1r * x0r - wk1i * x0i;
1091 a[j + 3] = wk1r * x0i + wk1i * x0r;
1094 a[j + 6] = wk3r * x0r - wk3i * x0i;
1095 a[j + 7] = wk3r * x0i + wk3i * x0r;
1098 wk3r = wk1r - 2 * wk2r * wk1i;
1099 wk3i = 2 * wk2r * wk1r - wk1i;
1100 x0r = a[j + 8] + a[j + 10];
1101 x0i = a[j + 9] + a[j + 11];
1102 x1r = a[j + 8] - a[j + 10];
1103 x1i = a[j + 9] - a[j + 11];
1104 x2r = a[j + 12] + a[j + 14];
1105 x2i = a[j + 13] + a[j + 15];
1106 x3r = a[j + 12] - a[j + 14];
1107 x3i = a[j + 13] - a[j + 15];
1108 a[j + 8] = x0r + x2r;
1109 a[j + 9] = x0i + x2i;
1112 a[j + 12] = -wk2i * x0r - wk2r * x0i;
1113 a[j + 13] = -wk2i * x0i + wk2r * x0r;
1116 a[j + 10] = wk1r * x0r - wk1i * x0i;
1117 a[j + 11] = wk1r * x0i + wk1i * x0r;
1120 a[j + 14] = wk3r * x0r - wk3i * x0i;
1121 a[j + 15] = wk3r * x0i + wk3i * x0r;
1126 void cftmdl(
int n,
int l,
double *a,
double *w)
1128 int j, j1, j2, j3, k, k1, k2, m, m2;
1129 double wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
1130 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1133 for (j = 0; j < l; j += 2) {
1138 x0i = a[j + 1] + a[j1 + 1];
1140 x1i = a[j + 1] - a[j1 + 1];
1141 x2r = a[j2] + a[j3];
1142 x2i = a[j2 + 1] + a[j3 + 1];
1143 x3r = a[j2] - a[j3];
1144 x3i = a[j2 + 1] - a[j3 + 1];
1146 a[j + 1] = x0i + x2i;
1148 a[j2 + 1] = x0i - x2i;
1150 a[j1 + 1] = x1i + x3r;
1152 a[j3 + 1] = x1i - x3r;
1155 for (j = m; j < l + m; j += 2) {
1160 x0i = a[j + 1] + a[j1 + 1];
1162 x1i = a[j + 1] - a[j1 + 1];
1163 x2r = a[j2] + a[j3];
1164 x2i = a[j2 + 1] + a[j3 + 1];
1165 x3r = a[j2] - a[j3];
1166 x3i = a[j2 + 1] - a[j3 + 1];
1168 a[j + 1] = x0i + x2i;
1170 a[j2 + 1] = x0r - x2r;
1173 a[j1] = wk1r * (x0r - x0i);
1174 a[j1 + 1] = wk1r * (x0r + x0i);
1177 a[j3] = wk1r * (x0i - x0r);
1178 a[j3 + 1] = wk1r * (x0i + x0r);
1182 for (k = m2; k < n; k += m2) {
1189 wk3r = wk1r - 2 * wk2i * wk1i;
1190 wk3i = 2 * wk2i * wk1r - wk1i;
1191 for (j = k; j < l + k; j += 2) {
1196 x0i = a[j + 1] + a[j1 + 1];
1198 x1i = a[j + 1] - a[j1 + 1];
1199 x2r = a[j2] + a[j3];
1200 x2i = a[j2 + 1] + a[j3 + 1];
1201 x3r = a[j2] - a[j3];
1202 x3i = a[j2 + 1] - a[j3 + 1];
1204 a[j + 1] = x0i + x2i;
1207 a[j2] = wk2r * x0r - wk2i * x0i;
1208 a[j2 + 1] = wk2r * x0i + wk2i * x0r;
1211 a[j1] = wk1r * x0r - wk1i * x0i;
1212 a[j1 + 1] = wk1r * x0i + wk1i * x0r;
1215 a[j3] = wk3r * x0r - wk3i * x0i;
1216 a[j3 + 1] = wk3r * x0i + wk3i * x0r;
1220 wk3r = wk1r - 2 * wk2r * wk1i;
1221 wk3i = 2 * wk2r * wk1r - wk1i;
1222 for (j = k + m; j < l + (k + m); j += 2) {
1227 x0i = a[j + 1] + a[j1 + 1];
1229 x1i = a[j + 1] - a[j1 + 1];
1230 x2r = a[j2] + a[j3];
1231 x2i = a[j2 + 1] + a[j3 + 1];
1232 x3r = a[j2] - a[j3];
1233 x3i = a[j2 + 1] - a[j3 + 1];
1235 a[j + 1] = x0i + x2i;
1238 a[j2] = -wk2i * x0r - wk2r * x0i;
1239 a[j2 + 1] = -wk2i * x0i + wk2r * x0r;
1242 a[j1] = wk1r * x0r - wk1i * x0i;
1243 a[j1 + 1] = wk1r * x0i + wk1i * x0r;
1246 a[j3] = wk3r * x0r - wk3i * x0i;
1247 a[j3 + 1] = wk3r * x0i + wk3i * x0r;
1253 void rftfsub(
int n,
double *a,
int nc,
double *c)
1255 int j, k, kk, ks, m;
1256 double wkr, wki, xr, xi, yr, yi;
1261 for (j = 2; j < m; j += 2) {
1264 wkr = 0.5 - c[nc - kk];
1267 xi = a[j + 1] + a[k + 1];
1268 yr = wkr * xr - wki * xi;
1269 yi = wkr * xi + wki * xr;
1278 void rftbsub(
int n,
double *a,
int nc,
double *c)
1280 int j, k, kk, ks, m;
1281 double wkr, wki, xr, xi, yr, yi;
1287 for (j = 2; j < m; j += 2) {
1290 wkr = 0.5 - c[nc - kk];
1293 xi = a[j + 1] + a[k + 1];
1294 yr = wkr * xr + wki * xi;
1295 yi = wkr * xi - wki * xr;
1297 a[j + 1] = yi - a[j + 1];
1299 a[k + 1] = yi - a[k + 1];
1301 a[m + 1] = -a[m + 1];
1305 void dctsub(
int n,
double *a,
int nc,
double *c)
1307 int j, k, kk, ks, m;
1308 double wkr, wki, xr;
1313 for (j = 1; j < m; j++) {
1316 wkr = c[kk] - c[nc - kk];
1317 wki = c[kk] + c[nc - kk];
1318 xr = wki * a[j] - wkr * a[k];
1319 a[j] = wkr * a[j] + wki * a[k];
1326 void dstsub(
int n,
double *a,
int nc,
double *c)
1328 int j, k, kk, ks, m;
1329 double wkr, wki, xr;
1334 for (j = 1; j < m; j++) {
1337 wkr = c[kk] - c[nc - kk];
1338 wki = c[kk] + c[nc - kk];
1339 xr = wki * a[k] - wkr * a[j];
1340 a[k] = wkr * a[k] + wki * a[j];