郝艷陽,蘇淑靖,裴永浩,馮成林
(中北大學(xué)電子測試技術(shù)國家重點(diǎn)實(shí)驗(yàn)室,山西 太原 030051)
頻率估算是信號處理的最基本問題之一,也是振動分析、陣列信號處理、電磁學(xué)等眾多領(lǐng)域的關(guān)鍵問題[1-3]。計算機(jī)或?qū)S迷O(shè)備只能對有限多個樣本進(jìn)行計算,因此需對信號進(jìn)行截斷,由此導(dǎo)致在使用快速傅里葉變換(fast Fourier transform,F(xiàn)FT)對信號進(jìn)行處理時會產(chǎn)生頻譜泄露等問題。基于此,提出了全相位快速傅里葉變換(all-phase fast Fourier transform,apFFT),其通過對數(shù)據(jù)進(jìn)行預(yù)處理來減小信號的截斷誤差。同時apFFT 譜分析具有良好的抑制頻譜泄漏性能和水平相位特性等優(yōu)良性質(zhì)[4],無需借助任何校正方法即可從譜分析中獲得真實(shí)相位值,根據(jù)精確的相位來估算頻率。
在文獻(xiàn)[3]中用實(shí)驗(yàn)驗(yàn)證,在低噪聲場合下,全相位頻率估算的頻率校正誤差為(10-4~10-5)×Δω級別,Δω為頻率分辨率,其值為Δω=2π/N,N為樣本大小,由此可知,樣本點(diǎn)數(shù)越多,頻率估算精度越高。當(dāng)采樣點(diǎn)數(shù)較多時,實(shí)時信號處理可操作難度大,需要先預(yù)存采集數(shù)據(jù),以便后續(xù)數(shù)據(jù)分析處理,因此本設(shè)計先將時鐘信號數(shù)據(jù)傳送至PC 機(jī)進(jìn)行存儲,再通過調(diào)用存儲文件進(jìn)行頻率估算。本設(shè)計使用速度快且易擴(kuò)展的USB3.0 進(jìn)行數(shù)據(jù)傳輸,USB 3.0 外設(shè)控制器使用Cypress 旗下的EZ_USB FX3。該控制器有一個高度靈活的可編程接口——GPIF II接口,將其連接至外部FPGA,使之作為同步從設(shè)備FIFO(Slave FIFO)接口,完成從FPGA 至USB 至PC機(jī)的數(shù)據(jù)傳輸。在數(shù)據(jù)傳輸速率得到有效提升的同時,確保數(shù)據(jù)傳輸?shù)目煽啃耘c穩(wěn)定性。
本文設(shè)計的頻率估算系統(tǒng)由時鐘源、FPGA 控制單元、USB 傳輸單元及頻率估算單元組成。如圖1 所示,F(xiàn)PGA 控制A/D 轉(zhuǎn)換器將時鐘源產(chǎn)生的1 MHz 模擬信號轉(zhuǎn)換為16 位串行數(shù)據(jù)傳送至FPGA,并將讀取回的串行數(shù)據(jù)轉(zhuǎn)換為16 位并行數(shù)據(jù)通過數(shù)據(jù)緩存FIFO 傳輸至USB 芯片,進(jìn)而傳輸至PC 機(jī)進(jìn)行存儲。再由仿真軟件調(diào)用文件對接收到的數(shù)據(jù)進(jìn)行apFFT 頻率估算。

