一、历史放在最前头
首先,FFT是离散傅立叶变换 (DFT) 的快速算法,那么说到FFT,我们自然要先讲清楚傅立叶变换。先来看看傅立叶变换是从哪里来的?
傅立叶是一位法国数学家和物理学家的名字,英语原名是Jean Baptiste Joseph Fourier(1768-1830),Fourier对热传递很感兴趣,于1807年在法国科学学会上发表了一篇论文,运用正弦曲线来描述温度分布,论文里有个在当时颇具争议性的命题:任何连续周期信号可以由一组适当的正弦曲线组合而成。当时审查这个论文的人,其中有两位是历史上著名的数学家拉格朗日 (Joseph Louis Lagrange, 1736-1813) 和拉普拉斯 (Pierre Simon de Laplace, 1749-1827),当拉普拉斯和其他审查者投票通过并要发表这个论文时,拉格朗日坚决反对,在近50年的时间里,拉格朗日坚持认为傅立叶的方法无法表示带有棱角的信号,如在方波中出现非连续变化斜率。法国科学学会屈服于拉格朗日的权威,拒绝了傅立叶的工作。幸运的是,傅立叶还有其它事情可忙,他参加了政治运动,随拿破仑远征埃及,法国大革命后因为怕被推上断头台而一直在逃难,直到拉格朗日死后15年这个论文才被发表出来。
谁是对的呢?拉格朗日是对的:正弦曲线无法组合成一个带有棱角的信号。但是,我们可以用正弦曲线来非常逼近地表示它,逼近到两种表示方法不存在能量差别,基于此,傅立叶是对的。
二、傅里叶变换的意义
为什么我们要用正弦曲线来代替原来的曲线呢?如果我们也还可以用方波或三角波来代替,分解信号的方法是无穷的,但分解信号的目的是为了更加简单地处理原来的信号。用正余弦来表示原信号会更加简单,因为正余弦拥有其他信号所不具备的性质:正弦曲线保真度。一个正弦曲线信号输入后,输出的仍是正弦曲线,只有幅度和相位可能发生变化,但是频率和波的形状仍是一样的,且只有正弦曲线才拥有这样的性质,正因如此我们才不用方波或三角波来表示。
傅立叶变换的物理意义在哪里呢?
傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号,以累加方式来计算该信号中不同正弦波信号的频率、振幅和相位。当然,这是从数学的角度去看傅立叶变换。
那么从物理的角度去看待傅立叶变换,它其实是帮助我们改变从传统的时间域分析信号的方法转到从频率域分析问题的思维,下面的一幅立体图形可以帮助我们更好得理解这种角度的转换:
所以,最前面的时域信号在经过傅立叶变换的分解之后,变为了不同正弦波信号的叠加,我们再去分析这些正弦波的频率,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。
傅立叶变换提供给我们这种换一个角度看问题的工具,看问题的角度不同了,问题也许就迎刃而解!
三、FFT是怎样完成的
首先,按照被变换的输入信号类型不同,傅立叶变换可以分为 4种类型:
非周期性连续信号傅立叶变换 (Fourier Transform)
周期性连续信号傅立叶级数 (Fourier Series)
非周期性离散信号离散时域傅立叶变换 (Discrete Time Fourier Transform)
周期性离散信号离散傅立叶变换 (Discrete Fourier Transform)
下面是四种原信号图例:
这里我们要讨的论是离散信号,对于连续信号我们不作讨论,因为计算机只能处理离散的数值信号,我们的最终目的是运用计算机来处理信号的。所以对于离散信号的变换只有离散傅立叶变换 (DFT) 才能被适用,对于计算机来说只有离散的和有限长度的数据才能被处理,对于其它的变换类型只有在数学演算中才能用到,在计算机面前我们只能用DFT方法,我们要讨论的FFT也只不过是DFT的一种快速的算法。
DFT的运算过程是这样的:
可见,在计算机上进行的DFT,使用的输入值是数字示波器经过ADC后采集到的采样值,也就是时域的信号值,输入采样点的数量决定了转换的计算规模。变换后的频谱输出包含同样数量的采样点,但是其中有一半的值是冗余的,通常不会显示在频谱中,所以真正有用的信息是N/2+1个点。
FFT的过程大大简化了在计算机中进行DFT的过程。简单来说,如果原来计算DFT的复杂度是N*N 次运算(N 代表输入采样点的数量),进行FFT的运算复杂度是N*lg10(N),因此,计算一个1000采样点的DFT,使用FFT算法只需要计算3000次,而常规的DFT算法需要计算1000000次!
典型的时域2分裂算法图示如下:
四、变换前后信号的对应关系
以一个实际的信号为例来说明:
示波器采样得到的数字信号,就可以做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。如果要提高频率分辨率,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。
下面这幅图更能够清晰地表示这种对应关系:
变换之后频谱的宽度 (Frequency Span) 与原始信号也存在一定的对应关系。根据Nyquist采样定理,FFT之后的频谱宽度 (Frequency Span) 最大只能是原始信号采样率的1/2,如果原始信号采样率是4GS/s,那么,FFT之后的频宽最多只能是2GHz。时域信号采样周期 (Sample Period) 的倒数,即采样率 (Sample Rate) 乘上一个固定的系数即是变换之后频谱的宽度,即Frequency Span=K*(1/ΔT),其中,ΔT为采样周期,K值取决于我们在进行FFT之前是否对原始信号进行降采样(抽点),因为这样可以降低FFT的运算量。如下图所示:
可见,更高的频谱分辨率要求有更长的采样时间,更宽的频谱分布需要提高对于原始信号的采样率。当然,我们希望频谱更宽,分辨率更精确,那么示波器的长存储就是必要的!它能提供在高采样率下采集更长时间信号的能力!
五、几种典型周期函数的频谱图
频谱泄露:
所谓频谱泄露,就是信号频谱中各谱线之间相互干扰,使测量的结果偏离实际值,同时在真实谱线的两侧的其它频率点上出现一些幅值较小的假谱。产生频谱泄露的主要原因是采样频率和原始信号频率不同步,造成周期的采样信号相位在始端和终端不连续。简单来说就是因为计算机的FFT运算能力有限,只能处理有限点数的FFT,所以在截取时域的周期信号时,没有能够截取整数倍的周期。信号分析时不可能取无限大的样本。只要有截断不同步就会有泄露,如下图所示:
上图的信号频率为2.1MHz,采集时间内没有截取整数倍周期的信号,FFT运算之后谱线的泄露现象严重,可以看到能量较低的谱线很容易被临近的能量较高的谱线的泄露给淹没住。
因此,避免频谱泄露的方法除了尽量使采集速率与信号频率同步之外,还可以采用适当的窗函数。
不同的窗函数对频谱谱线的影响不同,基本形状可以参看下图:
可以看到,不同的窗函数的主瓣宽度和旁瓣的衰减速度都不一样,所以对于不同信号的频谱应该使用适当的窗函数进行处理。
矩形窗(Rectangular):加矩形窗等于不加窗,因为在截取时域信号时本身就是采用矩形截取,所以矩形窗适用于瞬态变化的信号,只要采集的时间足够长,信号宽度基本可以覆盖整个有效的瞬态部分。
汉宁窗(Von Hann):如果测试信号有多个频率分量,频谱表现的十分复杂,且测试的目的更多关注频率点而非能量的大小。在这种情况下,需要选择一个主瓣够窄的窗函数,汉宁窗是一个很好的选择。
flattop窗:如果测试的目的更多的关注某周期信号频率点的能量值,比如,更关心其EUpeak,EUpeak-peak,EUrms,那么,其幅度的准确性则更加的重要,可以选择一个主瓣稍宽的窗,flattop窗在这样的情况下经常被使用。
六、总 结
FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。
虽然很多人都知道FFT是什么,可以用来做什么,怎么去做,但是却不知道FFT之后的结果是什意思、如何决定要使用多少点来做FFT。
现在我就根据实际经验来说说FFT结果的具体物理意义。一个模拟信号,经过ADC采样之后,就变成了数字信号。采样定理告诉我们,采样频率要大于信号最高频率的两倍,这些我就不在此啰嗦了。
采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方(参见FFT原理)。FFT运算量:Nlog2N(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所能分辨到频率F0=Fs/N。假设频率分辨率F0=Fs/N限定,采样频率Fs也给定,也已知信号最高频率Fh,那么由采样定理:Fs≥2Fh得到:N=Fs/F0≥2Fh/F0,即采样点必须满足这样一个关系式。
如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒。也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz;如果采样2秒时间的信号并做FFT,相应的采样点也为原来2倍,则结果可以分析到0.5Hz。如果要提高频率分辨力,则必须增加采样点数,即延长采样时间,所以频率分辨率和采样时间是倒数关系。就是说,要想分辨出频率间隔越小的频率(频率分辨率越高),采样时间越长越好。