数字信号处理课程设计基于matlab的fft算法的设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

唐山学院
数字信号处理课程设计
题目基于MATLAB的FFT算法的设计
系(部) 智能与信息工程学院
班级13电信本1班
姓名
学号
指导教师
2016 年 2 月29 日至 3 月11 日共 2 周
2016年 3 月11 日
目录
1 引言 (1)
2 设计任务和原理 (2)
设计任务 (2)
设计原理 (2)
3软件介绍 (5)
软件概述 (5)
界面基本操作 (5)
3.3 MATLAB主要特点 (8)
4 MATLAB程序实现 (9)
(9)
程序分析 (9)
原始图像程序及分析 (9)
灰度图像程序及分析 (10)
自建的FFT程序及分析 (11)
自建的IFFT程序及分析 (12)
内置的FFT程序及分析 (12)
内置的IFFT程序及分析 (13)
程序运行结果 (13)
................................................................................................. 错误!未定义书签。

4.5 IFFT结果与原灰度图形及比较 (14)
5 GUI界面 (15)
5.1 GUI简介 (16)
界面设计 (16)
运行调试 (19)
6总结体会 (20)
参考文献 (21)
附录Ⅰ FFT算法的程序 (22)
附录Ⅱ GUI设计的程序 (26)
1 引言
数字信号处理(Digital Signal Processing,DSP)是一门涉及许多学科而又广泛应用于许多领域的新兴学科,是一种通过使用数学技巧执行转换或提取信息,来处理显示信号的方法,这些信号由数字序列表示。

随着信息时代,数字时代的到来,数字信号处理已经成为一门极其重要的学科和技术领域。

以DSP为核心芯片的处理系统日益变成了数字信号处理系统的主流。

它广泛用于电子信息、通信、图像处理、语音处理、生物医学、自动控制、地质探测等领域,受到工程设计和使用人员的青睐。

FFT(Fast Fourier Transformation),即为快速傅立叶变换,是离散傅立叶变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。

它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步,在实际应用中,FFT是最常见的数字信号处理算法,它在各种数字信号处理系统中扮演重要的角色。

在信号处理过程中。

频域分析往往比时域分析方便和高效,FFT 是时域和频域转换的基本运算。

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

DFT是一种应用广泛的数学变换工具,MATLAB是一款功能强大的科学计算语言。

MATLAB提供的FFT函数解决了DFT的快速计算问题,但由于它是内建函数而不能了解到软件实现的过程。

本文以按时间抽取的基2FFT算法为例,根据快速傅立叶变换的原理和规律,绘出了算法实现的程序框图,列出了MATLAB环境下软件实现的程序,建立了从算法理论到程序实现的完整概念。

在信号处理中,DFT(离散傅立叶变换)的计算具有举足轻重的地位。

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

图像信号的处理主要是用MATLAB作为工具平台,设计中涉及到图像的选取、存储和读取、灰度处理、FFT变换、IFFT变换、频谱分析。

通过数字信号处理课程的理论知识的综合运用,以及选做系统人机对话界面,用GUI界面完成人机交互使用,从实践上初步实现对数字信号的处理。

2 设计任务和原理
设计任务
所设计的FFT算法应完成以下功能:
(1)在MATLAB环境下编写FFT算法(不调用系统现有函数);
(2)实现对选定图片进行FFT计算、还原(IFFT计算),并与系统FFT函数做对比,进行分析;
(3)设计GUI界面。

设计要求:
1.根据题目要求进行算法GUI总体设计。

2.完成算法具体部分的设计。

(1)算法原理图。

(2)算法原理说明。

3.算法程序的设计。

(1)对选定图片进行自编FFT计算与还原,并与自带函数进行对比;
(2)完整源程序。

2.2 设计原理
对于有限长序列x(n),若要求其N点的傅里叶变换(DFT)需要经过2N次复数乘法运算和N*(N-1)次复数加法运算。

随着N的增加,运算量将急剧增加,而在实际问题中,N往往是较大的,如当N=1024时,完成复数乘法和复数加法的次数分别为百万以上,无论是用通用计算机还是用DSP芯片,都需要消耗大量的时间和机器内存,不能满足实时的要求。

