数字信号处理课程设计master_-_副本.docx_第1页
数字信号处理课程设计master_-_副本.docx_第2页
数字信号处理课程设计master_-_副本.docx_第3页
数字信号处理课程设计master_-_副本.docx_第4页
数字信号处理课程设计master_-_副本.docx_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

FFT算法的matlab实现及应用研究一、设计要求:1.编程实现FFT算法;2.运用编写的FFT程序对信号进行FFT计算和还原,待分析的信号自行选择和产生,可以是一段音乐,可以是自己录入的语音信号或者是一副图像等;3.与matlab的FFT函数进行比较;3.设计系统界面。本次设计选择对图片进行处理,对该图像进行FFT变换。在Matlab环境下编写基2 DIT-FFT算法;利用自己编写的算法对选取的图片进行计算和恢复,并与Matlab数字信号处理工具箱中的fft函数进行对比研究,验证自编算法的正确性。设计系统界面二、系统总体流程图:设计系统界面与系统自带fft函数进行比较选择图片,对图片进行FFT处理和还原编写程序三、FFT算法的基本原理快速傅里叶变换FFT是为提高DFT运算速度而采用的一种算法,对一个有限长度序列x(n)的N点的DFT为:所以,要求N点的DFT,需要N2次的复数乘法运算,N*(N-1)次复数乘法运算算。随着N的增加,运算量将急剧增加,而在实际问题中,N往往是较大的,因此无论是用通用计算机还是用DSP芯片,都需要消耗大量的时间,不能满足实时的要求,不适合于对实时处理要求高的场合。为了能实时处理DFT,要想减少DFT的运算量可以有两个途径:第一是降N,N的值减小了,运算量就减少了;第二是利用旋转因子的周期性,对称性和可约性。利用这两个途径实现DFT的快速傅里叶变换FFT,FFT算法基本上可分为时域抽取基2FFT算法和频域抽取基2FFT算法。旋转因子具有周期性,共轭对称性以及可约性。1)、本次课设选择时域抽取基2FFT算法来实现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的计算。利用旋转因子的可约性,即:用蝶形图表示如下: X1(k)X(K)= X1(k)+ WNK X2(k) WNK X2(k)X(K+N/2)= X1(k)-WNK X2(k)依此类推,还可以把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减少运算量的特点表现的越明显。四、FFT算法的运算规律及编程思想1)、对图片的选择保存一张图片,格式为bmp,jpg或者是gif中的任何一种。并将该图片文件保存在电脑的某个盘中。filename,pathname=uigetfile(*.jpg;*.tif;*.bmp;*.gif ,File Selector);image=imread(strcat(pathname,filename); 这些代码实现了对图片的路径进行的选择,只要找到保存图片的位置即可打开图片。if ndims(image)=3 image=rgb2gray(image); end 这些代码实现了对图片进行灰度变换,可以将原来是彩色的图片变换成黑白色,目的是为了取点时方便简单,而且速度更快,节省时间2)、T运算的核心是蝶形运算,找出蝶形运算的规律是编程的基础。对N=2M点的FFT共有M级运算,用L表示从左到右的运算级数(L=1,2,M )。 第L级共有B=2L-1个不同指数的旋转因子,用R表示这些不同指数旋转因子从上到下的顺序(R=0,1,B-1)。第R个旋转因子的指数P=2M-LR,旋转因子指数为P的第一个蝶的第一节点标号k从R开始,由于本级中旋转因子指数相同的蝶共有2M-L个,且这些蝶的相邻间距为2L,故旋转因子指数为P的最后一个蝶的第一节点标号k为:(2M-L-1)2L+R=N-2L+R个节点与第 一个节点都相距B点。总结上述运算规律,可采用如下运算方法进行DIT-FFT运算。首先读入数据,根据数据长度确定运算级数M,运算总点N=2M,不足补0处理。然后对读入 数据进行数据倒序操作。运算时,先算出该级不同旋转因子的个数(也是该级中各个蝶形运算两输入数据的间距),再从R=0开始按序计算,直到R=B-1结束。每个R对应的旋转因子指数P=2M-LR。五、系统界面设计图形用户界面(GUI),是一种提供人机交互的工具和方法。GUI是包含图形对象,如窗口、图标、菜单和文本等图文并茂的用户界面。一个设计非常优秀的GUI能够非常直观的使用户知道如何操作Matlab界面,了解设计者开发的意图。1、本次界面设计过程如下第一步,该选择本图形用户界面需要的控件:7个推按钮(Push button),用来运行和退出。六个轴对象(axes)用来显示信号时域波形,频谱图,和两种不同FFT实现的频谱图,即运用Matlab自带的。第二步,设置各个对象的属性。如果要设置各个对象在表面上的寓意,只要改变它的string即可。Tag是它的本质属性,是唯一的。控制属性完成后,图形用户界面如图所示。第三步,编写回调函数。组件事件的发生是通过回调函数进行工作的。回调函数是用户指定组件需要完成一定动作的函数,如本次设计中单击按钮后的功能就是由编写回调函数实现的。一个组件中可以包括多个回调函数,但是几乎每一个组件都有的属性是Callback属性。GUIDE可创建一个M回调函数文件的构架,文件将自动处理并将所有文件的句柄传递到handles结构数组中。Handles是GUI中一个特殊的结构数组,它是GUI中所有组件共用的一个结构。在handles结构数组中还可以添加用户自定义的,在不同的回调函数之间共享的数据。回调函数的声明格式为:Function object_Callback(hObject,eventData,handles)声明格式各部分为:object为发生事件控制的Tag属性字符串。hObject为发生事件的控制句柄。eventData为保留字段。六、结果比较1、系统获取原图2、FFT处理由以上两图对比可以看出,自建的fft和系统自带的fft是有细微的差别的,自建的得到的图片比系统自带的图像颜色更甚而且由中间汇聚的光束可以看出,自建的函数得到的结果光束比较大,发散的范围更广,而系统自带的函数得到的结果相对来说比较窄。3、IFFT还原 由以上两图对比可以看出,自建的IFFT和系统自带的IFFT总体上是一样的,但是有细微的差别,自建的相对来说颜色较暗,更深而自带的得到的图像颜色更亮更鲜明。七、心得体会通过本课程设计,我了解了数字图像的基本概念,掌握数字图像处理的基本内容,如图像点运算、几何变换、增强处理、图像复原等的基本原理和Matlab实现方法。本次课设是通过用Matlab实现FFT的设计,对图像信号进行分析,把自己编写的FFT算法与Matlab自带FFT算法进行比较。程序运行调试时,自己选择输入要采样的图像信号,采样像素以及要变换的范围,可以实现对不同信号的信号采样和进行不同点的FFT运算。经过这次课程设计,我更深刻的了解了Matlab的运用,重新复习了FFT 中的重要的变换的程序,对课本上的知识有了更深的理解,使我对数字信号处理有了系统的认知。附录1.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); endscrsz=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); array=image; t=log2(r); t1=floor(t); t2=ceil(t); if t1=t2 array(2t2,c)=0; endr1,c1=size(array); t=log2(c1); t3=floor(t); t4=ceil(t); if t3=t4 array(r1,2t4)=0;endr1,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); endn=c1/2; data_row=zeros(1,n,double); for m=1:n data_row(m)=exp(-1i*2*pi*(m-1)/r1); endarray=transform_fft(array); Ft=fftshift(array); S1=log(1+abs(Ft); subplot(2,3,2); imshow(S1,); title(自建FFT结果); array=transform_ifft2(array); array=abs(array); array=array(1:r,1:c); subplot(2,3,3); imshow(array,); title(自建IFFT结果); F=fft2(image); FC=fftshift(F); S=log(1+abs(FC); subplot(2,3,5) imshow(S,); title(内置FFT结果); array=ifft2(F); array=round(abs(array); subplot(2,3,6); imshow(array,); title(内置IFFT结果); returnfunction array=transform_fft2(array) array=double(array); r1 c1=size(array); for j=1:r1 array(j,:)=transform_fft(array(j,:); endfor j=1:c1 array(:,j)=transform_fft(array(:,j); endfunction 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); endp=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); elsedata1=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); endendendendif mod(p,2)=1 returnelsearray1=array; returnendfunction array=transform_ifft2(array) array=conj(array); r1,c1=size(array); for i=1:r1 array(i,:)=transform_fft(array(i,:); endfor i=1:c1 array(:,i)=transform_fft(array(:,i); endarray=array/(r1*c1);2.GUI源程序function varargout = untitled(varargin)gui_Singleton = 1;gui_State = struct(gui_Name, mfilename, . gui_Singleton, gui_Singleton, . gui_OpeningFcn,untitled_OpeningFcn, . gui_OutputFcn, untitled_OutputFcn, . gui_LayoutFcn, , . gui_Callback, );if nargin & ischar(varargin1) gui_State.gui_Callback = str2func(varargin1);endif nargout varargout1:nargout = gui_mainfcn(gui_State, varargin:);else gui_mainfcn(gui_State, varargin:);endfunction untitled_OpeningFcn(hObject, eventdata, handles, varargin)handles.output = hObject;guidata(hObject, handles);function varargout = untitled_OutputFcn(hObject, eventdata, handles)varargout1 = handles.output;function pushbutton1_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); endscrsz=get(0,ScreenSize); set(gcf,Name,快速傅里叶变换); axes(handles.axes1); imshow(image); title(原图); function pushbutton7_Callback(hObject, eventdata, handles)clc; close all; close(gcf);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); endscrsz=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(2t2,c)=0;endr1,c1=size(array); t=log2(c1); t3=floor(t); t4=ceil(t); if t3=t4 array(r1,2t4)=0; endr1,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); endn=c1/2; data_row=zeros(1,n,double); for m=1:n data_row(m)=exp(-1i*2*pi*(m-1)/r1); endarray=transform_fft2(array); Ft=fftshift(array); S1=log(1+abs(Ft); axes(handles.axes2); imshow(S1,); title(自建FFT)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); endscrsz=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(2t2,c)=0;endr1,c1=size(array); t=log2(c1); t3=floor(t); t4=ceil(t); if t3=t4 array(r1,2t4)=0; endr1,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); endn=c1/2; data_row=zeros(1,n,double); for m=1:n data_row(m)=exp(-1i*2*pi*(m-1)/r1); endarray=transform_fft2(array); Ft=fftshift(array); S1=log(1+abs(Ft); array=transform_ifft2(array); array=abs(array); array=array(1:r,1:c); axes(handles.axes3); imshow(array,); title(自建IFFT); 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); endscrsz=get(0,ScreenSize); set(gcf,Name,快速傅里叶变换); axes(handles.axes4); imshow(image); title(原图); function pushbutton5_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); endscrsz=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(2t2,c)=0; endr1,c1=size(array); t=log2(c1); t3=floor(t); t4=ceil(t); if t3=t4 array(r1,2t4)=0; endr1,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); endn=c1/2; data_row=zeros(1,n,double); for m=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论