我是靠谱客的博主 诚心皮皮虾,最近开发中收集的这篇文章主要介绍傅里叶变换简介,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文链接:个人站 | 简书 | CSDN
版权声明:除特别声明外,本博客文章均采用 BY-NC-SA 许可协议。转载请注明出处。

1. 傅里叶级数 Fourier Series (FS)

傅里叶级数得名于法国数学家约瑟夫·傅里叶,他提出任何函数都可以展开为三角级数。

考虑一个在区间 [ t 0 , t 0 + T ] [t_0, t_0+T] [t0,t0+T] 上可积的函数 f ( t ) f(t) f(t),其傅里叶级数为
f ( t ) = a 0 2 + ∑ n = 1 ∞ ( a n cos ⁡ 2 π n T t + b n sin ⁡ 2 π n T t ) (1) f(t) = dfrac{a_0}2 + sumlimits_{n=1}^inftyleft(a_ncosdfrac{2pi n}Tt + b_nsindfrac{2pi n}Ttright) tag{1} f(t)=2a0+n=1(ancosT2πnt+bnsinT2πnt)(1)
其中
a n = 2 T ∫ t 0 t 0 + T f ( t ) cos ⁡ 2 π n T t d t , n = 0 , 1 , 2 , ⋯ (2) a_n = dfrac2Tint_{t_0}^{t_0+T}f(t)cosdfrac{2pi n}Ttmathrm{d}t, n=0, 1, 2, cdots tag{2} an=T2t0t0+Tf(t)cosT2πntdt,n=0,1,2,(2)
b n = 2 T ∫ t 0 t 0 + T f ( t ) sin ⁡ 2 π n T t d t , n = 1 , 2 , ⋯ (3) b_n = dfrac2Tint_{t_0}^{t_0+T}f(t)sindfrac{2pi n}Ttmathrm{d}t, n=1, 2, cdots tag{3} bn=T2t0t0+Tf(t)sinT2πntdt,n=1,2,(3)
由欧拉公式 e i θ = cos ⁡ θ + i sin ⁡ θ mathrm{e}^{itheta} = costheta+isintheta eiθ=cosθ+isinθ
cos ⁡ θ = 1 2 ( e i θ + e − i θ ) sin ⁡ θ = − i 2 ( e i θ − e − i θ ) (4) begin{aligned} costheta &= dfrac12left(mathrm{e}^{itheta}+mathrm{e}^{-itheta}right)\ sintheta &= -dfrac i2left(mathrm{e}^{itheta}-mathrm{e}^{-itheta}right) end{aligned} tag{4} cosθsinθ=21(eiθ+eiθ)=2i(eiθeiθ)(4)
代入(1)可得
f ( t ) = a 0 2 + ∑ n = 1 ∞ ( a n − i b n 2 e i 2 π n T t + a n + i b n 2 e − i 2 π n T t ) (5) f(t) = dfrac{a_0}2 + sumlimits_{n=1}^inftyleft(dfrac{a_n-ib_n}2mathrm{e}^{ifrac{2pi n}Tt} + dfrac{a_n+ib_n}2mathrm{e}^{-ifrac{2pi n}Tt}right) tag{5} f(t)=2a0+n=1(2anibneiT2πnt+2an+ibneiT2πnt)(5)