因此,DFT的这种运算只能进行理论上的计算,不适合对实时处理要求高的场合。

因此,研究作为DSP的快速算法的FFT是相当必要的,快速傅里叶变换(FFT)是为提高DFT运算速度而采用的一种算法,快速算法的种类很多,而且目前仍在改进和提高,它是根据离散傅里叶变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。

基于本学期所学的DIT-FFT的运算规律和编程思想以及MATLAB的学习和使用,本课设要求在MATLAB环境下编写基-2DIT-FFT算法实现对离散信号的快速傅里叶变换,再与MATLAB软件自带的FFT函数实现对离散信号的傅里叶变换进行比较,如果得到的频谱相同,那么我们编写的程序就是正确的。

其中离散信号是自己选取的图像信号,用MATLAB处理得到频谱图以及选用系统人机对话界面,用GUI界面完成人机交互。

快速傅立叶变换(FFT)是为提高DFT运算速度而采用的一种算法。

对一个有限长度序列x(n)的N 点的DFT 为:
10X k (n),0,1,2,...,N 1N nk N n x k W -==-∑()=
101X (k),n 0,1,2,...,N 1N nk N k x N W --==-∑(n )=
所以,要求N 点的DFT ,需N 2的复数乘法运算,)1(*-N N 次复数乘法运算。

随着N 的增加,运算量将急剧增加,而在实际问题中,N 往往是较大的,如当N=1024时,完成复数乘法和复数加法的次数分别为百万以上,无论是用通用计算机还是用DSP 芯片,都需要消耗大量的时间,不能满足事实的要求,不适合对实时处理要求高的场合。

为了能实时处理DFT ,要想减少DFT 的运算量可以有两个途径:一是降N ,N 的值减小了,运算量就减少了;第二是利用旋转因子的周期性,对称性和可约性。

利用这两个途径实现DFT 的快速傅立叶变换(FFT ),FFT 算法基本上可分为按时间抽取的FFT 算法(FFT )和按频率抽取的FFT 算法(FFT )。

旋转因子的性质:
周期性 (k N)n (n N)N kn k N
N W W W ++== 共轭对称性 (k)n (n)N ]*[]*[kn k N N
W W W --== 可约性 W km
mnk N nN W =,//W km mk n
N N n W = 本次课设要求用基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点序列,分别记为x 1(n)和x 2(n),将的DFT 转化为x 1(n)和x 2(n)的DFT 的计算。

12
,,1,0,)()12()()2(21-=⎭⎬⎫=+=N r r x r x r x r x
利用旋转因子的可约性,即:
用蝶形运算可表示为如图2-1所示:
以此类推,还可以按n 值的奇偶分为两个序列,这样就达到了降N 的目的,从而减少了运算量。

FFT 和DFT 的数学运算量改进。

直接采用DFT 进行运算,运算量为2N 次复数乘法和)1(-*N N 次复数乘法。

当采用M 次FFT 时,由M N 2=求得log M N =,运算流图有M 级蝶形,每一级都由N/2个蝶形运算构成,这样每一级蝶形运算都需要N/2次复数乘法和N 次复数加法。

M 级运算共需要复数乘法次数为2/)*(M N C =,复数加法次数为M N C *=。

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

()()()()()()()()()()1N
21N N 0,2,4...
1,3,5...1122212N N 0,1
0,111222121N 2N 0,10,1
221N nk n N N nk
nk n n N N r k rk r r N N r k rk r r X k x n W x n W x n W x r W x r W x r W x r W -=--==--+==--+====
+=
++=+∑∑∑∑∑∑∑2j 2j 2222e e rk N rk rk rk N N N W W ππ--===()()()11221222
0012
,01N N rk
k rk N N N r r k N X k x r W
W x r W X k W X k N --===+=+≤≤-∑∑()(k)图2-1 DIT-FFT 蝶形运算流图符号
3软件介绍
3.1 软件概述
MATLAB是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks 公司出品的商业数学软件,主要包括MATLAB和Simulink两大部分。

MATLAB主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。

它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言的编辑模式,代表了当今国际科学计算软件的先进水平。

MATLAB在数学类科技应用软件中在数值计算方面首屈一指。

MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。

MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C、FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB 成为一个强大的数学软件。

用户可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户可以直接进行下载就可以用。

界面基本操作
1启动MATLAB
双击桌面上的MATLAB快捷方式或选择程序菜单中的MATLAB选项,即可进入。

启动打开界面如图3-1所示:
图3-1 MATLAB启动界面
2工作环境界面
打开界面后,产生的工作环境界面如图3-2所示,它包含一个工作栏、三个区域、四个工作窗口。

其中四个工作窗口分别为指令窗口(Command Windows)、指令历史窗口(Command history)、工作空间窗口(workspace)和当前路径窗口(current directory)。

图3-2 MATLAB默认的用户界面
MATLAB的指令窗口(Command Windows)如图3-3所示,是用户与MATLAB交互的工具。

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

图3-3 MATLAB的指令窗口
MATLAB指令历史窗口(Command history)如图3-4所示,主要记录了在MATLAB窗口中输入的所有指令,还可以被再次执行。

它们不仅可以能够复制到MATLAB的指令窗口,还可以通过这些指令的记录直接创建M文件。

图3-4 MATLAB的指令历史窗
MATLAB中工作区间(workspace)如图3-5所示,是运行MATLAB的函数或指令所生成的所有变量和MATLAB常量构成的空间。

工作空间和指令窗口的区别是,指令窗口是一个实体,是用户输入函数和程序的一个窗体,大多数变量是通过这个窗体产生的,保留了指令窗口运行的所有变量。

工作区间窗口是显示目前保存在内存中的MATLAB的数字结构、字节数、变量名,以及类型的窗口。

图3-5 MATLAB的工作空间窗口
可以在指令窗口中执行pathtool,或者在MATLAB桌面、指令窗的菜单中选择File|Path打开路径设置对话框,即当前路径(current directory)窗。

其主要作用是帮助用户组织管理当前路径下的M文件,并且通过该工具,能够运行、编辑相应的文件,加载MATLAB数据文件等,这些操作都可以通过对应的右键快捷菜单完成。

M文件编译/调制窗是一个集编译和调试两种功能于一体的工作环境。

如果一个程序稍复杂一些,则需要采用文件方式,把程序写成一个由多条语句构成的文件,就需要用到文本编译器。

在MATLAB文本编译器窗口中建立的文件默认为.m文件,如图3-6所示。

图3-6 MATLAB的M文件窗口
3.3 MATLAB主要特点
(1)语言简洁紧凑,使用方便灵活,库函数极其丰富。

(2)运算符丰富。

(3)具有结构化的控制语句(如for循环、break 语句和if 语句)和面向对象编程的特性。

(4)语法限制不严格,程序设计自由度大。

(5)图形功能强大。

(6)功能强大的工具箱。

(7)源程序的开放性。

4 MATLAB程序实现
程序流程图
本设计程序共包括五部分:读取原图,通过调用子程序实现的自行编写FFT 程序,通过调用子程序实现的自行编写IFFT程序,系统FFT程序,系统IFFT 程序。

具体程序流程图如图4-1所示:
图4-1 程序流程图
从流程图可以看出此程序通过分模块实现了设计任务。

程序分析
4.2.1 原始图像程序及分析
实现读取原始图像并且显示出来的程序段如下:
[filename,pathname]=uigetfile({'*.jpg;*.bmp;*.gif},'File Selector');
image=imread(strcat(pathname,filename));
scrsz=get(0,'ScreenSize');
figure('position',[0 0 scrsz(3)-1 scrsz(4)]);
set(gef,'Name',‘快速傅立叶变换’);
subplot(2,4,1);
imshow(image);
title(’原始图像’);
MATLAB处理结果如图4-2所示:
图4-2 原始图像
4.2.2 灰度图像程序及分析
实现原始图像变成灰度图像并且显示出来的程序段如下:if ndims(image)==3
image=rgb2gray(image);
end
scrsz=get(0,'ScreenSize');
%figure('position',[0 0 scrsz(3)-1 scrsz(4)]);
set(gef,'Name',‘快速傅立叶变换’);
subplot(2,4,2);
imshow(image);
title(’灰度图像’);
subplot(2,4,6);
imshow(image);
title(’灰度图像’);
MATLAB处理结果如图4-3所示:
图4-3 灰度图像
利用自编的FFT算法实现对灰度图像处理的程序段如下:array=transform_fft2(array);
Ft=fftshift(array);
S1=log(1+abs(Ft));
axes(handles.axes3);
imshow(S1,[]);
tltle('自建FFT2函数结果');
MATLAB处理结果如图4-4所示:
图4-4 自建FFT2结果
4.2.4自建的IFFT程序及分析
利用自编的IFFT算法实现对灰度图像处理的程序段如下:
array=transform_ifft2(array);
array=abs(array);
array=array(1:r,1:c);
axes(handles.axes4);
imshow(array,[]);
title('自建IFFT2结果');
MATLAB处理结果如图4-5所示:
图4-5 自建IFFT2结果
4.2.5内置的FFT程序及分析
利用MATLAB自带的FFT算法实现对灰度图像处理的程序如下:F=fft2(image);
FC=fftshift(F);
S=log(1+abs(FC));
axes(handles.axes7);
imshow(S,[]);
tltle('内置FFT2结果');
MATLAB处理结果如图4-6所示:
图4-6 内置FFT2结果
4.2.6内置的IFFT程序及分析
利用MATLAB自带的IFFT算法实现对灰度图像处理的程序段如下:array=ifft2(F);
array=round(abs(array));
axes(handles.axes8);//subplot(2,4,8);
imshow(array,[]);
tltle('内置IFFT2结果');
MATLAB处理结果如图4-7所示:
图4-7 内置IFFT2结果
结果
程序运行前,首先新建扩展名为.m 的文件,然后选择一张扩展名为.jpg 的图片,点击运行按钮将弹出运行界面如图4-8所示。

原始图
像原始图
像自建FFT2函数结
果自建IFFT2结

内置FFT2结
果内置IFFT2结果
图4-8 程序运行结果
第一排第一幅为原图像,第二幅为自编的FFT 函数运行图,第三幅为自编的IFFT 函数运行图;第二排第一幅为原图像,第二幅为系统FFT 函数运行图,第三幅为系统IFFT 函数运行图。

通过比较以上六幅图可以得出:用 MATLAB 自带FFT 函数运行结果与用MATLAB 编写的FFT 程序实现的函数运行结果基本一致,因此验证了自行编写结果的正确性。

利用自建FFT 和MATLAB 自带的FFT 算法实现对灰度图像处理如下:
图4-9 自建FFT2结果图 图4-10 内置FFT2结果
上图4-9是利用自建的FFT 对图片进行的变换处理,图4-10是MATLAB 自带的FFT 函数对图片进行的处理。

比较两图可以看出自建的FFT 结果比自带的图片颜色稍深,而且自建的FFT 结果中的频域图像与自带FFT 结果频域图像稍有不同。

4.5 IFFT 结果与原灰度图形及比较
IFFT算法是在对图像进行FFT算法处理的基础上对图片进行的快速傅立叶反变换。

利用自建IFFT实现对灰度图像处理如下图所示。

图4-11 自建IFFT2结果图4-12 灰度图像上图4-11是利用自建的IFFT对图片进行的变换处理,图4-12是原灰度图。

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

5GUI界面
5.1 GUI简介
图形用户界面(Graphical User Interfaces,GUI)是一种人机交互的工具和方法。

GUI是包含图形对像,如窗口、图标、菜单和文本等图文并茂的用户界面。

MATLAB为用户开发图形界面提供了一个方便、高效的集成开发环境GUIDE(Graphic User Interface Development Environment)。

GUIDE主要是一个界面设计工具集,MATLAB将所有GUI的控件都集成在这个环境中并提供界面外观、属性和行为响应方式的设置方法。

GUIDE将用户设计好的GUI界面保存在一个FIG文件中,同时还自动生成一个包含GUI初始化和组件界面布局控制代码的M文件。

这个M文件为实现回调函数(当用户激活GUI某一个组件时执行的函数)提供了一个参考框架,这样既简化了GUI应用程序的创建工作,用户又可以直接使用这个框架来编写自己的函数代码。

用MATLAB图形用户界面开发环境的一般步骤是:
(1)进行界面设计
(2)设置控制属性
(3)进行M语言编辑
当启动GUID时,在MATLAB中,GUIDE提供了多种设计模板以方便用户使用GUI。

这些模板均包含相关的回调函数,用户可以打开它所对应的M文件,看到它们的工作方式,或修改相应的函数,从而实现自己需要的功能。

直接输入“guide”命令,将弹出GUI初始界面如图5-1所示:
图5-1 GUI初始界面
在初始界面选择Blank GUI创建新的GUI,MATLAB 提供了空白模板、带有控制按钮的模板、带有坐标轴和菜单的模板以及问答式对话框4种模板。

其中空白模板如图5-2所示:
图5-2 空白界面编辑器外观图
利用对象属性编辑器,可以查看、修改和设置每个对象的属性值,在对象设计编辑器界面工具栏上选择“Edit”或“Tools”下的“Inspect Properties”选项,可以打开对象属性编辑器。

另外,在MATLAB命令窗口的命令行输入inspect,也可以打开对象属性编辑器。

对象属性编辑器如图5-3所示:
图5-3 属性编辑器
以本设计要求为例介绍:
第一步,该选择本图形用户界面需要的控件:
九个静态文本(static text),用来提示我们需要人为输入的内容。

一个推按钮(Push button),用来退出界面。

八个轴对象(axes)用来显示信号原图,灰度处理图和FFT,IFFT实现的频谱图及系统FFT,IFFT函数图。

完成人机设计界面如图5-4所示:
图5-4 人机设计界面图
第二步,设置控件属性:
双击组件可以设置文本框,推按钮的属性,如显示大小、名称和默认值等。

第三步,编写回调函数。

组件事件的发生是通过回调函数进行工作的。

控件设置完成后保存,然后运行GUI(操作为ctrl+T),就会进入editor窗口,加入各个控件功能的函数代码。

完成后保存即可。

第四步,运行GUI。

运行editor窗口的程序后,会弹出已经激活的人机对话界面。

系统人机对话界面如图5-5所示:
图5-5 人机对话界面图
5.3 运行调试
运行GUI,已经弹出上图5-5所示的系统人机对话界面,分别点击八个按钮将依次得到所需图片,如果运行结束,可以通过点击“退出”推按钮退出该人机对话界面,返回MATLAB。

依次点击八个按钮将出现运行界面如图5-6所示:
图5-6 运行界面
第一排第一幅为原图像,第二幅为灰度处理图,第三幅为自编的FFT函数运行图,第四幅为自编的IFFT函数运行图;第二排第一幅为原图像,第二幅为灰度处理图,第三幅为系统FFT函数运行图,第四幅为系统IFFT函数运行图。

通过比较以上八幅图可以得出:用MATLAB自带FFT函数运行结果与用MATLAB编写的FFT程序实现的函数运行结果基本一致,因此验证了自行编写结果的正确性,也验证了使用GUI界面运行程序的正确性。

6总结体会
为期两周的课设很快接近尾声了,基于MATLAB的FFT算法实现设计已按计划如期全部完成,通过这次课程设计,我对课堂上所学到的理论知识的理解加深了许多,自己动脑、动手设计的能力也得到了较大提高。

通过本次课程设计,让我们掌握如何学习一门语言,如何进行资料查阅搜集,如何自己解决问题等方法,养成良好的学习习惯。

扩展理论知识,培养学生的综合设计能力。

本次课设是通过用MATLAB实现FFT的设计,对图像信号进行分析,并画出采样信号的时域与频域图。

把自己编写的FFT算法与MATLAB自带FFT算法进行比较。

程序运行调试时,自己选择输入要采样的图像信号,采样像素以及要变换的范围,可以实现对不同信号的信号采样和进行不同点的FFT运算。

通过这次数字信号处理课程设计,让我了解了关于MATLAB软件在数字信号处理方面的应用,又一次学习了MATLAB软件的使用和程序的设计,MATLAB的仿真使我更加深入的了解了数字处理的过程,对我对数字信号处理的理解加深了一步。

这次的课程设计是对上学期所学知识的一次重要巩固,使得在课堂上掌握的知识得到了真正的运用。

在学习的过程中和同学讨论,更明白了理论知识与实践的联系。

书到用时方恨少,有些知识学会是一回事,掌握是一回事,但应用起来,确实不是那么简单的,需要很多知识的融会贯通。

我也发现了动手实践的重要性。

动手实践是理论知识得以灵活运用的必要前提,也是今后走上工作岗位之后能够很好的完成设计工作的技术保证。

只有遇到实际问题并根据自己对课堂上获得的专业知识的理解来解决才能真正的提高自己的能力。

程序运行调试初期,曾经多次出现错误、不能产生图形等问题,但在我翻阅资料认真改正及老师同学的帮助下基本功能还是完成了,经过两周的上机实习,程序已得到一些完善,能完成基本的要求的功能。

最后经过努力,又深入学习了图形用户界面(GUI),完成了选做要求的人机对话界面。

总的来说,学习就是一个了解,疑惑,进而解惑的过程,这次课设就是提供了这样一个发现自己知识漏洞,与同学老师探讨进行解惑的的机会。

通过这次课程设计,我更深刻的了解了MATLAB的运用,重新复习了FFT 中的重要的变换的程序,对课本上的知识有了更深的理解,使我对数字信号处理有了系统的认知。

在这里特别感谢老师和我身边的同学们,他们给了我们很大的发挥空间,让我们真正自己动手真正掌握了知识,感谢他们细心指导,他们解开了我在实习中出现的诸多知识死角,真的很感谢大家。

参考文献
[1]楼顺天等. 基于MA TLAB的系统分析与设计—信号处理[M]. 西安电子科技大学出版社,1998
[2] 奥本海姆. 离散时间信号处理[M]. 科学出版社, 2000
[3] 宗孔德,胡广书. 数字信号处理[M]. 清华大学出版社, 1997
[4] 苏金明,张莲花,刘波..MATLAB工具箱应用[M].电子工业出版社
[5] 程佩青.数字信号处理教程[M].北京:清华大学出版社出版, 2001
[6] 高西企,丁美玉等.数字信号处理[M].北京:电子工业出版社,2009
[7] 陈杰.Matlab宝典[M].电子工业出版社
附录Ⅰ FFT算法的程序以下为在Matlab下的程序:
function image_process_FFT()
[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');
figure('position',[0 0 scrsz(3)-1 scrsz(4)]);
set(gcf,'Name','快速傅里叶变换');
subplot(2,3,1);
imshow(image);
title('原始图像');
subplot(2,3,4);
imshow(image);
title('原始图像');
[r,c]=size(image);
%补0至最接近的2的整数次幂
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'); %按行方向计算时用到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,3,2);
imshow(S1,[]);
title('自建FFT2函数结果');
array=transform_ifft2(array);
array=abs(array);
array=array(1:r,1:c);
subplot(2,3,3);
imshow(array,[]);
title('自建IFFT2结果');
F=fft2(image);
FC=fftshift(F);
S=log(1+abs(FC));
subplot(2,3,5)
imshow(S,[]);
title('内置FFT2结果');
array=ifft2(F);
array=round(abs(array));
subplot(2,3,6);
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
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
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);
附录Ⅱ GUI设计的程序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)
axes(handles.axes1);
x=imread('a.jpg'); %原图
handles.img=x;
guidata(hObject, handles);
imshow(x); %
title('原始图像');
function pushbutton2_Callback(hObject, eventdata, handles)
axes(handles.axes2);
image=imread('a.jpg');
x=rgb2gray(image); %灰度处理
imshow(x);
imwrite(x,'nearfangda.jpg')
title('灰度图像');
function pushbutton3_Callback(hObject, eventdata, handles) image=imread('a.jpg');
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');
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)));
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
return
else
array1=array;
return
end
function pushbutton4_Callback(hObject, eventdata, handles)
image=imread('a.jpg');
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);。

相关文档
最新文档