关于FFT的学习
笔者又学习了一次FFT,这次终于算是快学懂了。这里推荐https://www.icourse163.org/learn/NJTU-1001950001?tid=1206005212#/learn/content?type=detail&id=1210380985&cid=1212426022
北京交通大学的《数字信号》MOOC,讲得比我的授课老师好多了…话不多说,直接上干货。
两个步骤
FFT分为两个步骤。第一步:将你拥有的一个完整时间序列分解成很多个最基础的两点时间序列;第二步:将这些两点时间序列变成频域序列,并用得到的两点频域序列组合成为完整的频域序列。下面具体说。
第一个步骤
比如你拥有一个34个采样点的时间序列,那么你需要将这个序列拓展成一个采样点数为2^N的时间序列。通过补零的方式,得到你所需要的序列是:X1,X2,X3,X4,X5……X34,0,0,0……0;要补足30个0,从而使得整个序列的采样点数量达到64。
接着,按照单双数按顺序排列的方法,将这64个采样点分成2组。分别是X0,X2,X4…和
X1,X3,X5…
第二个步骤
在说明第二个步骤之前,我先来推导两个结论;
第一个结论:
两点序列的DFT可以这样算:
推导:
第二个结论:
两个长度m的DFT序列可以拼接成为一个长度为2m的DFT序列。
推导:
有了这两个结论之后,我们就可以干这两件事情:第一:我们可以求解任何一个两采样点的DFT;第二,我们可以将任何两个等长度的频域序列X1、X2合并成为一个长度为其两倍的DFT——X,X1对应的时域序列是X对应的时域序列的奇数采样点,X2对应的时域序列则是偶数。
所以第二个步骤读者应该也想出来了:将你分出的两个序列(X0,X2,X4…和
X1,X3,X5…)再次进行细分,直到分成32个采样点数为2的序列:X0,X2;X4,X6;…X62,X64;X1,X3;…X61,X63;
然后通过结论1求出这32个序列的DFT,得到32个长度为2的频域序列。
接着,通过结论2将这32个序列合并成为16个长度为4的长序列,然后再一次类推,16变32,32变64。最后就得到了最终的64点DFT。
所以,说到底,FFT的算法本质就是,将64个时域采样点全都先做一次两长度DFT,再不断地合并相加,最后得到答案。
同学们可能回问了,FFT算法也需要先求64次DFT啊,求了DFT后还要相加,好麻烦啊,为什么不直接对原序列求DFT呢?
原因就在于,我们假设计算32个2点序列DFT的计算量为A,计算1个64点序列DFT的计算量为B,后者远远大于前者。即使算上合并的计算量C,A+C也小于B。具体关于计算量的论述,大家可以去看看教材,本篇不做讨论。