数字信号处理课设基于MATLAB的FFT算法的设计

更新时间:2024-06-18 17:15:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

目 录

1前言 .............................................................. 1 2 FFT算法设计原理 .................................................. 2 3基于MATLAB的FFT算法实现与分析 ................................ 4

3.1 MATLAB简介 ................................................ 4 3.2 MATLAB中FFT算法实现程序 .................................. 6

3.2.1原图程序及分析 .......................................... 6 3.2.2灰度图程序及分析 ........................................ 7 3.2.3自建的FFT程序及分析 .................................... 8 3.2.4自建的IFFT程序及分析 ................................... 9 3.2.5内置的FFT程序及分析 ................................... 10 3.2.6内置的IFFT程序及分析 .................................. 10 3.3自建FFT与内置FFT图形及比较 ............................... 11 3.4 IFFT结果与原灰度图形及比较 ................................. 12 4 FFT算法用GUI的实现与分析 ...................................... 13

4.1 GUI简介 .................................................... 13 4.2 GUI实现FFT算法 ............................................ 14

4.2.1界面设计 ............................................... 15 4.2.2运行调试 ............................................... 16 4.3运行结果分析比较 ............................................ 17 5总结体会 ......................................................... 18 参考文献 .......................................................... 19 附录I ............................................................. 20 附录II ............................................................. 24

唐山学院课程设计

1 前言

数字信号处理(Digital Signal Processing,DSP)是一门涉及许多学科而又广泛应用于许多领域的新兴学科。20世纪60年代以来,随着计算机和信息技术的飞速发展,数字信号处理技术应运而生并得到迅速的发展。数字信号处理是一种通过使用数学技巧执行转换或提取信息,来处理现实信号的方法,这些信号由数字序列表示。在过去的二十多年时间里,数字信号处理已经应用及渗透到许多重要科学和技术领域中,尤其在通信等领域得到极为广泛的应用。

傅里叶变换在信号处理中具有十分重要的作用,但是基于离散时间的傅里叶变换具有很大的时间复杂度,根据傅里叶变换理论,对一个有限长度且长度为的离散信号,做傅里叶变换的时间复杂度为,当很大时,其实现的时间是相当惊人的比如当为时,其完成时间为(为计算机的时钟周期),故其实现难度是相当大的,同时也严重制约了DFT 在信号分析中的应用,故需要提出一种快速的且有效的算法来实现。 ??

正是鉴于DFT 极其复杂的时间复杂度,1965 年和巧妙地利用因子的周期性和对称性,提出了一个DFT 的快速算法,即快速傅里叶变换(FFT),从而使得DFT 在信号处理中才得到真正的广泛应用。

本文基于时间抽选奇偶分解,利用MATLAB 软件实现快速傅里叶变换。基于所编的FFT 源程序应用的一个实例,本文对有限长度离散时间和连续时间信号进行频谱分析。

DFT是一种应用广泛的数学变换工具,MATLAB是一款功能强大的科学计算语言。MATLAB提供的fft函数解决了DFT的快速计算问题,但由于它是内建函数而不能了解到软件实现的过程。文章以按时间抽取的基2FFT算法为例,根据快速傅里叶变换的原理和规律,绘出了算法实现的程序框图,列出了MATLAB环境下软件实现的程序,建立了从算法理论到程序实现的完整概念。

在信号处理中,DFT(离散傅里叶变换)的计算具有举足轻重的地位。但是基于其复杂的计算,直接应用起来十分麻烦,基于此,本文利用MATLAB 软件对有限长度信号的DFT 进行改进,提出FFT(快速傅里叶变换),并利用FFT 对所给连续时间和离散时间信号做了频谱分析。

1

唐山学院课程设计

2 FFT算法设计原理

