1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| void ComplexFFT(float *R, float *I, int invert) { int n, nn, i, j, m, cnt, inc, k; float tmpR, tmpI, WR, WI, Ri, Ii, Rj, Ij, dR, dI;
n = R[0], nn = n >> 1; for(j = 0, i = 0; i < n - 1; i++) { if(i < j) { tmpR = R[j + 1], tmpI = I[j + 1]; R[j + 1] = R[i + 1], I[j + 1] = I[i + 1]; R[i + 1] = tmpR, I[i + 1] = tmpI; } m = n >> 1; while(j >= m) { j = j - m; m = m >> 1; } j = j + m; }
m = 1; while(m < n) {
cnt = 0, inc = n / (m << 1); while(cnt < inc) { i = cnt * m * 2 + 1; for(int t = 0; t < m; t++, i++) { j = i + m; k = t * inc; k == 0 ? WR = 1.0, WI = 0.0: WR = cos(PI * k / nn), WI = sin(PI * k / nn); if(invert) WI = - WI; Rj = R[j], Ij = I[j], Ri = R[i], Ii = I[i]; R[i] = Ri + WR * Rj - WI * Ij, I[i] = Ii + WR * Ij + WI * Rj; R[j] = Ri - WR * Rj + WI * Ij, I[j] = Ii - WR * Ij - WI * Rj; } cnt++; } m = m << 1; }
if (invert) for (i = 1; i <= n; i++) R[i] = R[i] / n, I[i] = I[i] / n; }
|