一、前言
傅里叶变换是科学、数学、通信领域最重要的算法之一。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)
在频域对应有三个点
由此,可以提炼出傅里叶级数公式,一个周期函数,可以由多个正余弦函数组合而成,每个子函数有不同的周期、幅值:
通过欧拉公式写成复数形式:
此处为复数,如果你对欧拉公式、复数的概念比较模糊,建议此处你停下来,上网搜下欧拉公式的解释
推导过程参考:
傅里叶变换
到此,我们只是知道一个函数可以用多个三角函数组合,但是我们并不知道这些三角函数是什么,它们的频率、幅度是多少呢?
傅里叶变换,即求每个分量的系数:
可以这么理解这个,将 看成一个基向量
(),f(t)也看成向量(f(1)、f(2)、f(3)…),则上面那个积分可以看成两个向量的点积,即求f向量在该基向量上的投影
傅里叶逆变换,即根据分量求出原信号函数:
建议有时间,参考我文末给的必读项参考资料,里面有严谨的数学推导。
三、离散傅里叶变换
从连续很自然过渡到离散的傅里叶变换:
即三角函数的系数,连续傅里叶变换里用表示
观察上面的公式,其实就是将连续的函数f(x)积分,替换到离散的点积。
离散傅里叶逆变换,即求原离散信号:
推导过程参考:
四、快速傅里叶变换(fft)
快速傅里叶变换并没有改变傅里叶变换的原理,只是在计算形式上,做了算法优化。
要完整讲清楚快速傅里叶变换,要花点时间,而且理解起来也有点费劲。对初次接触的同学,知道有这种算法即可,python里对fft有非常好的实现,用的时候知道如何调用即可。
# python fft
scipy.fftpack.fft(signal)
# python ifft
scipy.fftpack.ifft(Ck)
原理是将积分写成矩阵乘法,利用矩阵的周期性、对称性,将原矩阵乘法简化