快速傅里叶变换学习笔记

Part 0 复数的指数函数

0.1 指数函数的定义

这是一个普通的指数函数

f(x)=ax,xR

现在我们要把它的定义域扩展

f(x)=ax,xC

第一步,我们知道所有这样的指数函数都可以写成这样:

f(x)=ax=exlna

又因为 ea+bi=ea×ebi
所以如果我们想计算复指数函数的话,我们只需要先定义出 eki 这样的函数就可以了。

怎么定义呢?我们翻开高等数学,发现里面提到了这个东西

ex=limn+(1+xn)n

把这里的实数 x 换成虚数 ki 就完美定义了复指数函数

eki=limn+(1+kin)n

接下来我们从得数的模长和辅角入手,将这个式子化简。

0.2 欧拉公式

首先是模长,我们知道复数相乘就是“模长相乘辐角相加”。 n 个复数相乘就会有 n 个模长相乘,所以模长可以拿到乘方里面。

|eki|=|limn+(1+kin)n|=limn+|(1+kin)|n=limn+(1+(kn)2)n=limn+(1+k2n2)12n

接下来令新的 n 为原来的 12n ,代换后得到

|eki|=limn+(1+k24n2)n=limn+(1+k24n2)n

然后令 N=n2 ,代换

|eki|=limN+(1+k24N)NN=limN+((1+k24N)N)1N

观察到,最外层指数位置和底数位置上的两个极限各自分别都是收敛的,我们可以拆开来计算

|eki|=limN+((1+k24N)N)1N=(limN+(1+k24N)N)limN+1N=(ek24)0=1

没错! eki 的模长为 1 。接下来轮到辐角了。

n 个复数相乘,对应地,就是 n 个辐角相加。

argeki=arglimn+(1+kin)n=limn+n×arg(1+kin)=limn+n×arctankn

n 取倒数

argeki=limn0+1n×arctannk

根据基础的微积分知识,我们知道 arctankxx0 时的等价无穷小是 kx ,所以

argeki=limn0+1n×nk=limn0+k=k

即, eki 的辐角为 k .

于是,我们得到了这么一个结论:

|eki|=1argeki=k

接下来我们把它转回直角坐标表示

(eki)=1×cosk(eki)=i×sinkeki=cosk+isink

给指数加上实部,就是著名的欧拉公式

ea+bi=ea(cosb+isinb)

0.3 转圈圈

考虑这个函数

f(x)=eix

根据刚刚导出的欧拉公式,无论自变量 x 怎样增加,函数值的模长都为 1 ,但函数值的辐角始终为 x . 而用几何的语言来说,就是【角度变化的同时,半径保持一致】。这也意味着,函数 f(x)=eix 的函数值永远位于复平面的单位圆上。

更进一步,如果把函数值视作复平面中的点,那么随着 x 的不断增大,它将从实轴正半轴开始,沿复平面的单位圆顺时针旋转。并且转过的弧度正好是自变量 x .

指数函数在复数域中变成了周期函数

举个例子,如果 x=π ,那么这个点正好转过半圈,也就是从实轴的正半轴转到负半轴。写出来就是

eiπ=1

相信这个东西大家都见过

再举个例子,我们令 α=eiπ3 ,可以看出 α 是一个旋转了 16 圈的单位向量。

如果随便挑一个复数 z ,并把它和 α 相乘,会得到什么呢?

根据模长相乘辐角相加准则,不难看出,这个相乘的操作相当于把复平面上的 z 点绕着原点旋转 π6 的弧度。

然后,我们开拓一下思路,不断把 α 乘到复平面中的“单位向量”1+0i 上。显然每乘一次,这个单位向量就会绕原点旋转 120 ,连续三次之后就会转回到原始位置 1+0i .

用公式表达出来,是这样的

α3=1

没错,我们刚刚求出了方程 x3=1 除了 x=1 的另一个根!

单位根

我们把方程 xn=1 的解称作“n次单位根”,刚才的 α 是一个 3 次单位根。

稍加思索,形如

ei2πN

的值都会在 N 次方时变为 1 ,他们也就都是 N 次单位根。

不过需要注意的是, N 次单位根不止有 1ei2πN 两个,实际上任何形如

eik2πN(kN+)

的值都是 N 次单位根(因为对于任何正整数 k 都有, e2kπ=1)。

