python绘制地震动傅里叶谱

先说结论

快速傅里叶变换结果为 y k y_k yk,我们需要的傅里叶谱振幅为 F k F_k Fk,二者的关系如下
F k = Δ t ⋅ ∣ y k ∣ F_k =\Delta t\cdot|y_k| Fk=Δtyk
需要注意: F 0 = Δ t / 2 ⋅ ∣ y 0 ∣ F_0 = \Delta t/2\cdot|y_0| F0=Δt/2y0 F N / 2 = Δ t / 2 ⋅ ∣ y N / 2 ∣ F_{N/2} = \Delta t/2\cdot|y_{N/2}| FN/2=Δt/2yN/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=1N/21[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=0N1xmcosN2πkmk=0,1,2,,2N1,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=0N1xmsinN2πkmk=1,2,,2N1(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=0N1(AkiBk)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=2AkiBkk=0,1,2,,N1(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=0N1xmei(2πkm/N)k=0,1,2,,N1(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=0N1xmei(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+b2 cos(α+ϕ),由式(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+Bk2 k=1,2,,N/21(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)ei(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(AkiBk)(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=2T2∣Ck=NTyk=Δtyk
需要注意: F 0 = Δ t / 2 ⋅ ∣ y 0 ∣ F_0 = \Delta t/2\cdot|y_0| F0=Δt/2y0 F N / 2 = Δ t / 2 ⋅ ∣ y N / 2 ∣ F_{N/2} = \Delta t/2\cdot|y_{N/2}| FN/2=Δt/2yN/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,,2N1,2N

欢迎关注作者

@zouxlin3

二维码

参考资料

[1]大崎顺彦. 地震动的谱分析入门[M]. 地震出版社, 2008.
[2]https://docs.scipy.org/doc/scipy/tutorial/fft.html#d-discrete-fourier-transforms

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酒桶在你野区

感谢支持!????

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值