吳永德 羅萍
【摘要】該系統采用增強型8051單片機STC12C5A60S2為主控制器,通過單片機內置的ADC對音頻信號進行采樣、量化,然后通過快速傅里葉變換運算,在頻域計算出音頻信號各個頻率分量的功率,最后通過雙基色LED單元板進行顯示。該方案具有電路結構簡潔,開發、生產成本低的優點。
【關鍵詞】單片機;FFT;頻譜顯示
一、引言
本文介紹的音樂頻譜顯示器可對mp3、手機、計算機輸出的音樂信號進行實時的頻譜顯示。系統采用增強型8051單片機STC12C5A60S2為主控制芯片,通過單片機內置的ADC對音頻信號進行采樣,把連續信號離散化,然后通過快速傅里葉變換(FFT)運算,在頻域計算出音頻信號各個頻率分量的功率,最后通過雙基色LED單元板進行顯示。在顯示的頻率點不多的情況下,本系統比采用DSP或ARM作為主控制芯片的設計方案具有電路結構簡潔,開發、生產成本低的優點。
二、系統設計
該系統由音頻信號預處理電路、單片機STC12C5A60S2控制電路、LED頻譜顯示電路等部分組成。圖l為系統整體設計原理框圖。
圖1 系統整體設計原理框圖
系統各組部分的功能:(1)音頻信號預處理電路主要對輸入的音頻進行電壓放大和電平提升。(2)單片機STC12C5A60S2控制電路采用內置的ADC對音頻信號進行采樣量化,然后對量化后的音頻數據采用FFT算法計算其頻譜值,再將各頻譜值進行32級量化。(3)LED頻譜顯示電路在單片機的控制下,負責將FFT計算得到的音頻信號的各個頻點的大小進行直觀顯示。
1.音頻信號預處理電路
圖2 音頻信號預處理電路
音頻信號預處理電路見圖2所示,對輸入的音頻進行電壓放大和電平提升。手機、計算機輸出的音頻信號Vin經過RP1進行電壓調節后,經集成運放LMV358反相放大10倍(Av=-R3/R2=-10),提高系統的靈敏度。選用單電源供電的運放LMV358,一方面可以簡化系統電源電路的設計,直接采用系統的+5V供電即可;另一方面其輸出端靜態電壓為VCC/2,即2.5V。放大后的音頻信號和這2.5V疊加后變為直流電壓信號,滿足后面單片機內置的ADC對輸入電壓量程的要求。另外,LMV358為軌到軌輸出運放,它可在+5V單電源供電條件下仍具有較大的動態輸出范圍。
2.單片機STC12C5A60S2控制電路
STC12C5A60S2單片機是宏晶科技生產的新一代單時鐘/機器周期(1T)8051單片機,具有高速、低功耗及超強抗干擾等特點,指令代碼完全兼容傳統8051,但速度快8-12倍;內部集成MAX810專用復位電路,2路PWM,8路高速10位A/D轉換(250K/S)等資源[1]。特別是它帶硬件乘法/除法指令,使乘法指令執行時間從傳統8051的48個晶振周期減少到4個晶振周期,使需要大量乘法運算的FFT運算速度得到大幅度提高。在本系統中,STC12C5A60S2單片機負責完成對音頻信號進行A/D變換,然后采用FFT算法計算音頻信號頻譜,并將計算結果輸出到LED頻譜顯示電路。
(1)音頻信號的A/D變換
根據香農采樣定理,一般采樣頻率至少應為所采樣音頻信號最高頻率的2倍。由于人耳能夠感受的頻率為20Hz-20kHz,所以理論上采樣頻率最高取40kHz。本設計采用單片機STC12C5A60S2內置的ADC對音頻信號進行采樣、量化。STC12C5A60S2單片機的A/D轉換口在P1口(P1.0-P1.7),有8路10位的高速ADC,其輸入電壓量程為0-Vcc,轉換速度可通過ADC_CONTR特殊功能寄存器的SPEED1,SPEED0位進行控制,速度最快可設置為每90個時鐘周期轉換一次。在外接晶振為30MHz時,ADC的轉換速度可達到330KHZ,完全可滿足對音頻信號的采樣需要。
(2)音頻信號頻譜值的計算
我們采用快速傅里葉算法(FFT)來計算音頻信號的頻譜值。根據FFT運算規律,如ADC以fs的采樣頻率取N個采樣點,經過FFT運算之后,就可以得到N個點的復數序列。通常為了方便進行FFT運算,通常N取2的整數次方:N=2L(L為正整數)。這N個點的FFT結果,每一個點就對應著原始信號的一個頻率點,即第n點所表示的頻率為f=n×fs/N,n=0,1,…,(N-1);該點的模值除以N/2就是對應該頻率下原始信號的幅度(對于第1個點則是除以N);該點的相位即是對應該頻率下原始信號的相位。由于FFT結果的對稱性,通常只使用FFT運算后的前N/2個點的數值。本系統每隔10ms采樣一次128個點,經過FFT運算后將得到128個頻率點。由于FFT結果的對稱性,我們選取前64個點進行顯示。
現在FFT算法已發展出多種形式,本系統采用按時間抽選(DIT)的基-2FFT算法,這種算法程序相對較簡單,節省存儲單元,運行效率較高,比較適合用單片機編程實現。DIT基-2FFT算法主要由倒位序運算和多級蝶形運算實現。
a.倒位序運算的實現
DIT基-2FFT算法通常將原始數據序列倒位序存儲,運算后的結果則按正常順序輸出。一般的數字信號處理的教材都介紹雷德(Rader)算法,通過“反向進位加法”將原始數據序列進行倒位序存儲[2]。雷德算法的靈活性較大,但在本系統中,參與運算的數據點數只有128個,通過預先編制倒位序查詢表,采用查表方式實現倒位序操作速度會更快。
b.蝶形運算的實現
根據DIT基-2 FFT算法原理,N點FFT運算由log2N級,每級N/2個蝶形運算,共(N/2)log2N個蝶形運算構成。每個蝶形運算結構見圖3所示[2]。
圖3 按時間抽選蝶形運算結構
蝶形運算結構圖中,m表示第m級的蝶形運算,k 為蝶形運算第一節點所在行數,b為蝶形運算兩節點距離,b=2m-1,WNr為旋轉因子,WNr=cos(2πr/N)-jsin(2πr/N)。
每個蝶形結構完成下述基本迭代運算[2]:
(1)
(2)
設Xm=Rm+jIm,將式(1)轉變為實部和虛部的表示形式,得到:由上面式(1)、式(2)可見,一個蝶形運算需要一次復數乘法Xm-1(k+b)WNr及兩次復數加(減)法。在單片機系統中編程實現時,需把復數運算轉變為實數運算。
(3)
(4)
同理,將式(2)轉變為:
(5)
(6)
將sin、cos函數做成表格sin_tab[128]、cos_tab[128],直接查表可提高運算速度。
程序流程圖見圖4所示。整個L級遞推過程由三個for循環嵌套構成,外層的一個for循環控制L(L=log2N=log2128=7)級的順序運算;內層的兩個for循環控制同一級(m相同)各蝶形結的運算,其中最內一層for循環控制同一種(即WNr中的r相同)蝶形結的運算,而中間一層for循環則控制不同種(即WNr中的r不同)蝶形結的運算。
圖4 DIT基-2 FFT程序流程圖
3.頻譜值的顯示
系統中采用64×32室內雙基色LED單元板進行顯示,每列顯示音頻信號的一個頻率點,每列LED點亮的高度表示該頻率點幅度的大小。該單元板由32塊雙基色8×8 LED模塊組成,高4塊,長8塊;一般采用1/16掃描,行驅動采用8片4953,列驅動采用32片74HC595[3]。單元板兩端分別預留級聯接口,最初這種接口為20針插座,現在都改進為16針插座,一般稱為08接口。但使用時要注意,不同廠家生產的LED單元板,其使能信號EN可能會不同,有些是低電平有效的,有些是高電平有效的。
三、結束語
本系統采用增強型8051單片機STC12C5A60S2實現音樂頻譜顯示,該方案硬件電路設計簡單、成本低,并具有較高的實用價值。
參考文獻
[1]宏晶科技.STC12C5A60S2系列單片機器件手冊[M].2010.
[2]程佩青.數字信號處理教程(第二版)[M].北京:清華大學出版社,2001.
[3]靳桅,等.基于51系列單片機的LED顯示屏開關技術(第2版)[M].北京:北京航空航天大學出版社,2011.
作者簡介:
吳永德(1980—),男,講師,從事電子技術專業教學及研究。
羅萍(1979—),女,講師,從事計算機技術專業教學及研究。