📄 libfft.h
字号:
x2i = a[j + 5] + a[j + 7]; x3r = a[j + 4] - a[j + 6]; x3i = a[j + 5] - a[j + 7]; a[j] = x0r + x2r; a[j + 1] = x0i + x2i; x0r -= x2r; x0i -= x2i; a[j + 4] = wk2r * x0r - wk2i * x0i; a[j + 5] = wk2r * x0i + wk2i * x0r; x0r = x1r - x3i; x0i = x1i + x3r; a[j + 2] = wk1r * x0r - wk1i * x0i; a[j + 3] = wk1r * x0i + wk1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j + 6] = wk3r * x0r - wk3i * x0i; a[j + 7] = wk3r * x0i + wk3i * x0r; x0r = wn4r * (wk1r - wk1i); wk1i = wn4r * (wk1r + wk1i); wk1r = x0r; wk3r = wk1r - 2 * wk2r * wk1i; wk3i = 2 * wk2r * wk1r - wk1i; x0r = a[j + 8] + a[j + 10]; x0i = a[j + 9] + a[j + 11]; x1r = a[j + 8] - a[j + 10]; x1i = a[j + 9] - a[j + 11]; x2r = a[j + 12] + a[j + 14]; x2i = a[j + 13] + a[j + 15]; x3r = a[j + 12] - a[j + 14]; x3i = a[j + 13] - a[j + 15]; a[j + 8] = x0r + x2r; a[j + 9] = x0i + x2i; x0r -= x2r; x0i -= x2i; a[j + 12] = -wk2i * x0r - wk2r * x0i; a[j + 13] = -wk2i * x0i + wk2r * x0r; x0r = x1r - x3i; x0i = x1i + x3r; a[j + 10] = wk1r * x0r - wk1i * x0i; a[j + 11] = wk1r * x0i + wk1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j + 14] = wk3r * x0r - wk3i * x0i; a[j + 15] = wk3r * x0i + wk3i * x0r; }}void cftmdl(int n, int l, double *a){ int j, j1, j2, j3, k, kj, kr, m, m2; double ew, wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i; double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; m = l << 2; 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; } wn4r = WR5000; for (j = m; j < l + m; 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] = x2i - x0i; a[j2 + 1] = x0r - x2r; x0r = x1r - x3i; x0i = x1i + x3r; a[j1] = wn4r * (x0r - x0i); a[j1 + 1] = wn4r * (x0r + x0i); x0r = x3i + x1r; x0i = x3r - x1i; a[j3] = wn4r * (x0i - x0r); a[j3 + 1] = wn4r * (x0i + x0r); } ew = M_PI_2 / n; kr = 0; m2 = 2 * m; for (k = m2; k < n; k += m2) { 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; for (j = k; j < l + k; 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; x0r -= x2r; x0i -= x2i; a[j2] = wk2r * x0r - wk2i * x0i; a[j2 + 1] = wk2r * x0i + wk2i * x0r; x0r = x1r - x3i; x0i = x1i + x3r; a[j1] = wk1r * x0r - wk1i * x0i; a[j1 + 1] = wk1r * x0i + wk1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3] = wk3r * x0r - wk3i * x0i; a[j3 + 1] = wk3r * x0i + wk3i * x0r; } x0r = wn4r * (wk1r - wk1i); wk1i = wn4r * (wk1r + wk1i); wk1r = x0r; wk3r = wk1r - 2 * wk2r * wk1i; wk3i = 2 * wk2r * wk1r - wk1i; for (j = k + m; j < l + (k + m); 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; x0r -= x2r; x0i -= x2i; a[j2] = -wk2i * x0r - wk2r * x0i; a[j2 + 1] = -wk2i * x0i + wk2r * x0r; x0r = x1r - x3i; x0i = x1i + x3r; a[j1] = wk1r * x0r - wk1i * x0i; a[j1 + 1] = wk1r * x0i + wk1i * x0r; x0r = x1r + x3i; x0i = x1i - x3r; a[j3] = wk3r * x0r - wk3i * x0i; a[j3 + 1] = wk3r * x0i + wk3i * x0r; } }}void rftfsub(int n, double *a){ int i, i0, j, k; double ec, w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi; ec = 2 * M_PI_2 / n; wkr = 0; wki = 0; wdi = cos(ec); wdr = sin(ec); wdi *= wdr; wdr *= wdr; w1r = 1 - 2 * wdr; w1i = 2 * wdi; ss = 2 * w1i; i = n >> 1; for (;;) { i0 = i - 4 * RDFT_LOOP_DIV; if (i0 < 4) { i0 = 4; } for (j = i - 4; j >= i0; j -= 4) { k = n - j; xr = a[j + 2] - a[k - 2]; xi = a[j + 3] + a[k - 1]; yr = wdr * xr - wdi * xi; yi = wdr * xi + wdi * xr; a[j + 2] -= yr; a[j + 3] -= yi; a[k - 2] += yr; a[k - 1] -= yi; wkr += ss * wdi; wki += ss * (0.5 - wdr); xr = a[j] - a[k]; xi = a[j + 1] + a[k + 1]; yr = wkr * xr - wki * xi; yi = wkr * xi + wki * xr; a[j] -= yr; a[j + 1] -= yi; a[k] += yr; a[k + 1] -= yi; wdr += ss * wki; wdi += ss * (0.5 - wkr); } if (i0 == 4) { break; } wkr = 0.5 * sin(ec * i0); wki = 0.5 * cos(ec * i0); wdr = 0.5 - (wkr * w1r - wki * w1i); wdi = wkr * w1i + wki * w1r; wkr = 0.5 - wkr; i = i0; } xr = a[2] - a[n - 2]; xi = a[3] + a[n - 1]; yr = wdr * xr - wdi * xi; yi = wdr * xi + wdi * xr; a[2] -= yr; a[3] -= yi; a[n - 2] += yr; a[n - 1] -= yi;}void rftbsub(int n, double *a){ int i, i0, j, k; double ec, w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi; ec = 2 * M_PI_2 / n; wkr = 0; wki = 0; wdi = cos(ec); wdr = sin(ec); wdi *= wdr; wdr *= wdr; w1r = 1 - 2 * wdr; w1i = 2 * wdi; ss = 2 * w1i; i = n >> 1; a[i + 1] = -a[i + 1]; for (;;) { i0 = i - 4 * RDFT_LOOP_DIV; if (i0 < 4) { i0 = 4; } for (j = i - 4; j >= i0; j -= 4) { k = n - j; xr = a[j + 2] - a[k - 2]; xi = a[j + 3] + a[k - 1]; yr = wdr * xr + wdi * xi; yi = wdr * xi - wdi * xr; a[j + 2] -= yr; a[j + 3] = yi - a[j + 3]; a[k - 2] += yr; a[k - 1] = yi - a[k - 1]; wkr += ss * wdi; wki += ss * (0.5 - wdr); xr = a[j] - a[k]; xi = a[j + 1] + a[k + 1]; yr = wkr * xr + wki * xi; yi = wkr * xi - wki * xr; a[j] -= yr; a[j + 1] = yi - a[j + 1]; a[k] += yr; a[k + 1] = yi - a[k + 1]; wdr += ss * wki; wdi += ss * (0.5 - wkr); } if (i0 == 4) { break; } wkr = 0.5 * sin(ec * i0); wki = 0.5 * cos(ec * i0); wdr = 0.5 - (wkr * w1r - wki * w1i); wdi = wkr * w1i + wki * w1r; wkr = 0.5 - wkr; i = i0; } xr = a[2] - a[n - 2]; xi = a[3] + a[n - 1]; yr = wdr * xr + wdi * xi; yi = wdr * xi - wdi * xr; a[2] -= yr; a[3] = yi - a[3]; a[n - 2] += yr; a[n - 1] = yi - a[n - 1]; a[1] = -a[1];}void dctsub(int n, double *a){ int i, i0, j, k, m; double ec, w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi; ec = M_PI_2 / n; wkr = 0.5; wki = 0.5; w1r = cos(ec); w1i = sin(ec); wdr = 0.5 * (w1r - w1i); wdi = 0.5 * (w1r + w1i); ss = 2 * w1i; m = n >> 1; i = 0; for (;;) { i0 = i + 2 * DCST_LOOP_DIV; if (i0 > m - 2) { i0 = m - 2; } for (j = i + 2; j <= i0; j += 2) { k = n - j; xr = wdi * a[j - 1] - wdr * a[k + 1]; xi = wdr * a[j - 1] + wdi * a[k + 1]; wkr -= ss * wdi; wki += ss * wdr; yr = wki * a[j] - wkr * a[k]; yi = wkr * a[j] + wki * a[k]; wdr -= ss * wki; wdi += ss * wkr; a[k + 1] = xr; a[k] = yr; a[j - 1] = xi; a[j] = yi; } if (i0 == m - 2) { break; } wdr = cos(ec * i0); wdi = sin(ec * i0); wkr = 0.5 * (wdr - wdi); wki = 0.5 * (wdr + wdi); wdr = wkr * w1r - wki * w1i; wdi = wkr * w1i + wki * w1r; i = i0; } xr = wdi * a[m - 1] - wdr * a[m + 1]; a[m - 1] = wdr * a[m - 1] + wdi * a[m + 1]; a[m + 1] = xr; a[m] *= wki + ss * wdr;}void dstsub(int n, double *a){ int i, i0, j, k, m; double ec, w1r, w1i, wkr, wki, wdr, wdi, ss, xr, xi, yr, yi; ec = M_PI_2 / n; wkr = 0.5; wki = 0.5; w1r = cos(ec); w1i = sin(ec); wdr = 0.5 * (w1r - w1i); wdi = 0.5 * (w1r + w1i); ss = 2 * w1i; m = n >> 1; i = 0; for (;;) { i0 = i + 2 * DCST_LOOP_DIV; if (i0 > m - 2) { i0 = m - 2; } for (j = i + 2; j <= i0; j += 2) { k = n - j; xr = wdi * a[k + 1] - wdr * a[j - 1]; xi = wdr * a[k + 1] + wdi * a[j - 1]; wkr -= ss * wdi; wki += ss * wdr; yr = wki * a[k] - wkr * a[j]; yi = wkr * a[k] + wki * a[j]; wdr -= ss * wki; wdi += ss * wkr; a[j - 1] = xr; a[j] = yr; a[k + 1] = xi; a[k] = yi; } if (i0 == m - 2) { break; } wdr = cos(ec * i0); wdi = sin(ec * i0); wkr = 0.5 * (wdr - wdi); wki = 0.5 * (wdr + wdi); wdr = wkr * w1r - wki * w1i; wdi = wkr * w1i + wki * w1r; i = i0; } xr = wdi * a[m + 1] - wdr * a[m - 1]; a[m + 1] = wdr * a[m + 1] + wdi * a[m - 1]; a[m - 1] = xr; a[m] *= wki + ss * wdr;}void dctsub4(int n, double *a){ int m; double wki, wdr, wdi, xr; wki = WR5000; m = n >> 1; if (m == 2) { wdr = wki * WI2500; wdi = wki * WR2500; xr = wdi * a[1] - wdr * a[3]; a[1] = wdr * a[1] + wdi * a[3]; a[3] = xr; } a[m] *= wki;}void dstsub4(int n, double *a){ int m; double wki, wdr, wdi, xr; wki = WR5000; m = n >> 1; if (m == 2) { wdr = wki * WI2500; wdi = wki * WR2500; xr = wdi * a[3] - wdr * a[1]; a[3] = wdr * a[3] + wdi * a[1]; a[1] = xr; } a[m] *= wki;}/* hanning filter by T.Kondo */void hanning(double *cdata,int nfft){ int n; float theta, fact; for(n=0; n<nfft; n++) { theta=(float)(360.0*(float)n/(float)(nfft-1) - 180.0); theta=(float)fmod(theta,360.0) ; fact=(float)(0.5*(1.0+cos(theta*PIRA))); cdata[2*n]=fact*cdata[2*n]; cdata[2*n+1]=fact*cdata[2*n+1]; }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -