17#ifndef R8B_FFT4G_INCLUDED
18#define R8B_FFT4G_INCLUDED
308typedef double FPType;
310static void cdft(
int n,
int isgn, FPType *a,
int *ip, FPType *w)
312 if (n > (ip[0] << 2)) {
313 makewt(n >> 2, ip, w);
317 bitrv2(n, ip + 2, a);
320 bitrv2conj(n, ip + 2, a);
328static void rdft(
int n,
int isgn, FPType *a,
int *ip, FPType *w)
341 makect(nc, ip, w + nw);
345 bitrv2(n, ip + 2, a);
347 rftfsub(n, a, nc, w + nw);
355 a[1] = 0.5 * (a[0] - a[1]);
358 rftbsub(n, a, nc, w + nw);
359 bitrv2(n, ip + 2, a);
367static void ddct(
int n,
int isgn, FPType *a,
int *ip, FPType *w)
380 makect(nc, ip, w + nw);
384 for (j = n - 2; j >= 2; j -= 2) {
385 a[j + 1] = a[j] - a[j - 1];
391 rftbsub(n, a, nc, w + nw);
392 bitrv2(n, ip + 2, a);
398 dctsub(n, a, nc, w + nw);
401 bitrv2(n, ip + 2, a);
403 rftfsub(n, a, nc, w + nw);
409 for (j = 2; j < n; j += 2) {
410 a[j - 1] = a[j] - a[j + 1];
417static void ddst(
int n,
int isgn, FPType *a,
int *ip, FPType *w)
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];
467static void dfct(
int n, FPType *a, FPType *t,
int *ip, FPType *w)
469 int j, k, l, m, mh, nw, nc;
470 double xr, xi, yr, yi;
480 makect(nc, ip, w + nw);
490 for (j = 1; j < mh; j++) {
492 xr = a[j] - a[n - j];
493 xi = a[j] + a[n - j];
494 yr = a[k] - a[n - k];
495 yi = a[k] + a[n - k];
501 t[mh] = a[mh] + a[n - mh];
503 dctsub(m, a, nc, w + nw);
505 bitrv2(m, ip + 2, a);
507 rftfsub(m, a, nc, w + nw);
511 a[n - 1] = a[0] - a[1];
513 for (j = m - 2; j >= 2; j -= 2) {
514 a[2 * j + 1] = a[j] + a[j + 1];
515 a[2 * j - 1] = a[j] - a[j + 1];
520 dctsub(m, t, nc, w + nw);
522 bitrv2(m, ip + 2, t);
524 rftfsub(m, t, nc, w + nw);
528 a[n - l] = t[0] - t[1];
531 for (j = 2; j < m; j += 2) {
533 a[k - l] = t[j] - t[j + 1];
534 a[k + l] = t[j] + t[j + 1];
538 for (j = 0; j < mh; j++) {
540 t[j] = t[m + k] - t[m + j];
541 t[k] = t[m + k] + t[m + j];
556static void dfst(
int n, FPType *a, FPType *t,
int *ip, FPType *w)
558 int j, k, l, m, mh, nw, nc;
559 double xr, xi, yr, yi;
569 makect(nc, ip, w + nw);
574 for (j = 1; j < mh; j++) {
576 xr = a[j] + a[n - j];
577 xi = a[j] - a[n - j];
578 yr = a[k] + a[n - k];
579 yi = a[k] - a[n - k];
585 t[0] = a[mh] - a[n - mh];
588 dstsub(m, a, nc, w + nw);
590 bitrv2(m, ip + 2, a);
592 rftfsub(m, a, nc, w + nw);
596 a[n - 1] = a[1] - a[0];
598 for (j = m - 2; j >= 2; j -= 2) {
599 a[2 * j + 1] = a[j] - a[j + 1];
600 a[2 * j - 1] = -a[j] - a[j + 1];
605 dstsub(m, t, nc, w + nw);
607 bitrv2(m, ip + 2, t);
609 rftfsub(m, t, nc, w + nw);
613 a[n - l] = t[1] - t[0];
616 for (j = 2; j < m; j += 2) {
618 a[k - l] = -t[j] - t[j + 1];
619 a[k + l] = t[j] - t[j + 1];
623 for (j = 1; j < mh; j++) {
625 t[j] = t[m + k] + t[m + j];
626 t[k] = t[m + k] - t[m + j];
638static void makewt(
int nw,
int *ip, FPType *w)
647 delta = atan(1.0) / nwh;
650 w[nwh] = cos(delta * nwh);
653 for (j = 2; j < nwh; j += 2) {
661 bitrv2(nw, ip + 2, w);
666static void makect(
int nc,
int *ip, FPType *c)
674 delta = atan(1.0) / nch;
675 c[0] = cos(delta * nch);
677 for (j = 1; j < nch; j++) {
678 c[j] = 0.5 * cos(delta * j);
679 c[nc - j] = 0.5 * sin(delta * j);
686static void bitrv2(
int n,
int *ip, FPType *a)
688 int j, j1, k, k1, l, m, m2;
689 double xr, xi, yr, yi;
694 while ((m << 3) < l) {
696 for (j = 0; j < m; j++) {
697 ip[m + j] = ip[j] + l;
703 for (k = 0; k < m; k++) {
704 for (j = 0; j < k; j++) {
746 j1 = 2 * k + m2 + ip[k];
758 for (k = 1; k < m; k++) {
759 for (j = 0; j < k; j++) {
785static void bitrv2conj(
int n,
int *ip, FPType *a)
787 int j, j1, k, k1, l, m, m2;
788 double xr, xi, yr, yi;
793 while ((m << 3) < l) {
795 for (j = 0; j < m; j++) {
796 ip[m + j] = ip[j] + l;
802 for (k = 0; k < m; k++) {
803 for (j = 0; j < k; j++) {
846 a[k1 + 1] = -a[k1 + 1];
858 a[k1 + 1] = -a[k1 + 1];
862 a[m2 + 1] = -a[m2 + 1];
863 for (k = 1; k < m; k++) {
864 for (j = 0; j < k; j++) {
887 a[k1 + 1] = -a[k1 + 1];
888 a[k1 + m2 + 1] = -a[k1 + m2 + 1];
893static void cftfsub(
int n, FPType *a,
const FPType *w)
895 int j, j1, j2, j3, l;
896 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
902 while ((l << 2) < n) {
908 for (j = 0; j < l; j += 2) {
913 x0i = a[j + 1] + a[j1 + 1];
915 x1i = a[j + 1] - a[j1 + 1];
917 x2i = a[j2 + 1] + a[j3 + 1];
919 x3i = a[j2 + 1] - a[j3 + 1];
921 a[j + 1] = x0i + x2i;
923 a[j2 + 1] = x0i - x2i;
925 a[j1 + 1] = x1i + x3r;
927 a[j3 + 1] = x1i - x3r;
930 for (j = 0; j < l; j += 2) {
933 x0i = a[j + 1] - a[j1 + 1];
935 a[j + 1] += a[j1 + 1];
942static void cftbsub(
int n, FPType *a,
const FPType *w)
944 int j, j1, j2, j3, l;
945 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
951 while ((l << 2) < n) {
957 for (j = 0; j < l; j += 2) {
962 x0i = -a[j + 1] - a[j1 + 1];
964 x1i = -a[j + 1] + a[j1 + 1];
966 x2i = a[j2 + 1] + a[j3 + 1];
968 x3i = a[j2 + 1] - a[j3 + 1];
970 a[j + 1] = x0i - x2i;
972 a[j2 + 1] = x0i + x2i;
974 a[j1 + 1] = x1i - x3r;
976 a[j3 + 1] = x1i + x3r;
979 for (j = 0; j < l; j += 2) {
982 x0i = -a[j + 1] + a[j1 + 1];
984 a[j + 1] = -a[j + 1] - a[j1 + 1];
991static void cft1st(
int n, FPType *a,
const FPType *w)
994 double wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
995 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1018 x2r = a[12] + a[14];
1019 x2i = a[13] + a[15];
1020 x3r = a[12] - a[14];
1021 x3i = a[13] - a[15];
1028 a[10] = wk1r * (x0r - x0i);
1029 a[11] = wk1r * (x0r + x0i);
1032 a[14] = wk1r * (x0i - x0r);
1033 a[15] = wk1r * (x0i + x0r);
1035 for (j = 16; j < n; j += 16) {
1042 wk3r = wk1r - 2 * wk2i * wk1i;
1043 wk3i = 2 * wk2i * wk1r - wk1i;
1044 x0r = a[j] + a[j + 2];
1045 x0i = a[j + 1] + a[j + 3];
1046 x1r = a[j] - a[j + 2];
1047 x1i = a[j + 1] - a[j + 3];
1048 x2r = a[j + 4] + a[j + 6];
1049 x2i = a[j + 5] + a[j + 7];
1050 x3r = a[j + 4] - a[j + 6];
1051 x3i = a[j + 5] - a[j + 7];
1053 a[j + 1] = x0i + x2i;
1056 a[j + 4] = wk2r * x0r - wk2i * x0i;
1057 a[j + 5] = wk2r * x0i + wk2i * x0r;
1060 a[j + 2] = wk1r * x0r - wk1i * x0i;
1061 a[j + 3] = wk1r * x0i + wk1i * x0r;
1064 a[j + 6] = wk3r * x0r - wk3i * x0i;
1065 a[j + 7] = wk3r * x0i + wk3i * x0r;
1068 wk3r = wk1r - 2 * wk2r * wk1i;
1069 wk3i = 2 * wk2r * wk1r - wk1i;
1070 x0r = a[j + 8] + a[j + 10];
1071 x0i = a[j + 9] + a[j + 11];
1072 x1r = a[j + 8] - a[j + 10];
1073 x1i = a[j + 9] - a[j + 11];
1074 x2r = a[j + 12] + a[j + 14];
1075 x2i = a[j + 13] + a[j + 15];
1076 x3r = a[j + 12] - a[j + 14];
1077 x3i = a[j + 13] - a[j + 15];
1078 a[j + 8] = x0r + x2r;
1079 a[j + 9] = x0i + x2i;
1082 a[j + 12] = -wk2i * x0r - wk2r * x0i;
1083 a[j + 13] = -wk2i * x0i + wk2r * x0r;
1086 a[j + 10] = wk1r * x0r - wk1i * x0i;
1087 a[j + 11] = wk1r * x0i + wk1i * x0r;
1090 a[j + 14] = wk3r * x0r - wk3i * x0i;
1091 a[j + 15] = wk3r * x0i + wk3i * x0r;
1095static void cftmdl(
int n,
int l, FPType *a,
const FPType *w)
1097 int j, j1, j2, j3, k, k1, k2, m, m2;
1098 double wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
1099 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
1102 for (j = 0; j < l; j += 2) {
1107 x0i = a[j + 1] + a[j1 + 1];
1109 x1i = a[j + 1] - a[j1 + 1];
1110 x2r = a[j2] + a[j3];
1111 x2i = a[j2 + 1] + a[j3 + 1];
1112 x3r = a[j2] - a[j3];
1113 x3i = a[j2 + 1] - a[j3 + 1];
1115 a[j + 1] = x0i + x2i;
1117 a[j2 + 1] = x0i - x2i;
1119 a[j1 + 1] = x1i + x3r;
1121 a[j3 + 1] = x1i - x3r;
1124 for (j = m; j < l + m; j += 2) {
1129 x0i = a[j + 1] + a[j1 + 1];
1131 x1i = a[j + 1] - a[j1 + 1];
1132 x2r = a[j2] + a[j3];
1133 x2i = a[j2 + 1] + a[j3 + 1];
1134 x3r = a[j2] - a[j3];
1135 x3i = a[j2 + 1] - a[j3 + 1];
1137 a[j + 1] = x0i + x2i;
1139 a[j2 + 1] = x0r - x2r;
1142 a[j1] = wk1r * (x0r - x0i);
1143 a[j1 + 1] = wk1r * (x0r + x0i);
1146 a[j3] = wk1r * (x0i - x0r);
1147 a[j3 + 1] = wk1r * (x0i + x0r);
1151 for (k = m2; k < n; k += m2) {
1158 wk3r = wk1r - 2 * wk2i * wk1i;
1159 wk3i = 2 * wk2i * wk1r - wk1i;
1160 for (j = k; j < l + k; j += 2) {
1165 x0i = a[j + 1] + a[j1 + 1];
1167 x1i = a[j + 1] - a[j1 + 1];
1168 x2r = a[j2] + a[j3];
1169 x2i = a[j2 + 1] + a[j3 + 1];
1170 x3r = a[j2] - a[j3];
1171 x3i = a[j2 + 1] - a[j3 + 1];
1173 a[j + 1] = x0i + x2i;
1176 a[j2] = wk2r * x0r - wk2i * x0i;
1177 a[j2 + 1] = wk2r * x0i + wk2i * x0r;
1180 a[j1] = wk1r * x0r - wk1i * x0i;
1181 a[j1 + 1] = wk1r * x0i + wk1i * x0r;
1184 a[j3] = wk3r * x0r - wk3i * x0i;
1185 a[j3 + 1] = wk3r * x0i + wk3i * x0r;
1189 wk3r = wk1r - 2 * wk2r * wk1i;
1190 wk3i = 2 * wk2r * wk1r - wk1i;
1191 for (j = k + m; j < l + (k + m); 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] = -wk2i * x0r - wk2r * x0i;
1208 a[j2 + 1] = -wk2i * x0i + wk2r * 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;
1221static void rftfsub(
int n, FPType *a,
int nc,
const FPType *c)
1223 int j, k, kk, ks, m;
1224 double wkr, wki, xr, xi, yr, yi;
1229 for (j = 2; j < m; j += 2) {
1232 wkr = 0.5 - c[nc - kk];
1235 xi = a[j + 1] + a[k + 1];
1236 yr = wkr * xr - wki * xi;
1237 yi = wkr * xi + wki * xr;
1245static void rftbsub(
int n, FPType *a,
int nc,
const FPType *c)
1247 int j, k, kk, ks, m;
1248 double wkr, wki, xr, xi, yr, yi;
1254 for (j = 2; j < m; j += 2) {
1257 wkr = 0.5 - c[nc - kk];
1260 xi = a[j + 1] + a[k + 1];
1261 yr = wkr * xr + wki * xi;
1262 yi = wkr * xi - wki * xr;
1264 a[j + 1] = yi - a[j + 1];
1266 a[k + 1] = yi - a[k + 1];
1268 a[m + 1] = -a[m + 1];
1271static void dctsub(
int n, FPType *a,
int nc,
const FPType *c)
1273 int j, k, kk, ks, m;
1274 double wkr, wki, xr;
1279 for (j = 1; j < m; j++) {
1282 wkr = c[kk] - c[nc - kk];
1283 wki = c[kk] + c[nc - kk];
1284 xr = wki * a[j] - wkr * a[k];
1285 a[j] = wkr * a[j] + wki * a[k];
1291static void dstsub(
int n, FPType *a,
int nc,
const FPType *c)
1293 int j, k, kk, ks, m;
1294 double wkr, wki, xr;
1299 for (j = 1; j < m; j++) {
1302 wkr = c[kk] - c[nc - kk];
1303 wki = c[kk] + c[nc - kk];
1304 xr = wki * a[k] - wkr * a[j];
1305 a[k] = wkr * a[k] + wki * a[j];
The "r8brain-free-src" library namespace.
Definition: CDSPBlockConvolver.h:21
A wrapper class around Takuya OOURA's FFT functions.
Definition: fft4g.h:306