前言
建议先看以上文章
FFT是DFT的一种快速算法而不是一种新的变换,它可以在数量级的意义上提高运算速度。
直接计算DFT的问题
DFT的运算量
设有限长序列x(n),非零值长度为N,若对x(n)进行次DFT运算,共需多大的运算工作量?
- x(n)为复数,
也为复数。
- X(k)和x(n)的计算量基本相同,只差一个因子
复数乘法次数
,复数加法次数N(N-1),若N远远大于1,则这两者都近似为
,随N增大而急速增大。
改善DFT运算效率的基本途径
1、利用的性质
(单位周期复指数序列、旋转因子)具有以下性质
- 周期性
,r为整数
同理可得
- 共轭对称性
,r为整数
- 可约性
,m为整数,N/m为整数
同理可得
- 由以上性质,得出一些特殊点
FFT算法的基本思想与分类
基本思想
利用DFT系数的特性,合并DFT运算中的某些项;
把长序列DFT分解为短序列DFT,从而减少运算量。
FFT算法分类
- 时间抽选法(DIT):Decimation-In-Time
- 频率抽选法(DIF):Decimation-In-Frequency
按时间抽选(DIT)的基-2 FFT算法
算法原理
设输入序列长度为
(M为正整数),将该序列按时间顺序的奇偶分解为越来越短的子序列,称为基2按时间抽取的FFT算法。也称为Coolkey-Tukey(库利-图基)算法。
其中基2表示:
,M为整数,若不满足这个条件,可以人为地加上若干零值(加零补长)使其达到
。
将的序列x(n),按奇偶分成两组:
(1)
则其N点DFT为
利用的可约性
(2)
式中和
分别是
和
的
点DFT
(3)
(4)
由(2)式可看出,一个N点DFT已分解成两个点DFT,但是
、
以及
、
都是
点序列,即r,k 满足
。而X(k)却有 N点,用(2)式计算得到的只是 X(k)的前一半项数的结果,要用
、
表达全部的X(k)值,还必须应用
的周期性,即
这样可得到
(5)
同理可得
(6)
(5)式、(6)式说明了后半部分k值 所对应的
、
等于前半部分k值
所对应的
、
。
再利用特殊点
(7)
整理得
前半部分 可表示为
(8)
后半部分 可表示为
(9)
这样,只要求出区间的所有
和
值,即可求出0~(N-1)区间内的所有 X(k)值,大大节省了运算。
(8)式和(9)式的运算可以用下图所示的蝶形运算流图符号表示。
以为例子
继续分解,把点DFT,分解成
点DFT
先将进行分解:
(10)
同样可得
且
其中
(11)
(12)
同理也可以分解得到
其中
(13)
(14)
通常会把 写成
,这样,一个N点DFT就可以分解成4个
点DFT
以为例子,进行两次时域抽取分解
如果上图的2点DFT也能化成蝶形运算,就很完美了
展开有:
因为,所以
由此可以看出2点DFT原本就可以看成一个蝶形运算
对比直接DFT和FFT的运算耗时
编程方法
未完待续。。。
编程实例
未完待续。。。
参考资料
《数字信号处理 华东理工大学 万永菁》课件、视频
《数字信号处理教程》(第5版)程佩青