欢迎来到天天文库
浏览记录
ID:40518585
大小:310.00 KB
页数:10页
时间:2019-08-04
《2048点FFT在定点DSP上的实现》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、2048点FFT在定点DSP上的实现摘要:针对线阵CCD输出数据的处理需要,介绍了2048点Frr在TMS320C240x定点DSP上的实现。FPT算法程序采J”汇编语言鳊写.可通过C语言函数调用,因此具有实现简单、高效的特点,且扩展性和兼容性强,可运行于嵌入式线阵CCD光谱探测系统中。关键词:FFT;DSP;劈分算法;位反转算法中图分类号:TP391文献标识码:A引言傅立叶变换是一种将信号从时域转变为频域表示的变换手段,它在信号的频谱分析以及系统的分析、设计中得到了广泛的应用。在计算机系统中,实际上是以离散傅立叶变换(DfTr)的方式处
2、理数据。由于DFr的运算量比较大.实际应用中常使用DFr的快速算法一快速傅立叶变换(F兀’)。快速傅立叶变换算法有基2算法、基4算法等,还有按时间抽取(DIT)和按频率抽取(DIF)的算法。目前,由于线阵CCD在光谱探测、光学传感等方面的广泛应用,常需要嵌入式芯片(如DSP)对CCD输出的数据进行实时分析处理。用于工业探测的线阵CCD与我们通常认识的面阵CCD有所不同。我们日常生活中出现的面阵CCD少说也有几十万像素,高的可达上千万像素,常用在数码相机等设备上。相比较而言,用于工业探测的线阵CCD像素不高,但在光谱响应范围、几何精度、动态
3、范围有自己独特的优势。比如我们所用的TCD1208CCD就是一款面向光谱探测用的线阵CCD,有2160像元,光谱响应范围4oo纳米一1100纳米,并且动态范围大,灵敏度高,稳定可靠。整个嵌入式线阵CCD光谱探测系的结构框图如图1所示。在DSP上要完成CCD驱动、A/D转换、FFT运算、控制液晶显示等功能,其中FFT运算是重点。考虑到CCD是2160像元,为了方便运用基2算法计算FFT,又不损失太多的像元,我们往在DSP上计算2048点FFT。由于TI公司提供的FFT程序只能计算5l2点FFT,因此,就需要我们编写能够寓脱2048点FFT的
4、程序。以FFT在嵌入式线阵CCD光潜探测系统中的应用为例,重点介绍2048点实数基2DIT-FFT在TMS320LF2407定点DSP中的实现。此程序也可实现1024点复数FFT。由于FMS320C240x系列DSP的硬件内核与汇编指令完全相同,此程序可以直接移植到所有TMS320C240xDSP上。根据此程序,可以方便地扩展至4096点FFT,用于5000像元CCD的数据处理。1程序介绍与实现1.1程序流程FFT的计算量比傅立叶变换的计算量减少了,但是FFT要做到大点数,实时运算,对于普通的单片机来说还是一件比较困难的事。一方面,FFT
5、需要对原始自然序列进行码位倒序排列;另一方面,蝶形运算是复数运算,需要多次查表相乘运算才能实观。DSP控制器就是针对这些需求而设计的专用芯片:具有专为FFT算法而设计的反序间接寻址;可实现增/减l或增/减一个变址量的间接寻址方式,为各种查表运算提供方便:能在一个指令周期完成乘和累加操作,提高了乘法运算的速度。TMS320LF2407定点DSP是一款专为工业控制、电机控制和数字信号处理等用途而设计的DSP,具备单周期乘加指令,具有FFT反序间接寻址功能,最高运行速度为40MIPS。为了充分利用DSP芯片特有的反序间接寻址等功能,FFT算法程
6、序采用汇编语言编写,主程序采用C语言,因此程序具有良好的接口性能和可扩展性能。一般计算N点实数FFT时,简单的把N点实数数据当作N点虚部为0的复数数据来处理,直接计算N点复数FFT。这样不仅浪费了DSP片内资源,还影响了计算的实时性,尤其是点数比较大时,这种影响更加明显。为了提高实数FFT的计算效率,利用FFT计算的特点,把N点实数数据打包成N/2点复数数据,通过计算N/2点复数FFT来获得N点实数FFT,这样可以把FFT的计算速度提高近一倍。实数FFT的计算流程为:1把2048点实数数据打包成为1024点复数数据,并完成复数数据的位反转
7、操作;2计算1024点基2复数FFT:3劈分还原计算,获得2048点实数FFTr结果;4计算幅值的平方,获得频谱的幅度谱。根据实际需要,还可以对数据进行加窗函数处理。1.2具体函数介绍根据上面的程序流程,介绍具体的函数模块。考虑到程序的效率和代码的精简,F丌算法函数全部采用汇编语言编写,但是在各子程序的入口和出口都考虑了与C语言的兼容性,使得各子程序能够直接被C语言调用。1汇编模块fft_brev.asm,此模块的功能是把2048点实数数据打包成为1024点复数数据,并把复数数据进行倒位序排列。在C函数中,通过FFT_brev0来调用。具
8、体声明形式为:voidFFT-brev(int*source,int*done,intsize),其中指针source指向的数组存放未经倒位序排列的数据。指针done指向的数组存放倒位序排列后
此文档下载收益归作者所有