一文读懂FFT

电子说

1.3w人已加入

描述

FFT--快速傅里叶变换

如果说改变世界必须了解的算法,那么FFT绝对占一席之位。

理论介绍 & 工程应用

理论介绍

傅立叶

1

傅里叶变换与离散傅里叶变换

傅里叶变换公式是基于连续定义的,但是在我们的计算机对数据的处理都是离散的,所以必须对傅里叶变换进行离散化,进而有了离散傅里叶变换。

2

快速傅里叶变换

快速傅立叶变换(FFT)是离散傅立叶(DFT)的快速算法,它是根据离散傅立叶变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。它对傅立叶变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。

傅立叶

FFT是基于DFT的一种算法,目的是为了加快DFT的计算速度。当采样点N=65536=2^16,DFT的计算量约是FFT的4096倍。

FFT典型的时域2分裂算法图示如下:

傅立叶

3

物理意义

任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。

傅立叶

因此对于一个时域信号进行采样,经FFT运算处理后可以得到该信号的频谱图(频率及对应的幅值),基于频谱图我们可以设计特定的滤波器来滤除特定频率的噪声,从而让原信号更加真实的显示出来。如飞控设计过程中,对陀螺仪/加速度信号进行频谱分析,滤除机架振动的噪声频率,从而可以降低机架振动对姿态解算、飞机控制的影响。

工程应用

编程原理

FFT计算的快速性简单来讲就是数学家利用上面提到的旋转因子W的周期性,对称性等性质进行公式化简。在算法编程中则是不断利用已经计算过的点来算新的点,即:旧点算新点。

FFT中的采样序列经拆分抽取成很多的蝶形图,对于N=8的时间抽取如下:

傅立叶

以上的拆分提取,可以称之为码位倒序,倒序获得的序列便为我们蝶形计算的初始序列,如下图的左边一列:

傅立叶

将上图大的蝴蝶组,拆分想象成一个个的蝴蝶并联及串联组成,单个蝴蝶计算如下:

傅立叶

后面的蝴蝶使用前面蝴蝶的计算后的节点,从而旧点算新点,循环计算多层,便可得到最后的频谱数列。

码位倒序及蝴蝶图的编程实现可知乎查找《C语言系列之FFT算法实现》,推导与编程实现讲的非常详细。

结果分析

虽然很多人都知道FFT是什么,可以用来做什么,怎么去做,但是却不知道FFT之后的结果是什意思、如何决定要使用多少点来做FFT。

由DFT公式可知,使用的输入值是经过ADC后的采样值(采样定理告诉我们,采样频率要大于信号频率的两倍),输入采样点的数量N决定了转换的计算规模。

N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方(参见FFT原理)。FFT运算量:Nlog2N(2为对数的底)。

变换后的频谱输出包含同样数量的采样点N,但是其中有一半的值是冗余的,通常不会显示在频谱中,所以真正有用的信息是N/2+1个点(依据采样定理)。

工程应用分析

假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。

纵坐标--幅值

假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位。

横坐标--频率

第一个点表示直流分量(即0Hz),而最后一个点N的再下一个点则表示采样频率Fs,这中间被N-1个点平均分成N等份,每个点的频率依次增加。例如某点n所表示的频率为:Fn=(n-1)*Fs/N。

由上面的公式可以看出,Fn所能分辨到频率为Fs/N,如果采样频率Fs为1024Hz,采样点数N为1024点,则可以分辨到1Hz。

如果采样N为2048点,则结果可以分辨到0.5Hz。

如果要提高频率分辨力,则必须增加 采样点数 ,也即 采样时间(总采样计算周期) 。但这在一些实际的应用中是不现实的,有些需要在较短的时间内完成分析。

举个栗子

假设我们有一个信号,它含有2V的直流分量,频率为0.5371Hz、幅度为73V的交流分量,以及一个频率为1.025Hz、幅度为50V的交流分量。

用数学表达式就是如下:

S=2+73sin(2pi0.5371t)+50sin(2pi1.025t)

我们以50Hz的采样率对这个信号进行采样,采样点N(1024)进行FFT运算。

按照我们上面的分析,Fn=(n-1)*Fs/N,我们可以知道,每两个

点之间的间距就是50/1024Hz。我们的信号有3个频率,在频率点上出现峰值,其它各点应该 接近0(离散点的FT频谱是连续的,而DFT只是做了连续频谱的采样)

运算结果如下:

傅立叶

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分