#define N_FFT 128
#define PI 3.1415926
#define log2_N log2(N_FFT)
float Ft[N_FFT];
double complex FFT[N_FFT+1];
/*Ft数组赋值*/
// N 数组里面的数据个数 log2_N 对应的2进制位数 例如 N = 16 log2_N = 4 //
void Ft_Voluation()
{
uint16_t k;
for(k=0;k<N_FFT;k++)
{
Ft[k] = k;
}
}
/*数组清空函数*/
void Clear_FFT()
{
uint16_t j;
for(j=0;j<=N_FFT;j++)
{
FFT[j]=0;
}
}
/*按位逆序 Rebit */
uint32_t In_Reverse_Order(uint32_t a,uint8_t wei,uint8_t n)
{
uint32_t num;
uint32_t sum=0;
uint16_t i=0;
for(i=0;i<wei;i++)
{
num = a >>i;
num &=1;
if(n==0)
{
num ^=1;
}
num <<=(wei-1-i);
sum |=num;
}
return sum;
}
/*偶奇变换算法*/
void ChangePosition()
{
uint8_t n;
double temp1,temp2;
for(n=1;n<N_FFT/2;n++)
{
temp1 = Ft[In_Reverse_Order(n,log2_N,1)];
FFT[n+1] = temp1;
temp2 = Ft[In_Reverse_Order(n,log2_N,0)];
FFT[N_FFT-n] = temp2;
}
FFT[N_FFT] = Ft[N_FFT-1];
FFT[1] = FFT[0];
}
/*蝶形算法*/
void Butterfly_Algorithm()
{
uint32_t L,B,M,j,k,p,i,r;
double complex a=0;//定义a
double complex temp=0;//定义临时储存
M=log2_N;//做几层蝶形变换
for(L=1;L<=M;L++)//第L级运算,计算间隔B = 2^(L-1)
{
B=(uint32_t)pow(2,L-1);
for(j=0;j<=(B-1);j++)
{
//B-1为该step旋转因子个数,j为旋转因子的位数(第几个旋转因子)
//计算旋转因子系数的增量k=2^(M-L),同样也代表着该step蝶形运算干的次数
k=(uint32_t)pow(2,M-L);
//计算旋转因子的指数 p=j*K
p=j*k;
for(i=0;i<=(k-1);i++)
{
//从0 ~ k-1,在该step蝶形运算了k次
//旋转因子个数为 偶数项与计数项间隔 0 8 8个 04 四个 0 2 2个 0 1 一个
/*难点:r表示数据位数,j表示旋转因子位数的同时也表示在
* 该偶数对里面的第几位,即,在该step里面奇数对里有几个
* 旋转因子那么偶数对里面也存在相同个数的求和,因此j表示
* 在该偶数对里的第几个求和(同时与该旋转因子照应)
* *2表示跳过该奇偶对前往下一个奇偶对,若无*2,则只能跳过
* 奇偶对里的奇或偶
* B表示运算间隔
*/
r=j+2*B*i;
temp = FFT[r+1];//临时存储
a=FFT[r+1+B]*cexp((-2)*(3.1415/N_FFT)*p*_Complex_I);
//蝶形乘法
//注意,一定要使用复数数组,直接取是不蝶形运算会导致乘幂错误
FFT[r+1] = FFT[r+1]+a;//偶+奇 wp
FFT[r+1+B] = temp-a;//偶 - 奇 wp
}
}
}
}
/*输出取模*/
void FFT_Out()
{
uint32_t j;
for(j=0;j<=N_FFT;j++)
{
FFT[j] = labs(FFT[j]);
}
}
/*以下为excel验证蝶形变换出的数据的过程,为128点*/
0
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
0
2
4
6
8
10
12
14
16
18
20
22
24
26
28
30
32
34
36
38
40
42
44
46
48
50
52
54
56
58
60
62
64
66
68
70
72
74
76
78
80
82
84
86
88
90
92
94
96
98
100
102
104
106
108
110
112
114
116
118
120
122
124
126
1
3
5
7
9
11
13
15
17
19
21
23
25
27
29
31
33
35
37
39
41
43
45
47
49
51
53
55
57
59
61
63
65
67
69
71
73
75
77
79
81
83
85
87
89
91
93
95
97
99
101
103
105
107
109
111
113
115
117
119
121
123
125
127
0
4
8
12
16
20
24
28
32
36
40
44
48
52
56
60
64
68
72
76
80
84
88
92
96
100
104
108
112
116
120
124
2
6
10
14
18
22
26
30
34
38
42
46
50
54
58
62
66
70
74
78
82
86
90
94
98
102
106
110
114
118
122
126
1
5
9
13
17
21
25
29
33
37
41
45
49
53
57
61
65
69
73
77
81
85
89
93
97
101
105
109
113
117
121
125
3
7
11
15
19
23
27
31
35
39
43
47
51
55
59
63
67
71
75
79
83
87
91
95
99
103
107
111
115
119
123
127
0
8
16
24
32
40
48
56
64
72
80
88
96
104
112
120
4
12
20
28
36
44
52
60
68
76
84
92
100
108
116
124
2
10
18
26
34
42
50
58
66
74
82
90
98
106
114
122
6
14
22
30
38
46
54
62
70
78
86
94
102
110
118
126
1
9
17
25
33
41
49
57
65
73
81
89
97
105
113
121
5
13
21
29
37
45
53
61
69
77
85
93
101
109
117
125
3
11
19
27
35
43
51
59
67
75
83
91
99
107
115
123
7
15
23
31
39
47
55
63
71
79
87
95
103
111
119
127
0
16
32
48
64
80
96
112
8
24
40
56
72
88
104
120
4
20
36
52
68
84
100
116
12
28
44
60
76
92
108
124
2
18
34
50
66
82
98
114
10
26
42
58
74
90
106
122
6
22
38
54
70
86
102
118
14
30
46
62
78
94
110
126
1
17
33
49
65
81
97
113
9
25
41
57
73
89
105
121
5
21
37
53
69
85
101
117
13
29
45
61
77
93
109
125
3
19
35
51
67
83
99
115
11
27
43
59
75
91
107
123
7
23
39
55
71
87
103
119
15
31
47
63
79
95
111
127
0
32
64
96
16
48
80
112
8
40
72
104
24
56
88
120
4
36
68
100
20
52
84
116
12
44
76
108
28
60
92
124
2
34
66
98
18
50
82
114
10
42
74
106
26
58
90
122
6
38
70
102
22
54
86
118
14
46
78
110
30
62
94
126
1
33
65
97
17
49
81
113
9
41
73
105
25
57
89
121
5
37
69
101
21
53
85
117
13
45
77
109
29
61
93
125
3
35
67
99
19
51
83
115
11
43
75
107
27
59
91
123
7
39
71
103
23
55
87
119
15
47
79
111
31
63
95
127
0
64
32
96
16
80
48
112
8
72
40
104
24
88
56
120
4
68
36
100
20
84
52
116
12
76
44
108
28
92
60
124
2
66
34
98
18
82
50
114
10
74
42
106
26
90
58
122
6
70
38
102
22
86
54
118
14
78
46
110
30
94
62
126
1
65
33
97
17
81
49
113
9
73
41
105
25
89
57
121
5
69
37
101
21
85
53
117
13
77
45
109
29
93
61
125
3
67
35
99
19
83
51
115
11
75
43
107
27
91
59
123
7
71
39
103
23
87
55
119
15
79
47
111
31
95
63
127
/*以上为excel验证蝶形变换出的数据的过程,为128点*/
仅供参考,后期研究明白再补原理。