FWI 地震数据的认识

news2024/11/19 13:38:55

目录

1、数据来源。

1)SEG  系列。

2)OpenFWI 系列。

2、数据量,尺寸。

1) SEG 包含两个数据集:SEGSaltData 和 SimulateData。

2)OpenFWI 包含12个数据集:

3、地震数据对应的观测系统。

1) SEG系列

2)OpenFWI系列

4、显示数据的源码

5、正演的原理及源码

6、我的疑问:


地震数据是非常宝贵的资源,很多真实数据并不是公开的,目前在网上流传的都是合成数据。我将从以下角度来介绍合成数据:

1、数据来源。

1)SEG  系列。

数据源自论文: Yang F, Ma J. Deep-learning inversion: A next-generation seismic velocity model building method DL for velocity model building[J]. Geophysics, 2019, 84(4): R583-R599.

作者基于unet架构,实现了端到端的全波形反演,从地震数据直接获得速度模型,并在盐体数据上测试性能。

论文代码:GitHub - YangFangShu/FCNVMB-Deep-learning-based-seismic-velocity-model-building: Deep-learning inversion: A next-generation seismic velocity model building method

2)OpenFWI 系列。

数据源自论文:Deng C, Feng S, Wang H, et al. OpenFWI: Large-scale Multi-structural Benchmark Datasets for Full Waveform Inversion[J]. Advances in Neural Information Processing Systems, 2022, 35: 6007-6020.

数据和代码网址: https://openfwi-lanl.github.io/

它涵盖了地球物理的多个领域(界面、断层、CO2储层等),涵盖了不同的地质地下构造(平面、曲线等),包含了不同数量的数据样本(2K - 67K),还包括3D FWI数据集。此外,比较了三种二维FWI方法:InversionNet[20]提出了一种全卷积网络来模拟地震反演过程;VelocityGAN[27]采用基于gan的模型求解FWI;UPFWI[31]将正演建模与CNN连接在一个回路中,实现无监督学习,无需地面真值速度图进行训练。还有一种三维FWI方法:InversionNet3D[30]将InversionNet扩展到三维领域。为了减少内存占用和提高计算效率(即3D反演中最具挑战性的两个障碍),该网络在编码器中使用了群卷积,并通过基于加性耦合的可逆层采用了部分可逆架构[46]。

2、数据量,尺寸。

1) SEG 包含两个数据集:SEGSaltData 和 SimulateData。

数据集SEGSaltDataSimulateData
数量(train+test)140(130+10)1700(1600+100)
地震数据尺寸400 x 301201 x 301
速度模型尺寸400 x 301201 x 301

2)OpenFWI 包含12个数据集:

其中第二行的 B系列,比第一行的A系列有更高的难度。从左到右,依次为平面(FlatVel-A、FlatVel-B)、曲面(CurveVel-A 、CurveVel-B)、平面断层(FlatFault-A、 FlatFault-B)、曲面断层(CurveFault-A、CurveFault-B)、复杂的野外合成数据(Style-A、Style-B)、二氧化碳储层(Kimberlina-CO2)、三维地震数据(3D Kimberlina-V1)。

在这里要注意,理解下表的尺寸时,如速度模型70x1x70, 中间为1表明是个二维速度模型。

3、地震数据对应的观测系统。

1) SEG系列

 参考星移论文

2)OpenFWI系列

4、显示数据的源码

我的数据都存在.mat文件中:

1)显示地震地震数据:

2)显示速度模型:

5、正演的原理及源码

原理及波动方程公式后续补上。


% 对文件夹内所有文件进行计算并存储
% function [] = forward(vdir,vname,gdir,gname,start_num,end_num)
%     for i = start_num:end_num
%         vfile = [vdir,'/',vname,num2str(i),'.mat']
%         gfile = [gdir,'/',gname,num2str(i),'.mat']
%         calc(vfile,gfile);
%     end
% end

% 对单个速度模型文件计算多炮数据
function [] = forward(vfile,outfile,sn) %sn 炮数
load(vfile,'vmodel');  %加载vfile文件中的vmodel变量
[nz,nx] = size(vmodel);%  201*301
Rec = ones(400,nx,sn);%  400*301 是地震数据的尺寸


