傅里叶变换 - Fourier Transform

傅里叶级数

傅里叶在他的专著《热的解析理论》中提出,任何一个周期函数都可以表示为若干个正弦函数的和,即:

f(t)=a0+n=1(ancos(nωt)+bnsin(nωt))
其中 ω=2πT T 为函数的周期。an/bn n 分别控制了正弦波的振幅与频率。这就是傅里叶级数的三角形式
我们还可以用复指数形式1积分2来表示傅里叶级数:
f(t)=n=Fneinωt
Fn=1TT0f(t)einωtdt
其中 F 就是周期函数f傅里叶级数(Fourier Series, FS)
如果说 f 是某段信号在时域上的表现,F就是其在频域上的表现。傅里叶变换实现的就是从时域到频域的变换。
这里写图片描述

傅里叶变换

对于非周期函数,我们可以将其视为一个以 (,) 为一个周期的周期函数。
经过数学推导,得到:

F(ω)=f(t)eiωtdt
f(t)=12πF(ω)eiωtdω
这叫做 傅里叶变换(Fouier Transform, FT)傅里叶逆变换(IFT)
注意,其结果都可能是复数。
这时, F 不再是离散的级数,而是一个连续的函数了。
与傅里叶级数的比较:
- 傅里叶级数:周期信号,离散频率,频率分量的值
- 傅里叶变换:非周期信号,连续频率,频率分量的密度

卷积定理

卷积定理有两个:

FT[f1(t)f2(t)]=FT[f1(t)]FT[f2(t)]
IFT[F1(ω)F2(ω)]=12πIFT[F1(ω)]IFT[F2(ω)]
分别称为 时域卷积定理频域卷积定理

下面对时域卷积定理进行证明。

FT[f1(t)f2(t)]=FT[f1(τ)f2(tτ)dτ]=[f1(τ)f2(tτ)dτ]eiωtdt=f1(τ)[f2(tτ)eiωtdt]dτ=f1(τ)[f2(t)eiω(t+τ)dt]dτ=f1(τ)eiωτ[f2(t)eiωtdt]dτ=f1(τ)eiωτF2(ω)dτ=F2(ω)f1(τ)eiωτdτ=F1(ω)F2(ω)
其实基本上就是直接展开啦。频域卷积定理的证明也是类似的。

可以观察到,在一个域上进行卷积,相当于在另一个域上进行点积。这启发我们用复杂度低的点积运算来代替复杂度高的卷积运算。

离散时间傅里叶变换

以上的内容都是针对连续信息/连续函数的。但是,计算机是无法存储连续的信息的,只能每隔时间 T 对信息进行采样。也就是说,计算机把连续的函数转化为了离散的序列。对于这样一个序列进行的傅里叶变换就称为离散时间傅里叶变换(Discrete Time Fouier Transform, DTFT)

F(ω)=n=f(nT)eiωnT
我们其实是用离散的采样点 nT 代替了FT中连续的时间 t 。进一步,由于采样的结果本质上是一个序列,那么我们可以把序列中连续两项的间隔,也就是采样频率T看做单位“1”。我们用 x(n) 表示采样结果序列,那么有:

X(ω)=n=x(n)eiωn
事实上,这个将 T 转化为“1”的过程,就是模拟信号转化为数字信号的过程。
其逆变换IDTFT的表达式为:
x(n)=ππX(ω)eiωndω

离散傅里叶变换

通过DTFT,我们已经能够处理离散的采样信号了。但由于采样结果序列依然是无限长的,计算机还是无法进行处理。从DTFT的式子中可以看出, X(ω) 是以 2π 为周期的,那么解决的方法很简单:我们只从时域 (0,2π) 上均匀地取 N 个点,用这N个点计算出频域上的 N 个点,这N个点就可以作为频域上的一个周期。

X(k)=n=0N1x(n)WnkN(k=0,1,2...,N1)
其中 WN=ei2πN ,也就是n次单位根。
其实DFT就是将DTFT中的对 ω 积分替换为对 2kπN 求和 3
这样,我们就得到了一个 N 点信号到N点频域的离散变换,这个变换就叫做 离散傅里叶变换(Discrete Fourier Transform, DFT)
其逆变换的表达式为:
x(n)=1Nk=0N1X(k)WnkN(n=0,1,2...,N1)

FS, FT, DTFT, DFT的比较

变换特点
傅里叶级数FS周期信号,离散频率,频率分量的值
傅里叶变换FT非周期信号,连续频率,频率分量的密度
离散时间傅里叶变换DTFT非周期采样信号,连续频率,频率分量的密度
离散傅里叶变换DFT有限长度非周期采样信号,离散频率,对于DTFT频谱频率分量的密度

快速傅里叶变换

朴素进行DFT的复杂度是 O(n2) ,这可以从其表达式中看出。事实上我们有一种利用分治进行DFT的 O(nlogn) 算法,这就是常常被应用在OI中的快速傅里叶变换(Fast Fourier Transform, FFT)
为了方便,以下若不做特殊说明, N 均是2的整数次幂,这可以通过在原来的序列后补若干个 0 至有2的整数次幂项来实现。

X(k)=n=0N1x(n)WnkN=n=0,n+=2N2x(n)WnkN+n=1,n+=2N1x(n)WnkN=n=0N21x(2n)W2nkN+n=0N21x(2n+1)W(2n+1)kN=n=0N21x(2n)WnkN2+WNn=0N21x(2n+1)WnkN2
通过以上变形,原问题变成了两个规模减半的子问题。合并两个子问题的复杂度是 O(1) ,分治层数为 O(logn) ,所以计算一项的复杂度是 O(logn) ,计算 n 项的复杂度是O(nlogn)

例题:多项式乘法

n 次多项式f1(x)=ni=0aixi m 次多项式f2(x)=mi=0bixi的积为 n+m 次多项式 f3(x)=n+mi=0cixi 。给出序列 a,b ,求序列 c

容易知道ck=ki=0aibki,事实上序列 c 就是序列a和序列 b 离散卷积
那么根据卷积定理,ck=IDFT[DFT[ck]]=IDFT[DFT[akbk]]=IDFT[DFT[ak]DFT[bk]]
所以我们只要将序列 a bDTFT到频域,点积后再IDTFT回时域,就可以得到序列 c 啦。

时间复杂度O((n+m)log(n+m))

快速数论变换

在我们进行DTFT的过程中,使用的是复数。如果精度要求很高(比如求方案数),用复数来进行FFT就会出现误差。所以我们需要找到一个与复数单位根有相似性质的替代。
注意到FFT能够进行的根本因素就是复数单位根具有 W2N=WN2 这一性质。事实上,模意义域下的原根4就是复数单位根的一个很好的替代。
定义 WN=gP1N(mod P) ,则有:

X(k)=n=0N1x(n)WnkN(mod P)
这就是 快速数论变换(Number Theory Transform, NTT)
进行NTT时,最常用的模数就是998244353,其原根 g=3


  1. eiθ=cosθ+isinθ
  2. baf(x)dx 表示对 x(a,b) f(x) 进行积分。
  3. 把这个式子转化成类似DTFT的形式:
    X(k)=n=0N1x(n)WnkN=n=0N1x(n)ei2kπNn
    2kπN 代替的就是DTFT中 ω 的位置。
  4. 在模P意义下,如果有 gP11 ,那么称 g P的原根。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值