当前位置:文档之家› 数字信号处理基于MATLAB的FFT算法设计课设说明书

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

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

1引言 (1)

2课设要求 (2)

2.1课设题目 (2)

2.2设计内容及要求 (2)

2.3要求的设计成果 (2)

3基于MATLAB的FFT算法实现 (3)

3.1系统总体流程图 (3)

3.2 DIT-FFT算法的基本原理 (3)

3.3 DIT-FFT算法的运算规律及编程思想 (5)

4 MATLAB实现程序 (8)

5用GUI界面实现运算 (10)

5.1 GUI简介 (10)

5.2界面设计 (10)

5.3 GUI实现程序 (12)

5.4运行调试 (13)

6自编算法与内置算法结果比较 (14)

7总结 (15)

参考文献 (16)

附录Ⅰ (17)

附录Ⅱ (21)

MATLAB是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks公司出品的商数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。

MATLAB 的应用范围非常广,包括信号和图像处理、通讯、控制系统设计、测试和测量、财务建模和分析以及计算生物学等众多应用领域。附加的工具箱(单独提供的专用MATLAB 函数集)扩展了MATLAB 环境,以解决这些应用领域内特定类型的问题。它以矩阵运算为基础,把计算、可视化、程序设计融合在一个简单易用的交互式工作环境中,是一款数据分析和处理功能都非常强大的工程适用软件。它可以将图片文件变换为离散的数据文件,然后利用其强大的矩阵运算能力处理数据,如数据滤波、傅立叶变换、时域和频域分析以及各种图的呈现等,它的信号处理与分析工具箱为图片分析提供了十分丰富的功能函数,利用这些功能函数可以快捷而又方便的完成图片信号的处理和分析以及信号的可视化。数字信号处理是MATLAB重要应用的领域之一。

对于有限长序列x(n),若要求其N点的傅里叶变换(DFT)需要经过2N次复数乘法运算和N*(N-1)次复数加法运算。随着N的增加,运算量将急剧增加,而在实际问题中,N往往是较大的,如当N=1024时,完成复数乘法和复数加法的次数分别为百万以上,无论是用通用计算机还是用DSP芯片,都需要消耗大量的时间和机器内存,不能满足实时的要求。因此,DFT的这种运算只能进行理论上的计算,不适合对实时处理要求高的场合。因此,研究作为DSP的快速算法的FFT是相当必要的,快速傅里叶变换(FFT)是为提高DFT运算速度而采用的一种算法,快速算法的种类很多,而且目前仍在改进和提高,它是根据离散傅里叶变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。基于本学期所学的DIT-FFT的运算规律和编程思想以及MATLAB的学习和使用,本课设要求在MATLAB环境下编写基2 DIT-FFT算法实现对离散信号的快速傅里叶变换,再与MATLAB软件自带的FFT函数实现对离散信号的傅里叶变换进行比较,如果得到的频谱相同,那么我们编写的程序就是正确的。如果有能力可以选做系统人机对话界面,用GUI界面完成人机交互方便使用的。本课程设计主要是对数字信号的分析。

2课设要求

2.1课设题目

基于MATLAB的FFT算法的设计

2.2设计内容及要求

1.设计内容:

所设计的FFT算法应完成以下功能:

(1) 在MATLAB环境下编写FFT算法(不调用系统现有函数);

(2) 实现对选定图片进行FFT计算、还原(IFFT计算),并与系统FFT函数做对比,进行分析;

(3) 设计GUI界面。

2.设计要求:

(1) 根据题目要求进行算法GUI总体设计;

(2) 完成算法具体部分的设计,即算法原理图和算法原理说明;

(3) 算法程序的设计,即对选定图片进行自编FFT计算与还原,并与自带函数进行对比与完整源程序;

(4) 书写设计说明书。

2.3要求的设计成果

(1) 设计结果能正确仿真演示;

(2) 设计说明书一份(包括总体设计、算法原理图及说明、系统GUI演示、源程序清单等)。

3基于MATLAB 的FFT 算法实现

3.1系统总体流程图

本设计要求对一选定的图片进行FFT 算法和IFFT 算法分析。在MATLAB 环境下编写基2 DIT-FFT 算法,利用自己编写的算法对图片进行频谱分析,并与MATLAB 数字信号处理工具箱中的FFT 函数进行对比研究,验证自编算法的正确性。所以得到系统总体流程图如图3-1所示。

图3-1系统总体流程图

3.2 DIT-FFT 算法的基本原理

快速傅里叶变换(FFT)是为提高DFT 运算速度而采用的一种算法。 对一个有限长度序列x(n)的N 点的DFT 为:

所以,要求N 点的DFT ,需要N2次的复数乘法运算,N*(N-1)次复数乘法运算。随着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 满足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 的计算。

利用旋转因子的可约性,即:

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

12

,

,1,0,

)()12()()2(21-=?

??

=+=N r r x r x r x r x )()(N n k N n N k N kn N W W W ++==*)(*)(][][n k N n k N kn N W W W --==m

kn m

N kn N mkn mN kn N W W W W //,

==()()()()()()(

)()()(

)1

N

021

N

N

0,2,4...1,3,5 (112)

2

212N

N

0,10,1112

2

2121

N

2

N

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 222

2

e

e

rk N rk

rk

rk

N

N N

W W π

π

--===()()()1122

122

2

12

,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)

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

以此类推,还可以把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 减少运算量的特点表现的越明显。

3.3 DIT-FFT 算法的运算规律及编程思想

为了编写DIT-FFT 算法的运算程序,首先要分析其运算规律,总结编程思想并绘出程序框图。

1.原位计算

对M

N 2=点的FFT 共进行M 级运算,每级由N/2个蝶形运算组成。在同一级中,每个蝶的输入数据只对本蝶有用,且输出节点与输入节点在同一水平线上,这就意味着每算完一个蝶后,所得数据可立即存入原输入数据所占用的数组元素(存储单元)中,这种原位(址)计算的方法可节省大量内存。

2.蝶形运算

