艾 紅,鄧大偉
(北京信息科技大學(xué) 自動(dòng)化學(xué)院,北京 100192)
傅里葉變換是一種將信號(hào)從時(shí)域變換到頻域的變換方式,而快速傅里葉變換 FFT(Fast Fourier Transform)是數(shù)字信號(hào)處理技術(shù)的基石。FFT和離散余弦變換DCT(Discrete Cosine Transform)都是數(shù)字信號(hào)處理技術(shù)中的基本算法,也是數(shù)字信號(hào)處理的基本工具。DSP芯片的出現(xiàn)使FFT和DCT的實(shí)現(xiàn)更為方便。本文利用TMS320F2812DSP內(nèi)部的ADC模塊與事件管理器(EVA)構(gòu)建了數(shù)據(jù)采集與數(shù)據(jù)變換并行處理的信號(hào)處理系統(tǒng),充分利用TMS320F2812強(qiáng)大的數(shù)據(jù)處理能力,實(shí)現(xiàn)了FFT運(yùn)算,提高了運(yùn)算速度[1-2]。
TI公司的TMS320F2812 DSP是目前控制領(lǐng)域性能較高的處理器,它將各種高級(jí)數(shù)字控制功能集成于一塊芯片上,整合了Flash存儲(chǔ)器、快速的A/D轉(zhuǎn)換器等外設(shè),強(qiáng)大的數(shù)據(jù)處理和控制能力大幅度提高了應(yīng)用效率。
DSP系統(tǒng)的模擬輸入電壓范圍為0~3 V。通過使用事件管理器的定時(shí)器1下溢中斷啟動(dòng)ADC。系統(tǒng)設(shè)計(jì)時(shí)晶振為30 MHz,經(jīng)過鎖相環(huán)倍頻后CPU時(shí)鐘頻率SYSCLKOUT是150 MHz,事件管理器采用高速外設(shè)時(shí)鐘HSPCLK,經(jīng)過程序設(shè)計(jì)6分頻得到高速外設(shè)時(shí)鐘HSPCLK 為 25 MHz。
SysCtrlRegs.HISPCP.all=0x3;//HSPCLK=SYSCLKOUT/6
將事件管理器中通用定時(shí)器1的周期寄存器值設(shè)置為 0x07FF,每經(jīng)過 2 048(0x07FF+1)個(gè)通用定時(shí)器的時(shí)鐘周期啟動(dòng)一次ADC。事件管理器中的通用定時(shí)器1由于沒有對(duì)高速外設(shè)時(shí)鐘分頻,因此通用定時(shí)器1的時(shí)鐘頻率為 25 MHz。
為了實(shí)現(xiàn)數(shù)據(jù)采集,設(shè)置ADC工作在級(jí)聯(lián)排序器模式,最大轉(zhuǎn)換通道數(shù)為1,并且采集數(shù)據(jù)來(lái)自通道ADCINA4,使能事件管理器EVA的觸發(fā)信號(hào)啟動(dòng)ADC排序器SEQ1,允許ADC產(chǎn)生中斷。相關(guān)程序設(shè)計(jì)如下。
當(dāng)事件管理器的通用定時(shí)器1產(chǎn)生下溢中斷時(shí),啟動(dòng)ADC。在ADC轉(zhuǎn)換完成中斷服務(wù)程序中讀取12 bit A/D轉(zhuǎn)換結(jié)果。程序設(shè)計(jì)如下:
FFT是DFT的快速運(yùn)算。由于有些信號(hào)在時(shí)域很難看出特性,使用FFT將其變換到頻域,就會(huì)很容易看出其特性。DFT算法的基本公式為:
其中,x(n)表示時(shí)域信號(hào),X(k)表示頻域信號(hào),WknN為運(yùn)算蝶式權(quán)。
FFT算法程序的基本流程如圖1所示。
首先需要對(duì)時(shí)域序列進(jìn)行比特排序,即接收處理單元把放在數(shù)據(jù)空間中的每個(gè)采樣點(diǎn)按地址讀出,按比特逆序再放入數(shù)據(jù)空間,準(zhǔn)備進(jìn)行運(yùn)算[3]。然后計(jì)算蝶式運(yùn)算的重要元素:運(yùn)算蝶式權(quán)WknN。 此處可充分利用WknN的周期性,減少運(yùn)算量,節(jié)省 DSP的存儲(chǔ)空間。以8點(diǎn)FFT為例,因?yàn)橛袆t計(jì)算8點(diǎn)FFT所有的運(yùn)算蝶式權(quán),只需將第三級(jí)即最后一級(jí)的運(yùn)算蝶式權(quán)算出即可。所以對(duì)于N(N=2M)點(diǎn) FFT來(lái)說(shuō),只需計(jì)算出第 M級(jí)的 M個(gè)運(yùn)算蝶式權(quán)即可得到各級(jí)的運(yùn)算蝶式權(quán)。所有的FFT運(yùn)算,第一級(jí)權(quán)值為1,所以第一級(jí)權(quán)值不用計(jì)算,僅此一項(xiàng)就可大大減少運(yùn)算量。WknN可以分為實(shí)部和虛部?jī)刹糠诌M(jìn)行計(jì)算,即:WknN=cos(2πK/N)-jsin(2πK/N)。 在 FFT 中,每級(jí)的蝶式運(yùn)算都具有不同數(shù)量的蝶群和不同的翅間距(第M級(jí)的翅間距為2M-1),這些都需要定義相應(yīng)的變量來(lái)控制。
調(diào)整模擬信號(hào)的頻率和幅值,通過A/D采集可以看到輸入信號(hào)波形及其FFT算法程序執(zhí)行結(jié)果,如圖2和圖3所示。
DCT是一種與傅里葉變換緊密相關(guān)的數(shù)學(xué)運(yùn)算。在傅里葉級(jí)數(shù)展開式中,如果被展開的函數(shù)是實(shí)偶函數(shù),則其傅里葉級(jí)數(shù)中只包含余弦項(xiàng),再將其離散化可導(dǎo)出余弦變換,因此稱之為離散余弦變換。DCT被認(rèn)為是性能接近K-L變換的準(zhǔn)最佳變換,是對(duì)語(yǔ)音和圖像信號(hào)進(jìn)行變換的最佳方法。DCT變換的快速算法有以下兩種方式:
(1)由于 FFT算法的普遍采用,直接利用 FFT實(shí)現(xiàn)DCT變換的快速算法相對(duì)容易。但是這種方法也有不足之處,即計(jì)算過程會(huì)涉及復(fù)數(shù)的運(yùn)算。由于DCT變換前后的數(shù)據(jù)都是實(shí)數(shù),計(jì)算過程中引入了復(fù)數(shù),而一對(duì)復(fù)數(shù)的加法相當(dāng)于兩對(duì)實(shí)數(shù)的加法,一對(duì)復(fù)數(shù)的乘法相當(dāng)于4對(duì)實(shí)數(shù)的乘法和兩對(duì)實(shí)數(shù)的加法,顯然是增加了運(yùn)算量,也給硬件存儲(chǔ)提出了更高的要求。
(2)直接在實(shí)數(shù)域進(jìn)行DCT快速變換。顯然,這種方法的計(jì)算量和硬件要求都要優(yōu)于前者。鑒于此,本文采用第二種方法實(shí)現(xiàn)DCT變換的快速算法。
給定序列 x(n),n=0,1,…,N-1,其離散余弦變換定義為:
DCT程序設(shè)計(jì)流程圖如圖4所示。
圖4 DCT流程設(shè)計(jì)流程圖
程序先將一序列 x(n)作為輸入信號(hào)進(jìn)行離散余弦的正變換,再將得到的結(jié)果進(jìn)行離散余弦逆變換,從而還原出輸入序列x(n)。程序?qū)崿F(xiàn)的是128點(diǎn)的DCT變換。程序設(shè)計(jì)中,px是正變換的輸入序列,pz是逆變換的輸出序列。x、y和z是 3個(gè)中間變量,在正變換的子程序中,x是輸入序列,y是輸出序列;在逆變換的子程序中,y是輸入序列,z是輸出序列。程序設(shè)計(jì)如下:
設(shè)置觀察窗口,可以看到DCT變換的輸入輸出信號(hào),如圖5和圖6所示。
圖5為正變換結(jié)果,其中上方為輸入信號(hào),下方為輸出信號(hào)。圖6為逆變換輸出結(jié)果,此輸出波形與圖5的輸入波形一致,由此可以驗(yàn)證程序的正確性。
本文說(shuō)明了數(shù)據(jù)采集ADC的功能和FFT算法的原理以及程序設(shè)計(jì)流程圖,在CCS調(diào)試平臺(tái)下,采用C語(yǔ)言編程實(shí)現(xiàn)了FFT算法,并且實(shí)時(shí)性好。闡述了離散余弦變換DCT基本原理,基于TMS320F2812 DSP實(shí)現(xiàn)了離散余弦變換。程序運(yùn)行結(jié)果表明,DSP能夠快速高效地完成一系列數(shù)字信號(hào)處理算法[4]。
[1]賈瑋,楊錄,張艷花.基于 TMS320VC5416的 FFT算法的實(shí)現(xiàn)[J].山西電子技術(shù),2009(2):11-13.
[2]萬(wàn)浩平,馬進(jìn),王鋒.基于 TMS320F2812的高精度數(shù)據(jù)采集及 FFT 實(shí) 現(xiàn)[J].工業(yè)控 制 計(jì) 算 機(jī) ,2009,22(4),54-55.
[3]胡廣書.數(shù)字信號(hào)處理 [M].北京:清華大學(xué)出版社,2003.
[4]伍小芹,吳秋麗.FIR數(shù)字濾波器在DSP上的實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2007(1):85-87.