2048点FFT在TMS320C240x定点DSP上的实现
- 格式:doc
- 大小:98.00 KB
- 文档页数:6
********************************************************************* ************************************FileName:dsp_asm.h********************************************************************* *************************************/#ifndef __DSP_ASM_H__#define __DSP_ASM_H__********************************************************************* ************************************* FUNCTION PROTOTYPES********************************************************************* *************************************/void dsp_asm_test(void);void dsp_asm_init(void);#endif /* En d of module include. *//*8888888888888888888888888888888888888888888888888888888888888888*/ /*8888888888888888888888888888888888888888888888888888888888888888*/ /** FileName:dsp_asm.c* Author:Bobby.Chen* Email:heroxx@* Date:2010-08-11* Description:This file showes how to use the dsp library in mdk proj ect.* 使用三角函数生成采样点,供FFT计算* 进行FFT测试时,按下面顺序调用函数即可:* dsp_asm_init();* dsp_asm_test();*/#include "stm32f10x.h"#include "dsp_asm.h"#include "stm32_dsp.h"#include "table_fft.h"#include <stdio.h>#include <math.h>********************************************************************* ************************************* LOCAL CONSTANTS********************************************************************* *************************************/#define PI2 6.28318530717959// Comment the lines that you don't want to use.// 要模拟FFT,请注释掉其他的预定义// 此处也可以全部注释掉,在MDK的工程属性->"C/C++"->"Preprocessor Sym bols"-"Define:"中添加NPT_XXX项目// 但是这样做法的缺点是每次修改XXX数据,都会导致MDK下次编译时会编译全部文件,速度太慢。
南京航空航天大学研究生DSP综合实验实验报告(2014级)题目: 2048点FFT变换的DSP实现学生:蔡静学号: SX14011112015年6月一、实验目的:1、加深对DFT算法原理和基本性质的理解;2、熟悉FFT算法的原理和FFT子程序的算法流程和应用;3、学习用FFT对连续信号和时域信号进行频谱分析的方法;4、学习DSP中FFT的设计和编程思想;5、学习修改FFT程序使之能够进行2048点的FFT运算;二、实验内容:基于时间抽取的8~1024点FFT的程序及输入、输出说明,然后调试出该程序,并对输入方波信号进行FFT变换,检验输出信号是否是一sinc波形。
同时更改程序,使其能进行2048点FFT运算。
三、实验设计原理:1.离散傅里叶变换DFT:对于长度为N的有限长序列x(n),它的离散傅里叶变换(DFT)为在x(n)为复数序列的情况下,对于某个K值,直接按(1)式计算x(k)只需N次复数乘法和(N-1)次复数加法。
因此对所有N歌K值,共需要N*N次复数乘法和N(N-1)次复数加法。
对于一些相当大的点数来说(N=1024),直接计算它的NFT所需的计算量是很大的,因此DFT的运算应用受到很大的限制。
2.快速傅里叶变换旋转因子有如下特性,对称性:周期性:FFT算法就是利用旋转因子的周期性和对称性来减少运算量的。
FFT算法就是将长序列的DFT分解为短的DFT。
由此我们可以看到,一个点DFT已分解成两个N/2点的DFT,这两个N/2点的DFT再按照式(17-2)组合成一个N点DFT。
由于X 1 (k)和X 2(k)只有N/2个点,即k=0,1,2,3```,N/2-1,因此利用周期性可以进行进一步减少运算量。
假定序列x(n)的点数N是2的幂次,按照FFT算法可将其分为偶序列和奇序列。
偶序列:x(2r)=x1(r)奇序列:x(2r+1)=x2(r)其中:r=0,1,2,3,4.......,N/2-1则x(n)的DFT表示为由于对称性。
在DSP运算中,经常需要把输入时域信号在频域进行处理之后,再还原为时域信号,这样就需要进行FFT 和IFFT运算:x(n) -> FFT -> X(f) -> 频域处理-> Y(f) -> IFFT -> y(n)而一般的DSP芯片只支持整数运算,也就是说只能进行定点小数计算。
N点FFT计算出0… N-1,N个复数:0,A,N/2,A*,A为(N/2-1)个复数,A*为A的共轭复数。
FFT的公式为:NX(k) = sum x(n)*exp(-j*2*pi*(k-1)*(n-1)/N)、1 < = k < = N.n = 1IFFT的公式为:Nx(n) = (1/N) sum X(k)*exp( j*2*pi*(k-1)*(n-1)/N)、1 < = n < = N.k = 1假设我们对ADC转换器转换的数字信号进行FFT运算,若输入数据为16bit的短整型数,我们可以把它看作Q15的从-1到1之间的小数。
根据FFT的公式我们可以知道,FFT变换之后的结果将超出这个范围。
例如在matlab中输入fft(sin([1:8]*0.5)),可以看到结果:2.8597,-0.8019 -3.0216i,0.4312 - 0.8301i,0.5638 - 0.3251i,0.5895,0.5638 + 0.3251i,0.4312 + 0.8301i,-0.8019 + 3.0216i实际上,FFT变换之后的数据的范围在-N到N之间,N为FFT的点数。
为了正确地表达-N到N之间的数值,输出数据的Q值将变小,例如若N=1024,输入数据为Q15的话,那么输出数据则必须为Q5才能够确保结果不会溢出。
这样的结果将丢失很多信息,以至于IFFT无法还原为原来的数据。
如下图所示:Q15 -> 1024FFT -> Q5 -> 1024IFFT -> Q5这样,经过FFT和IFFT变换之后,数据从Q15变成了Q5,丢失了10bit的信息。
二维FF T在TMS320系列DSP中的实现董 晖,姜秋喜,毕大平(电子工程学院,安徽合肥230037)摘 要:分析了二维FF T的快速算法,提出了在TMS320C6701评估板上的高速实现方法,通过实验验证了该方法,并讨论了在多片DSP上的并行实现方法。
关键词:信号处理;二维FF T;DSP;直接存储器访问(DMA);并行实现中图分类号:TN91117 文献标识码:A 文章编号:100920401(2002)0120034205Implementation of Two2dimensional FF T in TMS320DSPDON G Hui,J IAN G Qiu2xi,B I Da2ping(Elect ronic Engi neeri ng Instit ute,Heif ei230037,Chi na)Abstract:The algorithm of two2dimensional FF T is analyzed in this paper.The fast realization by TMS320DSP is given and the results are proved by experiments.The parallel realization by mul2 tiple DSP is given.K ey w ords:signal processing;two2dimensional FF T;DSP;Direct Memory Access(DMA);paral2 lel realization1 引 言二维FF T在图像处理场合有着广泛的应用,可以利用它来快速实现图像相关和卷积。
二维FF T在信号处理的其它领域也得到了越来越多的应用,例如在对周期平稳信号的处理中,可以通过对自相关函数作二维FF T来求得周期谱密度函数从而进行特征提取。
但是二维FF T运算量大,使用通用的微处理器实现二维FF T难以满足信号实时处理的要求,而DSP适合大数据量运算,将二维FF T和DSP相结合使得二维FF T具有很强的可实现性。
第26卷第5期2005年 10月河南科技大学学报(自然科学版)Journal of Henan University of Science and T echnology (Natural Science )V ol.26N o.5Oct.2005基金项目:河南省重大科技攻关资助项目(991140313)作者简介:王笑一(1976-),男,河南洛阳人,助教,硕士生;张洛平(1955-),男,河南三门峡人,副教授,主要研究方向为网络化数字控制技术.收稿日期:2005-02-06文章编号:1672-6871(2005)05-0049-03C240X 系列DSP 定点数学函数库的应用王笑一1,李军旺2,张洛平1,祁金光3(1.河南科技大学机电工程学院,河南洛阳471003;2.洛阳制冷机械厂,河南洛阳471000;3.三门峡湖滨果汁有限公司,河南三门峡472000)摘要:定点DSP 在做浮点运算时效率不高,影响了定点DSP 的应用。
TI 公司推出针对C24X 系列DSP 的qmath 数学函数库,用定点算法优化实现了常用的一些数学函数。
本文介绍了该数学函数库的使用方法和要注意的问题,并在相同硬件条件下进行了执行定点函数和浮点函数的对比实验,结果表明合理使用定点数学函数可以显著提升C 语言DSP 程序的执行效率,对定点DSP 应用系统的高级语言开发有很大帮助。
关键词:数字信号处理;定点;浮点;数学函数库中图分类号:TP368.1文献标识码:A0 前言TI 公司C24X 系列的定点DSP 如T MS320LF2407A 等[1],在工业控制领域的应用越来越广。
在开发基于DSP 的嵌入式应用系统时,为了提高软件的可读写、可维护性,同时也为了加快开发进度,很多工程技术人员希望使用高级语言如C 语言来进行开发[2]。
但是由于定点DSP 本身不能进行浮点运算,再加上目前C 编译器的优化功能还不尽完善[3],用C 语言编写的浮点运算程序在定点DSP 上的执行效率远远低于人们的预期。
实验报告一、实验目的学习和掌握FFT 的定点DSP 实现原理及C28X 编程的技巧,并通过CCS 的图形显示工具,观察输入/输出信号波形以及它们的频谱变化。
二、实验要求在CCS 环境中用汇编语言,编写实现FFT 的程序及连接器命令文件,编译调试程序,并通过CCS 的图形显示工具观察输入/输出信号波形以及频谱变化。
三、实验原理(1) 位反转在DIF-FFT 蝶形运算结构中,输出X(k)按正常顺序存放在存储单元中,即按X(0)、X(1)、X(2)、…X(6)、X(7)的顺序排列,输入x(n)是按x(0)、x(4)、x(2) …x(3)、x(7)的顺序进行寻址。
反转实现用“*BR0++”寻址方式即可。
(2) 蝶形运算如果蝶形运算的两个输入相距B 个点,应用原位运算,则P N L L L W B J X J X J X )()()(11++⇐-- P N L L L W B J X J X B J X )()()(11+-⇐+--式中,第L 级的旋转因子指数LM J p -•=2,12...2,1,01-=-L J ,L=1,2, …, M=log 2N, B=12-L(3) 基2DIT-FFT 运算流图(3)算法流程图四、实验环境软件环境:CCS3.1硬件环境:无五、实验过程、数据记录、处理及结论1、实验步骤本实验需要使用C28X汇编语言来实现FFT,并通过CCS的图形显示工具观察输入\输出信号波形以频谱的变化。
实验步骤如下:(1) 启动CCS,通过project创建工程文件。
(2) 编写CMD文件和汇编源程序。
(3) 编译、连接、单步执行,检查程序的语法错误,检查程序逻辑错误。
(4) 完成编译、连接。
然后选择File/Load Program命令将OUT文件装入。
点RUN启动程序运行。
(5) 借助view/Graph 设置观察波形,并记录。
2、波形记录输入单频正弦波,起始地址FirstIn 。
波形图一所示,他的频谱如图二所示图一图二输出单频正弦波频谱,起始地址V AR_FIRST,波形如图三所示图三3、实验结论输入单频正弦波结果输出脉冲波形很好的验证了FFT程序的逻辑和代码编程的正确性。
DSP芯片,也称数字信号处理器,是一种特殊结构的微处理器。
DSP芯片内部采用程序和数据分开的哈佛结构,具有专门的硬件乘法器,广泛采用流水线操作,提供特殊的DSP指令,可以用来快速实现各种数字信号处理算法。
因此,DSP在计算密集的实时控制领域得到了日益广泛的应用。
TMS320F240是目前应用比较广泛的一款定点DSP,它具有20MIPS的指令执行速度,强大的内部事件管理器、I/O端口和其他外围设备。
其中,串行外设接口(SPI)是一个高速同步串行输入/输出(I/O)端口,它允许一个具有可编程长度(1到8位)的串行位流,以可编程的位传送速率从设备移入或移出。
SPI通常用于DSP控制器和外部设备或其它控制器间的通讯。
典型的应用包括通过EEPROM、移位寄存器、显示驱动器和模数转换器(ADC)等设备进行外设扩展。
对于某一控制任务需要多个DSP协同完成时,DSP之间的数据交换将会很频繁,此时,我们就可以通过SPI口进行DSP之间的高速数据交换,实现相互间的功能扩展。
这种模式的DSP之间的通讯,较通过串行通讯接口(SCI)进行通讯时,速率提高近一倍,而且它还可以通过控制寄存器的TALK位实现多个DSP之间的数据交换。
当系统需要预先从EEPROM读出定值时,也可以通过TMS320F240的SPI口进行外设扩展。
2DSP之间的扩展在多个DSP构成的串行通讯网络中,DSP分为主模式DSP和从模式DSP。
主模式DSP的数据在SPISIMO引脚上输出并从SPISOMI上锁存,从模式DSP 的数据在SPISOMI引脚上输出并从SPISIMO上锁存。
主模式SPI为整个网络提供串行时钟SPICLK,并通过写入SPIDAT寄存器的数据启动SPICLK信号从而启动数据传送,当预先设定的1到8位串行位流传送完毕后,SPICLK信号中止,传送结束。
对于从控制器和主控制器,数据在SPICLK的一个沿从移位寄存器移出,在负跳沿锁存到移位寄存器。
通信与信息工程学院2013 /2014 学年第二学期软件设计实验报告模块名称调用DSP库函数实现FFT的运算专业通信工程学生班级B110107学生学号学生姓名指导教师王奇报告内容一、实验目的(1)了解FFT 的原理;(2)了解在DSP 中FFT 的设计及编程方法;(3)了解在DSP 中CFFT 的设计及编程方法;(4)熟悉对FFT 的调试方法;(5)了解用窗函数法设计FFT 快速傅里叶的原理和方法;(6)熟悉FFT 快速傅里叶特性;(7)了解各种窗函数对快速傅里叶特性的影响。
二、实验原理1,,1,0,][][10-==∑-=N m W k x m X km NN k 1,,1,0,][1][10-==--=∑N k W m X N k x km N N m如果利用上式直接计算DFT,对于每一个固定的m,需要计算N 次复数乘法,N-1次加法,对于N 个不同的m,共需计算N 的2次方复数乘法,N*(N-1)次复数加法.显然,随着N 的增加,运算量将急剧增加, 快速傅里叶算法有效提高计算速度,利用FFT 算法只需(N/2)logN 次运算。
FFT 并不是一种新的变换,它是离散傅立叶变换(DFT )的一种快速算法。
由于我们在计算DFT 时一次复数乘法需用四次实数乘法和二次实数加法;一次复数加法则需二次实数加法。
每运算一个X (k )需要4N 次复数乘法及2N+2(N-1)=2(2N-1)次实数加法。
所以整个DFT 运算总共需要4N^2 次实数乘法和N*2(2N-1)=2N(2N-1)次实数加法。
如此一来,计算时乘法次数和加法次数都是和N^2 成正比的,当N 很大时,运算量是可观的,因而需要改进对DFT 的算法减少运算速度。
根据傅立叶变换的对称性和周期性,我们可以将DFT 运算中有些项合并。
我们先设序列长度为N=2^L,L 为整数。
将N=2^L 的序列x(n)(n=0,1,……,N-1),按N 的奇偶分成两组,也就是说我们将一个N 点的DFT 分解成两个N/2 点的DFT,一般来说,输入被假定为连续的。
FFT在TMS320C54x定点DSP中的高效实现方法
朱正平
【期刊名称】《信息技术》
【年(卷),期】2002(000)008
【摘要】介绍了实FFT的快速高效的原理及实现方法,适用于所有基于
TMS320C54x定点DSP的实FFT的运算.
【总页数】3页(P80-82)
【作者】朱正平
【作者单位】江汉石油学院电子与信息工程系,荆州,434102
【正文语种】中文
【中图分类】TP391
【相关文献】
1.关于TMS320C54X定点DSP高效编程问题的探讨 [J], 王工艺;司锡才
2.基于TMS320C54X DSK平台的 Zoom-FFT的快速实现 [J], 夏秀渝
3.2048点FFT在定点DSP上的实现 [J], 文其林;白晓东;周洪直;贾宝敦
4.TMS320C54X系列DSP上FFT运算的实现 [J], 邱立存;闻武;刘海英
5.TMS320C54X系列DSP上FFT运算的实现 [J], 邱立存;闻武;刘海英
因版权原因,仅展示原文概要,查看原文内容请购买。
FFT的DSP实现简介:快速傅里叶变换是一种高效实现离散傅里叶变换的的快速算法,是数字信号处理中最为重要的工具之一,它在声学、语音、电信和信号处理等领域有着广泛的应用。
一.设计目的:1.加深对DFT算法原理和基本性质的理解;2。
熟悉FFT的算法原理和FFT子程序的算法流程和应用;3.学习用FFT对连续信号和时域信号进行频谱分析的方法;4.学习DSP中FFT的设计和编程思想;5.学习使用CCS的波形观察窗口观察信号波形和频谱情况.二.设计内容:用DSP汇编语言及C语言进行编程,实现FFT运算,对输入信号进行频谱分析。
三.设计原理:1.离散傅里叶变换DFT:对于长度为N的有限长序列x(n),它的离散傅里叶变换(DFT)为1X(k)= ∑∞=0*) (nWnx N—nk ,k=0,1,2……N-1 (1)式中,W N=e-j*2π/N,称为旋转因子或蝶形因子.从DFT的定义可以看出,在x(n)为复数序列的情况下,对某个k值,直接按(1)式计算X(k) 只需要N次复数乘法和(N—1)次复数加法。
因此,对所有N个k值,共需要N2次复数乘法和N(N-1)次复数加法。
对于一些相当大有N值(如1024点)来说,直接计算它的DFT所需要的计算量是很大的,因此DFT运算的应用受到了很大的限制.2.快速傅里叶变换FFT旋转因子W N有如下的特性.对称性: W N k+N/2=—W N k周期性:W N n(N—k)=W N k(N-n)=W N—nk利用这些特性,既可以使DFT中有些项合并,减少了乘法积项,又可以将长序列的DFT分解成几个短序列的DFT。
FFT就是利用了旋转因子的对称性和周期性来减少运算量的.FFT的算法是将长序列的DFT分解成短序列的DFT.例如:N为偶数时,先将N点的DFT分解为两个N/2点的DFT,使复数乘法减少一半:再将每个N/2点的DFT分解成N/4点的DFT,使复数乘又减少一2半,继续进行分解可以大大减少计算量。
TMS320F28335调⽤DSP函数库实现复数的FFT的⽅法在数字信号处理中,FFT变换是经常使⽤到的,在DSP中⾃⼰编写的FFT变换函数通常会存在计算效率太慢的问题,有时需要调⽤DSP函数库⾃带的变换函数。
但是,DSP在对FFT运算效率优化的同时,对于函数的调⽤⽅式也就有了⽐较多的要求,下⾯结合⾃⼰的调试经验做⼀下简单的介绍。
1、准备⼯作DSP的数字信号处理的⼀系列函数都在C28x_FPU_Lib.lib库中,因此,⾸先需要在CCS的⼯程⽂件中连接此库:在⼯程设置中C2000 Linker——file search path中添加该库和路径。
并在主程序中包含下⾯头⽂件:#include"FPU.h"。
2、结构体介绍FFT函数的输⼊为⼀个结构体,该结构体的定义⽅式如下:typedef struct{ float32 *InPtr;float32 *OutPtr;float32 *CoefPtr;float32 *CurrentInPtr;float32 *CurrentOutPtr;Uint16 Stages;Uint16 FFTSize;} CFFT_F32_STRUCT;其中InPtr为输⼊数组指针,假设你的CFFT的采样点1024个点,那么你的输⼊数组为inputdata[2*FFTSize],长度为2048是因为输⼊数据为复数,实部和虚部需要分开进⾏存储的,所以输⼊数组的长度为2*FFTSize.其中实部和虚部的存储⽅式为inputdata[0]存储你第⼀点的实部,inputdata[1]存储第⼀点的虚部,接着依次向下inputdata[2]存储第⼆个点的实部,inputdata[3]第⼆个点的虚部。
OutPtr为指向输出数组的指针,输出数组的⼤⼩也为2*FFTSize,存储⽅式同样的outputdata[0]。
CoefPtr,为指向转化因⼦数组的指针,长度为FFTSize,决定傅⾥叶转化因⼦的只有傅⾥叶变换的阶数。
【转】dsp定点运算基本⽅法⽬录参考:⼀DSP定点算数运算1 数的定标在定点DSP芯⽚中,采⽤定点数进⾏数值运算,其操作数⼀般采⽤整型数来表⽰。
⼀个整型数的最⼤表⽰范围取决于DSP芯⽚所给定的字长,⼀般为16位或24位。
显然,字长越长,所能表⽰的数的范围越⼤,精度也越⾼。
如⽆特别说明,本书均以16位字长为例。
DSP芯⽚的数以2的补码形式表⽰。
每个16位数⽤⼀个符号位来表⽰数的正负,0表⽰数值为正,l则表⽰数值为负。
其余15位表⽰数值的⼤⼩。
因此,⼆进制数0010000000000011b=8195⼆进制数1111111111111100b= -4对DSP芯⽚⽽⾔,参与数值运算的数就是16位的整型数。
但在许多情况下,数学运算过程中的数不⼀定都是整数。
那么,DSP芯⽚是如何处理⼩数的呢?应该说,DSP芯⽚本⾝⽆能为⼒。
那么是不是说DSP芯⽚就不能处理各种⼩数呢?当然不是。
这其中的关键就是由程序员来确定⼀个数的⼩数点处于16位中的哪⼀位。
这就是数的定标。
通过设定⼩数点在16位数中的不同位置,就可以表⽰不同⼤⼩和不同精度的⼩数了。
数的定标有Q表⽰法和S表⽰法两种。
表1.1列出了⼀个16位数的16种Q表⽰、S表⽰及它们所能表⽰的⼗进制数值范围。
从表1.1可以看出,同样⼀个16位数,若⼩数点设定的位置不同,它所表⽰的数也就不同。
例如,16进制数2000H=8192,⽤Q0表⽰16进制数2000H=0.25,⽤Q15表⽰但对于DSP芯⽚来说,处理⽅法是完全相同的。
从表1.1还可以看出,不同的Q所表⽰的数不仅范围不同,⽽且精度也不相同。
Q越⼤,数值范围越⼩,但精度越⾼;相反,Q越⼩,数值范围越⼤,但精度就越低。
例如,Q0 的数值范围是⼀32768到+32767,其精度为1,⽽Q15的数值范围为-1到0.9999695,精度为1/32768=0.00003051。
因此,对定点数⽽⾔,数值范围与精度是⼀对⽭盾,⼀个变量要想能够表⽰⽐较⼤的数值范围,必须以牺牲精度为代价;⽽想精度提⾼,则数的表⽰范围就相应地减⼩。
大点数FFT多核DSP运行例程指南1.介绍该演示程序在多核DSP(包括C6678和C6670)实现点数非常多的单精度浮点数FFT的运算。
该软件需要将输入数据放置在设备的外部存储器。
它将输入数据分配到不同的DSP内核。
不同的DSP内核执行计算并将输出到外部存储器上。
该软件可以配置为不同数量的内核来做实际计算并可以计算以下尺寸的FFT•16K•32K•64K•128K•256K•512K•1024K可以运行的软件环境•C6678 EVM•C6678 Functional Simulator•C6670 EVM•C6670 Functional Simulator2.要求该软件需要德州仪器最新的多核SDK 2.0(MCSDK 2.0)。
特别是它需要以下来自MCSDK 2.0的软件组件。
•CCS 5•DSP/BIOS 6.0•IPC•EDMA LLD3.软件设计在多核DSP实现大点数FFT的目的是为了实现最大性能,通过分布计算任务到多核上,以及充分利用DSP的高性能计算能力。
基本的抽取时间方法用于将计算1-D点数非常大的FFT到计算类似于2-D FFT 计算的东西。
对于非常大的N,可以将其分为N = N1 * N2。
如果它非常大1-D输入数组被认为是2-D N1xN2阵列(N1行,N2列),则可以采取以下步骤计算1-D非常大的FFT。
1.在列方向上计算N2次N1点数的FFT2.乘以旋转因子3.在行方向存储N2次N1点数的FFT,形成N2xN1 2-D数组4.在列方向计算N1次N2点数的FFT5.以列方式存储数据,形成N2xN1 2-D阵列下面的文章描述了多核FFT实现的类似算法。
“Hitachi SR8000的高性能并行FFT算法”,高桥大辅,第四届国际会议论文集/高级展览会2000年亚太地区业绩计算发行日期:2000年5月14日至17日,页数:192 - 199卷1在实际的计算中,步骤1中N2 / NUM_Of_CORES_FOR_COMPUTE个大小为N1的FFT,步骤4中在每个核心上计算N1 / NUM_of_CORES_FOR_COMPUTE 大小为N2的FFT。
2048点FFT在TMS320C240x定点DSP上的实现Accomplishment of 2048 points FFT in TMS320C240x fixed-point DSP文其林摘要:针对线阵CCD输出数据的处理需要,介绍了2048点FFT在TMS320C240x定点DSP 上的实现。
FFT算法程序采用汇编语言编写,可通过C语言函数调用,因此具有实现简单、高效的特点,且扩展性和兼容性强,可运行于嵌入式线阵CCD光谱探测系统中。
关键词:FFT;DSP;劈分算法;位反转算法Abstract:Because of the demand of data processing in linear CCD,this paper introduces the realization of 2048 points FFT in TMS320C240x fixed-point DSP. Arithmetic program of FFT is programmed in assembly code,and it can be called by C function. So it has the features of easy realization,high efficiency,good expansibility and compatibility. It had run in the embedded system for linear CCD spectral detection successfully.Key words:FFT;DSP;splitting arithmetic;bit-reversed arithmetic引言傅立叶变换是一种将信号从时域转变为频域表示的变换手段,它在信号的频谱分析以及系统的分析、设计中得到了广泛的应用。
在计算机系统中,实际上是以离散傅立叶变换(DFT)的方式处理数据。
由于DFT的运算量比较大,实际应用中常使用DFT的快速算法-快速傅立叶变换(FFT)。
快速傅立叶变换算法有基2算法、基4算法等,还有按时间抽取(DIT)和按频率抽取(DIF)的算法。
目前,由于线阵CCD在光谱探测、光学传感等方面的广泛应用,常需要嵌入式芯片(如DSP)对CCD输出的数据进行实时分析处理。
用于工业探测的线阵CCD与我们通常认识的面阵CCD 有所不同。
我们日常生活中出现的面阵CCD少说也有几十万像素,高的可达上千万像素,常用在数码相机等设备上。
相比较而言,用于工业探测的线阵CCD像素不高,但在光谱响应范围、几何精度、动态范围有自己独特的优势。
比如我们所用的TCD1208 CCD就是一款面向光谱探测用的线阵CCD,有2160像元,光谱响应范围400纳米-1100纳米,并且动态范围大,灵敏度高,稳定可靠。
整个嵌入式线阵CCD光谱探测系统的结构框图如图1所示,在DSP上要完成CCD驱动、A/D转换、FFT运算、控制液晶显示等功能,其中FFT运算是重点。
考虑到CCD是2160像元,为了方便运用基2算法计算FFT,又不损失太多的像元,我们在DSP上计算2048点FFT。
由于TI公司提供的FFT程序只能计算512点FFT,因此,就需要我们编写能够实现2048点FFT的程序。
以FFT在嵌入式线阵CCD光谱探测系统中的应用为例,重点介绍2048点实数基2DIT-FFT在TMS320LF2407定点DSP中的实现。
此程序也可实现1024点复数FFT。
由于TMS320C240x系列DSP的硬件内核与汇编指令完全相同,此程序可以直接移植到所有TMS320C240x DSP上。
根据此程序,可以方便地扩展至4096点FFT,用于5000像元CCD的数据处理。
1 程序介绍与实现1.1程序流程FFT的计算量比傅立叶变换的计算量减少了,但是FFT要做到大点数,实时运算,对于普通的单片机来说还是一件比较困难的事。
一方面,FFT需要对原始自然序列进行码位倒序排列;另一方面,蝶形运算是复数运算,需要多次查表相乘运算才能实现。
DSP控制器就是针对这些需求而设计的专用芯片:具有专为FFT算法而设计的反序间接寻址;可实现增/减1或增/减一个变址量的间接寻址方式,为各种查表运算提供方便;能在一个指令周期完成乘和累加操作,提高了乘法运算的速度[1]。
TMS320LF2407定点DSP是一款专为工业控制、电机控制和数字信号处理等用途而设计的DSP,具备单周期乘加指令,具有FFT反序间接寻址功能,最高运行速度为40MIPS。
为了充分利用DSP芯片特有的反序间接寻址等功能,FFT算法程序采用汇编语言编写,主程序采用C语言,因此程序具有良好的接口性能和可扩展性能。
一般计算N点实数FFT时,简单的把N点实数数据当作N点虚部为0的复数数据来处理,直接计算N点复数FFT。
这样不仅浪费了DSP片内资源,还影响了计算的实时性,尤其是点数比较大时,这种影响更加明显。
为了提高实数FFT的计算效率,利用FFT计算的特点,把N 点实数数据打包成N/2点复数数据,通过计算N/2点复数FFT来获得N点实数FFT,这样可以把FFT的计算速度提高近一倍。
实数FFT的计算流程为:1 把2048点实数数据打包成为1024点复数数据,并完成复数数据的位反转操作;2 计算1024点基2复数FFT;3 劈分还原计算,获得2048点实数FFT结果;4 计算幅值的平方,获得频谱的幅度谱。
根据实际需要,还可以对数据进行加窗函数处理。
1.2具体函数介绍根据上面的程序流程,介绍具体的函数模块[4]。
考虑到程序的效率和代码的精简,FFT算法函数全部采用汇编语言编写,但是在各子程序的入口和出口都考虑了与C语言的兼容性,使得各子程序能够直接被C语言调用。
1 汇编模块fft_brev.asm,此模块的功能是把2048点实数数据打包成为1024点复数数据,并把复数数据进行倒位序排列。
在C函数中,通过FFT_brev()来调用。
具体声明形式为:voidFFT_brev(int *source,int *done,int size),其中指针source指向的数组存放未经倒位序排列的数据,指针done指向的数组存放倒位序排列后的数据,size是数组的大小,为了节省空间,指针source和done可以指向同一数组。
2 汇编模块fft1024c.asm,此模块的功能是计算1024点基2复数FFT。
输入的数据必须是Q15格式的数据。
3 汇编模块fft2048.asm,此模块的功能是劈分1024点复数FFT的结果,得到2048点实数FFT的真正结果。
4 汇编模块fft_mag.asm,此模块的功能是计算2048点实数FFT的结果的幅值平方,得到幅度谱,输出的数据格式为Q14格式。
主函数调用示例:void main(void){……fft.ipcbptr=ipcb;//FFT计算缓冲区fft.magptr=mag;//存放幅度谱fft.init1();//复制计算复数FFT所需的旋转因子fft.init2();//复制劈分复数FFT结果所需的旋转因子fft.calc(&fft);//计算复数FFTfft.split(&fft);//劈分复数FFT结果fft.mag(&fft);//计算幅度谱}几点说明:1 由于定点DSP的浮点计算能力有限,为了保证计算的有效性和实时性,对输入输出数据采取了定点处理,其中输入数据是Q15格式,输出的幅度谱是Q14格式。
2 在FFT计算的蝶形运算和劈分计算中,涉及到正弦和余弦计算。
因此需要预先制好正弦和余弦表。
3 简单改变几个参数值和扩展一下正弦和余弦表,就可以用此程序计算4096以及更大点数的实数FFT。
但需要注意扩展存储空间以及防止结果精度的降低。
1.3 抗干扰设计为防止各种干扰使得程序不能正常运行,我们从软硬件两个方面采取抗干扰措施。
从硬件方面,我们采用TI的专用电源芯片TPS7333,为DSP提供稳定电源;在集成芯片的电源与地之间放置0.01μF和0.1μF的去耦电容,并让去耦电容尽量靠近集成芯片;模拟地与数字地分开,只在一点共接等。
在软件方面,为了使程序跑飞的DSP回到正常状态,加入看门狗功能。
2实验结果及分析整个程序是在集成开发环境CC4.1下开发完成,为了方便程序运行结果的说明,用此程序去计算一组2048点正弦数据,频率为1赫兹,采样频率为128赫兹。
数据采用Q15格式。
正弦数据波形如图2所示。
一般情况下,我们只关心信号频域的幅度谱。
幅度谱|X(k)|2的计算:X(k)=Xr(k)+jXi(k),|X(k)|2=|Xr(k)|2+|Xi(k)|2,FFT计算结果的信号幅度谱|X(k)|2如图3所示。
根据快速傅立叶变换理论[3],N点FFT的结果是N个复数数据,这N个复数数据代表着原始数据的频域信息。
当原始数据是实数时,那么FFT的结果会出现复共轭对称,即X(k)=X*(N-k)。
对于信号的幅度谱|X(k)|2来说,N点实数FFT有用的信息就只有(N/2)+1个。
根据公式f=kfs/N,f是原始信号的频率,k表示峰值出现的位置,fs是采样频率,N是FFT计算的点数,从幅度谱中看出峰值出现在k=16处,那么,f=16×128/2048=1,与原始信号的实际频率一致,说明计算结果正确。
3 小结实验证明,此程序在TMS320LF2407定点DSP中运行良好,满足嵌入式线阵CCD探测系统数据处理的需要,并已经成功运行于该系统中。
同样,此程序也适用于其它以TMS320C240x 定点DSP为核心的嵌入式系统中。