先说结论
快速傅里叶变换结果为
y
k
y_k
yk,我们需要的傅里叶谱振幅为
F
k
F_k
Fk,二者的关系如下
F
k
=
Δ
t
⋅
∣
y
k
∣
F_k =\Delta t\cdot|y_k|
Fk=Δt⋅∣yk∣
需要注意:
F
0
=
Δ
t
/
2
⋅
∣
y
0
∣
F_0 = \Delta t/2\cdot|y_0|
F0=Δt/2⋅∣y0∣,
F
N
/
2
=
Δ
t
/
2
⋅
∣
y
N
/
2
∣
F_{N/2} = \Delta t/2\cdot|y_{N/2}|
FN/2=Δt/2⋅∣yN/2∣
python代码
import numpy as np
from scipy.fft import fft
def fourier(ag, dt):
n = len(ag) - 1
fw = fft(ag)
i_half = n // 2
fw_half = fw[:i_half + 1] # 取单边频谱
ampl = np.abs(fw_half) * dt # 幅值
ampl[0] = 0. # 直流分量置零
ampl[-1] = ampl[-1] / 2
freq = np.linspace(0, 1 / (2 * dt), i_half + 1)
return ampl, freq
原因
1 地震动的傅里叶变换与逆变换
地震动
x
m
x_m
xm是离散值,傅里叶逆变换为
x
m
=
A
0
2
+
∑
k
=
1
N
/
2
−
1
[
A
k
cos
2
π
k
m
N
+
B
k
sin
2
π
k
m
N
]
+
A
N
/
2
2
cos
2
π
(
N
/
2
)
m
N
(1)
x_m=\frac{A_{0}}{2}+\sum_{k=1}^{N / 2-1}\left[A_{k} \cos \frac{2 \pi k m}{N }+B_{k} \sin \frac{2 \pi k m}{N }\right]+\frac{A_{N / 2}}{2} \cos \frac{2 \pi(N / 2) m}{N }\tag{1}
xm=2A0+k=1∑N/2−1[AkcosN2πkm+BksinN2πkm]+2AN/2cosN2π(N/2)m(1)
傅里叶变换为
A
k
=
2
N
∑
m
=
0
N
−
1
x
m
cos
2
π
k
m
N
k
=
0
,
1
,
2
,
⋯
,
N
2
−
1
,
N
2
(2)
A_{k}=\frac{2}{N} \sum_{m=0}^{N-1} x_{m} \cos \frac{2 \pi k m}{N} \quad k=0,1,2, \cdots, \frac{N}{2}-1, \frac{N}{2}\tag{2}
Ak=N2m=0∑N−1xmcosN2πkmk=0,1,2,⋯,2N−1,2N(2)
B
k
=
2
N
∑
m
=
0
N
−
1
x
m
sin
2
π
k
m
N
k
=
1
,
2
,
⋯
,
N
2
−
1
(3)
B_{k}=\frac{2}{N} \sum_{m=0}^{N-1} x_{m} \sin \frac{2 \pi k m}{N} \quad k=1,2, \cdots, \frac{N}{2}-1 \tag{3}
Bk=N2m=0∑N−1xmsinN2πkmk=1,2,⋯,2N−1(3)
A
k
A_k
Ak为有限傅里叶余弦系数,
B
k
B_k
Bk为有限傅里叶正弦系数,
A
k
A_k
Ak比
B
k
B_k
Bk多两个。上述公式的推导过程不在此赘述。
2 复数表示的傅里叶变换和逆变换
根据欧拉公式
e
±
i
θ
=
cos
θ
±
i
sin
θ
\mathrm{e}^{\pm \mathrm{i} \theta}=\cos \theta \pm \mathrm{i} \sin \theta
e±iθ=cosθ±isinθ,可以转化傅里叶逆变换式(1)为复数形式
x
m
=
1
2
∑
k
=
0
N
−
1
(
A
k
−
i
B
k
)
e
i
(
2
π
k
m
/
N
)
(4)
x_{m}=\frac{1}{2} \sum_{k=0}^{N-1}\left(A_{k}-\mathrm{i} B_{k}\right) \mathrm{e}^{\mathrm{i}(2 \pi k m / N)} \tag{4}
xm=21k=0∑N−1(Ak−iBk)ei(2πkm/N)(4)
可以得到复傅里叶系数和有限傅里叶系数的关系
C
k
=
A
k
−
i
B
k
2
k
=
0
,
1
,
2
,
⋯
,
N
−
1
(5)
C_k=\frac{A_k-\mathrm{i}B_k}{2}\quad k=0,1,2, \cdots, N-1 \tag{5}
Ck=2Ak−iBkk=0,1,2,⋯,N−1(5)
相应的复数形式的傅里叶变换为
C
k
=
1
N
∑
m
=
0
N
−
1
x
m
e
−
i
(
2
π
k
m
/
N
)
k
=
0
,
1
,
2
,
⋯
,
N
−
1
(6)
C_{k}=\frac{1}{N} \sum_{m=0}^{N-1} x_{m} \mathrm{e}^{-\mathrm{i}(2 \pi k m / N)} \quad k=0,1,2, \cdots, N-1 \tag{6}
Ck=N1m=0∑N−1xme−i(2πkm/N)k=0,1,2,⋯,N−1(6)
3 python中的快速傅里叶变换
python中scipy库快速傅里叶变换的结果是下式中的
y
k
y_k
yk
y
k
=
∑
m
=
0
N
−
1
x
m
e
−
i
(
2
π
k
m
/
N
)
(7)
y_k=\sum_{m=0}^{N-1} x_m e^{-i(2 \pi km/N)} \tag{7}
yk=m=0∑N−1xme−i(2πkm/N)(7)
对比式(7)和式(8),可以发现二者相差
1
/
N
1/N
1/N
4 傅里叶谱振幅与相位
根据三角函数的关系式
a
cos
α
+
b
sin
α
=
a
2
+
b
2
cos
(
α
+
ϕ
)
a \cos \alpha+b \sin \alpha=\sqrt{a^{2}+b^{2}} \cos (\alpha+\phi)
acosα+bsinα=a2+b2cos(α+ϕ),由式(1)得,地震动傅里叶谱的振幅
X
k
X_k
Xk为
X
k
=
A
k
2
+
B
k
2
k
=
1
,
2
,
⋯
,
N
/
2
−
1
(8)
X_{k}=\sqrt{A_{k}^{2}+B_{k}^{2}}\quad k=1,2,\cdots,N/2-1 \tag{8}
Xk=Ak2+Bk2k=1,2,⋯,N/2−1(8)
需要注意:
X
0
=
A
0
/
2
X_0=A_0/2
X0=A0/2、
X
N
/
2
=
A
N
/
2
/
2
X_{N/2}=A_{N/2}/2
XN/2=AN/2/2
相位为
ϕ
k
=
arctan
(
−
B
k
A
k
)
−
π
<
ϕ
k
<
π
(9)
\phi_{k}=\arctan \left(-\frac{B_{k}}{A_{k}}\right) \quad-\pi<\phi_{k}<\pi\tag{9}
ϕk=arctan(−AkBk)−π<ϕk<π(9)
需要注意:
ϕ
0
=
0
\phi_0=0
ϕ0=0、
ϕ
N
/
2
=
0
\phi_{N/2}=0
ϕN/2=0
5 傅里叶积分
上面的所有处理初看起来是处理有限时间
T
T
T内的现象,实际上是处理周期为
T
T
T的无限次反复现象。
而我们需要处理的地震动是在某一时刻开始,持续一段时间后就结束的不具有重复性的现象。因此,把处理对象扩展为定义于
−
∞
⩽
t
⩽
∞
-\infty \leqslant t \leqslant \infty
−∞⩽t⩽∞的非周期函数
x
(
t
)
x(t)
x(t)
x
(
t
)
x(t)
x(t)的傅里叶变换(也即傅里叶积分,具体推导过程还需要经过傅里叶级数,不在此赘述)
F
(
f
)
=
∫
−
∞
∞
x
(
t
)
e
−
i
(
2
π
f
t
)
d
t
(10)
F(f)=\int^{\infty}_{-\infty}x(t)\mathrm{e}^{-\mathrm{i}(2\pi ft)}\mathrm{d}t \tag{10}
F(f)=∫−∞∞x(t)e−i(2πft)dt(10)
T
C
k
TC_k
TCk的极限为
F
(
f
)
F(f)
F(f),根据式(5)得
T
C
k
=
T
2
(
A
k
−
i
B
k
)
(11)
TC_k=\frac{T}{2}(A_k-\mathrm{i}B_k) \tag{11}
TCk=2T(Ak−iBk)(11)
根据式(8)可以得到,傅里叶谱振幅的最终结果要乘以
T
/
2
T/2
T/2
总结
python中scipy库的fft结果为
y
k
y_k
yk,我们需要的傅里叶谱振幅为
F
k
F_k
Fk,根据式(5)(6)(7)(8)(11),得到二者的关系
F
k
=
T
2
X
k
=
T
2
⋅
2
∣
C
k
∣
=
T
N
∣
y
k
∣
=
Δ
t
⋅
∣
y
k
∣
F_k = \frac{T}{2}X_k=\frac{T}{2}\cdot2|C_k|=\frac{T}{N}|y_k|=\Delta t\cdot|y_k|
Fk=2TXk=2T⋅2∣Ck∣=NT∣yk∣=Δt⋅∣yk∣
需要注意:
F
0
=
Δ
t
/
2
⋅
∣
y
0
∣
F_0 = \Delta t/2\cdot|y_0|
F0=Δt/2⋅∣y0∣,
F
N
/
2
=
Δ
t
/
2
⋅
∣
y
N
/
2
∣
F_{N/2} = \Delta t/2\cdot|y_{N/2}|
FN/2=Δt/2⋅∣yN/2∣
频率
f k = k N Δ t k = 0 , 1 , 2 , ⋯ , N 2 − 1 , N 2 f_{k}=\frac{k}{N \Delta t}\quad k=0, 1,2, \cdots, \frac{N}{2}-1, \frac{N}{2} fk=NΔtkk=0,1,2,⋯,2N−1,2N
欢迎关注作者
参考资料
[1]大崎顺彦. 地震动的谱分析入门[M]. 地震出版社, 2008.
[2]https://docs.scipy.org/doc/scipy/tutorial/fft.html#d-discrete-fourier-transforms