快速傅里叶变换(FFT)是为提高DFT运算速度而采用的一种算法。 对一个有限长度序列x(n)的N点的DFT为: nkX?k???x?n?WN,k?0,1,2,...,N?1n?0N?11x?n??N ?X?k?Wk?0N?1?nkN,n?0,1,2,...,N?1所以,要求N点的DFT,需要N2的复数乘法运算,N?(N?1)次复数乘法运算。随着N的增加,运算量将急剧增加,而在实际问题中,N往往是较大的,如当N=1024时,完成复数乘法和复数加法的次数分别为百万以上,无论是用通用计算机还是用DSP芯片,都需要消耗大量的时间,不能满足实时的要求,不适合于对实时处理要求高的场合。为了能实时处理DFT,要想减少DFT的运算量可以有两个途径:第一是降N,N的值减小了,运算量就减少了;第二是利用旋转因子的周期性,对称性和可约性。利用这两个途径实现DFT的快速傅里叶变换(FFT),FFT算法基本上可分为按时间抽取的FFT算法(FFT)和按频率抽取的FFT算法(FFT)。

旋转因子的性质: 周期性 共轭对称性 可约性

kn(k?N)nk(n?N)WN?WN?WNkn(?k)n*k(?n)*WN?[WN]?[WN]mknWNkn?WmN,/mWNkn?WNkn/m本次课设要求用用基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的计算。

2

唐山学院课程设计

??x(2r)?x1(r)??,x(2r?1)?x2(r)?nkX?k???x?n?WNn?0N?2N?1r?0,1,??,N?12?n?0,2,4...N?12?x?n?WnkN?n?1,3,5...N?12?x?n?WN?1nkNr?0,1N?12?2rkx?2r?WN?r?0,1N?12??x?2r?1?WN2r?1?kr?0,1?x?r?W12rkN?r?0,1?x?r?W?22r?1?kN利用旋转因子的可约性,即: WN

用蝶形运算可表示为如图2-1所示:

图2-1 DIT-FFT蝶形运算流图符号

2rk?e2??j2rkN?j?e2?rkN2rk?WN2rkkrkXk?xrW?WxrW????????1NN2N

r?02r?0k?X(?WNX(k),0?k?N?11k)2N?12N?122以此类推,还可以把x1(n)和x2(n)按n值得奇偶分为两个序列,这样就达到了降N得目的,从而减少了运算量。FFT对DFT的数学运算量改进:

直接采用DFT进行计算,运算量为N2次复数乘法和N?(N?1)次复数乘法。 当采用M次FFT时,由N?2求得M=logN,运算流图有M级蝶形,每一级都由N/2个蝶形运算构成,这样每一级蝶形运算都需要N/2次复数乘法和N次复数加法。M级运算共需要复数乘法次数为C?(N?M)/2,复数加法次数为

C?N?M。

M当N值较大时,FFT减少运算量的特点表现的越明显。

3

唐山学院课程设计

3 基于MATLAB的FFT算法实现与分析

3.1 MATLAB简介

MATLAB是“矩阵实验室”(MATrix LLABoratoy)的缩写,是目前应用极为广泛的一种集科学运算、程序运算、高质量的图形可视化与界面设计,以便于与其它程序和语言接口的软件。目前,MATLAB已成为自动控制、数字信号处理、动态系统仿真等诸多学科极有效的工具。

MATLAB启动后,产生的工作环境界面如下图3-1所示,它包含一个工作栏、三个区域、四个工作窗口。中四个工作窗口分别为指令窗口(Command Windows)、指令历史窗口(commond history)、工作空间窗口(workspace)和当前路径窗口(current directory)。

图3-1 MATLAB默认的用户界面

图3-1是MATLAB启动后桌面布置方式的默认设置。

MATLAB的指令窗口(Command Windows)是MATLAB十分重要的做成部分,是用户与MATLAB交互的工具。MATLAB的功能是通过大量的函数或者指

图3-2 MATLAB的指令窗口

4

唐山学院课程设计

令来实现的,这些函数有些可以通过MATLAB的图形用户界面直接使用,而大多数函数是通过MATLAB的指令窗口,由用户直接键入相应的函数或命令来调用。

在MATLAB指令历史窗(commond history)中主要记录了在MATLAB窗中输入的所有指令,还可以被再次执行。它们不仅能够复制到MATLAB的指令窗口,还可以通过这些指令的记录直接创建M文件。

图3-3 MATLAB的指令历史窗

