积分规则 网站地图 帮助中心    
嵌入式软件 单 片 机 DSP 存储器 传感控制 光电显示
嵌入式硬件 CPLD/FPGA SOPC AD/DA 接口电路 模拟设计
I C设计 通信产品 汽车电子 电源产品 消费电子 数控系统
工业控制 军工/航天 安防产品 医疗电子 计算机外设 测试测量
供应 I C
求购 公司库

  IC 求购 销售 公司 论文 DATASHEET 参考设计 论坛
当前位置: 电子技术 >> DSP >> 应用论文
  相关分类: 应用论文 | TI DSP | 新产品 | 算法 | 下载 | DSP代码示例 | ADI DSP | freescale DSP |
一种基于CCS与DSPs串口实现FFT的方法
 
作者:未知   来源:本站原创    点击数:65   更新时间:2008-7-18
您可以添加到网摘 让更多人关注此文章:

    摘要:FFT是对实时采集的动态数据进行频域分析、处理的基本算法,本文针对dsp系统特点设计了一种高效的FFT的实现方法,以完成对动态信号的实时分析、处理。使用串口将dsp评估板与PC机相连,利用CCS作为开发平台来进行调试,分析了调试过程中遇到的问题给出了解决的方法,并利用MATLAB验证了该方法的正确性与可行性。
关键词:动态信号分析;数字信号处理器;代码调试器;快速傅立叶变换;串口

1. 引言

动态信号分析是现代机械系统、控制系统、电力系统等多领域的一种快速测试分析方法,它在设定的时间范围内,对被测信号采样、变换、数据处理,通过实时获取系统的动态参数,并利用dsp对参数进行实时处理,然后将处理结果以波形等形式显示出来,从而可以直观的反映系统的运行状态,方便故障的诊断处理。

针对上述的应用,设计了一种A/D+FPGA+dsps的系统方案。在该方案中,A/D实现高速数据采集,FPGA实现对采集数据的缓冲、传输控制以及数据的预处理,dsps实现对高速数据的处理,包括:谐波分析,相位分析等。而这些处理大多都是在频域进行的,需要把时域数据转换成频域数据,而FFT算法正是实现这一变换的快速算法。

TMS320C6416是高性能的32-位定点dsp,主频可达1GHz,处理性能高达8000MIPS,它采用多级流水结构,可以满足对实时数据的高速处理的要求 。本文使用UART接口实现TMS320C6416与PC的相连,通过PC机输入dsps实时数据,dsps对数据进行处理后再通过串口传送到PC机,实现dsp算法的调试。

 

2.FFT的原理及其在dsps上的实现

傅立叶变换是一种将时域信号转变为频域信号的变换形式,是数字信号处理中对信号进行分析时经常采用的一种方法。但是如果采用常规的傅立叶变换,则该算法的运算量会特别大,不适于需要高速运行的嵌入式控制系统中采用,而通常方法是采用快速傅立叶变换( FFT) ,实现FFT 通常有两种方法:第一,按时间抽取(DIT) 的FFT 算法;第二,按频率抽取(DIF) 的FFT 算法。

 

2. 1  FFT 的原理[2]

对N 点序列x ( n) ,其DFT 变换定义为:

式中:X(k)是时间序列x(n)的频谱;WN为蝶形因子。蝶形因子具有对称性、周期性、可约性的特点,因此,利用旋转因子的这些特性,使DFT的有些项合并,将长序列的DFT合并为短序列的DFT。快速傅立叶变换正是基于这样的基本思路而发展起来的。

DIT―FFT的运算具有以下规律:1. 原位运算(同址运算),这种运算是很有规律的,其每级(每列)计算都是由N/2 个蝶形运算构成的,每一个蝶形结构完成下述基本迭代运算:

 

式中,m表示第m列迭代,k, j为数据所在行数  。2. 序列的倒序,当运算完成后,FFT的输出X(k)按正常顺序排列在存储单元中,即按X(0…0),X(0…1),…,X(1…1)的顺序排列,但是这时输入x(n)却不是按自然顺序存储的,而是按x(0…0),x(1…0), …, x(1…1)的顺序即按k的倒序存入存储单元。

2.2       FFT在dsps上的实现[3]

在快速算法中,为了避免重复计算和提高运算的速度,将旋转因子表以固定的数组的形式存放。其实部和虚部交替存储。FFT在dsps上实现流程图如下:

图1.FFT在dsps上实现的流程图

