快速傅里叶变换FFT的用途

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

谈谈FFT到底有何用

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或者某种成型,在接收时,我们

相关文档
最新文档