电子说
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只是做了连续频谱的采样) 。
运算结果如下:
全部0条评论
快来发表一下你的评论吧 !