一开始,先是dsp、串口的初始化,判断是否接受够一次FFT的数据量,如果没有,进行等待;这时,如果串口的RX FIFO中接受到了数据,就会立即产生中断,RX 的数据首先存入short型的数组a中,之后,检查数组a中的数据是否达到进行FFT的要求,如果达到要求,将一次的数据量送入FFT函数,对其进行变换,再将计算的结果送入到TX FIFO中输出;如果没有达到要求,则等待RX FIFO接收新的数据而产生的中断,进而数组a继续接收RX FIFO中的数据,直到a中的数据达到要求。之所以采取两个数组的ping-pong Buffer结构是由dsp与串口结构的特点决定的。(假设作n点FFT)

一旦RX FIFO接受到一个字节,将导致dsp产生一个中断,那么就需要一个Buffer对其进行接收,当接收到2n个字节时,需要对其进行一次FFT(因为FFT的输入的各点是16bit的)。若n的数目较大,那么如果在n点FFT还未算完时,RX FIFO又接收到一个字节,这时将导致前面接收的字节覆盖后来接受的字节的后果,产生错误;为了避免上述情况,可以通过复杂的软件控制使FFT计算完后,再向Buffer中写新的数据,但这大大将降低数据的处理速度。所以,需要再开一个Buffer,形成ping-pong的结构,当一个Buffer中的数据进行FFT时,如果再有数据进来,可以放在另一个Buffer中,这样反复交替进行可以大大提高运算的效率和结果的准确性。

 

3.基于CCS的调试[4]及MATLAB的验证[5]

在前期开发中,笔者使用SEED-DEC 6416开发板对算法进行仿真调试,因为开发板没有提供数据采集功能,因此本文采用串口进行dsp与PC机的连接,这样便可以实现PC机与dsp的通信与数据处理,即本文提供了一种在没有AD数据采集的条件下,自己模拟产生一个信号,并对其进行FFT变换的方法。

下面将以一个512点的FFT为例:

       由于本文采用TL16C752B通用异步收发器UART,其上包含两块两路相互独立的异步收发器,接受和发送各带64-字节的FIFO,并各带有Modem接口信号,最高传输速率可达3Mbps。根据以上特点,先打开串口调试器,选择通道COM1;波特率为19200;数据位为8;校验位为偶校验Even;停止位为1。

       下面就需要模拟产生一个正弦信号:设输入序列为x[2*i] = 32767./(2*NN) * (sin(2*PI*F1*i/NN)+ sin(2*PI*F2*i/NN)+sin(2*PI*F3*i/NN) );。其中,i=0、1、2…511;F1 = 10, F2 = 20,F3=40。本文将数组x[i]的每一个元素的值都转化成十六进制数,所以输入串口调试器中接收字符的16进制数据分别为:ffed ffec ffe5 ffda ffcd ffc1ffba ffbb ffc5 ffd7…。

然后打开CCS2(Code Composer Studio Version 2.2)运行程序,打开串口,这样,每输入1024个字节,发送字符中就会出现这1024个字节的FFT变换的结果。

       对于数据的正误的判断可以通过以下步骤:

①     利用CCS2的图形显示窗口,观察其变换输入与输出的波形,以观测FFT的实现过程。

 

图2.CCS的输入、输出波形                                       

②     输入数据在Matlab 中调用标准的FFT 函数得到的结果如图3 所示,可以看出程序运行的结果基本正确(CCS显示FFT的结果是16位的有符号复数,而MATLAB显示的则是其模值),但依然存在微小的误差,这是因为TMS320C6416是一款定点dsp ,在运算过程中会有舍入和归一化操作,所以难免会引入误差。

 

                                     图3. MATLAB仿真的输入输出波形

       在算法调试中遇到的问题与解决方法如下:(假设作n点FFT)

首先,由于所进行的FFT有以下特点:①FFT的结果是复数,需要区分实部与虚部;②FFT的输入与输出采用同址运算可以节省存储空间;③所编FFT程序的输入与输出均为16bit,需要将输入的连续两个字节的数据合并为一个输入点的数据(16bit)。基于上述特点,开设a、b、c为short型的数组,这样每次RX FIFO接收的数据都将存入a或b的低字节中,当a或b中的数据达到进行一次FFT的数据量时,可以将数组a或b的相邻的两个元素的偶元素左移8位与奇元素相加的结果作为FFT函数的输入数组c的偶元素,即c[2*j]=(a[2*j]<<8)+a[2*j+1]或c[2*j]=(b[2*j]<<8)+b[2*j+1]; 而输入数组c的奇元素为0;如下图所示:

图4. 将单字节数据合并原理图

由于所编程序FFT程序的结果是奇、偶分开的,这样c经过FFT之后,就可以将其结果实部放入其偶元素中,而虚部放入奇元素中,这就避免了用实数无法直接表示复数a+jb的问题。同理,在将计算结果输出TX FIFO时,需要将c中的每个16bit的数据转换为两个8bit数据,本文采用将c的奇、偶元素的高、低字节拆分、移位,再放入到另一个数组的低8位中,这样就可以使TX FIFO接收计算结果了。

