傅里叶变换


一、前言

犹记得第一次接触傅里叶变换,还是在大二刚入计算机视觉坑的时候。那年恰逢疫情,困在家中完全没有学习的动力,只是浅尝辄止,当时天真的以为,以后再也不会跟Fourier Transform打交道了。

直到这个秋天,我发现我错的很彻底。搞遥感的人,似乎跟傅里叶变换结下了孽缘:频域分析需要FFT,光谱分光需要FFT,图像处理需要FFT,甚至玩算法放松下也要被FFT揪着不放…

我想,趁冬日未至,趁雁栖微凉,也许是时候跟这段恩怨做个了断了。

这篇文章有些长,有些散,有些无聊的感慨。不过要是耐心读下去,也许会有不一样的感悟。

想看具体代码的同学可以直接移步到第五部分


二、自然常数与欧拉公式

一、引子

数学,可以用美(beauty)来形容吗?在雁栖湖的第一年,我读了一篇英文课文----一场关于数学和哲学的思辨,一次逻辑与艺术的碰撞。

作者Ian Sample在文章中,说了这样一句话:Maths has the same capacity for beauty as art, music, a full blanket of stars on the darkest night。数学具有与艺术,与音乐,与漆黑夜空中繁星闪耀般同质的美。

那闪耀群星中,有一颗让人如痴如醉,摄人心魄的星辰。费曼把它称作The most remarkable formula in mathematics,全宇宙中,最美丽的公式----欧拉公式。

eiπ+1=0e^{i\pi}+1=0

诶,也许你会说了,这不就是一个指数函数嘛,怎么就跟美扯上关系了?这都美的话,那我还说1+1=21+1=2也是最美的公式呢!别急,让我们一点一点的来,好茶需要慢慢品味。

在这之前,有个秘密我想分享给大家。其实自然常数ee,一点也不自然!

二、自然常数ee

说到自然常数ee的身世,就不得不提另一个概念:复利公式。我们都知道,存款是有利率的,假设这个年利率为1/n1/n,在nn年之后,连带着本金应当为:

I×(1+1n)nI\times(1+\frac{1}{n})^n

假设本金I=1I=1,于是公式(2)可以变形为:

(1+1n)n(1+\frac{1}{n})^n

这个式子,考研的同学应当熟稔于心了吧,什么?不太清楚?那这样呢:

limninf(1+1n)nlim_{n\to\inf}(1+\frac{1}{n})^n

我们洛一下看看?

lim (1+1n)n=lim eln(1+1n)n=elim n(ln(1+1n))=elim ln(1+1n)1n=elim 11+1n=e1=elim\ (1+\frac{1}{n})^n=lim\ e^{ln(1+\frac{1}{n})^n}\\ =e^{lim \ n(ln(1+\frac{1}{n}))}\\ =e^{lim\ \frac{ln(1+\frac{1}{n})'}{\frac{1}{n}'}}\\ =e^{lim\ \frac{1}{1+\frac{1}{n}}} \\ =e^1 \\ =e

当然,是先有的这个公式,然后才有的ee,在平时的学习中,则是通过后验知识ee去求解极限。或许,单凭这个公式并不能看出来什么,我们再举个例子。

假设有一个飞船以速度1进行飞行,在一小时后,它的速度突然变成了2,速度的变化率是100%100\%。可能不少同学会觉得,经典物理世界中速度是连续的啊,怎么可以突变呢?假设嘛当然要大胆点啦,所以我们接下来更加大胆:假设飞船每半个小时加一次能够突变速度的燃料,加速到一半时,之前的速度再次突变,每半个小时的数率变化都是之前的50%,那么一个小时中,飞船的速度变化为(1+100%2)2=2.25(1+\frac{100\%}{2})^2=2.25,第一个三十分钟,速度的变化率是50%50\%,第二个三十分钟,速度的变化率也是50%50\%。一个三十分钟,又可以拆成三个十分钟,一个十分钟又可以拆成十个一分钟…

直到最后,一小时成了无限个连续(nlim)(n\to\lim)的小时间块,假设这些小时间块远远小于一个刹那,那么我们可以近似认为,这一个小时是连续的。让这些小时间块继承速率变化,那么每一块时间块能继承的数率为:1n\frac{1}{n},(加起来或者说积分起来是1哦)。于是,在给定的单位时间内,飞船的速度变化的极限应该是:

1×(1+1n)n(nlim)=e1\times(1+\frac{1}{n})^n(n\to \lim)=e