%tic用来保存当前时间,而后使用toc来记录程序完成时间,两者往往结合使用
tic;
for i = 1:sn
    sx = i*fix(nx/sn);  % 这一步的意思是放炮的位置是均匀放置的么?
    singleRec = calc(vmodel, sx);
    Rec(:,:,i) = singleRec;
end
toc;

save(outfile,'Rec');
end

% 对单炮速度模型进行计算
function singleRec = calc(vmodel, sx)

[nz,nx] = size(vmodel); % x方向网格数(从左到右 和 z方向网格数(从上到下) 201*301 
npmlz = 10;            	% 顶部和底部的PML层厚度
npmlx = 10;             % 左边和右边的PML层厚度
% sx = 100;                % 震源的x方向网格数
sz = 0;                % 震源的z方向网格数 表明震源在地表
dx = 10;                 % x方向的网格大小 单位:米
dz = 10;                 % y方向的网格大小 单位:米
nt = 2000;               % 计算的总时间步数   在方程的最后下采样5,最后求的400 对应301*400的地震数据尺寸
dt = 1e-3;            	% 单位时间步长度 单位:秒
ampl = 1.0e0;           % 震源子波的震幅
xrcvr = 1:1:nx;         % 地面上x方向的接收器位置
nodr = 3;               % half of the order number for spatial difference.

B = [1 zeros(1,nodr - 1)]';
A = NaN*ones(nodr,nodr);
for i = 1:1:nodr
    A(i,:) = (1:2:2*nodr - 1).^(2*i - 1);
end
C = A\B; 

Nz = nz + 2*npmlz;
Nx = nx + 2*npmlx;


rho = 1000*ones(Nz,Nx);                                                        % 密度; Unit: kg/m^3.  密度对结果有什么影响? 此处密度1000
rho(fix(Nz/3):end,fix(Nx/2):end) = 500;                                        % 通过修改密度,可以模拟介质中存在不同的物理特性,如不均匀的岩层、气体或液体的存在等
vp = padarray(vmodel,[10,10],'replicate','both');                           % 扩展边界
                                                                            % 边界扩展是为了处理波场模拟中的边界效应,确保在模拟过程中声波传播不会超出vmodel的范围。
                                                                            % 通过在vmodel的周围添加额外的边界值,可以避免波场反射和干扰。padarray函数的'replicate'选项表示将vmodel的边界值复制并填充到扩展后的边界上。

f0 = 25;                                                                    % 震源频率 单位 Hz
t0 = 1/f0;                                                                  % the time shift of source Ricker wavelet; Unit: s; Suggest: 0.02 if fm = 50, or 0.05 if fm = 20.
t = dt*(1:1:nt);
src = (1 - 2*(pi*f0.*(t - t0)).^2).*exp( - (pi*f0*(t - t0)).^2);           	% the time series of source wavelet.   雷克子波
% The source wavelet formula refers to the equations (18) of Collino and Tsogka, 2001.

%% Perfectly matched layer absorbing factor PML层吸收因子设置
dpml0z = 3*max(vp(:))/dz*(8/15 - 3/100*npmlz + 1/1500*npmlz^2);
dpmlz = zeros(Nz,Nx);
dpmlz(1:npmlz,:) = (dpml0z*((npmlz: - 1:1)./npmlz).^2)'*ones(1,Nx);
dpmlz(npmlz + nz + 1:Nz,:) = dpmlz(npmlz: - 1:1,:);
dpml0x = 3*max(vp(:))/dx*(8/15 - 3/100*npmlx + 1/1500*npmlx^2);
dpmlx = zeros(Nz,Nx);
dpmlx(:,1:npmlx) = ones(Nz,1)*(dpml0x*((npmlx: - 1:1)./npmlx).^2);
dpmlx(:,npmlx + nx + 1:Nx) = dpmlx(:,npmlx: - 1:1);
% The PML formula refers to the equations (2) and (3) of Marcinkovich and Olsen, 2003.

%% Wavefield calculating  依据广义胡克定律求的弹性系数

% rho1 和 rho2 是密度(rho)的副本。它们用于计算波场的系数,与波场更新方程中的密度项有关。
% Coeffi1 和 Coeffi2 是沿 x 轴和 z 轴方向的PML吸收因子的系数。它们根据PML吸收因子(dpmlx 和 dpmlz)和时间步长(dt)计算得出。这些系数在波场更新方程中用于考虑PML的吸收效果。
% Coeffi3 和 Coeffi4 是与密度(rho)和空间步长(dx 和 dz)相关的系数,用于考虑波场更新方程中的空间导数项。
% Coeffi5 和 Coeffi6 是与密度(rho)和速度(vp)的平方以及空间步长(dx 和 dz)相关的系数,用于考虑波场更新方程中的速度和应力项。
% 这些系数是根据弹性介质的性质和PML吸收层的影响,结合波场更新方程中的相关项,计算得出的。它们的计算方式是基于广义胡克定律和对介质参数的离散化模拟。
% 通过使用这些系数,可以准确地更新波场的值,模拟弹性波在介质中的传播和衰减行为。

rho1 = rho;             % or = [(rho(:,1:end - 1) + rho(:,2:end))./2 (2*rho(:,end) - rho(:,end - 1))];
rho2 = rho;             % or = [(rho(1:end - 1,:) + rho(2:end,:))./2; (2*rho(end,:) - rho(end - 1,:))];

Coeffi1 = (2 - dt.*dpmlx)./(2 + dt.*dpmlx);
Coeffi2 = (2 - dt.*dpmlz)./(2 + dt.*dpmlz);
Coeffi3 = 1./rho1./dx.*(2*dt./(2 + dt.*dpmlx));
Coeffi4 = 1./rho2./dz.*(2*dt./(2 + dt.*dpmlz));
Coeffi5 = rho.*(vp.^2)./dx.*(2*dt./(2 + dt.*dpmlx));
Coeffi6 = rho.*(vp.^2)./dz.*(2*dt./(2 + dt.*dpmlz));

% +++++++++++++++++++++++++++++++++++++ approximate coeffient ++++++++++++++++++++++++++++++++++++++
% Coeffi1 = 1 - dt.*dpmlx;
% Coeffi2 = 1 - dt.*dpmlz;
% Coeffi3 = 1./rho./dx.*dt;
% Coeffi4 = 1./rho./dz.*dt;
% Coeffi5 = rho.*(vp.^2)./dx.*dt;
% Coeffi6 = rho.*(vp.^2)./dz.*dt;
% --------------------------------------------------------------------------------------------------

NZ = Nz + 2*nodr;                                                           % All values of the outermost some columns are set to zero to be a boundary condition: all of wavefield values beyond the left and right boundary are null.
NX = Nx + 2*nodr;                                                           % All values of the outermost some rows are set to zero to be a boundary condition: all of wavefield values beyond the top and bottom boundary are null.

Znodes = nodr + 1:NZ - nodr;
Xnodes = nodr + 1:NX - nodr;
znodes = nodr + npmlz + 1:nodr + npmlz + nz;
xnodes = nodr + npmlx + 1:nodr + npmlx + nx;
nsrcz = nodr + npmlz + sz;
nsrcx = nodr + npmlx + sx;

Ut = NaN*ones(NZ,NX);                                                     % the wavefield value preallocation. 存储波场的值,并在时间步进过程中进行更新
Uz = zeros(NZ,NX);                                                        % The initial condition: all of wavefield values are null before source excitation. 波场在z方向上的速度分量初始条件
Ux = zeros(NZ,NX);                                                        % The initial condition: all of wavefield values are null before source excitation. 波场在x方向上的速度分量初始条件
Vz = zeros(NZ,NX);                                                        % The initial condition: all of wavefield values are null before source excitation. 波场在z方向上的位移分量初始条件
Vx = zeros(NZ,NX);                                                        % The initial condition: all of wavefield values are null before source excitation. 波场在x方向上的位移分量初始条件
Psum = NaN*ones(Nz,Nx);                                                   % 存储波场在不同时间步长上的压力分量的累积和

U = NaN*ones(nz,nx,nt);                                                   % 用于存储完整的波场数据

% tic;
for it = 1:1:nt
    Ux(nsrcz,nsrcx) = Ux(nsrcz,nsrcx) + ampl*src(it)./2;
    Uz(nsrcz,nsrcx) = Uz(nsrcz,nsrcx) + ampl*src(it)./2;
    Ut(:,:) = Ux(:,:) + Uz(:,:);
    U(:,:,it) = Ut(znodes,xnodes);
end
% toc;

syngram(:,:) = U(1,xrcvr,:);
singleRec = syngram';
singleRec = downsample(singleRec,5); % 下采样

end

% 实验



6、我的疑问:

1)评价指标,目前论文SSIM、MAE、RMSE,   地质勘探的角度,有什么评价指标?尤其在自然数据中,工程应用场景下,更希望通过FWI提供什么信息?

