傅里叶级数
傅里叶在他的专著《热的解析理论》中提出,任何一个周期函数都可以表示为若干个正弦函数的和,即:
我们还可以用复指数形式1和积分2来表示傅里叶级数:
如果说 f 是某段信号在时域上的表现,
傅里叶变换
对于非周期函数,我们可以将其视为一个以
(−∞,∞)
为一个周期的周期函数。
经过数学推导,得到:
注意,其结果都可能是复数。
这时, F 不再是离散的级数,而是一个连续的函数了。
与傅里叶级数的比较:
- 傅里叶级数:周期信号,离散频率,频率分量的值
- 傅里叶变换:非周期信号,连续频率,频率分量的密度
卷积定理
卷积定理有两个:
下面对时域卷积定理进行证明。
FT[f1(t)∗f2(t)]=FT[∫∞−∞f1(τ)f2(t−τ)dτ]=∫∞−∞[∫∞−∞f1(τ)f2(t−τ)dτ]e−iωtdt=∫∞−∞f1(τ)[∫∞−∞f2(t−τ)e−iωtdt]dτ=∫∞−∞f1(τ)[∫∞−∞f2(t)e−iω(t+τ)dt]dτ=∫∞−∞f1(τ)e−iωτ[∫∞−∞f2(t)e−iωtdt]dτ=∫∞−∞f1(τ)e−iωτF2(ω)dτ=F2(ω)∫∞−∞f1(τ)e−iωτdτ=F1(ω)F2(ω)其实基本上就是直接展开啦。频域卷积定理的证明也是类似的。
可以观察到,在一个域上进行卷积,相当于在另一个域上进行点积。这启发我们用复杂度低的点积运算来代替复杂度高的卷积运算。
离散时间傅里叶变换
以上的内容都是针对连续信息/连续函数的。但是,计算机是无法存储连续的信息的,只能每隔时间
T
对信息进行采样。也就是说,计算机把连续的函数转化为了离散的序列。对于这样一个序列进行的傅里叶变换就称为离散时间傅里叶变换(Discrete Time Fouier Transform, DTFT)。
其逆变换IDTFT的表达式为:
离散傅里叶变换
通过DTFT,我们已经能够处理离散的采样信号了。但由于采样结果序列依然是无限长的,计算机还是无法进行处理。从DTFT的式子中可以看出,
X(ω)
是以
2π
为周期的,那么解决的方法很简单:我们只从时域
(0,2π)
上均匀地取
N
个点,用这
其实DFT就是将DTFT中的对 ω 积分替换为对 2kπN 求和 3。
这样,我们就得到了一个 N 点信号到
其逆变换的表达式为:
FS, FT, DTFT, DFT的比较
变换 | 特点 |
---|---|
傅里叶级数FS | 周期信号,离散频率,频率分量的值 |
傅里叶变换FT | 非周期信号,连续频率,频率分量的密度 |
离散时间傅里叶变换DTFT | 非周期采样信号,连续频率,频率分量的密度 |
离散傅里叶变换DFT | 有限长度非周期采样信号,离散频率,对于DTFT频谱频率分量的密度 |
快速傅里叶变换
朴素进行DFT的复杂度是
O(n2)
,这可以从其表达式中看出。事实上我们有一种利用分治进行DFT的
O(nlogn)
算法,这就是常常被应用在OI中的快速傅里叶变换(Fast Fourier Transform, FFT)。
为了方便,以下若不做特殊说明,
N
均是
例题:多项式乘法
设
n
次多项式
容易知道
那么根据卷积定理,
所以我们只要将序列
a
和
时间复杂度
O((n+m)log(n+m)) 。快速数论变换
在我们进行DTFT的过程中,使用的是复数。如果精度要求很高(比如求方案数),用复数来进行FFT就会出现误差。所以我们需要找到一个与复数单位根有相似性质的替代。
注意到FFT能够进行的根本因素就是复数单位根具有 W2N=WN2 这一性质。事实上,模意义域下的原根4就是复数单位根的一个很好的替代。
定义 WN=gP−1N(mod P) ,则有:
X(k)=∑n=0N−1x(n)WnkN(mod P)这就是 快速数论变换(Number Theory Transform, NTT)。
进行NTT时,最常用的模数就是998244353,其原根 g=3 。