FFT(快速傅里叶变换)是数字信号处理的超级经典算法,学过DSP或者芯片设计的人大多知道这个算法。但是,大家是否想过,为什么数字信号处理会有那么多FFT呢?有人会说,为了分析信号的频谱。那么下边的问题就是,分析频谱对我们的日常需求,比如手机打电话,雷达测量速度和方向等等一些与实际需求有什么联系?为什么FFT如此重要?本文举一些简明的例子,阐释一下FFT到底有什么用。
先回忆一下FFT是什么。上世纪70年代之前,我们主要通过模拟电路来进行信号处理,比如大家熟悉的用二极管和电容进行AM调制信号的包络检波一样,随着数字系统的普及,我们可以用处理器或者数字电路更为精确的处理信号,比如我们做AM检波,实际上可以用载波把信号混频(与余弦函数做乘法),再进行低通滤波,那么这个过程可以用数字电路的乘法器和FIR滤波器来做,FIR比二极管和电容构成的低通滤波器阶数高的多,性能自然更为理想,同时,由于数字电路易于做成集成电路,因此我们更多地是将原先的模拟信号(比如麦克风的音频)通过模拟-数字转换器,转换为数字值后进行处理。
这样的系统有几个问题,一个是信号需要被采样,其次是信号被分成若干量阶。信号被采样,也就意味着我们得到的不是原先的连续的信号了,而是一个离散的一些采集的样点。那么对时域信号进行采样,必然造成频谱的周期化,如果原先频谱仅限于有限的带宽,那么周期化之后,只要周期大于原先的带宽,那么实际上没有混叠失真。而数字电路限制我们只能进行乘加等二进制域的计算,获得另一些离散的点,因此我们不得不将频谱也进行“采样”,频域的抽样导致时域上又周期化了,好在如果我们只取有限的长度,可以假定没采集的部分进行的是周期化延拓(由于平稳系统认为信号可以分解为正余弦函数的组合,而正余弦函数是可以周期延拓的,所以这个假设没有问题),那么我们得到了时域和频域都是离散的周期延拓的点集。
既然是周期延拓的,那么延拓的部分和主值区间(靠近0的那个周期)是重复的数值,因此我们只保留主值区间的部分,这样的时域点集到频域点集的变换关系叫离散傅里叶变换(DFT)。然而它的运算过于复杂,因此库里和图基(Cooley,Tukey)两人力图化简它,找到了这个算法的一些内在运算规律,得到的运算量由原来的平方级降为NlogN级,这个算法就叫按时间抽取快速傅里叶变换,桑德和图基研究按频率抽取也可以得到类似的低复杂度算法,这类算法统称快速傅里叶变换(FFT),FFT的计算结果和DFT是完全等价的,只是运算量降低了。又由于时频变换能量不变(Parseval定理),所以频域的绝对数值没有意义了,只要获得相对数值即可,因此数字系统中的量化阶数以及数字系统溢出后的缩放调整对FFT的计算结果影响仅在于精度,而不是对错,从而,FFT正好满足数字系统可以处理的前提,同时运算复杂度不高,因此获得了广泛的应用。
那么,模拟系统能不能做类似的FFT呢?可以,构造与频点数量相同个数的带通滤波器,组成一个阵列,信号进入这个带通滤波器组,每个滤波器只保留了相应频点为中心的类似于sinc的频响函数,那么就可以得到FFT的结果。当然,这个代价不是一般的系统可以负担的。所以,在没有数字电路普及的年代里,FFT基本是数学算法,是不可实现的。
现在知道FFT是什么了,它是傅里叶变换的时频离散后的可数字计算的一个变换算法,这个算法计算的对象是时域上周期延拓的点集的主值区间部分(有限个数),计算的结果是频谱,也是周期延拓的点集的主值区间部分,与傅里叶变换等价的前提是采样速率大于信号最大频率的2倍(高频延拓不混叠),同时时域有限长度之外的部分假定按周期延拓到无穷。为了满足第一个前提,我们往往在信号处理之前(甚至是模数转换之前)加入一个低通滤波器,使得高频分量被抑制,对于比如声音或者在某个频带内的通信系统,高频分量本身就是无意义的,因此这个前提可以满足。
为了满足第二个前提,我们需要保证采集的样本在采集区外的数值与假想的周期延拓的数值一致,这显然做不到,做不到导致的结果是什么呢?频谱出现泄漏,也就是频谱能量会分散到带外(比如余弦不再是一根谱线,而是sinc),分散的过程可以看做时域加矩形窗(和门函数相乘)导致的,那么频谱相当于和sinc函数的卷积,时域窗越小(也就是采集的点越少),频谱sinc的主瓣越宽,频谱泄露越严重,也就是原先一个频点的能量会被散发到更大的附近范围里,而自己的峰值会降低,如果相邻点各有个峰值,那么散发后就难以分辨了,所以系统的实际分辨率与时域窗的长度成反比,采集更多的点,才有可能获得更精细的频谱。那么,有没有办法减轻这个泄露呢?那么,最好让边界处的取值点起的作用小一点,中间的部分权重大一点,那么实际上就乘了一系列加权的数值,这些数值形成的是一个时域的窗函数,加窗之后,频谱泄露会减轻,能量会集中一些,但是主瓣会更宽,这是一个权衡。就这样,两个前提条件得以近似满足,虽然不是完全,但是也够用了。
这些都是比较基础的知识了,下面说说有趣的事情。如果FFT只用于分析确定性的平稳信号,类似于正弦或者若干正弦的复合的无限长周期信号之类,看看谱线什么的,它将不会有今天的地位。它还能用来干嘛呢?
1,做快速相关
相关在数字信号处理的重要程度可以说是炙手可热级别的。简单的讲,如果你不知道信号中的某个参数(比如频率,或者相位,或者码片序列,或者成型波形),那么你就设计带有这个参数的所有可能值的一组信号跟它做一下相关,看看结果最大的那个,所对应的参数就是最有可能的了,这个算法叫做最大似然检测,相关往往作为最大似然检测的实际执行过程。而很多时候,这个需要被测量的参数是和时间延迟有关的,举个例子,手机开机后,要和基站同步,也就是说要知道每个数据帧开始的时刻,那么怎么得到呢?首先基站和手机有一个协议,在帧的某个位置会有一个固定的序列,这个序列调制后会有一个固定的波形,那么手机就可以制造有若干延迟的波形副本,与接收到的波形相关,那么得到峰值所对应的延迟就可以换算出帧的起始时刻。
有关相关的强大以后找机会再聊,那么相关和FFT有什么关系呢?相关和卷积都是复杂度非常大的运算,每计算一个延迟下的相关值,都需要两个波形所有非零部分对应相乘并且加和得到,所有的延迟下相关值构成一条曲线,叫相关函数。而当把信号转换为频域后,获取相关函数的过程可以被简化成一个信号的共轭(把虚部取反)与另外一个信号相乘的过程。即使加上正负两个FFT的开销,算下来仍然比原来小很多(N方和NlogN级的差别),这样一来,相关算法的复杂度被大大降低。
那么有时候,输入的信号太长了,怎么办?大家又发现相关操作可以分段进行,可以逐段相关最后拼合起来,就得到了相关后的结果。这样一来,手机的定时的操作可以用一个快速相关的过程搞定。再举个例子,雷达如果想定位一个目标的距离,怎么做呢?最简单的想法是打一个冲击信号,看它什么时候回来,时延乘上光速除以2就是距离,但是,类似于冲激函数的波形对于功放来讲实在很难实现,因此雷达系统实际上打出去的是具有一定时间长度的带宽很大的信号,比如chirp或者某种成型,在接收时,我们需要知道这个信号被延迟了多少,因此把它和本地的成型波形副本进行相关,成功的相关操作会得到一个带有若干峰值点的波形,这些峰值点对应的位置就是若干目标的回波时延值,换算出来就是位置,这个将波形能量压缩到点的过程一般是采用FFT实现的。
2,快速卷积
类似与相关,信号处理的一大操作类型是卷积,一个系统可以采用系统函数来表征,其输出就是输入数据卷积上系统函数,或对于平稳的随机信号而言,输出为输入数据卷积上系统函数模值的平方。卷积操作常常用于对信号进行FIR滤波,因为FIR滤波器是不带反馈的,没有记忆,可以用卷积算法直接得到输出。那么,如果数据是块数据(不是按时钟节拍的流数据),用快速卷积就可以降低运算量。其过程与快速相关雷同,区别是频域相乘时无需共轭。想一下,如果FM收音机收到好几个台,相互靠的很近,怎么办?可以采用阶数比较高的FIR带通滤波器选出想要的那个台,例如德生的DSP芯片解调的收音机可以做到0.01MHz的分辨率,这就是现在我们的数字FM收音机比原来的模拟FM收音机音质好的原因之一。
3,经典谱估计
在实际的生活里,我们不可能见到的都是确定的无限长的正余弦类的叠加的信号,最起码这样的信号在传输过程中也会叠加上噪声,即高斯白噪声,因此傅里叶变换频谱分析的前提无法满足,这样的时频变换也就没有了实际意义,退一步,我们可以分析的往往是无限长的,随机的,但在随机意义上(自相关等二阶统计特性上)平稳的信号,如果达不到这个前提,起码可以在某个时间段内满足。这样的信号往往自身是随机的,但是自相关和互相关特性往往包含信号的二阶统计信息。而对于实际的系统,我们只能估计它,相关函数估计的一个基础方法是将一个信号和带有延迟并共轭后的另一个信号的点乘运算,得到的是基于延迟的函数。上文已述,用FFT就可以搞定它。
在这种随机信号的分析上,有一个重要的定理,叫做winner-khintchine定理,它证明了信号的自相关和信号的功率谱之间的关系是FFT变换。这个有意思的桥梁使得我们可以做几件事,一个是利用自相关的估计通过FFT得到功率谱,而自相关估计通过快速相关算法计算。细心的人会发现,这个流程最后一个FFT紧接IFFT,抵消后实际上只需要一个FFT,而不是三个,那么这样的功率谱估计叫周期图法功率谱估计,也是我们最经常使用的经典谱估计。值得注意的是,信号的功率谱实际上对应的是自相关的理想值,而不是通过接收到的数据得到的估计值(上边用快速相关算的是估计值),这个估计如果采用了边界处的点,那么相关的数值由于假象边界外数值为0而造成了偏差,如果我们只利用中心的若干点,那么会相对准确一些,这个计算自相关后选取可靠的点,再进行傅里叶的做法叫做自相关法功率谱估计。
最有趣的是,两个方法可以复合使用,先对数据分段交叠进行周期图估计,取这些结果的均值IFFT得到自相关,取自相关的加窗(类似于上文的加权的作用)得到更好的自相关估计,再FFT得到谱估计,这个方法是认为改进的比较好的经典谱估计,叫Welch法。这些方法之所以能够被接纳,主要是由于FFT的桥梁的作用。否则,这样的方法就无法应用到系统中了。频谱仪这类的仪器就可以采用这些经典谱估计算法(当然也有扫频的)。另外,由于功率谱的峰值的下标代表着信号的频率,如果这个信号是物体的反射回波,那么可以根据多普勒公式换算出物体的速度,一类采用这种测速机制的雷达叫脉冲多普勒雷达。
4,现代谱估计
为了取得更精确的谱估计,有些学者认为可以通过构造模型,并且设待定参数的方法,获得更好的谱估计,只要系统模型设计得合理,待定参数被估计得有效,那么对信号的谱估计可以转化为这个模型的谱,这样就可以得到更为精确的估计效果。这样的基于模型的谱估计叫现代谱估计。那么怎么叫合理呢?大家认为欧式距离最小化比较合理,也就是最小均方准则,在这个准则下,加上线性系统的前提条件,那个有趣的平方的期望被转化为系统的自相关和互相关项(Wiener-Hopf方程),而这两个项的估计方法,无需多问,也只能是采用快速相关完成比较有效,这就是FFT在有了现代谱估计,AR模型,MA模型等理论以后,仍能派上用场的一些原因。起码在计算上,自相关法是已知的AR参数估计方法中最简单的一种。
估计出模型后,我们还可以做别的事情,比如根据模型来估计信号未来的趋势,叫做信号的预测,也可以对已经采集的信号通过这个模型进行平滑处理等等。再比如,如果想测量一个物体的方位怎么做?在现代雷达中,一般会有一个天线阵列,如果接收到的物体的回波与天线阵列有个角度的话,那么不同的天线会接收到回波不同时刻(不同相位,幅度基本不变)的值,那么,可以利用若干天线的回波信号估计出若干目标物体的方位角度,叫做到达角(DOA)估计,有两个经典的算法:MUSIC和ESPRIT,他们都是二阶统计信号算法,依赖于自相关矩阵作为计算的起始,因而FFT可以作为自相关估计的快速算法。
5,构建正交系统
一个FFT得到的离散频谱和原先的连续频谱在离散点之间值遵循什么规律?这些部分可以认为是一族正交的sinc函数叠加的结果,也可以认为是一个主瓣宽度为频谱间隔宽度的sinc函数与冲积函数串卷积的结果(因为时域是矩形窗与原信号相乘的结果),此处的正交指的是一个离散点的值与另一个离散点的值没有关系,互不影响,这样的系统可以用来构建通信收发信机,由于采用sinc函数正交的效果是频谱效率最好的(采用抑制带宽的办法虽然可以抑制每个子带的带外旁瓣,但是会造成时域信号的延拓,从而造成符号间干扰)。
正交频分复用(OFDM)正是利用了各个离散频点之间的正交特性构建了一个高性能低运算复杂度的收发机。其工作原理是首先将要发射的数据放置在各个频点上,一般采用QAM或PSK调制,之后IFFT得到时域信号发射出去,这些频点数据形成的时域发射波形实际上是一组频率倍数关系的正交余弦函数,接收机收到这样的信号后,再进行FFT,转换到频域(或者说是正交域),从而得到每个频点上的传输的符号的估计。
这个系统的巧妙之处在于克服了宽带无线通信系统的多径衰落,因为,从整个频带上看,信道不是一个常数,有的频点的数值增强了,有的减弱了,同时还有相位扭曲。但是当把它分成很多正交的子信道之后,这些信道内部可以看做为平坦的,那么通过均衡器,比如迫零均衡之后,我们就可以得到类似于冲击响应的子信道特性,从而解调出每个子信道符号的值。由于子信道之间正交,互不干扰,因此可以实现多载波通信,并行传输所有的数据,大大加快了传输速度,这也就是4G移动通信速度可以达到百兆甚至更高的核心技术之一。
如今,FFT运算能力已经成为处理器的性能标尺之一。比如一个TI
C6000系列的高性能DSP处理器,可以在半个时钟输出一个数据点,那么可以做到几百兆比特每秒的处理速率。硬件的优化使得FFT已经成为信号处理算法内部的高速公路。
FFT的意义可能远不止这些,而且也有许多的变种,比如二维FFT,DCT等等,在图像领域发挥着图像模糊(清晰),轮廓化,压缩等贡献。本文只是一个引子,让致力于研究和开发数字系统的同行能够更清晰地理解系统的原理和算法的实质。所提及的内容都是信号处理的基础书籍,一般的硕士课程多有涉及,如此整理一番也算有点新意,仅望对大家有所借鉴。
←