两年做过fft海面,当时精力放在代码实现上了,并没有细想背后原理。这些天回顾了一下,把之前得过且过的地方想明白了,当然,仍有盲区,但整个逻辑链条是清晰的了。本系列将完整梳理一下。
当初调试时的视频:
00:15
00:13
本篇先讲基础理论和模型。
一,频谱,傅里叶变换与逆变换
自变数为x的函数f(x)可看作一个随空间变化的信号(空域信号),只要满足一定条件,它就可以表示为一堆不同频率的随空间变化的正弦信号(空域正弦信号)的线性组合(或积分)。
注:是求和还是积分,取决于信号是否具有周期性。
这些正弦信号(称为基底)的频率构成频域。如果将频域作为定义域,相应频率基底的振幅和相位作为函数值,则得到一个新函数F(ω)。称为信号f(x)的频谱。
注:频域(Frequency Domain),空域(Space Domain),时域(Time Domain)。其中空域和时域在数学上是一个意思,不同仅在于自变数用x还是t。对于本文应用场景而言,用空域说法更恰当。
知道了频谱F(ω)也就知道了f(x),反之亦然,二者是等价的,是同一个信号的两种不同表示方法。
由f(x)求频谱F(ω),称为傅里叶变换。
由频谱F(ω)求f(x),称为傅里叶逆变换。
实际傅里叶变换/逆变换不是以正弦信号为基底,而是以复指数信号 为基底,频谱也相应地变成了复数。
二,从三角形式到复数形式
本节对文章目标意义不大,可略过,我只是因为看到傅里叶变换带复数比较懵逼,所以尝试捋了一下。
信号分解为基信号的线性组合(即傅里叶逆变换)有无数种方法,取决于基底形式的选择。不同基底形式导致不同的频谱形式。
(一)以带相位正弦信号作为基底:
此时频谱需要给出振幅和相位,形式为 。
(二)以不带相位余弦和正弦信号联合作为基底:
使用三角恒等式 对(一)作变形,得:
注:可以看出, 取任意有限值都不影响结果。
此时频谱需要给出两个振幅A1和A2,形式为 。
(三)以复指数信号作为基底:
使用欧拉恒等式 对(二)作变形,得:
上式还可以化简:
考虑到 ,也就是说频率只使用了正半轴,函数 和 也仅在正半轴上有定义,负半轴成了三不管地带我们可以为所欲为随便定义,所谓延拓。
我们将 延拓成偶函数,将 延拓成奇函数。
注意:奇函数必过原点,所以 需满足 ,因为前面已经说了「 取任意有限值都不影响结果」,所以这是能做到的。
延拓之后,有:
(由于 )
(定义新函数 )
(令 )
化简完成。
需要注意,与前面两种形式不同,此时 的取值范围(即频域)已经拓展到负半轴。
此时的频谱只需给出B(ω),故频谱形式为F(ω)=B(ω)。
也就是说此时B(ω)恰好就是频谱。那不如干脆写成:
此即复数形式的傅里叶逆变换,是不是很简洁。