有些难理解,简单来说,如果有个细胞在单位时间是翻倍变化的,如果过程是离散的,那时刻1和时刻2对应的数量应当发生裂变。可如果过程是连续的,那么当时刻1.5时,此时已经有1.5时刻发生裂变的产生的新细胞和原始细胞了,原始细胞的进度是50%50\%,在下一个0.5时刻,这原始细胞和新细胞都要发生分裂。当这个时间足够小,分裂的极限就是e

也就是说,e是连续的代言人,是增长的极限。

以上,是乘法上的e,也是其中非常重要的意义之一。

三、ee的泰勒展开式

如果我们将ee通过泰勒展开,可以得到如下的无穷级数:

e=1+11!+12!+13!+14!++1n!e=1+\frac{1}{1!}+\frac{1}{2!}+\frac{1}{3!}+\frac{1}{4!}+\cdots+\frac{1}{n!}

同样可以这样理解:初始细胞量最终应该分裂出等量的细胞,所以是1+11!1+\frac{1}{1!},而半途中分裂出的新细胞,又可以继续分裂12!\frac{1}{2!},直到无穷。

当这个ee作为底数,引入变量xx后的泰勒展开为:

ex=1+x1!+x22!+x33!+x44!++xnn!e^x=1+\frac{x}{1!}+\frac{x^2}{2!}+\frac{x^3}{3!}+\frac{x^4}{4!}+\cdots+\frac{x^n}{n!}

欧拉发现,这个级数的展开怎么跟下面俩玩意长得差不多呢?

cos(x)=1x22!+x44!x66!+x88!+sin(x)=x1!x33!+x55!x77!+cos(x)=1-\frac{x^2}{2!}+\frac{x^4}{4!}-\frac{x^6}{6!}+\frac{x^8}{8!}+\cdots \\ sin(x)=\frac{x}{1!}-\frac{x^3}{3!}+\frac{x^5}{5!}-\frac{x^7}{7!}+\cdots

这俩系数一个是02468...一个是13579...(我乱说的),加起来是不是就完整啦!

cos(x)+sin(x)=1+x1!x22!x33!+x44!+x55!++xnn!cos(x)+sin(x)=1+\frac{x}{1!}-\frac{x^2}{2!}-\frac{x^3}{3!}+\frac{x^4}{4!}+\frac{x^{5}}{5!}+\cdots+\frac{x^n}{n!}

woc这不就是换了符号的exe^x?如何让两者之间产生联系??观察可以发现,每当x2x^2的时候,都会更换符号!x2=1!x^2=-1! 这不就是虚数!

四、虚数

你问什么是虚数?

看,这是一个数轴:

image-20221108021409830

x=1x=1是数轴上的一个点:

image-20221108021519422

我们把他旋转180°,就成了x=1x=-1

image-20221108021848763

那如果是旋转90°呢?这个点会跑到哪里去?

image-20221108022023142

诶诶诶,这不对啊,这里根本没有轴啊!这里是空的啊!

是的,没错,这里是空的,是虚假的。要不然怎么称虚数是数学史上最大胆的想象呢~数学家们凭空在这里填上了一个维度,要问这个维度的意义嘛,那就是 i2=1i^2=-1

image-20221108022552547

这样一个二维坐标系,以ImageReal为坐标轴,我们将其称为复平面

复平面中的点可以表示为:

(a,b)=a+bi(a,b)=a+bi

等号右边的也叫做复数(Complex number)。

五、欧拉公式

我们让实数变量x作为虚数ix,那么就可以得到:

eix=1+ix1!x22!ix33!+x44!++xnn!=cos(x)+isin(x)e^{ix}=1+\frac{ix}{1!}-\frac{x^2}{2!}-\frac{ix^3}{3!}+\frac{x^4}{4!}+\cdots+\frac{x^n}{n!}\\ =cos(x)+i\cdot sin(x)

于是最终的欧拉公式写作:

eix=cos(x)+isin(x)e^{ix}=cos(x)+i\cdot sin(x)

这个公式将三角函数与复指数函数联系了起来,当变量xx取值为π\pi时,我们可以化简为:

eiπ=1+0e^{i\pi}=-1+0

也就是我们一开始看到的:

eiπ+1=0e^{i\pi}+1=0

自然常数ee,抽象虚数ii,圆周率π\pi0011,就这样被巧妙的联系在了一起。

image-20221107230650720

六、几何意义

如果x是随时间线性变化的参数,那么,可以得到如下三维坐标轴上的螺旋线,这个螺旋线在复平面上的投影是一个圆,投影点在圆上做匀速圆周运动。

image-20221108024706668