c n = { a n − i b n 2 n>0 a 0 2 n=0 a ∣ n ∣ + i b ∣ n ∣ 2 n<0 (6) c_n = begin{cases} dfrac{a_n - ib_n}2 &text{n>0}\ dfrac{a_0}2 &text{n=0}\ dfrac{a_{|n|} + ib_{|n|}}2 &text{n<0} end{cases}tag{6} cn=2anibn2a02an+ibnn>0n=0n<0(6)
则可以得到傅里叶级数的复数形式
f ( t ) = ∑ n = − ∞ + ∞ c n e i 2 π n T t (7) f(t) = sumlimits_{n=-infty}^{+infty}c_nmathrm{e}^{ifrac{2pi n}Tt}tag{7} f(t)=n=+cneiT2πnt(7)
其中
c n = 1 T ∫ t 0 t 0 + T f ( t ) e − i 2 π n T t d t , n = 0 , ± 1 ± 2 , ⋯ (8) c_n = dfrac1Tint_{t_0}^{t_0+T}f(t)mathrm{e}^{-ifrac{2pi n}Tt}mathrm{d}t, qquad n=0, pm1 pm2,cdotstag{8} cn=T1t0t0+Tf(t)eiT2πntdt,n=0,±1±2,(8)

2. 傅里叶变换 Fourier Transform (FT)

傅里叶变换可以看作傅里叶级数的连续形式。

首先考虑定义在 [ − T 2 , T 2 ] [-frac T2, frac T2] [2T,2T] 上的函数的傅里叶级数展开:
f ( t ) = ∑ n = − ∞ + ∞ c n e i 2 π n T t (9) f(t) = sumlimits_{n=-infty}^{+infty}c_nmathrm{e}^{ifrac{2pi n}Tt}tag{9} f(t)=n=+cneiT2πnt(9)
其中
c n = 1 T ∫ − T / 2 T / 2 f ( t ) e − i 2 π n T t d t , n = 0 , ± 1 ± 2 , ⋯ (10) c_n = dfrac1Tint_{-T/2}^{T/2}f(t)mathrm{e}^{-ifrac{2pi n}Tt}mathrm{d}t, qquad n=0, pm1 pm2,cdotstag{10} cn=T1T/2T/2f(t)eiT2πntdt,n=0,±1±2,(10)

Δ ω = 2 π T (11) Deltaomega=dfrac{2pi}Ttag{11} Δω=T2π(11)

f ^ ( n Δ ω ) = T c n = ∫ − T / 2 T / 2 f ( t ) e − i n Δ ω t d t , n = 0 , ± 1 , ± 2 , ⋯ (12) hat{f}(nDeltaomega)=Tc_n=int_{-T/2}^{T/2}f(t)mathrm{e}^{-inDeltaomega t}mathrm{d}t, qquad n=0, pm1, pm2, cdotstag{12} f^(nΔω)=Tcn=T/2T/2f(t)einΔωtdt,n=0,±1,±2,(12)

c n = f ^ ( n Δ ω ) T = Δ ω 2 π f ^ ( n Δ ω ) (13) c_n=dfrac{hat{f}(nDeltaomega)}T=dfrac{Deltaomega}{2pi}hat{f}(nDeltaomega)tag{13} cn=Tf^(nΔω)=2πΔωf^(nΔω)(13)
f ( t ) = ∑ n = − ∞ + ∞ c n e i 2 π n T t = 1 2 π ∑ n = − ∞ + ∞ f ^ ( n Δ ω ) e i n Δ ω t Δ ω (14) begin{aligned} f(t) &= sumlimits_{n=-infty}^{+infty}c_nmathrm{e}^{ifrac{2pi n}Tt} \ &= dfrac1{2pi} sumlimits_{n=-infty}^{+infty}hat{f}(nDeltaomega)mathrm{e}^{inDeltaomega t}Deltaomega end{aligned} tag{14} f(t)=n=+cneiT2πnt=2π1n=+f^(nΔω)einΔωtΔω(14)
T → ∞ Ttoinfty T 时, n Δ ω → ω nDeltaomegatoomega nΔωω Δ ω → d ω Deltaomegatomathrm{d}omega Δωdω, (14) 中的求和变为积分
f ( t ) = 1 2 π ∫ − ∞ + ∞ f ^ ( ω ) e i ω t d ω (15) f(t) = dfrac1{2pi}int_{-infty}^{+infty}hat{f}(omega)mathrm{e}^{iomega t}mathrm{d}omegatag{15} f(t)=2π1+f^(ω)eiωtdω(15)
相应地,(12) 变为
f ^ ( ω ) = ∫ − ∞ + ∞ f ( t ) e − i ω t d t (16) hat{f}(omega)=int_{-infty}^{+infty}f(t)mathrm{e}^{-iomega t}mathrm{d}ttag{16} f^(ω)=+f(t)eiωtdt(16)
(16) 称为傅里叶变换,记作 f ^ ( ω ) = F [ f ] ( t ) hat{f}(omega) = mathcal F[f](t) f^(ω)=F[f](t);(15) 称为傅里叶变换的逆变换,记作 f ( t ) = F − 1 [ f ^ ] ( ω ) f(t) = mathcal F^{-1}[hat{f}](omega) f(t)=F1[f^](ω)。在信号分析中, f ( t ) f(t) f(t) 称为信号的时域表示, f ^ ( ω ) hat{f}(omega) f^(ω) 称为信号的频域表示。

需要明确的是,不管是用时域还是用频域来表示一个信号,它们代表的都是同一个信号。可以从线性空间的角度理解这一点。同一个信号在不同的表象(或者说基向量)下具有不同的坐标。同一个向量在不同表象下的坐标可以通过一个线性变换联系起来。如果是有限维的空间,这个线性变换可以表示为一个矩阵。而傅里叶变换则是无限维空间不同表象之间的一种变换。举例来说,在量子力学中,一个波函数的坐标表象到动量表象间的变换就是一个傅里叶变换。

也可以将角频率 ω omega ω 替换为自然频率 ν nu ν,有 ω = 2 π ν omega = 2pinu ω=2πν,则
f ^ ( ν ) = F f ( t ) = ∫ − ∞ + ∞ f ( t ) e − i 2 π ν t d t (17) hat{f}(nu) =mathcal Ff(t)= int_{-infty}^{+infty}f(t)mathrm{e}^{-i2pinu t}mathrm{d}ttag{17} f^(ν)=Ff(t)=+f(t)ei2πνtdt(17)
f ( t ) = F − 1 f ^ ( ν ) = ∫ − ∞ + ∞ f ^ ( ξ ) e i 2 π ν t d ν (18) f(t) =mathcal F^{-1}hat{f}(nu) = int_{-infty}^{+infty}hat{f}(xi)mathrm{e}^{i2pinu t}mathrm{d}nutag{18} f(t)=F1f^(ν)=+f^(ξ)ei2πνtdν(18)

3. 离散时间傅里叶变换 Discrete-time Fourier Transform (DTFT)

一般情况下,我们处理的信号都是离散的。取 f ( t ) f(t) f(t) 在时间上的离散采样
f n = f ( n τ ) , n = 0 , ± 1 , ± 2 , ⋯ (19) f_n = f(ntau), qquad n=0, pm1, pm2, cdotstag{19} fn=f(nτ),n=0,±1,±2,(19)
τ tau τ 是采样的时间间隔。傅里叶变换只能作用在连续函数上,为此我们引入
f s ( t ) = f ( t ) ∑ n = − ∞ + ∞ δ ( t − n τ ) = ∑ n = − ∞ + ∞ f ( t ) δ ( t − n τ ) = ∑ n = − ∞ + ∞ f n δ ( t − n τ ) (20) begin{aligned} f_s(t) &= f(t)sumlimits_{n=-infty}^{+infty}delta(t-ntau)\ &=sumlimits_{n=-infty}^{+infty}f(t)delta(t-ntau)\ &=sumlimits_{n=-infty}^{+infty}f_ndelta(t-ntau) end{aligned} tag{20} fs(t)=f(t)n=+δ(tnτ)=n=+f(t)δ(tnτ)=n=+fnδ(tnτ)(20)
其中
δ ( x ) = { + ∞ , x = 0 0 , x ≠ 0 (21) delta(x) = begin{cases} +infty, &x=0\ 0, &xneq0 end{cases} tag{21} δ(x)={+,0,x=0x=0(21)
为 Dirac 函数。 ∑ n = − ∞ + ∞ δ ( t − n τ ) sumlimits_{n=-infty}^{+infty}delta(t-ntau) n=+δ(tnτ) 称为 Dirac 梳子,亦称 Shah 分布,是一个采样函数,常用在数字信号处理和离散时间信号分析中。

f s ( t ) f_s(t) fs(t) 作傅里叶变换
f ^ s ( ω ) = ∫ − ∞ + ∞ f s ( t ) e − i ω t d t = ∫ − ∞ + ∞ ∑ n = − ∞ + ∞ f ( t ) δ ( t − n τ ) e − i ω t d t = ∑ n = − ∞ + ∞ ∫ − ∞ + ∞ δ ( t − n τ ) f ( t ) e − i ω t d t = ∑ n = − ∞ + ∞ f n e − i ω n τ (22) begin{aligned} hat{f}_s(omega)&=int_{-infty}^{+infty}f_s(t)mathrm{e}^{-iomega t}mathrm{d}t\ &=int_{-infty}^{+infty}sumlimits_{n=-infty}^{+infty}f(t)delta(t-ntau)mathrm{e}^{-iomega t}mathrm{d}t\ &=sumlimits_{n=-infty}^{+infty}int_{-infty}^{+infty}delta(t-ntau)f(t)mathrm{e}^{-iomega t}mathrm{d}t\ &=sumlimits_{n=-infty}^{+infty}f_nmathrm{e}^{-iomega ntau} end{aligned} tag{22} f^s(ω)=+fs(t)eiωtdt=+n=+f(t)δ(tnτ)eiωtdt=n=++δ(tnτ)f(t)eiωtdt=n=+fneiωnτ(22)
这里利用了 Dirac 函数的性质 ∫ − ∞ + ∞ δ ( x ) g ( x ) d x = g ( 0 ) int_{-infty}^{+infty}delta(x)g(x)mathrm dx=g(0) +δ(x)g(x)dx=g(0)。(22) 即为离散时间傅里叶变换。

下面简单介绍一下采样定理。若原信号 f ( t ) f(t) f(t) 不包含高于 Ω m Omega_m Ωm 的频率,即 f ^ ( ω ) = 0 , ∀ ∣ ω ∣ > Ω m hat{f}(omega) = 0,forall |omega| > Omega_m f^(ω)=0,ω>Ωm,则只要采样频率 ω s ≥ 2 Ω m omega_sgeq2Omega_m ωs2Ωm,时域采样就能完全重建原信号。

f ^ ( ω ) hat{f}(omega) f^(ω) [ − ω s 2 , ω s 2 ] [-frac{omega_s}2, frac{omega_s}2] [2ωs,2ωs] 上展开为傅里叶级数
f ^ ( ω ) = ∑ m = − ∞ + ∞ c m e i 2 π m ω s ω (23) hat{f}(omega) = sumlimits_{m=-infty}^{+infty}c_mmathrm e^{ifrac{2pi m}{omega_s}omega}tag{23} f^(ω)=m=+cmeiωs2πmω(23)
其中
c m = 1 ω s ∫ − ω s / 2 ω s / 2 f ^ ( ω ) e − i 2 π m ω s ω d ω (24) c_m = frac 1{omega_s}int_{-omega_s/2}^{omega_s/2}hat{f}(omega)mathrm e^{-ifrac{2pi m}{omega_s}omega}mathrm domegatag{24} cm=ωs1ωs/2ωs/2f^(ω)eiωs2πmωdω(24)
注意到 ∣ ω ∣ > Ω m |omega|>Omega_m ω>Ωm f ^ ( ω ) = 0 hat{f}(omega) = 0 f^(ω)=0,而 ω s ≥ 2 Ω m omega_sgeq2Omega_m ωs2Ωm,故 ∣ ω ∣ > ω s / 2 |omega|>omega_s/2 ω>ωs/2 f ^ ( ω ) = 0 hat{f}(omega) = 0 f^(ω)=0,因此 (24) 可改写为
c m = 1 ω s ∫ − ∞ + ∞ f ^ ( ω ) e − i 2 π m ω s ω d ω = 2 π ω s f ( − 2 π ω s m ) = τ f ( − m τ ) = τ f − m (25) begin{aligned} c_m &= frac 1{omega_s}int_{-infty}^{+infty}hat{f}(omega)mathrm e^{-ifrac{2pi m}{omega_s}omega}mathrm domega\ &=frac{2pi}{omega_s}f(-frac{2pi}{omega_s}m)\ &=tau f(-mtau)\ &=tau f_{-m} end{aligned} tag{25} cm=ωs1+f^(ω)eiωs2πmωdω=ωs2πf(ωs2πm)=τf(mτ)=τfm(25)
代入 (23),得
f ^ ( ω ) = ∑ m = − ∞ + ∞ τ f − m e i 2 π m ω s ω = ∑ n = − ∞ + ∞ τ f n e − i 2 π n ω s ω = τ ∑ n = − ∞ + ∞ f n e − i ω n τ = τ f ^ s ( ω ) (26) begin{aligned} hat{f}(omega) &= sumlimits_{m=-infty}^{+infty}tau f_{-m}mathrm e^{ifrac{2pi m}{omega_s} omega}\ &= sumlimits_{n=-infty}^{+infty}tau f_{n}mathrm e^{-ifrac{2pi n}{omega_s}omega}\ &= tausumlimits_{n=-infty}^{+infty}f_nmathrm{e}^{-iomega ntau }\ &= tauhat{f}_s(omega) end{aligned} tag{26} f^(ω)=m=+τfmeiωs2πmω=n=+τfneiωs2πnω=τn=+fneiωnτ=τf^s(ω)(26)
这里 n = − m n=-m n=m。(26) 说明原信号的傅里叶变换可以由采样信号确定,进而可以利用傅里叶逆变换重建原信号。

此外,不难发现
f ^ s ( ω ) = ∑ n = − ∞ + ∞ f n e − i ω n τ = ∑ n = − ∞ + ∞ f n e − i 2 π n ω ω s (27) begin{aligned} hat{f}_s(omega) &= sumlimits_{n=-infty}^{+infty}f_n mathrm{e}^{-iomega ntau } \ &= sumlimits_{n=-infty}^{+infty}f_nmathrm{e}^{-i2pi nfrac omega{omega_s}} end{aligned} tag{27} f^s(ω)=n=+fneiωnτ=n=+fnei2πnωsω(27)
是一个周期为 ω s omega_s ωs 的周期函数。离散傅里叶变换 f ^ s ( ω ) hat{f}_s(omega) f^s(ω)可以看作原信号连续傅里叶变换 f ^ ( ω ) hat{f}(omega) f^(ω)的周期延拓,时域的离散化造成了频域的周期化。

4. 离散傅里叶变换 Discrete Fourier Transform (DFT)

离散时间傅里叶变换在频域上仍然是连续的。如果把频域也离散化,就得到了离散傅里叶变换。
f ^ k = ∑ n = 0 N − 1 f n e − i 2 π N n k , k = 0 , 1 , ⋯   , N − 1 (28) hat{f}_k = sumlimits_{n=0}^{N-1}f_nmathrm{e}^{-ifrac{2pi}Nnk}, qquad k=0, 1, cdots, N-1tag{28} f^k=n=0N1fneiN2πnk,k=0,1,,N1(28)
也可以写成矩阵形式
[ f ^ 0 f ^ 1 f ^ 2 ⋮ f ^ N − 1 ] = [ 1 1 1 ⋯ 1 1 φ φ 2 ⋯ φ N − 1 1 φ 2 φ 4 ⋯ φ 2 ( N − 1 ) ⋮ ⋮ ⋮ ⋱ ⋮ 1 φ N − 1 φ 2 ( N − 1 ) ⋯ φ ( N − 1 ) 2 ] [ f 0 f 1 f 2 ⋮ f N − 1 ] (29) left[ begin{matrix} hat{f}_0\ hat{f}_1\ hat{f}_2\ vdots\ hat{f}_{N-1} end{matrix} right] =left[ begin{matrix} 1 & 1 & 1 & cdots & 1\ 1 & varphi & varphi^2 & cdots & varphi^{ N-1}\ 1 & varphi^2 &varphi^4 & cdots & varphi^{2(N-1)}\ vdots & vdots & vdots & ddots & vdots\ 1 & varphi^{N-1} & varphi^{2(N-1)} & cdots & varphi^{(N-1)^2} end{matrix} right] left[ begin{matrix} f_0\ f_1\ f_2\ vdots\ f_{N-1} end{matrix} right] tag{29} f^0f^1f^2f^N1=11111φφ2φN11φ2φ4φ2(N1)1φN1φ2(N1)φ(N1)2f0f1f2fN1(29)
其中 φ = e − i 2 π / N varphi=mathrm e^{-i2pi/N} φ=ei2π/N

离散傅里叶变换的逆变换为
f n = 1 N ∑ k = 0 N − 1 f ^ k e i 2 π N n k , n = 0 , 1 , ⋯   , N − 1 (30) f_n = frac{1}{N}sumlimits_{k=0}^{N-1}hat{f}_kmathrm e^{ifrac{2pi}{N}nk}, qquad n=0, 1, cdots, N-1 tag{30} fn=N1k=0N1f^keiN2πnk,n=0,1,,N1(30)

5. 快速傅里叶变换 Fast Fourier Transform (FFT)

直接根据定义计算离散傅里叶变换的复杂度是 O ( N 2 ) O(N^2) O(N2)。快速傅里叶变换是快速计算离散傅里叶变换及其逆变换的一类数值算法。FFT 通过把 DFT 矩阵分解为稀疏矩阵之积,能够将复杂度降低到 O ( N log ⁡ N ) O(Nlog N) O(NlogN)

在 Python 中可以利用 scipy.fftpack 进行快速傅里叶变换。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from scipy.fftpack import fft, ifft

x = np.linspace(0, 2*np.pi, 200) # 采样频率为 200Hz
y = np.cos(5*x) + 0.5*np.sin(25*x) + 0.3*np.cos(75*x) # 根据采样定理,信号中不能包含超过 100Hz 的频率成分
plt.figure(figsize=(10,12))
ax1 = plt.subplot(311)
ax1.plot(x, y, 'r')
ax1.set_title('original signal in time domain')

Y = fft(y) # 快速傅里叶变换,得到频域
ax2 = plt.subplot(323)
ax2.plot(range(200), abs(Y))
ax2.set_title('original signal in frequency domain')

Y[10:-9] = 0 # 滤波
ax3 = plt.subplot(324)
ax3.plot(range(200), abs(Y))
ax3.set_title('filtered signal in frequency domain')

filtered = ifft(Y).real # 逆变换,得到滤波后的时域信号
ax4 = plt.subplot(313)
ax4.plot(x, filtered, 'g')
ax4.set_title('filtered signal in time domain')

参考文献

  1. 小波与傅里叶分析基础(第二版), 电子工业出版社,2017.6
  2. Fourier transform - Wikipeida https://en.wikipedia.org/wiki/Fourier_transform
  3. Discrete-time Fourier transform - Wikipedia https://en.wikipedia.org/wiki/Discrete-time_Fourier_transform
  4. Discrete Fourier transform - Wikipedia https://en.wikipedia.org/wiki/Discrete_Fourier_transform
  5. Discrete Fourier transforms (scipy.fftpack) https://docs.scipy.org/doc/scipy/reference/fftpack.html

最后

以上就是诚心皮皮虾为你收集整理的傅里叶变换简介的全部内容,希望文章能够帮你解决傅里叶变换简介所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部