课程设计说明书
7总结
本次实习的主要内容是通过用MATLAB实现FFT的设计,可以实现对选定图片信号进行分析,并做出经FFT算法及IFFT算法后的图片结果。把自己编写的FFT算法与MATLAB自带FFT算法进行比较。程序运行调试时,自己选择输入要采样的图片,可以实现对不同图片的FFT运算。
在之前数字信号处理的学习以及完成实验的过程中,已经使用过MATLAB,对其有了一些基础的了解和认识,通过这次的课程设计使我进一步了解了信号的产生,采样及频谱分析的方法,以及其中产生信号和绘制信号的基本命令和一些基础编程语言。让我感受到只有在了解课本知识的前提下,才能更好的应用这个工具,并且熟练的应用MATLAB也可以很好的加深我对课程的理解,方便我的思维。这次课程设计使我了解了MATLAB的使用方法,提高了自己的分析和动手实践能力。同时我相信,进一步加强对MATLAB的学习与研究对我今后的学习将会起到很大的帮助。
这次的课程设计是对本学期所学知识的一次重要巩固,使得在课堂上掌握的知识得到了真正的运用。在学习的过程中和同学讨论,更明白了理论知识与实践的联系。书到用时方恨少,有些知识学会是一回事,掌握是一回事,但应用起来,确实不是那么简单的,需要很多知识的融会贯通。
程序运行调试初期,曾经多次出现错误、不能产生图形等问题,但在我翻阅资料认真改正及老师同学的帮助下基本功能还是完成了,经过1个星期的上机实习,程序已得到一些完善,能完成基本的要求的功能。最后经过努力,又深入学习了图形用户界面(GUI),完成了选做要求的GUI界面。
学习就是一个了解,疑惑,进而解惑的过程,这次实习就是提供了这样一个发现自己知识漏洞,与同学老师探讨进行解惑的的机会。
通过这次课程设计实习,我更深刻的了解了MATLAB的运用,重新复习了FFT 中的重要的序列倒序和蝶形变换的程序,对课本上的知识有了更深的理解,使我对数字信号处理有了系统的认知。
在这里特别感谢老师,他们给了我们很大的发挥空间,让我们真正自己动手真正掌握了知识,感谢他们细心指导。也非常感谢我的同学,他们解开了我在实习中出现的诸多知识死角,谢谢大家!
15
课程设计说明书
参考文献
[1] 范寿康.《DSP 技术与DSP芯片》.北京电子工业出版社,2008 [2] 程佩青.《数字信号处理教程》.北京清华大学出版社出版,2001 [3] 高西全,丁玉美等.《数字信号处理》.北京电子工业出版社,2009
[4] 余成波,陶红艳.《数字信号处理及MATLAB 实现》.北京清华大学出版社,2008 [5] 曹弋,赵阳.《MATLAB 实用教程》.北京电子工业出版社,2007 [6] 奥本海姆.《离散时间信号处理》.科学出版社,2000 [7] 宗孔德,胡广书.《数字信号处理》.清华大学出版社,1997
16
课程设计说明书
附录Ⅰ
以下是用Matlab实现的程序编码: 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
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); if t1~=t2
array(2^t2,c)=0; end
[r1,c1]=size(array); t=log2(c1); t3=floor(t);
17
课程设计说明书
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,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);
18
课程设计说明书
array=round(abs(array)); subplot(2,4,4); 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'); 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
19