|
The Realization of FFT Based on UART and CCS
摘要:FFT是对实时采集的动态数据进行频域分析、处理的基本算法,本文针对DSP系统特点设计了一种高效的FFT的实现方法,以完成对动态信号的实时分析、处理。使用串口将DSP评估板与PC机相连,利用CCS作为开发平台来进行调试,分析了调试过程中遇到的问题给出了解决的方法,并利用MATLAB验证了该方法的正确性与可行性。
关键词:动态信号分析;数字信号处理器;代码调试器;快速傅立叶变换;串口
Abstract: FFT is the fundamental algorithm of frequency-domain analysis and processing of the real-time dynamic data acquisition. Directing at DSP system’s characteristic, the present paper designs an efficient realization of FFT in order to realize real-time analysis and processing of dynamic signal. Through connecting DSP evaluation board with PC by UART and debugging them based on CCS, this paper analyzes the problems happened in the process of debugging and provides the solution to these problems,and use MATLAB to prove the correctness and feasibility of the method.
Key word: Dynamic Signal Analysis; DSPs; CCS;FFT; UART
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 变换定义为:
![]()
500)this.style.width=500;" border=0>
式中:X(k)是时间序列x(n)的频谱;WN为蝶形因子。蝶形因子具有对称性、周期性、可约性的特点,因此,利用旋转因子的这些特性,使DFT的有些项合并,将长序列的DFT合并为短序列的DFT。快速傅立叶变换正是基于这样的基本思路而发展起来的。
DIT―FFT的运算具有以下规律:1. 原位运算(同址运算),这种运算是很有规律的,其每级(每列)计算都是由N/2 个蝶形运算构成的,每一个蝶形结构完成下述基本迭代运算:
![]()
500)this.style.width=500;" border=0>
式中,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上实现流程图如下:
![]()
500)this.style.width=500;" border=0>
图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中,这样反复交替进行可以大大提高运算的效率和结果的准确性。
[1] [2] 下一页
[/td]
[/tr]
|
|