文档库 最新最全的文档下载
当前位置:文档库 › 数字信号处理课设基于MATLAB的FFT算法的设计

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

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

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)

数字信号处理(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 对所给连续时间和离散时间信号做了频谱分析。

2 FFT 算法设计原理

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

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

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

本次课设要求用用基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点序列,分别记为)(1n x 和)(2n x ,将x(n)的DFT 转化为x1(n)和x2(n)的DFT 的计算。

)

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

==

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

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

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

以此类推,还可以把)(1n x 和)(2n x 按n 值得奇偶分为两个序列,这样就达到了降N 得目的,从而减少了运算量。FFT 对DFT 的数学运算量改进:

直接采用DFT 进行计算,运算量为2N 次复数乘法和)1(-?N N 次复数乘法。 当采用M 次FFT 时,由M

N 2=求得M=logN ,运算流图有M 级蝶形,每一级都由N/2个蝶形运算构成,这样每一级蝶形运算都需要N/2次复数乘法和N 次复数加法。M 级运算共需要复数乘法次数为2/)(M N C ?=,复数加法次数为

M

N C ?=。

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

()()()()()()(

)()()(

)1

N

021

N

N

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

2

212N N

0,10,1112

2

2121

N

2

N

0,1

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

,

,1,0,

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

??

=+=N r r x r x r x r x

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的指令窗口

令来实现的,这些函数有些可以通过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数据文件等,这些操作都可以通过对应的右键快捷

菜单完成。

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

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处理结果如下:

图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处理结果如下:

图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处理结果如下:

图3-10自建IFFT结果

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

3.2.5 内置的FFT程序及分析

利用MATLAB自带的FFT算法实现对灰度图像处理的程序如下:

F=fft2(image);

FC=fftshift(F);

S=log(1+abs(FC));

subplot(2,4,7)

imshow(S,[]);

title('内置FFT2结果');

MATLAB处理结果如下:

图3-11 MATLAB自带FFT结果

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

3.2.6 内置的IFFT程序及分析

利用MATLAB自带的IFFT算法实现对灰度图像处理的程序段如下:

array=ifft2(F);

array=round(abs(array));

subplot(2,4,8);

imshow(array,[]);

title('内置IFFT2结果');

MATLAB处理结果如下:

图3-12 MATLAB自带FFT结果

上图是利用MATLAB自带FFT算法实现对图像的FFT变换处理结果。3.3自建FFT与内置FFT图形及比较

利用自建FFT和MATLAB自带的FFT算法实现对灰度图像处理如下:

图3-13 自建FFT结果图3-14 MATLAB自带FFT结果上图3-13是利用自建的FFT对图片进行的变换处理,图3-14是利用MATLAB自带的FFT函数对图片进行的处理。比较两图可以看出自建的FFT结果比自带的图片颜色稍深,而且自建的FFT结果中的频域图像与自带FFT结果频域图像稍有不同。

3.4 IFFT结果与原灰度图形及比较

IFFT算法是在对图像进行FFT算法处理的基础上对图片进行的快速傅里叶反变换。利用自建IFFT实现对灰度图像处理如下图所示。下图3-11是利用自建的IFFT对图片进行的变换处理,图3-12是原灰度图。

图3-15自建IFFT结果图3-16 灰度图像上图3-15是利用自建的IFFT对图片进行的变换处理,图3-16是原灰度图。比较两图可以看出而且自建的FFT结果和原灰度图大致相同稍有不同,而且没有原图的清晰度高,但是能够基本正确的经FFT后反变换回原图,实现了时域变换到频域又边换到时域的过程。

4 FFT算法用GUI的实现与分析

4.1 GUI简介

图形用户界面(Graphical User Interfaces,GUI)是一种人机交互的工具和方法。GUI是包含图形对象,如窗口、图标、菜单和文本等图文并茂的用户界面。用AMTLAB图形用户界面开发环境的一般步骤是:

(1)进行界面设计.

(2)设置控制属性。

(3)进行M语言编程。

在MATLAB中启动GUI,进入可GUI默认窗口界面,这里选择空白界面类型(Black GUI),单击“OK”按钮,MATLAB中启动GUI,如下图4-1所示是GUI 的界面。

图4-1 具有空白界面的GUI

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

从控制面板中选择上述控件,用鼠标将控件拖动到画布上。一般组件在没有编辑属性前,其属性值都是默认值。打开属性属性编辑器的方法是双击器件。

组建事件的发生是通过回调函数进行工作的。回调函数是用户用户指定组件

需要完成的一个动作函数。一个组件中可以包含多个回调函数,但是每一组都有的属性是Callback属性。

图4-2 GUI属性对话框图4-3 显示控件名称GUIDE可以创建一个M回调函数文件的构架,文件将自动处理并将所有的语柄传递到handles结构数组中。Handles是GUI中一个特殊的结构数组,它是GUI中所有组件共用的一个结构,该结构中包含了所有界面对象的Tag属性,通过该属性可以直接获取或者修改控件性质,而且在handles结构数组中还可以添加用户自定义的,在不同的回调函数之间共享的数据。

为了能够创建M构架文件,还需要执行“tools”菜单下的“GUI Option”命令。在弹出的对话框中选择“Generate FIG-file and M-file”单选框,在激活界面的同时,执行相应的M文件,如图4-4所示。编写好回调函数后,就可以直接运行GUI。

图4-4 选择生成M文件的属性

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

4.2 GUI实现FFT算法

4.2.1 界面设计

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

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

9个推按钮(Push button),用来运行和退出。

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

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

图4-5 完成人机界面

第二步,设置控件属性:

双击组件可以设置文本框,推按钮的属性,如显示大小,名称和默认值等。

第三步,编写回调函数。

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

第四步,运行GUI。

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

系统人机对话界面如图4-6所示。

图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中输出灰度

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

4.3 运行结果分析比较

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

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

5总结体会

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

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

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

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

参考文献

[1] 苏金明, 张莲花, 刘波. MATLAB工具箱应用[M]. 电子工业出版社

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

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

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

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

[6] 陈杰. Matlab宝典[M]. 电子工业出版社

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

相关文档
相关文档 最新文档