利用f-k滤波分离上行波和下行波的代码

时间: 2023-10-22 22:05:07 浏览: 166
下面是一个基于Python语言的f-k滤波分离上行波和下行波的代码示例: ```python import numpy as np from scipy import fft, ifft def fk_filter(seis_data, dx, dy, f_up, f_down): """ 利用f-k滤波分离上行波和下行波 :param seis_data: 地震数据,二维数组 :param dx: X方向采样间隔 :param dy: Y方向采样间隔 :param f_up: 上行波频率范围,单位Hz :param f_down: 下行波频率范围,单位Hz :return: 上行波数据,下行波数据 """ # 快速傅里叶变换,得到频率域数据 freq_data = fft.fft2(seis_data) # 获取数据长度和宽度,以及X和Y方向上的采样点数 nx, ny = seis_data.shape[1], seis_data.shape[0] nf, nky = nx//2+1, ny//2+1 # 创建频率-波数网格 kx = np.arange(0, nx//2+1) * 2 * np.pi / (nx*dx) ky = np.arange(0, ny//2+1) * 2 * np.pi / (ny*dy) kx = np.concatenate((kx, kx[1:-1][::-1])) ky = np.concatenate((ky, ky[1:-1][::-1])) kx, ky = np.meshgrid(kx, ky) # 计算频率-波数网格上的频率 freq = np.sqrt(kx**2 + ky**2) # 根据上下行波的频率范围选择相应的频率-波数域数据 up_mask = np.logical_and(freq >= f_up-dx/2, freq <= f_up+dx/2) down_mask = np.logical_and(freq >= f_down-dx/2, freq <= f_down+dx/2) up_data = np.zeros((ny, nx), dtype=np.complex) down_data = np.zeros((ny, nx), dtype=np.complex) up_data[up_mask] = freq_data[up_mask] down_data[down_mask] = freq_data[down_mask] # 对选择的频率-波数域数据进行反f-k变换,得到上行波和下行波的时域数据 up_wave = np.real(ifft.ifft2(up_data)) down_wave = np.real(ifft.ifft2(down_data)) # 对时域数据进行滤波,去除噪声和干扰信号,这里使用一个简单的高通滤波器 up_wave = np.where(up_wave > 0, up_wave, 0) down_wave = np.where(down_wave > 0, down_wave, 0) return up_wave, down_wave ``` 使用示例: ```python import matplotlib.pyplot as plt # 生成一个模拟地震数据 t = np.linspace(0, 1, 100) x = np.linspace(0, 1, 50) y = np.linspace(0, 1, 50) xx, yy = np.meshgrid(x, y) seis_data = np.sin(2*np.pi*10*t) * np.exp(-((xx-0.5)**2 + (yy-0.5)**2)/0.1) # 分离上行波和下行波 up_wave, down_wave = fk_filter(seis_data, 0.02, 0.02, 10, 20) # 绘制结果 fig, axs = plt.subplots(2, 2, figsize=(8, 8)) axs[0][0].imshow(seis_data, cmap='seismic', aspect='auto') axs[0][0].set_title('Original data') axs[0][1].imshow(up_wave, cmap='seismic', aspect='auto') axs[0][1].set_title('Up wave') axs[1][0].imshow(down_wave, cmap='seismic', aspect='auto') axs[1][0].set_title('Down wave') axs[1][1].imshow(up_wave+down_wave, cmap='seismic', aspect='auto') axs[1][1].set_title('Up wave + Down wave') plt.tight_layout() plt.show() ``` 该示例中,我们生成了一个模拟地震数据,并利用f-k滤波将上行波和下行波分离出来。最终绘制了原始数据、上行波、下行波和上行波加下行波的图像。

相关推荐

最新推荐

recommend-type

Python利用FFT进行简单滤波的实现

今天小编就为大家分享一篇Python利用FFT进行简单滤波的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

基于陀螺仪和加速度计的四元数互补滤波融合算法

基于陀螺仪和加速度计的四元数互补滤波融合算法,斯坦福虚拟现实课程讲义(英文版)
recommend-type

HyperGraph滤波.docx

本资源主要通过教程学习HyperGraph曲线滤波操作,可以用于汽车整车碰撞的加速度曲线滤波,简单易操作,适合新手学习。
recommend-type

python数字图像处理之高级滤波代码详解

主要介绍了python数字图像处理之高级滤波代码详解,介绍了许多对图像处理的滤波方法,具有一定参考价值,需要的朋友可以了解下。
recommend-type

数字图像处理实验报告-数字图像空间与频率滤波.docx

自己设计理想低通滤波转移函数H(u,v),并通过该转移函数进行低通滤波和高通滤波计算;参考matlab代码如下: 仅对相位部分进行傅立叶反变换后查看结果图像(提示:记傅立叶变换的相位a,利用ifft2对exp(a*i)进行反...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

如何用python编写api接口

在Python中编写API接口可以使用多种框架,其中比较流行的有Flask和Django。这里以Flask框架为例,简单介绍如何编写API接口。 1. 安装Flask框架 使用pip命令安装Flask框架: ``` pip install flask ``` 2. 编写API接口 创建一个Python文件,例如app.py,编写以下代码: ```python from flask import Flask, jsonify app = Flask(__name__) @app.route('/api/hello', methods=['GET']) def hello():
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。