圖1 系統(tǒng)結(jié)構(gòu)框圖
FPGA 作為頻率估算系統(tǒng)的控制核心,利用A/D轉(zhuǎn)換器對時鐘源進(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]時,F(xiàn)PGA 作為主控制器,可將EZ_USB FX3 看作FIFO存儲器(DMA 緩沖區(qū),DMA buffer),通過編寫代碼,實(shí)現(xiàn)在FPGA 上執(zhí)行一個與同步Slave FIFO 相兼容的主控接口,完成從FPGA 至USB 的數(shù)據(jù)傳輸。根據(jù)USB 同步Slave FIFO 接口控制框圖及接口時序圖對FPGA 的控制程序進(jìn)行設(shè)計:FPGA 內(nèi)部開辟一個大小為16 KB 的FIFO 緩沖單元,對從時鐘信號源采集到的數(shù)據(jù)進(jìn)行緩存,當(dāng)數(shù)據(jù)緩存至緩沖區(qū)半滿時,將Slave FIFO 接口寫入選通信號slwr 拉低,開始向FX3 的DMA buffer 內(nèi)寫入數(shù)據(jù)。FPGA 內(nèi)部執(zhí)行一個計數(shù)機(jī)制,始終將與DMA buffer 大小(8 KB)相同的數(shù)據(jù)量寫入DMA buffer 內(nèi),當(dāng)計數(shù)值超過DMA buffer 的大小時結(jié)束數(shù)據(jù)傳輸。該計數(shù)機(jī)制只通過監(jiān)控滿/空標(biāo)志FLAG_A 來決定數(shù)據(jù)傳輸開始的時間,避免了使用USB 局部標(biāo)志FLAG_B 來決定結(jié)束傳輸?shù)臅r間,免除了水印值的設(shè)置。
FPGA 狀態(tài)機(jī)包含兩個狀態(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)啟動后進(jìn)入狀態(tài)機(jī)“等狀態(tài)”,D 觸發(fā)器在flag_A 上升沿時觸發(fā)并鎖存“1”進(jìn)去,此時等待FPGA 內(nèi)部FIFO 被寫至半滿(8 KB,即寫入4 096 個點(diǎn)),半滿信號來臨與D 觸發(fā)器所存結(jié)果(信號1)進(jìn)行“與”操作,其結(jié)果為“1”時跳轉(zhuǎn)至“傳數(shù)狀態(tài)”,與此同時,半滿信號觸發(fā)計數(shù)器執(zhí)行計數(shù),計數(shù)0~4 095 時,計數(shù)器輸出count_flag 標(biāo)志信號,計至4 095 后自動將計數(shù)清零,并將標(biāo)志count_flag 拉低,count_flag 信號同時送至FIFO 讀使能端作為讀使能信號rd_en,控制FIFO 在100 MHz讀時鐘驅(qū)動下往外讀數(shù)并送數(shù)據(jù)至EZ-USB FX3 的DMA buffer 內(nèi),F(xiàn)IFO 輸出數(shù)據(jù)的有效標(biāo)志valid 信號取反后作為USB 的寫使能slwr。
EZ_USB FX3 以同步從設(shè)備FIFO 方式工作,依靠芯片內(nèi)部的多個FIFO 緩沖區(qū)來實(shí)現(xiàn)使用FX3 的DMA 運(yùn)行機(jī)制工作[6],即通過套接字(Socket)、DMA 描述符(DMA descriptor)、DMA 緩沖區(qū)(DMA buffer)共同配合完成數(shù)據(jù)傳輸。根據(jù)FPGA 的邏輯設(shè)計,同時結(jié)合DMA 運(yùn)行機(jī)制來搭建USB3.0 數(shù)據(jù)傳輸?shù)募軜?gòu)。本設(shè)計創(chuàng)建一個從GPIF II 處理接口模塊(PIB 模塊)至USB 接口模塊(UIB 模塊)的DMA 通道,將之設(shè)置為AUTO 模式,使外部數(shù)據(jù)無需片內(nèi)CPU 干預(yù),便可以通過同步Slave FIFO 接口將數(shù)據(jù)連續(xù)寫入FX3,再傳輸至PC 機(jī);在DMA 通道內(nèi)設(shè)置4 個大小為8 KB 的DMA buffer,用于上傳數(shù)據(jù)的存儲;將USB 端點(diǎn)設(shè)置為塊傳輸模式,且端點(diǎn)的最大數(shù)據(jù)包大小為1 024 byte;數(shù)據(jù)傳輸構(gòu)架如圖3 所示,PIB 模塊根據(jù)FPGA 發(fā)送來的0x00 地址信號,匹配內(nèi)部的專用數(shù)據(jù)路徑GPIF 線程0,將外部數(shù)據(jù)引腳連接至默認(rèn)映射的套接字0(PIB_SOCKET_0),使得套接字0 作為發(fā)送套接字,將數(shù)據(jù)寫入DMA 緩沖區(qū)內(nèi)。使用UIB 模塊的套接字1(UIB_SOCKET_1)作為接收套接字,從DMA 緩沖區(qū)內(nèi)讀取數(shù)據(jù),將數(shù)據(jù)傳送至USB 輸入(IN)端點(diǎn)0x81,通過管道傳輸給PC 機(jī)。

