快速傅立叶变换()的 实现收藏
标准的离散傅立叶变换形式如:
y
k
=Σ
j=0
n-1
a
j
ω
n
-
kj
= A (ω
n
-
k
).
(ω
n
k
为复数 1 的第 k 个 n 次方根,且定义多项式 A (x) = Σ
j=0
n-1
a
j
x
j
)
而离散傅立叶逆变换 IDFT (Inverse DFT)形式如: a
j
=(Σ
k=0
n-1
y
k
ω
n
kj
)/n .
(为复数的第个次方根,且定义多项式)
而离散傅立叶逆变换形式如:
以下不同颜色内容为引用并加以修正:
快 速 傅 立 叶 变换 ( !" , ) 是 离 散 傅 立 叶 变 换 ( #
!",)的快速算法,它是根据离散傅立叶变换的奇、偶、虚、实等特性,对离
散傅立叶变换的算法进行改进获得的。它对傅立叶变换的理论并没有新的发现,但是对于
在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。
设$为%项的复数序列,由变换,任一$ 的计算都需要%次复数乘法和%次复数
加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加
法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加
法),那么求出%项复数序列的$ ,即%点变换大约就需要%&次运算。当%&'
点甚至更多的时候,需要%&'()*+次运算,在中,利用的周期性和对称性,
把一个%项序列(设%为偶数),分为两个%&项的子序列,每个%& 点变换需要
%&&次运算,再用%次运算把两个%& 点的变换组合成一个%点的变换。这
样变换以后,总的运算次数就变成%&,%&&%%&&。继续上面的例子,%&'
时,总的运算次数就变成了 )&)-&次,节省了大约).的运算量。而如果我们将这种“一
分为二”的思想不断进行下去,直到分成两两一组的运算单元,那么 %点的变换就
只需要%,/0&%次的运算,%&'点时,运算量仅有&'次,是先前的直接算法的
.,点数越多,运算量的节约就越大,这就是的优越性。
的实现可以自顶而下,采用递归,但是对于硬件实现成本高,对于软件实现都不够高
效,改用迭代较好,自底而上地解决问题。感觉和归并排序的迭代版很类似,不过先要采
用“位反转置换”的方法把$ 放到合适的位置,设 和互为 /0&%位二进制的回文数,假
设-1 &+1&-1如果 ≠1那么$ 和$应该互换位置。(关于这个
回文数的生成,是很有趣而且是很基本的操作,想当初偶初学 的时候就有这样的习
题。)当“位反转置换”完成后,先将每一个 $ 看作是独立的多项式,然后两个两个地将它