25 fft(
unsigned int n,
bool inverse,
double *ri,
double *ii,
double *ro,
double *io)
27 if (!ri || !ro || !io)
return;
30 unsigned int i, j, k, m;
31 unsigned int blockSize, blockEnd;
36 if (n & (n-1))
return;
38 double angle = 2.0 * M_PI;
39 if (inverse) angle = -angle;
48 int *table =
new int[n];
50 for (i = 0; i < n; ++i) {
54 for (j = k = 0; j < bits; ++j) {
55 k = (k << 1) | (m & 1);
63 for (i = 0; i < n; ++i) {
68 for (i = 0; i < n; ++i) {
76 for (blockSize = 2; blockSize <= n; blockSize <<= 1) {
78 double delta = angle / (double)blockSize;
79 double sm2 = -sin(-2 * delta);
80 double sm1 = -sin(-delta);
81 double cm2 = cos(-2 * delta);
82 double cm1 = cos(-delta);
86 for (i = 0; i < n; i += blockSize) {
94 for (j = i, m = 0; m < blockEnd; j++, m++) {
96 ar[0] = w * ar[1] - ar[2];
100 ai[0] = w * ai[1] - ai[2];
105 tr = ar[0] * ro[k] - ai[0] * io[k];
106 ti = ar[0] * io[k] + ai[0] * ro[k];
116 blockEnd = blockSize;
145 if (n & (n-1))
return 0;
147 fftf_plan_ *plan =
new fftf_plan_;
159 if (n & (n-1))
return 0;
161 fftf_plan_ *plan =
new fftf_plan_;
178 float *real = p->real;
181 int forward = !p->inverse;
183 double *ri =
new double[n];
184 double *ro =
new double[n];
185 double *io =
new double[n];
188 if (!forward) ii =
new double[n];
191 for (
int i = 0; i < n; ++i) {
195 for (
int i = 0; i < n/2+1; ++i) {
205 fft(n, !forward, ri, ii, ro, io);
208 for (
int i = 0; i < n/2+1; ++i) {
213 for (
int i = 0; i < n; ++i) {
#define fftf_destroy_plan
#define fftf_plan_dft_c2r_1d
#define fftf_plan_dft_r2c_1d