圖3 FX3 數(shù)據(jù)傳輸架構(gòu)
FX3 上電后,需加載存儲于EEPROM 芯片(電可擦除可編程存儲非只讀芯片)中的設(shè)備“驅(qū)動軟件”——固件[7],驅(qū)動FX3 來完成預(yù)期的設(shè)備功能。FX3 固件應(yīng)用程序主要由初始化程序和用戶定義程序兩部分組成[8-9]。初始化程序首先完成設(shè)備(FX3)的初始化,后進(jìn)入RTOS(實(shí)時操作系統(tǒng)),調(diào)用CyFxApplicationDefine 函數(shù)創(chuàng)建并激活用戶自定義線程,進(jìn)入用戶定義程序(從設(shè)備FIFO)部分。用戶定義程序先對GPIF II 模塊及USB 模塊進(jìn)行初始化,后注冊回調(diào)函數(shù),對各種請求和事務(wù)進(jìn)行響應(yīng)。當(dāng)接收到USB_SET_CONFIGURATION 請求時調(diào)用CyFxSlFifoAppInStart()函數(shù),根據(jù)需求配置USB 端點(diǎn)并創(chuàng)建GPIF 接口和USB 端點(diǎn)之間的DMA 通道。當(dāng)檢測到USB 復(fù)位或斷開連接時調(diào)用CyFxSlFifoAppInStop()函數(shù),禁用USB 端點(diǎn)并釋放DMA 通道。程序結(jié)構(gòu)流程圖如圖4 所示。

圖4 固件程序結(jié)構(gòu)流程圖
本設(shè)計的FX3 固件程序主要配置以下幾項(xiàng)內(nèi)容:使用GPIF II Designer 工具對GPIF II 接口進(jìn)行配置;使用Eclipse 開發(fā)環(huán)境進(jìn)行固件開發(fā),對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è)置信號FLAG_A 的工作模式為Tread_0_DMA_Ready,將該標(biāo)志配置為線程0 的跟隨標(biāo)志,用來監(jiān)控DMA buffer 的滿空狀態(tài)。GPIF II Designer 根據(jù)設(shè)計需求生成狀態(tài)機(jī),并在項(xiàng)目編譯后生成cyfxgpifconfig.h 文件,將此頭文件包含到Eclipse 項(xiàng)目,即可實(shí)現(xiàn)對GPIF II 接口的配置。
在Eclipse 開發(fā)環(huán)境中,根據(jù)搭建好的USB3.0 數(shù)據(jù)傳輸架構(gòu),在固件用戶自定義程序中對USB 端點(diǎn)進(jìn)行配置并創(chuàng)建對應(yīng)的DMA 通道。定義DMA buffer的個數(shù)為4,每個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è)置其類型為CY_U3P_USB_EP_BULK,使USB 與PC 機(jī)的傳輸方式為塊傳輸;當(dāng)檢測到連接的主機(jī)USB 接口為USB3.0 時,設(shè)置端點(diǎn)的最大數(shù)據(jù)包大小為1 024 byte(1 kbyte);將配置好的端點(diǎn)賦給端點(diǎn)1,功能實(shí)現(xiàn)代碼如下:

其次,創(chuàng)建PIB 模塊至UIB 模塊的DMA 通道。DMA 通道的類型為自動模式;其中DMA buffer 的個數(shù),每個DMA buffer 的大小,發(fā)送套接字與接受套接字均按宏定義進(jìn)行設(shè)置,其他設(shè)置按默認(rèn)設(shè)置即可,功能實(shí)現(xiàn)代碼如下:

