欢迎关注公众号:sumsmile /专注图形学、Android开发
一、前言
傅里叶变换是科学、数学、通信领域最重要的算法之一。Joseph Fourier 在19世界发明傅里叶变换,最开始用于热传导分析,后来在各个领域得到广泛应用。
这篇文章谈谈我对傅里叶变换的理解和学习方法,既有理论基础,也讲代码实践。
- 前置知识要求:无(零基础也能看懂)
- 读完你能收获什么:
- 理解傅里叶变换原理
- 用python处理简单的一维、二维信号(图像滤波)
限于篇幅,不会详细展开每个公式,对于疑惑的地方,建议读者先记录下来,不要打断本篇文章的学习,之后再逐个查阅资料
二、傅里叶变换基础
傅里叶变换的深入理解,可以参考文末列举的学习资料。此处简单说明相关概念。
开始接触可能会比较抽象,不用着急,毕竟我们不是做基础科研,能理解基础概念,能合理的运用以实现功能即可。
傅里叶级数
傅里叶理论讲的是:任何信号可以由一组正余弦函数表达。其中,每个函数有相位、频率、幅值属性。(相比相位,更多的关注幅值)
比如信号signal_1,只有一个频率为5,即每秒经过5个周期
signal_1 = sin(2π * 5 * t)
时间域的图像为:
在频域空间,则只有一个频率5
比如信号signal_2,由三个正弦函数组成,
- 频率为5,幅值为1:sin(2π * 5 * t)
- 频率为7,幅值为1:3*sin(2π * 7 * t)
- 频率为14,幅值为6:6*sin(2π * 14 * t)
s
i
g
n
a
l
2
=
s
i
n
(
2
π
∗
5
∗
t
)
+
3
∗
s
i
n
(
2
π
∗
7
∗
t
)
+
6
∗
s
i
n
(
2
π
∗
14
∗
t
)
signal_2 = sin(2π*5*t) + 3*sin(2π*7*t) + 6*sin(2π*14*t)
signal2=sin(2π∗5∗t)+3∗sin(2π∗7∗t)+6∗sin(2π∗14∗t)
在频域对应有三个点
由此,可以提炼出傅里叶级数公式,一个周期函数,可以由多个正余弦函数组合而成,每个子函数有不同的周期、幅值:
通过欧拉公式写成复数形式:
此处 C k C_k Ck为复数,如果你对欧拉公式、复数的概念比较模糊,建议此处你停下来,上网搜下欧拉公式的解释
推导过程参考:
https://www.cnblogs.com/TaigaCon/p/4917553.html
傅里叶变换
到此,我们只是知道一个函数可以用多个三角函数组合,但是我们并不知道这些三角函数是什么,它们的频率、幅度是多少呢?
傅里叶变换,即求每个分量的系数:
可以这么理解这个,将 e 2 π i s t e^{2πist} e2πist 看成一个基向量
( e 2 π i s ∗ 1 、 e 2 π i s ∗ 2 、、 e 2 π i s ∗ 3 . . . e^{2πis * 1}、e^{2πis * 2}、、e^{2πis * 3}... e2πis∗1、e2πis∗2、、e2πis∗3...),f(t)也看成向量(f(1)、f(2)、f(3)…),则上面那个积分可以看成两个向量的点积,即求f向量在该基向量上的投影
傅里叶逆变换,即根据分量求出原信号函数:
建议有时间,参考我文末给的必读项参考资料,里面有严谨的数学推导。
三、离散傅里叶变换
从连续很自然过渡到离散的傅里叶变换:
F f [ m ] \mathcal{F}f[m] Ff[m]即三角函数的系数,连续傅里叶变换里用 C k C_k Ck表示
观察上面的公式,其实就是将连续的函数f(x)积分,替换到离散的点积。
离散傅里叶逆变换,即求原离散信号:
推导过程参考:
https://www.cnblogs.com/TaigaCon/p/4992463.html
四、快速傅里叶变换(fft)
快速傅里叶变换并没有改变傅里叶变换的原理,只是在计算形式上,做了算法优化。
要完整讲清楚快速傅里叶变换,要花点时间,而且理解起来也有点费劲。对初次接触的同学,知道有这种算法即可,python里对fft有非常好的实现,用的时候知道如何调用即可。
# python fft
scipy.fftpack.fft(signal)
# python ifft
scipy.fftpack.ifft(Ck)
原理是将积分写成矩阵乘法,利用矩阵的周期性、对称性,将原矩阵乘法简化
推导过程可以参考:
https://www.cnblogs.com/TaigaCon/p/5111679.html
五、参考资料
我参考的学习资料 or 课程
https://zhuanlan.zhihu.com/p/19763358
几乎没有公式符号,小白扫盲贴
https://space.bilibili.com/230105574/channel/seriesdetail?sid=1569597
纯数学公式推导,逻辑清晰,帮你建立严谨的认知
https://www.bilibili.com/video/BV1Qx411J7ER/?vd_source=7f6a092b306354c9eef8f3cd5bd5307d
全球经典课程,全程手写板书、幽默热情。有时间的话可以学一遍,比国内老师讲的好太多了。
https://www.cnblogs.com/TaigaCon/category/1189650.html?page=1
https://www.bilibili.com/video/BV12b411W7DN?p=1&vd_source=7f6a092b306354c9eef8f3cd5bd5307d
上面的公开课里需要点微分方程知识,作为简单的复习
https://www.bilibili.com/video/BV1X8411a74G/?vd_source=7f6a092b306354c9eef8f3cd5bd5307d
通过python代码演示,深入浅出讲傅里叶变换的原理及应用,非常棒的课程
下一篇讲代码实践
欢迎关注公众号:sumsmile /专注图形学、Android开发