📄 libfft.h
字号:
a[0] = a[m + mh]; a[m + mh] = a[mh]; m = mh; } a[1] = a[0]; a[0] = 0; bitrv1(n, a);}/* -------- child routines -------- */#include <math.h>#ifndef M_PI_2#define M_PI_2 1.570796326794896619231321691639751442098584699687#endif#ifndef WR5000 /* cos(M_PI_2*0.5000) */#define WR5000 0.707106781186547524400844362104849039284835937688#endif#ifndef WR2500 /* cos(M_PI_2*0.2500) */#define WR2500 0.923879532511286756128183189396788286822416625863#endif#ifndef WI2500 /* sin(M_PI_2*0.2500) */#define WI2500 0.382683432365089771728459984030398866761344562485#endif#ifndef RDFT_LOOP_DIV /* control of the RDFT's speed & tolerance */#define RDFT_LOOP_DIV 64#endif#ifndef DCST_LOOP_DIV /* control of the DCT,DST's speed & tolerance */#define DCST_LOOP_DIV 64#endifvoid bitrv2(int n, double *a){ int j0, k0, j1, k1, l, m, i, j, k; double xr, xi, yr, yi; l = n >> 2; m = 2; while (m < l) { l >>= 1; m <<= 1; } if (m == l) { j0 = 0; for (k0 = 0; k0 < m; k0 += 2) { k = k0; for (j = j0; j < j0 + k0; j += 2) { xr = a[j]; xi = a[j + 1]; yr = a[k]; yi = a[k + 1]; a[j] = yr; a[j + 1] = yi; a[k] = xr; a[k + 1] = xi; j1 = j + m; k1 = k + 2 * m; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += m; k1 -= m; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += m; k1 += 2 * m; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; for (i = n >> 1; i > (k ^= i); i >>= 1); } j1 = j0 + k0 + m; k1 = j1 + m; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; for (i = n >> 1; i > (j0 ^= i); i >>= 1); } } else { j0 = 0; for (k0 = 2; k0 < m; k0 += 2) { for (i = n >> 1; i > (j0 ^= i); i >>= 1); k = k0; for (j = j0; j < j0 + k0; j += 2) { xr = a[j]; xi = a[j + 1]; yr = a[k]; yi = a[k + 1]; a[j] = yr; a[j + 1] = yi; a[k] = xr; a[k + 1] = xi; j1 = j + m; k1 = k + m; xr = a[j1]; xi = a[j1 + 1]; yr = a[k1]; yi = a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; for (i = n >> 1; i > (k ^= i); i >>= 1); } } }}void bitrv2conj(int n, double *a){ int j0, k0, j1, k1, l, m, i, j, k; double xr, xi, yr, yi; l = n >> 2; m = 2; while (m < l) { l >>= 1; m <<= 1; } if (m == l) { j0 = 0; for (k0 = 0; k0 < m; k0 += 2) { k = k0; for (j = j0; j < j0 + k0; j += 2) { xr = a[j]; xi = -a[j + 1]; yr = a[k]; yi = -a[k + 1]; a[j] = yr; a[j + 1] = yi; a[k] = xr; a[k + 1] = xi; j1 = j + m; k1 = k + 2 * m; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += m; k1 -= m; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; j1 += m; k1 += 2 * m; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; for (i = n >> 1; i > (k ^= i); i >>= 1); } k1 = j0 + k0; a[k1 + 1] = -a[k1 + 1]; j1 = k1 + m; k1 = j1 + m; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; k1 += m; a[k1 + 1] = -a[k1 + 1]; for (i = n >> 1; i > (j0 ^= i); i >>= 1); } } else { a[1] = -a[1]; a[m + 1] = -a[m + 1]; j0 = 0; for (k0 = 2; k0 < m; k0 += 2) { for (i = n >> 1; i > (j0 ^= i); i >>= 1); k = k0; for (j = j0; j < j0 + k0; j += 2) { xr = a[j]; xi = -a[j + 1]; yr = a[k]; yi = -a[k + 1]; a[j] = yr; a[j + 1] = yi; a[k] = xr; a[k + 1] = xi; j1 = j + m; k1 = k + m; xr = a[j1]; xi = -a[j1 + 1]; yr = a[k1]; yi = -a[k1 + 1]; a[j1] = yr; a[j1 + 1] = yi; a[k1] = xr; a[k1 + 1] = xi; for (i = n >> 1; i > (k ^= i); i >>= 1); } k1 = j0 + k0; a[k1 + 1] = -a[k1 + 1]; a[k1 + m + 1] = -a[k1 + m + 1]; } }}void bitrv1(int n, double *a){ int j0, k0, j1, k1, l, m, i, j, k; double x; l = n >> 2; m = 1; while (m < l) { l >>= 1; m <<= 1; } if (m == l) { j0 = 0; for (k0 = 0; k0 < m; k0++) { k = k0; for (j = j0; j < j0 + k0; j++) { x = a[j]; a[j] = a[k]; a[k] = x; j1 = j + m; k1 = k + 2 * m; x = a[j1]; a[j1] = a[k1]; a[k1] = x; j1 += m; k1 -= m; x = a[j1]; a[j1] = a[k1]; a[k1] = x; j1 += m; k1 += 2 * m; x = a[j1]; a[j1] = a[k1]; a[k1] = x; for (i = n >> 1; i > (k ^= i); i >>= 1); } j1 = j0 + k0 + m; k1 = j1 + m; x = a[j1]; a[j1] = a[k1]; a[k1] = x; for (i = n >> 1; i > (j0 ^= i); i >>= 1); } } else { j0 = 0; for (k0 = 1; k0 < m; k0++) { for (i = n >> 1; i > (j0 ^= i); i >>= 1); k = k0; for (j = j0; j < j0 + k0; j++) { x = a[j]; a[j] = a[k]; a[k] = x; j1 = j + m; k1 = k + m; x = a[j1]; a[j1] = a[k1]; a[k1] = x; for (i = n >> 1; i > (k ^= i); i >>= 1); } } }}void cftfsub(int n, double *a){ void cft1st(int n, double *a); void cftmdl(int n, int l, double *a); int j, j1, j2, j3, l; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; l = 2; if (n > 8) { cft1st(n, a); l = 8; while ((l << 2) < n) { cftmdl(n, l, a); l <<= 2; } } if ((l << 2) == n) { for (j = 0; j < l; j += 2) { j1 = j + l; j2 = j1 + l; j3 = j2 + l; x0r = a[j] + a[j1]; x0i = a[j + 1] + a[j1 + 1]; x1r = a[j] - a[j1]; x1i = a[j + 1] - a[j1 + 1]; x2r = a[j2] + a[j3]; x2i = a[j2 + 1] + a[j3 + 1]; x3r = a[j2] - a[j3]; x3i = a[j2 + 1] - a[j3 + 1]; a[j] = x0r + x2r; a[j + 1] = x0i + x2i; a[j2] = x0r - x2r; a[j2 + 1] = x0i - x2i; a[j1] = x1r - x3i; a[j1 + 1] = x1i + x3r; a[j3] = x1r + x3i; a[j3 + 1] = x1i - x3r; } } else { for (j = 0; j < l; j += 2) { j1 = j + l; x0r = a[j] - a[j1]; x0i = a[j + 1] - a[j1 + 1]; a[j] += a[j1]; a[j + 1] += a[j1 + 1]; a[j1] = x0r; a[j1 + 1] = x0i; } }}void cftbsub(int n, double *a){ void cft1st(int n, double *a); void cftmdl(int n, int l, double *a); int j, j1, j2, j3, l; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; l = 2; if (n > 8) { cft1st(n, a); l = 8; while ((l << 2) < n) { cftmdl(n, l, a); l <<= 2; } } if ((l << 2) == n) { for (j = 0; j < l; j += 2) { j1 = j + l; j2 = j1 + l; j3 = j2 + l; x0r = a[j] + a[j1]; x0i = -a[j + 1] - a[j1 + 1]; x1r = a[j] - a[j1]; x1i = -a[j + 1] + a[j1 + 1]; x2r = a[j2] + a[j3]; x2i = a[j2 + 1] + a[j3 + 1]; x3r = a[j2] - a[j3]; x3i = a[j2 + 1] - a[j3 + 1]; a[j] = x0r + x2r; a[j + 1] = x0i - x2i; a[j2] = x0r - x2r; a[j2 + 1] = x0i + x2i; a[j1] = x1r - x3i; a[j1 + 1] = x1i - x3r; a[j3] = x1r + x3i; a[j3 + 1] = x1i + x3r; } } else { for (j = 0; j < l; j += 2) { j1 = j + l; x0r = a[j] - a[j1]; x0i = -a[j + 1] + a[j1 + 1]; a[j] += a[j1]; a[j + 1] = -a[j + 1] - a[j1 + 1]; a[j1] = x0r; a[j1 + 1] = x0i; } }}void cft1st(int n, double *a){ int j, kj, kr; double ew, wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; x0r = a[0] + a[2]; x0i = a[1] + a[3]; x1r = a[0] - a[2]; x1i = a[1] - a[3]; x2r = a[4] + a[6]; x2i = a[5] + a[7]; x3r = a[4] - a[6]; x3i = a[5] - a[7]; a[0] = x0r + x2r; a[1] = x0i + x2i; a[4] = x0r - x2r; a[5] = x0i - x2i; a[2] = x1r - x3i; a[3] = x1i + x3r; a[6] = x1r + x3i; a[7] = x1i - x3r; wn4r = WR5000; x0r = a[8] + a[10]; x0i = a[9] + a[11]; x1r = a[8] - a[10]; x1i = a[9] - a[11]; x2r = a[12] + a[14]; x2i = a[13] + a[15]; x3r = a[12] - a[14]; x3i = a[13] - a[15]; a[8] = x0r + x2r; a[9] = x0i + x2i; a[12] = x2i - x0i; a[13] = x0r - x2r; x0r = x1r - x3i; x0i = x1i + x3r; a[10] = wn4r * (x0r - x0i); a[11] = wn4r * (x0r + x0i); x0r = x3i + x1r; x0i = x3r - x1i; a[14] = wn4r * (x0i - x0r); a[15] = wn4r * (x0i + x0r); ew = M_PI_2 / n; kr = 0; for (j = 16; j < n; j += 16) { for (kj = n >> 2; kj > (kr ^= kj); kj >>= 1); wk1r = cos(ew * kr); wk1i = sin(ew * kr); wk2r = 1 - 2 * wk1i * wk1i; wk2i = 2 * wk1i * wk1r; wk3r = wk1r - 2 * wk2i * wk1i; wk3i = 2 * wk2i * wk1r - wk1i; x0r = a[j] + a[j + 2]; x0i = a[j + 1] + a[j + 3]; x1r = a[j] - a[j + 2]; x1i = a[j + 1] - a[j + 3]; x2r = a[j + 4] + a[j + 6];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -