大家在初中的时候应该学过一个东东:三菱镜,这家伙可以将白色的太阳光分成彩虹一般的红橙黄绿蓝靛紫
。
棱镜作为分光器,可以根据波谱折射率的不同,将白光分解成肉眼可见的七色光。这个实验现象告诉了人们一个道理:光是可以被分解的
。
可见光的波段在0.38-0.76
微米,他们可以看做一系列的正弦波(Sine wave),那是不是存在这样一种法则,构成了光谱信号的表征量?(对人来说就是颜色啦)
白 = ∑ ( a n S i n ( n x ) ) 白=\sum (a_nSin(nx)) 白=∑(anSin(nx))
后来呢,随着科学的发展,光被归到了电磁波里,兼具粒子性和波动性。德布罗意认为,一切物质都是波,都具有波动性。
光是波,信号是波,甚至我们也是波?那是不是意味着,信号也能向光波一样被分解成更小的信号,物质是不是也能被视作某种更小结构波动的叠加?
如果把物质描述成一个函数,那么问题似乎就得到了解决,起码在信号领域是酱紫的。傅里叶在他的著作《热分析理论》
中提出,任何函数,无论连续与否,均可被展开为一系列正弦(Sine)函数之和。
比如这个:
比如这个:
都阔以分解成正弦函数。
我们来做个小实验,看看能不能用正弦波生成上图的信号吧~
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10,10,0.02)
def getSign(x,n):
# 方波
y=np.zeros_like(x)
for i in range(2*n):
if i&1:
y+=np.sin(i*x)/(i)
return y*4/np.pi
y1=getSign(x,10)
y2=getSign(x,100)
y3=getSign(x,1000)
y4=getSign(x,100000)
plt.plot(x,y1,label="10")
plt.plot(x,y2,label="100")
plt.plot(x,y3,label="1000")
plt.plot(x,y4,label="100000")
plt.legend()
plt.show()
def getSign(x,n):
# 锯齿波
y=np.zeros_like(x)
for i in range(1,n+1):
if i&1:
y+=2/i*np.sin(i*x)
else:
y-=2/i*np.sin(i*x)
return y
哦这实在是太酷了不是吗,随着正弦波数量的增加,整个信号量变得越来越平滑,最后几乎与周期矩形和周期锯齿一般无二了!
这个过程同样可以跟光波分解写成一样的表达式:
f ( x ) = ∑ ( a n S i n ( n x ) ) f(x)=\sum(a_nSin(nx)) f(x)=∑(anSin(nx))
这根傅里叶最初的想法相吻合!
通过上面的引子,我们发现,只要是波,那么就阔以分解成多个正弦波的叠加!或者说,视为多个正弦波的线性组合!
那我们进一步的分析,怎样的正弦波,才能表征一个任意波动呢?为了简化条件,我们先考虑周期性的波动,假设 f ( x ) f(x) f(x)是一个周期为 T T T的函数,它可以看做许多正弦波的组合,那么最开始的时候,这个公式长这样:
f ( x ) = ∑ ( a n S i n ( 2 π n T x ) ) f(x)=\sum(a_nSin(\frac{2\pi n}{T}x)) f(x)=∑(anSin(T2πnx))
正弦函数的一般表征为: A S i n ( ω ⋅ x + t ) ASin(\omega\cdot x+t) ASin(ω⋅x+t), A A A表示振幅, ω x + t \omega x+t ωx+t表示相位, t t t表示初相, ω \omega ω是频率,它与周期的关系为: ω = 2 π T \omega=\frac{2\pi}{T} ω=T2π
按照惯例,我们加入一个常数项。因为常数项也一定满足周期性,所以这里是合理的,那么公式就变成了:
f ( x ) = C + ∑ ( a n S i n ( 2 π n T x ) ) f(x)=C+\sum(a_nSin(\frac{2\pi n}{T}x)) f(x)=C+∑(anSin(T2πnx))
再看这个公式,诶,全都是正弦函数构成的呀,正弦函数又是奇函数,奇函数的线性组合也是奇函数!出于奇偶性考虑,可以引入一个周期偶函数,最佳人选当然是余弦函数啦!
f ( x ) = C + ∑ ( a n S i n ( 2 π n T x ) + b n C o s ( 2 π n T x ) ) f(x)=C+\sum(a_nSin(\frac{2\pi n}{T}x)+b_nCos(\frac{2\pi n}{T}x)) f(x)=C+∑(anSin(T2πnx)+bnCos(T2πnx))
好了,上面的公式就是我们的傅里叶级数。当然,他还不够完整,我们发现,系数 C , a n , b n C, a_n, b_n C,an,bn依旧是未知的。
如果对于一个泛用的表达式而言,到这步已经可以了,但如果对于某个具体的信号,不确定系数那就是在耍流氓。
通式:可以分解;具体系数:如何分解
直接看或许没有什么头绪,那我们换个视角:线性代数视角。在给定一个信号 f ( x ) f(x) f(x)中,他的傅里叶级数的基是相同的,我们求解系数,可以通过信号在基上的投影来处理。
在此之前,需要引入一个概念:希尔伯特空间中的内积
连续空间上的内积
我们知道,一个向量 v ˉ \bar v vˉ 在 R n R^n Rn空间上的膜可写作:
∣ ∣ v ∣ ∣ 2 = v 1 2 + v 2 2 + . . . + v n 2 ||v||^2=v_1^2+v_2^2+...+v_n^2 ∣∣v∣∣2=v12+v22+...+vn2
两个向量 x , y ∈ R n x,y\in R^n x,y∈Rn的内积(点积)可以写作:
< x , y > = x 1 y 1 + x 2 y 2 + . . . + x n y n = ∑ i = 1 n x i y i
在二维和三维空间下,该表达式还等价于:
< x , y > = ∣ x ∣ ∣ y ∣ c o s θ
其几何意义表示为前一个向量在后一个向量上的投影(此时位置可以互换)。
可对于一个连续变量而言,空间的维度扩展到了无限维,上述内积的定义还能生效吗?
假设区间为 [ 0 , 2 π ] [0,2\pi] [0,2π]的正弦波函数 f ( x ) = s i n x f(x)=sinx f(x)=sinx,我们将映射 f f f作为一个希尔伯特空间的向量, f ( x ) f(x) f(x)的值域 s i n x sinx sinx也就成了向量分量。此时的加法已经不再适用了。好在我们还有处理连续的杀手锏:微积分。
于是,在一个无限维的函数空间中, f ( x ) f(x) f(x)函数的内积可以视作:
∣ ∣ f ∣ ∣ 2 = ∫ 0 2 π f ( x ) 2 d x = ∫ 0 2 π ( s i n x ) 2 d x = ∫ 0 2 π 1 − c o s 2 x 2 d x = 1 2 ( ∫ 0 2 π 1 d x − ∫ 0 2 π c o s 2 x ( 1 2 d 2 x ) ) = π − 0 − 0 + 0 = π ||f||^2=\int_0^{2\pi}f(x)^2dx=\int_0^{2\pi}(sinx)^2dx \\ \ \\ \\=\int_0^{2\pi}\frac{1-cos2x}{2}dx\\ \\ \ \\ =\frac{1}{2}(\int_0^{2\pi}1dx-\int_0^{2\pi}cos2x(\frac{1}{2}d2x))\\ \\ \ \\ =\pi-0-0+0\\ \\ \ \\=\pi ∣∣f∣∣2=∫02πf(x)2dx=∫02π(sinx)2dx =∫02π21−cos2xdx =21(∫02π1dx−∫02πcos2x(21d2x)) =π−0−0+0 =π
上面的推导意义在于:函数在希尔伯特空间上也可以看做向量,希尔伯特空间可以视作一个函数空间。
于是,连续函数 f ( x ) f(x) f(x)和 g ( x ) g(x) g(x)在 R ∞ R^\infin R∞上的内积可以记作:
< f ( x ) , g ( x ) > = ∫ f ( x ) g ( x ) d x
以 f ( x ) = s i n x f(x)=sinx f(x)=sinx, g ( x ) = c o s x g(x)=cosx g(x)=cosx为例,在 [ 0 , 2 π ] [0,2\pi] [0,2π]范围内,二者的内积可写作:
< f ( x ) , g ( x ) > = ∫ 0 2 π s i n ( x ) c o s ( x ) d x = 0
由于二者具有相同的周期性,所以最终 c o s cos cos和 s i n sin sin在 [ − ∞ , ∞ ] [-\infin,\infin] [−∞,∞]上的内积为 0 0 0,换句话说,二者正交。(二者的交接处是更低维度)
现在,我们知道了有限维空间和无限维空间中向量内积的定义,这对我们求解系数有什么帮助呢?
向量内积对于正交基有如下定义,假设 w ˉ = a x ˉ + b y ˉ \bar w=a\bar x+b\bar y wˉ=axˉ+byˉ,且 x ˉ , y ˉ \bar x,\bar y xˉ,yˉ正交,则有:
a = w ˉ ⋅ x ˉ ∣ ∣ x ∣ ∣ 2 b = w ˉ ⋅ y ˉ ∣ ∣ y ∣ ∣ 2 a=\frac{\bar w\cdot \bar x}{||x||^2}\\ b=\frac{\bar w\cdot \bar y}{||y||^2} a=∣∣x∣∣2wˉ⋅xˉb=∣∣y∣∣2wˉ⋅yˉ
这个公式的几何意义为:
线性组合 w ˉ \bar w wˉ在分量(轴)上的投影长度。由于 x ˉ , y ˉ \bar x,\bar y xˉ,yˉ正交,所以当向量投影在一个正交基上时,在另一个正交基上的投影为0,此时向量的信息量都由被投影的正交基所贡献,这也就是前面的系数。
在希尔伯特空间下,系数记作:
a = ∫ f ( x ) g ( x ) d x ∫ g ( x ) 2 d x a=\frac{\int f(x)g(x)\ dx}{\int g(x)^2\ dx} a=∫g(x)2 dx∫f(x)g(x) dx
好了,我们花了很多笔墨用来推导内积、投影系数,现在终于可以回归到傅里叶级数系数的求解上啦!
其实傅里叶级数系数的求解的核心思想在于正弦函数的正交性质,下面我们一点一点来推导:
傅里叶级数的展开可以写作:
f ( x ) = a 0 + a 1 c o s x + b 1 s i n x + a 2 c o s 2 x + b 2 s i n 2 x + . . . f(x)=a_0+a_1cosx+b_1sinx+a_2cos2x+b_2sin2x+... f(x)=a0+a1cosx+b1sinx+a2cos2x+b2sin2x+...
我们假设 β \beta β是 f ( x ) f(x) f(x) 的一组基向量:
β = { 1 2 , c o s x , s i n x , c o s 2 x , s i n 2 x . . . } \beta=\{\frac{1}{\sqrt2},cosx,sinx,cos2x,sin2x...\} β={21,cosx,sinx,cos2x,sin2x...}
假设 m , n m,n m,n为非负整数,且 m ≠ n m\ne n m=n,利用积化和差公式可以计算如下式子:
1 π ∫ − π π c o s ( m x ) s i n ( n x ) d x = 0 , 1 π ∫ − π π c o s ( m x ) c o s ( n x ) d x = 0 1 π ∫ − π π s i n ( m x ) s i n ( n x ) d x = 0 \frac{1}{\pi}\int_{-\pi}^\pi cos(mx)sin(nx)\ dx=0,\\ \\ \ \\ \frac{1}{\pi}\int_{-\pi}^\pi cos(mx)cos(nx)\ dx=0\\ \\ \ \\ \frac{1}{\pi}\int_{-\pi}^\pi sin(mx)sin(nx)\ dx=0 π1∫−ππcos(mx)sin(nx) dx=0, π1∫−ππcos(mx)cos(nx) dx=0 π1∫−ππsin(mx)sin(nx) dx=0
以及:
1 π ∫ − π π ( 1 2 ) 2 d x = 1 1 π ∫ − π π c o s 2 ( m x ) d x = 1 1 π ∫ − π π s i n 2 ( m x ) d x = 1 \frac{1}{\pi}\int_{-\pi}^\pi (\frac{1}{\sqrt2})^2\ dx=1\\ \\ \ \\ \frac{1}{\pi}\int_{-\pi}^\pi cos^2(mx)\ dx=1\\ \\ \ \\ \frac{1}{\pi}\int_{-\pi}^\pi sin^2(mx)\ dx=1 π1∫−ππ(21)2 dx=1 π1∫−ππcos2(mx) dx=1 π1∫−ππsin2(mx) dx=1
于是我们发现, β \beta β中所有的函数长度都等于1,任意两个相异函数彼此正交。
我们想计算通项 a n a_n an的系数,就可以通过正交基的性质进行求解:
a n = < c o s ( 2 π n x T ) , f ( x ) > ∣ ∣ c o s ( 2 π n x T ) ∣ ∣ 2 = ∫ 0 T f ( x ) c o s ( 2 π n x T ) d x ∫ 0 T c o s 2 ( 2 π n x T ) d x a_n=\frac{
其中:
∫ 0 T c o s 2 ( 2 π n x T ) d x = ∫ 0 T ( 1 + c o s ( 4 π n x T ) 2 ) d x = 1 2 ( ∫ 0 T d x + ∫ 0 T c o s ( 4 π n x T ) 2 d 2 x ) = 1 2 ( x ∣ 0 T + 1 2 s i n ( 4 π n x T ) ∣ 0 T ) = T 2 {\int_0^Tcos^2(\frac{2\pi nx}{T})\ dx}={\int_0^T(\frac{1+cos(\frac{4\pi nx}{T})}{2})\ dx} \\ \\ \ \\=\frac{1}{2}(\int_0^Tdx+\int_0^T\frac{cos(\frac{4\pi nx}{T})}{2}d2x)\\\\ \ \\ =\frac{1}{2}(x|^T_0+\frac{1}{2}sin(\frac{4\pi n x}{T})|^T_0)\\\\ \ \\=\frac{T}{2} ∫0Tcos2(T2πnx) dx=∫0T(21+cos(T4πnx)) dx =21(∫0Tdx+∫0T2cos(T4πnx)d2x) =21(x∣0T+21sin(T4πnx)∣0T) =2T
所以最后系数 a n a_n an表达为:
a n = 2 T ∫ 0 T f ( x ) c o s ( 2 π n x T ) d x a_n=\frac{2}{T}\int_0^Tf(x)cos(\frac{2\pi nx}{T})\ dx an=T2∫0Tf(x)cos(T2πnx) dx
同理,系数 b n b_n bn可以表达为:
b n = 2 T ∫ 0 T f ( x ) s i n ( 2 π n x T ) d x b_n=\frac{2}{T}\int_0^Tf(x)sin(\frac{2\pi nx}{T})\ dx bn=T2∫0Tf(x)sin(T2πnx) dx
我们令 f ( x ) f(x) f(x)的首项为 a 0 / 2 a_0/2 a0/2,使得 a n a_n an计算公式同时适用 n = 0 n=0 n=0和 n > 0 n>0 n>0的情况。
于是,最终的傅里叶级数表达式为:
f ( x ) = a 0 2 + ∑ ( a n c o s ( 2 π n T x ) ) + ∑ ( b n C o s ( 2 π n T x ) ) f(x)=\frac{a_0}{2}+\sum(a_ncos(\frac{2\pi n}{T}x))+\sum (b_nCos(\frac{2\pi n}{T}x)) f(x)=2a0+∑(ancos(T2πnx))+∑(bnCos(T2πnx))
其中:
a n = 2 T ∫ 0 T f ( x ) c o s ( 2 π n x T ) d x b n = 2 T ∫ 0 T f ( x ) s i n ( 2 π n x T ) d x a_n=\frac{2}{T}\int_0^Tf(x)cos(\frac{2\pi nx}{T})\ dx\\ \\ \ \\ b_n=\frac{2}{T}\int_0^Tf(x)sin(\frac{2\pi nx}{T})\ dx an=T2∫0Tf(x)cos(T2πnx) dx bn=T2∫0Tf(x)sin(T2πnx) dx
还记得我们的实验吗?用多个正弦波逼近方波的那个?
现在我们来看看为什么用那些正弦波可以逼近方波。
首先定义一个周期等于 2 π 2\pi 2π的方波:
f ( x ) = { − 1 , i f − π < x < 0 , 1 , i f 0 < x < π , f(x)= \begin{cases} -1,\ \ if\ -\pi
由于在 x = 0 x=0 x=0处, f ( x ) f(x) f(x)并未给出定义,所以我们不知道 f ( 0 ) f(0) f(0)是否可用于计算傅里叶级数。
现在将 f ( x ) f(x) f(x)投影到各个基向量上,首先是 s i n sin sin:
b n = 2 T ( ∫ − π 0 − 1 ⋅ s i n ( 2 π n x T ) d x + ∫ 0 π 1 ⋅ s i n ( 2 π n x T ) d x ) = 2 2 π ( ( − ∫ − π 0 s i n ( n x ) ( 1 n d ( n x ) ) + ( ∫ 0 π s i n ( n x ) ( 1 n d ( n x ) ) = 1 n π ( c o s ( n x ) ∣ − π 0 − c o s ( n x ) ∣ 0 π ) b_n=\frac{2}{T}(\int_{-\pi}^0-1\cdot sin(\frac{2\pi nx}{T})dx+\int_0^\pi1\cdot sin(\frac{2\pi nx}{T})dx)\\\\ \ \\ =\frac{2}{2\pi}((-\int_{-\pi}^0sin(nx)(\frac{1}{n}d(nx))+(\int_{0}^\pi sin(nx)(\frac{1}{n}d(nx)) \\\\ \ \\ =\frac{1}{n\pi}(cos(nx)|_{-\pi}^0-cos(nx)|^\pi_{0}) bn=T2(∫−π0−1⋅sin(T2πnx)dx+∫0π1⋅sin(T2πnx)dx) =2π2((−∫−π0sin(nx)(n1d(nx))+(∫0πsin(nx)(n1d(nx)) =nπ1(cos(nx)∣−π0−cos(nx)∣0π)
当 n & 1 = 1 n\&1=1 n&1=1时,有: b n = 4 n π b_n=\frac{4}{n\pi} bn=nπ4,当 n & 1 = 0 n\&1=0 n&1=0,则有 b n = 0 b_n=0 bn=0。
同理,对于 a n a_n an,有: a 0 = a n = 0 a_0=a_n=0 a0=an=0,于是,方波可以分解为:
f ( x ) = 0 + ∑ 0 + 4 n π ∑ ( s i n ( n x ) ) n & 1 = = 1 f(x)=0+\sum0+\frac{4}{n\pi}\sum(sin(nx))\ n\&1==1 f(x)=0+∑0+nπ4∑(sin(nx)) n&1==1
写作:
f ( x ) = 4 π ( s i n x + s i n ( 3 x ) 3 + s i n ( 5 x ) 5 . . . ) f(x)=\frac{4}{\pi}(sinx+\frac{sin(3x)}{3}+\frac{sin(5x)}{5}...) f(x)=π4(sinx+3sin(3x)+5sin(5x)...)
数学意义
从数学角度上讲,在线性代数中我们知道,一个向量空间上的所有向量都可以由该空间的基向量线性表出,傅里叶级数同样如此。在希尔伯特空间上,傅里叶级数无穷个三角函数正交基能够线性表出整个希尔伯特空间上的函数值。
此外,由于连续空间上内积和系数的定义,傅里叶级数可以看做是将函数 f ( x ) f(x) f(x)投影到这组正交基上,并有这组正交基线性表出。
通过这种正交投影的方式,一个周期性的信号就能够被拆解成无限个正弦波的线性组合。
物理意义
上文的小实验揭示了傅里叶级数的物理意义,一个周期函数可以拆解成许多正弦波,许多正弦波可以线性表出一个周期函数。
[1] https://ccjou.wordpress.com/2012/04/03/%e5%82%85%e7%ab%8b%e8%91%89%e7%b4%9a%e6%95%b8-%e4%b8%8b/
[2] https://ccjou.wordpress.com/2012/03/30/%E5%82%85%E7%AB%8B%E8%91%89%E7%B4%9A%E6%95%B8-%E4%B8%8A/
[3] https://www.matongxue.com/madocs/619