因为最近想要搞明白图神经网络到底为啥和傅里叶变换有联系,所以想学习一下简单的傅里叶变换的概念,在哔哩哔哩上找到了大佬制作的介绍傅里叶变换的视频 [1] 。跟着学习了一下,做个简单的记录(强烈建议大家去看一遍原视频,讲的非常明白)。
哔哩哔哩视频地址:形象展示傅里叶变换
经典例子:分解声音中的频率
如果测量耳机或扬声器附近的气压,把它当成一个关于时间的函数,设有两种纯音:纯A音(每秒440拍)与纯D音(每秒294拍),如图1(a)、图1(b)所示:
图1(a) 纯音A440气压-时间函数图
图1(b) 纯音D294气压-时间函数图
由于在任意时刻,压强的变化是每个音调产生的压强总和,所以A440与D294混音后最终的压强-时间图像如图2所示:
图2 A440与D294混音后的压强-时间函数图
在某些时刻,两个峰值相互重合,产生了很高的气压,在其它时刻,它们又会相互抵消,总而言之,最后得到的波浪型压强-时间图像并不是纯粹的正弦波,而是更复杂的波形。当我们加入更多音调时,波形也会越来越复杂。
麦克风在记录声音时,只能获取不同时刻的气压,它只知道最后的总和。所以核心问题就是,我们要如何将一个很复杂的信号分解为多个纯音的频率,如图3所示:
图3 我们该如何将一个复杂的信号分解为多个纯音频率呢
这些信号加起来的话,它们就全混一起了,所以将它们再分开,就像把混合好的不同颜色的颜料分开一样,我们的大致策略如下:建造一台数学机器,使它能够区别对待各个不同的频率。
分解频率
首先,考虑只有一个频率的信号,假设它每秒只有3拍,我们可以轻易地画出它的图像,这里我们只关注图像的0~4.5秒,如图4所示:
图4 只有一个频率的信号,其频率为每秒3拍
关键思想是,我们要将这个图像缠绕在一个圆上。具体来说,就是想象转动的向量,在任意时刻下,它的长度等于这个时刻的图像高度。在图像中,高处的点离原点较远,低处的点离原点较近,如图5所示:
图5 将图4中的信号缠绕在一个圆上,图4中高处的点在图5中离原点较远,图4中低处的点在图5中离原点较近
上图(图5)形成的图像是每经过2秒,这个向量就转过一整圈,也就是在缠绕图像中(图5),这个向量每秒转过半圈,这一点很重要,因为现在有两个不同的频率在起作用:一个是信号的频率,每秒上下振荡三次;另一个是图像缠绕中心圆的频率,目前是每秒旋转半圈。我们可以自由地改变第二个频率,比如说,如果我们想让它转得快一些,可以将第二个频率变为每秒转1.23圈(图6(a)),如果我们想让它转得慢一些,可以将第二个频率变为每秒转0.2圈(图6(b))。
图6(a) 将第二个频率变为每秒转1.23圈
图6(b) 将第二个频率变为每秒转0.2圈
缠绕频率决定了缠绕图像的样子,我们所做的就是将信号缠绕在一个圆上。
我们发现,如果缠绕频率和信号频率相等时,即信号频率为 3 beats/second,缠绕频率为 3.00 cycles/second,会出现特殊的情况,如图7所示。所有高处的点恰好落在圆的右侧,而所有低处的点恰好落在圆的左侧。
图7 当缠绕频率与信号频率相等时的图像
那么,我们要如何利用这个发现取建造一台频率分离机呢?
将缠绕图像看成一个有质量的东西,例如金属丝,那么缠绕图像的中心就代表金属丝的质心。当我们改变缠绕频率的时候,图像的缠绕方式会发生变化,质心的位置也会随之摆动,如图8所示。
图8 当缠绕频率为 2.83 cycles/second 时质心在缠绕图像中的位置
“近傅里叶变换”
对于大部分缠绕频率来说,图像的“峰”和“谷”会均匀分布在圆上,导致质心一直待在原点附近。但是,当缠绕频率等于信号频率时,即信号频率为
3
beats/second
3\ \text{beats/second}
3 beats/second ,缠绕频率为
3.00
cycles/second
3.00\ \text{cycles/second}
3.00 cycles/second ,所有的“峰”落在圆的右边,所有的“谷”落在圆的左边,我们发现,质心会异常地偏向右侧,如图9所示:
图9 当缠绕频率等于信号频率时,质心并不在原点附近,而是异常地偏向右侧
为了刻画这个现象,我们来画一个图,记录每个缠绕频率对应的质心位置。质心位置是二维的,需要两个坐标来完整表述,但是我们暂时只记录它的横坐标。
当缠绕频率为
0
0
0 时,所有的点都堆在右边,质心的横坐标相对较大,当我们增加缠绕频率时,图像就会平均分布在圆上,质心的横坐标也就趋向于
0
0
0 ,之后它也只是在
0
0
0 附近不停摆动,如图10(a)所示。但是,当缠绕频率等于每秒3拍时,会出现一个尖峰,因为图像全都绕在右边,如图10(b)所示。图10
(
(
(c
)
)
)为随着缠绕频率从
0
∼
5
0\sim5
0∼5 时质心横坐标的变化图。
图10(a) 每个缠绕频率对应的质心位置,横轴为缠绕频率,纵轴为质心的横坐标。当我们从 0 0 0 增加缠绕频率时,质心会在原点附近摆动。
图10(b) 当缠绕频率等于信号频率时,出现尖峰,这是因为“峰”都落在圆的右边,“谷”都落在圆的左边,而“峰”和“谷”代表信号图像中(图4)的高度,所以这个圆的质心会偏向右侧,因此质心的横坐标会出现尖峰。
图10 ( ( (c ) ) ) 缠绕频率从 0 ∼ 5 0\sim5 0∼5 质心横坐标的变化
以上就是我们的核心构造,总结一下到目前为止的内容:
- 原始的强度时间图像(图10 ( ( (c ) ) )上半部分);
- 二维平面中的缠绕图像(图10 ( ( (c ) ) )下半部分左侧);
- 缠绕频率与质心(横坐标)的关系图像(图10 ( ( (c ) ) )下半部分右侧);
注意:在缠绕频率与质心(横坐标)关系图像中,我们观察
0
0
0 附近的低频,在新图像(图10
(
(
(c
)
)
)下半部分右侧)中,
0
0
0 附近有个很大的尖峰,这是因为余弦曲线整体上移,如果我们选择的信号在
0
0
0 附近振荡,允许出现负值,那么我们在改变缠绕频率时,那么质心-缠绕频率图像就只会在
3
3
3 处出现一个尖峰,如图11所示。不过,负值考虑起来既奇怪又麻烦,所以我们还是主要考虑上移的图像,我们只需要知道,在
0
0
0 附近的尖峰对应于原始信号图像的上移,想要分解频率,我们主要关注的点就是在
3
3
3 处凸起。
图11 允许出现负值信号的质心-缠绕频率图像
通过上述分析,我们得到了缠绕频率与质心(横坐标)的关系图像(图10©下半部分右侧),我们将这张图称为原信号的“近傅里叶变换”。
那么我们该如何将以上发现应用到混合信号中呢,以
2
Hz
+
3
Hz
2\text{Hz}+3\text{Hz}
2Hz+3Hz 为例,当缠绕频率等于
2.00
cycles/second
2.00\ \text{cycles/second}
2.00 cycles/second 时,我们发现质心-缠绕频率图像会出现一个尖峰,如图12(a)所示,当缠绕频率等于
3.00
cycles/second
3.00 \ \text{cycles/second}
3.00 cycles/second 时,质心-缠绕频率图像同样会出现一个尖峰,如图12(b)所示。
图12(a) 当缠绕频率等于 2.00 cycles/second 2.00\ \text{cycles/second} 2.00 cycles/second 时,图像出现一个尖峰
图12(b) 当缠绕频率等于 3.00 cycles/second 3.00\ \text{cycles/second} 3.00 cycles/second 时,图像出现一个尖峰
我们发现,如果我们拿来两个信号分别对它们使用“近傅里叶变换”,把结果加在一起得到的结果,和先把信号加起来再进行“近傅里叶变换”是一样的,如图13所示。
图13 独立信号的“近傅里叶变换”相加与混合信号的“近傅里叶变换”结果一致
图13的这一性质对我们来说超级有用,因为对单纯频率的转换除了在其频率会出现一个尖峰以外其它地方几乎都是
0
0
0 ,所以在将两个单纯频率加起来以后,转换后的图像就在输入进的频率处出现小尖峰了。而这个数学机器实现的正是我们想要的功能:把原有频率从一团糟中分离出来,使混在一起的颜料相互分离。
傅里叶变换的数学描述
在分析傅里叶变换的完整数学描述之前,我们先来看一个傅里叶变换很有用的场景:音频编辑。
比如我们现在手上有段录音,里面有个超烦的高音尖啸,我们想将它过滤掉。首先,信号以函数的形式输入,横轴是时间,纵轴是强度,通过麦克风每秒输入不同的电压,但我们想要以频率的角度看待这一问题,所以,对这一信号做傅里叶变换,烦人的尖啸看上去就会是某一高频率上的尖峰,如图14(a)所示。我们把这个尖峰敲下去,看到的就是我们原本录下声音的傅里叶变换了,只不过没了高音尖啸而已,如图14(b)。
图14(a) 一段录音的傅里叶变换,可以发现,尖峰处为尖啸的高音
图14(b) 将尖峰敲下去,就是去掉高音后的声音的傅里叶变换
这就引入了“傅里叶逆变换”的概念,就是说能通过傅里叶变换来推出变换前的信号来,简单来说,就是对傅里叶变换再施以傅里叶变换,得到的就是和原始函数差不多的东西。关于傅里叶逆变换在此先不提。
我们再返回来看“质心的
x
x
x 坐标”这一概念。首先在二维平面中的缠绕图像中(图5),我们对质心进行观察,
x
x
x 坐标只能反映一半的事实,这毕竟是一个二维的图形,还要考虑
y
y
y 坐标,而往往在数学中,无论什么时候,当我们处理二维问题的时候,把图像看作 复平面 都是很方便的,如图15所示,此时质心就是个复数,同时拥有实部和虚部。
图15 当我们面对二维图像时,将它看作复平面来处理是很方便的
之所以用复数角度看待事物,而不是以两个坐标来看待,是因为复数能更好地描述和插入、旋转等相关的事物。超有名的 欧拉公式 告诉我们,取
e
(
某个数
n
)
×
i
e^{(某个数n)×i}
e(某个数n)×i,你就会落在从右边开始,沿着半径为
1
1
1 的单位圆逆时针走了
n
n
n 个单位长的时间点上,如图16所示。
图16 超有名的欧拉公式告诉我们,取 e ( 某个数 n ) × i e^{(某个数n)×i} e(某个数n)×i ,就会落在从右边开始,沿着半径为 1 1 1 的单位圆逆时针走了 n n n 个单位长的时间点上,这里 n = 2 n=2 n=2
比如说,我们想要描述一个每秒钟转一圈的旋转,那我们就可以用
e
2
π
i
t
(1)
e^{2πit}\tag{1}
e2πit(1)来表示,如图17所示,其中
t
t
t 表示经过的时间。因为对半径为
1
1
1 的单位圆来说,
2
π
2π
2π 就是一圈的长度。
图17 使用欧拉公式描述一个没描述转一圈的旋转
我们发现这个向量每
1
1
1 秒钟转一整圈,转得过快,我们想要更换一个更低也更合理的频率。这时,只需要在指数的
t
t
t 前面乘上频率
f
f
f 就好:
e
2
π
i
f
t
(2)
e^{2πift}\tag{2}
e2πift(2)例如,如果
f
=
1
/
10
f=1/10
f=1/10,那么此向量就每
10
10
10 秒钟转一整圈(这是因为只有在
t
t
t 增长到
10
10
10 的时候,整个指数部分才是
2
π
i
2πi
2πi )。
有了上述描述,我们就可以将“缠绕图像”的思想写成简洁紧凑的公式。
首先,在傅里叶变换的语境下,我们通常认为旋转是按顺时针方向的,那么如果我们在指数项前面加个负号,如公式(3)所示,就会变为按逆时针方向旋转。
e
−
2
π
i
f
t
(3)
e^{-2πift}\tag{3}
e−2πift(3)现在,拿一个描述信号强度和时间关系的函数出来,就拿纯余弦波作为示例,我们将之命名为
g
(
t
)
g(t)
g(t) ,如图18所示。
图18 描述信号强度和时间关系的函数,以纯余弦波为例,将之命名为 g ( t ) g(t) g(t)
我们将
g
(
t
)
g(t)
g(t)与公式(3)相乘:
g
(
t
)
e
−
2
π
i
f
t
(4)
g(t)e^{-2πift}\tag{4}
g(t)e−2πift(4)
那么,公式(4)的含义就是这个旋转的复数依照函数值大小被缩放了,如图19所示,这样就能将这个长度不断变化的旋转向量看作是在画出缠绕起来的图像了:
图19 g ( t ) e − 2 π i f t \ g(t)e^{-2πift} g(t)e−2πift 表示将旋转的复数按照函数值大小被缩放了
从以上示例我们发现:
g
(
t
)
e
−
2
π
i
f
t
g(t)e^{-2πift}
g(t)e−2πift 就囊括了整个按照可变频率
f
f
f 将图像绕圆缠起来的想法,别忘了,我们要这个缠绕图像的目的是跟踪它的质心,想想用什么公式可以捕捉这一特性。
首先,我们可以试试在原信号上取一堆样本点,看看这些点在绕好的图上处于什么位置,如图20所示,然后取平均值,如公式(5)所示,也就是说,把它们都作为复数加起来,然后再除以样本点总数;当我们取的点更多,它们也就挨得更近,结果也就越准确,当取极限时,我们就不再认为是把一大堆点加起来再除以点数,而是对函数做积分,再除以时间区间的长度,如公式(6)所示。
1
N
∑
k
=
1
N
g
(
t
k
)
e
−
2
π
i
f
t
k
(5)
\frac{1}{N}\sum_{k=1}^Ng(t_k)e^{-2πift_k}\tag{5}
N1k=1∑Ng(tk)e−2πiftk(5)
1
t
2
−
t
1
∫
t
1
t
2
g
(
t
)
e
−
2
π
i
f
t
dt
(6)
\frac{1}{t_2-t_1}\int_{t_1}^{t_2}g(t)e^{-2πift}\text{dt}\tag{6}
t2−t11∫t1t2g(t)e−2πiftdt(6)
图20 原信号上取一堆样本点,看看这些点在绕好的图上处于什么位置
对复函数做积分可能怪怪的,实际上公式(6)就是绕好的图的质心。
此时,我们离真实的傅里叶变换就只剩最后一步不同了,那就是不要除以时间区间的长度,傅里叶变换就只是公式(6)中的积分部分,如公式(7)所示,其含义也不再是质心,而是把它倍增,如果说原图像持续了
3
3
3 秒,那就将质心乘以
3
3
3 ,如图21所示,如果原图像持续了
6
6
6 秒,那就将质心乘以
6
6
6 。
∫
t
1
t
2
g
(
t
)
e
−
2
π
i
f
t
dt
(6)
\int_{t_1}^{t_2}g(t)e^{-2πift}\text{dt}\tag{6}
∫t1t2g(t)e−2πiftdt(6)
图21 傅里叶变换的含义不再是质心,而是将其倍增,如果原图像持续了 3 3 3 秒,那就将质心乘以 3 3 3
这在物理上的效果就是,如果某个频率持续了很长时间,那么这个频率的模长就会被放得很大,如图22(a)所示,就是纯频率为每秒 2 2 2 拍的信号,以每秒 2 2 2 圈绕起来的时候,质心始终都呆在同一点,一直是同一形状,但这个信号存在得越久,此频率的傅里叶变换的值就会越大,而对其它频率来说,就算我们稍微增大了一点,也会被抵消掉,如图图22(b)所示,这是因为时间越长,缠绕图像就越可能在圆上均匀分布开来。
图22(a) 每秒 2 2 2 拍的信号,以每秒 2 2 2 圈绕起来的时候,质心始终都呆在同一点,如果这个频率持续了很长时间,那么该频率的模长就会被放得很大
图22(b) 对其它频率来说,就算我们稍微增大了一点,也会被抵消掉,这是因为时间越长,缠绕图像就越可能在圆上均匀分布开来
现在我们来总结一下到目前为止我们都做了什么。
对强度-时间函数
g
(
t
)
g(t)
g(t)(如图23(a)所示)的傅里叶变换是个新函数(如图23(b)所示),其取值不是时间,而是频率,也就是我们之前所称的缠绕频率,在记号上,我们通常将这个函数称为
g
^
(
f
)
\hat{g}(f)
g^(f) ,新函数的输出值是一个复数,也就是在二维平面上的一个点(如图23
(
(
(c
)
)
)所示),它对应原始信号中某一频率的强度,我们为傅里叶变换做的图像只是这一函数的实部,也就是
x
x
x 坐标,如果我们想要更完整的描述,也可以将虚部单独画出来(如图23(d)蓝色线条所示),所有这些都囊括在了我们刚刚建立的公式里:
g
^
(
f
)
=
∫
t
1
t
2
g
(
t
)
e
−
2
π
i
f
t
dt
(7)
\hat{g}(f)=\int_{t_1}^{t_2}g(t)e^{-2πift}\text{dt}\tag{7}
g^(f)=∫t1t2g(t)e−2πiftdt(7)
虽然看起来很复杂,但是只要我们理解了
- 指数项和旋转的关系;
- 把这个关系和函数 g ( t ) g(t) g(t) 相乘意义是画一张缠绕版的图像;
- 如何通过质心的思想解释对复函数的积分,
就不难看出这些符号的背后,其实是非常直观的。
图23(a) 强度-时间函数 g ( t ) g(t) g(t)
图23(b) g ( t ) \ g(t) g(t)的傅里叶变换是个新函数 g ^ ( f ) \hat{g}(f) g^(f) ,其取值不是时间而是频率,也就是我们之前所称的缠绕频率
图23 ( ( (c ) ) ) g ^ ( f ) \ \hat{g}(f) g^(f) 的输出值是一个复数,也就是在二维平面上的一个点,它对应原始信号中某一频率的强度
图23(d) 如果我们想要更完整的描述,也可以将虚部单独画出来(蓝色线条)
这里还需要一个注解,尽管在实际操作中,比如编辑音频,我们是对有限的音频进行了积分,但是在描述傅里叶变换时,积分上下限常常为正负无穷,如公式(8)所示,说到底,其含义是,考虑此表达式在每个有限时间区间上的值,然后看当时间区间接近于无穷时,极限是什么。
g
^
(
f
)
=
∫
−
∞
+
∞
g
(
t
)
e
−
2
π
i
f
t
dt
(8)
\hat{g}(f)=\int_{-\infty}^{+\infty}g(t)e^{-2πift}\text{dt}\tag{8}
g^(f)=∫−∞+∞g(t)e−2πiftdt(8)
参考文献
[1] 3Blue1Brown, 形象展示傅里叶变换. [https://www.bilibili.com/video/BV1pW411J7s8]