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