213 void cdft(
int n,
int isgn,
double *a)
215 void bitrv2(
int n,
double *a);
216 void bitrv2conj(
int n,
double *a);
217 void cftfsub(
int n,
double *a);
218 void cftbsub(
int n,
double *a);
234 void rdft(
int n,
int isgn,
double *a)
236 void bitrv2(
int n,
double *a);
237 void cftfsub(
int n,
double *a);
238 void cftbsub(
int n,
double *a);
239 void rftfsub(
int n,
double *a);
240 void rftbsub(
int n,
double *a);
255 a[1] = 0.5 * (a[0] - a[1]);
268 void ddct(
int n,
int isgn,
double *a)
270 void bitrv2(
int n,
double *a);
271 void cftfsub(
int n,
double *a);
272 void cftbsub(
int n,
double *a);
273 void rftfsub(
int n,
double *a);
274 void rftbsub(
int n,
double *a);
275 void dctsub(
int n,
double *a);
276 void dctsub4(
int n,
double *a);
282 for (j = n - 2; j >= 2; j -= 2) {
283 a[j + 1] = a[j] - a[j - 1];
311 for (j = 2; j < n; j += 2) {
312 a[j - 1] = a[j] - a[j + 1];
320 void ddst(
int n,
int isgn,
double *a)
322 void bitrv2(
int n,
double *a);
323 void cftfsub(
int n,
double *a);
324 void cftbsub(
int n,
double *a);
325 void rftfsub(
int n,
double *a);
326 void rftbsub(
int n,
double *a);
327 void dstsub(
int n,
double *a);
328 void dstsub4(
int n,
double *a);
334 for (j = n - 2; j >= 2; j -= 2) {
335 a[j + 1] = -a[j] - a[j - 1];
363 for (j = 2; j < n; j += 2) {
364 a[j - 1] = -a[j] - a[j + 1];
372 void dfct(
int n,
double *a)
374 void ddct(
int n,
int isgn,
double *a);
375 void bitrv1(
int n,
double *a);
377 double xr, xi, yr, yi, an;
380 for (j = 0; j < m; j++) {
395 for (j = 1; j < mh; j++) {
419 void dfst(
int n,
double *a)
421 void ddst(
int n,
int isgn,
double *a);
422 void bitrv1(
int n,
double *a);
424 double xr, xi, yr, yi;
427 for (j = 1; j < m; j++) {
438 for (j = 1; j < mh; j++) {
465 #define M_PI_2 1.570796326794896619231321691639751442098584699687
468 #define WR5000 0.707106781186547524400844362104849039284835937688
471 #define WR2500 0.923879532511286756128183189396788286822416625863
474 #define WI2500 0.382683432365089771728459984030398866761344562485
478 #ifndef RDFT_LOOP_DIV
479 #define RDFT_LOOP_DIV 64
482 #ifndef DCST_LOOP_DIV
483 #define DCST_LOOP_DIV 64
487 void bitrv2(
int n,
double *a)
489 int j0, k0, j1, k1, l, m, i, j, k;
490 double xr, xi, yr, yi;
500 for (k0 = 0; k0 < m; k0 += 2) {
502 for (j = j0; j < j0 + k0; j += 2) {
541 for (i = n >> 1; i > (k ^= i); i >>= 1);
553 for (i = n >> 1; i > (j0 ^= i); i >>= 1);
557 for (k0 = 2; k0 < m; k0 += 2) {
558 for (i = n >> 1; i > (j0 ^= i); i >>= 1);
560 for (j = j0; j < j0 + k0; j += 2) {
579 for (i = n >> 1; i > (k ^= i); i >>= 1);
586 void bitrv2conj(
int n,
double *a)
588 int j0, k0, j1, k1, l, m, i, j, k;
589 double xr, xi, yr, yi;
599 for (k0 = 0; k0 < m; k0 += 2) {
601 for (j = j0; j < j0 + k0; j += 2) {
640 for (i = n >> 1; i > (k ^= i); i >>= 1);
643 a[k1 + 1] = -a[k1 + 1];
655 a[k1 + 1] = -a[k1 + 1];
656 for (i = n >> 1; i > (j0 ^= i); i >>= 1);
660 a[m + 1] = -a[m + 1];
662 for (k0 = 2; k0 < m; k0 += 2) {
663 for (i = n >> 1; i > (j0 ^= i); i >>= 1);
665 for (j = j0; j < j0 + k0; j += 2) {
684 for (i = n >> 1; i > (k ^= i); i >>= 1);
687 a[k1 + 1] = -a[k1 + 1];
688 a[k1 + m + 1] = -a[k1 + m + 1];
694 void bitrv1(
int n,
double *a)
696 int j0, k0, j1, k1, l, m, i, j, k;
707 for (k0 = 0; k0 < m; k0++) {
709 for (j = j0; j < j0 + k0; j++) {
728 for (i = n >> 1; i > (k ^= i); i >>= 1);
735 for (i = n >> 1; i > (j0 ^= i); i >>= 1);
739 for (k0 = 1; k0 < m; k0++) {
740 for (i = n >> 1; i > (j0 ^= i); i >>= 1);
742 for (j = j0; j < j0 + k0; j++) {
751 for (i = n >> 1; i > (k ^= i); i >>= 1);
758 void cftfsub(
int n,
double *a)
760 void cft1st(
int n,
double *a);
761 void cftmdl(
int n,
int l,
double *a);
762 int j, j1, j2, j3, l;
763 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
769 while ((l << 2) < n) {
775 for (j = 0; j < l; j += 2) {
780 x0i = a[j + 1] + a[j1 + 1];
782 x1i = a[j + 1] - a[j1 + 1];
784 x2i = a[j2 + 1] + a[j3 + 1];
786 x3i = a[j2 + 1] - a[j3 + 1];
788 a[j + 1] = x0i + x2i;
790 a[j2 + 1] = x0i - x2i;
792 a[j1 + 1] = x1i + x3r;
794 a[j3 + 1] = x1i - x3r;
797 for (j = 0; j < l; j += 2) {
800 x0i = a[j + 1] - a[j1 + 1];
802 a[j + 1] += a[j1 + 1];
810 void cftbsub(
int n,
double *a)
812 void cft1st(
int n,
double *a);
813 void cftmdl(
int n,
int l,
double *a);
814 int j, j1, j2, j3, l;
815 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
821 while ((l << 2) < n) {
827 for (j = 0; j < l; j += 2) {
832 x0i = -a[j + 1] - a[j1 + 1];
834 x1i = -a[j + 1] + a[j1 + 1];
836 x2i = a[j2 + 1] + a[j3 + 1];
838 x3i = a[j2 + 1] - a[j3 + 1];
840 a[j + 1] = x0i - x2i;
842 a[j2 + 1] = x0i + x2i;
844 a[j1 + 1] = x1i - x3r;
846 a[j3 + 1] = x1i + x3r;
849 for (j = 0; j < l; j += 2) {
852 x0i = -a[j + 1] + a[j1 + 1];
854 a[j + 1] = -a[j + 1] - a[j1 + 1];
862 void cft1st(
int n,
double *a)
865 double ew, wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
866 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
899 a[10] = wn4r * (x0r - x0i);
900 a[11] = wn4r * (x0r + x0i);
903 a[14] = wn4r * (x0i - x0r);
904 a[15] = wn4r * (x0i + x0r);
907 for (j = 16; j < n; j += 16) {
908 for (kj = n >> 2; kj > (kr ^= kj); kj >>= 1);
911 wk2r = 1 - 2 * wk1i * wk1i;
912 wk2i = 2 * wk1i * wk1r;
913 wk3r = wk1r - 2 * wk2i * wk1i;
914 wk3i = 2 * wk2i * wk1r - wk1i;
915 x0r = a[j] + a[j + 2];
916 x0i = a[j + 1] + a[j + 3];
917 x1r = a[j] - a[j + 2];
918 x1i = a[j + 1] - a[j + 3];
919 x2r = a[j + 4] + a[j + 6];
920 x2i = a[j + 5] + a[j + 7];
921 x3r = a[j + 4] - a[j + 6];
922 x3i = a[j + 5] - a[j + 7];
924 a[j + 1] = x0i + x2i;
927 a[j + 4] = wk2r * x0r - wk2i * x0i;
928 a[j + 5] = wk2r * x0i + wk2i * x0r;
931 a[j + 2] = wk1r * x0r - wk1i * x0i;
932 a[j + 3] = wk1r * x0i + wk1i * x0r;
935 a[j + 6] = wk3r * x0r - wk3i * x0i;
936 a[j + 7] = wk3r * x0i + wk3i * x0r;
937 x0r = wn4r * (wk1r - wk1i);
938 wk1i = wn4r * (wk1r + wk1i);
940 wk3r = wk1r - 2 * wk2r * wk1i;
941 wk3i = 2 * wk2r * wk1r - wk1i;
942 x0r = a[j + 8] + a[j + 10];
943 x0i = a[j + 9] + a[j + 11];
944 x1r = a[j + 8] - a[j + 10];
945 x1i = a[j + 9] - a[j + 11];
946 x2r = a[j + 12] + a[j + 14];
947 x2i = a[j + 13] + a[j + 15];
948 x3r = a[j + 12] - a[j + 14];
949 x3i = a[j + 13] - a[j + 15];
950 a[j + 8] = x0r + x2r;
951 a[j + 9] = x0i + x2i;
954 a[j + 12] = -wk2i * x0r - wk2r * x0i;
955 a[j + 13] = -wk2i * x0i + wk2r * x0r;
958 a[j + 10] = wk1r * x0r - wk1i * x0i;
959 a[j + 11] = wk1r * x0i + wk1i * x0r;
962 a[j + 14] = wk3r * x0r - wk3i * x0i;
963 a[j + 15] = wk3r * x0i + wk3i * x0r;
968 void cftmdl(
int n,
int l,
double *a)
970 int j, j1, j2, j3, k, kj, kr, m, m2;
971 double ew, wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
972 double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
975 for (j = 0; j < l; j += 2) {
980 x0i = a[j + 1] + a[j1 + 1];
982 x1i = a[j + 1] - a[j1 + 1];
984 x2i = a[j2 + 1] + a[j3 + 1];
986 x3i = a[j2 + 1] - a[j3 + 1];
988 a[j + 1] = x0i + x2i;
990 a[j2 + 1] = x0i - x2i;
992 a[j1 + 1] = x1i + x3r;
994 a[j3 + 1] = x1i - x3r;
997 for (j = m; j < l + m; j += 2) {
1002 x0i = a[j + 1] + a[j1 + 1];
1004 x1i = a[j + 1] - a[j1 + 1];
1005 x2r = a[j2] + a[j3];
1006 x2i = a[j2 + 1] + a[j3 + 1];
1007 x3r = a[j2] - a[j3];
1008 x3i = a[j2 + 1] - a[j3 + 1];
1010 a[j + 1] = x0i + x2i;
1012 a[j2 + 1] = x0r - x2r;
1015 a[j1] = wn4r * (x0r - x0i);
1016 a[j1 + 1] = wn4r * (x0r + x0i);
1019 a[j3] = wn4r * (x0i - x0r);
1020 a[j3 + 1] = wn4r * (x0i + x0r);
1025 for (k = m2; k < n; k += m2) {
1026 for (kj = n >> 2; kj > (kr ^= kj); kj >>= 1);
1027 wk1r = cos(ew * kr);
1028 wk1i = sin(ew * kr);
1029 wk2r = 1 - 2 * wk1i * wk1i;
1030 wk2i = 2 * wk1i * wk1r;
1031 wk3r = wk1r - 2 * wk2i * wk1i;
1032 wk3i = 2 * wk2i * wk1r - wk1i;
1033 for (j = k; j < l + k; j += 2) {
1038 x0i = a[j + 1] + a[j1 + 1];
1040 x1i = a[j + 1] - a[j1 + 1];
1041 x2r = a[j2] + a[j3];
1042 x2i = a[j2 + 1] + a[j3 + 1];
1043 x3r = a[j2] - a[j3];
1044 x3i = a[j2 + 1] - a[j3 + 1];
1046 a[j + 1] = x0i + x2i;
1049 a[j2] = wk2r * x0r - wk2i * x0i;
1050 a[j2 + 1] = wk2r * x0i + wk2i * x0r;
1053 a[j1] = wk1r * x0r - wk1i * x0i;
1054 a[j1 + 1] = wk1r * x0i + wk1i * x0r;
1057 a[j3] = wk3r * x0r - wk3i * x0i;
1058 a[j3 + 1] = wk3r * x0i + wk3i * x0r;
1060 x0r = wn4r * (wk1r - wk1i);
1061 wk1i = wn4r * (wk1r + wk1i);
1063 wk3r = wk1r - 2 * wk2r * wk1i;
1064 wk3i = 2 * wk2r * wk1r - wk1i;
1065 for (j = k + m; j < l + (k + m); j += 2) {
1070 x0i = a[j + 1] + a[j1 + 1];
1072 x1i = a[j + 1] - a[j1 + 1];
1073 x2r = a[j2] + a[j3];
1074 x2i = a[j2 + 1] + a[j3 + 1];
1075 x3r = a[j2] - a[j3];
1076 x3i = a[j2 + 1] - a[j3 + 1];
1078 a[j + 1] = x0i + x2i;
1081 a[j2] = -wk2i * x0r - wk2r * x0i;
1082 a[j2 + 1] = -wk2i * x0i + wk2r * x0r;
1085 a[j1] = wk1r * x0r - wk1i * x0i;
1086 a[j1 + 1] = wk1r * x0i + wk1i * x0r;
1089 a[j3] = wk3r * x0r - wk3i * x0i;
1090 a[j3 + 1] = wk3r * x0i + wk3i * x0r;
1096 void rftfsub(
int n,
double *a)
1099 double ec, w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi;
1101 ec = 2 * M_PI_2 / n;
1113 i0 = i - 4 * RDFT_LOOP_DIV;
1117 for (j = i - 4; j >= i0; j -= 4) {
1119 xr = a[j + 2] - a[k - 2];
1120 xi = a[j + 3] + a[k - 1];
1121 yr = wdr * xr - wdi * xi;
1122 yi = wdr * xi + wdi * xr;
1128 wki += ss * (0.5 - wdr);
1130 xi = a[j + 1] + a[k + 1];
1131 yr = wkr * xr - wki * xi;
1132 yi = wkr * xi + wki * xr;
1138 wdi += ss * (0.5 - wkr);
1143 wkr = 0.5 * sin(ec * i0);
1144 wki = 0.5 * cos(ec * i0);
1145 wdr = 0.5 - (wkr * w1r - wki * w1i);
1146 wdi = wkr * w1i + wki * w1r;
1150 xr = a[2] - a[n - 2];
1151 xi = a[3] + a[n - 1];
1152 yr = wdr * xr - wdi * xi;
1153 yi = wdr * xi + wdi * xr;
1161 void rftbsub(
int n,
double *a)
1164 double ec, w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi;
1166 ec = 2 * M_PI_2 / n;
1177 a[i + 1] = -a[i + 1];
1179 i0 = i - 4 * RDFT_LOOP_DIV;
1183 for (j = i - 4; j >= i0; j -= 4) {
1185 xr = a[j + 2] - a[k - 2];
1186 xi = a[j + 3] + a[k - 1];
1187 yr = wdr * xr + wdi * xi;
1188 yi = wdr * xi - wdi * xr;
1190 a[j + 3] = yi - a[j + 3];
1192 a[k - 1] = yi - a[k - 1];
1194 wki += ss * (0.5 - wdr);
1196 xi = a[j + 1] + a[k + 1];
1197 yr = wkr * xr + wki * xi;
1198 yi = wkr * xi - wki * xr;
1200 a[j + 1] = yi - a[j + 1];
1202 a[k + 1] = yi - a[k + 1];
1204 wdi += ss * (0.5 - wkr);
1209 wkr = 0.5 * sin(ec * i0);
1210 wki = 0.5 * cos(ec * i0);
1211 wdr = 0.5 - (wkr * w1r - wki * w1i);
1212 wdi = wkr * w1i + wki * w1r;
1216 xr = a[2] - a[n - 2];
1217 xi = a[3] + a[n - 1];
1218 yr = wdr * xr + wdi * xi;
1219 yi = wdr * xi - wdi * xr;
1223 a[n - 1] = yi - a[n - 1];
1228 void dctsub(
int n,
double *a)
1231 double ec, w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi;
1238 wdr = 0.5 * (w1r - w1i);
1239 wdi = 0.5 * (w1r + w1i);
1244 i0 = i + 2 * DCST_LOOP_DIV;
1248 for (j = i + 2; j <= i0; j += 2) {
1250 xr = wdi * a[j - 1] - wdr * a[k + 1];
1251 xi = wdr * a[j - 1] + wdi * a[k + 1];
1254 yr = wki * a[j] - wkr * a[k];
1255 yi = wkr * a[j] + wki * a[k];
1268 wkr = 0.5 * (wdr - wdi);
1269 wki = 0.5 * (wdr + wdi);
1270 wdr = wkr * w1r - wki * w1i;
1271 wdi = wkr * w1i + wki * w1r;
1274 xr = wdi * a[m - 1] - wdr * a[m + 1];
1275 a[m - 1] = wdr * a[m - 1] + wdi * a[m + 1];
1277 a[m] *= wki + ss * wdr;
1281 void dstsub(
int n,
double *a)
1284 double ec, w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi;
1291 wdr = 0.5 * (w1r - w1i);
1292 wdi = 0.5 * (w1r + w1i);
1297 i0 = i + 2 * DCST_LOOP_DIV;
1301 for (j = i + 2; j <= i0; j += 2) {
1303 xr = wdi * a[k + 1] - wdr * a[j - 1];
1304 xi = wdr * a[k + 1] + wdi * a[j - 1];
1307 yr = wki * a[k] - wkr * a[j];
1308 yi = wkr * a[k] + wki * a[j];
1321 wkr = 0.5 * (wdr - wdi);
1322 wki = 0.5 * (wdr + wdi);
1323 wdr = wkr * w1r - wki * w1i;
1324 wdi = wkr * w1i + wki * w1r;
1327 xr = wdi * a[m + 1] - wdr * a[m - 1];
1328 a[m + 1] = wdr * a[m + 1] + wdi * a[m - 1];
1330 a[m] *= wki + ss * wdr;
1334 void dctsub4(
int n,
double *a)
1337 double wki, wdr, wdi, xr;
1344 xr = wdi * a[1] - wdr * a[3];
1345 a[1] = wdr * a[1] + wdi * a[3];
1352 void dstsub4(
int n,
double *a)
1355 double wki, wdr, wdi, xr;
1362 xr = wdi * a[3] - wdr * a[1];
1363 a[3] = wdr * a[3] + wdi * a[1];