目录

  • 离散傅里叶变换 (DFT)
    • 离散傅里叶变换的基
    • 离散傅里叶变换
  • 快速傅里叶变换 (FFT)
  • 卷积
    • 线性时不变系统
    • 傅里叶级数
  • 参考文献

离散傅里叶变换 (DFT)

离散傅里叶变换的基

  • 对于周期为 2 π 2\pi 2π 的函数而言,它的傅里叶变换
    f ( t ) = ∑ n = − ∞ ∞ C n e i n t s . t . C n = 1 T ( ∫ 0 T f ( t ) e − i n t d t ) f ( t ) = f ( t + 2 π ) \begin{aligned} f(t)&=\sum_{n=-\infty}^\infty C_ne^{int}\\ s.t.\quad C_n&=\frac{1}{T}\left( \int_{0}^{T} f(t) e^{-int}d t\right)\\ f(t)&=f(t+2\pi) \end{aligned} f(t)s.t.Cn​f(t)​=n=−∞∑∞​Cn​eint=T1​(∫0T​f(t)e−intdt)=f(t+2π)​但在实际应用中,我们可能并不知道 f ( t ) f(t) f(t),而是只能得到 f ( t ) f(t) f(t) 的 N N N 个采样点,也就是向量 [ f 0 , f 1 , . . . , f N − 1 ] = [ f ( 0 2 π N ) , f ( 1 2 π N ) , . . . , f ( ( N − 1 ) 2 π N ) ] [f_0,f_1,...,f_{N-1}]=[f(0\frac{2\pi}{N}),f(1\frac{2\pi}{N}),...,f((N-1)\frac{2\pi}{N})] [f0​,f1​,...,fN−1​]=[f(0N2π​),f(1N2π​),...,f((N−1)N2π​)] (可以假定这 N N N 个采样点都是在同一周期内的等距离采样). 离散傅里叶变换就是通过上述向量找到傅里叶系数 C n C_n Cn​
  • 下面用傅里叶展开写出 f ( t ) f(t) f(t) 在采样点 2 π N \frac{2 \pi}{N} N2π​ 的函数值
    f ( 2 π N ) = ⋯ + C − 2 e − 2 2 π i N + C − 1 e − 1 2 π i N + C 0 e 0 2 π i N + C 1 e 1 2 π i N + C 2 e 2 2 π i N + ⋯ + C N − 1 e ( N − 1 ) 2 π i N + C N e N 2 π i N + C N + 1 e ( N + 1 ) 2 π i N + ⋯ \left.\begin{aligned} f\left(\frac{2 \pi}{N}\right)&=\cdots+ C_{-2} e^{-2 \frac{2 \pi i}{N}}+C_{-1} e^{-1 \frac{2 \pi i}{N}}+C_{0} e^{0 \frac{2 \pi i}{N}}+C_{1} e^{1 \frac{2 \pi i}{N}}+C_{2} e^{2 \frac{2 \pi i}{N}}+\cdots+C_{N-1} e^{(N-1) \frac{2 \pi i}{N}}+C_{N} e^{N \frac{2 \pi i}{N}}+C_{N+1} e^{(N+1) \frac{2 \pi i}{N}}+\cdots \\ \end{aligned}\right. f(N2π​)​=⋯+C−2​e−2N2πi​+C−1​e−1N2πi​+C0​e0N2πi​+C1​e1N2πi​+C2​e2N2πi​+⋯+CN−1​e(N−1)N2πi​+CN​eNN2πi​+CN+1​e(N+1)N2πi​+⋯​注意到, e k 2 π i N e^{k\frac{2\pi i}{N}} ekN2πi​ 实际上是 k k k 的一个周期为 N N N 的函数
    因此可以将相同的项进行合并,得到
    f ( 2 π N ) = ⋯ + C − 2 e − 2 2 π i N + C − 1 e − 1 2 π i N + C 0 e 0 2 π i N + C 1 e 1 2 π i N + C 2 e 2 2 π i N + ⋯ + C N − 1 e ( N − 1 ) 2 π i N + C N e N 2 π i N + C N + 1 e ( N + 1 ) 2 π i N + ⋯ = ( C 0 + C N + C − N + C 2 N + C − 2 N + ⋯ ) e 0 2 π i N + ( C 1 + C N + 1 + C − N + 1 + C 2 N + 1 + C − 2 N + 1 ⋯ ) e 1 2 π i N + ( C 2 + C N + 2 + C − N + 2 + C 2 N + 2 + C − 2 N + 2 ⋯ ) e 2 2 π i N ⋯ + ( C N − 1 + C 2 N − 1 + C − 1 + C 3 N − 1 + C − N − 1 ⋯ ) e ( N − 1 ) 2 π i N \left.\begin{aligned} f\left(\frac{2 \pi}{N}\right)&=\cdots+ C_{-2} e^{-2 \frac{2 \pi i}{N}}+C_{-1} e^{-1 \frac{2 \pi i}{N}}+C_{0} e^{0 \frac{2 \pi i}{N}}+C_{1} e^{1 \frac{2 \pi i}{N}}+C_{2} e^{2 \frac{2 \pi i}{N}}+\cdots+C_{N-1} e^{(N-1) \frac{2 \pi i}{N}}+C_{N} e^{N \frac{2 \pi i}{N}}+C_{N+1} e^{(N+1) \frac{2 \pi i}{N}}+\cdots \\ &= \left(C_{0}+C_{N}+C_{-N}+C_{2 N}+C_{-2 N}+\cdots\right) e^{0 \frac{2 \pi i}{N}} \\ &\ +\left(C_{1}+C_{N+1}+C_{-N+1}+C_{2 N+1}+C_{-2 N+1} \cdots\right) e^{1 \frac{2 \pi i}{N}} \\ &\ +\left(C_{2}+C_{N+2}+C_{-N+2}+C_{2 N+2}+C_{-2 N+2} \cdots\right) e^{2 \frac{2 \pi i}{N}} \\ &\ \cdots \\ &\ +\left(C_{N-1}+C_{2 N-1}+C_{-1}+C_{3 N-1}+C_{-N-1} \cdots\right) e^{(N-1) \frac{2 \pi i}{N}} \end{aligned}\right. f(N2π​)​=⋯+C−2​e−2N2πi​+C−1​e−1N2πi​+C0​e0N2πi​+C1​e1N2πi​+C2​e2N2πi​+⋯+CN−1​e(N−1)N2πi​+CN​eNN2πi​+CN+1​e(N+1)N2πi​+⋯=(C0​+CN​+C−N​+C2N​+C−2N​+⋯)e0N2πi​ +(C1​+CN+1​+C−N+1​+C2N+1​+C−2N+1​⋯)e1N2πi​ +(C2​+CN+2​+C−N+2​+C2N+2​+C−2N+2​⋯)e2N2πi​ ⋯ +(CN−1​+C2N−1​+C−1​+C3N−1​+C−N−1​⋯)e(N−1)N2πi​​令 w = e 2 π i N w=e^{\frac{2\pi i}{N}} w=eN2πi​ ( w 0 = w N = 1 w^0=w^N=1 w0=wN=1),则有
    f ( 2 π N ) = ( C 0 + C N + C − N + C 2 N + C − 2 N + ⋯ ) w 0 + ( C 1 + C N + 1 + C − N + 1 + C 2 N + 1 + C − 2 N + 1 ⋯ ) w 1 + ( C 2 + C N + 2 + C − N + 2 + C 2 N + 2 + C − 2 N + 2 ⋯ ) w 2 ⋯ + ( C N − 1 + C 2 N − 1 + C − 1 + C 3 N − 1 + C − N − 1 ⋯ ) w ( N − 1 ) \left.\begin{aligned} f\left(\frac{2 \pi}{N}\right) &= \left(C_{0}+C_{N}+C_{-N}+C_{2 N}+C_{-2 N}+\cdots\right) w^{0} \\ &\ +\left(C_{1}+C_{N+1}+C_{-N+1}+C_{2 N+1}+C_{-2 N+1} \cdots\right) w^{1} \\ &\ +\left(C_{2}+C_{N+2}+C_{-N+2}+C_{2 N+2}+C_{-2 N+2} \cdots\right) w^{2} \\ &\ \cdots \\ &\ +\left(C_{N-1}+C_{2 N-1}+C_{-1}+C_{3 N-1}+C_{-N-1} \cdots\right) w^{(N-1)} \end{aligned}\right. f(N2π​)​=(C0​+CN​+C−N​+C2N​+C−2N​+⋯)w0 +(C1​+CN+1​+C−N+1​+C2N+1​+C−2N+1​⋯)w1 +(C2​+CN+2​+C−N+2​+C2N+2​+C−2N+2​⋯)w2 ⋯ +(CN−1​+C2N−1​+C−1​+C3N−1​+C−N−1​⋯)w(N−1)​也就是说, f ( 2 π N ) f\left(\frac{2 \pi}{N}\right) f(N2π​) 的函数值,只需要 N N N 个基就能得到,不需要无穷多个基,只要得到这 N N N 个基的 N N N 个系数即可
  • 按照同样的方法可以写出 f ( t ) f(t) f(t) 在采样点 k 2 π N k\frac{2\pi}{N} kN2π​ 的函数值
    f ( k 2 π N ) = ∑ n = − ∞ ∞ C n w n k = ( C 0 + C N + C − N + C 2 N + C − 2 N + ⋯ ) w 0 k + ( C 1 + C N + 1 + C − N + 1 + C 2 N + 1 + C − 2 N + 1 ⋯ ) w 1 k + ( C 2 + C N + 2 + C − N + 2 + C 2 N + 2 + C − 2 N + 2 ⋯ ) w 2 k ⋯ + ( C N − 1 + C 2 N − 1 + C − 1 + C 3 N − 1 + C − N − 1 ⋯ ) w ( N − 1 ) k \left.\begin{aligned} f\left(k\frac{2 \pi}{N}\right)&=\sum_{n=-\infty}^\infty C_nw^{nk}\\ &= \left(C_{0}+C_{N}+C_{-N}+C_{2 N}+C_{-2 N}+\cdots\right) w^{0k} \\ &\ +\left(C_{1}+C_{N+1}+C_{-N+1}+C_{2 N+1}+C_{-2 N+1} \cdots\right) w^{1k} \\ &\ +\left(C_{2}+C_{N+2}+C_{-N+2}+C_{2 N+2}+C_{-2 N+2} \cdots\right) w^{2k} \\ &\ \cdots \\ &\ +\left(C_{N-1}+C_{2 N-1}+C_{-1}+C_{3 N-1}+C_{-N-1} \cdots\right) w^{(N-1)k} \end{aligned}\right. f(kN2π​)​=n=−∞∑∞​Cn​wnk=(C0​+CN​+C−N​+C2N​+C−2N​+⋯)w0k +(C1​+CN+1​+C−N+1​+C2N+1​+C−2N+1​⋯)w1k +(C2​+CN+2​+C−N+2​+C2N+2​+C−2N+2​⋯)w2k ⋯ +(CN−1​+C2N−1​+C−1​+C3N−1​+C−N−1​⋯)w(N−1)k​由于 w k w^k wk 的周期性, w 0 k , . . . , w ( N − 1 ) k w^{0k},...,w^{(N-1)k} w0k,...,w(N−1)k 仍然对应着 w 0 , . . . , w N − 1 w^0,...,w^{N-1} w0,...,wN−1 中的一项,因此 f ( k 2 π N ) f\left(k\frac{2 \pi}{N}\right) f(kN2π​) 的函数值都只需要 N N N 个基就能得到,基为
    w k = e k 2 π i N , k = 0 , 1 , . . . , N − 1 w^k=e^{k\frac{2\pi i}{N}},\quad\quad k=0,1,...,N-1 wk=ekN2πi​,k=0,1,...,N−1

