傅里叶级数


一、引子

大家在初中的时候应该学过一个东东:三菱镜,这家伙可以将白色的太阳光分成彩虹一般的红橙黄绿蓝靛紫

棱镜作为分光器,可以根据波谱折射率的不同,将白光分解成肉眼可见的七色光。这个实验现象告诉了人们一个道理:光是可以被分解的

可见光的波段在0.38-0.76微米,他们可以看做一系列的正弦波(Sine wave),那是不是存在这样一种法则,构成了光谱信号的表征量?(对人来说就是颜色啦)
白=∑(anSin(nx))白=\sum (a_nSin(nx)) 白=∑(an​Sin(nx))
后来呢,随着科学的发展,光被归到了电磁波里,兼具粒子性和波动性。德布罗意认为,一切物质都是波,都具有波动性。

光是波,信号是波,甚至我们也是波?那是不是意味着,信号也能向光波一样被分解成更小的信号,物质是不是也能被视作某种更小结构波动的叠加?

如果把物质描述成一个函数,那么问题似乎就得到了解决,起码在信号领域是酱紫的。傅里叶在他的著作《热分析理论》中提出,任何函数,无论连续与否,均可被展开为一系列正弦(Sine)函数之和。

比如这个:

比如这个:

都阔以分解成正弦函数。

我们来做个小实验,看看能不能用正弦波生成上图的信号吧~

import numpy as np
import matplotlib.pyplot as pltx = 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.piy1=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)=∑(anSin(nx))f(x)=\sum(a_nSin(nx)) f(x)=∑(an​Sin(nx))
这根傅里叶最初的想法相吻合!

二、傅里叶级数的通式

通过上面的引子,我们发现,只要是波,那么就阔以分解成多个正弦波的叠加!或者说,视为多个正弦波的线性组合

那我们进一步的分析,怎样的正弦波,才能表征一个任意波动呢?为了简化条件,我们先考虑周期性的波动,假设f(x)f(x)f(x)是一个周期为TTT的函数,它可以看做许多正弦波的组合,那么最开始的时候,这个公式长这样:
f(x)=∑(anSin(2πnTx))f(x)=\sum(a_nSin(\frac{2\pi n}{T}x)) f(x)=∑(an​Sin(T2πn​x))

正弦函数的一般表征为:ASin(ω⋅x+t)ASin(\omega\cdot x+t)ASin(ω⋅x+t),AAA表示振幅,ωx+t\omega x+tωx+t表示相位,ttt表示初相,ω\omegaω是频率,它与周期的关系为:ω=2πT\omega=\frac{2\pi}{T}ω=T2π​

按照惯例,我们加入一个常数项。因为常数项也一定满足周期性,所以这里是合理的,那么公式就变成了:
f(x)=C+∑(anSin(2πnTx))f(x)=C+\sum(a_nSin(\frac{2\pi n}{T}x)) f(x)=C+∑(an​Sin(T2πn​x))
再看这个公式,诶,全都是正弦函数构成的呀,正弦函数又是奇函数,奇函数的线性组合也是奇函数!出于奇偶性考虑,可以引入一个周期偶函数,最佳人选当然是余弦函数啦!
f(x)=C+∑(anSin(2πnTx)+bnCos(2πnTx))f(x)=C+\sum(a_nSin(\frac{2\pi n}{T}x)+b_nCos(\frac{2\pi n}{T}x)) f(x)=C+∑(an​Sin(T2πn​x)+bn​Cos(T2πn​x))
好了,上面的公式就是我们的傅里叶级数。当然,他还不够完整,我们发现,系数C,an,bnC, a_n, b_nC,an​,bn​依旧是未知的。

如果对于一个泛用的表达式而言,到这步已经可以了,但如果对于某个具体的信号,不确定系数那就是在耍流氓。

通式:可以分解;具体系数:如何分解

直接看或许没有什么头绪,那我们换个视角:线性代数视角。在给定一个信号f(x)f(x)f(x)中,他的傅里叶级数的是相同的,我们求解系数,可以通过信号在基上的投影来处理。

在此之前,需要引入一个概念:希尔伯特空间中的内积

连续空间上的内积

我们知道,一个向量vˉ\bar vvˉ 在RnR^nRn空间上的膜可写作:
∣∣v∣∣2=v12+v22+...+vn2||v||^2=v_1^2+v_2^2+...+v_n^2 ∣∣v∣∣2=v12​+v22​+...+vn2​
两个向量x,y∈Rnx,y\in R^nx,y∈Rn的内积(点积)可以写作:
<x,y>=x1y1+x2y2+...+xnyn=∑i=1nxiyi<x,y>=x_1y_1+x_2y_2+...+x_ny_n\\=\sum_{i=1}^nx_iy_i\\ <x,y>=x1​y1​+x2​y2​+...+xn​yn​=i=1∑n​xi​yi​
在二维和三维空间下,该表达式还等价于:
<x,y>=∣x∣∣y∣cosθ<x,y>=|x||y|cos\theta <x,y>=∣x∣∣y∣cosθ
其几何意义表示为前一个向量在后一个向量上的投影(此时位置可以互换)。

