湖南科技大学信息与电气工程学院《课程设计报告》题目:基于DSP芯片的函数信号的FFT专业:通信工程班级:01班姓名:学号:指导教师:2015年12月24日2信息与电气工程学院课程设计任务书20—20学年第学期专业:通信工程学号:姓名:课程设计名称:DSP原理及应用设计题目:基于DSP芯片的函数信号的FFT完成期限:自2015年12月21日至2015年12月24日共1周设计依据、要求及主要内容(可另加附页):《DSP原理及应用课程设计》是配合DSP原理及应用理论教学,为通信工程和电子信息工程专业开设的专业技术技能设计,课程设计对通信工程和电子信息工程专业的学生是一个非常重要的实践教学环节。通过课程设计,使学生综合运用DSP技术课程和其他有关先修课程的理论和生产实际知识去分析和解决具体问题的能力得到提高,并使其所学知识得到进一步巩固、深化和发展。通过课程设计初步培养学生对工程设计的独立工作能力,学习设计的一般方法。通过课程设计树立正确的设计思想,提高学生分析问题、解决问题的能力。通过课程设计训练学生的设计基本技能,如计算、绘图、查阅设计资料和手册,熟悉标准与规范等。要求:(1)按时参加课程设计指导,定期汇报课程设计进展情况。(2)广泛收集相关技术资料。(3)独立思考,刻苦钻研,严禁抄袭。(4)按时完成课程设计任务,认真、正确地书写课程设计报告。(5)培养实事求是、严谨的工作态度和认真的工作作风。主要内容:(1)熟悉DSP处理器及其结构性能,掌握DSP芯片配套开发工具的使用方法。(2)按要求设计出硬件电路。(3)画出硬件连接原理图,并对硬件工作原理进行说明。(4)给出软件流程图及编写程序,每一条指令的后面附上相应的注释。(5)进行软、硬件调试,检查是否达到相关的功能。(6)写出调试方法。(7)设计报告结尾附上心得体会。指导教师(签字):批准日期:年月日3目录摘要···········································································4一、实验目的···································································4二、实验设备···································································4三、实验内容··································································4四、实验原理···································································4五、FFT算法的DSP实现过程·····················································5六、设计步骤···································································7七、编译程序···································································9八、实验过程···································································10九、实验结果···································································13十、问题与思考·································································13十一、心得体会·································································14十二、参考文献·································································144摘要随着计算机和微电子技术的飞速发展,基于数字信号处理的频谱分析已经应用到各个领域并且发挥着重要作用。信号处理方法是当前机械设备故障诊断中重要的技术基础之一,分析结果的精确程度是诊断成功与否的关键因素。研究频谱分析是当前主要的发展方向之一。数字信号处理基本上从两个方面来解决信号的处理问题:一个是时域方法,即数字滤波;另一个是频域方法,即频谱分析.本文主要介绍了离散傅里叶变换以及快速傅里叶变换,通过对DFT以及FFT算法进行研究,从基础深入研究和学习,掌握FFT算法的关键。通过对DSP芯片工作原理以及开发环境的学习,掌握CCS的简单调试和软件仿真,在DSP芯片上实现对信号的实时频谱分析。关键字:DSPFFT算法频谱分析一、实验目的1.加深对DFT算法原理和基本性质的理解;2.熟悉FFT的算法原理和FFT子程序的算法流程和应用;3.学习DSP中FFT的设计和编程思想;4.学习使用CCS的波形观察器观察波形和频谱情况;5.熟悉FFT在实际中应用的效果;6.熟悉正弦、三角、方波信号的FFT变换;二、实验设备1.一台装有CCS软件的计算机;2.DSP实验箱;3.DSP硬件仿真器;4.网络交叉线。三、实验内容用DSP汇编语言及C语言进行编程,实现FFT运算、对输入信号进行频谱分析。四、实验原理信号发生器模块可以产生20Hz~20kHz的函数信号。信号波形有正弦波、三角波、方波;信号输出幅度Vpp在0~3.3V范围内可调;输出阻抗约600Ω左右。信号发生器模块的主要函数信号发生电路及缓冲放大电路如下图所示。首先简单介绍函数信号发生电路的构成,该电路的核心器件是ICL8038,它是单片多波形振荡集成电路,可以用很少的外围元件产生高精度正弦波、三角波和方波。其电路功能框图如下:5其工作波形如下图,五、FFT算法的DSP实现过程:DSP芯片的出现使FFT的实现方法变得更为方便。由于大多数DSP芯片都具有在单指令周期内完成乘法—累加操作,并且提供了专门的FFT指令,使得FFT算法在DSP芯片实现的速度更快。FFT算法可以分为按时间抽取FFT和按频率抽取FFT两大类,输入也有实数和复数之分,一般情况下,都假定输入序列为复数。(一)FFT运算序列的存储分配FFT运算时间是衡量DSP芯片性能的一个重要指标,因此提高FFT的运算速度是非常重要的。在用DSP芯片实现FFT算法时,应允许利用DSP芯片所提供的各种软、硬件资源。如何利用DSP芯片的有限资源,合理地安排好所使用的存储空间是十分重要的。(二)FFT运算的实现用汇编程序实现FFT算法主要分为四步:61.实现输入数据的比特反转输入数据的比特反转实际上就是将输入数据进行码位倒置,以便在整个运算后的输出序列是一个自然序列。在用汇编指令进行码位倒置时,使用码位倒置可以大大提高程序执行速度和使用存储器的效率。在这种寻址方式下,AR0存放的整数N是FFT点的一半,一个辅助寄存器指向一个数据存放的单元。当使用位码倒置寻址将AR0加到辅助寄存器时,地址将以位码倒置的方式产生。2.实现N点复数FFTN点复数FFT算法的实现可分为三个功能块,即第一级蝶形运算、第二级蝶形运算、第三级至级蝶形运算。对于任何一个2的整数幂,总可以通过M次分解最后成为2点的DFT计算。通过这样的M次分解,可构成M(即)级迭代计算,每级由N/2个蝶形运算组成。3.功率谱的计算用FFT计算想x(n)的频谱,即计算X(k)=X(k)一般是由实部(k)和虚部(k)组成的复数,即X(k)=(k)+j(k)因此,计算功率谱时只需将FFT变换好的数据,按照实部实部(k)和虚部(k)求它们的平方和,然后对平方和进行开平方运算。但是考虑到编程的难度,对于求FFT变换后数据的最大值,不开平方也可以找到最大值,并对功率谱的结果没有影响,所以在实际的DSP编程中省去了开方运算。4.输出FFT结果(三)汇编语言程序程序主体由rfft-task、bit-rev、fft和power四个子程序组成。rfft-task:主调用子程序,用来调用其他子程序,实现统一的接口。bit-rev:位码倒置子程序,用来实现输入数据的比特反转。fft:FFT算法子程序,用来完成N点FFT运算。在运算过程中,为避免运算结果的溢出,对每个蝶形的运算结果右移一位。fft子程序分为三个功能块:第一级蝶形运算、第二级蝶形运算、第三级至至级蝶形运算。(四)正弦系数表和余弦系数表:正弦系数表和余弦系数表可以由数据文件coeff.inc给出,主程序通过.copy汇编命令将正弦和余弦系数表与程序代码汇编在一起。在本例中,数据文件coeff.inc给出1024复数点FFT的正弦、余弦系数各512个。利用此系数表可完成8~1024点FFT的运算。(五)FFT算法的模拟信号输入:FFT算法的模拟信号输入可以采用C语言编程来生成一个文本文件sindata,然后在rfft-task汇编7程序中,通过.copy汇编命令将生成的数据文件复制到数据存储器中,作为FFT算法的输入数据参与FFT运算。这种方法的优点是程序的可读性强,缺点是当输入数据修改后,必须重新编译、汇编和链接。六、设计步骤:1.启动CCS,在CCS中建立一个C源文件和一个命令文件,并将这两个文件添加到工程,再编译并装载程序:阅读Dsp原理及应用中fft用dsp实现的有关程序。2.双击,启动CCS的仿真平台的配着选项。选择C5502Simulator。3.启动ccs2后建立工程文件FFT.pjt4.建立源文件FFT.c与链接文件FFT.cmd85.将这两个文件加到FFT.pjt这个工程中。7.创建out文件8.加载out文件9七、编译程序intINPUT[SAMPLENUMBER],DATA[SAMPLENUMBER];floatfWaveR[SAMPLENUMBER],fWaveI[SAMPLENUMBER],w[SAMPLENUMBER];floatsin_tab[SAMPLENUMBER],cos_tab[SAMPLENUMBER];voidInitForFFT(){inti;for(i=0;iSAMPLENUMBER;i++){sin_tab[i]=sin(PI*2*i/SAMPLENUMBER);cos_tab[i]=cos(PI*2*i/SAMPLENUMBER);}}voidMakeWave(){inti;for(i=0;iSAMPLENUMBER;i++){INPUT[i]=sin(PI*2*i/SAMPLENUMBER*3)*1024;}}main(){inti;InitForFFT();MakeWave();for(i=0;iSAMPLENUMBER;i++){fWaveR[i]=INPUT[i];fWaveI[i]=0.0f;w[i]=0.0f;}FFT(fWaveR,fWaveI);for(i=0;iSAMPLENUMBER;i++){DATA[i]=w[i];}while(1);//breakpoint}voidFFT(floatdataR[SAMPLENUMBER],floatdataI[SAMPLENUMBER]){intx0,x1,x2,x3,x4,x5,x6,xx;inti,j,k,b,p,L;floatTR,TI,temp;/**********followingcodeinvertsequence************/for(i=0;iSAMPLENUMBER;i++){x0=x1=x2=x3=x4=x5=x6=0;10x0=i&0x01;x1=(i/2)&0x01;x2=(i/4)&0x01;x3=(i/8)&0x01;x4=(i/16)&0x01;x5=(i/32)&0x01;x6=(i/64)&0x01;xx=x0*64+x1*32+x2*16+x3*