最近在看單片機(jī),需要用一個(gè)1塊錢(qián)不到的51單片機(jī),做一個(gè)簡(jiǎn)化版FFT程序。而且,這個(gè)單片機(jī)也不支持小數(shù),也不支持乘法。
腦袋里真的有兩個(gè)小人,在那吵:
一個(gè)說(shuō),別看了,和你專(zhuān)業(yè)又沒(méi)關(guān)系,和領(lǐng)導(dǎo)說(shuō),就說(shuō)你干不了
另一個(gè)說(shuō),再堅(jiān)持堅(jiān)持,萬(wàn)事開(kāi)頭難,撐過(guò)去了,又是一遍天。
對(duì)于單片機(jī)熟手來(lái)說(shuō),單片機(jī)太簡(jiǎn)單了;
對(duì)于算法熟手來(lái)說(shuō),F(xiàn)FT太簡(jiǎn)單了;
對(duì)于C語(yǔ)言高手來(lái)說(shuō),C語(yǔ)言太簡(jiǎn)單了;
可是對(duì)于我一個(gè)純硬件人員,這三個(gè)真的是太難了。
啃了一個(gè)禮拜,終于用matlab把FFT算法給整出來(lái)了。雖然計(jì)算結(jié)果和matlab內(nèi)置FFT算法一致,但是耗時(shí)比它長(zhǎng)不少。
看matlab的help文件,順藤摸瓜,發(fā)現(xiàn)一個(gè)網(wǎng)站,上面竟然整理了三十多年各個(gè)作者的FFT算法程序,還針對(duì)這些算法,分析了不同系統(tǒng)下,運(yùn)行精度和速度。
找了上面運(yùn)行速度最快的看了一下,發(fā)現(xiàn)自己實(shí)在是看不懂。就對(duì)自己說(shuō),算了算了,自己啥也不會(huì),還是老老實(shí)實(shí)先從最基本的教科書(shū)開(kāi)始吧。等運(yùn)算速度確實(shí)達(dá)不到要求的時(shí)候,再研究這些。
所以就按照書(shū)上的基-2蝶形運(yùn)算,在matlab上一級(jí)一級(jí)地算,做了個(gè)128點(diǎn)的FFT運(yùn)算。
在matlab上驗(yàn)證完,想搬到單片機(jī)上時(shí),傻眼了。
在matlab上用的是定點(diǎn)小數(shù)的運(yùn)算,可是單片機(jī)不支持小數(shù),只支持整數(shù)。
也就是說(shuō),我得存在單片機(jī)上一個(gè)數(shù)。這個(gè)數(shù)呢,我心里知道是個(gè)小數(shù),但是單片機(jī)看著是個(gè)整數(shù)。就這點(diǎn),就把我繞的夠嗆,到今天為止,還沒(méi)繞明白。
先說(shuō)說(shuō),我對(duì)這些有多不敏感吧。
我家老二老三,因?yàn)榭瓷先ズ苄≈?,所以我?jīng)常會(huì)抱著她們稱(chēng)體重。以前,在北京的時(shí)候,朋友送了個(gè)嬰兒稱(chēng),直接放上就行,不用我計(jì)算。
現(xiàn)在,因?yàn)榘峒?,需要精?jiǎn)東西,就把那個(gè)稱(chēng)留在北京了?,F(xiàn)在稱(chēng),需要大人先上去稱(chēng)一下凈重,然后大人抱小孩上去稱(chēng)個(gè)總重,兩者相減一下。
對(duì)我來(lái)說(shuō),純靠腦袋記這兩個(gè)數(shù)字都有困難,需要借助紙或者其他人。然后心算這倆數(shù)字的減法,我挑戰(zhàn)過(guò)一次,就放棄了,改用手機(jī)上的計(jì)算器。
所以,單片機(jī)看是個(gè)整數(shù),但是我得把它看成小數(shù),還要在這種情況下,用移位相加方法來(lái)實(shí)現(xiàn)小數(shù)乘法,真的是挑戰(zhàn)我的記憶力和邏輯能力啊。
如果你問(wèn)我為啥我要這么虐自己呢,直接和領(lǐng)導(dǎo)說(shuō),不干自己專(zhuān)業(yè)外的事情就行了唄。
那是因?yàn)槲矣幸活w上進(jìn)的心哪?。。?/p>
還有,作為一名干了十年的硬件人員,真的是很羨慕做軟件的人??!動(dòng)動(dòng)鍵盤(pán),就能改變世界!
參考文獻(xiàn):http://www.fftw.org/benchfft