基于DSP的快速傅里叶变换算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
采用高级C语言实现FFT算法。
利用DSP芯片特有的哈佛结构和专门的FFT指令。
在DSP上能够更快速的实现FFT。
从而促进DSP芯片的发展,同时加快基于DSP数字信号处理的速度。
通过对FFT的算法进行研究,从基础深入研究和学习,掌握FFT算法的关键。
研究DSP芯片如何加快蝶形计算以及如何有效地码位倒置的输出颠倒过来。
熟悉旋转因子的生成。
通过学习DSP芯片的工作原理,分析DSP控制的算法,在DSP芯片上实现快速傅里叶变换算法的设计。
通过对DSP开发环境的学习,掌握CCS的简单调试和软件仿真。
在CCS开发环境中观察正弦波输入波形、输出波形、PC机FFT 计算处理后的仿真波形图。
比较仿真图,验证设计和程序的正确性。
表明利用DSP 控制器特有的反序间接寻址使FFT的实现更加方便。
关键词:DSP;FFT;旋转因子
Abstract
Using advanced C language to realize FFT algorithm. Using digital signal processor (DSP) endemic harvard structure and special FFT instructions. In more quickly on DSP can realize FFT. In order to promote the development of digital signal processor (DSP) based on DSP, accelerate the speed of digital signal processing.
Base on the study of FFT, from basic research and study, the key to mastering FFT algorithm. Research on how to accelerate DSP and wing how effectively yards of a output upside down. Familiar with the rotation factor production. Through studying the working principle of DSP, analyzes the algorithm, realized the design of FFT algorithm in DSP. Based on studying DSP development environment, CCS simple commissioning and software simulation. CCS development environment in observing sine wave, the output waveform input, PC FFT calculation of wave graph with simulation. Comparative simulation diagram, verify the correctness of design and program. Use DSP controller that peculiar sequence indirect addressing the realization of FFT make more convenient.
Key words:DSP; FFT; Rotation
目录
第1章概述 0
课题研究的背景及意义 0
本文主要研究内容 (1)
第2章快速傅里叶变换及其算法 (3)
快速傅里叶变换的原理 (3)
快速傅里叶变换算法 (6)
本章小结 (13)
第3章软件设计 (14)
算法设计和程序编写 (14)
算法设计流程 (14)
CCS开发环境的使用及软件仿真 (18)
本章小结 (23)
第4章DSP芯片的原理和FFT在DSP上的实现 (25)
DSP芯片的原理、特点和结构 (25)
FFT算法在DSP上的实现 (30)
本章小结 (31)
结论 (32)
参考文献 (33)
致谢 (34)
附录 (35)
第1章概述
课题研究的背景及意义
课题背景
近十多年来数字信号处理技术同数字计算机、大规模集成电路等,有了突飞猛进的发展,日新月异,已经成为一门具有强大生命力的技术科学。
由于它本身具有一系列的优点,所以能有效地促进个工程技术领域的技术改造和学科发展,应用领域也更加广泛、深入,越来越受到人们的重视。
在信号处理中,离散傅里叶变换(Discrete Fourier Transform,DFT)是常用的变换方法,它在各种数字信号处理系统中扮演着重要的角色。
由离散傅里叶变换(DFT)发现了频率离散化,可以直接用来分析信号的频谱、计算滤波器的频率响应,以及实现信号通过线系统的卷积运算等,因而在信号的谱分析等方面有很大的作用。
傅里叶变换已有一百多年的历史了,我们知道频域分析常常比时域分析更优越,不仅简单,而且易于分析复杂信号。
但需要用较精准的数字方法,即DFT进行谱分析,在FFT出现以前是不切实际的。
由于DFT的计算量太大,即使采用计算机也很难对问题进行实时处理,至此DFT并没有得到真正的应用。
直到1965年库利()和图基()首次发现DFT的一种快速算法,情况才发生根本性的变化。
继库利和图基算法之后,桑德()等快速算法相继出现,又经过其他学者进一步改进,很快出现了通用的快速傅里叶变换,简称FFT。
快速傅里叶变换(Fast Fourier Transform,FFT)并不是与离散傅里叶变换不同的另一种变换,而是为了减少DFT计算次数的一种快速有效的算法。
应当指出,当时电子数字计算机的条件也促成了这个算法的提出。
它使DFT的运算量大大的简化,它推动了近30年的信号处理技术的发展,成为数字信号处理应用领域强有力的工具,为DFT乃至数字信号处理技术的实际应用创造了良好的条件,从而使DFT在实际使用中得以广泛的应用。
数字信号处理器(DSP)是一种可编程的高性能处理器,近年来发展很快。
它不仅适用于数字信号处理,而且在图像处理、语音处理、通信等领域得到广泛的应用。
通用的微处理器在运算速度上很难适应信号实时处理的要求。
DSP处理器中集成有高速的乘法硬件,能快速地进行大量数据的乘法和加法运算。
数字信号处理不同于普通的科学计算与分析,它强调运算的实时性。
除了具备普通微处理器所强调的高速运算和控制能力外,针对实施数字信号处理的特点,在处理器结构、指令系统、指令流程上做了很大的改进。
课题研究的意义
综上所述,基于DSP的快速傅里叶变换算法的研究使FFT算法能够有效地在DSP 芯片上实现。
DSP芯片的出现使FFT的实现更为方便。
由于多数的DSP芯片都能在一个指令周期内完成一次乘法和加法,而且提供了专门的FFT指令。
完成一次指令的周期只需10ns,使得FFT算法在DSP芯片上实现的速度更快。
快速傅里叶变换为频谱分析、卷积与相关数字滤波器设计与实现、功率谱计算、传递函数建模、图像处理等,提供了快速运算方法。
FFT技术应用DSP芯片,从而可以提供使调制、解调、压缩、解压缩和数据传输更为高效的信号处理解决方案,因而广泛应用于雷达、通信、图像处理、声纳和生物医学领域。
本文主要研究内容
本文主要介绍基于DSP的快速傅里叶变换的算法的实现。
研究快速傅里叶变换原理。
快速傅里叶变换和离散傅里叶变换的基本理论是一样的,它根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅里叶变换的算法进行了改进。
在计算机系统或者数字系统中广泛应用快速傅里叶变换,这是一个巨大的进步。
本文要解决的问题就是如何对数据进行分析研究,得到一个能快速进行离散傅里叶变换的方法,降低对计算机内存的要求,使FFT能更加广泛的应用于科学研究。
快速傅里叶变换是离散傅里叶变换的改进方法,因此对连续的周期信号和连续的非周期信号,均需进行加窗与取样,从而得到一系列离散值。
这些离散值通过快速傅立叶变换转变为频域信号,用以进行下一步的分析研究。
掌握在DSP上实现快速傅里叶变换算法。
掌握旋转因子的生成和序列的倒序。
学习DSP芯片TMS320C5416的性能和结构。
熟悉CCS(Code Composer Studio)开发环境,CCS是TI公司的DSP集成开发环境。
利用CCS软件的仿真环境来模拟
TMS320C5416芯片,并对信号处理。
通过学习和讨论算法,编写程序,讨论仿真结果。
第2章快速傅里叶变换及其算法
快速傅里叶变换的原理
离散傅里叶变换的介绍及FFT的发展
在数字信号处理中,对于有限长序列,也可以用序列的傅里叶变换和Z变换来分析和表示。
但还有一种方法更能反映序列的有限长这个特点,即离散傅里叶变换。
离散傅里叶变换(Discrete Fourier Transform,DFT)是常用的变换方法,它在各种数字信号处理系统中扮演着重要的角色。
它是分析有限长序列的有用工具。
离散傅里叶变换除了作为有限长序列的一种傅里叶表示法,在理论上相当重要之外,而且由于存在着计算离散傅里叶变换的有效快速算法,因而离散傅里叶变换在各种数字信号处理的算法中起着核心的作用[1]。
它把数字计算机的应用和信号分析理论结合在一起,使得谱分析、卷积、相关等运算都可以通过DFT在计算机上实现。
有限长序列可以通过(DFT)将其频域也离散化成有限长序列。
但其计算量太大,很难实时地处理问题。
直到1965年出现了DFT运算的一种快速方法以后,情况才发生了根本的变化。
当时Garwin在自己的研究中极需要一个计算傅里叶变换的快速方法,而正在写有关傅里叶变换的文章,Tukey概括地对Garwin介绍了一种方法,它实质上就是后来著名的Cooley-Tukey算法。
在Garwin的迫切要求下,1963年,IBM公司的Cooley 根据Tukey的想法编写了第一个FFT算法程序。
在FFT算法中,Tukey主要利用了旋转因子的周期性和对称性。
这两个性质使DFT运算中的某些项可以合并,使DFT 运算尽量分解为更少点数的DFT运算。
因为DFT的运算量与Pow(,2)
N成比例,所以如果将一个大点数的DFT分解为若干个小点数的DFT的组合,将有效地减少运算量。
Cooley在计算机上实现该算法时,为节省存储空间和减少寻址时间,采用了三维标号映射方法和在算法内部的循环结构,这些结构和技巧对后来的FFT算法研究及实现同样产生了很大影响。
1965年,Cooley和Tukey在《计算数学》上发表了著名的论文,并立即引起了广泛注意。
FFT算法将运算时间减少1-2个数量级,从理论上解决了数字信号处理运算量大的问题,是数字信号处理发展史上的—块里程碑。
以
计算l024点的序列为例,FFT将计算时间缩短为原来的1/100,从而使数字信号处理从一个计算数学的分支变为一门应用科学,逐步走向实用技术。
在Cooley-Tukey算法提出之后,Sande提出了按照频率抽取的FFT算法,它可以作为按照时间抽取的Cooley-Tukey算法的对偶形式。
Bergland提出了采用高基数结构的算法,如基-4或基-8算法能够达到更高的计算效率。
增大基数虽然可以减少计算量,但同时每个计算单元的结构也更复杂。
基-4算法比基-2算法所需的乘法次数减少了约1/4。
当采用高于4的基数r时,虽然总的乘法次数更少,但比基-4算法中所需的复乘次数减少得并不显著,并且r点的DFT中将包含乘法运算,因此实际应用中多采用基-4算法。
Bergland对任意因子的FFT算法也作了研究,提出了统一的FFT方法,即任意因子的FFT运算都可以由r(r是基数)点的DFT运算和与旋转因子相乘的运算来实现,Cooley-Tukey算法和Sande-Tukey算法都可以看作统一的FFT算法的特例,即基数r都相同。
对于输入数据是实数情况,可以将N点的DFT 运算转换为N/2点的DFT运算,或者同时计算两个实序列的DFT,都可以采用FFT 算法。
从七十年代中期开始,基于素因子分解的FFT算法重新得到了重视。
事实上,在Cooley-Tukey算法提出之前,Good就提出用点数互素的短点数DFT运算组合来实现长点数DFT运算,并且这种实现方式不会引入附加的乘旋转因子的运算。
在素因子算法中利用了数论中的中国余数定理,将一维DFT运算映射为标准的多维DFT运算,而素因子的DFT运算可以通过循环卷积算法完成。
在素因子算法中,由于避免了乘旋转因子的运算,因此比Cooley-Tukey算法的乘法运算次数要少得多,而加法次数与之相当。
基于素因子分解的另一种快速算法是由IBM公司的Winograd博士提出的,可以称为WFTA算法。
WFTA算法有两个主要思想:一是用Rader提出的方法将小N点DFT转换为循环卷积,利用多项式理论使卷积计算具有尽可能少的乘法次数;二是将小N点DFT运算进行嵌套来完成大N点的DFT运算。
WFTA算法比素因子算法的乘法次数更少,而加法次数差别不大。
但WFTA算法也有一些突出的问题,如算法不能采用原位运算,需要占用较大的存储空间,更重要的是,随着变换点数N的不同,为使运算所需的加法次数最少,要求采用不同的运算次序,这导致运算过程的规则性较差,且控制过程复杂。
在素因子算法和WFTA算法出现的初期,人们都寄以厚望。
但后来发现它们在实际应用中并不理想,尽管在理论上仍是有意义的进展。
因此FFT的研究重点又回到了带有与旋转因子相乘运算的共因子算法上,主要的研究成果包括Rader和Brenner提出的余割因子算法,王中德提出的对称分解
法,Vetlerli 和Nussbaumer 提出的DFT-DCT 算法等,其中最具代表性的是法国的Duhamel 和Hollman 提出的分裂基算法。
分裂基算法的特点是将基-2分解与基-4分解揉和在一起,对序列的不同部分分别实施基-2算法和基-4算法。
分裂基算法的运算结构与Cooley-Tukey 算法相似,并且对于长度为的变换,这一算法已达到了DFT 运算的最小运算量,所需要的乘法和加法次数为。
乘法:(3)4a N M =-+
加法:3(1)4A N M =-+
对于具体实现而言,算法的运算量只是一个方面,而算法的复杂性、规则性、模块性往往是更重要的。
Cooley-Tukey 算法运算过程的每一级都是由r (r 是基数)点的DFT 和与旋转因子的相乘构成,算法规则,且具有良好的模块性,并且可以实现原位计算,对输入数据以及旋转因子的抽取具有规律性。
这一算法相对简单、规则,且所有的运算单元均相同,具有良好的模块性,易于实现。
WFTA 算法的地址产生可以根据其计算公式或嵌套形式的算法流图来实现,该算法不能采用原位运算,需要占用较大的存储空间。
为使运算所需的加法次数最少,随着变换点数N 的不同,要求采用不同的运算次序,这导致运算过程的规则性较差,控制过程复杂。
同时各“小N ”,也各不相同,导致运算单元的模块性不好。
对于PFA 算法,由于没有与旋转因子相乘的运算,因此避免了对旋转因子的求取,但由于指标映射造成的地址表达式中具有乘、加及求模运算,而这些运算又不易采用简单的方法实现,因此PFA 算法的控制单元要比Cooley-Tukey 算法的复杂。
另一方面,由于PFA 算法中短点数DFT 的变换长度各不相同,要求每一个DFT 都采用不同的运算单元。
虽然不同长度的短点数DFT 运算单元可以采用统一的通用结构,但这不仅降低硬件的效率,同时影响运算单元的速度。
可见PFA 算法同样存在着模块性不好的问题。
对于分裂基算法,由于不同地址中的数据分别输入到2点、4点DFT 运算模块以及与旋转因子相乘的单元进行运算,模块性同样较差,对于程序控制来说比较困难。
综上所述,各种DFT 的快速算法,都利用了的周期性和对称性,通过将一个大点数N 的DFT 分解为若干小点数的DFT 的组合,来减少运算量。
对于变换点数N 为2的整数次幕的情况,分裂基算法的乘法次数比基-2、基-4算法更少。
当N 可以分解为若千个互素因子的乘积时,可以采用素因子算法,当素因子属于2,3,4,5,7,8,9,16等“小N ”时,也可以采用Winograd “小N ”算法。
二者都是通过指标映射,将一维DFT 转化为多维DFT ,同时避免了与旋转因子相乘的运算,因此都有更少的运算次数。
虽然Cooley-Tukey 算法的运算次数要多于其它几种算法,但由于其算法规则,各运算单元相同,可实现
原位计算,具有良好的模块性,因此更容易实现。
总的来说,快速傅里叶变换(Fast Fourier Transform ,FFT )并不是与离散傅里叶变换不同的另一种变换,而是为了减少DFT 计算次数的一种快速有效的算法。
FFT 原理
快速傅氏变换(FFT ),是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅里叶变换的算法进行改进获得的[2]。
它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅里叶变换,可以说是进了一大步。
设()n x 为N 项的复数序列,由DFT 变换,任一X (M )的计算都需要N 次复数乘法和N -1次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出N 项复数序列的X (M ),即N 点DFT 变换大约就需要2N 次运算。
当N =1024点甚至更多的时候,需要10485762=N 次运算,在FFT 中,利用N W 的周期性和对称性,把一个N 项序列(设
N=2k ,k 为正整数),分为两个项的子序列,每个点DFT 变换需要次运算,再N 次运算把两个点的DFT 变换组合成一个N 点的DFT 变换。
这样变换以后,总的运算次数
就变成222/2/2N N N N +=+(
)。
继续上面的例子,N =1024时,总的运算次数就变成了525312次,节省了大约50%的运算量。
而如果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的DFT 运算单元,那么N 点的DFT 变换就只需要
2
log N N 次的运算,N 在1024点时,运算量仅有10240次,是先前的直接算法的1%,点数越多,运算量的节约就越大,这就是FFT 的优越性。
快速傅里叶变换算法
FFT 的基本思想:将大点数的DFT 分解为若干个小点数DFT 的组合,从而减少运算量。
根据对序列分解与选取方法的不同而产生了FFT 的多种算法[3]。
算法分类如图2-1所示:
图2-1 FFT 的几种算法
在这次设计中,采用最基础的按时间抽取的基-2FFT 算法来实现快速傅里叶变换。
为了将大点数的DFT 分解为小点数的DFT 运算,要求序列的长度N 为复合数,最常用的是M N 2=的情况(M 为正整数)。
该情况下的变换称为基-2FFT 算法。
下面讨论基-2FFT 情况的算法。
先将序列x(n)按奇偶项分解为两组:
12
(2)()
0,1,2,,
1(21)()2
x r x r N
r x r x r =⎧=-⎨
+=⎩ (2-1) 将DFT 运算也相应分为两组:
1
0N-1N-1
n=0
n=0
N N -1-12
2
2(21)r=0
r=0
N -12212/2r=0
r=n n ()[()]() ()() (2)(21) ()()N kn
N n kn kn
N
N rk r k
N N
rk k rk N N N X k DFT x n x n W x n W x n W x r W x r W x r W W x r W -=+===+=++=+∑∑∑∑∑∑为偶数 为奇数
N -122rk
N /20
12(W )
()()
rk N k N W X k W X k ==+∑因为 (2-2)
其中)
()(21k X k X 、分别是)()(21n x n x 、的点的DFT
FFT 算法 基-2FFT 算法
基-4FFT 算法 混合基算法 分裂基算法
线性调频Z 变换算法
按时间抽取
按频率抽取
1122
11/2/20
112222/2/20
()()(2),012()()(21),012
N N rk rk N N r r N N rk rk N N r r N X k x r W x r W k N X k x r W x r W k --==--====≤≤
-==+≤≤
-∑∑∑∑ (2-3)
至此,一个N 点DFT 被分解为两个2/N 点的DFT 。
由式(2-3)能否将全部的N 点的解求出来了?
分析:
12()()()k N X k X k W X k =+ (2-4)
)(1k X 和)(2k X 只有2/N 个点,
则由式(2-4)只能求出X (k )的前2/N 个点的DFT 。
要求出全部N 点的)(k X ,需要找出)(1k X 、)(2k X 和)2/(N k X +的关系,其中
0,1,
,
12
N
k =-。
由式子(2-4)可得/212(/2)(/2)(/2)k N N X k N X k N W X k N ++=+++化简得
12N
(/2)()() k=0,1,
,
12
k
N X k N X k W X k +=-- (2-5) 这样N 点DFT 可全部由下式确定出来:
1212()()()
N
k=0,1,,
12
(/2)()()
k
N k
N X k X k W X k X k N X k W X k ⎧=+-⎨+=-⎩ (2-6) 上式可用一个专用的蝶形符号表示,如图2-2所示,对应一次复乘和两次复加运算。
图2-2 蝶形运算符号
k
N
W b
W a k
N -b
W a k
N +a
b -1
通过这样的分解以后,每一个2/N 点的DFT 只需要4)2(2
2N N =次复数乘法,两
个2/N 点的DFT 需要2)2(22
2N N =次复乘,再加上将两个2/N 点DFT 合并成N 点的
DFT 时,有2/N 次与N W 因子相乘,一共需要2222
2N N N ≈
+次复乘。
可见,通过这样的分解,运算量节省了近一半。
因为M N 2=,2/N 仍然是偶数,因此可以对两个2/N 点的DFT 分别作进一步的分解,将两个的DFT 分解成两个4/N 点的DFT 。
例如对)(1r x ,可以再按其偶数部分及奇数部分进行分解:
1314
(2)()
0,1,,
1(21)()4
x l x l N
l x l x l =⎧=-⎨
+=⎩ (2-7) 则运算可相应分为两组:
/41
/41
2(21)11/2
1/20
/41
/41
3/4
/2
4/4
3/24()(2)(21) ()() ()()
0,1,,
14
N N lk l k
N N l l N N lk
k lk
N N N l l k
N X k x l W
x l W x l W
W
x l W X k W X k N
k --+==--===+
+=
+=+=-∑
∑
∑
∑
将系数统一为以N 为周期,即k
N k N W W 22/=,可得
21342134()()()
N
k=0,1,,
14
(/4)()()
k
N k
N X k X k W X k X k N X k W X k ⎧=+-⎨+=-⎩ (2-8) 同样,对)(2k X 也可以进行类似的分解。
一直分解下去,最后是2点的DFT ,2点的DTF 的运算也可以用蝶形符号来表示。
这样,对于一个823==N 的DFT 运算,其时间抽取的分解过程及完整流图如图2-3所示。
X[0] X[4] X[2] X[6] X[1] X[5] X[3] X[7]
X[0]
X[1]
X[2]
X[3]
X[4]
X[5]
X[6]
X[7]
X[0]
X[1]
X[2]
X[3]
X[4]
X[5]
X[6]
X[7]
X[0] X[2] X[4] X[6] X[1] X[3] X[5] X[7] a)
b)
图2-3 时间抽取分解过程
这种方法,由于每一步分解都是按输入序列在时域上的次序是属于偶数还是奇数来抽取的,故称为“时间抽取法”。
分析上面的流图,M N 2=一共要进行M 次分解,构成了从)(n x 到)(k X 的M 级运算过程。
每一级运算都是由2/N 个蝶形运算构成,因此每一级运算都需要2/N 次复乘和M 次复加,则按时间抽取的M 级运算后总用需要:
复数乘法次数:2*log 22
F N N
m M N =
= 复数加法次数:2*log F a N M N N ==
根据上面的流图,分析FFT 算法的两个特点,它们对FFT 的软硬件构成产生很大的影响。
(1)原位运算:也成为同址运算,当数据输入到存储器中以后,每一级运算的结果仍然存储在原来的存储器中,直到最后输出,中间无需其它的存储器。
根据运算流图分析原位运算是如何进行的。
原位运算的结构可以节省存储单元,降低设备成本。
(2)变址:分析运算流图中的输入输出序列的顺序,输出按顺序,输入是“码位倒置”的顺序,见表2-1所示。
X[0] X[1]
X[2] X[3] X[4] X[5] X[6] X[7]
X[0] X[4] X[2] X[6] X[1] X[5] X[3] X[7]
-1
d)
实际运算中,直接将输入数据按码位倒置的顺序排好输入很方便,一般总是先按自然顺序输入存储单元,然后通过变址运算将自然顺序的存储换成码位倒置顺序的存储,这样就可以进行FFT 的原位运算。
变址的功能如图2-4所示。
用软件实现是通用采用雷德(Rader )算法,算出I 的倒序J 以后立即将输入数据)(I X 和)(J X 对换。
尽管变址运算所占运算量的比例很小,但对某些高要求的应用(尤其在实时信号处理中),也可设法用适当的电路结构直接实现变址。
例如单片数字信号处理器TMS320C25就有专用于FFT 的二进制码变址模式。
在这里,我想简单的介绍一下其他的算法,为了开发创新思维,开创改进新算法等。
在FFT 算法中,除基-2FFT 算法外,混合计算法也尤为实用。
当M N 2≠的情况一般可有以下两种处理方法:
(1)将)(n x 用补零的方法延长,使N 增长到最邻近的一个数值M N 2=。
例如,N =30,可以在序列x (n )中补进x (30)=x (31)=0两个零值点,使N=32。
如果计算FFT 的目的是为了解整个频谱,而不是特定频率点,则此法可行。
因为有限长序列补零以后并
0 1 2 3 4 5 6 7
X (0) X (4) X (2) X (6) X (1) X (5) X (3) X (7)
图2-4 码位倒置的变址处理
不影响其频谱)
X,只是频谱的采样点数增加而已。
e
(jw
(2)如果要求特定频率点的频谱,则N不能改变。
如果N为复合数,则可以用以任意数为基数的FFT算法来计算。
快速傅里叶变换的基本思想就是要将DFT的运算尽量分小。
例如,N=6时,可以按照3*2
N 分解,将6点DFT分解为3组2点DFT。
本章小结
在学习离散傅里叶变换的基础上,研究快速傅里叶变换的原理,掌握了快速傅里叶变换的几种算法,并深入学习了以基-2FFT算法为主结合混合基的算法,为下面的程序编写和研究奠定了基础。
第3章软件设计
算法设计和程序编写
算法设计流程
根据快速傅里叶变换的算法和DSP上的实现规律的研究和学习。
可以绘出编程用的程序框图[4]如图3-1所示:
程序说明:
程序由以下5部分组成:
①序列倒序程序;
②第一级蝶形运算;
③第二级蝶形运算;
④第三级至第N
log级的蝶形运算;
2
⑤求功率谱及输出程序。
程序编写
DSP软件设计多用于算法比较复杂、乘加运算量比较大的场合,如通信、雷达、音视频处理等。
为了追求代码的高效性,以前大都用汇编语言来编DSP的应用软件。
随着DSP的应用范围不断延伸,单纯的汇编语言程序的难读性、难移植性、难修改性等缺点日益突出。
C语言以其独特的可读性、可修改性和可重用性,使DSP的运算速度大幅提高。
用C语言进行DSP软件设计,其效率一般低于汇编语言编制,这是因为汇编语言是低级语言,形成目标代码的速度比C语言快,因此,用C语言进行软件设计时,优化设计显得尤为重要。
鉴于DSP应用复杂性,用C语言进行软件开发时,一般先在PC上对算法进行仿真,然后将程序移植到DSP平台中。
由于DSP程序需要首先使用高级语言来模拟算法性能,对于本次设计题目基于DSP的快速傅里叶变换算法,采用C语言编程。
整个程序的编写过程[5]如下:
(1)首先定义一个复数结构。
struct compx{double };
(2)定义一个输入数据序列。
struct compx xin{N-1};
(3)定义两个复数相乘。
struct compx EE(struct compx b1,struct compx b2)
{
struct compx b3;
=*(4)定义位反函数
V oid displace(void);
{....
nv2=N/2;
For(i=1;i<=nm1;i++)
{if(i<j){t=xin[j];xin[j]=xin[i];xin[i]=t;}
k=nv2;
While(k<j)
{
j=j-k;
K=k/2;
}
j=j+k;
}
(5)定义FFT变换的函数。
V oid FFT(void)
{
.....
For(l=1;l<=m;l++)
{
lt=pow(2,1);
Lei=le/2;
Pi=3.;
=;=;
=cos(pi/lei);
=-sin(pi/lei);
For(j=1;j<lei;j++)
{for(i=j;i<=N;i=i+le)
{ip=i+lei;
T=EE(xin[ip],v);
Xin[ip].real=xin[i].real=;
Xin[ip].imag=xin[i].;
Xin[i].real=xin[i].real+;
Xin[i].imag=xin[i].imag+;}
V=EE;
}
}}
(6)创建.CMD文件如下:-w
-stack 400h
-heap 100
-l
MEMORY
{
PAGE 0:
VECT : o=80h,l=80h
PRAM : o=100h,l=1f00h
PAGE 1:
DRAM : o=2000h,l=1000h
}
SECTIONS
{
.text : {}> PRAM PAGE 0
.data : {}> PRAM PAGE 0
.cinit : {}> PRAM PAGE 0
.switch : {}> PRAM PAGE 0
.const : {}> DRAM PAGE 1
.bss : {}> DRAM PAGE 1
.stack : {}> DRAM PAGE 1
.vectors: {}> VECT PAGE 0
}
注:整体程序见附录
CCS开发环境的使用及软件仿真
CCS开发环境的使用
TI公司提供多种开发工具,可以快速实现基于DSP的应用设计,从概念到编码/编译,调试,通过分析,校正,并以测试。
许多工具都是TI的实时Ex pressDSP™软件和开发工具策略的一部分,这对设计过程中快速起步及节省宝贵时间非常有帮助。