MATLAB中工作空间(workspace)是运行MATLAB的函数或指令所生成的所有变量和MATLAB常量构成的空间。工作空间和指令窗的区别是,指令窗是一个实体,他是用户输入函数和程序的一个窗体,大多数变量都是通过这个窗体产生的,保留了指令窗运行的所有变量。工作空间窗就是显示目前保存在内存中的MATLAB的数学结构、字节数、变量名,以及类型的窗口。

图3-4 MATLAB的工作空间窗口

可以在指令窗中执行pathtool,或者在MATLAB桌面、指令窗的菜单中选择File|Path打开路径设置对话框,即当前路径(current directory)窗。其主要作用是帮助用户组织管理当前路径下的M文件,并且通过该工具,能够运行、编辑相应的文件,加载MATLAB数据文件等,这些操作都可以通过对应的右键快捷

5

唐山学院课程设计

菜单完成。

图3-5 当前路径窗

M文件编辑/调制窗是一个及编辑和调试两种功能于一体的工作环境。如果一个程序稍复杂一些,则需要采用文件方式,把程序写成一个由多条语句构成的文件,就需要用到文本编辑器。在MATLAB文本编辑器窗口中建立的文件默认为.m文件。

图3-6 MATLAB的M文件窗口

以上为MATLAB功能简介方便对此软件的了解,下属程序就是采MATLAB进行运算,以实现想要的结果。

3.2 MATLAB中FFT算法实现程序

3.2.1 原图程序及分析

实现读取原始图像并且显示出来的程序段如下: [filename,pathname]=uigetfile({'*.jpg;*.tif;*.bmp;*.gif' },' File Selector');

image=imread(strcat(pathname,filename)); scrsz=get(0,'ScreenSize');

6

唐山学院课程设计

figure('position',[0 0 scrsz(3)-1 scrsz(4)]); set(gcf,'Name','快速傅里叶变换'); subplot(2,4,1); imshow(image); title('原始图像');

MATLAB处理结果如下:

图3-7 原始图像

上图是通过选择图片,并将图片显示出来的原始图像。

3.2.2 灰度图程序及分析

实现原始图像变成灰度图像并且显示出来的程序段如下: if ndims(image)==3 image=rgb2gray(image); end

scrsz=get(0,'ScreenSize');

%figure('position',[0 0 scrsz(3)-1 scrsz(4)]); set(gcf,'Name','快速傅里叶变换'); subplot(2,4,2); imshow(image); title('灰度图像');

MATLAB处理结果如下:

7

唐山学院课程设计

图3-8 灰度图像

上图是通过原始图像经过灰度处理变成的灰度图像。

3.2.3 自建的FFT程序及分析

自编的FFT算法程序如下: function array=transform_fft2(array) array=double(array); [r1 c1]=size(array); for j=1:r1

array(j,:)=transform_fft(array(j,:)); end for j=1:c1

array(:,j)=transform_fft((array(:,j))); end

利用自编的FFT算法实现对灰度图像处理的程序段如下: array=transform_fft2(array); Ft=fftshift(array); S1=log(1+abs(Ft)); subplot(2,4,3); imshow(S1,[]);

title('自建FFT2函数结果'); MATLAB处理结果如下:

8

唐山学院课程设计

图3-9 自建FFT结果

上图是利用自编FFT算法实现对图像的FFT变换处理结果。

3.2.4 自建的IFFT程序及分析

自编的FFT算法程序段如下: function array=transform_ifft2(array) array=conj(array); [r1,c1]=size(array); for i=1:r1

array(i,:)=transform_fft(array(i,:)); end for i=1:c1

array(:,i)=transform_fft(array(:,i)); end

array=array/(r1*c1);

利用自编的IFFT算法实现对灰度图像处理的程序段如下: array=transform_ifft2(array); array=abs(array); array=array(1:r,1:c); subplot(2,4,4); imshow(array,[]); title('自建IFFT2结果'); MATLAB处理结果如下:

9

唐山学院课程设计

4.2.1 界面设计

用MATLAB图形用户界面开发环境设计GUI点的一般步骤是: 第一步,该选择本图形用户界面需要的控件: 9个推按钮(Push button),用来运行和退出。

