單片機實(shí)現音頻頻譜顯示的快速算法研究
4.1 倒位序及其優(yōu)化算法
基2-FTT算法將原始數據倒位序存儲,但運算后的結果則按正常順序輸出。原始采樣數據放在數組float datalm[16]中,datalm[0]存放第1次讀取的A/D轉換值,datalm[1]存放第2次讀取的A/D轉換值,以此類(lèi)推,可見(jiàn)第n(n=(b3b2b1b0)b)次讀取的A/D轉換值存放在dataIm[n]中。倒序操作后采樣數據存儲在float dataRe[16]中,原來(lái)第n次讀取的A/D轉換值存放在datalm[n](n=(b0b1b2b3)b)中。根據樣本大小在系統代碼段中建立倒序表數組,采用查表方式實(shí)現快速倒序操作,與移位操作等方法相比,可明顯提高運算速度。
4.2 蝶形運算及其優(yōu)化算法
根據基2-FFT算法,N點(diǎn)FFT運算可以分成log2N級,每一級都有N/2個(gè)蝶形運算,如圖3所示。 本文引用地址:http://dyxdggzs.com/article/173536.htm
蝶形運算公式的推導過(guò)程如下:
將式(1)化簡(jiǎn)成實(shí)部和虛部的形式,得到:
可見(jiàn)每個(gè)蝶形運算的輸出都是由其輸入值與某一正弦函數和余弦函數的乘積累加得到的。由式(3)~式(6)編制正弦和余弦表,每次做蝶形運算時(shí)可查表加快運算速度。
基2-FFT算法的基本思想是用3層循環(huán)完成全部N點(diǎn)FFT運算:(1)最里層循環(huán)處理單獨的一個(gè)蝶形運算,采用查表方法實(shí)現乘法運算;(2)中間層循環(huán)完成每一級的N/2個(gè)蝶形運算;(3)最外層循環(huán)完成log2N級蝶形運算。
由此可看出:在每一級中,最里層循環(huán)完成N/2L個(gè)蝶形運算;中間層循環(huán)控制最里層循環(huán)進(jìn)行2L-1次運算。因此,中間層循環(huán)完成時(shí),共進(jìn)行2L-1xN/2L=N/2個(gè)蝶形運算。實(shí)際上最里層和中間層循環(huán)完成了第L級計算,最外層則最終完成log2N級蝶形運算。
需要加以說(shuō)明的數據是:(1)在第L級中,每個(gè)蝶形的兩個(gè)輸入端相距b=2L-1一個(gè)點(diǎn);(2)同一乘數對應著(zhù)相鄰間隔為2L個(gè)點(diǎn)的N/2L個(gè)蝶形;(3)第L級的2L-1個(gè)蝶形因子WPN中的P,可表示為P=jx25-L,其中j=0,1,2,…(2L-1-1)。
完成16點(diǎn)FFT運算的RAM需求量是128字節,而單片機SST89V58RD2的RAM共1 K字節:顯示器每10 ms刷新一次,而單片機SST89V58RD2的時(shí)鐘頻率是40 MHz,完成一次16點(diǎn)FFT運算實(shí)際所需時(shí)間不到6 ms,因此該系統完全滿(mǎn)足FFT運算的時(shí)間復雜度和空間復雜度要求。
5 頻譜值在VFD上的顯示
系統要求將音頻信號頻譜劃分成14段,每段按14級量化,再使用VFD顯示器顯示,因此對于FFT運算結果還要作一定轉換才能輸出到顯示器。第n點(diǎn)的FFT運算結果是復數,實(shí)部是dataRe[n],虛部是datalm[i]。該點(diǎn)的模值除以2/N就是對應該頻率下信號的幅度(對于第1個(gè)點(diǎn)則是除以N);該點(diǎn)的相位即是對應該頻率下信號的相位。最后的結果保存在dataRe[i]中,因為音頻信號頻譜被劃分成14段,所以dataRe[0]和dataRe[15]的值應該舍去。同時(shí),dataRe[i]可能不是整數,而VFD顯示器要求每個(gè)頻段按照14級量化,因此還需將dataRe[i]的值量化成0~14整數,最后輸出到VFD電路上顯示。
6 結束語(yǔ)
討論了單片機實(shí)現音響系統頻譜顯示的快速傅里葉變換算法,針對SST89V58RD2單片機進(jìn)行算法優(yōu)化,并詳細論述系統的實(shí)現方法,結果證明該方法具有可行性。
評論