ei1e^{i 1}表示在复平面上覆盖了一个单位角的所有点,这是由公式

e=lim(1+in)ne=\lim (1+\frac{i}{n})^n

取值得到的。

由此,我们可以推出一个指数虚数的含义,例如3i3^i,可以转换为:eiln3e^{iln3}即在复平面圆周上运动ln3ln3弧度。

好了,为什么要用这么多笔墨描述欧拉公式呢?欧拉公式跟傅里叶变换有什么关系吗?下面我们就一起来解开傅里叶变换的神秘面纱。


三、傅里叶级数

一、引子

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

下载

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

可见光的波段在0.38-0.76微米,他们可以看做一系列的正弦波(Sine wave),那是不是存在这样一种法则,构成了光谱信号的表征量?(对人来说就是颜色啦)

=(anSin(nx))白=\sum (a_nSin(nx))

后来呢,随着科学的发展,光被归到了电磁波里,兼具粒子性和波动性。德布罗意认为,一切物质都是波,都具有波动性。

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

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

比如这个:

image-20221108181601772

比如这个:

image-20221108181641481

都阔以分解成正弦函数。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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(n):
y+=np.sin((2*i+1)*x)/(2*i+1)
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()
image-20221108182502297
1
2
3
4
5
6
7
8
9
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
image-20221108182533443

哦这实在是太酷了不是吗,随着正弦波数量的增加,整个信号量变得越来越平滑,最后几乎与周期矩形和周期锯齿一般无二了!

这个过程同样可以跟光波分解写成一样的表达式:

f(x)=(anSin(nx))f(x)=\sum(a_nSin(nx))

这根傅里叶最初的想法相吻合!

二、傅里叶级数的通式

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

那我们进一步的分析,怎样的正弦波,才能表征一个任意波动呢?为了简化条件,我们先考虑周期性的波动,假设f(x)f(x)是一个周期为TT的函数,它可以看做许多正弦波的组合,那么最开始的时候,这个公式长这样:

f(x)=(anSin(2πnTx))f(x)=\sum(a_nSin(\frac{2\pi n}{T}x))

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

按照惯例,我们加入一个常数项。因为常数项也一定满足周期性,所以这里是合理的,那么公式就变成了:

f(x)=C+(anSin(2πnTx))f(x)=C+\sum(a_nSin(\frac{2\pi n}{T}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))

好了,上面的公式就是我们的傅里叶级数。当然,他还不够完整,我们发现,系数C,an,bnC, a_n, b_n依旧是未知的。

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

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

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

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

连续空间上的内积

我们知道,一个向量vˉ\bar vRnR^n空间上的膜可写作:

v2=v12+v22+...+vn2||v||^2=v_1^2+v_2^2+...+v_n^2

两个向量x,yRnx,y\in R^n的内积(点积)可以写作:

<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>=xycosθ<x,y>=|x||y|cos\theta

其几何意义表示为前一个向量在后一个向量上的投影(此时位置可以互换)。

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

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

于是,在一个无限维的函数空间中,f(x)f(x)函数的内积可以视作:

f2=02πf(x)2dx=02π(sinx)2dx=02π1cos2x2dx=12(02π1dx02πcos2x(12d2x))=π00+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(x)f(x)g(x)g(x)RR^\infin上的内积可以记作:

<f(x),g(x)>=f(x)g(x) dx<f(x),g(x)>=\int f(x)g(x)\ dx

f(x)=sinxf(x)=sinx,g(x)=cosxg(x)=cosx为例,在[0,2π][0,2\pi]范围内,二者的内积可写作:

<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

由于二者具有相同的周期性,所以最终coscossinsin[,][-\infin,\infin]上的内积为00,换句话说,二者正交。(二者的交接处是更低维度)

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

向量内积对于正交基有如下定义,假设wˉ=axˉ+byˉ\bar w=a\bar x+b\bar y,且xˉ,yˉ\bar x,\bar y正交,则有:

a=wˉxˉx2b=wˉyˉy2a=\frac{\bar w\cdot \bar x}{||x||^2}\\ b=\frac{\bar w\cdot \bar y}{||y||^2}

这个公式的几何意义为:

线性组合wˉ\bar w在分量(轴)上的投影长度。由于xˉ,yˉ\bar x,\bar y正交,所以当向量投影在一个正交基上时,在另一个正交基上的投影为0,此时向量的信息量都由被投影的正交基所贡献,这也就是前面的系数。

在希尔伯特空间下,系数记作:

a=f(x)g(x) dxg(x)2 dxa=\frac{\int f(x)g(x)\ dx}{\int g(x)^2\ dx}