8个轴对象(axes)用来显示两个原图,两个灰度图,自建FFT结果图,自建IFFT结果图,内置FFT结果图和内置IFFT结果图。

完成人机设计界面如下图所示:

图4-5 完成人机界面

第二步,设置控件属性:

双击组件可以设置文本框,推按钮的属性,如显示大小,名称和默认值等。 第三步,编写回调函数。

组件事件的发生是通过回调函数进行工作的。控件设置完成后保存,然后运行GUI(操作为ctrl+T),就会进入editor窗口,加入各个控件功能的函数代码。完成后保存即可。

第四步,运行GUI。

运行editor窗口的程序后,会弹出已经激活的人机对话界面。 系统人机对话界面如图4-6所示。

15

唐山学院课程设计

图4-6 系统人机对话界面

pushbutton1的作用是实现输出原图,pushbutton2的作用是实现输出灰度图,pushbutton3的作用是实现输出自建FFT结果,pushbutton4的作用是实现输出自建IFFT结果,pushbutton5的作用是实现输出原图,pushbutton6的作用是实现输出灰度图,pushbutton7的作用是实现输出内置FFT结果,pushbutton8的作用是实现输出内置IFFT结果。

4.2.2 运行调试

运行GUI,已经弹出图4-6的系统人机对话界面,根据推按钮就会得到本设计的要求。运行结果如图4-7所示。如果运行结束,可以通过点击“退出”推按钮退出该人机对话界面,返回MATLAB。

图4-7 GUI运行结果

按下原图按钮能在axes1中输出原图,按下原图按钮能在axes2中输出灰度

16

唐山学院课程设计

图,按下原图按钮能在axes3中输出自建FFT结果图,按下原图按钮能在axes4中输出自建IFFT结果图,按下原图按钮能在axes5中输出原图,按下原图按钮能在axes6中输出灰度图,按下原图按钮能在axes7中输出内置FFT结果图,按下原图按钮能在axes8中输出内置IFFT图,按下退出则退出界面。

4.3 运行结果分析比较

比较利用自建FFT和MATLAB自带的FFT算法实现对灰度图像处理两图可以看出两图大致相同稍有不同。自建的FFT结果比自带的图片颜色稍深,而且自建的FFT结果中的频域图像与自带FFT结果频域图像稍有不同。

比较IFFT结果与原灰度图两图可以看出FFT结果和原灰度图稍有不同,而且没有原图的清晰度高,但是能够基本正确的经FFT后反变换回原图,实现了时域变换到频域又边换到时域的过程。

17

唐山学院课程设计

5总结体会

这次的设计,给我的印象很深。刚拿到课程设计的题目时侯感觉这次课程设计的内容不太难,但是当开始进行设计的时候感觉原理比较简单,但是程序的实现比较难。后来在查了一些资料和计算后对各个参数的选择有了大致的了解,然后在老师的帮助下经过多次的的修改终于设计出比较满意的作品。

通过本次课程设计,对本课题有了一定的了解。但是,在对该课题有一定的了解的前提下,也发现了很多问题。认识到理论与实践之间的差距,联系实际的应用去理解只是比一大堆理论来的直接与清晰明了。在设计中难免会遇到很多学习中不会注意到的问题,比如说在FFT算法设计的过程中,根据参考考资料编写的算法程序总是运行不正确,后来在老师的指导下发现应该对二维图像进行编写程序,在好事的帮助下终于做出了比较好的设计。

在软件MATLAB平台上所做的GUI界面,可以清楚地看到设计的结果。利用MATLAB软件可以对DSP许多试验进行实现,且具有组建快捷、方便、波形图像直观、效果理想等优点。

做课程设计同时也是对课本知识的巩固和加强,由于课本上的知识太多,平时课间的学习并不能很好的理解和运用,而且考试内容有限,所以在这次课程设计中,我们了解了很多MATLAB功能,并且对于其在MATLAB的使用有了更多的认识。认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准。所以这个课程设计对我们的作用是非常大的,同时通过这次课程设计使我懂得了理论与实际结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考能力。此次课程设计学到了许多可能学不到的东西,比如多利思考解决问题的能力,出现差错的随机应变,和与人合作共同提高,我们都受益匪浅,今后的制作应该更加轻松。最后感谢指导老师和同学给我的帮助。

