郝艷陽(yáng),蘇淑靖,裴永浩,馮成林
(中北大學(xué)電子測(cè)試技術(shù)國(guó)家重點(diǎn)實(shí)驗(yàn)室,山西 太原 030051)
頻率估算是信號(hào)處理的最基本問(wèn)題之一,也是振動(dòng)分析、陣列信號(hào)處理、電磁學(xué)等眾多領(lǐng)域的關(guān)鍵問(wèn)題[1-3]。計(jì)算機(jī)或?qū)S迷O(shè)備只能對(duì)有限多個(gè)樣本進(jìn)行計(jì)算,因此需對(duì)信號(hào)進(jìn)行截?cái)?,由此?dǎo)致在使用快速傅里葉變換(fast Fourier transform,F(xiàn)FT)對(duì)信號(hào)進(jìn)行處理時(shí)會(huì)產(chǎn)生頻譜泄露等問(wèn)題?;诖?,提出了全相位快速傅里葉變換(all-phase fast Fourier transform,apFFT),其通過(guò)對(duì)數(shù)據(jù)進(jìn)行預(yù)處理來(lái)減小信號(hào)的截?cái)嗾`差。同時(shí)apFFT 譜分析具有良好的抑制頻譜泄漏性能和水平相位特性等優(yōu)良性質(zhì)[4],無(wú)需借助任何校正方法即可從譜分析中獲得真實(shí)相位值,根據(jù)精確的相位來(lái)估算頻率。
在文獻(xiàn)[3]中用實(shí)驗(yàn)驗(yàn)證,在低噪聲場(chǎng)合下,全相位頻率估算的頻率校正誤差為(10-4~10-5)×Δω級(jí)別,Δω為頻率分辨率,其值為Δω=2π/N,N為樣本大小,由此可知,樣本點(diǎn)數(shù)越多,頻率估算精度越高。當(dāng)采樣點(diǎn)數(shù)較多時(shí),實(shí)時(shí)信號(hào)處理可操作難度大,需要先預(yù)存采集數(shù)據(jù),以便后續(xù)數(shù)據(jù)分析處理,因此本設(shè)計(jì)先將時(shí)鐘信號(hào)數(shù)據(jù)傳送至PC 機(jī)進(jìn)行存儲(chǔ),再通過(guò)調(diào)用存儲(chǔ)文件進(jìn)行頻率估算。本設(shè)計(jì)使用速度快且易擴(kuò)展的USB3.0 進(jìn)行數(shù)據(jù)傳輸,USB 3.0 外設(shè)控制器使用Cypress 旗下的EZ_USB FX3。該控制器有一個(gè)高度靈活的可編程接口——GPIF II接口,將其連接至外部FPGA,使之作為同步從設(shè)備FIFO(Slave FIFO)接口,完成從FPGA 至USB 至PC機(jī)的數(shù)據(jù)傳輸。在數(shù)據(jù)傳輸速率得到有效提升的同時(shí),確保數(shù)據(jù)傳輸?shù)目煽啃耘c穩(wěn)定性。
本文設(shè)計(jì)的頻率估算系統(tǒng)由時(shí)鐘源、FPGA 控制單元、USB 傳輸單元及頻率估算單元組成。如圖1 所示,F(xiàn)PGA 控制A/D 轉(zhuǎn)換器將時(shí)鐘源產(chǎn)生的1 MHz 模擬信號(hào)轉(zhuǎn)換為16 位串行數(shù)據(jù)傳送至FPGA,并將讀取回的串行數(shù)據(jù)轉(zhuǎn)換為16 位并行數(shù)據(jù)通過(guò)數(shù)據(jù)緩存FIFO 傳輸至USB 芯片,進(jìn)而傳輸至PC 機(jī)進(jìn)行存儲(chǔ)。再由仿真軟件調(diào)用文件對(duì)接收到的數(shù)據(jù)進(jìn)行apFFT 頻率估算。
圖1 系統(tǒng)結(jié)構(gòu)框圖
FPGA 作為頻率估算系統(tǒng)的控制核心,利用A/D轉(zhuǎn)換器對(duì)時(shí)鐘源進(jìn)行采樣,并控制USB3.0 將采集到的數(shù)據(jù)傳輸至PC 機(jī)。FPGA 采用Xillix 公司的Airtix-7 系列XC7A100T 芯片,適合高速數(shù)據(jù)通信和高速數(shù)據(jù)采集等應(yīng)用,可以很好地滿足系統(tǒng)的控制需求。
當(dāng)GPIF II 接口作為同步Slave FIFO 接口[5]時(shí),F(xiàn)PGA 作為主控制器,可將EZ_USB FX3 看作FIFO存儲(chǔ)器(DMA 緩沖區(qū),DMA buffer),通過(guò)編寫(xiě)代碼,實(shí)現(xiàn)在FPGA 上執(zhí)行一個(gè)與同步Slave FIFO 相兼容的主控接口,完成從FPGA 至USB 的數(shù)據(jù)傳輸。根據(jù)USB 同步Slave FIFO 接口控制框圖及接口時(shí)序圖對(duì)FPGA 的控制程序進(jìn)行設(shè)計(jì):FPGA 內(nèi)部開(kāi)辟一個(gè)大小為16 KB 的FIFO 緩沖單元,對(duì)從時(shí)鐘信號(hào)源采集到的數(shù)據(jù)進(jìn)行緩存,當(dāng)數(shù)據(jù)緩存至緩沖區(qū)半滿時(shí),將Slave FIFO 接口寫(xiě)入選通信號(hào)slwr 拉低,開(kāi)始向FX3 的DMA buffer 內(nèi)寫(xiě)入數(shù)據(jù)。FPGA 內(nèi)部執(zhí)行一個(gè)計(jì)數(shù)機(jī)制,始終將與DMA buffer 大小(8 KB)相同的數(shù)據(jù)量寫(xiě)入DMA buffer 內(nèi),當(dāng)計(jì)數(shù)值超過(guò)DMA buffer 的大小時(shí)結(jié)束數(shù)據(jù)傳輸。該計(jì)數(shù)機(jī)制只通過(guò)監(jiān)控滿/空標(biāo)志FLAG_A 來(lái)決定數(shù)據(jù)傳輸開(kāi)始的時(shí)間,避免了使用USB 局部標(biāo)志FLAG_B 來(lái)決定結(jié)束傳輸?shù)臅r(shí)間,免除了水印值的設(shè)置。
FPGA 狀態(tài)機(jī)包含兩個(gè)狀態(tài):“等狀態(tài)”與“傳數(shù)狀態(tài)”,具體狀態(tài)轉(zhuǎn)換條件如圖2 所示。
圖2 狀態(tài)機(jī)跳轉(zhuǎn)及其條件轉(zhuǎn)換關(guān)系
如圖2 所示,系統(tǒng)啟動(dòng)后進(jìn)入狀態(tài)機(jī)“等狀態(tài)”,D 觸發(fā)器在flag_A 上升沿時(shí)觸發(fā)并鎖存“1”進(jìn)去,此時(shí)等待FPGA 內(nèi)部FIFO 被寫(xiě)至半滿(8 KB,即寫(xiě)入4 096 個(gè)點(diǎn)),半滿信號(hào)來(lái)臨與D 觸發(fā)器所存結(jié)果(信號(hào)1)進(jìn)行“與”操作,其結(jié)果為“1”時(shí)跳轉(zhuǎn)至“傳數(shù)狀態(tài)”,與此同時(shí),半滿信號(hào)觸發(fā)計(jì)數(shù)器執(zhí)行計(jì)數(shù),計(jì)數(shù)0~4 095 時(shí),計(jì)數(shù)器輸出count_flag 標(biāo)志信號(hào),計(jì)至4 095 后自動(dòng)將計(jì)數(shù)清零,并將標(biāo)志count_flag 拉低,count_flag 信號(hào)同時(shí)送至FIFO 讀使能端作為讀使能信號(hào)rd_en,控制FIFO 在100 MHz讀時(shí)鐘驅(qū)動(dòng)下往外讀數(shù)并送數(shù)據(jù)至EZ-USB FX3 的DMA buffer 內(nèi),F(xiàn)IFO 輸出數(shù)據(jù)的有效標(biāo)志valid 信號(hào)取反后作為USB 的寫(xiě)使能slwr。
EZ_USB FX3 以同步從設(shè)備FIFO 方式工作,依靠芯片內(nèi)部的多個(gè)FIFO 緩沖區(qū)來(lái)實(shí)現(xiàn)使用FX3 的DMA 運(yùn)行機(jī)制工作[6],即通過(guò)套接字(Socket)、DMA 描述符(DMA descriptor)、DMA 緩沖區(qū)(DMA buffer)共同配合完成數(shù)據(jù)傳輸。根據(jù)FPGA 的邏輯設(shè)計(jì),同時(shí)結(jié)合DMA 運(yùn)行機(jī)制來(lái)搭建USB3.0 數(shù)據(jù)傳輸?shù)募軜?gòu)。本設(shè)計(jì)創(chuàng)建一個(gè)從GPIF II 處理接口模塊(PIB 模塊)至USB 接口模塊(UIB 模塊)的DMA 通道,將之設(shè)置為AUTO 模式,使外部數(shù)據(jù)無(wú)需片內(nèi)CPU 干預(yù),便可以通過(guò)同步Slave FIFO 接口將數(shù)據(jù)連續(xù)寫(xiě)入FX3,再傳輸至PC 機(jī);在DMA 通道內(nèi)設(shè)置4 個(gè)大小為8 KB 的DMA buffer,用于上傳數(shù)據(jù)的存儲(chǔ);將USB 端點(diǎn)設(shè)置為塊傳輸模式,且端點(diǎn)的最大數(shù)據(jù)包大小為1 024 byte;數(shù)據(jù)傳輸構(gòu)架如圖3 所示,PIB 模塊根據(jù)FPGA 發(fā)送來(lái)的0x00 地址信號(hào),匹配內(nèi)部的專(zhuān)用數(shù)據(jù)路徑GPIF 線程0,將外部數(shù)據(jù)引腳連接至默認(rèn)映射的套接字0(PIB_SOCKET_0),使得套接字0 作為發(fā)送套接字,將數(shù)據(jù)寫(xiě)入DMA 緩沖區(qū)內(nèi)。使用UIB 模塊的套接字1(UIB_SOCKET_1)作為接收套接字,從DMA 緩沖區(qū)內(nèi)讀取數(shù)據(jù),將數(shù)據(jù)傳送至USB 輸入(IN)端點(diǎn)0x81,通過(guò)管道傳輸給PC 機(jī)。
圖3 FX3 數(shù)據(jù)傳輸架構(gòu)
FX3 上電后,需加載存儲(chǔ)于EEPROM 芯片(電可擦除可編程存儲(chǔ)非只讀芯片)中的設(shè)備“驅(qū)動(dòng)軟件”——固件[7],驅(qū)動(dòng)FX3 來(lái)完成預(yù)期的設(shè)備功能。FX3 固件應(yīng)用程序主要由初始化程序和用戶定義程序兩部分組成[8-9]。初始化程序首先完成設(shè)備(FX3)的初始化,后進(jìn)入RTOS(實(shí)時(shí)操作系統(tǒng)),調(diào)用CyFxApplicationDefine 函數(shù)創(chuàng)建并激活用戶自定義線程,進(jìn)入用戶定義程序(從設(shè)備FIFO)部分。用戶定義程序先對(duì)GPIF II 模塊及USB 模塊進(jìn)行初始化,后注冊(cè)回調(diào)函數(shù),對(duì)各種請(qǐng)求和事務(wù)進(jìn)行響應(yīng)。當(dāng)接收到USB_SET_CONFIGURATION 請(qǐng)求時(shí)調(diào)用CyFxSlFifoAppInStart()函數(shù),根據(jù)需求配置USB 端點(diǎn)并創(chuàng)建GPIF 接口和USB 端點(diǎn)之間的DMA 通道。當(dāng)檢測(cè)到USB 復(fù)位或斷開(kāi)連接時(shí)調(diào)用CyFxSlFifoAppInStop()函數(shù),禁用USB 端點(diǎn)并釋放DMA 通道。程序結(jié)構(gòu)流程圖如圖4 所示。
圖4 固件程序結(jié)構(gòu)流程圖
本設(shè)計(jì)的FX3 固件程序主要配置以下幾項(xiàng)內(nèi)容:使用GPIF II Designer 工具對(duì)GPIF II 接口進(jìn)行配置;使用Eclipse 開(kāi)發(fā)環(huán)境進(jìn)行固件開(kāi)發(fā),對(duì)USB端點(diǎn)進(jìn)行配置,創(chuàng)建GPIF 接口和USB 端點(diǎn)之間的DMA 通道。
使用GPIF II Designer 將GPIF II 接口設(shè)置為同步Slave FIFO 接口,規(guī)定其并行數(shù)據(jù)總線寬度為16位,地址總線為2 位,設(shè)置信號(hào)FLAG_A 的工作模式為T(mén)read_0_DMA_Ready,將該標(biāo)志配置為線程0 的跟隨標(biāo)志,用來(lái)監(jiān)控DMA buffer 的滿空狀態(tài)。GPIF II Designer 根據(jù)設(shè)計(jì)需求生成狀態(tài)機(jī),并在項(xiàng)目編譯后生成cyfxgpifconfig.h 文件,將此頭文件包含到Eclipse 項(xiàng)目,即可實(shí)現(xiàn)對(duì)GPIF II 接口的配置。
在Eclipse 開(kāi)發(fā)環(huán)境中,根據(jù)搭建好的USB3.0 數(shù)據(jù)傳輸架構(gòu),在固件用戶自定義程序中對(duì)USB 端點(diǎn)進(jìn)行配置并創(chuàng)建對(duì)應(yīng)的DMA 通道。定義DMA buffer的個(gè)數(shù)為4,每個(gè)DMA buffer 的大小為8 KB;定義USB 端點(diǎn)1 為輸入端點(diǎn),其地址為0x81(第7 位代表傳輸方向,1 為輸入,0 為輸出);定義生產(chǎn)者的發(fā)送套接字為PIB 模塊的套接字0,消費(fèi)者的接收套接字為UIB 模塊的套接字1;功能實(shí)現(xiàn)代碼如下:
在CyFxSlFifoAppInStart(void)函數(shù)中進(jìn)行端點(diǎn)的配置及DMA 通道的建立。先進(jìn)行USB 端點(diǎn)的配置,將端點(diǎn)使能,設(shè)置其類(lèi)型為CY_U3P_USB_EP_BULK,使USB 與PC 機(jī)的傳輸方式為塊傳輸;當(dāng)檢測(cè)到連接的主機(jī)USB 接口為USB3.0 時(shí),設(shè)置端點(diǎn)的最大數(shù)據(jù)包大小為1 024 byte(1 kbyte);將配置好的端點(diǎn)賦給端點(diǎn)1,功能實(shí)現(xiàn)代碼如下:
其次,創(chuàng)建PIB 模塊至UIB 模塊的DMA 通道。DMA 通道的類(lèi)型為自動(dòng)模式;其中DMA buffer 的個(gè)數(shù),每個(gè)DMA buffer 的大小,發(fā)送套接字與接受套接字均按宏定義進(jìn)行設(shè)置,其他設(shè)置按默認(rèn)設(shè)置即可,功能實(shí)現(xiàn)代碼如下:
Cypress 公司提供了完整的測(cè)速軟件程序,其核心控制類(lèi)為CyAPI 控制函數(shù)類(lèi),該類(lèi)為EZ_USB FX3 系列USB 接口芯片提供了精細(xì)的控制接口,通過(guò)插入CyAPI.h 頭文件和CyAPI.lib 庫(kù)文件于應(yīng)用程序中,可便捷實(shí)現(xiàn)相應(yīng)控制函數(shù)的調(diào)用[8-9]。該程序首先安排了用戶界面以及按鈕資源,并通過(guò)CCyUSBDevice 函數(shù)獲取USB 設(shè)備及輸入端點(diǎn),其次建立了XferLoop 線程,在線程內(nèi)開(kāi)辟內(nèi)存來(lái)存放來(lái)自USB 的數(shù)據(jù),通過(guò)BeginDataXfer 函數(shù)與Finish-DataXfer 函數(shù)來(lái)開(kāi)啟或關(guān)斷通過(guò)USB 端點(diǎn)的數(shù)據(jù)傳輸。該軟件用于對(duì)數(shù)據(jù)傳輸速率的測(cè)試,無(wú)法滿足存儲(chǔ)數(shù)據(jù)的應(yīng)用需求,需添加寫(xiě)文件功能。首先添加頭文件及命名空間:
其次在私有成員數(shù)據(jù)中添加靜態(tài)文件指針數(shù)據(jù):
最后分別在XferLoop()函數(shù)與AbortXferLoop()函數(shù)中添加寫(xiě)文件與關(guān)閉文件,將PC 機(jī)buffer塊中的數(shù)據(jù)以二進(jìn)制形式寫(xiě)入文件中,關(guān)鍵代碼分別如下:
實(shí)現(xiàn)將USB 上傳至PC 機(jī)的數(shù)據(jù)存儲(chǔ)至文件中。
本文采用全相位時(shí)移相位差法校正法[10]來(lái)估算頻率精度,其區(qū)別于普通相位差法校正法在于對(duì)數(shù)據(jù)進(jìn)行全相位FFT 譜分析(apFFT 譜分析)。
apFFT 譜分析的重心在于全相位數(shù)據(jù)預(yù)處理。數(shù)據(jù)預(yù)處理流程:先把兩個(gè)N階窗進(jìn)行卷積運(yùn)算得到長(zhǎng)為2N-1 的卷積窗ωc,用卷積窗ωc與長(zhǎng)為2N-1的數(shù)據(jù)向量進(jìn)行數(shù)據(jù)加權(quán),后將左邊各數(shù)據(jù)向右平移N個(gè)延時(shí)單元,再與位置重疊的另一個(gè)數(shù)據(jù)相加,形成N個(gè)數(shù)據(jù)y(i),i=0,1,…,N-1。對(duì)形成的N個(gè)數(shù)據(jù)作FFT(快速傅里葉變換),即為apFFT。最終可得到離散譜Y(k)。apFFT 譜分析結(jié)構(gòu)框圖如圖5 所示。
圖5 全相位譜分析結(jié)構(gòu)框圖
采連續(xù)兩段長(zhǎng)為N的樣本并分別進(jìn)行FFT,利用對(duì)應(yīng)譜線的相位差值校正出譜峰處的準(zhǔn)確頻率和相位是第一類(lèi)傳統(tǒng)相位差校正法[11],該方法相比于傳統(tǒng)能量重心法具有更高的頻率估計(jì)精度,它是基于傳統(tǒng)FFT 譜分析的線性時(shí)不變性質(zhì)而推出的。而全相位FFT 譜分析具有線性性質(zhì)和相位不變性這兩個(gè)重要性質(zhì),充分利用這兩個(gè)性質(zhì)并結(jié)合傳統(tǒng)第一類(lèi)相位差法的算法構(gòu)造思路,便形成了基于全相位FFT 譜分析的時(shí)移相位差校正法[12]。文獻(xiàn)[13]已證,對(duì)序列x(n)=Aej(ω0n+θ),n∈[-N+1,N-1]進(jìn)行前、后雙窗均為f的雙窗apFFT,得到的離散譜為:
式中:A為幅值,ω0為數(shù)字角頻率,θ為初相,F(xiàn)g(ω)為f對(duì)應(yīng)的歸一化幅度譜。主譜線k*上的相位譜為
圖6 apFFT 時(shí)移相位差法的頻譜校正流程圖
式中:fs為采樣頻率。因漢寧窗可以有效抑制頻譜泄露且頻率分辨率較高,本文選用其作“雙窗apFFT”。根據(jù)以上算法流程,編寫(xiě)MATLAB 程序,實(shí)現(xiàn)對(duì)頻率的估算。
采用分步調(diào)試的方法對(duì)本系統(tǒng)進(jìn)行測(cè)試。先對(duì)FPGA 時(shí)序邏輯的正確性以及數(shù)據(jù)傳輸狀態(tài)進(jìn)行測(cè)試,再對(duì)頻率估計(jì)算法的準(zhǔn)確性進(jìn)行測(cè)試。
對(duì)于控制USB 3.0 進(jìn)行數(shù)據(jù)傳輸?shù)目刂茣r(shí)序結(jié)果,使用FPGA 內(nèi)嵌邏輯分析儀對(duì)USB3.0 從設(shè)備FIFO 的接口時(shí)鐘PCLK、USB 內(nèi)監(jiān)測(cè)DMA buffer 狀態(tài)的標(biāo)志信號(hào)flag_A、FPGA 內(nèi)16 KB FIFO 的半滿信號(hào)Half_full、flag_A 信號(hào)與Half_full 信號(hào)的與信號(hào)State_flag、計(jì)數(shù)器的輸出標(biāo)志count_flag、FPGA 內(nèi)16 KB FIFO 的讀使能信號(hào)rd_en 及數(shù)據(jù)有效標(biāo)志信號(hào)valid、USB 寫(xiě)使能信號(hào)進(jìn)行測(cè)試。如圖8 所示,Waveform 窗口中顯示,PCLK 時(shí)鐘頻率100 MHz,每當(dāng)USB內(nèi)DMA buffer 由滿至空時(shí),會(huì)使監(jiān)測(cè)狀態(tài)標(biāo)志信號(hào)flag_A 產(chǎn)生上升沿,當(dāng)?shù)却鼺PGA 內(nèi)FIFO 半滿時(shí),啟動(dòng)計(jì)數(shù)同時(shí)開(kāi)始向USB 內(nèi)部傳輸數(shù)據(jù),當(dāng)傳輸數(shù)據(jù)量為8 KB 時(shí),DMA buffer 被寫(xiě)滿,falg_A 拉低,完成一次數(shù)據(jù)傳輸。FPGA 寫(xiě)入U(xiǎn)SB 從機(jī)數(shù)據(jù)時(shí)序控制仿真結(jié)果如圖7 所示,時(shí)序狀態(tài)與設(shè)計(jì)一致,保證了高速數(shù)據(jù)傳輸?shù)目煽啃浴?/p>
圖7 FPGA 寫(xiě)入從機(jī)數(shù)據(jù)時(shí)序控制測(cè)試圖
單次數(shù)據(jù)傳輸完畢,將傳輸至PC 機(jī)的數(shù)據(jù)保存至文件內(nèi),為后續(xù)apFFT 頻率估計(jì)算法提供充足的、精確的數(shù)據(jù)源。數(shù)據(jù)傳輸界面如圖8 所示。
圖8 數(shù)據(jù)傳輸界面
在MATLAB 環(huán)境下,通過(guò)高精度頻率估計(jì)算法對(duì)多次上傳數(shù)據(jù)進(jìn)行apFFT 頻率估算,設(shè)置頻率估算數(shù)據(jù)量s=49 151,采樣率fs=40 650 406、apFFT長(zhǎng)度N=16 384、時(shí)延L=16 384。,多次估算結(jié)果如表1 所示,源信號(hào)頻率理論值為1 MHz,平均頻率值為1 000 000.000 010 68 Hz,精度可達(dá)小數(shù)點(diǎn)后5 位。
表1 頻率估計(jì)算法估算結(jié)果表 單位:Hz
本設(shè)計(jì)提出的用于apFFT 頻率估算的USB3.0 高速數(shù)據(jù)傳輸系統(tǒng),采用A/D 轉(zhuǎn)換器將時(shí)鐘源產(chǎn)生的高穩(wěn)定度模擬信號(hào)轉(zhuǎn)換為16 位并行數(shù)據(jù)傳送主控器至FPGA,同時(shí)設(shè)計(jì)FPGA 執(zhí)行計(jì)數(shù)機(jī)制,通過(guò)控制一次性寫(xiě)入U(xiǎn)SB DMA buffer 的數(shù)據(jù)量,來(lái)免除對(duì)USB局部標(biāo)志的使用,實(shí)現(xiàn)了高速數(shù)據(jù)傳輸。設(shè)計(jì)的基于apFFT 的高精度頻率估計(jì)算法對(duì)回傳數(shù)據(jù)的頻率測(cè)算精度達(dá)小數(shù)點(diǎn)后5 位,證明該系統(tǒng)在高速高精度傳輸及測(cè)試環(huán)境下具有極高的工程應(yīng)用價(jià)值。