1、数字信号处理基于数字信号处理基于 MATLAB 的的 FFT 算法设计课设说明算法设计课设说明书书 1引言 1 2课设要求 2 2.1课设题目 2 2.2设计内容及要求 2 2.3要求的设计成果 2 3基于 MATLAB的 FFT算法实现 3 3.1系统总体流程图 3 3.2 DIT-FFT算法的基本原理 3 3.3 DIT-FFT算法的运算规律及编程思想 5 4 MATLAB实现程序 8 5用 GUI界面实现运算 10 5.1 GUI简介 10 5.2界面设计 10 5.3 GUI实现程序 12 5.4运行调试 13 6自编算法与内置算法结果比较 14 7总结 15 参考文献 16 附录 1
2、7 附录 21 1 引言引言 MATLAB是矩阵实验室(Matrix Laboratory)的简称,是美国 MathWorks 公司出品的商数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括 MATLAB和 Simulink 两大部分。MATLAB 的应用范围非常广,包括信号和图像处理、通讯、控制系统设计、测试和测量、财务建模和分析以及计算生物学等众多应用领域。附加的工具箱(单独提供的专用 MATLAB 函数集)扩展了 MATLAB 环境,以解决这些应用领域内特定类型的问题。它以矩阵运算为基础,把计算、可视化、程序设计融合在一个简单易用的交互式工作
3、环境中,是一款数据分析和处理功能都非常强大的工程适用软件。它可以将图片文件变换为离散的数据文件,然后利用其强大的矩阵运算能力处理数据,如数据滤波、傅立叶变换、时域和频域分析以及各种图的呈现等,它的信号处理与分析工具箱为图片分析提供了十分丰富的功能函数,利用这些功能函数可以快捷而又方便的完成图片信号的处理和分析以及信号的可视化。数字信号处理是 MATLAB重要应用的领域之一。对于有限长序列 x(n),若要求其 N点的傅里叶变换(DFT)需要经过 次复数乘法运算和 N*(N-1)次复数加法运算。随着 N的增加,运算量将急剧增加,而在实际问题中,N往往是较大的,如当 N=1024 时,完成复数乘法和
4、复数加法的次数分别为百万以上,无论是用通用计算机还是用 DSP 芯片,都需要消耗大量的时间和机器内存,不能满足实时的要求。因此,DFT 的这种运算只能进行理论上的计算,不适合对实时处理要求高的场合。因此,研究作为 DSP 的快速算法的 FFT 是相当必要的,快速傅里叶变换(FFT)是为提高 DFT运算速度而采用的一种算法,快速算法的种类很多,而且目前仍在改进和提高,它是根据离散傅里叶变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。基于本学期所学的 DIT-FFT的运算规律和编程思想以及 MATLAB的学习和使用,本课设要求在 MATLAB环境下编写基 2 DIT-FFT算法实
5、现对离散信号的快速傅里叶变换,再与 MATLAB软件自带的 FFT函数实现对离散信号的傅里叶变换进行比较,如果得到的频谱相同,那么我们编写的程序就是正确的。如果有能力可以选做系统人机对话界面,用 GUI界面完成人机交互方便使用的。本课程设计主要是对数字信号的分析。2 课设要求课设要求 2.1 课设题目课设题目 基于 MATLAB的 FFT 算法的设计 2.2 设计内容及要求设计内容及要求 1.设计内容:所设计的 FFT算法应完成以下功能:(1)在 MATLAB环境下编写 FFT算法(不调用系统现有函数);(2)实现对选定图片进行 FFT计算、还原(IFFT计算),并与系统 FFT函数做对比,进
6、行分析;(3)设计 GUI界面。2.设计要求:(1)根据题目要求进行算法 GUI总体设计;(2)完成算法具体部分的设计,即算法原理图和算法原理说明;(3)算法程序的设计,即对选定图片进行自编 FFT计算与还原,并与自带函数进行对比与完整源程序;(4)书写设计说明书。2.3 要求的设计成果要求的设计成果(1)设计结果能正确仿真演示;(2)设计说明书一份(包括总体设计、算法原理图及说明、系统 GUI 演示、源程序清单等)。3 基于基于 MATLAB 的的 FFT 算法实现算法实现 3.1 系统总体流程图系统总体流程图 本设计要求对一选定的图片进行 FFT算法和 IFFT算法分析。在 MATLAB环
7、境下编写基 2 DIT-FFT算法,利用自己编写的算法对图片进行频谱分析,并与 MATLAB数字信号处理工具箱中的 FFT函数进行对比研究,验证自编算法的正确性。所以得到系统总体流程图如图 3-1 所示。图 3-1 系统总体流程图 3.2 DIT-FFT 算法的基本原理算法的基本原理 快速傅里叶变换(FFT)是为提高 DFT运算速度而采用的一种算法。对一个有限长度序列 x(n)的 N点的 DFT 为:所以,要求 N点的 DFT,需要 N2次的复数乘法运算,N*(N-1)次复数乘法运算。随着 N的增加,运算量将急剧增加,而在实际问题中,N往往是较大的,如当 N=1024时,完成复数乘法和复数加法
8、的次数分别为百万以上,无论是用通用计算机还是用DSP 芯片,都需要消耗大量的时间,不能满足实时的要求,不适合于对实时处理要求高的场合。为了能实时处理 DFT,要想减少 DFT 的运算量可以有两个途径:第一是降N,N的值减小了,运算量就减少了;第二是利用旋转因子的周期性,对称性和可约性。利用这两个途径实现 DFT的快速傅里叶变换(FFT),FFT算法基本上可分为按时间抽取的 FFT算法(DIT-FFT)和按频率抽取的 FFT 算法(DIF-FFT)。旋转因子的性质:(1)周期性(2)共轭对称性(3)可约性 本次课设要求用基 2的按时间抽取的 FFT算法(DIT-FFT)实现 FFT功能,设序列x
9、(n)的长度为 N,且 N满足 N=2M,M 为正整数。若 N不能满足上述关系,可以将序列 x(n)补零实现。按时间抽取基 2-FFT算法的基本思路是将 N点序列按时间下标的奇偶分为两个 N/2点序列,计算这两个 N/2点序列的 N/2点 DFT,计算量可减小约一半;每一个 N/2点序列按照同样的划分原则,可以划分为两个 N/4点序列,最后,将原序列划分为多个 2点序列,将计算量大大降低。按时间下标的奇偶将 N点 x(n)分别抽取组成两个 N/2点序列,分别记为 x1(n)和x2(n),将 x(n)的 DFT转化为 x1(n)和 x2(n)的 DFT 的计算。利用旋转因子的可约性,即:用蝶形运
10、算可表示为如图 3-2 所示:图 3-2 DIT-FFT 蝶形运算流图符号 以此类推,还可以把 x1(n)和 x2(n)按 n值得奇偶分为两个序列,这样就达到了降 N得目的,从而减少了运算量。FFT对 DFT的数学运算量改进:直接采用 DFT进行计算,运算量为 N2次复数乘法和 N*(N-1)次复数乘法。当采用 M 次 FFT时,由 N=2M 求得 M=logN,运算流图有 M 级蝶形,每一级都由N/2 个蝶形运算构成,这样每一级蝶形运算都需要 N/2次复数乘法和 N 次复数加法。M级运算共需要复数乘法次数为 C=N/2*M,复数加法次数为 C=N*M。当 N值较大时,FFT 减少运算量的特点
11、表现的越明显。3.3 DIT-FFT 算法的运算规律及编程思想算法的运算规律及编程思想 为了编写 DIT-FFT 算法的运算程序,首先要分析其运算规律,总结编程思想并绘出程序框图。1.原位计算 对 点的 FFT共进行 M 级运算,每级由 N/2个蝶形运算组成。在同一级中,每个蝶的输入数据只对本蝶有用,且输出节点与输入节点在同一水平线上,这就意味着每算完一个蝶后,所得数据可立即存入原输入数据所占用的数组元素(存储单元)中,这种原位(址)计算的方法可节省大量内存。2.蝶形运算 实现 FFT运算的核心是蝶形运算,找出蝶形运算的规律是编程的基础。蝶形运算是分级进行的,每级的蝶形运算可以按旋转因子的指数
12、大小排序进行,如果指数大小一样则可从上往下依次蝶算。对 点的 FFT共有 M 级运算,用 L表示从左到右的运算级数(L=1,2,M)。第 L级共有 个不同指数的旋转因子,用 R 表示这些不同指数旋转因子从上到下的顺序(R=0,1,B-1)。第 R 个旋转因子的指数 ,旋转因子指数为 P 的第一个蝶的第一节点标号 k 从 R 开始,由于本级中旋转因子指数相同的蝶共有 个,且这些蝶的相邻间距为 ,故旋转因子指数为 P 的最后一个蝶的第一节点标号 k 为:,本级中各蝶的第二个节点与第一个节点都相距 B点。应用原位计算,蝶形运算可表示成如下形式:(J)=(J)+(J+B)*(J+B)=(J)-(J+B
13、)*总结上述运算规律,可采用如下运算方法进行 DIT-FFT运算。首先读入数据,根据数据长度确定运算级数 M,运算总点数 ,不足补 0处理。然后对读入数据进行数据倒序操作。数据倒序后从第 1级开始逐级进行,共进行 M 级运算。在进行第 L级运算时,先算出该级不同旋转因子的个数 (也是该级中各个蝶形运算两输入数据的间距),再从 R=0 开始按序计算,直到R=B-1结束。每个 R 对应的旋转因子指数 ,旋转因子指数相同的蝶从上往下依次逐个运算,各个蝶的第一节点标号 k 都是从 R 开始,以 为步长,到 (可简取极值 N-2)结束。考虑到蝶形运算有两个输出,且都要用到本级的两个输入数据,故第一个输出
14、计算完毕后,输出数据不能立即存入输入地址,要等到第二个输出计算调用输入数据完毕后才能覆盖。这样数据倒序后的运算可用三重循环程序实现。整个蝶形运算流程图如图 3-3所示。图 3-3 整个蝶形运算流程图 3.序列倒序 为了保证运算输出的 X(k)按顺序排列,要求序列 x(n)倒序输入,即在运算前要先对输入的序列进行位序颠倒。如果总点数为 的 x(n)的顺序数是用 M 位二进制数表示,则倒序数只需将顺序数的二进制位倒置即可,按照这一规律用硬件电路和汇编语言很容易产生倒序数。但用 MATLAB等高级语言实现倒序时,直接倒置二进制数位的方法不可取,还须找出产生倒序的十进制规律。将十进制顺序数用 I表示,
15、与之对应的二进制数用 IB表示。十进制倒序数用 J 表示,与之对应的二进制数用 JB表示。JB是 IB 的位倒置结果,十进制顺序数 I增加 1,相当于 IB最低位加 1 且逢 2向高位进 1,即相当于 JB最高位加 1且逢 2 向低位进 1。JB的变化规律反映到 J 的变化分二种情况:如果 JB的最高位是 0 ,则直接由加 1 得到下一个倒序值;如果 JB的最高位是 1 ,则要先将最高位变 0 ,再在次高位加 1 。但次高位加 1时,同样要判断 0、1值,如果是 0 ,则直接加 1 ,否则要先将次高位变 0 ,再判断下一位。依此类推,直到完成最高位加 1,逢 2 向右进位的运算。利用这一算法可按顺序数 I的递增顺序,依次求得与之对应的倒序数 J。为了节省内存,数据倒序可原址进行,当 I=J 时不需要交换,当 I J 时需要交换数据。另外,为了避免再次调换前面已经调换过的一对数据,只对 IJ 的情况进行数据交换即可实现数据倒序操作。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1