实现FFT 运算的核心是蝶形运算,找出蝶形运算的规律是编程的基础。蝶形运算是分级进行的,每级的蝶形运算可以按旋转因子的指数大小排序进行,如果指数大小一样则可从上往下依次蝶算。对M

N 2=点的FFT 共有M 级运算,用L 表示从左到右的运算级数(L=1,2,…,M )。第L 级共有12-=L B 个不同指数的旋转因子,用R 表示这些不同指数旋转因子从上到下的顺序(R=0,1,…,B-1)。第R 个旋转因子的指数R P L M -=2,旋转因子指数为P 的第一个蝶的第一节点标号k 从R 开始,由于本级中旋转因子指数相同的蝶共有L M -2个,且这些蝶的相邻间距为L 2,故旋转因子指数为P 的最后一个蝶的第一节点标号k 为:

R N R L L L M +-=+?--22)12(,本级中各蝶的第二个节点与第一个节点都相距

B 点。

应用原位计算,蝶形运算可表示成如下形式:

L A (J)= 1-L A (J)+ 1-L A (J+B)*P

N W

L A (J+B)= 1-L A (J)-1-L A (J+B)*P

N W

总结上述运算规律,可采用如下运算方法进行DIT-FFT 运算。首先读入数

据,根据数据长度确定运算级数M ,运算总点数M

N 2=,不足补0处理。然后对读入数据进行数据倒序操作。数据倒序后从第1级开始逐级进行,共进行M 级运算。在进行第L 级运算时,先算出该级不同旋转因子的个数12-=L B (也是该级中各个蝶形运算两输入数据的间距),再从R=0开始按序计算,直到R=B-1结束。每个R 对应的旋转因子指数R P L M -=2,旋转因子指数相同的蝶从上往下依次逐个运算,各个蝶的第一节点标号k 都是从R 开始,以L 2为步长,到R N L

+-2

(可简

取极值N-2)结束。考虑到蝶形运算有两个输出,且都要用到本级的两个输入数据,故第一个输出计算完毕后,输出数据不能立即存入输入地址,要等到第二个输出计算调用输入数据完毕后才能覆盖。这样数据倒序后的运算可用三重循环程序实现。整个蝶形运算流程图如图3-3所示。

图3-3整个蝶形运算流程图

3.序列倒序

为了保证运算输出的X(k)按顺序排列,要求序列x(n)倒序输入,即在运算前

要先对输入的序列进行位序颠倒。如果总点数为M

N 2=的x(n)的顺序数是用M 位二进制数表示,则倒序数只需将顺序数的二进制位倒置即可,按照这一规律用硬件电路和汇编语言很容易产生倒序数。但用MATLAB 等高级语言实现倒序时,直接倒置二进制数位的方法不可取,还须找出产生倒序的十进制规律。将十进制顺序数用I 表示,与之对应的二进制数用IB 表示。十进制倒序数用J 表示,与之对应的二进制数用JB 表示。JB 是IB 的位倒置结果,十进制顺序数I 增加1,相当于IB 最低位加1且逢2向高位进1,即相当于JB 最高位加1且逢2向低位进1。JB 的变化规律反映到J 的变化分二种情况:如果JB 的最高位是0)2/(N J <,则直接由加1)2/(N J J +?得到下一个倒序值;如果JB 的最高位是1)2/(N J ≥,则要先将最高位变0)2/(N J J -?,再在次高位加1)4/(N J J +?。但次高位加1时,同样要判断0、1值,如果是0 )4/(N J <,则直接加1)4/(N J J +?,否则要先将次高位变0)4/(N J J -?,再判断下一位。依此类推,直到完成最高位加1,逢2向右进位的运算。利用这一算法可按顺序数I 的递增顺序,依次求得与之对应的倒序数J 。为了节省内存,数据倒序可原址进行,当I = J 时不需要交换,当I ≠ J 时需要交换数据。另外,为了避免再次调换前面已经调换过的一对数据,只对I

4 MATLAB实现程序

在MATLAB环境下编写程序,即不调用系统现有函数的FFT算法、IFFT 算法和调用系统现有函数的FFT算法、IFFT算法,实现对选定图片的FFT计算、IFFT计算(还原)。

实现步骤如下:

首先打开MATLAB软件,出现如图4-1所示界面。

图4-1 MATLAB主界面

其次,左击File按钮,选中New,点击M-File,出现如图4-2所示界面,写入编写好的程序,保存。

图4-2 M-File界面

最后,点击Run图标,运行,选择要分析的图片后,出现如图4-3所示界面。这就是对选定图片进行FFT计算、IFFT计算后的结果。对出现的两组图做对比,

进行分析。

图4-3运行程序后的结果

5用GUI界面实现运算

5.1GUI简介

图形用户界面(GUI),是一种提供人机交互的工具和方法。GUI是包含图形对象,如窗口、图标、菜单和文本等图文并茂的用户界面。

5.2界面设计

用MATLAB图形用户界面开发环境设计GUI点的一般步骤是:

1.进行界面设计;

2.设计控件属性;

3.进行M语言编程。

在MATLAB中,启动GUIDE的方法有3种:

(1) 在MATLAB指令行窗口中直接输入指令“>>GUIDE”;

(2) 在“Start”菜单中选择“MATLAB”下的“GUIDE”命令;

(3) 在工具栏中单击“GUIDE”的图标,进入GUI默认窗口界面,如图5-1所示。

这里选择空白界面类型(Black GUI),单击“OK”按钮,MATLAB将启动GUIDE,如图5-2所示。

图5-1 GUIDE的启动界面

图5-2具有空白界面的GUIDE

在GUI空白界面中,位于中央的深灰色部分为绘制控件的画布,拖动右下角小黑点可以调整画布尺寸的大小。在GUI界面的左侧为MATLAB控制面板。控制面板的外观可以通过设置GUIDE的属性进行简要的修改,选择GUIDE中的“File”菜单下的“Preference”…”命令,在弹出的对话框中选择“Show names in Component palette”复选框,如图5-3所示。单击“OK”按钮后,控制面板中在不同的空间旁边会显示相应空间的名称,如图5-4所示。

图5-3 GUIDE的属性对话框图5-4显示控件名称控制面板上有各种控件,其中有推按钮(Push Button)、单按钮(Radio Button)、复选框(Checkbox)、文本框(Edit Text)、静态文本框(Static Text)、下拉框(Popup

Menu)、列表框(Listbox)、单选按钮(Toggle Button)、轴对象(axes)等。从控制面板中选择上述控件,按照一定的界面布局用鼠标将控件拖动到画布上。

5.3 GUI实现程序

以本设计要求为例介绍。

第一步,该选择本图形用户界面需要的控件:

九个推按钮(Push button),分别为原图,灰度图,内置FFT图,内置IFFT 图,原图,灰度图,自编FFT图,自编IFFT图,退出。

八个轴对象(axes)用来显示原图,灰度图,内置FFT图,内置IFFT图,原图,灰度图,自编FFT图,自编IFFT图。

完成的GUI界面如图5-5所示:

图5-5完成的GUI界面

第二步,设置控件属性:

双击组件可以设置推按钮的属性,如显示大小,名称和默认值等。上图就设置了推按钮的名称,这样可以更清楚的明白每个推按钮的功能。

第三步,编写回调函数。

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

第四步,运行GUI。

运行Editor窗口的程序后,会弹出已经激活的GUI界面。点击代表各个函数操作的按钮,就会出现进行了相应函数操作的图片。如图5-6所示:

图5-6运行GUI后的结果

5.4运行调试

当点击推按钮,有时相应的图片将不会出现,提示出现错误,这时极有可能

是图片路径设置错误,则将回调函数中图片路径修改一下,就可出现正确的结果。

6自编算法与内置算法结果比较

我们知道MATLAB软件自带FFT算法和IFFT算法,我们可以通过比较自编算法运行结果与内置算法运行结果来检验自编算法的正确性。

通过观察图4-3和图5-6的运行结果可知,经过自编FFT运算得到的图形和内置FFT得到的图形大体一致,经过自编IFFT运算得出的图形和内置IFFT得出的图形一致。只是内置的FFT得到的图片比自编得到的FFT图片更清晰,其他相差不多,大致可认为两种运算结果是一致的。IFFT算法是在对图像进行FFT 算法处理的基础上对图片进行的快速傅里叶逆变换,因此可以观察到图片进行IFFT算法处理后,又恢复为灰度图,而且较之前的灰度图清晰度较差。

本次课程设计编写的程序严格按程序框图编写,思路清晰、容易理解,程序的运行过程在命令窗中一目了然。通过与自编函数运算的结果比对,虽存在一点小误差,但在允许误差之内,所以程序编写正确。

7总结

本次实习的主要内容是通过用MATLAB实现FFT的设计,可以实现对选定图片信号进行分析,并做出经FFT算法及IFFT算法后的图片结果。把自己编写的FFT算法与MATLAB自带FFT算法进行比较。程序运行调试时,自己选择输入要采样的图片,可以实现对不同图片的FFT运算。

在之前数字信号处理的学习以及完成实验的过程中,已经使用过MATLAB,对其有了一些基础的了解和认识,通过这次的课程设计使我进一步了解了信号的产生,采样及频谱分析的方法,以及其中产生信号和绘制信号的基本命令和一些基础编程语言。让我感受到只有在了解课本知识的前提下,才能更好的应用这个工具,并且熟练的应用MATLAB也可以很好的加深我对课程的理解,方便我的思维。这次课程设计使我了解了MATLAB的使用方法,提高了自己的分析和动手实践能力。同时我相信,进一步加强对MATLAB的学习与研究对我今后的学习将会起到很大的帮助。

这次的课程设计是对本学期所学知识的一次重要巩固,使得在课堂上掌握的知识得到了真正的运用。在学习的过程中和同学讨论,更明白了理论知识与实践的联系。书到用时方恨少,有些知识学会是一回事,掌握是一回事,但应用起来,确实不是那么简单的,需要很多知识的融会贯通。

程序运行调试初期,曾经多次出现错误、不能产生图形等问题,但在我翻阅资料认真改正及老师同学的帮助下基本功能还是完成了,经过1个星期的上机实习,程序已得到一些完善,能完成基本的要求的功能。最后经过努力,又深入学习了图形用户界面(GUI),完成了选做要求的GUI界面。

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

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

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

参考文献

[1] 范寿康.《DSP 技术与DSP芯片》.北京电子工业出版社,2008

[2] 程佩青.《数字信号处理教程》.北京清华大学出版社出版,2001

[3] 高西全,丁玉美等.《数字信号处理》.北京电子工业出版社,2009

[4] 余成波,陶红艳.《数字信号处理及MATLAB 实现》.北京清华大学出版社,2008

[5] 曹弋,赵阳.《MA TLAB 实用教程》.北京电子工业出版社,2007

[6] 奥本海姆.《离散时间信号处理》.科学出版社,2000

[7] 宗孔德,胡广书.《数字信号处理》.清华大学出版社,1997

附录Ⅰ

以下是用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);

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);

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

