离散傅里叶变换

引言

设函数 f(x) 在区间 [0,2π) n 个等分点xk=2πk/n k=0,1,,n1 )上的值 fk=f(xk)=f(2πk/n) (一般为复数)为已知。在本文中,我们令 i2=1

插值问题:用周期函数

{eijx=cosjx+isinjx}j=0,1,,n1

的线性组合
P(x)=j=0n1cjeijx

作为 f(x) 在这区间上的三角函数插值,即求系数 cj ,使得
fk=j=0n1cjei2jkπn,k=0,1,,n1


离散傅里叶变换

以上插值问题在理论上容易求解,因为它等价于求解线性方程组

11111ei2πnei2kπnei2(n1)πn1ei2jπnei2jkπnei2j(n1)πn1ei2(n1)πnei2(n1)kπnei2(n1)2πnc0c1cjcn1=f0f1fkfn1

记系数矩阵为
F1=11111ei2πnei2kπnei2(n1)πn1ei2jπnei2jkπnei2j(n1)πn1ei2(n1)πnei2(n1)kπnei2(n1)2πn

(注:由于这个矩阵对应于傅里叶逆变换,因此记为逆的形式。)显然,系数矩阵 F1 是一个对称的范德蒙德(Vandermonde)矩阵。

性质1 以上系数矩阵的行(或列)向量具有如下的正交性:

j=0n1ei2jkπnei2jlπn={n,0,k=lkl

由性质1可知,

F=1n11111ei2πnei2jπnei2(n1)πn1ei2kπnei2kjπnei2k(n1)πn1ei2(n1)πnei2(n1)jπnei2(n1)2πn

从而得到
cj=1nk=0n1fkei2jkπn,j=0,1,,n1

习惯上,由 {fk} {cj} 的过程称为 f(x) 离散傅里叶变换(也称 {cj} {fk} 的离散傅里叶变换),而由 {cj} {fk} 的过程称为离散傅里叶逆变换。用上面公式计算傅里叶变换的计算复杂度为 O(n2) 。另外,应该注意到, F (或F1)的 n2 个元素 ei2kjπn (或 ei2jkπn )中,实际上只有 n 个不同的值。这是下面进行快速傅里叶变换的基础。

性质2(Parseval等式)

j=0n1|cj|2=1nk=0n1|fk|2


快速傅里叶变换

在这一节,我们假设 n=2t t 为正整数。令ω=ei2πn,则 ωn=1 。离散傅里叶变换需要计算

c0c1cn1=Ff0f1fn1


cj=1nk=0n1fkωjk,j=0,1,,n1

基本原理:根据 ω 的周期性(即 ωn=1 ),合并上式中的同类项,将 n 个乘积的和转化为n/2个乘积的和,从而提高计算的速度。快速傅里叶变换的计算复杂度为 O(nlog2n)

为了简化后面的讨论,我们记 ak=fkn k=0,1,,n1 ),以及

Fk,ω=11111ω1ωjω(n1)1ωkωjkω(n1)k1ωn1ωj(n1)ω(n1)2

则离散傅里叶变换转化为计算
c0c1cn1=Fk,ωa0a1an1

计算过程

分别考虑 cj 的下标 j 是偶数和奇数的情况:

  • j=2l

    c2l==k=0n1akω2lk=k=0n21akω2lk+k=n2n1akω2lkk=0n21akω2lk+k=0n21an2+kω2l(n2+k)

    ω2l(n2+k)=ωnlω2lk=1ω2lk=ω2lk ,上式转化为
    c2l=k=0n21akω2lk+k=0n21an2+kω2lk=k=0n21(ak+an2+k)ω2lk

    • j=2l+1

      c2l+1=k=0n1akω(2l+1)k=k=0n1(akωk)ω2lk

      我们将上式中的 akωk 看作一个整体,则转化为偶数情况。从而得到
      c2l+1=k=0n21(akωk+an2+kωn2+k)ω2lk

      ωn2+k=ωn2ωk=1ωk=ωk ,上式转化为
      c2l+1=k=0n21(akωkakωk)ω2lk=k=0n21[(akan2+k)ωk]ω2lk

    • 综上,我们得到

      c2lc2l+1==k=0n21(ak+an2+k)ω2lkk=0n21[(akan2+k)ωk]ω2lk

      ω1=ω2 ,则 ωn21=1 。记 b(0)k=ak+an2+k b(1)k=(akan2+k)ωk 。则上面的两个式子化为

      c2l=k=0n21b(0)kωlk1,c2l+1=k=0n21b(1)kωlk1,l=0,1,,n21

      从而得到两个离散傅里叶变换。记
      Fk1,ω1=1111ω11ω(n21)11ωn211ω(n21)2

      则两个两个离散傅里叶变换分别为
      c0c2c2(n21)c1c3c2(n21)+1==Fk1,ω1b(0)0b(0)1b(0)n21Fk1,ω1b(1)0b(1)1b(1)n21

      由于 n2=2k/2=2k1 ,我们可以递归地使用前面的过程完成计算。这种计算 cj 的过程称为 快速傅里叶变换

      计算复杂度

      假设离散傅里叶变换需要 Mk 次乘法和 Ak 次加法。从 2k 个数据的傅里叶变换转换为两个 2k1 个数据的傅里叶变换,需要额外的 2k1 个乘法和 2k 个加法,因此,我们得到递推关系

      MkAk==2Mk1+2k12Ak1+2k

      M0=0 A0=0 ,得到
      Mk=k2k1=12nlog2n,Ak=k2k=nlog2n

      关于 ωk 的计算
      在作快速傅里叶变换时,(在额外的乘法运算中)要用到

      ωk=ei2kπn=cos2kπnisin2kπn,l=0,1,,n21

      我们可以用如下步骤计算 ck=cos2kπn sk=sin2kπn
      步骤1:令 c0=1 s0=0
      步骤2:用标准库函数计算出 c1=cos2πn s1=sin2πn ;令 k=1
      步骤3:计算 ck+1=ckc1sks1 sk+1=skc1cks1 ;令k=k+1,重复步骤3。

      实验代码(待补充)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值