forked from ycshu/110_Fast_Algorithm
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFFT.c
More file actions
98 lines (81 loc) · 2.12 KB
/
FFT.c
File metadata and controls
98 lines (81 loc) · 2.12 KB
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int FFT(double *yr, double *yi, double *xr, double *xi, int N){
if(N == 2){
yr[0] = xr[0] + xr[1];
yi[0] = xi[0] + xi[1];
yr[1] = xr[0] - xr[1];
yi[1] = xi[0] - xi[1];
return 0;
}
else{
int n, k, c, s;
double *yEr, *yEi, *yOr, *yOi, *xEr, *xEi, *xOr, *xOi;
xEr = (double*) malloc((N/2)*sizeof(double));
xEi = (double*) malloc((N/2)*sizeof(double));
yEr = (double*) malloc((N/2)*sizeof(double));
yEi = (double*) malloc((N/2)*sizeof(double));
xOr = (double*) malloc((N/2)*sizeof(double));
xOi = (double*) malloc((N/2)*sizeof(double));
yOr = (double*) malloc((N/2)*sizeof(double));
yOi = (double*) malloc((N/2)*sizeof(double));
for(n = 0; n < N/2; n++){
xEr[n] = xr[2*n];
xEi[n] = xi[2*n];
xOr[n] = xr[2*n + 1];
xOi[n] = xi[2*n + 1];
}
FFT(yEr, yEi, xEr, xEi, N/2);
FFT(yEr, yEi, xEr, xEi, N/2);
for(k = 0; k < N/2; k++){
c = cos(2*M_PI*k/N);
s = -sin(2*M_PI*k/N);
yr[k] = yEr[k] + (yOr[k]*c - yOi[k]*s);
yi[k] = yEr[k] + (yOr[k]*s + yOi[k]*c);
yr[N/2 + k] = yEr[k] - (yOr[k]*c - yOi[k]*s);
yi[N/2 + k] = yEi[k] - (yOr[k]*s + yOi[k]*c);
}
free(xEr); free(xEi);
free(yEr); free(yEi);
free(xOr); free(xOi);
free(yOr); free(yOi);
}
}
int main(){
FILE *fp;
char ch;
int L = 0, N = 1;
int k, n;
double *xr, *xi, *yr, *yi, *zr, *zi, *ur, *ui;
time_t T;
fp = fopen("hw6.csv", "r");
while(!feof(fp)){
ch = fgetc(fp);
if(ch == '\n') L++;
}
fclose(fp);
while(N < L) N = N * 2;
N = N/2;
xr = (double*) malloc(N*sizeof(double));
xi = (double*) malloc(N*sizeof(double));
yr = (double*) malloc(N*sizeof(double));
yi = (double*) malloc(N*sizeof(double));
zr = (double*) malloc(N*sizeof(double));
zi = (double*) malloc(N*sizeof(double));
ur = (double*) malloc(N*sizeof(double));
ui = (double*) malloc(N*sizeof(double));
fp = fopen("hw6.csv", "r");
for(k = 0; k < N; k++){
fscanf(fp, "%d %d", &n, &L);
xr[k] = 1.0*L;
xi[k] = 0.0;
}
fclose(fp);
T = clock();
FFT(zr, zi, xr, xi, N);
T = clock() - T;
printf("time = %d ms \n", T);
return 0;
}