17 #ifndef R8B_FFT4G_INCLUDED 18 #define R8B_FFT4G_INCLUDED 310 typedef double FPType;
312 static void cdft(
int n,
int isgn, FPType *a,
int *ip, FPType *w)
314 if (n > (ip[0] << 2)) {
315 makewt(n >> 2, ip, w);
319 bitrv2(n, ip + 2, a);
322 bitrv2conj(n, ip + 2, a);
330 static void rdft(
int n,
int isgn, FPType *a,
int *ip, FPType *w)
343 makect(nc, ip, w + nw);
347 bitrv2(n, ip + 2, a);
349 rftfsub(n, a, nc, w + nw);
357 a[1] = 0.5 * (a[0] - a[1]);
360 rftbsub(n, a, nc, w + nw);
361 bitrv2(n, ip + 2, a);
369 static void ddct(
int n,
int isgn, FPType *a,
int *ip, FPType *w)
382 makect(nc, ip, w + nw);
386 for (j = n - 2; j >= 2; j -= 2) {
387 a[j + 1] = a[j] - a[j - 1];
393 rftbsub(n, a, nc, w + nw);
394 bitrv2(n, ip + 2, a);
400 dctsub(n, a, nc, w + nw);
403 bitrv2(n, ip + 2, a);
405 rftfsub(n, a, nc, w + nw);
411 for (j = 2; j < n; j += 2) {
412 a[j - 1] = a[j] - a[j + 1];
419 static void ddst(
int n,
int isgn, FPType *a,
int *ip, FPType *w)
432 makect(nc, ip, w + nw);
436 for (j = n - 2; j >= 2; j -= 2) {
437 a[j + 1] = -a[j] - a[j - 1];
443 rftbsub(n, a, nc, w + nw);
444 bitrv2(n, ip + 2, a);
450 dstsub(n, a, nc, w + nw);
453 bitrv2(n, ip + 2, a);
455 rftfsub(n, a, nc, w + nw);
461 for (j = 2; j < n; j += 2) {
462 a[j - 1] = -a[j] - a[j + 1];
469 static void dfct(
int n, FPType *a, FPType *t,
int *ip, FPType *w)
471 int j, k, l, m, mh, nw, nc;
472 double xr, xi, yr, yi;
482 makect(nc, ip, w + nw);
492 for (j = 1; j < mh; j++) {
494 xr = a[j] - a[n - j];
495 xi = a[j] + a[n - j];
496 yr = a[k] - a[n - k];
497 yi = a[k] + a[n - k];
503 t[mh] = a[mh] + a[n - mh];
505 dctsub(m, a, nc, w + nw);
507 bitrv2(m, ip + 2, a);
509 rftfsub(m, a, nc, w + nw);
513 a[n - 1] = a[0] - a[1];
515 for (j = m - 2; j >= 2; j -= 2) {
516 a[2 * j + 1] = a[j] + a[j + 1];
517 a[2 * j - 1] = a[j] - a[j + 1];
522 dctsub(m, t, nc, w + nw);
524 bitrv2(m, ip + 2, t);
526 rftfsub(m, t, nc, w + nw);
530 a[n - l] = t[0] - t[1];
533 for (j = 2; j < m; j += 2) {
535 a[k - l] = t[j] - t[j + 1];
536 a[k + l] = t[j] + t[j + 1];
540 for (j = 0; j < mh; j++) {
542 t[j] = t[m + k] - t[m + j];
543 t[k] = t[m + k] + t[m + j];
558 static void dfst(
int n, FPType *a, FPType *t,
int *ip, FPType *w)
560 int j, k, l, m, mh, nw, nc;
561 double xr, xi, yr, yi;
571 makect(nc, ip, w + nw);
576 for (j = 1; j < mh; j++) {
578 xr = a[j] + a[n - j];
579 xi = a[j] - a[n - j];
580 yr = a[k] + a[n - k];
581 yi = a[k] - a[n - k];
587 t[0] = a[mh] - a[n - mh];
590 dstsub(m, a, nc, w + nw);
592 bitrv2(m, ip + 2, a);
594 rftfsub(m, a, nc, w + nw);
598 a[n - 1] = a[1] - a[0];
600 for (j = m - 2; j >= 2; j -= 2) {
601 a[2 * j + 1] = a[j] - a[j + 1];
602 a[2 * j - 1] = -a[j] - a[j + 1];
607 dstsub(m, t, nc, w + nw);
609 bitrv2(m, ip + 2, t);
611 rftfsub(m, t, nc, w + nw);
615 a[n - l] = t[1] - t[0];
618 for (j = 2; j < m; j += 2) {
620 a[k - l] = -t[j] - t[j + 1];
621 a[k + l] = t[j] - t[j + 1];
625 for (j = 1; j < mh; j++) {
627 t[j] = t[m + k] + t[m + j];
628 t[k] = t[m + k] - t[m + j];
640 static void makewt(
int nw,
int *ip, FPType *w)
649 delta = atan(1.0) / nwh;
652 w[nwh] = cos(delta * nwh);
655 for (j = 2; j < nwh; j += 2) {
663 bitrv2(nw, ip + 2, w);
668 static void makect(
int nc,
int *ip, FPType *c)
676 delta = atan(1.0) / nch;
677 c[0] = cos(delta * nch);
679 for (j = 1; j < nch; j++) {
680 c[j] = 0.5 * cos(delta * j);
681 c[nc - j] = 0.5 * sin(delta * j);
688 static void bitrv2(
int n,
int *ip, FPType *a)
690 int j, j1, k, k1, l, m, m2;
691 double xr, xi, yr, yi;
696 while ((m << 3) < l) {
698 for (j = 0; j < m; j++) {
699 ip[m + j] = ip[j] + l;
705 for (k = 0; k < m; k++) {
706 for (j = 0; j < k; j++) {
748 j1 = 2 * k + m2 + ip[k];
760 for (k = 1; k < m; k++) {
761 for (j = 0; j < k; j++) {
787 static void bitrv2conj(
int n,
int *ip, FPType *a)
789 int j, j1, k, k1, l, m, m2;
790 double xr, xi, yr, yi;
795 while ((m << 3) < l) {
797 for (j = 0; j < m; j++) {
798 ip[m + j] = ip[j] + l;
804 for (k = 0; k < m; k++) {
805 for (j = 0; j < k; j++) {
848 a[k1 + 1] = -a[k1 + 1];
860 a[k1 + 1] = -a[k1 + 1];
864 a[m2 + 1] = -a[m2 + 1];
865 for (k = 1; k < m; k++) {
866 for (j = 0; j < k; j++) {
889 a[k1 + 1] = -a[k1 + 1];
890 a[k1 + m2 + 1] = -a[k1 + m2 + 1];
895 static void cftfsub(
int n, FPType *a,
const FPType *w)
897 int j, j1, j2, j3, l;
898 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
904 while ((l << 2) < n) {
910 for (j = 0; j < l; j += 2) {
915 x0i = a[j + 1] + a[j1 + 1];
917 x1i = a[j + 1] - a[j1 + 1];
919 x2i = a[j2 + 1] + a[j3 + 1];
921 x3i = a[j2 + 1] - a[j3 + 1];
923 a[j + 1] = x0i + x2i;
925 a[j2 + 1] = x0i - x2i;
927 a[j1 + 1] = x1i + x3r;
929 a[j3 + 1] = x1i - x3r;
932 for (j = 0; j < l; j += 2) {
935 x0i = a[j + 1] - a[j1 + 1];
937 a[j + 1] += a[j1 + 1];
944 static void cftbsub(
int n, FPType *a,
const FPType *w)
946 int j, j1, j2, j3, l;
947 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
953 while ((l << 2) < n) {
959 for (j = 0; j < l; j += 2) {
964 x0i = -a[j + 1] - a[j1 + 1];
966 x1i = -a[j + 1] + a[j1 + 1];
968 x2i = a[j2 + 1] + a[j3 + 1];
970 x3i = a[j2 + 1] - a[j3 + 1];
972 a[j + 1] = x0i - x2i;
974 a[j2 + 1] = x0i + x2i;
976 a[j1 + 1] = x1i - x3r;
978 a[j3 + 1] = x1i + x3r;
981 for (j = 0; j < l; j += 2) {
984 x0i = -a[j + 1] + a[j1 + 1];
986 a[j + 1] = -a[j + 1] - a[j1 + 1];
993 static void cft1st(
int n, FPType *a,
const FPType *w)
996 double wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
997 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1020 x2r = a[12] + a[14];
1021 x2i = a[13] + a[15];
1022 x3r = a[12] - a[14];
1023 x3i = a[13] - a[15];
1030 a[10] = wk1r * (x0r - x0i);
1031 a[11] = wk1r * (x0r + x0i);
1034 a[14] = wk1r * (x0i - x0r);
1035 a[15] = wk1r * (x0i + x0r);
1037 for (j = 16; j < n; j += 16) {
1044 wk3r = wk1r - 2 * wk2i * wk1i;
1045 wk3i = 2 * wk2i * wk1r - wk1i;
1046 x0r = a[j] + a[j + 2];
1047 x0i = a[j + 1] + a[j + 3];
1048 x1r = a[j] - a[j + 2];
1049 x1i = a[j + 1] - a[j + 3];
1050 x2r = a[j + 4] + a[j + 6];
1051 x2i = a[j + 5] + a[j + 7];
1052 x3r = a[j + 4] - a[j + 6];
1053 x3i = a[j + 5] - a[j + 7];
1055 a[j + 1] = x0i + x2i;
1058 a[j + 4] = wk2r * x0r - wk2i * x0i;
1059 a[j + 5] = wk2r * x0i + wk2i * x0r;
1062 a[j + 2] = wk1r * x0r - wk1i * x0i;
1063 a[j + 3] = wk1r * x0i + wk1i * x0r;
1066 a[j + 6] = wk3r * x0r - wk3i * x0i;
1067 a[j + 7] = wk3r * x0i + wk3i * x0r;
1070 wk3r = wk1r - 2 * wk2r * wk1i;
1071 wk3i = 2 * wk2r * wk1r - wk1i;
1072 x0r = a[j + 8] + a[j + 10];
1073 x0i = a[j + 9] + a[j + 11];
1074 x1r = a[j + 8] - a[j + 10];
1075 x1i = a[j + 9] - a[j + 11];
1076 x2r = a[j + 12] + a[j + 14];
1077 x2i = a[j + 13] + a[j + 15];
1078 x3r = a[j + 12] - a[j + 14];
1079 x3i = a[j + 13] - a[j + 15];
1080 a[j + 8] = x0r + x2r;
1081 a[j + 9] = x0i + x2i;
1084 a[j + 12] = -wk2i * x0r - wk2r * x0i;
1085 a[j + 13] = -wk2i * x0i + wk2r * x0r;
1088 a[j + 10] = wk1r * x0r - wk1i * x0i;
1089 a[j + 11] = wk1r * x0i + wk1i * x0r;
1092 a[j + 14] = wk3r * x0r - wk3i * x0i;
1093 a[j + 15] = wk3r * x0i + wk3i * x0r;
1097 static void cftmdl(
int n,
int l, FPType *a,
const FPType *w)
1099 int j, j1, j2, j3, k, k1, k2, m, m2;
1100 double wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
1101 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1104 for (j = 0; j < l; j += 2) {
1109 x0i = a[j + 1] + a[j1 + 1];
1111 x1i = a[j + 1] - a[j1 + 1];
1112 x2r = a[j2] + a[j3];
1113 x2i = a[j2 + 1] + a[j3 + 1];
1114 x3r = a[j2] - a[j3];
1115 x3i = a[j2 + 1] - a[j3 + 1];
1117 a[j + 1] = x0i + x2i;
1119 a[j2 + 1] = x0i - x2i;
1121 a[j1 + 1] = x1i + x3r;
1123 a[j3 + 1] = x1i - x3r;
1126 for (j = m; j < l + m; j += 2) {
1131 x0i = a[j + 1] + a[j1 + 1];
1133 x1i = a[j + 1] - a[j1 + 1];
1134 x2r = a[j2] + a[j3];
1135 x2i = a[j2 + 1] + a[j3 + 1];
1136 x3r = a[j2] - a[j3];
1137 x3i = a[j2 + 1] - a[j3 + 1];
1139 a[j + 1] = x0i + x2i;
1141 a[j2 + 1] = x0r - x2r;
1144 a[j1] = wk1r * (x0r - x0i);
1145 a[j1 + 1] = wk1r * (x0r + x0i);
1148 a[j3] = wk1r * (x0i - x0r);
1149 a[j3 + 1] = wk1r * (x0i + x0r);
1153 for (k = m2; k < n; k += m2) {
1160 wk3r = wk1r - 2 * wk2i * wk1i;
1161 wk3i = 2 * wk2i * wk1r - wk1i;
1162 for (j = k; j < l + k; j += 2) {
1167 x0i = a[j + 1] + a[j1 + 1];
1169 x1i = a[j + 1] - a[j1 + 1];
1170 x2r = a[j2] + a[j3];
1171 x2i = a[j2 + 1] + a[j3 + 1];
1172 x3r = a[j2] - a[j3];
1173 x3i = a[j2 + 1] - a[j3 + 1];
1175 a[j + 1] = x0i + x2i;
1178 a[j2] = wk2r * x0r - wk2i * x0i;
1179 a[j2 + 1] = wk2r * x0i + wk2i * x0r;
1182 a[j1] = wk1r * x0r - wk1i * x0i;
1183 a[j1 + 1] = wk1r * x0i + wk1i * x0r;
1186 a[j3] = wk3r * x0r - wk3i * x0i;
1187 a[j3 + 1] = wk3r * x0i + wk3i * x0r;
1191 wk3r = wk1r - 2 * wk2r * wk1i;
1192 wk3i = 2 * wk2r * wk1r - wk1i;
1193 for (j = k + m; j < l + (k + m); j += 2) {
1198 x0i = a[j + 1] + a[j1 + 1];
1200 x1i = a[j + 1] - a[j1 + 1];
1201 x2r = a[j2] + a[j3];
1202 x2i = a[j2 + 1] + a[j3 + 1];
1203 x3r = a[j2] - a[j3];
1204 x3i = a[j2 + 1] - a[j3 + 1];
1206 a[j + 1] = x0i + x2i;
1209 a[j2] = -wk2i * x0r - wk2r * x0i;
1210 a[j2 + 1] = -wk2i * x0i + wk2r * x0r;
1213 a[j1] = wk1r * x0r - wk1i * x0i;
1214 a[j1 + 1] = wk1r * x0i + wk1i * x0r;
1217 a[j3] = wk3r * x0r - wk3i * x0i;
1218 a[j3 + 1] = wk3r * x0i + wk3i * x0r;
1223 static void rftfsub(
int n, FPType *a,
int nc,
const FPType *c)
1225 int j, k, kk, ks, m;
1226 double wkr, wki, xr, xi, yr, yi;
1231 for (j = 2; j < m; j += 2) {
1234 wkr = 0.5 - c[nc - kk];
1237 xi = a[j + 1] + a[k + 1];
1238 yr = wkr * xr - wki * xi;
1239 yi = wkr * xi + wki * xr;
1247 static void rftbsub(
int n, FPType *a,
int nc,
const FPType *c)
1249 int j, k, kk, ks, m;
1250 double wkr, wki, xr, xi, yr, yi;
1256 for (j = 2; j < m; j += 2) {
1259 wkr = 0.5 - c[nc - kk];
1262 xi = a[j + 1] + a[k + 1];
1263 yr = wkr * xr + wki * xi;
1264 yi = wkr * xi - wki * xr;
1266 a[j + 1] = yi - a[j + 1];
1268 a[k + 1] = yi - a[k + 1];
1270 a[m + 1] = -a[m + 1];
1273 static void dctsub(
int n, FPType *a,
int nc,
const FPType *c)
1275 int j, k, kk, ks, m;
1276 double wkr, wki, xr;
1281 for (j = 1; j < m; j++) {
1284 wkr = c[kk] - c[nc - kk];
1285 wki = c[kk] + c[nc - kk];
1286 xr = wki * a[j] - wkr * a[k];
1287 a[j] = wkr * a[j] + wki * a[k];
1293 static void dstsub(
int n, FPType *a,
int nc,
const FPType *c)
1295 int j, k, kk, ks, m;
1296 double wkr, wki, xr;
1301 for (j = 1; j < m; j++) {
1304 wkr = c[kk] - c[nc - kk];
1305 wki = c[kk] + c[nc - kk];
1306 xr = wki * a[k] - wkr * a[j];
1307 a[k] = wkr * a[k] + wki * a[j];
1316 #endif // R8B_FFT4G_INCLUDED Real-valued FFT transform class.
Definition: CDSPRealFFT.h:47
A wrapper class around Takuya OOURA's FFT functions.
Definition: fft4g.h:305
The "r8brain-free-src" library namespace.
Definition: CDSPBlockConvolver.h:21