最近在看单片机,需要用一个1块钱不到的51单片机,做一个简化版FFT程序。而且,这个单片机也不支持小数,也不支持乘法。

 

脑袋里真的有两个小人,在那吵:

一个说,别看了,和你专业又没关系,和领导说,就说你干不了

另一个说,再坚持坚持,万事开头难,撑过去了,又是一遍天。

 

 

对于单片机熟手来说,单片机太简单了;

对于算法熟手来说,FFT太简单了;

对于C语言高手来说,C语言太简单了;

可是对于我一个纯硬件人员,这三个真的是太难了。

 

 

啃了一个礼拜,终于用matlab把FFT算法给整出来了。虽然计算结果和matlab内置FFT算法一致,但是耗时比它长不少。

 

看matlab的help文件,顺藤摸瓜,发现一个网站,上面竟然整理了三十多年各个作者的FFT算法程序,还针对这些算法,分析了不同系统下,运行精度和速度。

 

 

找了上面运行速度最快的看了一下,发现自己实在是看不懂。就对自己说,算了算了,自己啥也不会,还是老老实实先从最基本的教科书开始吧。等运算速度确实达不到要求的时候,再研究这些。

 

所以就按照书上的基-2蝶形运算,在matlab上一级一级地算,做了个128点的FFT运算。

 

在matlab上验证完,想搬到单片机上时,傻眼了。

 

在matlab上用的是定点小数的运算,可是单片机不支持小数,只支持整数。

 

也就是说,我得存在单片机上一个数。这个数呢,我心里知道是个小数,但是单片机看着是个整数。就这点,就把我绕的够呛,到今天为止,还没绕明白。

 

 

先说说,我对这些有多不敏感吧。

 

我家老二老三,因为看上去很小只,所以我经常会抱着她们称体重。以前,在北京的时候,朋友送了个婴儿称,直接放上就行,不用我计算。

 

现在,因为搬家,需要精简东西,就把那个称留在北京了。现在称,需要大人先上去称一下净重,然后大人抱小孩上去称个总重,两者相减一下。

 

对我来说,纯靠脑袋记这两个数字都有困难,需要借助纸或者其他人。然后心算这俩数字的减法,我挑战过一次,就放弃了,改用手机上的计算器。

 

所以,单片机看是个整数,但是我得把它看成小数,还要在这种情况下,用移位相加方法来实现小数乘法,真的是挑战我的记忆力和逻辑能力啊。

 

如果你问我为啥我要这么虐自己呢,直接和领导说,不干自己专业外的事情就行了呗。

 

那是因为我有一颗上进的心哪!!!

 

还有,作为一名干了十年的硬件人员,真的是很羡慕做软件的人啊!动动键盘,就能改变世界!

 

参考文献:http://www.fftw.org/benchfft