学习笔记:波动方程逆时偏移算法

波动方程逆时偏移算法

分享下近期学习的逆时偏移相关算法,以下内容来源于网页地址,网站所提供的代码很全面(可直接下载),可以修改代码用于地震勘探数据处理。

以下是计算结果。
part1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

part1

vel=[repmat(1000,[1,30]), repmat(1200,[1,30]), repmat(1500,[1,21])];
vel=repmat(vel',[1 201]);
[nz,nx]=size(vel); dx=5; x = (0:nx-1)*dx; z = (0:nz-1)*dx;

sx = (nx-1)/2*dx; sz = 0;
gx=(0:2:(nx-1))*dx; gz=zeros(size(gx));

nbc=40; nt=2001; dt=0.0005;isFS=false;

freq=25; s=ricker(freq,dt);


figure(1);set(gcf,'position',[0 0 800 400]);subplot(221);imagesc(x,z,vel);colorbar;
xlabel('X (m)'); ylabel('Z (m)'); title('velocity');
figure(1);subplot(222);plot((0:numel(s)-1)*dt,s);
xlabel('Time (s)'); ylabel('Amplitude');title('wavelet');


tic;seis=a2d_mod_abc28_snapshot(vel,nbc,dx,nt,dt,s,sx,sz,gx,gz,isFS);toc;

part2

clc
close all
clear 


vel=[repmat(1000,[1,30]), repmat(1200,[1,30]), repmat(1500,[1,21])];
vel=repmat(vel',[1 201]);[nz,nx]=size(vel); dx=5; x = (0:nx-1)*dx; z = (0:nz-1)*dx;

sx = (nx-1)/2*dx; sz = 0;
gx=(0:2:(nx-1))*dx; gz=zeros(size(gx)); ng=numel(gx); g=1:ng;

nbc=40; nt=2001; dt=0.0005; t=(0:nt-1)*dt;isFS=false;freq=25; s=ricker(freq,dt);

tic;seis=a2d_mod_abc28(vel,nbc,dx,nt,dt,s,sx,sz,gx,gz,isFS);toc;

[vel_ss,refl_ss]=vel_smooth(vel,3,3,1);

figure(3);set(gcf,'position',[0 0 1000 400]);subplot(231);imagesc(x,z,vel);colorbar;
xlabel('X (m)'); ylabel('Z (m)'); title('velocity');
figure(3); subplot(232);imagesc(g,t,seis);colormap(gray);
title('Seismic Profile');ylabel('Time (s)');xlabel('g #');caxis([-0.25 0.25]);

tic;[img,illum]=a2d_rtm_abc28_snapshot(seis,vel_ss,nbc,dx,nt,dt,s,sx,sz,gx,gz);toc;
figure(4); set(gcf,'position',[0 0 400 600]);colormap(gray);
subplot(311);imagesc(x,z,img);caxis([-10 10]);
xlabel('X (m)'); ylabel('Z (m)'); title('rtm image');
figure(4);subplot(312);imagesc(x,z,illum);caxis([-100 100]);
xlabel('X (m)'); ylabel('Z (m)'); title('illumination compensation');
figure(4);subplot(313);imagesc(x,z,img./illum);caxis([-1 1]);
xlabel('X (m)'); ylabel('Z (m)'); title('rtm image after compensation');

vel_homo=zeros(size(vel))+min(vel(:));
tic;seis_homo=a2d_mod_abc28(vel_homo,nbc,dx,nt,dt,s,sx,sz,gx,gz,isFS);toc;
figure(3);set(gcf,'position',[0 0 1000 400]);subplot(231);imagesc(x,z,vel);colorbar;
xlabel('X (m)'); ylabel('Z (m)'); title('velocity');
seis=seis-seis_homo;
figure(3); subplot(232);imagesc(g,t,seis);figure_title='Seismic Profile';
title(figure_title);ylabel('Time (s)');xlabel('g #');caxis([-0.25 0.25]);
[img,illum]=a2d_rtm_abc28_snapshot(seis,vel_ss,nbc,dx,nt,dt,s,sx,sz,gx,gz);
figure(5); set(gcf,'position',[0 0 400 600]);colormap(gray);
subplot(311);imagesc(x,z,img);caxis([-10 10]);xlabel('X (m)'); ylabel('Z (m)'); title('rtm image');
figure(5);subplot(312);imagesc(x,z,illum);caxis([-100 100]);xlabel('X (m)'); ylabel('Z (m)'); title('illumination compensation');
figure(5);subplot(313);imagesc(x,z,img./illum);caxis([-1 1]);xlabel('X (m)'); ylabel('Z (m)'); title('rtm image after compensation');

part3

clc
close all
clear

vel=[repmat(1000,[1,30]), repmat(1200,[1,30]), repmat(1500,[1,21])];
vel=repmat(vel',[1 201]); [nz,nx]=size(vel); dx=5; x = (0:nx-1)*dx; z = (0:nz-1)*dx;

sx = (nx-1)/2*dx; sz = 0; gx=(0:2:(nx-1))*dx; gz=zeros(size(gx));

nbc=40; nt=2001; dt=0.0005; t=(0:nt-1)*dt;isFS=false;freq=25; s=ricker(freq,dt);

[vel_ss,refl_ss]=vel_smooth(vel,3,3,1);

figure(2);set(gcf,'position',[0 0 1000 500]);colormap(gray);
subplot(231);imagesc(x,z,vel_ss);colorbar;
xlabel('X (m)'); ylabel('Z (m)'); title('smooth velocity');
figure(2);subplot(232);imagesc(x,z,refl_ss);colorbar;
xlabel('X (m)'); ylabel('Z (m)'); title('reflectivity');
figure(2);subplot(233);plot((0:numel(s)-1)*dt,s);
xlabel('Time (s)'); ylabel('Amplitude');title('wavelet');

tic;seis=a2d_bmod_abc28_snapshot(vel_ss,refl_ss,nbc,dx,nt,dt,s,sx,sz,gx,gz,isFS);toc;

% Forward Modeling to save BC
tic; [~,bc_top,bc_bottom,bc_left,bc_right,bc_p_nt,bc_p_nt_1]=...
a2d_mod_abc28(vel_ss,nbc,dx,nt,dt,s,sx,sz,gx,gz,isFS);toc;
% RTM
img=a2d_rtm_abc28(seis,vel_ss,nbc,dx,nt,dt,s,sx,sz,gx,gz,...
bc_top,bc_bottom,bc_left,bc_right,bc_p_nt,bc_p_nt_1);
figure(3);set(gcf,'position',[0 0 600 300]);colormap(gray);
imagesc(x,z,img);caxis([-100 100]);
xlabel('X (m)'); ylabel('Z (m)'); title('RTM Image with Born Data');

tic;seis_new=a2d_bmod_abc28(vel_ss,img,nbc,dx,nt,dt,s,sx,sz,gx,gz,isFS);toc;
a=sum(refl_ss(:).*img(:));
b=sum(seis(:).^2);
c=sum(img(:).^2);
d=sum(seis(:).*seis_new(:));
display(['<Lm,Lm> = ',num2str(b)]);
display(['<m,LTLm> = ',num2str(a)]);
display(['<LTLm,LTLm> = ',num2str(c)]);
display(['<Lm,LLTLm> = ',num2str(d)]);

vel(:)=min(vel(:)); refl=zeros(size(vel)); refl((nz+1)/2,(nx+1)/2)=1;
[seis,bc_top,bc_bottom,bc_left,bc_right,bc_p_nt,bc_p_nt_1]...
=a2d_bmod_abc28(vel,refl,nbc,dx,nt,dt,s,sx,sz,gx,gz,isFS);
img=a2d_rtm_abc28(seis,vel,nbc,dx,nt,dt,s,sx,sz,gx,gz,...
bc_top,bc_bottom,bc_left,bc_right,bc_p_nt,bc_p_nt_1);
figure(4);set(gcf,'position',[0 0 600 800]);colormap(gray);
subplot(311);imagesc(x,z,vel);colorbar;
xlabel('X (m)'); ylabel('Z (m)'); title('Velocity');
figure(4);subplot(312);imagesc(x,z,refl);colorbar;
xlabel('X (m)'); ylabel('Z (m)'); title('Reflectivity');
figure(4);subplot(313);imagesc(x,z,img);caxis([-10 10]);
xlabel('X (m)'); ylabel('Z (m)'); title('Migration Greens Function');

part4

clc
close all
clear


nz=81;nx=201;
vel=zeros(nz,nx)+1000; dx=5;
x = (0:nx-1)*dx; z = (0:nz-1)*dx;

sx = (nx-1)/4*dx; sz = 0; gx=(0:2:(nx-1))*dx; gz=zeros(size(gx)); g=1:numel(gx);

nbc=40; nt=2001; dt=0.0005; t=(0:nt-1)*dt;isFS=false;freq=25; s=ricker(freq,dt);

tic; seis=a2d_mod_abc28(vel,nbc,dx,nt,dt,s,sx,sz,gx,gz,isFS);toc;

figure(1);set(gcf,'position',[0 0 1000 500]);
subplot(221);imagesc(x,z,vel);colorbar;xlabel('X (m)'); ylabel('Z (m)'); title('velocity');
figure(1);subplot(222);imagesc(g,t,seis);colormap(gray);
xlabel('Time (t)'); title('seismic gather');
figure(1);subplot(223);plot(t,seis(:,76));xlabel('Time (t)'); title('seismic trace');
tic; wp=a2d_wavepath_abc28(seis(:,76),vel,nbc,dx,nt,dt,s,sx,sz,gx(76),gz(76)); toc;
figure(1);subplot(224);imagesc(x,z,wp);colormap(gray);caxis([-10 10]);
xlabel('X (m)'); ylabel('Z (m)'); title('wave path for direct wave');

dx = 5;
vel=(1000:1000/150:2000);
vel=repmat(vel',[1,401]);
% vel(40:80,160:240) = 1500;

[nz,nx]=size(vel);
x = (0:nx-1)*dx;
z = (0:nz-1)*dx;

sx = (nx-1)/8*dx; 
sz = 0; 
gx=(0:2:nx-1)*dx; 
gz=zeros(size(gx)); 
g=0:numel(gx);

nbc=4; nt=4001; 
dt=0.0005; 
t=(0:nt-1)*dt;
isFS=false;
freq=25; 
s=ricker(freq,dt);

tic; seis=a2d_mod_abc28(vel,nbc,dx,nt,dt,s,sx,sz,gx,gz,isFS);toc;

figure(2);set(gcf,'position',[0 0 1000 500]);
subplot(221);imagesc(x,z,vel);colorbar;
xlabel('X (m)'); ylabel('Z (m)'); title('velocity');
figure(2);subplot(222);imagesc(g,t,seis);colormap(gray);caxis([-1 1]);
xlabel('Time (t)'); title('seismic gather');
gx=gx(176);gz=gz(176); trace=seis(:,176); trace(2901:end)=0;
figure(2);subplot(223);plot(t,trace);
xlabel('Time (t)'); title('seismic trace with direct wave muted');
tic; wp=a2d_wavepath_abc28(trace,vel,nbc,dx,nt,dt,s,sx,sz,gx,gz); toc;
figure(2);subplot(224);imagesc(x,z,wp);colormap(gray);caxis([-0.1 0.1]);
xlabel('X (m)'); ylabel('Z (m)'); title('wave path for diving wave');

vel=[repmat(1000,[1 41]),repmat(2000,[1,80])];vel=repmat(vel',[1,401]);
[nz,nx]=size(vel);x = (0:nx-1)*dx; z = (0:nz-1)*dx;

sx = (nx-1)/8*dx; sz = 0; gx=(0:2:nx-1)*dx; gz=zeros(size(gx)); g=0:numel(gx);

nbc=80; nt=4001; dt=0.0005; t=(0:nt-1)*dt;isFS=false;freq=25; s=ricker(freq,dt);

tic; seis=a2d_mod_abc28(vel,nbc,dx,nt,dt,s,sx,sz,gx,gz,isFS);toc;
trace=seis(:,176); trace(2801:end)=0;

figure(3);set(gcf,'position',[0 0 1000 500]);
subplot(221);imagesc(x,z,vel);colorbar;xlabel('X (m)'); ylabel('Z (m)'); title('velocity');
figure(3);subplot(222);imagesc(g,t,seis);colormap(gray);caxis([-0.025 0.025]);xlabel('Time (t)'); title('seismic data');
figure(3);subplot(223);plot(t,trace);xlabel('Time (t)'); title('refraction wave');
tic; wp=a2d_wavepath_abc28(trace,vel,nbc,dx,nt,dt,s,sx,sz,gx(176),gz(176)); toc;
figure(3);subplot(224);imagesc(x,z,wp);colormap(gray);caxis([-0.0002 0.0002]);
xlabel('X (m)'); ylabel('Z (m)'); title('wave path for refraction wave');

vel=zeros(101,201)+1000; vel(81,101)=1200;[nz,nx]=size(vel);x = (0:nx-1)*dx; z = (0:nz-1)*dx;

sx = (nx-1)/8*dx; sz = 0; gx=(0:2:nx-1)*dx; gz=zeros(size(gx)); g=0:numel(gx);

nbc=80; nt=2601; dt=0.0005; t=(0:nt-1)*dt;isFS=false;freq=20; s=ricker(freq,dt);

[vel_ss,refl_ss]=vel_smooth(vel,3,3,1);

tic; seis=a2d_mod_abc28(vel,nbc,dx,nt,dt,s,sx,sz,gx,gz,isFS);toc;
trace=seis(:,51); trace(1:1800)=0;trace(2301:end)=0;

figure(4);set(gcf,'position',[0 0 1000 500]);
subplot(221);imagesc(x,z,vel);colorbar;xlabel('X (m)'); ylabel('Z (m)'); title('velocity');
figure(4);subplot(222);imagesc(g,t,seis(1:2601,:));colormap(gray);caxis([-0.025 0.025]);
xlabel('Time (t)'); title('seismic data for one trace');
figure(4);subplot(223);plot(t,trace);xlabel('Time (t)'); title('diffraction wave');
tic; wp=a2d_wavepath_abc28_refl(trace,vel_ss,refl_ss,nbc,dx,nt,dt,s,sx,sz,gx(51),gz(51)); toc;
figure(4);subplot(224);imagesc(x,z,wp);colormap(gray);caxis([-0.002 0.002]);
xlabel('X (m)'); ylabel('Z (m)'); title('wave path for diffraction wave');

vel=zeros(101,201)+1000; vel(81:end,:)=1500;[nz,nx]=size(vel);x = (0:nx-1)*dx; z = (0:nz-1)*dx;

sx = (nx-1)/8*dx; sz = 0; gx=(0:2:nx-1)*dx; gz=zeros(size(gx)); g=0:numel(gx);

nbc=80; nt=2601; dt=0.0005; t=(0:nt-1)*dt;isFS=false;freq=20; s=ricker(freq,dt);

[vel_ss,refl_ss]=vel_smooth(vel,3,3,1);

tic; seis=a2d_mod_abc28(vel,nbc,dx,nt,dt,s,sx,sz,gx,gz,isFS);toc;
trace=seis(:,76); trace(1:1800)=0;trace(2301:end)=0;

figure(5);set(gcf,'position',[0 0 1000 500]);
subplot(221);imagesc(x,z,vel);colorbar;
xlabel('X (m)'); ylabel('Z (m)'); title('velocity');
figure(5);subplot(222);imagesc(g,t,seis(1:2601,:));colormap(gray);caxis([-0.1 0.1]);
xlabel('Time (t)'); title('seismic data for one trace');
figure(5);subplot(223);plot(t,trace);xlabel('Time (t)'); title('reflection wave');
tic; wp=a2d_wavepath_abc28_refl(trace,vel,refl_ss,nbc,dx,nt,dt,s,sx,sz,gx(76),gz(76)); toc;
figure(5);subplot(224);imagesc(x,z,wp);colormap(gray);caxis([-2 2]);
xlabel('X (m)'); ylabel('Z (m)'); title('wave path for reflection wave');


参考资料[1].https://csim.kaust.edu.sa/files/ErSE328.2013/LAB/WE_LABS/index.html

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
探地雷达(Ground Penetrating Radar,GPR)是一种非侵入性地球物理探测技术,它利用高频电磁波在地下介质中的传播特性,对地下结构进行成像。逆时偏移算法(Reverse Time Migration,RTM)是一种基于波动方程的成像方法,它利用了地震波在地下的反射、折射和散射等现象,通过反演逆波场来重建地下介质的图像。在探地雷达成像中,也可以采用逆时偏移算法进行成像。 探地雷达逆时偏移算法的主要步骤如下: 1. 前向模拟:根据初始模型和探地雷达源信息,通过求解波动方程,计算出电磁波在地下的传播情况。 2. 逆时模拟:将探地雷达接收到的信号作为逆波场源,反演逆波场,得到反传波场。 3. 时钟函数修正:利用反传波场和前向波场,计算出时钟函数,对反传波场进行修正。 4. 成像条件:将修正后的反传波场与前向波场相乘,得到逆时偏移成像结果。 下面是一个简单的探地雷达逆时偏移算法的Matlab代码实现,其中使用了一个2D介质模型和一个2D探地雷达数据集: ```matlab %%加载介质模型和探地雷达数据 load medium.mat load gprdata.mat %%设置参数 dx = 0.05; %网格间距 dt = 1e-11; %采样间隔 fc = 500e6; %滤波器截止频率 tmax = 2e-8; %最大时间 %%前向模拟 nt = round(tmax/dt); gpr_fwd = zeros(size(gprdata)); for it=1:nt %应用滤波器 gpr_filt = bandpass(gprdata(:,it),[0 fc],1/dt); %计算波场 if it == 1 [u2,~] = fd2d_em_init(size(epsilon),size(sigma),dx,dt,epsilon,sigma); u1 = u2; else [u2,~] = fd2d_em(size(epsilon),size(sigma),dx,dt,epsilon,sigma,u1,zeros(size(gpr_filt)),gpr_filt); u1 = u2; end gpr_fwd(:,it) = u2(:)'*dt/dx; end %%逆时模拟 gpr_inv = zeros(size(gprdata)); for it=nt:-1:1 %应用滤波器 gpr_filt = bandpass(gprdata(:,it),[0 fc],1/dt); %计算逆波场 if it == nt [u2,~] = fd2d_em_init(size(epsilon),size(sigma),dx,dt,epsilon,sigma); u1 = u2; else [u2,~] = fd2d_em(size(epsilon),size(sigma),dx,dt,epsilon,sigma,u1,gpr_filt,zeros(size(gpr_filt))); u1 = u2; end gpr_inv(:,it) = u2(:)'*dt/dx; end %%时钟函数修正 clock = zeros(size(epsilon)); for it=1:nt clock = clock + gpr_fwd(:,it).*gpr_inv(:,it); end %%成像条件 image = zeros(size(epsilon)); for it=1:nt %应用滤波器 gpr_filt = bandpass(gprdata(:,it),[0 fc],1/dt); %计算成像结果 if it == 1 [u2,~] = fd2d_em_init(size(epsilon),size(sigma),dx,dt,epsilon,sigma); u1 = u2; else [u2,~] = fd2d_em(size(epsilon),size(sigma),dx,dt,epsilon,sigma,u1,gpr_filt.*clock,zeros(size(gpr_filt))); u1 = u2; end image = image + u2; end %%显示结果 figure; imagesc(x,z,image); colormap(gray); xlabel('x (m)'); ylabel('z (m)'); title('探地雷达逆时偏移成像结果'); ``` 请注意,这只是一个基本的实现,可能需要根据您的具体需求进行修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值