傅里叶变换学习指南

本文为CS方向学习(快速)傅里叶变换的建议流程(仅做形象认知),建议先看b站参考视频,后续阅读公式,再去阅读OI wiki

连续傅里叶变换CFT

对连续傅里叶变换(CFT,Continuous Fourier Transform)进行初步了解,对变换有形象认识,参考视频
公式为: F x ( t ) = x ^ ( w ) = ∫ 0 L x ( t ) e − i w t d t , t ∈ [ 0 , L ] \mathscr{F}x(t)=\hat{x} (w)=\int_{0}^{L}x(t) e^{-iw t}\mathrm{d}t,t \in [0,L] Fx(t)=x^(w)=0Lx(t)eiwtdt,t[0,L]
x ^ ( w ) \hat{x}(w) x^(w)的自变量 w w w为频率,为频域上的函数,因变量为复数(Complex),按视频认知为:当 w w w一定时,原时域信号(0到L)在复平面上乘单位向量 e − i θ e^{-i\theta} eiθ θ \theta θ为旋转角, θ = w t \theta=w t θ=wt)后积分,将原时域信号视为有质量的东西,则除以 L L L就得到新图像的质心的倍数;按不同的缠绕频率( w w w)就会得到不同的质心位置,质心位置的分布即为 x ^ ( w ) \hat{x}(w) x^(w)表示的东西。
因为当缠绕频率与原始时域信号某一子周期曲线(默认原始时域信号由标准的周期曲线组合而来)频率一致时, x ^ ( w ) \hat{x}(w) x^(w)该复数在复平面上会明显偏于某一侧,所以通过傅里叶变换可以得到每个子周期曲线的频率。

离散时间傅里叶变换DTFT

参考维基百科
离散时间傅里叶变换(DTFT,Discrete-time Fourier Transform),对原始时域信号进行取样,时域信号为离散的,但仍可以按照连续的缠绕频率进行计算,所以在频域仍为连续的。
设采样后时域信号为 x d i s c r e t e [ n ] = x ( n T ) , n = 0 , 1 , . . . , N − 1 {x}_{discrete}[n]=x(nT),n=0,1,...,N-1 xdiscrete[n]=x(nT),n=0,1,...,N1 T T T为采样周期, N = L T N=\frac{L}{T} N=TL
公式为: F x d i s c r e t e [ n ] = x ^ d i s c r e t e ( w ) = ∑ n = 0 N − 1 x ( n T ) e − i w n T \mathscr{F}{x}_{discrete}[n]=\hat{x}_{discrete} (w)= \sum _{n=0}^{N-1}x(nT) e^{-iw nT} Fxdiscrete[n]=x^discrete(w)=n=0N1x(nT)eiwnT(对 w w w连续)

下面将频域信号取样(转化为有限长离散信号),与对时域信号的处理类似,假设频域信号是带限的,再经过离散化,即可得到有限长离散信号。依据采样定理(?),频域采样若要能完全重建原信号,频域信号 x ^ ( ω ) \hat{x}(\omega) x^(ω)应当带限于 ( 0 , 1 2 T ) {\displaystyle (0,{\frac {1}{2T}})} (0,2T1)。由于时域信号时限于 [ 0 , L ] {\displaystyle [0,L]} [0,L],由采样定理以及时频对偶的关系,频域的采样间隔应为 1 / L {\displaystyle 1/L} 1/L。故,频域采样点个数 N N N为:

N = 1 / T 1 / L = L T {\displaystyle N={\frac {1/T}{1/L}}={\frac {L}{T}}} N=1/L1/T=TL
即频域采样的点数和时域采样同为 N {\displaystyle N} N,频域采样点为 { ω k = 2 π k / N T } 0 ≤ k < N {\displaystyle \{\omega _{k}={2\pi }k/NT\}_{0\leq k<N}} {ωk=2πk/NT}0k<N。 而DTFT在频域上采样:

