傅里叶级数

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

\[f(t)=a_0+\sum_{n=1}^{\infty}(a_ncos(n\omega t)+b_nsin(n\omega t))\]其中\(\omega=\dfrac{2\pi}{T}\),\(T\)为函数的周期。\(a_n/b_n\)和\(n\)分别控制了正弦波的振幅与频率。这就是傅里叶级数的三角形式

我们还可以用复指数形式1积分2来表示傅里叶级数:

\[ f(t)=\sum_{n=-\infty}^{\infty}F_ne^{in\omega t} \] \[ F_n=\frac{1}{T}\int_0^T f(t)e^{-in\omega t} dt \]其中\(F\)就是周期函数\(f\)的傅里叶级数(Fourier Series, FS)

如果说\(f\)是某段信号在时域上的表现,\(F\)就是其在频域上的表现。傅里叶变换实现的就是从时域到频域的变换。

傅里叶变换

对于非周期函数,我们可以将其视为一个以\((-\infty,\infty)\)为一个周期的周期函数。

经过数学推导,得到:

\[ F(\omega)=\int_{-\infty}^\infty f(t)e^{-i\omega t} dt\] \[ f(t)=\frac{1}{2\pi}\int_{-\infty}^\infty F(\omega)e^{i\omega t} d\omega \] 这叫做傅里叶变换(Fouier Transform, FT)傅里叶逆变换(IFT)

注意,其结果都可能是复数。

这时,\(F\)不再是离散的级数,而是一个连续的函数了。

与傅里叶级数的比较:

  • 傅里叶级数:周期信号,离散频率,频率分量的值
  • 傅里叶变换:非周期信号,连续频率,频率分量的密度

卷积定理

卷积定理有两个:

\[ FT[f_1(t)*f_2(t)]=FT[f_1(t)]\cdot FT[f_2(t)] \] \[ IFT[F_1(\omega)*F_2(\omega)]=\frac{1}{2\pi}IFT[F_1(\omega)]\cdot IFT[F_2(\omega)] \] 分别称为时域卷积定理频域卷积定理

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

\[
\begin{align}
FT[f_1(t)*f_2(t)] &= FT[\int_{-\infty}^\infty f_1(\tau)f_2(t-\tau) d\tau] \\
&= \int_{-\infty}^\infty[\int_{-\infty}^\infty f_1(\tau)f_2(t-\tau) d\tau]e^{-i\omega t} dt \\
&= \int_{-\infty}^\infty f_1(\tau)[\int_{-\infty}^\infty f_2(t-\tau)e^{-i\omega t} dt]d\tau \\
&= \int_{-\infty}^\infty f_1(\tau)[\int_{-\infty}^\infty f_2(t)e^{-i\omega (t+\tau)} dt]d\tau \\
&= \int_{-\infty}^\infty f_1(\tau)e^{-i\omega\tau}[\int_{-\infty}^\infty f_2(t)e^{-i\omega t} dt]d\tau \\
&= \int_{-\infty}^\infty f_1(\tau)e^{-i\omega\tau}F_2(\omega) d\tau \\
&= F_2(\omega) \int_{-\infty}^\infty f_1(\tau)e^{-i\omega\tau} d\tau \\
&= F_1(\omega)F_2(\omega)
\end{align}
\] 其实基本上就是直接展开啦。频域卷积定理的证明也是类似的。

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

离散时间傅里叶变换

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

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

\[ X(\omega)=\sum_{n=-\infty}^\infty x(n)e^{-i\omega n} \] 事实上,这个将\(T\)转化为“1”的过程,就是模拟信号转化为数字信号的过程。

其逆变换IDTFT的表达式为:

\[ x(n)=\int_{-\pi}^\pi X(\omega)e^{i\omega n} d\omega\]

离散傅里叶变换

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

\[ X(k)=\sum_{n=0}^{N-1}x(n)W_N^{nk} \quad (k=0,1,2...,N-1)\] 其中\(W_N=e^{-i\frac{2\pi}{N}}\),也就是n次单位根。

其实DFT就是将DTFT中的对\(\omega\)积分替换为对\(\frac{2k\pi}{N}\)求和3

这样,我们就得到了一个\(N\)点信号到\(N\)点频域的离散变换,这个变换就叫做离散傅里叶变换(Discrete Fourier Transform, DFT)

其逆变换的表达式为:

\[ x(n)=\frac{1}{N} \sum_{k=0}^{N-1}X(k)W_N^{-nk} \quad (n=0,1,2...,N-1)\]

FS, FT, DTFT, DFT的比较

| 变换 | 特点 |

|- -|- -|

|傅里叶级数FS | 周期信号,离散频率,频率分量的值

|傅里叶变换FT | 非周期信号,连续频率,频率分量的密度

