對(duì)信號(hào)進(jìn)行頻譜分析是一種常用的獲取信號(hào)頻域信息的方法。本設(shè)計(jì)采用EP7312嵌入式處理器和UDA1341 模數(shù)轉(zhuǎn)換芯片對(duì)音頻信號(hào)進(jìn)行采集,采用512點(diǎn)的時(shí)間抽取基2 FFT算法,對(duì)所采集的數(shù)據(jù)進(jìn)行處理,在LCD上同時(shí)顯示時(shí)域波形和頻譜曲線。本系統(tǒng)具有體積小、成本低、采集速度快等特點(diǎn),可應(yīng)用于鋼琴調(diào)率和環(huán)境監(jiān)測(cè)、故障診斷等便攜式語音采集、顯示和頻譜分析的場(chǎng)合。
1 數(shù)據(jù)采集電路設(shè)計(jì)
系統(tǒng)由模數(shù)轉(zhuǎn)換模塊、系統(tǒng)控制與數(shù)據(jù)處理模塊、顯示模塊和鍵盤控制模塊組成,示意圖如圖1所示。
圖1 基于IIS總線的嵌入式頻譜分析系統(tǒng)體系結(jié)構(gòu)
1.1 系統(tǒng)控制模塊
本部分的核心是嵌入式處理器EP7312,這是一款屬于ARM7系列,適用于對(duì)價(jià)位和功耗敏感的消費(fèi)類應(yīng)用場(chǎng)合的處理器。Ep7312中的DAI接口是一種高速串行的數(shù)字音頻接口,可以連接與DAI接口兼容的音頻設(shè)備。接口通過位時(shí)鐘和幀同步時(shí)鐘產(chǎn)生64bit幀數(shù)據(jù)。數(shù)字音頻數(shù)據(jù)的接收和發(fā)送均采用全雙工方式,對(duì)應(yīng)于12個(gè)采樣深度的接收FIFO和8?jìng)€(gè)采樣深度的發(fā)送FIFO,F(xiàn)IFO的數(shù)據(jù)寬度是16bit。系統(tǒng)的外部存儲(chǔ)器由4M的NOR Flash(29LV160TE)和16M的SDRAM(hy57v641620hg)組成。
1.2 模數(shù)轉(zhuǎn)換模塊
模數(shù)轉(zhuǎn)換芯片采用的是Philip公司推出的UDA1341,芯片的模數(shù)轉(zhuǎn)換(ADCs)部分采用了先進(jìn)的Sigma-delta過采樣技術(shù)。芯片的工作電壓范圍為:2.4~3.6V,由于其功耗特別低,非常適合于MP3、MD播放器等低功耗場(chǎng)合的應(yīng)用。UDAl341芯片除了提供模數(shù)轉(zhuǎn)換功能外,還具有數(shù)模轉(zhuǎn)換部件(DACs)、L3接口、IIS(Inter-IC Sound bus)接口和麥克風(fēng)揚(yáng)聲器接口。
在音頻信號(hào)采集系統(tǒng)中,L3接口分別連到Ep7312的3個(gè)通用數(shù)據(jù)輸出引腳上。Ep7312通過向這個(gè)通用端口發(fā)送數(shù)據(jù)來對(duì)Uda1341進(jìn)行初始化。
1.3 IIS總線
IIS又稱I2S,是Philip公司提出的串行數(shù)字音頻總線協(xié)議。目前很多音頻芯片和MCU都提供了對(duì)IIS的支持。Ep7312和UDA1341都支持IIS總線協(xié)議。但是由于Ep7312只能接收16bit數(shù)據(jù),所以在數(shù)據(jù)采集中只取了UDA134120bit輸出數(shù)據(jù)中的高16位。圖2是UDA1341 IIS總線的時(shí)序圖,由圖中可知數(shù)據(jù)的最高位總是出現(xiàn)在WS(也就是一幀開始)變化后的第2個(gè)BCK脈沖處。這就使得接收端與發(fā)送端的有效位數(shù)可以不同。如果接收端所能處理的有效位數(shù)少于發(fā)送端,則可以放棄數(shù)據(jù)幀中的低位數(shù)據(jù);如果接收端能處理的有效位數(shù)多于發(fā)送端,可以自行補(bǔ)足剩余的位。這種同步機(jī)制使得數(shù)字音頻設(shè)備的互連更加方便,而且不會(huì)造成數(shù)據(jù)錯(cuò)位。
圖2 UDA1341 中的IIS總線格式
Ep7312的DAI接口中的主時(shí)鐘(SUB)、位時(shí)鐘(SSICLK)、左右通道時(shí)鐘(SSITXFR)、音頻數(shù)據(jù)(SSIRXDA)分別接UDA1341 中的SCLK、BCK、WS、DO。為了保證EP7312的SSIRXDA能正確接收到UDA1341 發(fā)送的數(shù)據(jù),需要使兩者之間的左右通道時(shí)鐘一致,即把SSITXFR同時(shí)作為SSITXFR和UDA1341中的WS輸入。
2 系統(tǒng)的軟件設(shè)計(jì)
系統(tǒng)的軟件設(shè)計(jì)包括三部分:?jiǎn)?dòng)代碼boot loader、驅(qū)動(dòng)程序設(shè)計(jì)和應(yīng)用程序設(shè)計(jì),其中重點(diǎn)是驅(qū)動(dòng)程序和應(yīng)用程序的設(shè)計(jì)。
2.1 啟動(dòng)代碼boot loader
boot loader是系統(tǒng)加電后運(yùn)行的一段代碼。雖然對(duì)于具體的嵌入式系統(tǒng)而言,不同的系統(tǒng)完成的功能不同,但是boot loader的功能基本相同,完成如下操作:對(duì)硬件設(shè)備初始化,把代碼從Flash加載到Sdram,跳轉(zhuǎn)到Sdram中的代碼執(zhí)行。圖3是bootloader的流程圖。
圖3 bootloader流程圖
2.2 Lcd和UDA1341驅(qū)動(dòng)程序的設(shè)計(jì)
在嵌入式系統(tǒng)中,設(shè)備驅(qū)動(dòng)程序隱藏了各種設(shè)備的具體細(xì)節(jié),維護(hù)著設(shè)備的正常工作,在用戶與設(shè)備之間起到了橋梁作用。開發(fā)設(shè)備驅(qū)動(dòng)程序是開發(fā)嵌入式系統(tǒng)的重要工作之一。在該系統(tǒng)中,有兩個(gè)重要設(shè)備的驅(qū)動(dòng):UDA1341驅(qū)動(dòng)和LCD驅(qū)動(dòng)。
(1) LCD驅(qū)動(dòng)
本設(shè)計(jì)采用的LCD為320(W)×240(H)像素的彩色STN液晶屏。
在LCD上顯示的曲線是通過對(duì)采集的離散的數(shù)據(jù)點(diǎn)用直線連接,以提高顯示效果。因此驅(qū)動(dòng)中的一個(gè)重要函數(shù)是連線函數(shù)lcd_vline();
int lcd_vline(unsigned char *fbuf, int x, int y, int y1, int color, int xorm)
{
//fbuf為緩沖區(qū)的初始地址,p是點(diǎn)(x,y)在LCD上對(duì)應(yīng)的地址
p = fbuf + x * 12 / 8 + y * (320 * 3 * 4 / 8);
//經(jīng)過變換使y<=y1
for (; y <= y1; y++){
//根據(jù)x的奇偶性設(shè)置點(diǎn)的顏色來決定是否要顯示該點(diǎn)
….……………………………..
p += (320 * 3 * 4 / 8);
}
return 0;
}
(2) UDA1341驅(qū)動(dòng)
由于UDA1341實(shí)現(xiàn)的是高速數(shù)據(jù)流的采集,其數(shù)據(jù)采集速度非常快,為了與其相匹配,采用了快速中斷fiq。在申請(qǐng)快速中斷的時(shí)候需要用到它的首地址和未地址,為了得到這兩個(gè)地址,中斷處理函數(shù)必須用匯編來編寫。因此,該驅(qū)動(dòng)有兩個(gè)文件構(gòu)成:主文件UDA1341.c和中斷文件fiq.s。在此著重說明主文件中的設(shè)備初始化函數(shù)UDA1341 init()和中斷函數(shù)。
Ep7312按一定的時(shí)序向L3接口寫數(shù)據(jù)實(shí)現(xiàn)對(duì)UDA1341的初始化。L3接口包括L3MODE、L3CLOCK、L3DATA三個(gè)腳,分別連接ep7312的port d 端口的第3、4、5位,Ep7312通過向port d端口這三位輸出數(shù)據(jù)實(shí)現(xiàn)UDA1341的初始化。UDA1341的L3控制模式按照傳送信息的不同分為地址傳送模式和數(shù)據(jù)傳送模式,圖4是地址傳送模式時(shí)序圖,圖5 是數(shù)據(jù)傳送模式的時(shí)序圖。
圖4 地址傳送模式時(shí)序圖
圖5 數(shù)據(jù)傳送模式的時(shí)序圖
UDA1341的驅(qū)動(dòng)中還要包括ep7312中DAI接口的初始化。由于在ep7312中DAI、SSI2、CODEC共用一組硬件資源,需要在程序中通過設(shè)置來選擇DAI接口。同時(shí),驅(qū)動(dòng)程序還需要設(shè)置IIS總線中采樣時(shí)鐘頻率、左右通道時(shí)鐘頻率、主時(shí)鐘頻率。
int UDA1341 init (void)
{
INTMR3 = 0x0; //禁止中斷
SYSCON3|=0x0e; // 選擇DAI接口
SYSCON3&=0xffffdff; //設(shè)置BCLK為WS的64倍
DAI64FSCR=0x240b;//采樣頻率的選取,這里設(shè)置是8kHz
PORTDDIR=PORTDDIR&0xc7; //設(shè)置D端口為輸出
PORTDDAT=PORTDDAT|0x10; //初始化D端口的3、4、5位 (pd3=0;pd4=1;pd5=0)
sendadd(0x16);//地址傳送,地址為0x16
senddat(0x40);//數(shù)據(jù)傳送,reset所有設(shè)置
sendadd(0x16);
senddat(0x21);// 設(shè)置SCLK為256Fs,數(shù)據(jù)格式為IIS。
..……………………………
//注冊(cè)設(shè)備
rc = register_chrdev(UDA1341 _major, "UDA1341 ", &UDA1341 _fops);
//申請(qǐng)fiq
fiqhandler_start = &dai_fiq_handler_start;
fiqhandler_length = &dai_fiq_handler_end - &dai_fiq_handler_start;
if (claim_fiq(&UDA1341 _fh))
{
printk("UDA1341 _fh: couldn't claim FIQ.\n");
return;
}
set_fiq_hander(fiqhander_start,fiqhander_length);
set_fiq_regs(regs);
…………………………….
}
中斷處理程序:保存被中斷寄存器環(huán)境,清中斷位,讀取FIFO中的數(shù)據(jù)放入公共數(shù)組中,恢復(fù)被中斷寄存器環(huán)境,然后返回被中斷程序。
.text
.align 2
.global dai_fiq_handler_start
.global dai_fiq_handler_end
dai_fiq_handler_start: //程序首地址
………………………………….
dai_fiq_handler_end: //程序未地址
2.3 應(yīng)用程序設(shè)計(jì)
應(yīng)用程序設(shè)計(jì)主要包括數(shù)據(jù)的采集和存儲(chǔ)、數(shù)據(jù)的處理(FFT)、波形的顯示和刷新。
(1) 數(shù)據(jù)的采集和存儲(chǔ)
在該模塊中,由于UDA1341對(duì)輸入信號(hào)的交流分量進(jìn)行采樣,在采集到的16位數(shù)據(jù)中,最高位是符號(hào)位,當(dāng)輸入電壓為正時(shí),該位為0,當(dāng)輸入信號(hào)電壓為負(fù)時(shí),該位為1。Ep7312 接收UDA1341采集的數(shù)據(jù)放到FIFO中,當(dāng)12個(gè)字節(jié)的FIFO半滿時(shí),即FIFO中有6個(gè)或者多于6個(gè)數(shù)據(jù)時(shí)產(chǎn)生中斷,調(diào)用快速中斷處理程序讀取數(shù)據(jù)放入共用數(shù)組中。
對(duì)于ep7312可產(chǎn)生8k~48kHz的采樣頻率,而在對(duì)低頻段信號(hào)進(jìn)行采樣時(shí),如果不采取一定的措施記錄這些低頻信號(hào)的時(shí)域特征需要很大的內(nèi)存空間。例如,在采樣頻率為8kHz時(shí),被采集的信號(hào)頻率為15Hz,一個(gè)周期的數(shù)據(jù)量為600個(gè),而在系統(tǒng)的LCD上用256個(gè)點(diǎn)是無法把這600個(gè)數(shù)據(jù)表述清楚的。要想更好地顯示時(shí)域波形,需要提高LCD每行顯示的個(gè)數(shù)或者縮小采樣頻率。對(duì)于要想改變LCD每行的顯示個(gè)數(shù)似乎不太現(xiàn)實(shí);EP731的采樣頻率最小是8kHz,不能滿足需要;在設(shè)計(jì)中,使用了通過軟件算法來實(shí)現(xiàn)減小采樣頻率的方法。具體原理如下:在采樣頻率一定時(shí),兩個(gè)采樣數(shù)據(jù)的時(shí)間間隔是一定的,時(shí)間間隔的大小為采樣頻率的倒數(shù)。可以按一定規(guī)律丟棄一些數(shù)據(jù)來實(shí)現(xiàn)采樣頻率的減小。例如當(dāng)采樣頻率為8kHz時(shí),進(jìn)行連續(xù)采樣5120個(gè)點(diǎn)放到數(shù)組data[5120],然后按每16個(gè)數(shù)據(jù)取一個(gè),即取data[512]中的0、15、31……、5103,此時(shí)實(shí)現(xiàn)的采樣頻率為500Hz,對(duì)于25Hz的信號(hào)在500Hz的采樣頻率下,時(shí)域波形能夠很好地顯示出來。
(2) 數(shù)據(jù)處理模塊
在該模塊,采用FFT算法對(duì)所采集的數(shù)據(jù)進(jìn)行處理,把得到的頻譜曲線和時(shí)域圖同時(shí)顯示在LCD上。FFT變換的具體實(shí)現(xiàn)如下:
首先進(jìn)行碼位倒置,得到FFT運(yùn)算所需要的輸入序列。然后采用3層循環(huán)完成全部運(yùn)算(N點(diǎn)FFT)。
第一層循環(huán):算法討論中的“級(jí)”作為第一層循環(huán),N點(diǎn)FFT運(yùn)算共有M級(jí),這里,用m作循環(huán)變量,0 ≤ m < M。
第二層循環(huán):算法討論中的“組”作為第二層循環(huán),第m級(jí)的組數(shù)為,用j作循環(huán)變量,。
第三層循環(huán):每組里的蝶形單元作為第三層循環(huán),每一組里共有蝶形單元2m個(gè),用i作循環(huán)變量,0 ≤ i < 2m。
分析上面循環(huán)嵌套可以得出:第三層循環(huán)完成個(gè)2m個(gè)蝶形單元計(jì)算;第二層循環(huán)使第三層循環(huán)進(jìn)行次,因此,當(dāng)?shù)诙友h(huán)完成時(shí),共進(jìn)行次蝶形單元計(jì)算。第一層循環(huán)又使第二層循環(huán)進(jìn)行了M次,因此,當(dāng)?shù)谝粚友h(huán)完成時(shí),共進(jìn)行了次蝶形單元計(jì)算。
(3) 波形顯示和刷新模塊
由于要采樣的信號(hào)頻率的未知性,對(duì)采樣頻率的選擇設(shè)置了兩種方式:手動(dòng)方式和自動(dòng)模式。對(duì)于手動(dòng)模式,通過鍵盤人為地設(shè)定采樣頻率,然后進(jìn)行采樣,處理和時(shí)域圖、頻譜圖的顯示。對(duì)于自動(dòng)模式,首先通過設(shè)定采樣頻率為48kHz,然后采樣,通過FFT計(jì)算相應(yīng)的頻率大小,根據(jù)計(jì)算出的頻率來重新設(shè)定相應(yīng)的采樣頻率,在進(jìn)行采樣,顯示時(shí)域和頻域圖。例如,當(dāng)采樣信號(hào)頻率為25Hz時(shí),在采樣頻率為48kHz時(shí),進(jìn)行FFT處理后能夠得到頻率大小為50Hz,然后選擇采樣頻率為8kHz,軟件實(shí)現(xiàn)采樣頻率為500Hz,則此時(shí)能很好的顯示時(shí)域波形,并且此時(shí)FFT計(jì)算的頻率為25Hz,精度更高。
下面介紹當(dāng)選擇采樣頻率為8kHz時(shí),LCD的顯示情況。EP7312為L(zhǎng)CD的控制提供了良好的支持,顯示主要通過LCD控制器完成的。因?yàn)橐褧r(shí)域數(shù)據(jù)和經(jīng)過FFT處理后的數(shù)據(jù)同時(shí)顯示在LCD上,所以把LCD的上半屏分配用于顯示時(shí)域圖,下半屏用于顯示頻譜圖。由于LCD的坐標(biāo)與顯示波形所用坐標(biāo)的X軸方向相反,并且要把波形顯示在特定的區(qū)域,所以要對(duì)數(shù)據(jù)進(jìn)行處理。在LCD右下角的坐標(biāo)為(0,0),時(shí)域和頻域的坐標(biāo)軸原點(diǎn)分別對(duì)應(yīng)(300,27)、(300,137)。采集的音頻數(shù)據(jù)范圍為0~0X1FFFF,F(xiàn)FT變換過的數(shù)據(jù)范圍是0~0xFF。顯示時(shí)域圖的數(shù)據(jù)VAL與其在LCD上Y坐標(biāo)的關(guān)系式為:
Y=(data[2*(256-i)])*25/0xffff+180;
由采樣頻率可以知道每?jī)蓚€(gè)采樣點(diǎn)的時(shí)間間隔是1/8000 s。LCD上時(shí)域圖中顯示的是512個(gè)中的256個(gè)采樣數(shù)據(jù)點(diǎn),每?jī)蓚€(gè)數(shù)據(jù)點(diǎn)取其中一個(gè),在時(shí)域圖的坐標(biāo)軸上每十個(gè)點(diǎn)顯示一個(gè)刻度,即每個(gè)格代表的時(shí)間是1.25ms。
用于顯示頻譜圖的數(shù)據(jù)NUM與其在LCD上Y坐標(biāo)的關(guān)系式為:
Y=137+NUM*90/0XFF
在頻域圖上可以顯示當(dāng)前測(cè)得的主頻率。當(dāng)前主頻率具體計(jì)算公式如下:設(shè)FFT處理后得到的數(shù)組為frequency[512],tempint對(duì)應(yīng)frequency數(shù)組中后256個(gè)數(shù)據(jù)中最大值出現(xiàn)的位置,則此時(shí)主要頻率大小為(512-tempint)*4000/256。當(dāng)采樣頻率為8kHz時(shí),可測(cè)得的頻率范圍為16~4000Hz,即256個(gè)點(diǎn)等分4000Hz。
圖6是當(dāng)信號(hào)發(fā)生器產(chǎn)生140Hz的被測(cè)信號(hào),系統(tǒng)采樣頻率為8kHz時(shí),該信號(hào)的時(shí)域波形及經(jīng)過變換得到的頻譜曲線。從圖中可以看到,通過FFT變換可較準(zhǔn)確地掌握輸入信號(hào)的頻率特性。
3 結(jié)語
本文以嵌入式處理器EP7312和模數(shù)轉(zhuǎn)換芯片UDA1341 為核心設(shè)計(jì)了音頻數(shù)據(jù)采集和FFT處理系統(tǒng)。采用了fiq技術(shù)對(duì)音頻數(shù)據(jù)流進(jìn)行實(shí)時(shí)性的采集,具有速度快,采樣頻率可靈活設(shè)置等特點(diǎn),可應(yīng)用于環(huán)境監(jiān)測(cè)、故障診斷等便攜式語音采集、顯示和頻譜分析的場(chǎng)合。
圖6 在LCD上顯示的時(shí)域和頻域圖