Matlab中的FFT使用说明

FFT是Fast Fourier Transform(快速傅里叶变换)的简称,FFT算法在MATLAB 中实现的函数是Y=fft(x,n)。刚接触频谱分析用到FFT时,几乎都会对MATLAB 的fft函数产生一些疑惑,下面以看一个例子(根据MATLA帮助修改)。 Fs = 2000; % 设置采样频率 T = 1/Fs; % 得到采用时间 L = 1000; % 设置信号点数,长度1 秒 t = (0:L-1)*T; % 计算离散时间, % 两个正弦波叠加 f1 = 80; A1 = 0.5; % 第一个正弦波100Hz,幅度0.5 f2 = 150; A2 = 1.0 ; % 第2个正弦波150Hz,幅度 1.0 A3 = 0.5; % 白噪声幅度; x = A1*sin(2*pi*f1*t) + A2*sin(2*pi*f2*t); % 产生离散时间信号; y = x + A3*randn(size(t)); % 叠加噪声; % 时域波形图 subplot(2,1,1) plot(Fs*t(1:50),x(1:50)) title('Sinusoids Signal') xlabel('time (milliseconds)') subplot(2,1,2) plot(Fs*t(1:50),y(1:50)) title('Signal Corrupted with Zero-Mean Random Noise') xlabel('time (milliseconds)') NFFT = 2A nextpow2(L); % 设置FFT点数,一般为2 的N次方,如1024,512 等Y = fft(y,NFFT)/L; % 计算频域信号, f = Fs/2*linspace(0,1,NFFT/2+1); %频率离散化,fft后对应的频率是-Fs/2到Fs/2,由NFFT个离散频点表示 % 这里只画出正频率; % Plot single-sided amplitude spectrum. figure; plot(f,2*abs(Y(1:NFFT/2+1))); % fft 后含幅度和相位,一般观察幅度谱,并把负频率加上去, title('Single-Sided Amplitude Spectrum of y(t)') xlabel('Frequency (Hz)')