|离散时间傅里叶变换DTFT | 非周期采样信号,连续频率,频率分量的密度

|离散傅里叶变换DFT | 有限长度非周期采样信号,离散频率,对于DTFT频谱频率分量的密度

快速傅里叶变换

朴素进行DFT的复杂度是\(O(n^2)\),这可以从其表达式中看出。事实上我们有一种利用分治进行DFT的\(O(nlogn)\)算法,这就是常常被应用在OI中的快速傅里叶变换(Fast Fourier Transform, FFT)

为了方便,以下若不做特殊说明,\(N\)均是\(2\)的整数次幂,这可以通过在原来的序列后补若干个\(0\)至有\(2\)的整数次幂项来实现。

\[
\begin{align}
X(k) &= \sum_{n=0}^{N-1}x(n)W_N^{nk} \\
&= \sum_{n=0,n+=2}^{N-2}x(n)W_N^{nk} + \sum_{n=1,n+=2}^{N-1}x(n)W_N^{nk} \\
&= \sum_{n=0}^{\frac{N}{2}-1}x(2n)W_N^{2nk} + \sum_{n=0}^{\frac{N}{2}-1}x(2n+1)W_N^{(2n+1)k} \\
&= \sum_{n=0}^{\frac{N}{2}-1}x(2n)W_{\frac{N}{2}}^{nk} + W_N\sum_{n=0}^{\frac{N}{2}-1}x(2n+1)W_{\frac{N}{2}}^{nk}
\end{align}
\] 通过以上变形,原问题变成了两个规模减半的子问题。合并两个子问题的复杂度是\(O(1)\),分治层数为\(O(logn)\),所以计算一项的复杂度是\(O(logn)\),计算\(n\)项的复杂度是\(O(nlogn)\)。

例题:多项式乘法

设\(n\)次多项式\(f_1(x)=\sum_{i=0}^{n}a_ix^i\)和\(m\)次多项式\(f_2(x)=\sum_{i=0}^{m}b_ix^i\)的积为\(n+m\)次多项式\(f_3(x)=\sum_{i=0}^{n+m}c_ix^i\)。给出序列\(a,b\),求序列\(c\)。

容易知道\(c_k=\sum_{i=0}^{k}a_ib_{k-i}\),事实上序列\(c\)就是序列\(a\)和序列\(b\)的离散卷积

那么根据卷积定理,\(c_k=IDFT[DFT[c_k]]=IDFT[DFT[a_k*b_k]]=IDFT[DFT[a_k]\cdot DFT[b_k]]\)

所以我们只要将序列\(a\)和\(b\)DTFT到频域,点积后再IDTFT回时域,就可以得到序列\(c\)啦。

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

快速数论变换

在我们进行DTFT的过程中,使用的是复数。如果精度要求很高(比如求方案数),用复数来进行FFT就会出现误差。所以我们需要找到一个与复数单位根有相似性质的替代。

注意到FFT能够进行的根本因素就是复数单位根具有\(W_N^2=W_{\frac{N}{2}}\)这一性质。事实上,模意义域下的原根4就是复数单位根的一个很好的替代。

定义\(W_N=g^{\frac{P-1}{N}}(mod \ P)\),则有:

\[ X(k)=\sum_{n=0}^{N-1}x(n)W_N^{nk} \quad (mod \ P)\] 这就是快速数论变换(Number Theory Transform, NTT)

进行NTT时,最常用的模数就是998244353,其原根\(g=3\)。


  1. \(e^{i\theta}=cos\theta+isin\theta\)

  2. \(\int_a^b f(x)dx\)表示对\(x\in(a,b)\)的\(f(x)\)进行积分。

  3. 把这个式子转化成类似DTFT的形式:

    \[ X(k)=\sum_{n=0}^{N-1}x(n)W_N^{nk}=\sum_{n=0}^{N-1} x(n)e^{-i \frac{2k\pi}{N}n} \] \(\frac{2k\pi}{N}\)代替的就是DTFT中\(\omega\)的位置。

  4. 在模P意义下,如果有\(g^{P-1}\equiv 1\),那么称\(g\)为\(P\)的原根。