三、傅里叶级数的系数

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

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

傅里叶级数的展开可以写作:

f(x)=a0+a1cosx+b1sinx+a2cos2x+b2sin2x+...f(x)=a_0+a_1cosx+b_1sinx+a_2cos2x+b_2sin2x+...

我们假设β\betaf(x)f(x) 的一组基向量:

β={12,cosx,sinx,cos2x,sin2x...}\beta=\{\frac{1}{\sqrt2},cosx,sinx,cos2x,sin2x...\}

假设m,nm,n为非负整数,且mnm\ne 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πππ(12)2 dx=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

于是我们发现,β\beta中所有的函数长度都等于1,任意两个相异函数彼此正交。

我们想计算通项ana_n的系数,就可以通过正交基的性质进行求解:

an=<cos(2πnxT),f(x)>cos(2πnxT)2=0Tf(x)cos(2πnxT) dx0Tcos2(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}

其中:

0Tcos2(2πnxT) dx=0T(1+cos(4πnxT)2) dx=12(0Tdx+0Tcos(4πnxT)2d2x)=12(x0T+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}

所以最后系数ana_n表达为:

an=2T0Tf(x)cos(2πnxT) dxa_n=\frac{2}{T}\int_0^Tf(x)cos(\frac{2\pi nx}{T})\ dx

同理,系数bnb_n可以表达为:

bn=2T0Tf(x)sin(2πnxT) dxb_n=\frac{2}{T}\int_0^Tf(x)sin(\frac{2\pi nx}{T})\ dx

我们令f(x)f(x)的首项为a0/2a_0/2,使得ana_n计算公式同时适用n=0n=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))

其中:

an=2T0Tf(x)cos(2πnxT) dxbn=2T0Tf(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

四、傅里叶级数的例子

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

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

首先定义一个周期等于2π2\pi的方波:

f(x)={1,  if π<x<0,1,   if  0<x<π,f(x)= \begin{cases} -1,\ \ if\ -\pi<x<0,\\ 1,\ \ \ if\ \ 0<x<\pi, \end{cases}

由于在x=0x=0处,f(x)f(x)并未给出定义,所以我们不知道f(0)f(0)是否可用于计算傅里叶级数。

现在将f(x)f(x)投影到各个基向量上,首先是sinsin

bn=2T(π01sin(2πnxT)dx+0π1sin(2πnxT)dx)=22π((π0sin(nx)(1nd(nx))+(0πsin(nx)(1nd(nx))=1nπ(cos(nx)π0cos(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})

n&1==1n\&1==1时,有:bn=4nπb_n=\frac{4}{n\pi},当n&1==0n\&1==0,则有bn=0b_n=0

同理,对于ana_n,有:a0=an=0a_0=a_n=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)=4π(sinx+sin(3x)3+sin(5x)5...)f(x)=\frac{4}{\pi}(sinx+\frac{sin(3x)}{3}+\frac{sin(5x)}{5}...)


五、傅里叶级数的意义

数学意义

从数学角度上讲,在线性代数中我们知道,一个向量空间上的所有向量都可以由该空间的基向量线性表出,傅里叶级数同样如此。在希尔伯特空间上,傅里叶级数无穷个三角函数正交基能够线性表出整个希尔伯特空间上的函数值。

此外,由于连续空间上内积和系数的定义,傅里叶级数可以看做是将函数f(x)f(x)投影到这组正交基上,并有这组正交基线性表出。

通过这种正交投影的方式,一个周期性的信号就能够被拆解成无限个正弦波的线性组合。

物理意义

上文的小实验揭示了傅里叶级数的物理意义,一个周期函数可以拆解成许多正弦波,许多正弦波可以线性表出一个周期函数。


四、傅里叶变换


五、离散傅里叶变换


六、快速傅里叶变换


七、傅里叶逆变换


八、二维傅里叶变换


九、总结


八、参考文献

[1] https://www.zhihu.com/question/284620618/answer/523818835

[2] https://www.zhihu.com/question/23074201/answer/23524103

[3] https://www.bilibili.com/video/BV1Es411P7tr/?spm_id_from=333.788.recommend_more_video.0&vd_source=b6ddb37b0dc1af8da34b699b1daf8a16

[4] https://zhuanlan.zhihu.com/p/19759362

[5] https://zhuanlan.zhihu.com/p/151226805

[6] https://ccjou.wordpress.com/2012/04/03/傅立葉級數-下/

[7] https://ccjou.wordpress.com/2012/03/30/傅立葉級數-上/

[8] https://www.matongxue.com/madocs/619