新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)實(shí)現(xiàn)音頻頻譜顯示的快速算法研究

51單片機(jī)實(shí)現(xiàn)音頻頻譜顯示的快速算法研究

作者: 時(shí)間:2011-10-15 來(lái)源:網(wǎng)絡(luò) 收藏

1 引言

在家庭影院、卡拉OK等音響系統(tǒng)中,實(shí)時(shí)顯示音樂(lè)信號(hào)的頻譜將為音響系統(tǒng)增添不少色彩。目前實(shí)際生產(chǎn)的音響系統(tǒng)產(chǎn)品,大多采用以下兩種方法實(shí)現(xiàn):一是利用硬件濾波器和A/D轉(zhuǎn)換器;二是利用DSP處理頻譜顯示。前者實(shí)現(xiàn)簡(jiǎn)單,但硬件成本高,后者軟件和硬件實(shí)現(xiàn)都較復(fù)雜。這里針對(duì)單片機(jī)RAM資源少、運(yùn)算速度慢的特點(diǎn),提出一種切實(shí)可行的快速傅里葉變換算法實(shí)現(xiàn)頻譜顯示。

2 系統(tǒng)整體設(shè)計(jì)及原理

該系統(tǒng)設(shè)計(jì)由單片機(jī)SST89V58RD2、音頻數(shù)據(jù)采樣電路、A/D轉(zhuǎn)換電路、頻譜顯示電路等部分組成。圖1為系統(tǒng)整體設(shè)計(jì)原理框圖。

該系統(tǒng)從功能上可劃分成3部分:(1)音頻數(shù)據(jù)采集電路實(shí)現(xiàn)模擬音頻信號(hào)的采樣保持和量化處理,包括音頻采樣電路和加轉(zhuǎn)換電路;(2)頻譜顯示電路實(shí)現(xiàn)模擬音頻信號(hào)頻譜的分段顯示,它將音頻信號(hào)頻譜劃分成14段,每段按照14級(jí)量化,由VFD顯示器件顯示;(3)主控制器采用SST89V58RD2單片機(jī)。在完成系統(tǒng)其他控制任務(wù)的前提下,充分利用單片機(jī)剩余計(jì)算資源,采用優(yōu)化FFT算法計(jì)算音頻信號(hào)頻譜,并將計(jì)算結(jié)果輸出到頻譜顯示電路。

3 音頻信號(hào)的采集和預(yù)處理

3.1 采樣頻率

根據(jù)香農(nóng)采樣定理,一般采樣頻率至少應(yīng)為所采樣音頻信號(hào)最高頻率的2倍。由于人耳能夠感受的頻率為20 Hz~20 kHz,所以理論上采樣頻率最高取40 kHz。目前工業(yè)上廣泛采用的采樣頻率大致有3種:44 kHz、16 bit的聲音稱作CD音質(zhì):22 kHz、16 bit的聲音效果近似于立體聲廣播(FMStereo),稱作廣播音質(zhì);11 kHz、8 bit的聲音稱作電話音質(zhì)。本文為提高頻譜計(jì)算的精度,擬采用40 kHz的采樣頻率和8Bit的數(shù)據(jù)位長(zhǎng)。

3.2 樣本大小

采樣頻率確定后,還需確定樣本值,即完成一次FFT運(yùn)算所需的采樣點(diǎn)數(shù)。根據(jù)數(shù)字信號(hào)處理的基本原理,假設(shè)采樣頻率為Fs,采樣點(diǎn)數(shù)為N,則FFT運(yùn)算后,第n點(diǎn)所表示的頻率為:Fn=[(n-1)×Fs]/N(1≤n≤N)。Fn若要精確到Hz,則需采樣長(zhǎng)度為(1/f)s的信號(hào)。提高頻率分辨率,需增加采樣點(diǎn)數(shù),但這在一些實(shí)際應(yīng)用中是不現(xiàn)實(shí)的,則采用有頻率細(xì)分法,即采樣比較短時(shí)間的信號(hào),然后在后面補(bǔ)充一定數(shù)量的0,使其長(zhǎng)度達(dá)到所需的點(diǎn)數(shù),再作FFT,這在一定程度上能夠提高頻率分辨率。由于該系統(tǒng)是將音頻信號(hào)頻譜劃分成14段顯示,因此采用16點(diǎn)FFT運(yùn)算,去掉第1點(diǎn)和第16點(diǎn)的結(jié)果即可。

3.3 音頻數(shù)據(jù)采集電路

A/D轉(zhuǎn)換器選用TLC549,它具有8位轉(zhuǎn)換結(jié)果,差分基準(zhǔn)電壓輸入,3線數(shù)據(jù)串行輸出接口,轉(zhuǎn)換時(shí)間最大達(dá)17μs,每秒訪問(wèn)和轉(zhuǎn)換次數(shù)達(dá)到40 000次,全部非校準(zhǔn)誤差為±0.5LSB,低功耗,最大為15 mW。因此,該器件完全滿足系統(tǒng)40kHz采樣頻率的要求。

圖2為系統(tǒng)音頻數(shù)據(jù)采集電路。音頻信號(hào)來(lái)源于CD或DVD碟機(jī)輸出的音樂(lè)信號(hào),因而基本無(wú)噪音,考慮到音頻信號(hào)是交流信號(hào),電壓范圍在±0.1 V之間,而TLC549的輸入必須是直流的,電壓范圍為0~5 V,所以還需整流和放大的預(yù)處理過(guò)程。A/D轉(zhuǎn)換后得到8位數(shù)字值音頻幅值的8位數(shù)字量。

4 音頻頻譜算法