其次,由于TMS320C6416是定点dsp,它只能表示纯小数或是纯整数,而输入与输出dsp的数据既有小数部分也有整数部分,所以就涉及dsp的定标问题 。又由于输入FFT函数的数据是short型的,即16bit的带符号数,因此,采用Q15格式进行定标,即用这16bit数表示-1~0.9999695的范围。再加上每进行一级蝶形运算,信号采样的幅值将增加,增加的上下界由下式给出:max(︱Xk︱,︱Xk+N/2︱)≦2max(︱Xe(k)︱,︱Xo(k)︱)。即,FFT在扫描i+1时,任何中间结果的最大值是大于扫描i时的最大值,但小于扫描i时最大值的两倍。所以,在每次扫描之后,将结果右移一位,将保证不会溢出。

 

4.结束语

本文通过利用串口作为调试手段,基于dsps实现了对数据的FFT变换,经过对实验结果的观察,实验结果满足系统的要求,程序采用C 语言实现,具有结构性好、可读性强、可移植性好等特点,但在运算效率和灵活性方面显然还有不尽人意的地方,若再使用CCS提供的反汇编功能对程序进行反汇编,在此基础上进行手动优化,将使得程序的执行效率大大改善,对日后程序的移植具有重要的意义。由于动态信号分析在现代机械系统、控制系统、电力系统等多领域得到了广泛的应用,而基于dsps实现FFT,是其重要组成部分,它具有广泛的应用前景。

本文作者创新点:

①本文设计了ping-pong Buffer的结构对数据进行分别存储与处理,大大提高了运算的效率;②本文针对用实数表示复数,采取了实部与虚部分开存放的方法;③本文对数据进行了定标,有效的解决了用定点dsps实现浮点数运算及防止了数据溢出的问题。



相关文章
· TMS320C6x DSP的FLASH引导方法研究与实现[9]
· S3C2410X在无线宽带通信网中的应用[46]
· 基于TMS320DM270的长途客运车无线视频监控系统的设计[18]
· TMS320VC5502图像传输系统的USB接口扩展[27]
· 基于CMOS图像传感器的嵌入式图像采集与格式转化[48]
热门评论排行
·VHDL设计中电路简化问题的
·江苏嵌入式Linux教育培训
·锐极LINUX驱动培训班定于
·基于实时操作系统μC/OS-
·ARM处理器应用开发4步骤

文章评论
    没有任何评论
*只显示最新10条评论。评论内容只代表网友观点,与本站立场无关。更多评论
发表评论
  * 请先[登陆]再进行评论,谢谢。
评分: 1分 2分 3分 4分 5分
内容: *
发帖须知:
一.所发文章必须遵守《互联网电子公告服务管理规定》;
二.严禁发布供求代理信息,公司介绍,产品信息等广告宣传信息;
三.严禁恶意重复发帖;
四.严禁对个人,实体,民族,国家等进行漫骂,污蔑,诽谤。
 
热点新闻 [更多]
 
亚洲行业盛事频繁IR节能创新再成瞩目
IPTV未获得奥运金牌
英特尔将于本月中期推出首款六核处理器
英飞凌在功率电子市场表现抢眼,以高于
LED奥运会大放光芒 功率
三星同意将Symbian股份出售给诺
英特尔收购Opened H
广东省省长黄华华视察研祥集团
EDI/WEDC/WHITE怀特存储
WHITE/WEDC/EDI代理商-
 
热门下载 [更多]
 
[ ] 手把手学单片机20个例
[ ] 单片机做的智能台灯
[ ] 单片机入门书
[ ] linux系统移植开发文档
[ ] IC卡的读写程序
[ ] 8051单片机C语言彻底应用
[ 常用软件] 555定时器电路设计软件V1.2
[ 常用软件] 51定时器计算软件
[ ] ARM处理器应用开发4步骤
[ ] 实用电源电路集锦
 
论坛新帖 [更多]
 
[原创]本公司长期超低价批发各...
[原创]本公司长期超低价批发种...
[原创]本公司长期批发各种酒、...
[原创]本公司长期低价批发各种...
[原创]长期低价批发各种母婴用...
[原创]本公司长期批发各种饮料...
verilog设计的一点经验...
Altera FPGA、CPL...
如何开始DSP的开发...
[转帖]如果让我重做一次研究生...

 
赞助商 [更多]
 


ICP许可证号:[粤 05056597]
联系电话:010-82517432 82517615 传真: 010-82517615

版权所有 Copyright © 2006 嵌入式技术网