艾 红,邓大伟
(北京信息科技大学 自动化学院,北京 100192)
傅里叶变换是一种将信号从时域变换到频域的变换方式,而快速傅里叶变换 FFT(Fast Fourier Transform)是数字信号处理技术的基石。FFT和离散余弦变换DCT(Discrete Cosine Transform)都是数字信号处理技术中的基本算法,也是数字信号处理的基本工具。DSP芯片的出现使FFT和DCT的实现更为方便。本文利用TMS320F2812DSP内部的ADC模块与事件管理器(EVA)构建了数据采集与数据变换并行处理的信号处理系统,充分利用TMS320F2812强大的数据处理能力,实现了FFT运算,提高了运算速度[1-2]。
TI公司的TMS320F2812 DSP是目前控制领域性能较高的处理器,它将各种高级数字控制功能集成于一块芯片上,整合了Flash存储器、快速的A/D转换器等外设,强大的数据处理和控制能力大幅度提高了应用效率。
DSP系统的模拟输入电压范围为0~3 V。通过使用事件管理器的定时器1下溢中断启动ADC。系统设计时晶振为30 MHz,经过锁相环倍频后CPU时钟频率SYSCLKOUT是150 MHz,事件管理器采用高速外设时钟HSPCLK,经过程序设计6分频得到高速外设时钟HSPCLK 为 25 MHz。
SysCtrlRegs.HISPCP.all=0x3;//HSPCLK=SYSCLKOUT/6
将事件管理器中通用定时器1的周期寄存器值设置为 0x07FF,每经过 2 048(0x07FF+1)个通用定时器的时钟周期启动一次ADC。事件管理器中的通用定时器1由于没有对高速外设时钟分频,因此通用定时器1的时钟频率为 25 MHz。
为了实现数据采集,设置ADC工作在级联排序器模式,最大转换通道数为1,并且采集数据来自通道ADCINA4,使能事件管理器EVA的触发信号启动ADC排序器SEQ1,允许ADC产生中断。相关程序设计如下。
当事件管理器的通用定时器1产生下溢中断时,启动ADC。在ADC转换完成中断服务程序中读取12 bit A/D转换结果。程序设计如下:
FFT是DFT的快速运算。由于有些信号在时域很难看出特性,使用FFT将其变换到频域,就会很容易看出其特性。DFT算法的基本公式为:
其中,x(n)表示时域信号,X(k)表示频域信号,WknN为运算蝶式权。
FFT算法程序的基本流程如图1所示。
首先需要对时域序列进行比特排序,即接收处理单元把放在数据空间中的每个采样点按地址读出,按比特逆序再放入数据空间,准备进行运算[3]。然后计算蝶式运算的重要元素:运算蝶式权WknN。 此处可充分利用WknN的周期性,减少运算量,节省 DSP的存储空间。以8点FFT为例,因为有则计算8点FFT所有的运算蝶式权,只需将第三级即最后一级的运算蝶式权算出即可。所以对于N(N=2M)点 FFT来说,只需计算出第 M级的 M个运算蝶式权即可得到各级的运算蝶式权。所有的FFT运算,第一级权值为1,所以第一级权值不用计算,仅此一项就可大大减少运算量。WknN可以分为实部和虚部两部分进行计算,即:WknN=cos(2πK/N)-jsin(2πK/N)。 在 FFT 中,每级的蝶式运算都具有不同数量的蝶群和不同的翅间距(第M级的翅间距为2M-1),这些都需要定义相应的变量来控制。
调整模拟信号的频率和幅值,通过A/D采集可以看到输入信号波形及其FFT算法程序执行结果,如图2和图3所示。
DCT是一种与傅里叶变换紧密相关的数学运算。在傅里叶级数展开式中,如果被展开的函数是实偶函数,则其傅里叶级数中只包含余弦项,再将其离散化可导出余弦变换,因此称之为离散余弦变换。DCT被认为是性能接近K-L变换的准最佳变换,是对语音和图像信号进行变换的最佳方法。DCT变换的快速算法有以下两种方式:
(1)由于 FFT算法的普遍采用,直接利用 FFT实现DCT变换的快速算法相对容易。但是这种方法也有不足之处,即计算过程会涉及复数的运算。由于DCT变换前后的数据都是实数,计算过程中引入了复数,而一对复数的加法相当于两对实数的加法,一对复数的乘法相当于4对实数的乘法和两对实数的加法,显然是增加了运算量,也给硬件存储提出了更高的要求。
(2)直接在实数域进行DCT快速变换。显然,这种方法的计算量和硬件要求都要优于前者。鉴于此,本文采用第二种方法实现DCT变换的快速算法。
给定序列 x(n),n=0,1,…,N-1,其离散余弦变换定义为:
DCT程序设计流程图如图4所示。
图4 DCT流程设计流程图
程序先将一序列 x(n)作为输入信号进行离散余弦的正变换,再将得到的结果进行离散余弦逆变换,从而还原出输入序列x(n)。程序实现的是128点的DCT变换。程序设计中,px是正变换的输入序列,pz是逆变换的输出序列。x、y和z是 3个中间变量,在正变换的子程序中,x是输入序列,y是输出序列;在逆变换的子程序中,y是输入序列,z是输出序列。程序设计如下:
设置观察窗口,可以看到DCT变换的输入输出信号,如图5和图6所示。
图5为正变换结果,其中上方为输入信号,下方为输出信号。图6为逆变换输出结果,此输出波形与图5的输入波形一致,由此可以验证程序的正确性。
本文说明了数据采集ADC的功能和FFT算法的原理以及程序设计流程图,在CCS调试平台下,采用C语言编程实现了FFT算法,并且实时性好。阐述了离散余弦变换DCT基本原理,基于TMS320F2812 DSP实现了离散余弦变换。程序运行结果表明,DSP能够快速高效地完成一系列数字信号处理算法[4]。
[1]贾玮,杨录,张艳花.基于 TMS320VC5416的 FFT算法的实现[J].山西电子技术,2009(2):11-13.
[2]万浩平,马进,王锋.基于 TMS320F2812的高精度数据采集及 FFT 实 现[J].工业控 制 计 算 机 ,2009,22(4),54-55.
[3]胡广书.数字信号处理 [M].北京:清华大学出版社,2003.
[4]伍小芹,吴秋丽.FIR数字滤波器在DSP上的实现[J].现代电子技术,2007(1):85-87.