18

唐山学院课程设计

参考文献

[1] 苏金明, 张莲花, 刘波. MATLAB工具箱应用[M]. 电子工业出版社 [2] 奥本海姆. 离散时间信号处理[M]. 科学出版社, 2000 [3] 宗孔德, 胡广书. 数字信号处理[M]. 清华大学出版社, 1997 [4] 程佩青. 数字信号处理教程[M]. 北京: 清华大学出版社出版, 2001 [5] 高西全, 丁玉美等. 数字信号处理[M]. 北京: 电子工业出版社, 2009 [6] 陈杰. Matlab宝典[M]. 电子工业出版社

19

唐山学院课程设计

附录I

function image_process_FFT()

[filename, pathname]=uigetfile({'*.jpg;*.tif;*.bmp;*.gif' },'File Selector'); image=imread(strcat(pathname,filename)); scrsz=get(0,'ScreenSize');

figure('position',[0 0 scrsz(3)-1 scrsz(4)]); set(gcf,'Name','快速傅里叶变换'); subplot(2,4,1); imshow(image); title('原始图像'); subplot(2,4,5); imshow(image); title('原始图像'); if ndims(image)==3

image=rgb2gray(image); end

scrsz=get(0,'ScreenSize'); set(gcf,'Name','快速傅里叶变换'); 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);

20

唐山学院课程设计

if t1~=t2

array(2^t2,c)=0; end

[r1,c1]=size(array); t=log2(c1); t3=floor(t); t4=ceil(t); if t3~=t4

array(r1,2^t4)=0; end

[r1,c1]=size(array); n=r1/2;

data_col=zeros(1,n,'double'); %按列方向计算时用到的 for m=1:n

data_col(m)=exp(-1i*2*pi*(m-1)/r1); end n=c1/2;

data_row=zeros(1,n,'double'); %按行方向计算时用到 for m=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,3); imshow(S1,[]);

title('自建FFT2函数结果'); array=transform_ifft2(array); array=abs(array); array=array(1:r,1:c);

21

唐山学院课程设计

subplot(2,4,4); imshow(array,[]); title('自建IFFT2结果'); F=fft2(image); FC=fftshift(F); S=log(1+abs(FC)); subplot(2,4,7) imshow(S,[]); title('内置FFT2结果'); array=ifft2(F);

array=round(abs(array)); subplot(2,4,8); imshow(array,[]); title('内置IFFT2结果'); return

function array1=transform_fft(array) N=length(array); n=N/2;

w=zeros(1,n,'double'); for m=1:n

w(m)=exp(-1i*2*pi*(m-1)/N); end p=log2(N);

array1=zeros(1,N,'double'); for q=1:p t1=2^(q-1); t2=2^(p-1); for k=0:(t2/t1-1) for j=0:(t1-1) if mod(q,2)==1

22

唐山学院课程设计

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

if mod(p,2)==1 return else

array1=array; return end

function array=transform_ifft2(array) array=conj(array); [r1,c1]=size(array); for i=1:r1

array(i,:)=transform_fft(array(i,:)); end for i=1:c1

array(:,i)=transform_fft(array(:,i)); end

array=array/(r1*c1);

23

唐山学院课程设计

附录II

function varargout = untitled2(varargin) gui_Singleton = 1;

gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ...

'gui_OpeningFcn', @untitled2_OpeningFcn, ... 'gui_OutputFcn', @untitled2_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1})

gui_State.gui_Callback = str2func(varargin{1}); end if nargout