这些单位根中 k=1 的那个叫做 N本原单位根,记作 ωN .

于是,方程 xN=1 的所有解就可以表示为 N 次本原单位根 ωN0N 次方。( ωN0=1

{1,ωN,ωN2,ωNN1}

简而言之,N 次单位根就是从 1+0i 开始,把单位圆周平均分成 N 段的 N 个点。

由于单位根特殊的周期性,它具有如下的几个性质:

ωyx+y=ωyxωyx=ωkykxω2yx+y=ω2yx

第一条:一个单位根旋转一整圈之后还是他自己

第二条:【一次走一步,每步走 k 米】和【一次迈 k 步,每步走一米】是等价的

第三条:一个单位根转过半圈相当于取他的相反数

Part 1 傅里叶变换

用不到的 傅里叶变换(FT)

傅里叶变换是对某一个连续函数(信号)进行的一种变换,可以表示某个频率的正弦/余弦波形在原信号中“占据”的“比重”。

傅里叶变换及其逆变换一般写作下面的形式:

F(ω)=+f(x)eiωxdxf(x)=12π+F(ω)eiωxdω

注意这其中 F(x) 的函数值是复数。

关于这个东西的更多细节,可以去看看 3Blue1Brown 的视频。

离散傅里叶变换(DFT)

在OI中,用到的一般是傅里叶变换的离散版本

F(k)=x=0N1f(x)e(i2πNk)×xf(n)=1Nk=0N1f(x)e(i2πNk)×n

OI中最常见的写法会将上下两式的正负号颠倒一下,变成这样

F(k)=x=0N1f(x)e(i2πNk)×xf(n)=1Nk=0N1f(x)e(i2πNk)×n

我也不知道为什么要这么做,但是大家都是这么写的

接下来简单介绍一下一下离散傅里叶逆变换的公式的来历。因为傅里叶变换是一个线性变换,所以它可以写成矩阵的形式,如下:

[z0×0z0×1z0×2z0×N2z0×N1z1×0z1×1z1×2z1×N2z1×N1z2×0z2×1z2×2z2×N2z2×N1z(N1)×0z(N1)×1z(N1)×2z(N1)×(N2)z(N1)×(N1)]×[f(0)f(1)f(2)f(N1)]=[F(0)F(1)F(2)F(N1)]

为了方便起见,上式中的 z=ei2πN ,指数位置的第一个参数为 k ,第二个参数为 n .

现在只需要求出它的逆矩阵就能得到逆变换的公式了!根据基础的线性代数知识,这是一个范德蒙德矩阵,它的逆阵就是它的每一个位置取倒数并乘上 1N .

似乎完全没有解释清楚呢

不过这部分不重要

快速傅里叶变换(FFT)

终于到重头戏了!我们观察一下 DFT 的式子,会发现强行计算他会用掉我们 O(N2) 级别的时间,因此我们要寻找方法快速计算他。

首先对比一下 F(x)F(x+N2) 的计算式(暂且假设 N 为偶数)

F(x)=n=0N1f(n)e(i2πNx)×nF(x+N2)=n=0N1f(n)e(i2πN(x+N/2))×n

然后,注意到式子里面的

ei2πN

正好就是在 Part 0 中提到的 N 次单位根,利用这一点我们可以给式子换一个写法

F(x)=n=0N1f(n)×(ωNx)nF(x+N2)=n=0N1f(n)×(ωNx+N/2)n

利用单位根的性质3,做出如下变换:

F(x)=n=0N1f(n)×(ωNx)nF(x+N2)=n=0N1f(n)×(ωNx)n

现在可以看出,这两个

此处施工中

Part 2 卷积

用不到的 普通卷积

卷积是对两个函数进行的一种运算,可以得到另一个函数,定义如下:

[fg](t)=+f(x)g(tx)dx

当然在 OI 中我们用到的一般是卷积的离散版本

离散卷积

只需要把上面式子中的 改成 .

[fg](t)=k=0Nf(k)g(tk)

我们可以把它改成另一种形式

[fg](t)=i+j=tf(i)g(j)

其中 0i,jN .

此处施工中

Part 3 数论变换

原根与单位根的对称性

我们知道如果模数为一个质数 p ,那么此模意义下总是存在一个原根 g

此处施工中

posted @   HMSF  阅读(199)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示