可对于一个连续变量而言,空间的维度扩展到了无限维,上述内积的定义还能生效吗?

假设区间为[0,2π][0,2\pi][0,2π]的正弦波函数f(x)=sinxf(x)=sinxf(x)=sinx,我们将映射fff作为一个希尔伯特空间的向量,f(x)f(x)f(x)的值域sinxsinxsinx也就成了向量分量。此时的加法已经不再适用了。好在我们还有处理连续的杀手锏:微积分

于是,在一个无限维的函数空间中,f(x)f(x)f(x)函数的内积可以视作:
∣∣f∣∣2=∫02πf(x)2dx=∫02π(sinx)2dx=∫02π1−cos2x2dx=12(∫02π1dx−∫02πcos2x(12d2x))=π−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−cos2x​dx =21​(∫02π​1dx−∫02π​cos2x(21​d2x)) =π−0−0+0 =π
上面的推导意义在于:函数在希尔伯特空间上也可以看做向量,希尔伯特空间可以视作一个函数空间。

于是,连续函数f(x)f(x)f(x)和g(x)g(x)g(x)在R∞R^\infinR∞上的内积可以记作:
<f(x),g(x)>=∫f(x)g(x)dx<f(x),g(x)>=\int f(x)g(x)\ dx <f(x),g(x)>=∫f(x)g(x) dx
以f(x)=sinxf(x)=sinxf(x)=sinx,g(x)=cosxg(x)=cosxg(x)=cosx为例,在[0,2π][0,2\pi][0,2π]范围内,二者的内积可写作:
<f(x),g(x)>=∫02πsin(x)cos(x)dx=0<f(x),g(x)>=\int_0^{2\pi}sin(x)cos(x)\ dx=0 <f(x),g(x)>=∫02π​sin(x)cos(x) dx=0
由于二者具有相同的周期性,所以最终coscoscos和sinsinsin在[−∞,∞][-\infin,\infin][−∞,∞]上的内积为000,换句话说,二者正交。(二者的交接处是更低维度)

现在,我们知道了有限维空间和无限维空间中向量内积的定义,这对我们求解系数有什么帮助呢?

向量内积对于正交基有如下定义,假设wˉ=axˉ+byˉ\bar w=a\bar x+b\bar ywˉ=axˉ+byˉ​,且xˉ,yˉ\bar x,\bar yxˉ,yˉ​正交,则有:
a=wˉ⋅xˉ∣∣x∣∣2b=wˉ⋅yˉ∣∣y∣∣2a=\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 wwˉ在分量(轴)上的投影长度。由于xˉ,yˉ\bar x,\bar yxˉ,yˉ​正交,所以当向量投影在一个正交基上时,在另一个正交基上的投影为0,此时向量的信息量都由被投影的正交基所贡献,这也就是前面的系数。

在希尔伯特空间下,系数记作:
a=∫f(x)g(x)dx∫g(x)2dxa=\frac{\int f(x)g(x)\ dx}{\int g(x)^2\ dx} a=∫g(x)2 dx∫f(x)g(x) dx​

三、傅里叶级数的系数

好了,我们花了很多笔墨用来推导内积、投影系数,现在终于可以回归到傅里叶级数系数的求解上啦!

其实傅里叶级数系数的求解的核心思想在于正弦函数的正交性质,下面我们一点一点来推导:

傅里叶级数的展开可以写作:
f(x)=a0+a1cosx+b1sinx+a2cos2x+b2sin2x+...f(x)=a_0+a_1cosx+b_1sinx+a_2cos2x+b_2sin2x+... f(x)=a0​+a1​cosx+b1​sinx+a2​cos2x+b2​sin2x+...
我们假设β\betaβ是f(x)f(x)f(x) 的一组基向量:
β={12,cosx,sinx,cos2x,sin2x...}\beta=\{\frac{1}{\sqrt2},cosx,sinx,cos2x,sin2x...\} β={2​1​,cosx,sinx,cos2x,sin2x...}
假设m,nm,nm,n为非负整数,且m≠nm\ne nm=n,利用积化和差公式可以计算如下式子:
1π∫−ππcos(mx)sin(nx)dx=0,1π∫−ππcos(mx)cos(nx)dx=01π∫−ππsin(mx)sin(nx)dx=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π∫−ππ(12)2dx=11π∫−ππcos2(mx)dx=11π∫−ππsin2(mx)dx=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​∫−ππ​(2​1​)2 dx=1 π1​∫−ππ​cos2(mx) dx=1 π1​∫−ππ​sin2(mx) dx=1
于是我们发现,β\betaβ中所有的函数长度都等于1,任意两个相异函数彼此正交。