[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else

gui_mainfcn(gui_State, varargin{:}); end

function untitled2_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; guidata(hObject, handles);

function varargout = untitled2_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output;

function pushbutton1_Callback(hObject, eventdata, handles)

[filename, pathname]=uigetfile({'*.jpg;*.tif;*.bmp;*.gif' },'File Selector'); image=imread(strcat(pathname,filename)); scrsz=get(0,'ScreenSize'); set(gcf,'Name','快速傅里叶变换'); axes(handles.axes1); imshow(image);

24

唐山学院课程设计

title('原始图像');

function pushbutton2_Callback(hObject, eventdata, handles)

[filename, pathname]=uigetfile({'*.jpg;*.tif;*.bmp;*.gif' },'File Selector'); image=imread(strcat(pathname,filename)); if ndims(image)==3

image=rgb2gray(image); end

scrsz=get(0,'ScreenSize'); set(gcf,'Name','快速傅里叶变换'); axes(handles.axes2); imshow(image); title('灰度图像');

function pushbutton3_Callback(hObject, eventdata, handles)

[filename, pathname]=uigetfile({'*.jpg;*.tif;*.bmp;*.gif' },'File Selector'); image=imread(strcat(pathname,filename)); if ndims(image)==3

image=rgb2gray(image); end

scrsz=get(0,'ScreenSize'); set(gcf,'Name','快速傅里叶变换'); [r,c]=size(image); array=image; t=log2(r); t1=floor(t); t2=ceil(t); if t1~=t2

array(2^t2,c)=0; end

[r1,c1]=size(array); t=log2(c1);

25

唐山学院课程设计

t3=floor(t); t4=ceil(t); if t3~=t4

array(r1,2^t4)=0; end

[r1,c1]=size(array); n=r1/2;

data_col=zeros(1,n,'double'); %按列方向计算时用到的 for m=1:n

data_col(m)=exp(-1i*2*pi*(m-1)/r1); end n=c1/2;

data_row=zeros(1,n,'double'); %按行方向计算时用到 for m=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)); axes(handles.axes3); imshow(S1,[]);

title('自建FFT2函数结果'); function array=transform_fft2(array) array=double(array); [r1 c1]=size(array); for j=1:r1

array(j,:)=transform_fft(array(j,:)); end for j=1:c1

array(:,j)=transform_fft((array(:,j)));

26

唐山学院课程设计

end

function array1=transform_fft(array) N=length(array); n=N/2;

w=zeros(1,n,'double'); for m=1:n

w(m)=exp(-1i*2*pi*(m-1)/N); end p=log2(N);

