SAC下实现地震波的频率分析、聚束及f-k分析

台阵数据处理方法简介

    参考文献: 严锋, 靳平, & 范广超. (2005). 聚束及f-k分析法在地震台阵数据处理中的应用. 陕西地球物理文集.

1 波形聚束法 Beamforming

    波形聚束可压低噪声,提高信噪比,便于对微弱信号的检测

2 频率-波数谱分析 F-K Analysis

    频率-波数谱分析(即f-k分析),可以得到准确的方位角和慢度值,这两个参数对于震相的识别、关联和定位具有重要价值。

    

SAC 脚本实现

1 波数谱图的理解

    在做 f-k 分析前,先理解《The Seismic Analysis Code: A prime

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
地震信号中包含了许多噪声,这些噪声会影响地震数据的准确性和分析结果的可靠性。一种常用的去噪方法是使用经验模态分解(EMD)技术。 EMD技术是一种基于自适应局部信号分解的方法,它将复杂的非线性信号分解成若干个本征模态函数(IMF),每个IMF代表了一个特定的频率范围。IMF满足两个条件:在任何给定的点上,它的振动频率是局部确定的;在整个时间范围内,它的振动频率是变化的。 EMD去噪的基本步骤如下: 1. 将地震信号分解成若干个IMF,得到一系列IMF和一个残差信号。 2. 对每个IMF进行阈值处理,将小于某个阈值的IMF置为0。 3. 对处理后的IMF进行重构,得到去噪后的地震信号。 下面是一个使用Python实现的EMD去噪代码: ```python import numpy as np import matplotlib.pyplot as plt import pywt from scipy.signal import find_peaks def EMD(signal): # 定义判断IMF的条件 def is_imf(x): # 极值点的数量 num_extrema = 0 # 零点的数量 num_zeros = 0 for i in range(1, len(x) - 1): if (x[i - 1] < x[i] and x[i + 1] < x[i]) or (x[i - 1] > x[i] and x[i + 1] > x[i]): num_extrema += 1 elif (x[i - 1] > x[i] and x[i + 1] < x[i]) or (x[i - 1] < x[i] and x[i + 1] > x[i]): num_zeros += 1 # 极值点和零点的数量相等或相差1为IMF return abs(num_extrema - num_zeros) <= 1 # 分解IMF def decompose(x): imfs = [] while not is_imf(x): h = x while not is_imf(h): # 一阶差分 d = np.diff(h) # 极大值点 max_indices = find_peaks(d, distance=1)[0] # 极小值点 min_indices = find_peaks(-d, distance=1)[0] if len(max_indices) == 0 and len(min_indices) == 0: break # 极值点 indices = np.sort(np.concatenate([max_indices, min_indices])) # 插值 upper_spline = np.interp(np.arange(len(h)), indices, h[indices]) lower_spline = np.interp(np.arange(len(h)), indices, h[indices[::-1]]) # 平均值 m = (upper_spline + lower_spline) / 2 # 计算局部极值点 max_extrema = find_peaks(m, distance=1)[0] min_extrema = find_peaks(-m, distance=1)[0] extrema = np.sort(np.concatenate([max_extrema, min_extrema])) # IMFs imfs.append(h - m) h = m if len(h) > 0: imfs.append(h) x = x - imfs[-1] imfs.append(x) return imfs # 重构信号 def reconstruct(imfs): return np.sum(imfs, axis=0) # 定义阈值处理函数 def threshold(imf, std_multiple): threshold = np.std(imf) * std_multiple imf[np.abs(imf) < threshold] = 0 return imf # EMD分解 imfs = decompose(signal) # 阈值处理 for i in range(len(imfs)): imfs[i] = threshold(imfs[i], 0.1) # 重构信号 signal_hat = reconstruct(imfs) return signal_hat # 读取SAC数据 from obspy import read st = read('data.sac') data = st[0].data # 对数据进行EMD去噪 data_denoised = EMD(data) # 绘制去噪前后的地震信号 plt.figure() plt.subplot(2, 1, 1) plt.plot(data) plt.title('Original data') plt.subplot(2, 1, 2) plt.plot(data_denoised) plt.title('Denoised data') plt.show() ``` 以上代码中,首先定义了一个`EMD`函数,用于对输入的信号进行EMD分解和重构。在`EMD`函数中,我们使用`decompose`函数对信号进行IMF分解,使用`threshold`函数对每个IMF进行阈值处理,然后使用`reconstruct`函数对处理后的IMF进行重构。最后,我们读取SAC数据,对数据进行EMD去噪,并绘制去噪前后的地震信号。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值