我们想计算通项ana_nan​的系数,就可以通过正交基的性质进行求解:
an=<cos(2πnxT),f(x)>∣∣cos(2πnxT)∣∣2=∫0Tf(x)cos(2πnxT)dx∫0Tcos2(2πnxT)dxa_n=\frac{<cos(\frac{2\pi nx}{T}),f(x)>}{||cos(\frac{2\pi nx}{T})||^2}\\ \\ \ \\=\frac{\int_0^Tf(x)cos(\frac{2\pi nx}{T})\ dx}{\int_0^Tcos^2(\frac{2\pi nx}{T})\ dx} an​=∣∣cos(T2πnx​)∣∣2<cos(T2πnx​),f(x)>​ =∫0T​cos2(T2πnx​) dx∫0T​f(x)cos(T2πnx​) dx​
其中:
∫0Tcos2(2πnxT)dx=∫0T(1+cos(4πnxT)2)dx=12(∫0Tdx+∫0Tcos(4πnxT)2d2x)=12(x∣0T+12sin(4πnxT)∣0T)=T2{\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} ∫0T​cos2(T2πnx​) dx=∫0T​(21+cos(T4πnx​)​) dx =21​(∫0T​dx+∫0T​2cos(T4πnx​)​d2x) =21​(x∣0T​+21​sin(T4πnx​)∣0T​) =2T​
所以最后系数ana_nan​表达为:
an=2T∫0Tf(x)cos(2πnxT)dxa_n=\frac{2}{T}\int_0^Tf(x)cos(\frac{2\pi nx}{T})\ dx an​=T2​∫0T​f(x)cos(T2πnx​) dx
同理,系数bnb_nbn​可以表达为:
bn=2T∫0Tf(x)sin(2πnxT)dxb_n=\frac{2}{T}\int_0^Tf(x)sin(\frac{2\pi nx}{T})\ dx bn​=T2​∫0T​f(x)sin(T2πnx​) dx
我们令f(x)f(x)f(x)的首项为a0/2a_0/2a0​/2,使得ana_nan​计算公式同时适用n=0n=0n=0和n>0n>0n>0的情况。

于是,最终的傅里叶级数表达式为:
f(x)=a02+∑(ancos(2πnTx))+∑(bnCos(2πnTx))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​​+∑(an​cos(T2πn​x))+∑(bn​Cos(T2πn​x))
其中:
an=2T∫0Tf(x)cos(2πnxT)dxbn=2T∫0Tf(x)sin(2πnxT)dxa_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​∫0T​f(x)cos(T2πnx​) dx bn​=T2​∫0T​f(x)sin(T2πnx​) dx

四、例子

还记得我们的实验吗?用多个正弦波逼近方波的那个?

现在我们来看看为什么用那些正弦波可以逼近方波。

