基于GUI的FFT运算文档格式.docx
- 文档编号:19080594
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:30
- 大小:494.98KB
基于GUI的FFT运算文档格式.docx
《基于GUI的FFT运算文档格式.docx》由会员分享,可在线阅读,更多相关《基于GUI的FFT运算文档格式.docx(30页珍藏版)》请在冰豆网上搜索。
MATLAB产品族可以用来进行以下各种工作:
数值分析、数值和符号计算、工程与科学绘图、控制系统的设计与仿真、数字图像处理技术、数字信号处理技术、通讯系统设计与仿真、MATLAB在通讯系统设计与仿真的应用、财务与金融工程、管理与调度优化计算(运筹学)。
2.2图形用户界面简介
图形用户界面(GraphicalUserInterface,简称GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。
GUI是GraphicalUserInterface的简称,即图形用户界面,通常人机交互图形化用户界面设计经常读做“goo-ee”。
准确来说:
GUI就是屏幕产品的视觉体验和互动操作部分。
GUI是一种结合计算机科学、美学、心理学、行为学,及各商业领域需求分析的人机系统工程,强调人—机—环境三者作为一个系统进行总体设计。
这种面向客户的系统工程设计其目的是优化产品的性能,使操作更人性化,减轻使用者的认知负担,使其更适合用户的操作需求,直接提升产品的市场竞争力。
GUI即人机交互图形化用户界面设计。
纵观国际相关产业在图形化用户界面设计方面的发展现状,许多国际知名公司早已意识到GUI在产品方面产生的强大增值功能,以及带动的巨大市场价值,因此在公司内部设立了相关部门专门从事GUI的研究与设计,同业间也成立了若干机构,以互相交流GUI设计理论与经验为目的。
随着中国IT产业,移动通讯产业,家电产业的迅猛发展,在产品的人机交互界面设计水平发展上日显滞后,这对于提高产业综合素质,提升与国际同等业者的竞争能力等等方面无疑起了制约的作用。
GUI的广泛应用是当今计算机发展的重大成就之一,他极大地方便了非专业用户的使用。
人们从此不再需要死记硬背大量的命令,取而代之的是可以通过窗口、菜单、按键等方式来方便地进行操作。
而嵌入式GUI具有下面几个方面的基本要求:
轻型、占用资源少、高性能、高可靠性、便于移植、可配置等特点。
3基于MATLAB的FFT算法实现
3.1设计思想
本设计要求选取一张图片,并对图片进行灰度采集,在Matlab环境下编写基2DIT-FFT算法;
利用自己编写的算法对已采集的灰度进行FFT及IFFT进行运算,并与Matlab数字信号处理工具箱中的FFT及IFFT函数进行对比研究,验证自编算法的正确性。
3.2系统总体流程图
图3-1系统总体流程图
3.3FFT运算规律及编程思想
3.3.1图片的选取
图片的选取应有一定的原则,应选择亮暗较明显的。
这样对图片灰度进行FFT及IFFT函数时,可得到较明显的结果。
本次课设选取的图片如图3-2所示:
图3-2选取的图片
3.3.2DIT-FFT算法的基本原理
快速傅里叶变换(FFT)是为提高DFT运算速度而采用的一种算法。
对一个有限长度序列x(n)的N点的DFT为:
所以,要求N点的DFT,需要N2次的复数乘法运算,
次复数乘法运算算。
随着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满足
,M为正整数。
若N不能满足上述关系,可以将序列x(n)补零实现。
按时间抽取基2-FFT算法的基本思路是将N点序列按时间下标的奇偶分为两个N/2点序列,计算这两个N/2点序列的N/2点DFT,计算量可减小约一半;
每一个N/2点序列按照同样的划分原则,可以划分为两个N/4点序列,最后,将原序列划分为多个2点序列,将计算量大大降低。
按时间下标的奇偶将N点x(n)分别抽取组成两个N/2点序列,分别记为
和
,将x(n)的DFT转化为
的DFT的计算。
利用旋转因子的可约性,即:
用蝶形运算可表示为如图3-3所示:
图3-3蝶形图
以此类推,还可以把
按n值得奇偶分为两个序列,这样就达到了降N得目的,从而减少了运算量。
FFT对DFT的数学运算量改进:
直接采用DFT进行计算,运算量为
次复数乘法和
次复数乘法。
当采用M次FFT时,由
求得
,运算流图有M级蝶形,每一级都由N/2个蝶形运算构成,这样每一级蝶形运算都需要N/2次复数乘法和N次复数加法。
M级运算共需要复数乘法次数为
,复数加法次数为
。
当N值较大时,FFT减少运算量的特点表现的越明显。
3.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点。
应用原位计算,蝶形运算可表示成如下形式:
总结上述运算规律,可采用如下运算方法进行DIT-FFT运算。
首先读入数据,根据数据长度确定运算级数M,运算总点数
,不足补0处理。
然后对读入数据进行数据倒序操作。
数据倒序后从第1级开始逐级进行,共进行M级运算。
在进行第L级运算时,先算出该级不同旋转因子的个数
(也是该级中各个蝶形运算两输入数据的间距),再从R=0开始按序计算,直到R=B-1结束。
每个R对应的旋转因子指数
,旋转因子指数相同的蝶从上往下依次逐个运算,各个蝶的第一节点标号k都是从R开始,以
为步长,到
(可简取极值N-2)结束。
考虑到蝶形运算有两个输出,且都要用到本级的两个输入数据,故第一个输出计算完毕后,输出数据不能立即存入输入地址,要等到第二个输出计算调用输入数据完毕后才能覆盖。
这样数据倒序后的运算可用三重循环程序实现。
整个蝶形运算流程图如图3-4所示:
图3-4整个蝶形运算流程图
4MATLAB程序实现
使用MATLAB软件运行程序使得图片实现采集灰度,并对灰度进行FFT及IFFT运算。
其中程序包括自编的及系统内置的FFT、IFFT,得出图片包含原始图像、自编FFT、自编IFFT、原始图像、内置FFT、内置IFFT。
4.1MATLAB输入界面
程序在MATLAB软件M文件中输入,输入完毕无误后,即可运行得出结果。
MATLAB输入界面如图4-1所示:
图4-1MATLAB输入界面
4.2设计结果
编写程序使得实现对图片取灰度,并对灰度进行FFT及IFFT运算,得出相应的图片。
同时利用MATLAB软件系统内置的FFT及IFFT程序进行相应的运算。
在MATLABM文件中运行程序后,可得到如图4-2所示的结果。
图4-2程序运行结果
通过对比MATLAB软件中程序运行的结果(即图4-2),可看出自建FFT及IFFT程序与系统内置程序运行得出的结果不完全一致。
其中,自建程序得出的图片比内置程序得出的图片亮度较量些,并且自建FFT2函数结果图片比内置FFT2结果图片窄。
5系统人机对话界面
图形用户界面(GUI),是一种提供人机交互的工具和方法。
GUI是包含图形对象,如窗口、图标、菜单和文本等图文并茂的用户界面。
5.1界面设计
用MATLAB图形用户界面开发环境设计GUI点的一般步骤是:
1.进行界面设计。
2.设计控件属性。
3.进行M语言编程。
以本设计要求为例介绍。
第一步,该选择本图形用户界面需要的控件:
八个推按钮(Pushbutton),用来运行和退出。
六个轴对象(axes)用来显示自编的原始图像、FFT、IFFT以及内置的原始图像、FFT、IFFT。
完成人机设计界面如图5-1所示:
图5-1人机设计界面
第二步,设置控件属性。
双击组件可以设置文本框,推按钮的属性,如显示大小,名称和默认值等。
第三步,编写回调函数。
组件事件的发生是通过回调函数进行工作的。
控件设置完成后保存,然后运行GUI(操作为ctrl+T),就会进入editor窗口,加入各个控件功能的函数代码。
完成后保存即可。
第四步,运行GUI。
运行editor窗口的程序后,会弹出已经激活的人机对话界面。
系统人机对话界面如图5-2所示:
图5-2人机对话界面
5.2运行调试
运行GUI,已经弹出图5-2的系统人机对话界面,然后点击“原始图片”推按钮,根据提示选择图片,就得到自编程序的原始图像。
同理可得,点击其他推按钮可得到相应的图像。
而点击“总体”推按钮,则可得到所有的图片。
如果点击“退出”推按钮退出该人机对话界面,返回Matlab。
如图所示为点击“自编FFT”推按钮得到的只显示自编IFFT结果的图片。
图5-3自编IFFT结果显示图
如图所示为点击“总体”推按钮得到的显示所有的图片。
图5-4总体结果显示图
心得体会
本次实习的主要内容是通过用Matlab实现FFT的设计,可以实现对图片采集灰度,并进行FFT运算。
把自己编写的FFT算法与Matlab自带FFT算法进行比较。
程序运行调试时,自己选择输入图片,可以实现FFT及IFFT的图片。
在之前数字信号处理的学习以及完成实验的过程中,已经使用过Matlab,对其有了一些基础的了解和认识,通过这次的课程设计使我进一步了解了图片的灰度采集,对其进行FFT及IFFT运算,以及MATLAB及GUI的基本命令和一些基础编程语言。
让我感受到只有在了解课本知识的前提下,才能更好的应用这个工具,并且熟练的应用Matlab也可以很好的加深我对课程的理解,方便我的思维。
这次课程设计使我了解了Matlab的使用方法,提高了自己的分析和动手实践能力。
同时我相信,进一步加强对MATLAB的学习与研究对我今后的学习将会起到很大的帮助。
这次的课程设计是对本学期所学知识的一次重要巩固,使得在课堂上掌握的知识得到了真正的运用。
在学习的过程中和同学讨论,更明白了理论知识与实践的联系。
书到用时方恨少,有些知识学会是一回事,掌握是一回事,但应用起来,确实不是那么简单的,需要很多知识的融会贯通。
程序运行调试初期,曾经多次出现错误、不能产生图形等问题,但在我翻阅资料认真改正及老师同学的帮助下基本功能还是完成了,经过1个星期的上机实习,程序已得到一些完善,能完成基本的要求的功能。
最后经过努力,又深入学习了图形用户界面(GUI),完成了选做要求的人机对话界面。
学习就是一个了解,疑惑,进而解惑的过程,这次实习就是提供了这样一个发现自己知识漏洞,与同学老师探讨进行解惑的的机会。
通过这次课程设计实习,我更深刻的了解了Matlab的运用,重新复习了FFT的程序,对课本上的知识有了更深的理解,使我对数字信号处理有了系统的认知。
参考文献
[1]范寿康,DSP技术与DSP芯片,北京,电子工业出版社,2008
[2]程佩青,数字信号处理教程,北京,清华大学出版社出版,2001
[3]高西全,丁玉美等,数字信号处理,北京,电子工业出版社,2009
[4]奥本海姆,离散时间信号处理.科学出版社,2000
[5]宗孔德,胡广书.数字信号处理.清华大学出版社,1997
[6]余成波,陶红艳,数字信号处理及MATLAB实现,北京,清华大学出版社,2008
[7]曹弋,赵阳,MATLAB实用教程,北京,电子工业出版社,2007
附录IMATLAB设计程序
functionimage_process_FFT()
[filename,pathname]=uigetfile({'
*.jpg;
*.tif;
*.bmp;
*.gif'
},'
FileSelector'
);
%图片路径、文件名称
image=imread(strcat(pathname,filename));
%读取图片
ifndims(image)==3%ndims(a)表示矩阵a的维数,即length(size(a))
image=rgb2gray(image);
end
scrsz=get(0,'
ScreenSize'
figure('
position'
[00scrsz(3)-1scrsz(4)]);
set(gcf,'
Name'
'
快速傅里叶变换'
subplot(2,3,1);
imshow(image);
title('
原始图像'
subplot(2,3,4);
[r,c]=size(image);
array=image;
t=log2(r);
t1=floor(t);
%floor(x):
下取整,即舍去正小数至最近整数
t2=ceil(t);
%ceil(x):
上取整,即加入正小数至最近整数
ift1~=t2
array(2^t2,c)=0;
[r1,c1]=size(array);
t=log2(c1);
t3=floor(t);
t4=ceil(t);
ift3~=t4
array(r1,2^t4)=0;
n=r1/2;
data_col=zeros(1,n,'
double'
%按列方向计算时用到的
form=1:
n
data_col(m)=exp(-1i*2*pi*(m-1)/r1);
n=c1/2;
data_row=zeros(1,n,'
%按行方向计算时用到
data_row(m)=exp(-1i*2*pi*(m-1)/r1);
array=transform_fft2(array);
Ft=fftshift(array);
S1=log(1+abs(Ft));
subplot(2,3,2);
imshow(S1,[]);
自建FFT2函数结果'
array=transform_ifft2(array);
array=abs(array);
array=array(1:
r,1:
c);
subplot(2,3,3);
imshow(array,[]);
自建IFFT2结果'
F=fft2(image);
FC=fftshift(F);
S=log(1+abs(FC));
subplot(2,3,5)
imshow(S,[]);
内置FFT2结果'
array=ifft2(F);
array=round(abs(array));
subplot(2,3,6);
内置IFFT2结果'
return
functionarray=transform_fft2(array)
array=double(array);
[r1c1]=size(array);
forj=1:
r1
array(j,:
)=transform_fft(array(j,:
));
c1
array(:
j)=transform_fft((array(:
j)));
functionarray1=transform_fft(array)
N=length(array);
n=N/2;
w=zeros(1,n,'
w(m)=exp(-1i*2*pi*(m-1)/N);
p=log2(N);
array1=zeros(1,N,'
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
ifmod(p,2)==1
return
else
array1=array;
return
functionarray=transform_ifft2(array)
array=conj(array);
fori=1:
array(i,:
)=transform_fft(array(i,:
i)=transform_fft(array(:
i));
array=array/(r1*c1);
附录IIGUI回调函数
functionvarargout=untit
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 GUI FFT 运算
![提示](https://static.bdocx.com/images/bang_tan.gif)