音頻頻譜值的計(jì)算采用快速傅里葉算法FFT(Fast Fourier Transform),為了提高顯示器的刷新頻率,系統(tǒng)每隔10 ms讀取16次A/D轉(zhuǎn)換值,得到16點(diǎn)實(shí)數(shù)序列,緊接著完成16點(diǎn)FFT運(yùn)算得到16點(diǎn)復(fù)數(shù)序列。

4.1 倒位序及其優(yōu)化算法

基2-FTT算法將原始數(shù)據(jù)倒位序存儲(chǔ),但運(yùn)算后的結(jié)果則按正常順序輸出。原始采樣數(shù)據(jù)放在數(shù)組float datalm[16]中,datalm[0]存放第1次讀取的A/D轉(zhuǎn)換值,datalm[1]存放第2次讀取的A/D轉(zhuǎn)換值,以此類推,可見(jiàn)第n(n=(b3b2b1b0)b)次讀取的A/D轉(zhuǎn)換值存放在dataIm[n]中。倒序操作后采樣數(shù)據(jù)存儲(chǔ)在float dataRe[16]中,原來(lái)第n次讀取的A/D轉(zhuǎn)換值存放在datalm[n](n=(b0b1b2b3)b)中。根據(jù)樣本大小在系統(tǒng)代碼段中建立倒序表數(shù)組,采用查表方式實(shí)現(xiàn)快速倒序操作,與移位操作等方法相比,可明顯提高運(yùn)算速度。

4.2 蝶形運(yùn)算及其優(yōu)化算法

根據(jù)基2-FFT算法,N點(diǎn)FFT運(yùn)算可以分成log2N級(jí),每一級(jí)都有N/2個(gè)蝶形運(yùn)算,如圖3所示。


蝶形運(yùn)算公式的推導(dǎo)過(guò)程如下:

將式(1)化簡(jiǎn)成實(shí)部和虛部的形式,得到:

可見(jiàn)每個(gè)蝶形運(yùn)算的輸出都是由其輸入值與某一正弦函數(shù)和余弦函數(shù)的乘積累加得到的。由式(3)~式(6)編制正弦和余弦表,每次做蝶形運(yùn)算時(shí)可查表加快運(yùn)算速度。

基2-FFT算法的基本思想是用3層循環(huán)完成全部N點(diǎn)FFT運(yùn)算:(1)最里層循環(huán)處理單獨(dú)的一個(gè)蝶形運(yùn)算,采用查表方法實(shí)現(xiàn)乘法運(yùn)算;(2)中間層循環(huán)完成每一級(jí)的N/2個(gè)蝶形運(yùn)算;(3)最外層循環(huán)完成log2N級(jí)蝶形運(yùn)算。

由此可看出:在每一級(jí)中,最里層循環(huán)完成N/2L個(gè)蝶形運(yùn)算;中間層循環(huán)控制最里層循環(huán)進(jìn)行2L-1次運(yùn)算。因此,中間層循環(huán)完成時(shí),共進(jìn)行2L-1xN/2L=N/2個(gè)蝶形運(yùn)算。實(shí)際上最里層和中間層循環(huán)完成了第L級(jí)計(jì)算,最外層則最終完成log2N級(jí)蝶形運(yùn)算。

需要加以說(shuō)明的數(shù)據(jù)是:(1)在第L級(jí)中,每個(gè)蝶形的兩個(gè)輸入端相距b=2L-1一個(gè)點(diǎn);(2)同一乘數(shù)對(duì)應(yīng)著相鄰間隔為2L個(gè)點(diǎn)的N/2L個(gè)蝶形;(3)第L級(jí)的2L-1個(gè)蝶形因子WPN中的P,可表示為P=jx25-L,其中j=0,1,2,…(2L-1-1)。

完成16點(diǎn)FFT運(yùn)算的RAM需求量是128字節(jié),而單片機(jī)SST89V58RD2的RAM共1 K字節(jié):顯示器每10 ms刷新一次,而單片機(jī)SST89V58RD2的時(shí)鐘頻率是40 MHz,完成一次16點(diǎn)FFT運(yùn)算實(shí)際所需時(shí)間不到6 ms,因此該系統(tǒng)完全滿足FFT運(yùn)算的時(shí)間復(fù)雜度和空間復(fù)雜度要求。

5 頻譜值在VFD上的顯示

系統(tǒng)要求將音頻信號(hào)頻譜劃分成14段,每段按14級(jí)量化,再使用VFD顯示器顯示,因此對(duì)于FFT運(yùn)算結(jié)果還要作一定轉(zhuǎn)換才能輸出到顯示器。第n點(diǎn)的FFT運(yùn)算結(jié)果是復(fù)數(shù),實(shí)部是dataRe[n],虛部是datalm[i]。該點(diǎn)的模值除以2/N就是對(duì)應(yīng)該頻率下信號(hào)的幅度(對(duì)于第1個(gè)點(diǎn)則是除以N);該點(diǎn)的相位即是對(duì)應(yīng)該頻率下信號(hào)的相位。最后的結(jié)果保存在dataRe[i]中,因?yàn)橐纛l信號(hào)頻譜被劃分成14段,所以dataRe[0]和dataRe[15]的值應(yīng)該舍去。同時(shí),dataRe[i]可能不是整數(shù),而VFD顯示器要求每個(gè)頻段按照14級(jí)量化,因此還需將dataRe[i]的值量化成0~14整數(shù),最后輸出到VFD電路上顯示。

6 結(jié)束語(yǔ)

討論了單片機(jī)實(shí)現(xiàn)音響系統(tǒng)頻譜顯示的快速傅里葉變換算法,針對(duì)SST89V58RD2單片機(jī)進(jìn)行算法優(yōu)化,并詳細(xì)論述系統(tǒng)的實(shí)現(xiàn)方法,結(jié)果證明該方法具有可行性。



評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