首先定义一个周期等于2π2\pi2π的方波:
f(x)={−1,if−π<x<0,1,if0<x<π,f(x)= \begin{cases} -1,\ \ if\ -\pi<x<0,\\ 1,\ \ \ if\ \ 0<x<\pi, \end{cases} f(x)={−1,  if −π<x<0,1,   if  0<x<π,​
由于在x=0x=0x=0处,f(x)f(x)f(x)并未给出定义,所以我们不知道f(0)f(0)f(0)是否可用于计算傅里叶级数。

现在将f(x)f(x)f(x)投影到各个基向量上,首先是sinsinsin:
bn=2T(∫−π0−1⋅sin(2πnxT)dx+∫0π1⋅sin(2πnxT)dx)=22π((−∫−π0sin(nx)(1nd(nx))+(∫0πsin(nx)(1nd(nx))=1nπ(cos(nx)∣−π0−cos(nx)∣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​((−∫−π0​sin(nx)(n1​d(nx))+(∫0π​sin(nx)(n1​d(nx)) =nπ1​(cos(nx)∣−π0​−cos(nx)∣0π​)
当n&1=1n\&1=1n&1=1时,有:bn=4nπb_n=\frac{4}{n\pi}bn​=nπ4​,当n&1=0n\&1=0n&1=0,则有bn=0b_n=0bn​=0。

同理,对于ana_nan​,有:a0=an=0a_0=a_n=0a0​=an​=0,于是,方波可以分解为:
f(x)=0+∑0+4nπ∑(sin(nx))n&1==1f(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π(sinx+sin(3x)3+sin(5x)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

【超详细~】手把手带你推导傅里叶级数~相关推荐

  1. 超详细——手把手教你用threejs实现一个酷炫的模型发光扫描效果(三)

    上一篇文章 voidjay,公众号:web前端可视化超详细--手把手教你用threejs实现一个酷炫的模型发光扫描效果(二) 上一篇文章已完成基本效果的实现,本文则完成整个项目的灵魂:发光效果以及模型 ...

  2. 常用Linux命令及其作用(超详细,带演示)

    常用Linux命令及其作用(超详细,带演示) 文章目录 常用Linux命令及其作用(超详细,带演示) 1. 提前了解 1.1 终端命令格式 1.2 --help 1.3 man command 查询使 ...

  3. 图像去雨:超详细手把手写 pytorch 实现代码(带注释)

    引导 数据集准备 训练数据集代码 测试数据集代码 网络模型代码 训练代码 测试代码 参考文献 其他 数据集准备 使用来自第一个参考文献的公开数据集Rain12600和Rain1400,下载链接.其中训 ...

  4. 强网杯2021 ctf线上赛ezmath wp(#超详细,带逆向新手走过一个又一个小坑)

    文章目录 引言 一.分析文件类型 二.初步分析 1 运行情况 2 IDA初步分析 三.详细分析 1 sub_13F3函数分析 2 查找蛛丝马迹 (1)mprotect (2)重写unk_2010 3 ...

  5. 超详细!带你轻松掌握 MMSegmentation 整体构建流程

    目录 1.语义分割介绍 2.语义分割的应用 自动驾驶 遥感图像分析 医学图像分析 3.MMSegmentation 算法库框架介绍 3.1 MMSegmentation 目录结构 3.2 MMSegm ...

  6. aspen二元体系共沸组分_超详细 | 手把手教你组分结构预测

    好久不见,读者朋友们,笔者本次介绍USPEX官方案例16-18:大体系定组分稳定结构预测.以德拜温度为目的进行定组分结构预测.计算量惊人的三元体系的变组分结构预测. 01 USPEX官方案例讲解(16 ...

  7. 超详细手把手教你cordova开发使用指南+自定义插件,jsbridge

    Cordova是什么 使用前端技术 开发跨平台web App的工具 底层原理:HTML+CSS搭建页面, JS和原生交互 交互原理:Cordova插件 环境配置 安卓开发基础环境搭建的文章可以参考一下 ...

  8. 超详细解读带你读懂单细胞RNA测序分析的最佳实践教程 (原理、代码和评述)

    Abstract 单细胞RNA-seq使研究者能够以前所未有的分辨率研究基因表达图谱.这一潜力吸引着更多科研工作者应用单细胞分析技术解决研究问题.随着可用的分析工具越来越多,如何组合成一个最新最好的数 ...

  9. 超详细——手把手教你用threejs实现一个酷炫的模型发光扫描效果(一)

    前言 模型特效是大家在3d可视化项目所追求的,但很多人苦于无法实现一个好的模型效果,本次就手把手一步一步教你实现一个酷炫的模型发光扫描特效,帮让你的项目提升一个逼格.话不多说,先上效果: 本文所使用的 ...

最新文章

  1. FPGAtestbench中如何产生差分时钟
  2. opencl fft实例整理
  3. 评估创业项目的十大标准
  4. JIRA介绍- 一个专业优秀的缺陷跟踪管理软件
  5. 服务器mysql显示链接次数太多,服务器mysql显示链接次数太多
  6. 泛型参数怎么new_泛型编程,你不知道?(基础篇)
  7. php 强制输出数组,php怎么将对象强制转数组
  8. Delphi中的操作二进制文件的两个重要函数
  9. java 类.class_Java 反射之根基 Class 类
  10. 第七章节 类的抽象(抽象类和接口的区别)
  11. PHP面试题及答案(一)
  12. IOS UIAlertView 提示视图
  13. 宏脉系统怎么改服务器地址大全,宏脉系统使用手册大全新.doc
  14. 如何用犀牛自带的电池快速制作tekla自定义截面
  15. STM32 串口程序下载
  16. 双目测距原理以及双目相机矫正
  17. 优化AI搜索引擎,从这3个领域入手!
  18. 心形线方程-Geek献给女友的爱意情人节
  19. 数据仓库(二) 数仓理论(重点核心)
  20. 【算法分析】实验 1. 基于贪心的会议安排问题

热门文章

  1. python做数据分析有什么优势_六星教育:使用Python做数据分析的优点是什么?
  2. Android RxJava操作符的学习---总结
  3. 炒股 葛南维八大法则
  4. 五子棋AI图形界面人机对战(JAVA实现)
  5. 微信小程序订阅消息推送(附带后台java代码)
  6. 利用TensorRT实现神经网络提速(读取ONNX模型并运行)
  7. 【JavaScript-17】BOM-04 获取页面宽高、盒子宽高
  8. netflix 开源_Netflix开源数据科学管理工具
  9. Python数据库操作【三】—— SQLServer
  10. Android 开发 Content Provider 使用 demo