离散傅里叶变换

  • 现在我们知道, f ( t ) f(t) f(t) 在采样点处的值 f ( k 2 π N ) f\left(k\frac{2 \pi}{N}\right) f(kN2π​) 其实是 N N N 个基的线性组合,并且函数值 f ( k 2 π N ) f\left(k\frac{2 \pi}{N}\right) f(kN2π​) 和 N N N 个基是已知的,因此我们就可以列出关于 N N N 个系数 的 N N N 个方程,组成线性方程组,最终就可以解出 N N N 个系数 ( C 0 + C N + C − N + C 2 N + C − 2 N + ⋯ ) , ( C 1 + C N + 1 + C − N + 1 + C 2 N + 1 + C − 2 N + 1 ⋯ ) , . . . , ( C N − 1 + C 2 N − 1 + C − 1 + C 3 N − 1 + C − N − 1 ⋯ ) \left(C_{0}+C_{N}+C_{-N}+C_{2 N}+C_{-2 N}+\cdots\right),\\\left(C_{1}+C_{N+1}+C_{-N+1}+C_{2 N+1}+C_{-2 N+1} \cdots\right),\\...,\\\left(C_{N-1}+C_{2 N-1}+C_{-1}+C_{3 N-1}+C_{-N-1} \cdots\right) (C0​+CN​+C−N​+C2N​+C−2N​+⋯),(C1​+CN+1​+C−N+1​+C2N+1​+C−2N+1​⋯),...,(CN−1​+C2N−1​+C−1​+C3N−1​+C−N−1​⋯) { w 0 ( C 0 + C N + C − N + C 2 N + C − 2 N + ⋯ ) + w 0 ( C 1 + C N + 1 + C − N + 1 + C 2 N + 1 + C − 2 N + 1 ⋯ ) + ⋯ + w 0 ( C N − 1 + C 2 N − 1 + C − 1 + C 3 N − 1 + C − N − 1 ⋯ ) = f ( 0 ) w 0 ( C 0 + C N + C − N + C 2 N + C − 2 N + ⋯ ) + w 1 ( C 1 + C N + 1 + C − N + 1 + C 2 N + 1 + C − 2 N + 1 ⋯ ) + ⋯ + w ( N − 1 ) ( C N − 1 + C 2 N − 1 + C − 1 + C 3 N − 1 + C − N − 1 ⋯ ) = f ( 2 π N ) ⋯ w 0 k ( C 0 + C N + C − N + C 2 N + C − 2 N + ⋯ ) + w 1 k ( C 1 + C N + 1 + C − N + 1 + C 2 N + 1 + C − 2 N + 1 ⋯ ) + ⋯ + w ( N − 1 ) k ( C N − 1 + C 2 N − 1 + C − 1 + C 3 N − 1 + C − N − 1 ⋯ ) = f ( k 2 π N ) ⋯ w 0 ( N − 1 ) ( C 0 + C N + C − N + C 2 N + C − 2 N + ⋯ ) + w 1 ( N − 1 ) ( C 1 + C N + 1 + C − N + 1 + C 2 N + 1 + C − 2 N + 1 ⋯ ) + ⋯ + w ( N − 1 ) ( N − 1 ) ( C N − 1 + C 2 N − 1 + C − 1 + C 3 N − 1 + C − N − 1 ⋯ ) = f ( ( N − 1 ) 2 π N ) \left\{\begin{aligned} &w^{0} \left(C_{0}+C_{N}+C_{-N}+C_{2 N}+C_{-2 N}+\cdots\right) +w^{0}\left(C_{1}+C_{N+1}+C_{-N+1}+C_{2 N+1}+C_{-2 N+1} \cdots\right) + \cdots +w^{0}\left(C_{N-1}+C_{2 N-1}+C_{-1}+C_{3 N-1}+C_{-N-1} \cdots\right) =f\left(0\right)\\ &w^{0} \left(C_{0}+C_{N}+C_{-N}+C_{2 N}+C_{-2 N}+\cdots\right) +w^{1}\left(C_{1}+C_{N+1}+C_{-N+1}+C_{2 N+1}+C_{-2 N+1} \cdots\right) + \cdots +w^{(N-1)}\left(C_{N-1}+C_{2 N-1}+C_{-1}+C_{3 N-1}+C_{-N-1} \cdots\right) =f\left(\frac{2 \pi}{N}\right) \\&\cdots \\ &w^{0k} \left(C_{0}+C_{N}+C_{-N}+C_{2 N}+C_{-2 N}+\cdots\right) +w^{1k}\left(C_{1}+C_{N+1}+C_{-N+1}+C_{2 N+1}+C_{-2 N+1} \cdots\right) + \cdots +w^{(N-1)k}\left(C_{N-1}+C_{2 N-1}+C_{-1}+C_{3 N-1}+C_{-N-1} \cdots\right) =f\left(k\frac{2 \pi}{N}\right) \\&\cdots \\ &w^{0(N-1)} \left(C_{0}+C_{N}+C_{-N}+C_{2 N}+C_{-2 N}+\cdots\right) +w^{1(N-1)}\left(C_{1}+C_{N+1}+C_{-N+1}+C_{2 N+1}+C_{-2 N+1} \cdots\right) + \cdots +w^{(N-1)(N-1)}\left(C_{N-1}+C_{2 N-1}+C_{-1}+C_{3 N-1}+C_{-N-1} \cdots\right) =f\left((N-1)\frac{2 \pi}{N}\right) \end{aligned} \right. ⎩ ⎨ ⎧​​w0(C0​+CN​+C−N​+C2N​+C−2N​+⋯)+w0(C1​+CN+1​+C−N+1​+C2N+1​+C−2N+1​⋯)+⋯+w0(CN−1​+C2N−1​+C−1​+C3N−1​+C−N−1​⋯)=f(0)w0(C0​+CN​+C−N​+C2N​+C−2N​+⋯)+w1(C1​+CN+1​+C−N+1​+C2N+1​+C−2N+1​⋯)+⋯+w(N−1)(CN−1​+C2N−1​+C−1​+C3N−1​+C−N−1​⋯)=f(N2π​)⋯w0k(C0​+CN​+C−N​+C2N​+C−2N​+⋯)+w1k(C1​+CN+1​+C−N+1​+C2N+1​+C−2N+1​⋯)+⋯+w(N−1)k(CN−1​+C2N−1​+C−1​+C3N−1​+C−N−1​⋯)=f(kN2π​)⋯w0(N−1)(C0​+CN​+C−N​+C2N​+C−2N​+⋯)+w1(N−1)(C1​+CN+1​+C−N+1​+C2N+1​+C−2N+1​⋯)+⋯+w(N−1)(N−1)(CN−1​+C2N−1​+C−1​+C3N−1​+C−N−1​⋯)=f((N−1)N2π​)​
  • 但我们想解的其实是傅里叶系数 C k C_k Ck​,因此离散傅里叶假设 f ( t ) f(t) f(t) 的傅里叶级数里只包含 C 0 , C 1 , . . , C N − 1 C_0,C_1,..,C_{N-1} C0​,C1​,..,CN−1​ 项 (只要 N N N 足够大,就可以非常接近原函数),此时我们就可以写出如下线性方程组并解出 C 0 , C 1 , . . , C N − 1 C_0,C_1,..,C_{N-1} C0​,C1​,..,CN−1​:
    { w 0 C 0 + w 0 C 1 + ⋯ + w 0 C N − 1 = f ( 0 ) w 0 C 0 + w 1 C 1 + ⋯ + w ( N − 1 ) C N − 1 = f ( 2 π N ) ⋯ w 0 k C 0 + w 1 k C 1 + ⋯ + w ( N − 1 ) k C N − 1 = f ( k 2 π N ) ⋯ w 0 ( N − 1 ) C 0 + w 1 ( N − 1 ) C 1 + ⋯ + w ( N − 1 ) ( N − 1 ) C N − 1 = f ( ( N − 1 ) 2 π N ) \left\{\begin{aligned} &w^{0} C_{0} +w^{0}C_{1} + \cdots +w^{0}C_{N-1} =f\left(0\right)\\ &w^{0} C_{0} +w^{1}C_{1} + \cdots +w^{(N-1)}C_{N-1} =f\left(\frac{2 \pi}{N}\right) \\&\cdots \\ &w^{0k} C_{0} +w^{1k}C_{1} + \cdots +w^{(N-1)k}C_{N-1} =f\left(k\frac{2 \pi}{N}\right) \\&\cdots \\ &w^{0(N-1)} C_{0} +w^{1(N-1)}C_{1} + \cdots +w^{(N-1)(N-1)}C_{N-1} =f\left((N-1)\frac{2 \pi}{N}\right) \end{aligned} \right. ⎩ ⎨ ⎧​​w0C0​+w0C1​+⋯+w0CN−1​=f(0)w0C0​+w1C1​+⋯+w(N−1)CN−1​=f(N2π​)⋯w0kC0​+w1kC1​+⋯+w(N−1)kCN−1​=f(kN2π​)⋯w0(N−1)C0​+w1(N−1)C1​+⋯+w(N−1)(N−1)CN−1​=f((N−1)N2π​)​写成矩阵形式即为
    [ f 0 f 1 f 2 f 3 ⋮ f N − 1 ] = [ 1 1 1 1 ⋯ 1 1 w w 2 w 3 ⋯ w N − 1 1 w 2 w 4 w 6 ⋯ w 2 ( N − 1 ) 1 w 3 w 6 w 9 ⋯ w 3 ( N − 1 ) ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ 1 w N − 1 w 2 ( N − 1 ) w 3 ( N − 1 ) ⋯ w ( N − 1 ) 2 ] [ C 0 C 1 C 2 C 3 ⋮ C N − 1 ] \left[\begin{array}{c} f_{0} \\ f_{1} \\ f_{2} \\ f_{3} \\ \vdots \\ f_{N-1} \end{array}\right]=\left[\begin{array}{cccccc} 1 & 1 & 1 & 1 & \cdots & 1 \\ 1 & w & w^{2} & w^{3} & \cdots & w^{N-1} \\ 1 & w^{2} & w^{4} & w^{6} & \cdots & w^{2(N-1)} \\ 1 & w^{3} & w^{6} & w^{9} & \cdots & w^{3(N-1)} \\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots \\ 1 & w^{N-1} & w^{2(N-1)} & w^{3(N-1)} & \cdots & w^{(N-1)^{2}} \end{array}\right]\left[\begin{array}{c} C_{0} \\ C_{1} \\ C_{2} \\ C_{3} \\ \vdots \\ C_{N-1} \end{array}\right] ⎣ ⎡​f0​f1​f2​f3​⋮fN−1​​⎦ ⎤​=⎣ ⎡​1111⋮1​1ww2w3⋮wN−1​1w2w4w6⋮w2(N−1)​1w3w6w9⋮w3(N−1)​⋯⋯⋯⋯⋮⋯​1wN−1w2(N−1)w3(N−1)⋮w(N−1)2​⎦ ⎤​⎣ ⎡​C0​C1​C2​C3​⋮CN−1​​⎦ ⎤​其中,由 w = e 2 π i N w=e^{\frac{2\pi i}{N}} w=eN2πi​ 组成的 N × N N\times N N×N 矩阵 F N ∗ F_N^{*} FN∗​ 即为傅里叶逆变换矩阵,由 f f f 向量到 C C C 向量的变换即为离散傅里叶变换,由 C C C 向量到 f f f 向量的变换即为离散傅里叶逆变换
  • 设 F N ∗ F_N^{*} FN∗​ 的共轭转置为 F N F_N FN​,则有
    F N ∗ F N = N I N F_N^*F_N=NI_N FN∗​FN​=NIN​因此,
    F N ∗ − 1 = 1 N F N F_N^{*-1}=\frac{1}{N}F_N FN∗−1​=N1​FN​可以将离散傅里叶变换写为
    1 N F N f = C 1 N [ 1 1 1 1 ⋯ 1 1 w ˉ w ˉ 2 w ˉ 3 ⋯ w ˉ N − 1 1 w ˉ 2 w ˉ 4 w ˉ 6 ⋯ w ˉ 2 ( N − 1 ) 1 w 3 w 6 w 9 ⋯ w 3 ( N − 1 ) ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ 1 w ˉ N − 1 w ˉ 2 ( N − 1 ) w ˉ 3 ( N − 1 ) ⋯ w ˉ ( N − 1 ) 2 ] [ f 0 f 1 f 2 f 3 ⋮ f N − 1 ] = [ C 0 C 1 C 2 C 3 ⋮ C N − 1 ] \frac{1}{N}F_Nf=C \\ \frac{1}{N}\left[\begin{array}{cccccc} 1 & 1 & 1 & 1 & \cdots & 1 \\ 1 & \bar{w} & \bar{w}^2 & \bar{w}^3 & \cdots & \bar{w}^{N-1} \\ 1 & \bar{w}^2 & \bar{w}^4 & \bar{w}^6 & \cdots & \bar{w}^{2(N-1)} \\ 1 & w^3 & w^6 & w^9 & \cdots & w^{3(N-1)} \\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots \\ 1 & \bar{w}^{N-1} & \bar{w}^{2(N-1)} & \bar{w}^{3(N-1)} & \cdots & \bar{w}^{(N-1)^2} \end{array}\right]\left[\begin{array}{c} f_0 \\ f_1 \\ f_2 \\ f_3 \\ \vdots \\ f_{N-1} \end{array}\right]=\left[\begin{array}{c} C_0 \\ C_1 \\ C_2 \\ C_3 \\ \vdots \\ C_{N-1} \end{array}\right] N1​FN​f=CN1​⎣ ⎡​1111⋮1​1wˉwˉ2w3⋮wˉN−1​1wˉ2wˉ4w6⋮wˉ2(N−1)​1wˉ3wˉ6w9⋮wˉ3(N−1)​⋯⋯⋯⋯⋮⋯​1wˉN−1wˉ2(N−1)w3(N−1)⋮wˉ(N−1)2​⎦ ⎤​⎣ ⎡​f0​f1​f2​f3​⋮fN−1​​⎦ ⎤​=⎣ ⎡​C0​C1​C2​C3​⋮CN−1​​⎦ ⎤​其中, w ˉ = e − 2 π i N \bar w=e^{-\frac{2\pi i}{N}} wˉ=e−N2πi​ 为 w w w 的共轭。设 X [ k ] = N C k X[k]=NC_k X[k]=NCk​, x [ k ] = f k x[k]=f_k x[k]=fk​,则有
    X [ k ] = ∑ n = 0 N − 1 x [ n ] e − k 2 π n i N X[k]=\sum_{n=0}^{N-1} x[n] e^{-k \frac{2 \pi n i}{N}} X[k]=n=0∑N−1​x[n]e−kN2πni​即为书上的 DFT 公式;而逆离散傅里叶变换 IDFT 则为
    x [ n ] = 1 N ∑ k = 0 N − 1 X [ k ] e k 2 π n i N x[n]=\frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{k\frac{2\pi n i}{N}} x[n]=N1​k=0∑N−1​X[k]ekN2πni​
def DFT_slow(x):x = np.asarray(x, dtype=float)  # 输入信号采样点N = x.shape[0]  # 采样点个数spectro = []    # 信号频谱for k in range(N):  # 依次计算 N 个傅里叶系数real = 0    # 傅里叶系数的实部img = 0     # 傅里叶系数的虚部for n in range(N):  # 遍历所有采样点t = 2 * math.pi * k * n / Nreal += math.cos(t) * x[n]  # 累加实部img -= math.sin(t) * x[n]   # 累加虚部spectro.append(real + img * 1j)return np.asarray(spectro)
def DFT_slow(x):# 用矩阵乘积的形式实现 DFTx = np.asarray(x, dtype=float)  # 输入信号采样点N = x.shape[0]  # 采样点个数n = np.arange(N)k = n.reshape((N, 1))M = np.exp(-2j * np.pi * k * n / N) # 傅里叶变换矩阵return np.dot(M, x)

  • 假设周期函数为 f ( t ) = 1 + e i t + e i 2 t + e i 3 t \begin{aligned} f(t)&=1+e^{it}+e^{i2t}+e^{i3t} \end{aligned} f(t)​=1+eit+ei2t+ei3t​
  • 采样 N = 4 N=4 N=4 个点时,可以计算得到采样点处的函数值
    f ( 0 ) = 4 f ( 1 2 π 4 ) = f ( 2 2 π 4 ) = f ( 3 2 π 4 ) = 0 f(0)=4 \quad f\left(1 \frac{2 \pi}{4}\right)=f\left(2 \frac{2 \pi}{4}\right)=f\left(3 \frac{2 \pi}{4}\right)=0 f(0)=4f(142π​)=f(242π​)=f(342π​)=0 w = e 2 π i N = i w=e^{\frac{2\pi i}{N}}=i w=eN2πi​=i,由离散傅里叶变换可以解得 [ C 0 , C 1 , C 2 , C 3 ] = [ 1 , 1 , 1 , 1 ] [C_0,C_1,C_2,C_3]=[1,1,1,1] [C0​,C1​,C2​,C3​]=[1,1,1,1]
    [ 1 1 1 1 1 w w 2 w 3 1 w 2 w 4 w 6 1 w 3 w 6 w 9 ] − 1 [ 4 0 0 0 ] = [ 1 1 1 1 ] \left[\begin{array}{cccc} 1 & 1 & 1 & 1 \\ 1 & w & w^2 & w^3 \\ 1 & w^2 & w^4 & w^6 \\ 1 & w^3 & w^6 & w^9 \end{array}\right]^{-1}\left[\begin{array}{l} 4 \\ 0 \\ 0 \\ 0 \end{array}\right]=\left[\begin{array}{l} 1 \\ 1 \\ 1 \\ 1 \end{array}\right] ⎣ ⎡​1111​1ww2w3​1w2w4w6​1w3w6w9​⎦ ⎤​−1⎣ ⎡​4000​⎦ ⎤​=⎣ ⎡​1111​⎦ ⎤​
  • 采样 N = 3 N=3 N=3 个点时,可以计算得到采样点处的函数值
    f ( 0 ) = 4 f ( 2 π 3 ) = 1 f ( 2 2 π 3 ) = 1 f(0)=4 \quad f\left(\frac{2 \pi}{3}\right)=1 \quad f\left(2 \frac{2 \pi}{3}\right)=1 f(0)=4f(32π​)=1f(232π​)=1 w = e 2 π i N = − 1 2 + 3 2 i w=e^{\frac{2\pi i}{N}}=-\frac{1}{2}+\frac{\sqrt3}{2}i w=eN2πi​=−21​+23 ​​i,由离散傅里叶变换可以解得 [ C 0 + C 3 , C 1 , C 2 ] = [ 2 , 1 , 1 ] [C_0+C_3,C_1,C_2]=[2,1,1] [C0​+C3​,C1​,C2​]=[2,1,1]
    [ 1 1 1 1 w w 2 1 w 2 w 4 ] − 1 [ 4 1 1 ] = [ 2 1 1 ] \left[\begin{array}{ccc} 1 & 1 & 1 \\ 1 & w & w^2 \\ 1 & w^2 & w^4 \end{array}\right]^{-1}\left[\begin{array}{l} 4 \\ 1 \\ 1 \end{array}\right]=\left[\begin{array}{l} 2 \\ 1 \\ 1 \end{array}\right] ⎣ ⎡​111​1ww2​1w2w4​⎦ ⎤​−1⎣ ⎡​411​⎦ ⎤​=⎣ ⎡​211​⎦ ⎤​可以看出,由于采样点个数太少,我们无法解出高频系数 C 3 C_3 C3​,只能解出 C 0 + C 3 C_0+C_3 C0​+C3​,也就是把高频信号当成低频信号

  • 假设周期函数为 f ( t ) = 1 + cos ⁡ t + cos ⁡ 2 t = 1 2 e − i 2 t + 1 2 e − i t + 1 + 1 2 e i t + 1 2 e i 2 t \begin{aligned} f(t)&=1+\cos t+\cos 2t=\frac{1}{2} e^{-i 2 t}+\frac{1}{2} e^{-i t}+1+\frac{1}{2} e^{i t}+\frac{1}{2} e^{i 2 t} \end{aligned} f(t)​=1+cost+cos2t=21​e−i2t+21​e−it+1+21​eit+21​ei2t​
  • 采样 N = 6 N=6 N=6 个点时,由离散傅里叶变换可以解得 [ C 0 , C 1 , C 2 , C 3 , C − 2 , C − 1 ] = [ 1 , 0.5 , 0.5 , 0 , 0.5 , 0.5 ] [C_0,C_1,C_2,C_3,C_{-2},C_{-1}]=[1,0.5,0.5,0,0.5,0.5] [C0​,C1​,C2​,C3​,C−2​,C−1​]=[1,0.5,0.5,0,0.5,0.5]
  • 采样 N = 4 N=4 N=4 个点时,由离散傅里叶变换可以解得 [ C 0 , C 1 , C 2 + C − 2 , C − 1 ] = [ 1 , 0.5 , 1 , 0.5 ] [C_0,C_1,C_2+C_{-2},C_{-1}]=[1,0.5,1,0.5] [C0​,C1​,C2​+C−2​,C−1​]=[1,0.5,1,0.5]
  • 采样 N = 5 N=5 N=5 个点时,由离散傅里叶变换可以解得 [ C 0 , C 1 , C 2 , C − 2 , C − 1 ] = [ 1 , 0.5 , 0.5 , 0.5 , 0.5 ] [C_0,C_1,C_2,C_{-2},C_{-1}]=[1,0.5,0.5,0.5,0.5] [C0​,C1​,C2​,C−2​,C−1​]=[1,0.5,0.5,0.5,0.5]

快速傅里叶变换 (FFT)

  • 快速傅里叶变换就是快速计算如下矩阵乘积的算法:
    F N f = [ 1 1 1 1 ⋯ 1 1 w ˉ w ˉ 2 w ˉ 3 ⋯ w ˉ N − 1 1 w ˉ 2 w ˉ 4 w ˉ 6 ⋯ w ˉ 2 ( N − 1 ) 1 w 3 w 6 w 9 ⋯ w 3 ( N − 1 ) ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ 1 w ˉ N − 1 w ˉ 2 ( N − 1 ) w ˉ 3 ( N − 1 ) ⋯ w ˉ ( N − 1 ) 2 ] [ f 0 f 1 f 2 f 3 ⋮ f N − 1 ] F_Nf=\left[\begin{array}{cccccc} 1 & 1 & 1 & 1 & \cdots & 1 \\ 1 & \bar{w} & \bar{w}^2 & \bar{w}^3 & \cdots & \bar{w}^{N-1} \\ 1 & \bar{w}^2 & \bar{w}^4 & \bar{w}^6 & \cdots & \bar{w}^{2(N-1)} \\ 1 & w^3 & w^6 & w^9 & \cdots & w^{3(N-1)} \\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots \\ 1 & \bar{w}^{N-1} & \bar{w}^{2(N-1)} & \bar{w}^{3(N-1)} & \cdots & \bar{w}^{(N-1)^2} \end{array}\right]\left[\begin{array}{c} f_0 \\ f_1 \\ f_2 \\ f_3 \\ \vdots \\ f_{N-1} \end{array}\right] FN​f=⎣ ⎡​1111⋮1​1wˉwˉ2w3⋮wˉN−1​1wˉ2wˉ4w6⋮wˉ2(N−1)​1wˉ3wˉ6w9⋮wˉ3(N−1)​⋯⋯⋯⋯⋮⋯​1wˉN−1wˉ2(N−1)w3(N−1)⋮wˉ(N−1)2​⎦ ⎤​⎣ ⎡​f0​f1​f2​f3​⋮fN−1​​⎦ ⎤​其中, F N ∗ { i j } = w ˉ i j F_N^*\{ij\}=\bar w^{ij} FN∗​{ij}=wˉij, w ˉ = e − 2 π i N \bar w=e^{-\frac{2\pi i}{N}} wˉ=e−N2πi​
  • 当计算矩阵乘积 A x Ax Ax 时,改变 A A A 的列的顺序,同时改变 x x x 中对应行的顺序,可以使得计算结果不变。因此对于 F N f F_Nf FN​f,可以把 F N F_N FN​ 的偶数列和 f f f 的偶数行都拿到前面得到 F N f = F ~ N f ~ F_Nf=\tilde F_N\tilde f FN​f=F~N​f~​。例如,对于 F 4 F_4 F4​ ( w ˉ \bar w wˉ),有
    F 4 = [ 1 1 1 1 1 w ˉ w ˉ 2 w ˉ 3 1 w ˉ 2 w ˉ 4 w ˉ 6 1 w ˉ 3 w ˉ 6 w ˉ 9 ] F_4=\left[\begin{array}{cccc} 1 & 1 & 1 & 1 \\ 1 & \bar{w} & \bar{w}^2 & \bar{w}^3 \\ 1 & \bar{w}^2 & \bar{w}^4 & \bar{w}^6 \\ 1 & \bar{w}^3 & \bar{w}^6 & \bar{w}^9 \end{array}\right] F4​=⎣ ⎡​1111​1wˉwˉ2wˉ3​1wˉ2wˉ4wˉ6​1wˉ3wˉ6wˉ9​⎦ ⎤​ F ~ 4 = [ 1 1 1 1 1 w ˉ 2 w ˉ w ˉ 3 1 w ˉ 4 w ˉ 2 w ˉ 6 1 w ˉ 6 w ˉ 3 w ˉ 9 ] = [ F 2 D 2 F 2 F 2 − D 2 F 2 ] \tilde F_4=\left[\begin{array}{cccc} 1 & 1 & 1 & 1 \\ 1 &\bar{w}^2& \bar{w} & \bar{w}^3 \\ 1 & \bar{w}^4 & \bar{w}^2& \bar{w}^6 \\ 1 & \bar{w}^6 & \bar{w}^3 & \bar{w}^9 \end{array}\right]=\left[\begin{array}{cc} F_2 & D_2 F_2 \\ F_2 & -D_2 F_2 \end{array}\right] F~4​=⎣ ⎡​1111​1wˉ2wˉ4wˉ6​1wˉwˉ2wˉ3​1wˉ3wˉ6wˉ9​⎦ ⎤​=[F2​F2​​D2​F2​−D2​F2​​]其中, D 2 = [ 1 0 0 w ˉ ] D_2=\left[\begin{array}{cc} 1 & 0 \\ 0 & \bar{w} \end{array}\right] D2​=[10​0wˉ​] 为对角矩阵, N = 4 N=4 N=4 时有 w ˉ k + 4 = w ˉ k \bar w^{k+4}=\bar w^k wˉk+4=wˉk. 将上述结论一般化可以得到
    F 2 N ~ = [ F N D N F N F N − D N F N ] \widetilde{F_{2 N}}=\left[\begin{array}{cc} F_N & D_N F_N \\ F_N & -D_N F_N \end{array}\right] F2N​ ​=[FN​FN​​DN​FN​−DN​FN​​]其中,
    D N = [ 1 w ˉ ⋱ w ˉ N − 1 ] D_N=\left[\begin{array}{cccc} 1 & & & \\ & \bar{w} & & \\ & & \ddots & \\ & & & \bar{w}^{N-1} \end{array}\right] DN​=⎣ ⎡​1​wˉ​⋱​wˉN−1​⎦ ⎤​
  • 利用上述结论可以得到
    F N f = F ~ N f ~ = [ F N 2 D N 2 F N 2 F N 2 − D N 2 F N 2 ] [ f 0 f 2 ⋮ f N − 2 f 1 f 3 ⋮ f N − 1 ] = [ I D N 2 I − D N 2 ] [ F N 2 F N 2 ] [ f e v e n f o d d ] = [ I D N 2 I − D N 2 ] [ F N 2 f e v e n F N 2 f o d d ] \begin{aligned} F_N f=\tilde{F}_N\tilde f&=\left[\begin{array}{cc} F_{\frac{N}{2}} & D_{\frac{N}{2}} F_{\frac{N}{2}}\\ F_{\frac{N}{2}} & -D_{\frac{N}{2}} F_{\frac{N}{2}} \end{array}\right]\left[\begin{array}{c} f_0 \\ f_2 \\ \vdots \\ f_{N-2} \\ f_1 \\ f_3 \\ \vdots \\ f_{N-1} \end{array}\right] \\&=\left[\begin{array}{cc} I & D_{\frac{N}{2}}\\ I & -D_{\frac{N}{2}} \end{array}\right] \left[\begin{array}{cc} F_{\frac{N}{2}} & \\ & F_{\frac{N}{2}} \end{array}\right]\left[\begin{array}{c} f_{even} \\ f_{odd} \end{array}\right] \\&=\left[\begin{array}{cc} I & D_{\frac{N}{2}}\\ I & -D_{\frac{N}{2}} \end{array}\right] \left[\begin{array}{c} F_{\frac{N}{2}}f_{even} \\ F_{\frac{N}{2}}f_{odd} \end{array}\right] \end{aligned} FN​f=F~N​f~​​=[F2N​​F2N​​​D2N​​F2N​​−D2N​​F2N​​​]⎣ ⎡​f0​f2​⋮fN−2​f1​f3​⋮fN−1​​⎦ ⎤​=[II​D2N​​−D2N​​​][F2N​​​F2N​​​][feven​fodd​​]=[II​D2N​​−D2N​​​][F2N​​feven​F2N​​fodd​​]​可以看到,经过变换后,计算出后面的矩阵 [ F N 2 f e v e n F N 2 f o d d ] \left[\begin{array}{c} F_{\frac{N}{2}}f_{even} \\ F_{\frac{N}{2}}f_{odd} \end{array}\right] [F2N​​feven​F2N​​fodd​​] 只需要 2 ( N 2 ) 2 2(\frac{N}{2})^2 2(2N​)2 次乘法,而由于前面一个矩阵是对角矩阵组成的分块矩阵,因此计算前后矩阵的乘积一共只需要 N N N 次乘法。在使用一次变换后,我们只需要 N + 2 ( N 2 ) 2 N+2(\frac{N}{2})^2 N+2(2N​)2 次乘法,远小于原来的 N 2 N^2 N2 次乘法。并且后面的 F N 2 F_{\frac{N}{2}} F2N​​ 还可以被继续分解,一直可以分解到二维矩阵乘二维向量,如下图所示:

FFT 实际上只要求 N N N 可以被分解为两个正整数的乘积 (e.g. F 9 F_9 F9​ 可以被分解为 9 个 3 × 3 3\times3 3×3 的矩阵),但我们一般都选择 N N N 为 2 的整数次幂,如果信号采样次数不够 2 k 2^k 2k,那我们就在信号后面补 0

  • 通过 FFT,我们可以将 DFT 原先 O ( N 2 ) O(N^2) O(N2) 的时间复杂度降为 O ( N log ⁡ N ) O(N\log N) O(NlogN)
def FFT(x):"""A recursive implementation of the 1D Cooley-Tukey FFT"""x = np.asarray(x, dtype=float)N = x.shape[0]if N % 2 > 0:raise ValueError("size of x must be a power of 2")elif N <= 32:  # this cutoff should be optimizedreturn DFT_slow(x)else:X_even = FFT(x[::2])X_odd = FFT(x[1::2])factor = np.exp(-2j * np.pi * np.arange(N) / N)return np.concatenate([X_even + factor[:N // 2] * X_odd,X_even + factor[N // 2:] * X_odd])

卷积

  • 卷积本身没有实际意义,它只是一种数学操作,但是卷积是很多场景下都会遇到的一类重复操作,因此单独起名为卷积。下面介绍两个卷积经常出现的场景:线性时不变系统傅里叶级数

线性时不变系统

线性: f ( a x + b y ) = a f ( x ) + b f ( y ) f(ax+by)=af(x)+bf(y) f(ax+by)=af(x)+bf(y); 时不变:系统的属性和时间没有关系

  • 给定线性时不变系统的单位冲激响应 h [ n ] h[n] h[n] (横轴为时间)
    我们想知道输入信号为 x [ n ] x[n] x[n] 时,系统的输出信号 y [ n [ y[n[ y[n[
  • 由于是线性系统,因此可以分别计算 3 个时刻输入信号的输出 ( h [ n − 1 ] h[n-1] h[n−1] 表示 h [ n ] h[n] h[n] 右移 1 个时间单位)
    将 3 个输出相加即可得到 y [ n ] y[n] y[n]
  • 可以看出,计算 y [ n ] y[n] y[n] 的公式即为离散卷积公式
    可以简写为
    y = x ∗ h y=x*h y=x∗h也就是说,在定义了卷积之后,我们就可以说任何一个线性时不变系统的输出就是输入信号和单位冲激响应的卷积

傅里叶级数

  • 考虑两个周期为 2 π 2\pi 2π 的周期函数
    f ( t ) = ∑ n = − ∞ ∞ c n e i n t = ∑ n = − ∞ ∞ c n z n g ( t ) = ∑ n = − ∞ ∞ d n e i n t = ∑ n = − ∞ ∞ d n z n \begin{aligned} f(t)&=\sum_{n=-\infty}^\infty c_ne^{int}=\sum_{n=-\infty}^\infty c_nz^{n}\\ g(t)&=\sum_{n=-\infty}^\infty d_ne^{int}=\sum_{n=-\infty}^\infty d_nz^{n} \end{aligned} f(t)g(t)​=n=−∞∑∞​cn​eint=n=−∞∑∞​cn​zn=n=−∞∑∞​dn​eint=n=−∞∑∞​dn​zn​其中, z = e i t z=e^{it} z=eit. 我们想要求得 f ( t ) g ( t ) f(t)g(t) f(t)g(t) 的傅里叶系数
  • 我们将 f ( t ) , g ( t ) , f ( t ) g ( t ) f(t),g(t),f(t)g(t) f(t),g(t),f(t)g(t) 都展开,可得
    f ( t ) = ⋯ + c − 2 z − 2 + c − 1 z − 1 + c 0 z 0 + c 1 z + c 2 z 2 + ⋯ g ( t ) = ⋯ + d − 2 z − 2 + d − 1 z − 1 + d 0 z 0 + d 1 z + d 2 z 2 + ⋯ f ( t ) g ( t ) = ⋯ + m − 2 z − 2 + m − 1 z − 1 + m 0 z 0 + m 1 z + m 2 z 2 + ⋯ \begin{gathered} f(t)=\cdots+c_{-2} z^{-2}+c_{-1} z^{-1}+c_0 z^0+c_1 z+c_2 z^2+\cdots \\ g(t)=\cdots+d_{-2} z^{-2}+d_{-1} z^{-1}+d_0 z^0+d_1 z+d_2 z^2+\cdots \\ f(t) g(t)=\cdots+m_{-2} z^{-2}+m_{-1} z^{-1}+m_0 z^0+m_1 z+m_2 z^2+\cdots \end{gathered} f(t)=⋯+c−2​z−2+c−1​z−1+c0​z0+c1​z+c2​z2+⋯g(t)=⋯+d−2​z−2+d−1​z−1+d0​z0+d1​z+d2​z2+⋯f(t)g(t)=⋯+m−2​z−2+m−1​z−1+m0​z0+m1​z+m2​z2+⋯​可知,
    m n = c 0 d n + c 1 d n − 1 + c − 1 d n + 1 + ⋯ = ∑ k = − ∞ ∞ c k d n − k m_n=c_0 d_n+c_1 d_{n-1}+c_{-1} d_{n+1}+\cdots=\sum_{k=-\infty}^{\infty} c_k d_{n-k} mn​=c0​dn​+c1​dn−1​+c−1​dn+1​+⋯=k=−∞∑∞​ck​dn−k​因此, f ( t ) g ( t ) f(t)g(t) f(t)g(t) 的傅里叶系数即为 f ( t ) f(t) f(t) 傅里叶系数和 g ( t ) g(t) g(t) 傅里叶系数的卷积

卷积这一节后面还有些内容,以后再看

参考文献

  • 纯干货数学推导_傅里叶级数与傅里叶变换
  • 傅立叶变换夯实基础系列视频
  • 离散傅里叶变换零基础入门
  • a very fast implementation of FFT: pyFFTW package
  • L i n e a r Linear Linear a l g e b r a algebra algebra a n d and and i t s its its a p p l i c a t i o n s applications applications
  • 傅里叶分析之掐死教程(完整版)

more:

  • Understanding the FFT Algorithm
  • FFT with Python

离散傅里叶变换 (DFT)、快速傅里叶变换 (FFT)相关推荐

  1. Matlab如何进行利用离散傅里叶变换DFT (快速傅里叶变换FFT)进行频谱分析

    文章目录 1. 定义 2. 变换和处理 3. 函数 4. 实例演示 例1:单频正弦信号(整数周期采样) 例2:单频正弦信号(非整数周期采样) 例3:含有直流分量的单频正弦信号 例4:正弦复合信号 例5 ...

  2. 【从FT到DFT和FFT】(三)从离散傅里叶变换到快速傅里叶变换

    文章目录 推荐阅读 前言 从离散傅里叶变换到快速傅里叶变换 单位根 对DFT进行分治得到FFT 计算前半截 计算后半截 快速傅里叶逆变换(IFFT) 推荐阅读 前置阅读 [从FT到DFT和FFT](一 ...

  3. 卷积、傅里叶级数、傅里叶变换、快速傅里叶变换、pytorch中的fft,rfft

    卷积: 连续形式: 离散形式:  '卷' :  翻转 和 滑动    '积' : 积分 翻转:g(t)  - >  g(-t) 滑动:g(-t) - > g(n-t) 平移n个单位 举个例 ...

  4. 傅里叶变换与快速傅里叶变换

    傅里叶变换与快速傅里叶变换 作为电子信息专业的学生老说,这个不知道,或者理解不清楚,是十分不应该的,作为一个学渣,有时候确实是理解不清楚的 1.首先离散傅里叶变换目的: 简单点说: 就是将一个信号从时 ...

  5. 图像算法四:【图像增强--频率域】傅里叶变换、快速傅里叶变换、频域滤波、频域低通滤波、频域高通滤波

    频率域滤波与空间域滤波殊途同归,空间域图像增强与频率域图像增强是两种截然不同的技术,实际上在相当程度上说它们是在不同的领域做相同的事情,只是有些滤波更适合在空间域完成,而有些则更适合在频率域中完成. ...

  6. 图像傅里叶变换(快速傅里叶变换FFT)

    学习DIP第7天,图像傅里叶变换 转载请标明出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对 ...

  7. 傅里叶变换 一维快速傅里叶变换(快速的一维离散傅里叶变换、分治法)

    一.介绍 1.一维离散傅里叶变换DFT. DFT:(Discrete Fourier Transform)离散傅里叶变换是傅里叶变换在时域和频域上都呈离散的形式,将信号的时域采样变换为其DTFT的频域 ...

  8. MATLAB之傅里叶变换,快速傅里叶变换FFT

    文章目录 傅里叶变换及傅里叶逆变换定义 窗函数/矩形脉冲信号的傅里叶变换 基于MATLAB的快速傅里叶变换FFT 傅里叶变换及傅里叶逆变换定义 能从时域的非周期连续信号转化到频域非周期连续信号. 窗函 ...

  9. matlab图片快速傅里叶变换,图像傅里叶变换(快速傅里叶变换FFT) | 学步园

    #include "Image_FFT.h" /* 中心化,根据傅里叶性质的平移性质 */ void FFT_Shift(double * src,int size_w,int s ...

  10. 快速傅里叶变换python_快速傅里叶变换及python代码实现

    一.前言 我想认真写好快速傅里叶变换(Fast Fourier Transform,FFT),所以这篇文章会由浅到细,由窄到宽的讲解,但是傅里叶变换对于寻常人并不是很容易理解的,所以对于基础不牢的人我 ...

最新文章

  1. 用node搭一个静态服务
  2. 全球及中国热障涂层材料行业趋势研究及应用前景分析报告2021-2027年
  3. 一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--synchronized...
  4. @value 静态变量_springboot项目使用静态变量通过@Value注解获取配置文件内容
  5. windows 下后台启动 redis
  6. 读书笔记 - 《我的美国之路》
  7. 利用机器学习算法挖掘群控网络黑产设备
  8. 赛效:如何在线给图片加水印
  9. 微信又确定全新封号标准!触犯这几条底线将被永久封号,望周知
  10. 【Linux】Linux环境基础开发工具使用 —— yum | vim | gcc g++ | gdb | make makefile | 进度条 | git
  11. MapX系列-- 开源Mitab
  12. Svn服务器与客户端、AnkhSVN使用
  13. Ubuntu 22.04 解决使用 .AppImage 文件方法
  14. oracle验证手机号sql,oracle判断手机号码是否合法
  15. 计算机专业毕业设计致谢,计算机本科毕业设计致谢
  16. Adode软件全套下载
  17. 自适应网站适合什么行业
  18. 【总结】职业规划和自我总结----------包含职业要求
  19. Github开源:Sheng.RabbitMQ.CommandExecuter (RabbitMQ 的命令模式实现)
  20. 工程项目管理丁士昭第二版_《工程项目管理》丁士昭第二版 重点内容

热门文章

  1. 用echartsjs 实现动态绘制折线、柱状等图形,并实现多图联动效果
  2. onload什么时候执行
  3. WEB前端网页设计-Bootstrap4 信息提示框
  4. insert用法(插入表内容)
  5. swift 点击图片预览,有放大缩小动画
  6. C++小作业——简单通讯录设计
  7. Nacos只发现不注册
  8. Filter基础知识
  9. 每日五题-202112
  10. 数据分析(一)- 数据分析基础及matplotlib