array1=zeros(1,N,'double'); for q=1:p t1=2^(q-1); t2=2^(p-1); for k=0:(t2/t1-1) for j=0:(t1-1) if mod(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

if mod(p,2)==1

27

唐山学院课程设计

return else

array1=array; return end

function pushbutton4_Callback(hObject, eventdata, handles)

[filename, pathname]=uigetfile({'*.jpg;*.tif;*.bmp;*.gif' },'File Selector'); image=imread(strcat(pathname,filename)); if ndims(image)==3

image=rgb2gray(image); end

scrsz=get(0,'ScreenSize'); set(gcf,'Name','快速傅里叶变换'); [r,c]=size(image); array=image; t=log2(r); t1=floor(t); t2=ceil(t); if t1~=t2

array(2^t2,c)=0; end

[r1,c1]=size(array); t=log2(c1); t3=floor(t); t4=ceil(t); if t3~=t4

array(r1,2^t4)=0; end

[r1,c1]=size(array); n=r1/2;

28

唐山学院课程设计

data_col=zeros(1,n,'double'); %按列方向计算时用到的 for m=1:n

data_col(m)=exp(-1i*2*pi*(m-1)/r1); end n=c1/2;

data_row=zeros(1,n,'double'); %按行方向计算时用到 for m=1:n

data_row(m)=exp(-1i*2*pi*(m-1)/r1); end

array=transform_fft2(array); array=transform_ifft2(array); array=abs(array); array=array(1:r,1:c); axes(handles.axes4); imshow(array,[]); title('自建IFFT2结果'); return

function array=transform_fft2(array) array=double(array); [r1 c1]=size(array); for j=1:r1

array(j,:)=transform_fft(array(j,:)); end for j=1:c1

array(:,j)=transform_fft((array(:,j))); end

function array1=transform_fft(array) N=length(array); n=N/2;

w=zeros(1,n,'double');

29

唐山学院课程设计

for m=1:n

w(m)=exp(-1i*2*pi*(m-1)/N); end p=log2(N);

array1=zeros(1,N,'double'); for q=1:p t1=2^(q-1); t2=2^(p-1); for k=0:(t2/t1-1) for j=0:(t1-1) if mod(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

if mod(p,2)==1 return else

array1=array; return end

30

唐山学院课程设计

function array=transform_ifft2(array) array=conj(array); [r1,c1]=size(array); for i=1:r1

array(i,:)=transform_fft(array(i,:)); end for i=1:c1

array(:,i)=transform_fft(array(:,i)); end

array=array/(r1*c1);

function pushbutton5_Callback(hObject, eventdata, handles)

[filename, pathname]=uigetfile({'*.jpg;*.tif;*.bmp;*.gif' },'File Selector'); image=imread(strcat(pathname,filename)); scrsz=get(0,'ScreenSize'); set(gcf,'Name','快速傅里叶变换'); axes(handles.axes5); imshow(image); title('原始图像');

function pushbutton6_Callback(hObject, eventdata, handles)

[filename, pathname]=uigetfile({'*.jpg;*.tif;*.bmp;*.gif' },'File Selector'); image=imread(strcat(pathname,filename)); if ndims(image)==3 image=rgb2gray(image); end

scrsz=get(0,'ScreenSize'); set(gcf,'Name','快速傅里叶变换'); axes(handles.axes6); imshow(image); title('灰度图像');

function pushbutton7_Callback(hObject, eventdata, handles)

31

唐山学院课程设计

[filename, pathname]=uigetfile({'*.jpg;*.tif;*.bmp;*.gif' },'File Selector'); image=imread(strcat(pathname,filename)); if ndims(image)==3

image=rgb2gray(image); end

scrsz=get(0,'ScreenSize'); set(gcf,'Name','快速傅里叶变换'); [r,c]=size(image); array=image; t=log2(r); t1=floor(t); t2=ceil(t); if t1~=t2

array(2^t2,c)=0; end

[r1,c1]=size(array); t=log2(c1); t3=floor(t); t4=ceil(t); if t3~=t4

array(r1,2^t4)=0; end

[r1,c1]=size(array); n=r1/2;

data_col=zeros(1,n,'double'); %按列方向计算时用到的 for m=1:n

data_col(m)=exp(-1i*2*pi*(m-1)/r1); end n=c1/2;

data_row=zeros(1,n,'double'); %按行方向计算时用到

32

唐山学院课程设计

for m=1:n

data_row(m)=exp(-1i*2*pi*(m-1)/r1); end

F=fft2(image); FC=fftshift(F); S=log(1+abs(FC)); axes(handles.axes7); imshow(S,[]); title('内置FFT2结果');

function pushbutton8_Callback(hObject, eventdata, handles)

[filename, pathname]=uigetfile({'*.jpg;*.tif;*.bmp;*.gif' },'File Selector'); image=imread(strcat(pathname,filename)); if ndims(image)==3

image=rgb2gray(image); end

scrsz=get(0,'ScreenSize'); set(gcf,'Name','快速傅里叶变换'); [r,c]=size(image); array=image; t=log2(r); t1=floor(t); t2=ceil(t); if t1~=t2

array(2^t2,c)=0; end

[r1,c1]=size(array); t=log2(c1); t3=floor(t); t4=ceil(t); if t3~=t4

33

唐山学院课程设计

array(r1,2^t4)=0; end

[r1,c1]=size(array); n=r1/2;

data_col=zeros(1,n,'double'); %按列方向计算时用到的 for m=1:n

data_col(m)=exp(-1i*2*pi*(m-1)/r1); end n=c1/2;

data_row=zeros(1,n,'double'); %按行方向计算时用到 for m=1:n

data_row(m)=exp(-1i*2*pi*(m-1)/r1); end

F=fft2(image); array=ifft2(F);

array=round(abs(array)); axes(handles.axes8); imshow(array,[]); title('内置IFFT2结果'); return

function pushbutton9_Callback(hObject, eventdata, handles) clc; close all; close(gcf);

34

本文来源:https://www.bwwdw.com/article/29q3.html

Top