📄 fft4f2d.c
字号:
double xr, xi; ip[0] = 0; l = n; m = 1; while ((m << 1) < l) { l >>= 1; for (j = 0; j <= m - 1; j++) { ip[m + j] = ip[j] + l; } m <<= 1; } if ((m << 1) > l) { for (k = 1; k <= m - 1; k++) { for (j = 0; j <= k - 1; j++) { j1 = j + ip[k]; k1 = k + ip[j]; for (i = 0; i <= n2 - 2; i += 2) { xr = a[j1][i]; xi = a[j1][i + 1]; a[j1][i] = a[k1][i]; a[j1][i + 1] = a[k1][i + 1]; a[k1][i] = xr; a[k1][i + 1] = xi; } } } } else { for (k = 1; k <= m - 1; k++) { for (j = 0; j <= k - 1; j++) { j1 = j + ip[k]; k1 = k + ip[j]; for (i = 0; i <= n2 - 2; i += 2) { xr = a[j1][i]; xi = a[j1][i + 1]; a[j1][i] = a[k1][i]; a[j1][i + 1] = a[k1][i + 1]; a[k1][i] = xr; a[k1][i + 1] = xi; } j1 += m; k1 += m; for (i = 0; i <= n2 - 2; i += 2) { xr = a[j1][i]; xi = a[j1][i + 1]; a[j1][i] = a[k1][i]; a[j1][i + 1] = a[k1][i + 1]; a[k1][i] = xr; a[k1][i + 1] = xi; } } } }}void cftbcol(int n1, int n, double **a, double *w){ int i, j, j1, j2, j3, k, k1, ks, l, m; double wk1r, wk1i, wk2r, wk2i, wk3r, wk3i; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; for (i = 0; i <= n1 - 1; i++) { l = 2; while ((l << 1) < n) { m = l << 2; for (j = 0; j <= l - 2; j += 2) { j1 = j + l; j2 = j1 + l; j3 = j2 + l; x0r = a[i][j] + a[i][j1]; x0i = a[i][j + 1] + a[i][j1 + 1]; x1r = a[i][j] - a[i][j1]; x1i = a[i][j + 1] - a[i][j1 + 1]; x2r = a[i][j2] + a[i][j3]; x2i = a[i][j2 + 1] + a[i][j3 + 1]; x3r = a[i][j2] - a[i][j3]; x3i = a[i][j2 + 1] - a[i][j3 + 1]; a[i][j] = x0r + x2r; a[i][j + 1] = x0i + x2i; a[i][j2] = x0r - x2r; a[i][j2 + 1] = x0i - x2i; a[i][j1] = x1r - x3i; a[i][j1 + 1] = x1i + x3r; a[i][j3] = x1r + x3i; a[i][j3 + 1] = x1i - x3r; } if (m < n) { wk1r = w[2]; for (j = m; j <= l + m - 2; j += 2) { j1 = j + l; j2 = j1 + l; j3 = j2 + l; x0r = a[i][j] + a[i][j1]; x0i = a[i][j + 1] + a[i][j1 + 1]; x1r = a[i][j] - a[i][j1]; x1i = a[i][j + 1] - a[i][j1 + 1]; x2r = a[i][j2] + a[i][j3]; x2i = a[i][j2 + 1] + a[i][j3 + 1]; x3r = a[i][j2] - a[i][j3]; x3i = a[i][j2 + 1] - a[i][j3 + 1]; a[i][j] = x0r + x2r; a[i][j + 1] = x0i + x2i; a[i][j2] = x2i - x0i; a[i][j2 + 1] = x0r - x2r; x0r = x1r - x3i; x0i = x1i + x3r; a[i][j1] = wk1r * (x0r - x0i); a[i][j1 + 1] = wk1r * (x0r + x0i); x0r = x3i + x1r; x0i = x3r - x1i; a[i][j3] = wk1r * (x0i - x0r); a[i][j3 + 1] = wk1r * (x0i + x0r); } k1 = 1; ks = -1; for (k = (m << 1); k <= n - m; k += m) { k1++; ks = -ks; wk1r = w[k1 << 1]; wk1i = w[(k1 << 1) + 1]; wk2r = ks * w[k1]; wk2i = w[k1 + ks]; wk3r = wk1r - 2 * wk2i * wk1i; wk3i = 2 * wk2i * wk1r - wk1i; for (j = k; j <= l + k - 2; j += 2) { j1 = j + l; j2 = j1 + l; j3 = j2 + l; x0r = a[i][j] + a[i][j1]; x0i = a[i][j + 1] + a[i][j1 + 1]; x1r = a[i][j] - a[i][j1]; x1i = a[i][j + 1] - a[i][j1 + 1]; x2r = a[i][j2] + a[i][j3]; x2i = a[i][j2 + 1] + a[i][j3 + 1]; x3r = a[i][j2] - a[i][j3]; x3i = a[i][j2 + 1] - a[i][j3 + 1]; a[i][j] = x0r + x2r; a[i][j + 1] = x0i + x2i; x0r -= x2r; x0i -= x2i; a[i][j2] = wk2r * x0r - wk2i * x0i; a[i][j2 + 1] = wk2r * x0i + wk2i * x0r; x0r = x1r - x3i; x0i = x1i + x3r; a[i][j1] = wk1r * x0r - wk1i * x0i; a[i][j1 + 1] = wk1r * x0i + wk1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[i][j3] = wk3r * x0r - wk3i * x0i; a[i][j3 + 1] = wk3r * x0i + wk3i * x0r; } } } l = m; } if (l < n) { for (j = 0; j <= l - 2; j += 2) { j1 = j + l; x0r = a[i][j] - a[i][j1]; x0i = a[i][j + 1] - a[i][j1 + 1]; a[i][j] += a[i][j1]; a[i][j + 1] += a[i][j1 + 1]; a[i][j1] = x0r; a[i][j1 + 1] = x0i; } } }}void cftbrow(int n, int n2, double **a, double *w){ int i, j, j1, j2, j3, k, k1, ks, l, m; double wk1r, wk1i, wk2r, wk2i, wk3r, wk3i; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; l = 1; while ((l << 1) < n) { m = l << 2; for (j = 0; j <= l - 1; j++) { j1 = j + l; j2 = j1 + l; j3 = j2 + l; for (i = 0; i <= n2 - 2; i += 2) { x0r = a[j][i] + a[j1][i]; x0i = a[j][i + 1] + a[j1][i + 1]; x1r = a[j][i] - a[j1][i]; x1i = a[j][i + 1] - a[j1][i + 1]; x2r = a[j2][i] + a[j3][i]; x2i = a[j2][i + 1] + a[j3][i + 1]; x3r = a[j2][i] - a[j3][i]; x3i = a[j2][i + 1] - a[j3][i + 1]; a[j][i] = x0r + x2r; a[j][i + 1] = x0i + x2i; a[j2][i] = x0r - x2r; a[j2][i + 1] = x0i - x2i; a[j1][i] = x1r - x3i; a[j1][i + 1] = x1i + x3r; a[j3][i] = x1r + x3i; a[j3][i + 1] = x1i - x3r; } } if (m < n) { wk1r = w[2]; for (j = m; j <= l + m - 1; j++) { j1 = j + l; j2 = j1 + l; j3 = j2 + l; for (i = 0; i <= n2 - 2; i += 2) { x0r = a[j][i] + a[j1][i]; x0i = a[j][i + 1] + a[j1][i + 1]; x1r = a[j][i] - a[j1][i]; x1i = a[j][i + 1] - a[j1][i + 1]; x2r = a[j2][i] + a[j3][i]; x2i = a[j2][i + 1] + a[j3][i + 1]; x3r = a[j2][i] - a[j3][i]; x3i = a[j2][i + 1] - a[j3][i + 1]; a[j][i] = x0r + x2r; a[j][i + 1] = x0i + x2i; a[j2][i] = x2i - x0i; a[j2][i + 1] = x0r - x2r; x0r = x1r - x3i; x0i = x1i + x3r; a[j1][i] = wk1r * (x0r - x0i); a[j1][i + 1] = wk1r * (x0r + x0i); x0r = x3i + x1r; x0i = x3r - x1i; a[j3][i] = wk1r * (x0i - x0r); a[j3][i + 1] = wk1r * (x0i + x0r); } } k1 = 1; ks = -1; for (k = (m << 1); k <= n - m; k += m) { k1++; ks = -ks; wk1r = w[k1 << 1]; wk1i = w[(k1 << 1) + 1]; wk2r = ks * w[k1]; wk2i = w[k1 + ks]; wk3r = wk1r - 2 * wk2i * wk1i; wk3i = 2 * wk2i * wk1r - wk1i; for (j = k; j <= l + k - 1; j++) { j1 = j + l; j2 = j1 + l; j3 = j2 + l; for (i = 0; i <= n2 - 2; i += 2) { x0r = a[j][i] + a[j1][i]; x0i = a[j][i + 1] + a[j1][i + 1]; x1r = a[j][i] - a[j1][i]; x1i = a[j][i + 1] - a[j1][i + 1]; x2r = a[j2][i] + a[j3][i]; x2i = a[j2][i + 1] + a[j3][i + 1]; x3r = a[j2][i] - a[j3][i]; x3i = a[j2][i + 1] - a[j3][i + 1]; a[j][i] = x0r + x2r; a[j][i + 1] = x0i + x2i; x0r -= x2r; x0i -= x2i; a[j2][i] = wk2r * x0r - wk2i * x0i; a[j2][i + 1] = wk2r * x0i + wk2i * x0r; x0r = x1r - x3i; x0i = x1i + x3r; a[j1][i] = wk1r * x0r - wk1i * x0i; a[j1][i + 1] = wk1r * x0i + wk1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3][i] = wk3r * x0r - wk3i * x0i; a[j3][i + 1] = wk3r * x0i + wk3i * x0r; } } } } l = m; } if (l < n) { for (j = 0; j <= l - 1; j++) { j1 = j + l; for (i = 0; i <= n2 - 2; i += 2) { x0r = a[j][i] - a[j1][i]; x0i = a[j][i + 1] - a[j1][i + 1]; a[j][i] += a[j1][i]; a[j][i + 1] += a[j1][i + 1]; a[j1][i] = x0r; a[j1][i + 1] = x0i; } } }}void cftfcol(int n1, int n, double **a, double *w){ int i, j, j1, j2, j3, k, k1, ks, l, m; double wk1r, wk1i, wk2r, wk2i, wk3r, wk3i; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; for (i = 0; i <= n1 - 1; i++) { l = 2; while ((l << 1) < n) { m = l << 2; for (j = 0; j <= l - 2; j += 2) { j1 = j + l; j2 = j1 + l; j3 = j2 + l; x0r = a[i][j] + a[i][j1]; x0i = a[i][j + 1] + a[i][j1 + 1]; x1r = a[i][j] - a[i][j1]; x1i = a[i][j + 1] - a[i][j1 + 1]; x2r = a[i][j2] + a[i][j3]; x2i = a[i][j2 + 1] + a[i][j3 + 1]; x3r = a[i][j2] - a[i][j3]; x3i = a[i][j2 + 1] - a[i][j3 + 1]; a[i][j] = x0r + x2r; a[i][j + 1] = x0i + x2i; a[i][j2] = x0r - x2r; a[i][j2 + 1] = x0i - x2i; a[i][j1] = x1r + x3i; a[i][j1 + 1] = x1i - x3r; a[i][j3] = x1r - x3i; a[i][j3 + 1] = x1i + x3r; } if (m < n) { wk1r = w[2]; for (j = m; j <= l + m - 2; j += 2) { j1 = j + l; j2 = j1 + l; j3 = j2 + l; x0r = a[i][j] + a[i][j1]; x0i = a[i][j + 1] + a[i][j1 + 1]; x1r = a[i][j] - a[i][j1]; x1i = a[i][j + 1] - a[i][j1 + 1]; x2r = a[i][j2] + a[i][j3]; x2i = a[i][j2 + 1] + a[i][j3 + 1]; x3r = a[i][j2] - a[i][j3]; x3i = a[i][j2 + 1] - a[i][j3 + 1]; a[i][j] = x0r + x2r; a[i][j + 1] = x0i + x2i; a[i][j2] = x0i - x2i; a[i][j2 + 1] = x2r - x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[i][j1] = wk1r * (x0i + x0r); a[i][j1 + 1] = wk1r * (x0i - x0r); x0r = x3i - x1r; x0i = x3r + x1i; a[i][j3] = wk1r * (x0r + x0i); a[i][j3 + 1] = wk1r * (x0r - x0i); } k1 = 1; ks = -1; for (k = (m << 1); k <= n - m; k += m) { k1++; ks = -ks; wk1r = w[k1 << 1]; wk1i = w[(k1 << 1) + 1]; wk2r = ks * w[k1]; wk2i = w[k1 + ks]; wk3r = wk1r - 2 * wk2i * wk1i; wk3i = 2 * wk2i * wk1r - wk1i; for (j = k; j <= l + k - 2; j += 2) { j1 = j + l; j2 = j1 + l; j3 = j2 + l; x0r = a[i][j] + a[i][j1]; x0i = a[i][j + 1] + a[i][j1 + 1]; x1r = a[i][j] - a[i][j1]; x1i = a[i][j + 1] - a[i][j1 + 1]; x2r = a[i][j2] + a[i][j3]; x2i = a[i][j2 + 1] + a[i][j3 + 1]; x3r = a[i][j2] - a[i][j3]; x3i = a[i][j2 + 1] - a[i][j3 + 1]; a[i][j] = x0r + x2r; a[i][j + 1] = x0i + x2i; x0r -= x2r; x0i -= x2i; a[i][j2] = wk2r * x0r + wk2i * x0i; a[i][j2 + 1] = wk2r * x0i - wk2i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[i][j1] = wk1r * x0r + wk1i * x0i; a[i][j1 + 1] = wk1r * x0i - wk1i * x0r; x0r = x1r - x3i; x0i = x1i + x3r; a[i][j3] = wk3r * x0r + wk3i * x0i; a[i][j3 + 1] = wk3r * x0i - wk3i * x0r; } } } l = m; } if (l < n) { for (j = 0; j <= l - 2; j += 2) { j1 = j + l; x0r = a[i][j] - a[i][j1]; x0i = a[i][j + 1] - a[i][j1 + 1]; a[i][j] += a[i][j1]; a[i][j + 1] += a[i][j1 + 1]; a[i][j1] = x0r; a[i][j1 + 1] = x0i; } } }}void cftfrow(int n, int n2, double **a, double *w){ int i, j, j1, j2, j3, k, k1, ks, l, m; double wk1r, wk1i, wk2r, wk2i, wk3r, wk3i; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; l = 1; while ((l << 1) < n) { m = l << 2; for (j = 0; j <= l - 1; j++) { j1 = j + l; j2 = j1 + l; j3 = j2 + l; for (i = 0; i <= n2 - 2; i += 2) { x0r = a[j][i] + a[j1][i]; x0i = a[j][i + 1] + a[j1][i + 1]; x1r = a[j][i] - a[j1][i]; x1i = a[j][i + 1] - a[j1][i + 1]; x2r = a[j2][i] + a[j3][i]; x2i = a[j2][i + 1] + a[j3][i + 1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -