FWI 地震数据的认识

目录

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

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值