1、电子信息工程综合课程设计报告书DSP 课 程 设 计 报告题 目: FFT 快速算法 C 程序学 院: 计算机与信息工程学院专业班级: 09 级电子信息工程 2 班小组成员: 刘森 指导教师: 杨龙时间: 2012 年 03 月 21 日目录1. 设计目的 31.1. 设计目的 31.2. 使用设备 32. 设计任务与要求 43. 原理与分析 44. 实验步骤 55. 实验程序 76. 心得体会 .101 设计目的1.1. 设计目的1掌握用窗函数法设计 FFT 快速傅里叶的原理和方法; 2熟悉 FFT 快速傅里叶特性; 3了解各种窗函数对快速傅里叶特性的影响。1.2. 使用设备PC 兼容机一台
2、,操作系统为 Windows2000(或 Windows98,WindowsXP,以下默认为 Windows2000),安装 TC 软件。 2 设计任务与要求1 按 FFT 流程设计程序;2 实现程序的抽样 输入倒位序输出自然序3 可以观察到各次谐波3 原理与分析1 FFT 的原理和参数生成公式 )()()()()( 2121202120 kXWkrxWrxk NkNkNN 公式(1)FFT 运算公式 FFT 并不是一种新的变换,它是离散傅立叶变换(DFT )的一种快速算法。由于我们在计算 DFT 时一次复数乘法需用四次实数乘法和二次实数加法;一次复数加法则需二次实数加法。每运算一个 X( k
3、)需要 4N 次复数乘法及 2N+2(N-1)=2(2N-1 )次实数加法。所以整个 DFT 运算总共需要 4N2 次实数乘法和 N*2(2N-1)=2N(2N-1)次实数加法。如此一来,计算时乘法次数和加法次数都是和 N2 成正比的,当 N 很大时,运算量是可观的,因而需要改进对 DFT 的算法减少运算速度。 根据傅立叶变换的对称性和周期性,我们可以将 DFT 运算中有些项合并。 我们先设序列长度为 N=2L,L 为整数。将 N=2L 的序列 x(n)(n=0,1,,N-1),按 N 的奇偶分成两组,也就是说我们将一个 N 点的 DFT 分解成两个 N/2 点的 DFT,他们又重新组合成一个
4、如下式所表达的 N 点 DFT: 一般来说,输入被假定为连续的。当输入为纯粹的实数的时候,我们就可以利用左右对称的特性更好的计算 DFT。 我们称这样的 RFFT 优化算法是包装算法:首先 2N 点实数的连续输入称为“进包” 。其次 N 点的 FFT 被连续被运行。最后作为结果产生的 N 点的合成输出是“打开”成为最初的与 DFT 相符合的 2N 点输入。 使用这战略,我们可以划分 FFT 的大小,它有一半花费在包装输入 O (N )的操作和打开输出上。这样的 RFFT 算法和一般的 FFT 算法同样迅速,计算速度几乎都达到了两次 DFT 的连续输入。下列一部分将描述更多的在 TMS320C5
5、4x 上算法和运行的细节。2 程序流程图开始初始化工作变量调用波形发生子程序产生波形(3 个正弦波)调用 FFT 子程序计算当功率谱波形发生计算步长用标准 C 的 sin函数计算当前波形值(8 点)结束FFT按照编码逆序排列输入序列返回计算结果用蝶形算法计算计算功率谱4 实验步骤1实验准备-启动 TC。2打开工程,编写程序;3编译连接,并查看 user screen;5 实验程序#include#include/*定义结构体*/struct cmplex float zhen;float jia;/*复乘*/struct cmplex ls(struct cmplex a1,struct cm
6、plex a2) struct cmplex c;c.zhen=a1.zhen*a2.zhen-a1.jia*a2.jia;c.jia=a1.zhen*a2.jia+a1.jia*a2.zhen;return(c);void main()int i,k,N=8,nv,nm,j=0,m,le,le1,ip;float pai=3.1415926,tmp,sum,*a ;struct cmplex u,w,t,x8;/*抽样函数*/for(i=0;iN;i+)xi.zhen=1;xi.jia=0;for(i=N/2;iN;i+)xi.zhen=-1;xi.jia=0;/*倒位序函数*/nv=N/2
7、;nm=N-1;for(i=0;inm;i+)if(ij)t=xj;xj=xi;xi=t;k=nv;while(k=j)j-=k;k=k/2;j+=k;/*FFT 快速算法*/for(m=1;m=3;m+)le=pow(2,m);le1=le/2;u.zhen=1;u.jia=0;tmp=pai/le1;w.zhen=cos(-tmp);w.jia=sin(-tmp);for(j=0;jle1;j+)for(i=j;iN;i+=le)ip=i+le1;t=ls(xip,u);xip.zhen=xi.zhen-t.zhen;xip.jia=xi.jia-t.jia;xi.zhen+=t.zhen
8、;xi.jia+=t.jia;u=ls(u,w);/*最后输出结果*/printf(“n“);printf(“*n“) ;for(i=0;iN;i+) sum=xi.zhen*xi.zhen+xi.jia*xi.jia;ai=sqrt(sum);printf(“%f n“,ai);最后输出结果:a0=0.000000a1=5.226252a2=0.000000a3=2.164784a4=0.000000a5=2.164784a6=0.000000a7=5.2262526.心得体会首先说明:1 如果为商大的同学,杨龙老师的数字信号处理课程设计 FFT 运算,这个程序无需任何改动直接输出正确结果,然后就是“优秀”到手!2 若为 DSP 爱好者参考使用,则里面的分段程序可供各位学友们参考。心得体会:通过本次课程设计是我对 DSP 有了更深层次的理解,但是我最值得高兴地并非是这次课设的成功,而是经过两天的编程是我对 C 语言有了更深层次的理解也是我的编程能力有了很大的提高。这对于我们以后的电子大赛有着很大的帮助。所以,我建议大家应该重视这次课设,不仅使自己对 DSP 更深层次的理解有很大的帮助,也可以这次编程是大家的 C 语言编程能力有所提高,特别是想要以后参加电子大赛的同学们就应该更加的重视这次课设。-09 电子 刘森