x ^ [ k ] = x ^ d i s c r e t e ( ω k ) = 1 T ∑ n = 0 N − 1 x ( n T ) e − i 2 π N n k {\displaystyle {\hat {x}}[k]={\hat {x}}_{discrete}(\omega _{k})={\frac {1}{T}}\sum _{n=0}^{N-1}x(nT)e^{-i{\frac {2\pi }{N}}nk}} x^[k]=x^discrete(ωk)=T1n=0N1x(nT)eiN2πnk
T = 1 {\displaystyle T=1} T=1,将其归一化
x ^ [ k ] = ∑ n = 0 N − 1 x [ n ] e − i 2 π N n k {\displaystyle {\hat {x}}[k]=\sum _{n=0}^{N-1}x[n]e^{-i{\frac {2\pi }{N}}nk}} x^[k]=n=0N1x[n]eiN2πnk
就得到下述定义的离散傅里叶变换。因此,DFT就是先将信号在时域离散化,求其连续傅里叶变换后,再在频域离散化的结果。
在频域上,离散傅里叶(DFT,Discrete Fourier Transform)的离散谱是对DTFT连续谱的等间隔采样。

离散傅里叶变换DFT

对于 N {\displaystyle N} N点序列 { x [ n ] } 0 ≤ n < N {\displaystyle \left\{x[n]\right\}_{0\leq n<N}} {x[n]}0n<N,它的离散傅里叶变换(DFT)为:

x ^ [ k ] = ∑ n = 0 N − 1 e − i 2 π N n k x [ n ] k = 0 , 1 , … , N − 1. {\displaystyle {\hat {x}}[k]=\sum _{n=0}^{N-1}e^{-i{\frac {2\pi }{N}}nk}x[n]\qquad k=0,1,\ldots ,N-1.} x^[k]=n=0N1eiN2πnkx[n]k=0,1,,N1.
其中 e {\displaystyle e} e是自然对数的底数, i {\displaystyle i} i是虚数单位。通常以符号 F {\displaystyle {\mathcal {F}}} F表示这一变换,即 x ^ = F x {\displaystyle {\hat {x}}={\mathcal {F}}x} x^=Fx
x [ n ] x[n] x[n]为时域信号序列, x ^ [ k ] \hat x[k] x^[k]为对应的频域序列。
离散傅里叶变换的逆变换(IDFT)为:

x [ n ] = 1 N ∑ k = 0 N − 1 e i 2 π N n k x ^ [ k ] n = 0 , 1 , … , N − 1. {\displaystyle x\left[n\right]={1 \over N}\sum _{k=0}^{N-1}e^{i{\frac {2\pi }{N}}nk}{\hat {x}}[k]\qquad n=0,1,\ldots ,N-1.} x[n]=N1k=0N1eiN2πnkx^[k]n=0,1,,N1.
可以记为 x = F − 1 x ^ {\displaystyle x={\mathcal {F}}^{-1}{\hat {x}}} x=F1x^
实际上,DFT和IDFT变换式中和式前面的归一化系数并不重要。在上面的定义中,DFT和IDFT前的系数分别为 1 {\displaystyle 1} 1 1 N {\displaystyle {\frac {1}{N}}} N1。有时会将这两个系数都改成 1 N {\displaystyle {\frac {1}{\sqrt {N}}}} N 1

快速傅里叶变换FFT

快速傅里叶变换(Fast Fourier Transform,FFT)即为时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)的DFT快速算法,请参考OI wiki,在阅读时可尽量形象地关注复数在复平面上角(倍数)的关系。

fft vs rfft (python numpy)

Basic difference is explained here via example. As it says:
参考

import numpy as np

data = [0, 1, 2, 1, 0]

print("FFT output\n", np.fft.fft(data))
print("RFFT output\n", np.fft.rfft(data))

will result in:

FFT output
 [ 4.        +0.j        ,-2.11803399-1.53884177j  ,0.11803399+0.36327126j
  ,0.11803399-0.36327126j ,-2.11803399+1.53884177j]
RFFT output
 [ 4.        +0.j        ,-2.11803399-1.53884177j  ,0.11803399+0.36327126j]

Notice how the final element of the fft output is the complex conjugate of the second element, for real input. For rfft, this symmetry is exploited to compute only the non-negative frequency terms.
请注意,对于实数输入,fft输出的后一半的输出是前一半输出的复数共轭。对于rfft,因为这种对称性,后一半的输出不再计算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值