2)盐体数据中,地层很薄,对这类的识别是否很重要?

3)地震数据的噪声来源:采集设备、地理环境,哪些噪声对地震数据的影响特别大?

4)地震数据采集后,到目前拿到手上的数据,中间是否经过了别的处理?这种处理是否是加入噪声,或者减少信息量的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/669840.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis原理 - IO详解

原文首更地址,阅读效果更佳! Redis原理 - IO详解 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-IO.html 用户空间与内核空间 任何Linux 系统的发行版,其系统内核都是 Linux 。我们的应用都需要通过 Linux 内核与硬…

02py游戏开发基础

版本 pygame 2.4.0 (SDL 2.26.4, Python 3.8.2) Hello from the pygame community. https://www.pygame.org/contribute.html Python开发基础 Pygame常用模块 background_image_filename "bg.jpg"#设置图像文件名称 mouse_image_filename "ship.bmp"# 将…

JVM优化00

JVM优化 0.目标 了解下我们为什么要学习JVM优化掌握jvm的运行参数以及参数的设置掌握jvm的内存模型(堆内存)掌握jmap命令的使用以及通过MAT工具进行分析掌握定位分析内存溢出的方法掌握jstack命令的使用掌握VisualJVM工具的使用 1.为什么学习JVM优化 …

