大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
这是一篇辅助理解傅里叶变换的博客,下文中如果有不适合或错误的表达,请大家在评论区给我留言,我一定积极修改。
一、傅里叶级数
下图所示的方波的组成在傅里叶级数介绍中随处可见,那么我们就先看一下方波的形成,每一个向量以固定的整数频率旋转,当计算从投到尾向量和时就能画出方波图形,通过调整初始向量的大小与角度,我们就可以画出任意图形。
其中含有初始大小与角度的复傅里叶级数通式表示为: C n = ∫ 0 1 e − 2 π i n t f ( t ) d t \ C_n = \int_{0} ^{1} {e^{-2\pi int} f(t) dt} \, Cn=∫01e−2πintf(t)dt。
那傅里叶级数是如何引出的呢?我们都知道傅里叶级数是傅里叶在求热传导和弦振动时得到,他把任何初始状态的热分布看作是一系列三角函数线性的叠加
f ( t ) = a 0 + ∑ n = 1 ∞ a 1 c o s ( n w t ) + b 1 s i n ( n w t ) \ f(t) = a_0+ \sum_{n=1}^\infty {a_1cos(nwt)+b_1sin(nwt)} \, f(t)=a0+n=1∑∞a1cos(nwt)+b1sin(nwt)
其中的傅里叶级数 a n = 2 T ∫ n = 1 + ∞ f ( t ) c o s ( n w t ) d t \ a_n = \frac{2}{T} \int_{n=1 }^{ + \infty } {f(t)cos(nwt)dt} \, an=T2∫n=1+∞f(t)cos(nwt)dt , b n = 2 T ∫ n = 1 + ∞ f ( t ) c o s ( n w t ) d t \ b_n = \frac{2}{T}\int_{n=1 }^{ + \infty } {f(t)cos(nwt)dt} \, bn=T2∫n=1+∞f(t)cos(nwt)dt。
那傅里叶级数与复傅里叶级数关系 C n = a n 2 + i b n 2 \ C_n = \frac{a_n}{2} + i\frac{b_n}{2} \, Cn=2an+i2bn。
复平面是为了引入旋转所定义的平面,复指数(傅里叶级数的精髓) e i t e^{it} eit 则表示每秒一个单位的绕单位圆旋转,正弦函数通过与朝向相反的旋转向量(复指数)建立关系 s i n ( t ) = e i t + e − i t 2 i \ sin(t) = \frac {e^{it} + e^{-it}}{2i} \, sin(t)=2ieit+e−it;复指数 e i 2 π t e^{i2\pi t} ei2πt则表示一秒钟所经过一次圆路程的向量, e i n 2 π t e^{in2\pi t} ein2πt表示所经过了n次圆路程的向量, C n e i n 2 π t C_ne^{in2\pi t} Cnein2πt表示每个复数的长度与方向。
经上,原函数本身可表示为: f ( t ) = ∑ n = − ∞ + ∞ C n e i 2 π t \ f(t) = \sum_{ n= -\infty}^{ + \infty } {C_n e^{i2\pi t}} \, f(t)=∑n=−∞+∞Cnei2πt,其中 C 1 = ∫ 0 1 f ( t ) d t \ C_1 = \int_{0} ^{1} { f(t) dt} \, C1=∫01f(t)dt,当对 ∫ 0 1 C n e i n 2 π t d t \int_{0} ^{1} C_ne^{in2\pi t}dt ∫01Cnein2πtdt进行计算时,n次圆路程的向量和为0,故只剩下没有旋转的常数 C n C_n Cn;那计算其他的复傅里叶级数加上若干个圆旋转向量 C n = ∫ 0 1 C n e i n 2 π t e − i n 2 π t d t C_n = \int_{0} ^{1} { C_ne^{in2\pi t} e^{-in2\pi t}dt} \, Cn=∫01Cnein2πte−in2πtdt,使 C n C_n Cn没有旋转求得;
上述三角函数还可以这样表达 f ( t ) = C 0 + ∑ n = 1 + ∞ C n s i n ( n w t + ψ n ) \ f(t) = C_0 + \sum_{ n=1 }^{ + \infty } {C_nsin(nwt+\psi_n)} \, f(t)=C0+∑n=1+∞Cnsin(nwt+ψn),那么影响函数样式的参数都列在上式中: C n C_n Cn表示振幅、 w w w表示角频率、 ψ n \psi_n ψn表示当前角频率的初始相位。这里韩同学给出一个形象的表达(频率,振幅、相位三维正交),你是否理解更加深刻了呢!
二、傅里叶变换
我们从傅里叶级数(周期函数)入手,一个信号能够分开成离散的无限多的正弦波;那傅里叶变换(不必周期)是乘以一个频率从负无穷到正无穷连续的复指数,转换为一个在频域的连续信号。
我们在回过头来看一下傅里叶变换的公式 F ( w ) = ∫ − ∞ + ∞ f ( t ) e − i n w t d t \ F(w) =\int_{ – \infty }^{ + \infty } {f(t)e^{-inwt}dt} \, F(w)=∫−∞+∞f(t)e−inwtdt,其中 e − i w t \ {e^{-iwt}} \, e−iwt表示缠绕着圆顺时针旋转一圈的向量,时间 t 表示旋转的时间,频率 n w \ {nw} \, nw表示旋转的快慢,求和取平均表示着旋转过程中所有向量的和的平均;当旋转的快慢依次给予时,原函数围绕圆旋转的样子也不一样,当原函数中含有此时旋转的频率时,缠绕的波形就会呈现峰与谷分离的现象,是比较容易求得,这也是三角函数正交特性(乘上一个函数中存在频率的共轭复指数,使得旋转为0),此时图形质心(所有向量的和的平均)就是这个频率的振幅。B站大神up关于FT变换的解释。
正交定义: < f , g > = ∫ − ∞ + ∞ f × g ^ \ <f,g> =\int_{ – \infty }^{ + \infty } {f} \times {\hat g} \, <f,g>=∫−∞+∞f×g^,
F ( n ) = < f ( t ) , e i n w t > = ∫ n = 1 ∞ f ( t ) e − i n w t d t \ F(n) = <f(t),e^{inwt}>= \int_{n=1}^\infty {f(t)e^{-inwt}}dt \, F(n)=<f(t),einwt>=∫n=1∞f(t)e−inwtdt
在这种内积的定义下是一族正交基,更深刻的数学知识可以证明,在一定条件下,它不仅是正交的,还是完备的,也就是说,只要满足一定的条件,任何函数都可以用 e − i n w t \ {e^{-inwt}} \, e−inwt叠加出来。
原函数f(t)可由F(w)与基 e i w t e^{iwt} eiwt叠加而成(表述为傅里叶逆变换)
f ( t ) = ∑ n = − ∞ ∞ C n e i n w t = 1 T ∫ n = − ∞ ∞ F ( w ) e i n w t d n w \ f(t) = \sum_{n=-\infty}^\infty {C_ne^{inwt}}= \frac{1}{T}\int_{n=-\infty}^\infty {F(w)e^{inwt}}dnw f(t)=∑n=−∞∞Cneinwt=T1∫n=−∞∞F(w)einwtdnw。
三、离散化傅里叶变换DFT
傅里叶级数与傅里叶变换是处理连续的系统,但是我们的数字化设备中只能用离散化的数字信号来表示连续的模拟信号,这就要求采样连续的信号变成离散的信号(DTFT离散时间傅里叶变换)才能进行处理,但是频域的频率也是连续的,如何使得变换后的频率也能用离散表示呢。这里就要提到离散傅里叶变换DFT,使用周期性离散信号的傅里叶级数(将无限长的离散信号截断成N个采样点,然后将这N个采样点进行周期延拓)。
连续周期信号的傅里叶级数: C n = 1 T ∫ 0 T f ( t ) e − j 2 π T n t d t C_n = \frac1{T}\int_0^T f(t)e^{ -j\frac{2\pi}{T}nt}dt Cn=T1∫0Tf(t)e−jT2πntdt。
对连续信号 x ( t ) x(t) x(t)进行周期为 T s T_s Ts抽样 N N N次 δ ( t − n T s ) \delta(t-nT_s) δ(t−nTs),
则一个周期内表达式为 x s ( t ) = x ( t ) ∑ 0 N − 1 δ ( t − n T s ) x_s(t)=x(t)\sum_0^{N-1}\delta(t-nT_s) xs(t)=x(t)∑0N−1δ(t−nTs),可得离散周期信号的傅里叶级数为: C [ j k w ] = 1 T ∫ − T 2 T 2 x ( t ) ∑ n = 0 N − 1 δ ( t − n T s ) e − j 2 π T k t d t C[jkw]=\frac1T{\int_{-\frac T2}^{\frac T2}x(t)\sum_{n=0}^{N-1}\delta(t-nT_s)e^{-j{\frac{2\pi}T}kt}}dt C[jkw]=T1∫−2T2Tx(t)n=0∑N−1δ(t−nTs)e−jT2πktdt
调整一下顺序: C [ j k w ] = 1 T ∑ n = 0 N − 1 ∫ − T 2 T 2 x ( t ) δ ( t − n T s ) e − j 2 π T k t d t C[jkw]=\frac1T\sum_{n=0}^{N-1}{\int_{-\frac T2}^{\frac T2}x(t)\delta(t-nT_s)e^{-j{\frac{2\pi}T}kt}}dt C[jkw]=T1∑n=0N−1∫−2T2Tx(t)δ(t−nTs)e−jT2πktdt。
由于冲击函数的筛选性质,上式很容易离散化,显然, T = N T s T=NT_s T=NTs,即 t = n T S t=nT_S t=nTS,积分号内只有采样点 ∑ n = 0 N − 1 n T s \sum_{n=0}^{N-1}nT_s ∑n=0N−1nTs被保留下来,故
C [ j k w ] = 1 N T s ∑ n = 0 N − 1 x ( n T s ) e − j 2 π N T s k n T s = 1 N T s ∑ n = 0 N − 1 x [ n ] e − j 2 π N T s k n C[jkw]=\frac1{NT_s}\sum_{n=0}^{N-1}{x(nT_s)e^{-j{\frac{2\pi}NT_s}knT_s}}=\frac1{NT_s}\sum_{n=0}^{N-1}{x[n]e^{-j{\frac{2\pi}NT_s}kn}} C[jkw]=NTs1n=0∑N−1x(nTs)e−jN2πTsknTs=NTs1n=0∑N−1x[n]e−jN2πTskn。
令 C [ j k w ] ∙ T s = C [ k ] C[jkw]\bullet Ts=C[k] C[jkw]∙Ts=C[k], C [ k ] = 1 N ∑ n = 0 N − 1 x [ n ] e − j 2 π N T s k n C[k]=\frac1N\sum_{n=0}^{N-1}{x[n]e^{-j{\frac{2\pi}NT_s}kn}} C[k]=N1∑n=0N−1x[n]e−jN2πTskn,这就是DFT变换,我们取值在 0 ≤ k < N − 1 0\le k<N-1 0≤k<N−1中, k w = k 2 π T = k 2 π N T s = 2 π f s k N kw = k\frac{2\pi}T =k\frac{2\pi}{NTs}=2\pi f_s\frac kN kw=kT2π=kNTs2π=2πfsNk,
其中离散傅里叶变换后的第 k k k个频率是 f k = k N f s f_k=\frac kN f_s fk=Nkfs。常用的fft本质就是DFT,只不过使用了一种简化算法。
最后提一下潘工的专栏,读之受益匪浅。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/210128.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...