MATLAB实现FFT

来源:互联网 发布:监控工程预算软件 编辑:程序博客网 时间:2024/06/05 19:41

信号的频率分析

 

利用MATLAB编程,即可实现上述的运算,程序如下:

得到结果:

可见FFT跟DFT并没有本质上的区别,基于这一点,上面先介绍DFT,后面再在DFT基础之上介绍实现FFT的编程运算。

给定一个序列,画出其DTFT之后的结果(蓝线)以及DFT之后的结果(红线),这就验证了DTFT到DFT的转化原理,即时间序列确定的情况下,其频率特性已经确定,即DTFT曲线,对其做不同点数的DFT,只是在频率曲线上进行不同程度的采样,并不改变原来的频率特性。有了这样的理论基础,我们就可以解决上面提到的那个问题,即如果序列的长度并不是2的整次幂,我们可以在序列的后面补零,序列的零值不会增加新的信息,同时可以实现FFT运算。

1.3 FFT实现

实现快速傅里叶变换的途径有两条:

1)  按时间抽取的FFT。原理是把序列按奇偶划分,实现FFT运算。

2)  按频率抽取的FFT。原理是把序列按长度从中间划分,实现FFT运算。

按时间抽取的FFT:

这样的关系,可以借助蝶形图进行表示:

 

这样就实现了一级的快速运算,如果划分之后的信号,依旧满足奇偶划分,就可以在这样的基础上,再次简化运算,原理就不再一一列出。以8点为例,最简型的DFT对应的蝶形图如下:

观察最左边的数据,排列的顺序存在这样的规律:

x(6)对应X(3)为例,在二进制编码中,3=011,而6=110;即二者反序。对应图标的形式为:

有了这样的规律,便可编程实现:

1)  对于一个M位长的二进制码,每次在个位上加一,得到对应的反序码;

2)  将得到的反序码转化为十进制的数字,并以此为下标,将原来的数据放到该下标下。

给定一个长度为8的序列:

即:

基于上面一系列的分析,即可对数据实现FFT处理。

实验验证,该FFT程序有效。

1.4 级联FFT

FFT无疑提高了数据频域分析的速度,但对于一个非常长的序列,直接进行运算既占内存,又影响速度,所以通常可以把一个长的序列分段,拼成一个二维数据,分段内、段间分别处理,级联FFT的原理就不再细细介绍,只说一下简单流程:

结果:

可见,几种FFT变换都可以实现数据的频域变换。

0 0
原创粉丝点击