数据分析中用到傅里叶变换,只好把大学里学的云山雾绕的课本拿出来重修了一遍。傅里叶级数还好理解,傅里叶变换就有点摸不着头脑了。特别是里面的虚数部分,到底是什么意思?它到底是怎么跑出来的。为什么一个好好的实函数就变成虚函数了?还能不能一起玩耍了?
钻进了牛角尖,不搞清这个问题吃饭都不香了。网上傅里叶级数的资料很多,又是群理论,又是希尔伯特空间的,搞得俺这个工科生更是头大。忽然灵机一动,找到了原因所在(自认为),写出来与诸君共享,理解不对的地方大神指正。
一、傅里叶级数
这是比较好理解的,就是一个周期函数,可以分解成很多个简谐函数的叠加,其中有余弦分量和正弦分量,代表着简谐函数的相位。
这是傅里叶变换的公式:
f
(
x
)
=
a
0
+
∑
k
=
1
∞
[
a
k
cos
(
k
x
)
+
b
k
sin
(
k
x
)
]
f(x) = a_{0} + \sum_{k=1}^\infty \Bigl[ a_{k} \cos(kx) + b_{k}\sin(kx)\Bigr]
f(x)=a0+k=1∑∞[akcos(kx)+bksin(kx)]
然后用欧拉公式:
e
i
t
=
cos
(
t
)
+
i
sin
(
t
)
e^{it} = \cos(t) +i\sin(t)
eit=cos(t)+isin(t)
e
−
i
t
=
cos
(
t
)
−
i
sin
(
t
)
e^{-it} = \cos(t) -i\sin(t)
e−it=cos(t)−isin(t)
则:
cos
(
t
)
=
e
i
t
+
e
−
i
t
2
\cos(t) = \frac{e^{it}+e^{-it}}{2}
cos(t)=2eit+e−it
sin
(
t
)
=
e
i
t
−
e
−
i
t
2
i
\sin(t) = \frac{e^{it}-e^{-it}}{2i}
sin(t)=2ieit−e−it
代入得:
f
(
x
)
=
a
0
+
∑
k
=
1
∞
[
a
k
e
i
k
x
+
e
−
i
k
x
2
+
b
k
e
i
k
x
−
e
−
i
k
x
2
i
]
f(x) = a_{0} + \sum_{k=1}^\infty \Bigl[ a_{k} \frac{e^{ikx}+e^{-ikx}}{2} + b_{k} \frac{e^{ikx}-e^{-ikx}}{2i}\Bigr]
f(x)=a0+k=1∑∞[ak2eikx+e−ikx+bk2ieikx−e−ikx]
化简,注意
1
i
=
−
i
\frac{1}{i} = -i
i1=−i ,得:
f
(
x
)
=
a
0
+
∑
k
=
1
∞
[
a
k
−
i
b
k
2
e
i
k
x
+
a
k
+
i
b
k
2
e
−
i
k
x
]
f(x) = a_{0} + \sum_{k=1}^\infty \Bigl[ \frac{a_{k}-ib_{k}}{2} e^{ikx} +\frac{a_{k}+ib_{k}}{2}e^{-ikx}\Bigr]
f(x)=a0+k=1∑∞[2ak−ibkeikx+2ak+ibke−ikx]
关键的地方来了。1到
∞
\infty
∞的-k是等于
−
∞
-\infty
−∞到-1的k的。注意上式中累加部分的第二部分可以改写为:
f
(
x
)
=
a
0
+
∑
k
=
1
∞
a
k
−
i
b
k
2
e
i
k
x
+
∑
k
=
−
∞
−
1
a
k
+
i
b
k
2
e
i
k
x
f(x) = a0 + \sum_{k=1}^\infty \frac{a_{k}-ib_{k}}{2}e^{ikx} + \sum_{k=-\infty}^{-1} \frac{a_{k}+ib_{k}}{2}e^{ikx}
f(x)=a0+k=1∑∞2ak−ibkeikx+k=−∞∑−12ak+ibkeikx
设一个分段序列
c
n
c{n}
cn:
c
k
=
{
a
k
+
i
b
k
2
−
∞
<
k
<
=
−
1
,
a
0
k
=
0
,
a
k
−
i
b
k
2
1
<
=
k
<
∞
(1)
c_{k}=\left\{ \begin{aligned} &\frac{a_{k}+ib_{k}}{2}\qquad& \text{$-\infty<k<=-1,$ } \\ &a{0}\qquad &\text{$k=0,$ } \\ &\frac{a_{k}-ib_{k}}{2}\qquad&\text{$1<=k<\infty$ } \end{aligned} \right. \tag{1}
ck=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧2ak+ibka02ak−ibk−∞<k<=−1, k=0, 1<=k<∞ (1)
则:
f
(
x
)
=
∑
k
=
−
∞
∞
c
k
e
i
k
x
f(x) = \sum_{k=-\infty}^{\infty}c_{k}e^{ikx}
f(x)=k=−∞∑∞ckeikx
就这样一个好好的实函数被转换成了复函数。这个证明的过程并不规范,但意思是大概齐的。那么,从这个证明过程中我们能获得哪些信息呢?
- c k c_{k} ck是复数,这也是为什么fft的结果是复数。
- c k c_{k} ck以y轴为对称点,两侧的实部是相同的,虚部是相反的,即相互共轭。这带来的结果有两点,1)当画出 c k c_{k} ck的振幅图的时候,图像是对称的,但实际上它并不是偶函数。2)可以证明 c k e i k x c_{k}e^{ikx} ckeikx和 c − k e i ( − k ) x c_{-k}e^{i(-k)x} c−kei(−k)x也是共轭的,所以两者相加的时候,实部乘2,虚部抵消,所以傅里叶变换和其逆变换的结果仍然是实函数。
- 由于 c k c_{k} ck和 c − k c_{-k} c−k是共轭的,所以只看半边的 c k c_{k} ck就可以获得所有的信息,包括频率的振幅和相位信息。
二、傅里叶变换
傅里叶变换是在傅里叶级数上的拓展。我们在讨论傅里叶级数的时候有一个前提,就是
f
(
x
)
f(x)
f(x)是在
(
−
π
,
π
)
(-\pi,\pi)
(−π,π)上的周期函数。把周期的边界扩展为
(
−
∞
,
∞
)
(-\infty,\infty)
(−∞,∞),同时把k由自然数扩展到整个实数坐标轴上,傅里叶级数就变成了傅里叶变换。
f
(
x
)
=
1
2
π
∫
−
∞
∞
f
^
(
λ
)
e
i
λ
x
d
λ
f(x) = \frac{1}{\sqrt{2\pi}}\int_{-\infty}^{\infty}\hat{f}(\lambda)e^{i\lambda x}d\lambda
f(x)=2π1∫−∞∞f^(λ)eiλxdλ
傅里叶变换和傅里叶级数非常相似,很多性质也是近似的,也可以用类似的方法予以证明。比方说,在
λ
\lambda
λ和
−
λ
-\lambda
−λ两个点上,
f
^
(
λ
)
\hat{f}(\lambda)
f^(λ)和
f
^
(
−
λ
)
\hat{f}(-\lambda)
f^(−λ)也是共轭的,也有着和傅里叶级数一样的性质。
所以
f
^
(
λ
)
\hat{f}(\lambda)
f^(λ)虽然是一个复函数,但如果把y轴两侧对应起来,即把
(
−
∞
,
0
)
(-\infty,0)
(−∞,0)折到
(
0
,
∞
)
(0,\infty)
(0,∞)上,仍然可以获得一个实函数。
本身,我们知道,
λ
\lambda
λ对应的物理意义是频率,而负频率是没有意义的。因此对应到一个函数的频谱强度,这应该还是一个实函数,只是用复函数的形式来表达了。
这样做的意义在于
e
i
t
e^{it}
eit这个函数有许多有用的计算性质,可以极大地简化许多推导过程。
三、总结
好了,说了这么多,其实就是回答了这样一个问题:为什么fft()的结果是复数?
我会说我写这些是为了学习LaTex语言吗?