傅里叶变换 - Fourier Transform的更多相关文章

  1. 短时傅里叶变换(Short Time Fourier Transform)原理及 Python 实现

    原理 短时傅里叶变换(Short Time Fourier Transform, STFT) 是一个用于语音信号处理的通用工具.它定义了一个非常有用的时间和频率分布类, 其指定了任意信号随时间和频率变 ...

  2. 【OI向】快速傅里叶变换(Fast Fourier Transform)

    [OI向]快速傅里叶变换(Fast Fourier Transform) FFT的作用 ​ 在学习一项算法之前,我们总该关心这个算法究竟是为了干什么. ​ (以下应用只针对OI) ​ 一句话:求多项式 ...

  3. 从傅里叶级数(Fourier series)到离散傅里叶变换(Discrete Fourier transform)

    从傅里叶级数(Fourier series)到离散傅里叶变换(Discrete Fourier transform) 一. 傅里叶级数(FS) 首先从最直观的开始,我们有一个信号\(x(t)\)(满足 ...

  4. 数字图像处理实验(5):PROJECT 04-01 [Multiple Uses],Two-Dimensional Fast Fourier Transform 标签: 图像处理MATLAB数字图像处理

    实验要求: Objective: To further understand the well-known algorithm Fast Fourier Transform (FFT) and ver ...

  5. 「学习笔记」Fast Fourier Transform

    前言 快速傅里叶变换(\(\text{Fast Fourier Transform,FFT}\) )是一种能在\(O(n \log n)\)的时间内完成多项式乘法的算法,在\(OI\)中的应用很多,是 ...

  6. 使用 scipy.fft 进行Fourier Transform:Python 信号处理

    摘要:Fourier transform 是一个强大的概念,用于各种领域,从纯数学到音频工程甚至金融. 本文分享自华为云社区<使用 scipy.fft 进行Fourier Transform:P ...

  7. 【manim】3b1b的"Almost" Fourier Transform复刻

    最近在做Fourier Transform的内容,记录一下今天下午的成果. 本文代码全部自行编写,需要math and music项目完整工程可以在gayhub上获取.(现在还没弄完,就先不发了.) ...

  8. Fast Fourier Transform ——快速傅里叶变换

    问题: 已知$A=a_{0..n-1}$, $B=b_{0..n-1}$, 求$C=c_{0..2n-2}$,使: $$c_i = \sum_{j=0}^ia_jb_{i-j}$$ 定义$C$是$A$ ...

  9. 快速傅里叶变换(Fast Fourier Transform, FFT)和短时傅里叶变换(short-time Fourier transform,STFT )【资料整理】【自用】

    1. 官方形象展示FFT:https://www.bilibili.com/video/av19141078/?spm_id_from=333.788.b_636f6d6d656e74.6 2. 讲解 ...

随机推荐

  1. python初识-day3

    1.字符串常用操作(较多,用代码加注释表示) name = '\tMy name is congcong' print(name.capitalize())#输出结果为 My name is cong ...

  2. 错误:This function has none of DETERMINISTIC... 的解决

    问题: 在MySQL创建了一个批量插入的存储过程,在代码中调用的时候报错误信息: error code [1418];This function has none of DETERMINISTIC, ...

  3. Linux下MongoDB安装和配置详解

    1.下载安装包 将解压到/usr/local/mongodb 文件夹下 # mkdir /usr/local/mongodb # tar zxvf mongodb-linux-x86_64-3.2.9 ...

  4. IOS 疯狂基础之 页面间跳转

    常用的就两种 一种通过导航,一种直接跳 第一种 直接跳转 思路大致就是new一个目的页面,然后设置下页面跳转动画 中间还可以做点目的页面的数据初始化: ValueInputView *valueVie ...

  5. LCA(最近公共祖先)之倍增算法

    概述 对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. 如图,3和5的最近公共祖先是1,5和2的最近公共祖先是4 在本篇中我们先介 ...

  6. SQL FOR XML PATH 和 Stuff 用法

    sql stuff 用法 1.作用 删除指定长度的字符,并在指定的起点处插入另一组字符. 2.语法 STUFF ( character_expression , start , length ,cha ...

  7. PHP 第3方评论系统

    这段时间,无觅 评论也下线不能使用了. 客户好几个网站使用了.无觅 评论,前面也是用的是多说还是什么,总之也是第3方评论,没想到没过多久,又停止使用了. 没办法,网站还是需要评论系统,一气之下,自己做 ...

  8. ABP官方文档翻译 9.1 EntityFramework集成

    EntityFramework集成 Nuget包 DbContext 仓储 默认仓储 自定义仓储 应用特定的基础仓储类 自定义仓储示例 仓储最佳实践 事务管理 数据存储 ABP可以使用ORM框架,它内 ...

  9. java.util.logging.Logger基础

    1. 定义 java.util.logging.Logger是Java自带的日志类,可以记录程序运行中所产生的日志.通过查看所产生的日志文件,可以分析程序的运行状况,出现异常时,分析及定位异常. 2. ...

  10. BZOJ 3787: Gty的文艺妹子序列 [分块 树状数组!]

    传送门 题意:单点修改,询问区间内逆序对数,强制在线 看到加了!就说明花了不少时间.... 如果和上题一样预处理信息,用$f[i][j]$表示块i到j的逆序对数 强行修改的话,每个修改最多会修改$(\ ...