Cypress 公司提供了完整的測速軟件程序,其核心控制類為CyAPI 控制函數(shù)類,該類為EZ_USB FX3 系列USB 接口芯片提供了精細(xì)的控制接口,通過插入CyAPI.h 頭文件和CyAPI.lib 庫文件于應(yīng)用程序中,可便捷實(shí)現(xiàn)相應(yīng)控制函數(shù)的調(diào)用[8-9]。該程序首先安排了用戶界面以及按鈕資源,并通過CCyUSBDevice 函數(shù)獲取USB 設(shè)備及輸入端點(diǎn),其次建立了XferLoop 線程,在線程內(nèi)開辟內(nèi)存來存放來自USB 的數(shù)據(jù),通過BeginDataXfer 函數(shù)與Finish-DataXfer 函數(shù)來開啟或關(guān)斷通過USB 端點(diǎn)的數(shù)據(jù)傳輸。該軟件用于對數(shù)據(jù)傳輸速率的測試,無法滿足存儲數(shù)據(jù)的應(yīng)用需求,需添加寫文件功能。首先添加頭文件及命名空間:

其次在私有成員數(shù)據(jù)中添加靜態(tài)文件指針數(shù)據(jù):

最后分別在XferLoop()函數(shù)與AbortXferLoop()函數(shù)中添加寫文件與關(guān)閉文件,將PC 機(jī)buffer塊中的數(shù)據(jù)以二進(jìn)制形式寫入文件中,關(guān)鍵代碼分別如下:

實(shí)現(xiàn)將USB 上傳至PC 機(jī)的數(shù)據(jù)存儲至文件中。
本文采用全相位時移相位差法校正法[10]來估算頻率精度,其區(qū)別于普通相位差法校正法在于對數(shù)據(jù)進(jìn)行全相位FFT 譜分析(apFFT 譜分析)。
apFFT 譜分析的重心在于全相位數(shù)據(jù)預(yù)處理。數(shù)據(jù)預(yù)處理流程:先把兩個N階窗進(jìn)行卷積運(yùn)算得到長為2N-1 的卷積窗ωc,用卷積窗ωc與長為2N-1的數(shù)據(jù)向量進(jìn)行數(shù)據(jù)加權(quán),后將左邊各數(shù)據(jù)向右平移N個延時單元,再與位置重疊的另一個數(shù)據(jù)相加,形成N個數(shù)據(jù)y(i),i=0,1,…,N-1。對形成的N個數(shù)據(jù)作FFT(快速傅里葉變換),即為apFFT。最終可得到離散譜Y(k)。apFFT 譜分析結(jié)構(gòu)框圖如圖5 所示。

圖5 全相位譜分析結(jié)構(gòu)框圖
采連續(xù)兩段長為N的樣本并分別進(jìn)行FFT,利用對應(yīng)譜線的相位差值校正出譜峰處的準(zhǔn)確頻率和相位是第一類傳統(tǒng)相位差校正法[11],該方法相比于傳統(tǒng)能量重心法具有更高的頻率估計精度,它是基于傳統(tǒng)FFT 譜分析的線性時不變性質(zhì)而推出的。而全相位FFT 譜分析具有線性性質(zhì)和相位不變性這兩個重要性質(zhì),充分利用這兩個性質(zhì)并結(jié)合傳統(tǒng)第一類相位差法的算法構(gòu)造思路,便形成了基于全相位FFT 譜分析的時移相位差校正法[12]。文獻(xiàn)[13]已證,對序列x(n)=Aej(ω0n+θ),n∈[-N+1,N-1]進(jìn)行前、后雙窗均為f的雙窗apFFT,得到的離散譜為:

式中:A為幅值,ω0為數(shù)字角頻率,θ為初相,F(xiàn)g(ω)為f對應(yīng)的歸一化幅度譜。主譜線k*上的相位譜為


圖6 apFFT 時移相位差法的頻譜校正流程圖

