数字信号处理基于MATLAB的FFT算法设计课设说明书.docx
- 文档编号:30771655
- 上传时间:2023-08-23
- 格式:DOCX
- 页数:36
- 大小:672.07KB
数字信号处理基于MATLAB的FFT算法设计课设说明书.docx
《数字信号处理基于MATLAB的FFT算法设计课设说明书.docx》由会员分享,可在线阅读,更多相关《数字信号处理基于MATLAB的FFT算法设计课设说明书.docx(36页珍藏版)》请在冰豆网上搜索。
数字信号处理基于MATLAB的FFT算法设计课设说明书
目录
1引言1
2课设要求2
2.1课设题目2
2.2设计内容及要求2
2.3要求的设计成果2
3基于MATLAB的FFT算法实现3
3.1系统总体流程图3
3.2DIT-FFT算法的基本原理3
3.3DIT-FFT算法的运算规律及编程思想5
4MATLAB实现程序8
5用GUI界面实现运算10
5.1GUI简介10
5.2界面设计10
5.3GUI实现程序12
5.4运行调试13
6自编算法与内置算法结果比较14
7总结15
参考文献16
附录Ⅰ17
附录Ⅱ21
1引言
随着信息时代,数字时代的到来,数字信号处理已经成为一门极其重要的学科和技术领域。
以DSP为核心芯片的处理系统日益变成了数字信号处理系统的主流。
它广泛用于电子信息、通信、图像处理、语音处理、生物医学、自动控制、地质探测等领域,受到工程设计和使用人员的青睐。
MATLAB是矩阵实验室(MatrixLaboratory)的简称,是美国MathWorks公司出品的商数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB的应用范围非常广,包括信号和图像处理、通讯、控制系统设计、测试和测量、财务建模和分析以及计算生物学等众多应用领域。
附加的工具箱(单独提供的专用MATLAB函数集)扩展了MATLAB环境,以解决这些应用领域内特定类型的问题。
它以矩阵运算为基础,把计算、可视化、程序设计融合在一个简单易用的交互式工作环境中,是一款数据分析和处理功能都非常强大的工程适用软件。
它可以将图片文件变换为离散的数据文件,然后利用其强大的矩阵运算能力处理数据,如数据滤波、傅立叶变换、时域和频域分析以及各种图的呈现等,它的信号处理与分析工具箱为图片分析提供了十分丰富的功能函数,利用这些功能函数可以快捷而又方便的完成图片信号的处理和分析以及信号的可视化。
数字信号处理是MATLAB重要应用的领域之一。
对于有限长序列x(n),若要求其N点的傅里叶变换(DFT)需要经过
次复数乘法运算和N*(N-1)次复数加法运算。
随着N的增加,运算量将急剧增加,而在实际问题中,N往往是较大的,如当N=1024时,完成复数乘法和复数加法的次数分别为百万以上,无论是用通用计算机还是用DSP芯片,都需要消耗大量的时间和机器内存,不能满足实时的要求。
因此,DFT的这种运算只能进行理论上的计算,不适合对实时处理要求高的场合。
因此,研究作为DSP的快速算法的FFT是相当必要的,快速傅里叶变换(FFT)是为提高DFT运算速度而采用的一种算法,快速算法的种类很多,而且目前仍在改进和提高,它是根据离散傅里叶变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
2课设要求
2.1课设题目
基于MATLAB的FFT算法的设计
2.2设计内容及要求
1.设计内容:
所设计的FFT算法应完成以下功能:
(1)在MATLAB环境下编写FFT算法(不调用系统现有函数);
(2)实现对选定图片进行FFT计算、还原(IFFT计算),并与系统FFT函数做对比,进行分析;
(3)设计GUI界面。
2.设计要求:
(1)根据题目要求进行算法GUI总体设计;
(2)完成算法具体部分的设计,即算法原理图和算法原理说明;
(3)算法程序的设计,即对选定图片进行自编FFT计算与还原,并与自带函数进行对比与完整源程序;
(4)书写设计说明书。
2.3要求的设计成果
(1)设计结果能正确仿真演示;
(2)设计说明书一份(包括总体设计、算法原理图及说明、系统GUI演示、源程序清单等)。
3基于MATLAB的FFT算法实现
3.1系统总体流程图
本设计要求对一选定的图片进行FFT算法和IFFT算法分析。
在MATLAB环境下编写基2DIT-FFT算法,利用自己编写的算法对图片进行频谱分析,并与MATLAB数字信号处理工具箱中的FFT函数进行对比研究,验证自编算法的正确性。
所以得到系统总体流程图如图3-1所示。
图3-1系统总体流程图
3.2DIT-FFT算法的基本原理
快速傅里叶变换(FFT)是为提高DFT运算速度而采用的一种算法。
对一个有限长度序列x(n)的N点的DFT为:
所以,要求N点的DFT,需要N2次的复数乘法运算,N*(N-1)次复数乘法运算。
随着N的增加,运算量将急剧增加,而在实际问题中,N往往是较大的,如当N=1024时,完成复数乘法和复数加法的次数分别为百万以上,无论是用通用计算机还是用DSP芯片,都需要消耗大量的时间,不能满足实时的要求,不适合于对实时处理要求高的场合。
为了能实时处理DFT,要想减少DFT的运算量可以有两个途径:
第一是降N,N的值减小了,运算量就减少了;第二是利用旋转因子的周期性,对称性和可约性。
利用这两个途径实现DFT的快速傅里叶变换(FFT),FFT算法基本上可分为按时间抽取的FFT算法(DIT-FFT)和按频率抽取的FFT算法(DIF-FFT)。
旋转因子的性质:
(1)周期性
(2)共轭对称性
(3)可约性
本次课设要求用基2的按时间抽取的FFT算法(DIT-FFT)实现FFT功能,设序列x(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的计算。
利用旋转因子的可约性,即:
用蝶形运算可表示为如图3-2所示:
图3-2DIT-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减少运算量的特点表现的越明显。
3.3DIT-FFT算法的运算规律及编程思想
为了编写DIT-FFT算法的运算程序,首先要分析其运算规律,总结编程思想并绘出程序框图。
1.原位计算
对
点的FFT共进行M级运算,每级由N/2个蝶形运算组成。
在同一级中,每个蝶的输入数据只对本蝶有用,且输出节点与输入节点在同一水平线上,这就意味着每算完一个蝶后,所得数据可立即存入原输入数据所占用的数组元素(存储单元)中,这种原位(址)计算的方法可节省大量内存。
2.蝶形运算
实现FFT运算的核心是蝶形运算,找出蝶形运算的规律是编程的基础。
蝶形运算是分级进行的,每级的蝶形运算可以按旋转因子的指数大小排序进行,如果指数大小一样则可从上往下依次蝶算。
对
点的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)*
总结上述运算规律,可采用如下运算方法进行DIT-FFT运算。
首先读入数据,根据数据长度确定运算级数M,运算总点数
,不足补0处理。
然后对读入数据进行数据倒序操作。
数据倒序后从第1级开始逐级进行,共进行M级运算。
在进行第L级运算时,先算出该级不同旋转因子的个数
(也是该级中各个蝶形运算两输入数据的间距),再从R=0开始按序计算,直到R=B-1结束。
每个R对应的旋转因子指数
,旋转因子指数相同的蝶从上往下依次逐个运算,各个蝶的第一节点标号k都是从R开始,以
为步长,到
(可简取极值N-2)结束。
考虑到蝶形运算有两个输出,且都要用到本级的两个输入数据,故第一个输出计算完毕后,输出数据不能立即存入输入地址,要等到第二个输出计算调用输入数据完毕后才能覆盖。
这样数据倒序后的运算可用三重循环程序实现。
整个蝶形运算流程图如图3-3所示。
图3-3整个蝶形运算流程图
3.序列倒序
为了保证运算输出的X(k)按顺序排列,要求序列x(n)倒序输入,即在运算前要先对输入的序列进行位序颠倒。
如果总点数为
的x(n)的顺序数是用M位二进制数表示,则倒序数只需将顺序数的二进制位倒置即可,按照这一规律用硬件电路和汇编语言很容易产生倒序数。
但用MATLAB等高级语言实现倒序时,直接倒置二进制数位的方法不可取,还须找出产生倒序的十进制规律。
将十进制顺序数用I表示,与之对应的二进制数用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时需要交换数据。
另外,为了避免再次调换前面已经调换过的一对数据,只对I 4MATLAB实现程序 在MATLAB环境下编写程序,即不调用系统现有函数的FFT算法、IFFT算法和调用系统现有函数的FFT算法、IFFT算法,实现对选定图片的FFT计算、IFFT计算(还原)。 实现步骤如下: 首先打开MATLAB软件,出现如图4-1所示界面。 图4-1MATLAB主界面 其次,左击File按钮,选中New,点击M-File,出现如图4-2所示界面,写入编写好的程序,保存。 图4-2M-File界面 最后,点击Run图标,运行,选择要分析的图片后,出现如图4-3所示界面。 这就是对选定图片进行FFT计算、IFFT计算后的结果。 对出现的两组图做对比,进行分析。 图4-3运行程序后的结果 5用GUI界面实现运算 5.1GUI简介 图形用户界面(GUI),是一种提供人机交互的工具和方法。 GUI是包含图形对象,如窗口、图标、菜单和文本等图文并茂的用户界面。 5.2界面设计 用MATLAB图形用户界面开发环境设计GUI点的一般步骤是: 1.进行界面设计; 2.设计控件属性; 3.进行M语言编程。 在MATLAB中,启动GUIDE的方法有3种: (1)在MATLAB指令行窗口中直接输入指令“>>GUIDE”; (2)在“Start”菜单中选择“MATLAB”下的“GUIDE”命令; (3)在工具栏中单击“GUIDE”的图标,进入GUI默认窗口界面,如图5-1所示。 这里选择空白界面类型(BlackGUI),单击“OK”按钮,MATLAB将启动GUIDE,如图5-2所示。 图5-1GUIDE的启动界面 图5-2具有空白界面的GUIDE 在GUI空白界面中,位于中央的深灰色部分为绘制控件的画布,拖动右下角小黑点可以调整画布尺寸的大小。 在GUI界面的左侧为MATLAB控制面板。 控制面板的外观可以通过设置GUIDE的属性进行简要的修改,选择GUIDE中的“File”菜单下的“Preference”…”命令,在弹出的对话框中选择“ShownamesinComponentpalette”复选框,如图5-3所示。 单击“OK”按钮后,控制面板中在不同的空间旁边会显示相应空间的名称,如图5-4所示。 图5-3GUIDE的属性对话框图5-4显示控件名称 控制面板上有各种控件,其中有推按钮(PushButton)、单按钮(RadioButton)、复选框(Checkbox)、文本框(EditText)、静态文本框(StaticText)、下拉框(PopupMenu)、列表框(Listbox)、单选按钮(ToggleButton)、轴对象(axes)等。 从控制面板中选择上述控件,按照一定的界面布局用鼠标将控件拖动到画布上。 5.3GUI实现程序 以本设计要求为例介绍。 第一步,该选择本图形用户界面需要的控件: 九个推按钮(Pushbutton),分别为原图,灰度图,内置FFT图,内置IFFT图,原图,灰度图,自编FFT图,自编IFFT图,退出。 八个轴对象(axes)用来显示原图,灰度图,内置FFT图,内置IFFT图,原图,灰度图,自编FFT图,自编IFFT图。 完成的GUI界面如图5-5所示: 图5-5完成的GUI界面 第二步,设置控件属性: 双击组件可以设置推按钮的属性,如显示大小,名称和默认值等。 上图就设置了推按钮的名称,这样可以更清楚的明白每个推按钮的功能。 第三步,编写回调函数。 组件事件的发生是通过回调函数进行工作的。 控件设置完成后保存,然后运行GUI(操作为Ctrl+T),就会进入Editor窗口,加入各个控件功能的函数代码。 完成后保存即可。 第四步,运行GUI。 运行Editor窗口的程序后,会弹出已经激活的GUI界面。 点击代表各个函数操作的按钮,就会出现进行了相应函数操作的图片。 如图5-6所示: 图5-6运行GUI后的结果 5.4运行调试 当点击推按钮,有时相应的图片将不会出现,提示出现错误,这时极有可能是图片路径设置错误,则将回调函数中图片路径修改一下,就可出现正确的结果。 6自编算法与内置算法结果比较 我们知道MATLAB软件自带FFT算法和IFFT算法,我们可以通过比较自编算法运行结果与内置算法运行结果来检验自编算法的正确性。 通过观察图4-3和图5-6的运行结果可知,经过自编FFT运算得到的图形和内置FFT得到的图形大体一致,经过自编IFFT运算得出的图形和内置IFFT得出的图形一致。 只是内置的FFT得到的图片比自编得到的FFT图片更清晰,其他相差不多,大致可认为两种运算结果是一致的。 IFFT算法是在对图像进行FFT算法处理的基础上对图片进行的快速傅里叶逆变换,因此可以观察到图片进行IFFT算法处理后,又恢复为灰度图,而且较之前的灰度图清晰度较差。 本次课程设计编写的程序严格按程序框图编写,思路清晰、容易理解,程序的运行过程在命令窗中一目了然。 通过与自编函数运算的结果比对,虽存在一点小误差,但在允许误差之内,所以程序编写正确。 7总结 本次实习的主要内容是通过用MATLAB实现FFT的设计,可以实现对选定图片信号进行分析,并做出经FFT算法及IFFT算法后的图片结果。 把自己编写的FFT算法与MATLAB自带FFT算法进行比较。 程序运行调试时,自己选择输入要采样的图片,可以实现对不同图片的FFT运算。 通过这次课程设计,我对课堂上所学到的理论知识的理解加深了许多,自己动脑、动手设计的能力也得到了较大提高。 在这次课程设计的过程中,我对MATLAB语言有了更深的认识。 这次课程设计使得我对MATLAB语言的理解与应用能力得到了较大的提升,也让我认识到只要深入学习,提升的空间永远是存在的。 这次的课程设计是对本学期所学知识的一次重要巩固,使得在课堂上掌握的知识得到了真正的运用。 在学习的过程中和同学讨论,更明白了理论知识与实践的联系。 书到用时方恨少,有些知识学会是一回事,掌握是一回事,但应用起来,确实不是那么简单的,需要很多知识的融会贯通。 在课程设计的过程中我遇到了一些问题,如: 编写源程序中出现了语法错误等。 通过查阅书本和以前设计的程序我发现了产生错误的原因并解决了问题完成了设计。 经过反思我发现较大部分错误是因为操作的不熟练造成的,这也让我明白了要保持设计的高效率,必须经常练习。 学习就是一个了解疑惑,进而解惑的过程,这次实习就是提供了这样一个发现自己知识漏洞,与同学老师探讨进行解惑的的机会。 在这里特别感谢指导老师,老师给了我们很大的发挥空间,让我们真正自己动手真正掌握了知识,老师对工作认真负责,在我遇到困难时,给予我支持和帮助,感谢老师细心指导。 也非常感谢我的同学,在课程设计过程中,我们互相帮助,一起探索,解决了知识上有漏洞的问题,谢谢大家。 参考文献 [1]范寿康.《DSP技术与DSP芯片》.北京电子工业出版社,2008 [2]程佩青.《数字信号处理教程》.北京清华大学出版社出版,2001 [3]高西全,丁玉美等.《数字信号处理》.北京电子工业出版社,2009 [4]余成波,陶红艳.《数字信号处理及MATLAB实现》.北京清华大学出版社,2008 [5]曹弋,赵阳.《MATLAB实用教程》.北京电子工业出版社,2007 [6]奥本海姆.《离散时间信号处理》.科学出版社,2000 [7]宗孔德,胡广书.《数字信号处理》.清华大学出版社,1997 附录Ⅰ 以下是用Matlab实现的程序编码: functionimage_process_FFT() [filename,pathname]=uigetfile({'*.jpg;*.tif;*.bmp;*.gif'},'FileSelector'); image=imread(strcat(pathname,filename)); scrsz=get(0,'ScreenSize'); figure('position',[00scrsz(3)-1scrsz(4)]); set(gcf,'Name','快速傅里叶变换'); subplot(2,4,1); imshow(image); title('原始图像'); subplot(2,4,5); imshow(image); title('原始图像'); ifndims(image)==3 image=rgb2gray(image); end subplot(2,4,2); imshow(image); title('灰度图像'); subplot(2,4,6); imshow(image); title('灰度图像') [r,c]=size(image); array=image; t=log2(r); t1=floor(t); t2=ceil(t); ift1~=t2 array(2^t2,c)=0; end [r1,c1]=size(array); t=log2(c1); t3=floor(t); t4=ceil(t); ift3~=t4 array(r1,2^t4)=0; end [r1,c1]=size(array); n=r1/2; data_col=zeros(1,n,'double'); form=1: n data_col(m)=exp(-1i*2*pi*(m-1)/r1); end n=c1/2; data_row=zeros(1,n,'double'); form=1: n data_row(m)=exp(-1i*2*pi*(m-1)/r1); end array=transform_fft2(array); Ft=fftshift(array); S1=log(1+abs(Ft)); subplot(2,4,7); imshow(S1,[]); title('自建FFT2函数结果'); array=transform_ifft2(array); array=abs(array); array=array(1: r,1: c); subplot(2,4,8); imshow(array,[]); title('自建IFFT2函数结果'); F=fft2(image); FC=fftshift(F); S=log(1+abs(FC)); subplot(2,4,3) imshow(S,[]); title('内置FFT2函数结果'); array=ifft2(F); array=round(abs(array)); subplot(2,4,4); imshow(array,[]); title('内置IFFT2函数结果'); return functionarray=transform_fft2(array) array=double(array); [r1c1]=size(array); forj=1: r1 array(j,: )=transform_fft(array(j,: )); end forj=1: c1 array(: j)=transform_fft((array(: j))); end functionarray1=transform_fft(array) N=length(array); n=N/2; w=zeros(1,n,'double'); form=1: n w(m)=exp(-1i*2*pi*(m-1)/N); end p=log2(N); array1=zeros(1,N,'double'); forq=1: p t1=2^(q-1); t2=2^(p-1); fork=0: (t2/t1-1) forj=0: (t1-1) ifmod(q,2)==1 data1=array(k*t1+j+1); data2=array(k*t1+j+t2+1); array1(k*t1*2+j+1)=data1+data2; array1(k*t1*2+j+t1+1)=(data1-data2)*w(k*t1+1); else data1=array1(k*t1+j+1); data2=array1(k*t1+j+t2+1); array(k*t1*2+j+1)=data1+data2; array(k*t1*2+j+t1+1)=(data1-data2)*w(k*t1+1); end end end end ifmod(p,2)==1 return else array1=array; return end functionarray=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字信号 处理 基于 MATLAB FFT 算法 设计 说明书