利用FFT成功实现拓扑识别(二)--C语言的实现

33 篇文章 2 订阅
11 篇文章 6 订阅
本文详细介绍了如何在ARM处理器上使用C语言实现Fast Fourier Transform (FFT),首先通过Mathlab导出标准复合函数数据集,然后展示了如何构造1024点数据,并实现了FFT的核心函数。重点在于跨平台移植和代码优化,适合从事信号处理和嵌入式开发的工程师参考。
摘要由CSDN通过智能技术生成

利用FFT成功实现拓扑识别(二)

  • 上一节我们通过mathlab实现了FFT的基本分析流程,对分析过程有了一个基本理解,但对于大多数arm的处理器来说,无法直接利用mathlab的函数成果,需要用c等编程语言来实现,好在前辈前赴后继,已经有好多成熟的算法可用,下面是我的实现过程:

原始数据集的生成

从mathlab中导出标准复合函数的数据集合

/从mathlab导出数据1024点/
const u16 sample【1024】={
191,
152,
141,
166,
216,
260,
273,
248,
203,
166,
163,
195,
242,
275,
271,
233,
183,
151,
156,
192,
234,
252,
232,
183,
132,
108,
121,
158,
192,
196,
162,
106,
58,
43,
64,
101,
126,
115,
70,
12,
65506,
65502,
65530,
31,
45,
22,
65504,
65448,
65418,
65426,
65460,
65493,
65497,
65464,
65408,
65359,
65343,
65363,
65403,
65431,
65425,
65385,
65331,
65293,
65292,
65324,
65367,
65389,
65375,
65331,
65282,
65259,
65273,
65316,
65359,
65375,
65353,
65308,
65269,
65261,
65291,
65341,
65382,
65390,
65362,
65319,
65292,
65300,
65343,
65397,
65433,
65432,
65400,
65362,
65347,
65371,
65423,
65477,
65504,
65494,
65458,
65427,
65426,
65462,
65520,
34,
50,
30,
65528,
65505,
65516,
27,
85,
125,
129,
99,
63,
47,
70,
121,
175,
202,
192,
155,
119,
113,
143,
196,
241,
254,
229,
186,
154,
156,
192,
242,
275,
272,
234,
187,
160,
170,
210,
254,
272,
253,
205,
157,
138,
155,
196,
230,
233,
199,
144,
100,
89,
113,
152,
176,
163,
117,
60,
22,
21,
51,
87,
99,
73,
19,
65499,
65471,
65481,
65516,
12,
13,
65511,
65454,
65405,
65390,
65412,
65450,
65474,
65464,
65420,
65364,
65327,
65326,
65358,
65398,
65416,
65396,
65348,
65298,
65275,
65289,
65331,
65370,
65380,
65353,
65305,
65265,
65257,
65287,
65335,
65371,
65373,
65341,
65296,
65268,
65277,
65319,
65371,
65402,
65396,
65360,
65321,
65307,
65332,
65384,
65435,
65458,
65444,
65406,
65375,
65376,
65414,
65471,
65518,
65531,
65509,
65471,
65450,
65464,
65512,
35,
73,
74,
44,
9,
65532,
23,
77,
131,
157,
146,
109,
77,
75,
110,
165,
211,
223,
198,
157,
129,
136,
177,
229,
263,
259,
223,
179,
157,
172,
216,
261,
280,
260,
214,
170,
156,
178,
222,
257,
260,
225,
173,
132,
126,
154,
195,
218,
205,
158,
103,
69,
72,
104,
140,
151,
123,
69,
15,
65525,
3,
39,
68,
66,
26,
65503,
65456,
65443,
65466,
65503,
65524,
65510,
65463,
65406,
65369,
65370,
65402,
65439,
65453,
65429,
65377,
65326,
65303,
65318,
65358,
65393,
65398,
65367,
65315,
65274,
65266,
65296,
65341,
65373,
65370,
65333,
65286,
65257,
65266,
65308,
65356,
65382,
65371,
65332,
65291,
65278,
65303,
65353,
65401,
65420,
65401,
65362,
65331,
65332,
65371,
65427,
65471,
65480,
65455,
65417,
65396,
65413,
65462,
65519,
20,
18,
65522,
65488,
65479,
65507,
28,
81,
106,
93,
57,
27,
29,
68,
125,
170,
181,
156,
117,
93,
105,
150,
204,
238,
233,
198,
157,
141,
161,
209,
255,
274,
254,
210,
170,
161,
188,
235,
272,
274,
240,
190,
153,
152,
184,
227,
251,
237,
191,
138,
108,
115,
151,
187,
197,
168,
114,
63,
41,
57,
94,
122,
118,
77,
19,
65508,
65498,
65522,
24,
43,
26,
65511,
65454,
65419,
65421,
65453,
65488,
65498,
65470,
65416,
65364,
65341,
65357,
65396,
65427,
65428,
65392,
65338,
65296,
65289,
65317,
65360,
65388,
65379,
65338,
65288,
65260,
65269,
65309,
65354,
65375,
65359,
65316,
65274,
65260,
65285,
65334,
65378,
65392,
65369,
65327,
65295,
65297,
65336,
65391,
65431,
65436,
65407,
65368,
65348,
65366,
65416,
65471,
65504,
65499,
65466,
65432,
65425,
65456,
65512,
30,
52,
37,
1,
65508,
65513,
20,
78,
123,
132,
107,
69,
49,
65,
113,
169,
202,
197,
162,
125,
112,
138,
189,
237,
255,
236,
193,
158,
154,
186,
235,
273,
275,
241,
194,
162,
166,
203,
248,
272,
257,
212,
163,
137,
149,
188,
226,
234,
205,
152,
104,
86,
106,
145,
173,
166,
124,
67,
24,
17,
44,
81,
98,
78,
27,
65505,
65472,
65476,
65509,
7,
13,
65517,
65461,
65409,
65388,
65405,
65442,
65471,
65467,
65427,
65371,
65329,
65322,
65351,
65391,
65414,
65401,
65356,
65304,
65275,
65284,
65323,
65365,
65381,
65359,
65313,
65269,
65256,
65280,
65327,
65368,
65376,
65348,
65303,
65271,
65274,
65312,
65364,
65400,
65400,
65368,
65327,
65308,
65327,
65376,
65429,
65458,
65449,
65414,
65380,
65375,
65408,
65464,
65514,
65533,
65515,
65478,
65453,
65461,
65505,
28,
71,
78,
52,
15,
65533,
18,
69,
125,
157,
151,
117,
82,
74,
104,
158,
206,
224,
205,
164,
132,
133,
170,
223,
260,
263,
230,
185,
158,
168,
209,
256,
280,
265,
222,
175,
155,
172,
214,
253,
261,
232,
180,
135,
123,
147,
188,
215,
208,
166,
110,
71,
68,
97,
134,
150,
128,
76,
21,
65525,
65532,
31,
63,
67,
33,
65511,
65460,
65441,
65459,
65496,
65522,
65514,
65470,
65413,
65371,
65366,
65394,
65433,
65452,
65433,
65385,
65332,
65303,
65312,
65350,
65388,
65399,
65373,
65323,
65278,
65265,
65289,
65334,
65370,
65373,
65340,
65292,
65259,
65262,
65300,
65350,
65381,
65376,
65339,
65297,
65278,
65297,
65346,
65396,
65420,
65407,
65369,
65335,
65331,
65364,
65420,
65467,
65483,
65462,
65424,
65399,
65409,
65455,
65513,
18,
23,
65530,
65494,
65479,
65502,
20,
76,
106,
99,
64,
32,
28,
61,
117,
167,
183,
163,
124,
96,
102,
143,
198,
236,
238,
205,
163,
141,
156,
201,
250,
274,
260,
218,
175,
160,
182,
228,
268,
276,
246,
197,
156,
149,
177,
220,
249,
241,
198,
144,
109,
111,
143,
182,
196,
173,
121,
68,
41,
51,
87,
118,
120,
83,
26,
65512,
65496,
65515,
17,
41,
30,
65519,
65461,
65420,
65417,
65445,
65482,
65497,
65475,
65423,
65369,
65341,
65351,
65388,
65423,
65429,
65398,
65345,
65299,
65286,
65310,
65353,
65385,
65382,
65345,
65295,
65261,
65265,
65301,
65348,
65374,
65364,
65323,
65279,
65260,
65279,
65327,
65374,
65393,
65375,
65334,
65299,
65295,
65330,
65384,
65428,
65439,
65414,
65375,
65350,
65362,
65408,
65465,
65503,
65504,
65473,
65438,
65425,
65451,
65505,
25,
53,
43,
8,
65512,
65512,
13,
71,
119,
135,
114,
76,
51,
62,
106,
162,
200,
201,
170,
130,
113,
133,
181,
232,
256,
241,
201,
162,
152,
179,
228,
269,
277,
248,
201,
165,
163,
196,
241,
270,
262,
220,
169,
138,
145,
181,
220,
234,
210,
159,
108,
85,
100,
137,
169,
169,
131,
74,
27,
14,
37,
74,
96,
82,
34,
65511,
65473,
65471,
65501,
2,
13,
65522,
65469,
65414,
65388,
65399,
65435,
65467,
65469,
65434,
65378,
65332,
65320,
65344,
65385,
65412,
65404,
65363,
65310,
65276,
65280,
65316,
65359,
65380,
65365,
65320,
65274,
65255,
65274,
65320,
65363,
65377,
65355,
65310,
65274,
65271,
65305,
65357,
65397,
65403,
65375,
65334,
65310,
65323,
65369,
65423,
65457,
65454,
65421,
65385,
65375,
65402,
65456,
65509,
65534,
65522,
65486,
65456,
65459,
65498,
21,
68,
81,
59,
22,
65535,
14,
62,
119,
156,
156,
124,
87,
74,
98,
150,
202,
225,
211,
171,
136
};

FFT函数的实现

核心代码的实现
void fft(CPLX buf[], CPLX out[], int n, int step)
{
int i;
CPLX t;
double a, b, c, d, theta;
if (step < n)
{
_fft(out, buf, n, step * 2);
_fft(out + step, buf + step, n, step * 2);
for (i = 0; i < n; i += 2 * step) {
printf(“----begin to fft loop --step=%i,n=%i,i=%i-------\n”,step,n,i);

	theta = -PI * i / n;
	a = cos(theta);
	b = sin(theta);
	c = out[i + step].real;
	d = out[i + step].image;
	t.real = a * c - b * d;
	t.image = b * c + a * d;
	buf[i / 2].real = out[i].real + t.real;
	buf[i / 2].image = out[i].image + t.image;
	buf[(i + n) / 2].real = out[i].real - t.real;
	buf[(i + n) / 2].image = out[i].image - t.image;
}

}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyjbj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值