LeetCode - #82 删除排序链表中的重复元素 II

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…

异常的介绍与处理

目录 第七章 异常 1.异常 2.处理方法 2.1.try-catch 2.2.多重catch块 2.3.finally 2.4.throw 与 throws 2.5.程序分析 3.自定义异常 内容仅供学习交流,如有问题请留言或私信!!!!! 有空您就点点赞…

【计算机视觉】计算机视觉的简单入门代码介绍(含源代码)

文章目录 一、介绍二、项目代码2.1 导入三方包2.2 读取和展示图片2.3 在图像上绘画2.4 混合图像2.5 图像变换2.6 图像处理2.7 特征检测 一、介绍 计算机视觉是一门研究计算机如何理解和解释图像和视频的学科。 它的目标是让计算机能够模拟人类视觉系统,让它们能够识…

Vivado 下 LED 灯闪烁实验

目录 Vivado 下 LED 灯闪烁实验 1、简介 2、实验环境 3、实验任务 4、硬件设计 5、程序设计 5.1、LED 闪烁模块代码 5.2、Vivado 仿真验证 5.2.1、编写 TB 仿真代码 6、下载验证 6.1、添加约束文件 .xdc 6.2、下载验证 注意:一定要先把下载器的一端连接…

FDM3D打印系列——2、一些基础概念

大家好,我是阿赵。 在买3D打印机之前,一般都会很迷茫,不知道3D打印机是怎样工作的,也不知道有哪些地方需要注意。上一篇文章通过打印一个模型,完整的体验了一次FDM打印3D模型的过程。这里解释一些在3D打印里面的比较基…

PMP考试自学可以吗?

PMP考试不建议自学,听劝,不该省的别省。 PMP现在没有自学了,今年3月的考试报了培训班的同学都说难,培训班的资源老师的专业,怎么也比自己单打独斗强吧,真的报培训班省事很多。 PS:网上说包过的…

X86架构与Arm架构区别

