Skip to content

Commit e9daddc

Browse files
committed
Changing bit_reverse in fft.c
1 parent 6b2a4e2 commit e9daddc

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

chapters/FFT/code/c/fft.c

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,12 @@
44
#include <stdlib.h>
55
#include <time.h>
66

7-
#define PI 3.1415926535897932384626
8-
97
void dft(double complex *X, const size_t N) {
108
double complex tmp[N];
119
for (size_t i = 0; i < N; ++i) {
1210
tmp[i] = 0;
1311
for (size_t j = 0; j < N; ++j) {
14-
tmp[i] += X[j] * cexp(-2.0 * PI * I * j * i / N);
12+
tmp[i] += X[j] * cexp(-2.0 * M_PI * I * j * i / N);
1513
}
1614
}
1715

@@ -35,27 +33,30 @@ void cooley_tukey(double complex *X, const size_t N) {
3533
cooley_tukey(X + N / 2, N / 2);
3634

3735
for (size_t i = 0; i < N / 2; ++i) {
38-
X[i + N / 2] = X[i] - cexp(-2.0 * I * PI * i / N) * X[i + N / 2];
36+
X[i + N / 2] = X[i] - cexp(-2.0 * I * M_PI * i / N) * X[i + N / 2];
3937
X[i] -= (X[i + N / 2]-X[i]);
4038
}
4139
}
4240
}
4341

4442
void bit_reverse(double complex *X, size_t N) {
45-
double complex temp;
46-
unsigned int b;
43+
for (int i = 0; i < N; ++i) {
44+
int n = i;
45+
int a = i;
46+
int count = (int)log2((double)N) - 1;
47+
48+
n >>= 1;
49+
while (n > 0) {
50+
a = (a << 1) | (n & 1);
51+
count--;
52+
n >>= 1;
53+
}
54+
n = (a << count) & ((1 << (int)log2((double)N)) - 1);
4755

48-
for (unsigned int i = 0; i < N; ++i) {
49-
b = i;
50-
b = (((b & 0xaaaaaaaa) >> 1) | ((b & 0x55555555) << 1));
51-
b = (((b & 0xcccccccc) >> 2) | ((b & 0x33333333) << 2));
52-
b = (((b & 0xf0f0f0f0) >> 4) | ((b & 0x0f0f0f0f) << 4));
53-
b = (((b & 0xff00ff00) >> 8) | ((b & 0x00ff00ff) << 8));
54-
b = ((b >> 16) | (b << 16)) >> (32 - (unsigned int) log2((double)N));
55-
if (b > i) {
56-
temp = X[b];
57-
X[b] = X[i];
58-
X[i] = temp;
56+
if (n > i) {
57+
double complex tmp = X[i];
58+
X[i] = X[n];
59+
X[n] = tmp;
5960
}
6061
}
6162
}
@@ -65,7 +66,7 @@ void iterative_cooley_tukey(double complex *X, size_t N) {
6566

6667
for (int i = 1; i <= log2((double)N); ++i) {
6768
int stride = pow(2, i);
68-
double complex w = cexp(-2.0 * I * PI / stride);
69+
double complex w = cexp(-2.0 * I * M_PI / stride);
6970
for (size_t j = 0; j < N; j += stride) {
7071
double complex v = 1.0;
7172
for (size_t k = 0; k < stride / 2; ++k) {
@@ -93,8 +94,7 @@ int main() {
9394
}
9495

9596
cooley_tukey(y, 64);
96-
//iterative_cooley_tukey(z, 64);
97-
dft(z, 64);
97+
iterative_cooley_tukey(z, 64);
9898

9999
approx(y, z, 64);
100100

0 commit comments

Comments
 (0)