按时间抽取的基2FFT算法分析与MATLAB实现

按时间抽取的基2FFT 算法分析及MATLAB 实现 一、DIT-FFT 算法的基本原理 基2FFT 算法的基本思想是把原始的N 点序列依次分解成一系列短序列,充分利用旋转因子的周期性和对称性,分别求出这些短序列对应的DFT ,再进行适当的组合,得到原N 点序列的DFT ,最终达到减少运算次数,提高运算速度的目的。 按时间抽取的基2FFT 算法,先是将N 点输入序列x(n)在时域按奇偶次序分解成2个N/2点序列x1(n)和x2(n),再分别进行DFT 运算,求出与之对应的X1(k)和X2(k),然后利用图1所示的运算流程进行蝶形运算,得到原N 点序列的DFT 。只要N 是2的整数次幂,这种分解就可一直进行下去,直到其DFT 就是本身的1点时域序列。 图1 DIT-FFT 蝶形运算流图 二、DIT-FFT 算法的运算规律及编程思想 1.原位计算 对N=M 2点的FFT 共进行M 级运算,每级由N/2个蝶形运算组成。在同一级中,每个蝶的输入数据只对本蝶有用,且输出节点与输入节点在同一水平线上,这就意味着每算完一个蝶后,所得数据可立即存入原输入数据所占用的数组元素(存储单元),经过M 级运算后,原来存放输入序列数据的N 个存储单元中可依次存放X(k)的N 个值,这种原位(址)计算的方法可节省大量内存。 2.旋转因子的变化规律 N 点DIT ―FFT 运算流图中,每个蝶形都要乘以旋转因子p W N ,p 称为旋转因子的指数。例如N =8 =3 2 时各级的旋转因子: 第一级:L=1, 有1个旋转因子:p W N =J /4W N =J 2L W J=0 第二级:L=2,有2个旋转因子:p W N =J /2W N =J 2L W J=0,1 第三级:L=3,有4个旋转因子:p W N =J W N =J 2L W J=0,1,2,3 对于N =M 2的一般情况,第L 级共有1 -L 2个不同的旋转因子: p W N =J 2L W J=0,1,2,… ,1 -L 2-1 L 2=M 2×M -L 2 = N ·M -L 2 故: 按照上面两式可以确定第L 级运算的旋转因子

MATLAB中FFT结果的物理意义

FFT结果的物理意义 最近正在做一个音频处理方面的项目,以前没有学过fft,只是知道有这么个东西,最近这一用才发现原来欠缺这么多,最基本的,连fft的输入和输出各自代表什么都不知道了,终于在网上查到这样的一点资料,得好好保存了,也欢迎大家分享。 FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。虽然很多人都知道FFT是什么,可以用来做什么,怎么去做,但是却不知道FFT之后的结果是什意思、如何决定要使用多少点来做FFT。现在圈圈就根据实际经验来说说FFT结果的具体物理意义。一个模拟信号,经过ADC采样之后,就变成了数字信号。采样定理告诉我们,采样频率要大于信号频率的两倍,这些我就不在此罗嗦了。 采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方。假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位。第一个点表示直流分量(即0Hz),而最后一个点N的再下一个点(实际上这个点是不存在的,这里是假设的第N+1个点,也可以看做是将第一个点分做两半分,另一半移到最后)则表示采样频率Fs,这中间被N-1个点平均分成N等份,每个点的频率依次增加。例如某点n所表示的频率为:Fn=(n-1)*Fs/N(ps:横坐标第n个点对应的频率值Fn的计算公式。整个横坐标代表了采样频率Fs,被分为N点。故其频率分辨率为Fs/N)。由上面的公式可以看出,Fn所能分辨到频率为为Fs/N,如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,则结果可以分析到0.5Hz。如果要提高频率分辨力,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。 假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是An=根号a*a+b*b,相位就是Pn=atan2(b,a)。根据以上的结果,就可以计算出n点(n≠1,且n<=N/2)对应的信号的表达式为:An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。对于n=1点的信号,是直流分量,幅度即为A1/N。由于FFT结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。 好了,说了半天,看着公式也晕,下面圈圈以一个实际的信号来做说明。假设我们有一个信号,它含有2V的直流分量,频率为50Hz、相位为-30度、幅度为3V的交流信号,以及一个频率为75Hz、相位为90度、幅度为1.5V的交流信号。用数学表达式就是如下:S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)式中cos参数为弧度,所以-30度和90度要分别换算成弧度。我们以256Hz的采样率对这个信号进行采样,总共采样256点。按照我们上面的分析,Fn=(n-1)*Fs/N,我们可以知道,每两个点之间的间距就是1Hz,第n个点的频率就是n-1。我们的信号有3个频率:0Hz、50Hz、75Hz,应该分别在第1个点、第51个点、第76个点上出现峰值,其它各点应该接近0。实际情况如何呢?我们来看看FFT的结果的模值如图所示。

利用MATLAB实现信号DFT的计算

