DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1164|回复: 0
打印 上一主题 下一主题

一种基于CCS与DSPs串口实现FFT的方法

  [复制链接]
跳转到指定楼层
楼主
发表于 2012-1-27 20:18:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  
         
    摘要: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的每一个元素的值都转化成十六进制数,所以输入串口调试器中接收字符的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]k︱,︱Xk+N/2︱)≦2max(︱Xe(k)︱,︱Xo(k)︱)。即,FFT在扫描i+1时,任何中间结果的最大值是大于扫描i时的最大值,但小于扫描i时最大值的两倍。所以,在每次扫描之后,将结果右移一位,将保证不会溢出。

4.结束语
本文通过利用串口作为调试手段,基于dsps实现了对数据的FFT变换,经过对实验结果的观察,实验结果满足系统的要求,程序采用C 语言实现,具有结构性好、可读性强、可移植性好等特点,但在运算效率和灵活性方面显然还有不尽人意的地方,若再使用CCS提供的反汇编功能对程序进行反汇编,在此基础上进行手动优化,将使得程序的执行效率大大改善,对日后程序的移植具有重要的意义。由于动态信号分析在现代机械系统、控制系统、电力系统等多领域得到了广泛的应用,而基于dsps实现FFT,是其重要组成部分,它具有广泛的应用前景。
本文作者创新点:
①本文设计了ping-pong Buffer的结构对数据进行分别存储与处理,大大提高了运算的效率;②本文针对用实数表示复数,采取了实部与虚部分开存放的方法;③本文对数据进行了定标,有效的解决了用定点dsps实现浮点数运算及防止了数据溢出的问题。
         
          [/td]
        [/tr]
      
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-9-14 02:14 , 耗时 0.088221 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表