式中:fs為采樣頻率。因漢寧窗可以有效抑制頻譜泄露且頻率分辨率較高,本文選用其作“雙窗apFFT”。根據(jù)以上算法流程,編寫MATLAB 程序,實(shí)現(xiàn)對頻率的估算。
采用分步調(diào)試的方法對本系統(tǒng)進(jìn)行測試。先對FPGA 時序邏輯的正確性以及數(shù)據(jù)傳輸狀態(tài)進(jìn)行測試,再對頻率估計算法的準(zhǔn)確性進(jìn)行測試。
對于控制USB 3.0 進(jìn)行數(shù)據(jù)傳輸?shù)目刂茣r序結(jié)果,使用FPGA 內(nèi)嵌邏輯分析儀對USB3.0 從設(shè)備FIFO 的接口時鐘PCLK、USB 內(nèi)監(jiān)測DMA buffer 狀態(tài)的標(biāo)志信號flag_A、FPGA 內(nèi)16 KB FIFO 的半滿信號Half_full、flag_A 信號與Half_full 信號的與信號State_flag、計數(shù)器的輸出標(biāo)志count_flag、FPGA 內(nèi)16 KB FIFO 的讀使能信號rd_en 及數(shù)據(jù)有效標(biāo)志信號valid、USB 寫使能信號進(jìn)行測試。如圖8 所示,Waveform 窗口中顯示,PCLK 時鐘頻率100 MHz,每當(dāng)USB內(nèi)DMA buffer 由滿至空時,會使監(jiān)測狀態(tài)標(biāo)志信號flag_A 產(chǎn)生上升沿,當(dāng)?shù)却鼺PGA 內(nèi)FIFO 半滿時,啟動計數(shù)同時開始向USB 內(nèi)部傳輸數(shù)據(jù),當(dāng)傳輸數(shù)據(jù)量為8 KB 時,DMA buffer 被寫滿,falg_A 拉低,完成一次數(shù)據(jù)傳輸。FPGA 寫入USB 從機(jī)數(shù)據(jù)時序控制仿真結(jié)果如圖7 所示,時序狀態(tài)與設(shè)計一致,保證了高速數(shù)據(jù)傳輸?shù)目煽啃浴?/p>

圖7 FPGA 寫入從機(jī)數(shù)據(jù)時序控制測試圖
單次數(shù)據(jù)傳輸完畢,將傳輸至PC 機(jī)的數(shù)據(jù)保存至文件內(nèi),為后續(xù)apFFT 頻率估計算法提供充足的、精確的數(shù)據(jù)源。數(shù)據(jù)傳輸界面如圖8 所示。

圖8 數(shù)據(jù)傳輸界面
在MATLAB 環(huán)境下,通過高精度頻率估計算法對多次上傳數(shù)據(jù)進(jìn)行apFFT 頻率估算,設(shè)置頻率估算數(shù)據(jù)量s=49 151,采樣率fs=40 650 406、apFFT長度N=16 384、時延L=16 384。,多次估算結(jié)果如表1 所示,源信號頻率理論值為1 MHz,平均頻率值為1 000 000.000 010 68 Hz,精度可達(dá)小數(shù)點(diǎn)后5 位。

表1 頻率估計算法估算結(jié)果表 單位:Hz
本設(shè)計提出的用于apFFT 頻率估算的USB3.0 高速數(shù)據(jù)傳輸系統(tǒng),采用A/D 轉(zhuǎn)換器將時鐘源產(chǎn)生的高穩(wěn)定度模擬信號轉(zhuǎn)換為16 位并行數(shù)據(jù)傳送主控器至FPGA,同時設(shè)計FPGA 執(zhí)行計數(shù)機(jī)制,通過控制一次性寫入USB DMA buffer 的數(shù)據(jù)量,來免除對USB局部標(biāo)志的使用,實(shí)現(xiàn)了高速數(shù)據(jù)傳輸。設(shè)計的基于apFFT 的高精度頻率估計算法對回傳數(shù)據(jù)的頻率測算精度達(dá)小數(shù)點(diǎn)后5 位,證明該系統(tǒng)在高速高精度傳輸及測試環(huán)境下具有極高的工程應(yīng)用價值。