07级电信(2)班 刘坤洋 24 实验一 利用MATLAB 实现信号DFT 的计算 一、实验目的: 1、熟悉利用MATLAB 计算信号DFT 的方法 2、掌握利用MATLAB 实现由DFT 计算线性卷积的方法 二、实验设备:电脑、matlab 软件 三、实验内容: 1、练习用matlab 中提供的内部函数用于计算DFT (1) fft (x ),fft (x ,N ),ifft (x ),ifft (x ,N )的含义及用法 (2) 在进行DFT 时选取合适的时域样本点数N 请举例,并编程实现 题目: 源程序: >> N=30; %数据的长度 >>L=512; %DFT 的点数 >>f1=100; f2=120; >>fs=600; %抽样频率 >>T=1/fs; %抽样间隔 >>ws=2*pi*fs; >>t=(0:N-1)*T; >>f=cos(4*pi*f1*t)+cos(4*pi*f2*t); >>F=fftshift(fft(f,L)); >>w=(-ws/2+(0:L-1)*ws/L)/(2*pi); >>hd=plot(w,abs(F)); >>ylabel('幅度谱') >> xlabel('频率/Hz') 的频谱 分析利用)π4cos()π4cos()(DFT 21t f t f t x +=Hz 600,Hz 120,Hz 10021===s f f f

>> title('my picture') 结果图: (3) 在对信号进行DFT 时选择hamming 窗增加频率分辨率 请举例,并编程实现 题目: 源程序:>> N=50; %数据的长度 >>L=512; %DFT 的点数 >>f1=100;f2=150; >>fs=600; %抽样频率 >>T=1/fs; %抽样间隔 >>ws=2*pi*fs; >>t=(0:N-1)*T; >>f=cos(4*pi*f1*t)+0.15*cos(4*pi*f2*t); 的频谱 分析利用)π4cos(15.0)π4cos()(DFT 21t f t f t x +=Hz 600,Hz 150,Hz 10021===s f f f

实验二 FFT算法的MATLAB实现

班级:学号:姓名 实验二FFT算法的MATLAB实现 (一)实验目的: (1)掌握用matlab进行FFT在数字信号处理中的高效率应用。 (2)学习用FFT对连续信号和时域离散信号进行谱分析。 (二)实验内容及运行结果: 题1:若x(n)=cos(nπ/6)是一个N=12的有限序列,利用MATLAB计算它的DFT 并进行IDFT变换同时将原图与IDFT变换后的图形进行对比。当求解IFFT变换中,采样点数少于12时,会产生什么问题。 程序代码: N=12; n=0:11; Xn=cos(n*pi/6); k=0:11; nk=n'*k; WN=exp(-j*2*pi/N) WNnk=WN.^nk XK=Xn*WNnk; figure(1) stem(Xn) figure(2) stem(abs(XK)) 运行结果:

IFFT变换中,当采样点数少于12时图像如下图显示:

分析:由图像可以看出,当采样点数小于12时,x(n)的频谱不变,周期为6,而XK 的频谱图发生改变。 题2:对以下序列进行谱分析 132()()103()8470x n R n n n x n n n =+≤≤?? =-≤≤??? 其他n 选择FFT 的变换区间N 为8和16点两种情况进行频谱分析,分别打印其幅频特 性曲线并进行对比、分析和讨论。 ㈠ 程序代码: x=ones(1,3);nx=0:2; x1k8=fft(x,8); F=(0:length(x1k8)-1)'*2/length(x1k8); %进行对应的频率转换 stem(f,abs(x1k8));%8点FFT title('8点FFTx_1(n)'); xlabel('w/pi'); ylabel('幅度'); N=8时:

用MATLAB进行FFT频谱分析

用MATLAB 进行FFT 频谱分析 假设一信号: ()()292.7/2cos 1.0996.2/2sin 1.06.0+++=t t R ππ 画出其频谱图。 分析: 首先,连续周期信号截断对频谱的影响。 DFT 变换频谱泄漏的根本原因是信号的截断。即时域加窗,对应为频域卷积,因此,窗函数的主瓣宽度等就会影响到频谱。 实验表明,连续周期信号截断时持续时间与信号周期呈整数倍关系时,利用DFT 变换可以得到精确的模拟信号频谱。举一个简单的例子: ()ππ2.0100cos +=t Y 其周期为0.02。截断时不同的持续时间影响如图一.1:(对应程序shiyan1ex1.m ) 图 错误!文档中没有指定样式的文字。.1 140.0160.0180.02 截断时,时间间期为周期整数倍,频谱图 0.0250.03 20 40 60 80 100 截断时,时间间期不为周期整数倍,频谱图

其次,采样频率的确定。 根据Shannon 采样定理,采样带限信号采样频率为截止频率的两倍以上,给定信号的采样频率应>1/7.92,取16。 再次,DFT 算法包括时域采样和频域采样两步,频域采样长度M 和时域采样长度N 的关系要符合M ≧N 时,从频谱X(k)才可完全重建原信号。 实验中信号R 经采样后的离散信号不是周期信号,但是它又是一个无限长的信号,因此处理时时域窗函数尽量取得宽一些已接近实际信号。 实验结果如图一.2:其中,0点位置的冲激项为直流分量0.6造成(对应程序为shiyan1.m ) 图 错误!文档中没有指定样式的文字。.2 ?ARMA (Auto Recursive Moving Average )模型: 将平稳随机信号x(n)看作是零均值,方差为σu 2的白噪声u(n)经过线性非移变系统H(z)后的输出,模型的传递函数为 020406080100120140160180200 0.4 0.50.60.7 0.800.050.10.150.20.250.30.350.40.450.5 50100 150

基于matlab的FFT算法程序设计

数字通信课程设计报告书 课题名称 基于matlab 的FFT 算法程序设计 姓 名 学 号 院 系 物理与电信工程系 专 业 电子信息工程 指导教师 2010年 01 月15日 ※※※※※※※※※ ※ ※ ※※ ※※ ※※ ※※※※※ ※※ 2007级数字通信 课程设计

基于matlab的FFT算法程序设计 0712401-36 李晔 (湖南城市学院物理与电信工程系通信工程专业,益阳,413000) 一、设计目的 1.通过该设计,进一步了解MATLAB软件。 2.通过该设计,进一步熟悉MATLAB的语法规则和编辑方式。 3.通过该设计,掌握傅里叶变换的含义和方法。 二、设计的主要要求 掌握Fourier变换,解了关于MATLAB软件在数字信号处理方面的应用,熟悉MATLAB的语法规则和编程。用MATLAB实现快速Fourier变换。 三、整体设计方案 对信号x=sin(2*pi*f0*t)进行频谱分析,用MATLAB仿真。选取抽样频率为fs=100Hz,依照下列条件用MATLAB软件对信号xt进行傅里叶变换y=fft(xt,N)并绘制频谱图,观察所产生的六幅频谱图进行对比,并进行分析。 四、程序设计 fs=100;%设定采样频率 N=128; n=0:N-1; t=n/fs; f0=10;%设定正弦信号频率

%生成正弦信号 x=sin(2*pi*f0*t); figure(1); subplot(321); plot(t,x);%作正弦信号的时域波形 xlabel('t'); ylabel('y'); title('正弦信号y=2*pi*10t时域波形'); grid; %进行FFT变换并做频谱图 y=fft(x,N);%进行fft变换 mag=abs(y);%求幅值 m=length(y); f=(0:m/2-1)'*fs/m;%进行对应的频率转换 figure(1); subplot(322); plot(f,mag(1:m/2));%做频谱图 axis([0,100,0,80]); xlabel('频率(Hz)'); ylabel('幅值'); title('正弦信号y=2*pi*10t幅频谱图N=128'); grid; %求均方根谱 sq=abs(y); figure(1); subplot(323); plot(f,sq(1:m/2)); xlabel('频率(Hz)'); ylabel('均方根谱');

利用MATLAB编写FFT快速傅里叶变换

一、实验目的 1.利用MATLAB 编写FFT 快速傅里叶变换。 2.比较编写的myfft 程序运算结果与MATLAB 中的FFT 的有无误差。 二、实验条件 PC 机,MATLAB7.0 三、实验原理 1. FFT (快速傅里叶变换)原理: 将一个N 点的计算分解为两个N/2点的计算,每个N/2点的计算再进一步分解为N/4点的计算,以此类推。根据DFT 的定义式,将信号x[n]根据采样号n 分解为偶采样点和奇采样点。设偶采样序列为y[n]=x[2n],奇采样序列为z[n]=x[2n+1]。 上式中的k N W -为旋转因子N k j e /2π-。下式则为y[n]与z[n]的表达式: 2. 蝶形变换的原理:

下图给出了蝶形变换的运算流图,可由两个N/2点的FFT (Y[k]和Z[k]得出N 点FFT X[k])。同理,每个N/2点的FFT 可以由两个N/4点的FFT 求得。按这种方法,该过程可延迟后推到2点的FFT 。 下图为N=8的分解过程。图中最右边的为8个时域采样点的8点FFTX[k],由偶编号采样点的4点FFT 和奇编号采样点的4点得到。这4点偶编号又由偶编号的偶采样点的2点FFT 和奇编号的偶采样点的2点FFT 产生。相同的4点奇编号也是如此。依次往左都可以用相同的方法算出,最后由偶编号的奇采样点和奇编号的偶采样点的2点FFT 算出。图中没2点FFT 成为蝶形,第一级需要每组一个蝶形的4组,第二级有每组两个蝶形的两组,最后一级需要一组4个蝶形。 四、实验内容 1.定义函数disbutterfly ,程序根据FFT 的定义:]2 [][][N n x n x n y + +=、n N W N n x n x n z -+ -=])2 [][(][,将序列x 分解为偶采样点y 和奇采样点z 。

用matlab进行fft谐波分析

FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。 虽然很多人都知道FFT是什么,可以用来做什么,怎么去做,但是却不知道FFT之后的结果是什意思、如何决定要使用多少点来做FFT。 现在就根据实际经验来说说FFT结果的具体物理意义。一个模拟信号,经过ADC采样之后,就变成了数字信号。采样定理告诉我们,采样频率要大于信号频率的两倍,这些我就不在此罗嗦了。 采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方。 假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位。第一个点表示直流分量(即0Hz),而最后一个点N的再下一个点(实际上这个点是不存在的,这里是假设的第N+1个点,也可以看做是将第一个点分做两半分,另一半移到最后)则表示采样频率Fs,这中间被N-1个点平均分成N等份,每个点的频率依次增加。例如某点n所表示的频率为:Fn=(n-1)*Fs/N。由上面的公式可以看出,Fn所能分辨到频率为为Fs/N,如果采样频率Fs 为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,则结果可以分析到0.5Hz。如果要提高频率分辨力,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。 假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是An=根号a*a+b*b,相位就是Pn=atan2(b,a)。根据以上的结果,就可以计算出n点(n≠1,且n<=N/2)对应的信号的表达式为:An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。对于n=1点的信号,是直流分量,幅度即为A1/N。 由于FFT结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。 好了,说了半天,看着公式也晕,下面以一个实际的信号来做说明。 假设我们有一个信号,它含有2V的直流分量,频率为50Hz、相位为-30度、幅度为3V 的交流信号,以及一个频率为75Hz、相位为90度、幅度为1.5V的交流信号。用数学表达式就是如下: S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180) 式中cos参数为弧度,所以-30度和90度要分别换算成弧度。我们以256Hz的采样率对这个信号进行采样,总共采样256点。按照我们上面的分析,Fn=(n-1)*Fs/N,我们可以知道,每两个点之间的间距就是1Hz,第n个点的频率就是n-1。我们的信号有3个频率:0Hz、50Hz、75Hz,应该分别在第1个点、第51个点、第76个点上出现峰值,其它各点应该接近0。实际情况如何呢?我们来看看FFT的结果的模值如图所示。

用matlab实现fft算法

A1=str2double(get(handles.edit8,'String')); A2=str2double(get(handles.edit9,'String')); F1=str2double(get(handles.edit10,'String')); F2=str2double(get(handles.edit11,'String')); Fs=str2double(get(handles.edit12,'String')); N=str2double(get(handles.edit13,'String')); t=[0:1/Fs:(N-1)/Fs]; x=A1*sin(2*pi*F1*t)+A2*sin(2*pi*F2*t); %信号x的离散值 axes(handles.axes1) %在axes1中作原始信号图 plot(x); grid on m=nextpow2(x);N=2^m; % 求x的长度对应的2的最低幂次m if length(x)

实验三用FFT对信号进行频谱分析和MATLAB程序

实验三 用FFT 对信号进行频谱分析 一 实验目的 1 能够熟练掌握快速离散傅立叶变换的原理及应用FFT 进行频谱分析的基本方法; 2了解用FFT 进行频谱分析可能出现的分析误差及其原因; 二 实验原理 1.用DFT 对非周期序列进行谱分析 单位圆上的Z 变换就是序列的傅里叶变换,即 ()()j j z e X e X z ωω== (3-1) ()j X e ω是ω的连续周期函数。对序列()x n 进行N 点DFT 得到()X k ,则()X k 是在区间[]0,2π上对()j X e ω的N 点等间隔采样,频谱分辨率就是采样间隔 2N π。因此序列的傅里叶变换可利用DFT (即FFT )来计算。 用FFT 对序列进行谱分析的误差主要来自于用FFT 作频谱分析时,得到的是离散谱,而非周期序列的频谱是连续谱,只有当N 较大时,离散谱的包络才能逼近连续谱,因此N 要适当选择大一些。 2.用DFT 对周期序列进行谱分析 已知周期为N 的离散序列)(n x ,它的离散傅里叶级数DFS 分别由式(3-2)和(3-3) 给出: DFS : ∑-=-=1 2)(1N n kn N j k e n x N a π , n =0,1,2,…,N -1 (3-2) IDFS : ∑-==1 02)(N k kn N j k e a n x π , n =0,1,2,…,N -1 (3-3) 对于长度为N 的有限长序列x (n )的DFT 对表达式分别由式(3-4)和(3-5)给出: DFT : ∑-=-=1 02)()(N n kn N j e n x k X π , n =0,1,2,…,N -1 (3-4) IDFT : ∑-==1 02)(1)(N k kn N j e k X N n x π , n =0,1,2,…,N -1 (3-5) FFT 为离散傅里叶变换DFT 的快速算法,对于周期为N 的离散序列x (n )的频谱分析便可由式(3-6)和(3-7)给出:

基于MATLAB的FFT算法实现(论文)

基于MATLAB的FFT算法实现 摘要 MATLAB软件是目前全世界范围内非常流行的具有很强的科学计算和图形界面的软件系统。利用MATLAB的强大运算功能,可以解决数字信号处理过程中遇到的许多问题。本文给出了基于MATLAB软件实现信号DFT变换和FFT频谱分析的方法。利用MATLAB软件方法,使得设计方便、快捷,大大减轻了工作量。并且,在信号DFT变换中可以清楚得看到DFT变换结果和截取长度之间的关系。通过编程仿真可以得到序列的幅频特性曲线,便于对信号进行谱分析。 FFT(Fast Fourier Transformation),即为快速傅立叶变换,是离散傅立叶变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。 在实际应用中,FFT是最常见的数字信号处理算法,它在各种数字信号处理系统中扮演重要的角色。在信号处理过程中。频域分析往往比时域分析方便和高效,FFT是时域和频域转换的基本运算。 关键词:FFT算法;MATLAB;数字信号处理;频谱分析

THE FFT ALGORITHM BASED ON MATLAB ABSTRACT MATLAB software is very popular around the world have a strong scientific computing and graphic interface of the software system. Using the powerful operation function of MATLAB, can solve many problems encountered in the process of digital signal processing. In this paper, based on DFT MATLAB software to realize signal transform and FFT spectrum analysis method. Using MATLAB software method, makes the design of convenient, quick, greatly reduce the workload. And the signal DFr transform can be clearly seen in the DFT transform results and clipping of the relationship between the length. Sequences can be obtained by programming the simulation of the amplitude frequency characteristic curve, facilitate the signal spectrum analysis. FFT (Fast Fourier changed), which is Fast Fourier transform, is a Fast algorithm of discrete Fourier transform, it is according to the odd and even of discrete Fourier transform, virtual and real features, the discrete Fourier transform algorithm was improved. It the theory of Fourier transform and found nothing new, but the application in computer systems or digital system discrete Fourier transform, can be said to be into a big step. In practical applications, the FFT is the most common form of digital signal processing algorithm, it is play an important role in all kinds of digital signal processing system. In the process of signal processing. Frequency domain analysis than time-domain analysis is convenient and efficient, FFT is the basic operation of the time domain and frequency domain transformation. Key words:FFT algorithm; MATLAB; Digital signal processing; Spectrum analysis

DSP课程设计基于MATLAB的FFT算法实现

1 引言 (1) 2 基于MATLAB的FFT算法实现 (2) 2.1系统总体流程图 (2) 2.2 FFT运算规律及编程思想 (3) 2.2.1语音信号的采集 (3) 2.2.2 DIT-FFT算法的基本原理 (3) 2.2.3 DIT-FFT算法的运算规律及编程思想 (5) 3 Matlab程序实现 (10) 4 系统人机对话界面 (13) 4.1 GUI简介 (13) 4.2 界面设计 (13) 4.3 运行调试 (14) 5 心得体会 (16) 参考文献 (17) 附录Ⅰ (18) 附录Ⅱ (21)

MATLAB是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks公司出品的商数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。 MATLAB 的应用范围非常广,包括信号和图像处理、通讯、控制系统设计、测试和测量、财务建模和分析以及计算生物学等众多应用领域。附加的工具箱(单独提供的专用 MATLAB 函数集)扩展了 MATLAB 环境,以解决这些应用领域内特定类型的问题。它以矩阵运算为基础,把计算、可视化、程序设计融合在一个简单易用的交互式工作环境中,是一款数据分析和处理功能都非常强大的工程适用软件。它可以将声音文件变换为离散的数据文件,然后利用其强大的矩阵运算能力处理数据,如数据滤波、傅立叶变换、时域和频域分析、声音回放以及各种图的呈现等,它的信号处理与分析工具箱位语音信号分析提供了十分丰富的功能函数,利用这些功能函数可以快捷而又方便的完成语音信号的处理和分析以及信号的可视化。数字信号处理是MATLAB重要应用的领域之一。 对于有限长序列x(n),若要求其N点的傅里叶变换(DFT)需要经过2N次复数乘法运算和N*(N-1)次复数加法运算。随着N的增加,运算量将急剧增加,而在实际问题中,N往往是较大的,如当N=1024时,完成复数乘法和复数加法的次数分别为百万以上,无论是用通用计算机还是用DSP芯片,都需要消耗大量的时间和机器内存,不能满足实时的要求。因此,DFT的这种运算只能进行理论上的计算,不适合对实时处理要求高的场合。因此,研究作为DSP的快速算法的FFT是相当必要的,快速傅里叶变换(FFT)是为提高DFT运算速度而采用的一种算法,快速算法的种类很多,而且目前仍在改进和提高,它是根据离散傅里叶变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。基于本学期所学的DIT-FFT的运算规律和编程思想以及Matlab的学习和使用,本课设要求在Matlab环境下编写基2 DIT-FFT算法实现对离散信号的快速傅里叶变换,再与Matlab软件自带的FFT函数实现对离散信号的傅里叶变换进行比较,如果得到的频谱相同,那么我们编写的程序就是正确的。其中离散信号是通过PC自带的录音机录制一段wav语音信号,用Matlab采样得到离散序列x1。如果有能力可以选做系统人机对话界面。用GUI界面完成人机交互方便使用的。本课程设计主要是对数字信号的分析。

C语言、Matlab实现FFT几种编程实例

C语言、MATLAB实现FFT几种方法 总结前人经验,仅供参考 ///一、 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////c语言程序////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include #include #include #define PI 3.1415926535897932384626433832795028841971 //定义圆周率值#define FFT_N 128 //定义福利叶变换的点数 struct compx {float real,imag;}; //定义一个复数结构struct compx s[FFT_N]; //FFT输入和输出:从S[1]开始存放,根据大小自己定义/******************************************************************* 函数原型:struct compx EE(struct compx b1,struct compx b2) 函数功能:对两个复数进行乘法运算 输入参数:两个以联合体定义的复数a,b 输出参数:a和b的乘积,以联合体的形式输出 *******************************************************************/ struct compx EE(struct compx a,struct compx b) { struct compx c; c.real=a.real*b.real-a.imag*b.imag; c.imag=a.real*b.imag+a.imag*b.real; return(c); } /***************************************************************** 函数原型:void FFT(struct compx *xin,int N) 函数功能:对输入的复数组进行快速傅里叶变换(FFT) 输入参数:*xin复数结构体组的首地址指针,struct型 *****************************************************************/ void FFT(struct compx *xin) {

8点基于DIT的FFT的实现

课程设计任务书 学生姓名:专业班级: 指导教师:工作单位: 题目:8点基于DIT的FFT的实现 初始条件: 具备Matlab编程能力; 熟悉基于DIT的FFT的实现原理; 提供编程所需要的计算机一台。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1、编写一个8点的基于DIT的FFT函数,不能使用matlab自带的FFT实现函数; 2、并调用该函数实现16点的FFT运算,用matlab自带函数对运行结果结果进行验证; 3、完成符合学校要求的设计说明书。 时间安排: 一周,其中3天程序设计,2天程序调试 指导教师签名:年月日 系主任(或责任教师)签名:年月日

目录 摘要................................................................................................................................................ I 1 概述 (1) 1.1 快速傅立叶变换(FFT)简介 (1) 1.2 MATLAB简介 (2) 2 直接计算DFT的问题及改进 (3) 2.1直接计算DFT的运算量 (3) 2.2 改进措施 (4) 3 按时间抽选的基-2FFT算法(DIT-FFT) (5) 3.1 DIT-FFT算法原理 (5) 3.2 DIT-FFT的运算量 (11) 3.3 DIT-FFT算法的特点 (12) 3.4 N=16时的DIT-FFT算法 (14) 4 MATLAB程序代码 (15) 4.1 N=8点DIT-FFT代码 (15) 4.2 N=16点DIT-FFT代码 (16) 5 MATLAB仿真结果及验证 (17) 5.1 DIT-FFT函数调试 (17) 5.2 DIT-FFT函数运行结果 (18) 5.3调用系统函数验证 (19) 6 心得体会 (21) 参考文献 (22)

数字信号处理实验报告-FFT算法的MATLAB实现

数字信号处理 实验报告 实验二:FFT 算法的MATLAB 实现 一、实验目的 通过本实验的学习,掌握离散傅立叶变换的理论,特别是FFT 的基本算法以及其在在数字信号处理中的应用。 二、实验内容 题一:若x(n)=cos(n*pi/6)是一个N =12的有限序列,利用MATLAB 计算它的DFT 并画出图形。 题二:一被噪声污染的信号,很难看出它所包含的频率分量,如一个由50Hz 和120Hz 正弦信号构成的信号,受均值随机噪声的干扰,数据采样率为1000Hz ,对这污染信号进行傅立叶变换,以检查所包含的频率分量 题三:调用原始语音信号mtlb ,对其进行FFT 变换后去掉幅值小于1的FFT 变换值,最后重构语音信号。 (要求有四幅语音信号的频谱图在同一图形窗口以便比较:分别是1、原始语音信号;2、FFT 变换;3去掉幅值小于1的FFT 变换值;4、重构语音信号) 三、实验原理 1、有限长序列x(n)的DFT 的概念和公式: ???????-≤≤=-≤≤=∑∑-=--=10101 0)(1)(10)()(N k kn N N n kn N N n W k x N n x N k W n x k x 2、基2的FFT 算法 四、实验条件 (1)微机 (2)MATLAB 编程工具 五、用matlab 程序实现: 实验一:

clc; N=12; n=0:N-1; k=0:N-1; xn=cos(n*pi/6); W=exp(-j*2*pi/N); kn=n'*k Xk=xn*(W.^kn) stem(n,Xk); xlabel('k'); ylabel('Xk'); 实验二 clc; fs=1000; N=1024; n=0:N-1; t=n/fs; x=sin(2*pi*50*t)+sin(2*pi*120*t)+rand(1,N);

相关主题
文本预览
相关文档 最新文档