X86架构和ARM架构是主流的两种CPU架构,X86架构的CPU是PC服务器行业的老大,ARM架构的CPU则是移动端的老大。X86架构和arm架构实际上就是CISC与RISC之间的区别,很多用户不理解它们两个之间到底有哪些区别,实际就是它们的领域不太相同…

Liunx安装window中文字体解决中文变方框问题

问题现象描述 没安装中文字体,有可能导致你的程序在windows上运行的好好的,部署到linux上运行就可能出现汉字变成小方块的问题,场景举例:svg文件转png图片,原svg中的中文会变成方框 按如下方法安装中文字体后&#xf…

南卡OE骨传导开放式蓝牙耳机评测!舒适与音质并存!

平时买耳机的时候,你最先会关注什么方向呢?是舒适、美观,还是音质、防水? 对于我来说,首先是功能。作为一个经常健身、跑步的人,最讨厌的就是平时运动流汗进入耳朵之后那种粘腻感觉。时间长了还容易让耳道…

凹下去的白色按钮

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>凹下去的按钮</title><style>import url("https://fonts.googleapis.com/css2?famil…

【SIGMOD 2023】深度学习弹性数据流水线系统GoldMiner,大幅提升任务和集群效率

第一板块&#xff1a;开篇 近日&#xff0c;阿里云机器学习平台PAI和北京大学杨智老师团队合作的论文《GoldMiner: Elastic Scaling of Training Data Pre-Processing Pipelines for Deep Learning》被数据库领域顶会SIGMOD 2023接收。 GoldMiner观察到深度学习任务中的数据预…

redis登录常见报错

第一次接触redis登录的时候遇见几个报错 一、使用以下两个命令报错&#xff1a; ./redis-cli -h 127.0.0.1 -p 6380 ./redis-cli -p 6380 报错&#xff1a;Could not connect to Redis at 127.0.0.1:6380: Connection refused 应该和redis.conf中配置的bind字段的IP有关…

一文全揽C/C++中所有指针相关知识点(从原理到示例,学不完根本学不完!!!!)

本篇会对C/C中【常见指针相关知识】一直进行总结迭代&#xff0c;记得收藏吃灰不迷路&#xff0c;一起学习分享喔 请大家批评指正&#xff0c;一起学习呀~ 一、指针基本知识1.1 指针的定义1.2 &#xff08;*&#xff09; 和&#xff08; &&#xff09; 运算符1.3 如何声明…

SM国密算法(四) -- SM3算法

一、简介 SM3密码杂凑算法是中国国家密码管理局2010年公布的中国商用密码杂凑算法标准。适用于商用密码应用中的数字签名和验证。 SM3是在[SHA-256]基础上改进实现的一种算法&#xff0c;其安全性和SHA-256相当。SM3和MD5的迭代过程类似&#xff0c;也采用Merkle-Damgard结构。…

OpenCV(图像处理)-基于python-滤波器(低通、高通滤波器的使用方法)

1.概念介绍2. 图像卷积filter2D() 3. 低通滤波器3.1 方盒滤波和均值滤波boxFilter()blur() 3.2 高斯滤波&#xff08;高斯噪音&#xff09;3.3 中值滤波&#xff08;胡椒噪音&#xff09;3.4 双边滤波 4. 高通滤波器4.1Sobel&#xff08;索贝尔&#xff09;&#xff08;高斯&am…

STL之set和map

目录 一. 原型二. 模板参数适配三. 迭代器四. 插入函数的修改四. 代码 一. 原型 简单实现的红黑树 template<class K, class V> struct RBTreeNode {RBTreeNode<K, V>* _left;RBTreeNode<K, V>* _right;RBTreeNode<K, V>* _parent;pair<K, V> …

FPGA_学习_11_IP核_RAM_乒乓操作

本篇博客学习另一个IP核&#xff0c;RAM。 用RAM实现什么功能呢&#xff1f; 实现乒乓操作。 乒乓操作是什么呢&#xff1f; 参考&#xff1a; FPGA中的乒乓操作思想_fpga中乒乓操作的原因_小林家的龙小年的博客-CSDN博客 何为乒乓操作_fanyuandrj的博客-CSDN博客 以下是本人理…