matlab生成井的合成地震记录,并且将地震记录成图显示

MATLAB中利用真实测井数据生成合成地震记录并进行地层标定


1:加载与预处理测井数据

假设您有3列数据:depth (深度,单位:米)、ac (声波时差,μs/m)、den (密度,g/cm³)。

% 加载测井数据 (示例:data.txt)
data = load('data.txt');
depth = data(:,1);   % 深度 (m)
ac = data(:,2);      % 声波时差 (μs/m)
den = data(:,3);     % 密度 (g/cm³)

% 数据预处理
% 1. 去除无效值(NaN)
valid_idx = ~isnan(ac) & ~isnan(den);
depth = depth(valid_idx);
ac = ac(valid_idx);
den = den(valid_idx);

% 2. 单位转换
v = 1e6 ./ ac;         % 速度 (m/s)
rho = den * 1000;      % 密度 (kg/m³)

2:计算反射系数序列

% 计算波阻抗
imp = v .* rho;       % 波阻抗 = 速度 × 密度

% 计算反射系数 (界面处)
R = zeros(size(imp)-1);
for i = 1:length(imp)-1
    R(i) = (imp(i+1) - imp(i)) / (imp(i+1) + imp(i));
end
R_depth = (depth(1:end-1) + depth(2:end)) / 2;  % 反射系数对应的深度

3:深度域→时间域转换

% 计算双程旅行时 (TWT)
dt_dz = 2 ./ v;                      % 单位深度双程时间 (s/m)
T = cumtrapz(depth, dt_dz);          % 累积积分得到时间域
T = [0; T(1:end-1)];                 % 对齐到深度点

% 将反射系数插值到等间隔时间网格
dt = 0.002;                          % 时间采样率 (2ms)
t_max = max(T);
t = (0:dt:t_max)';                   % 时间轴 (s)
R_time = interp1(T, [R; 0], t, 'linear', 0); % 末尾补0并插值

4:设计子波并褶积

% 生成Ricker子波 (主频30Hz)
f0 = 30;                             % 主频 (Hz)
t_wave = -0.1:dt:0.1;                % 子波时间轴
ricker = (1 - 2*(pi*f0*t_wave).^2) .* exp(-(pi*f0*t_wave).^2);

% 褶积生成合成地震记录
syn_seismic = conv(R_time, ricker, 'same');

5:绘制合成地震记录

figure('Position', [100, 100, 800, 600]);

% 绘制合成地震道
subplot(1,3,1);
plot(syn_seismic, t, 'k', 'LineWidth', 1.5);
set(gca, 'YDir', 'reverse');          % 深度向下
ylim([min(t), max(t)]);
title('合成地震记录');
xlabel('振幅');
ylabel('双程时间 (s)');
grid on;

% 绘制反射系数
subplot(1,3,2);
stem(R_time, t, 'k', 'Marker', 'none', 'LineWidth', 1);
set(gca, 'YDir', 'reverse');
ylim([min(t), max(t)]);
title('反射系数序列');
xlabel('反射系数');
ylabel('双程时间 (s)');
grid on;

% 绘制速度曲线 (时间域)
subplot(1,3,3);
plot(v, T, 'r', 'LineWidth', 1.5);
set(gca, 'YDir', 'reverse');
ylim([min(t), max(t)]);
title('速度曲线 (时域)');
xlabel('速度 (m/s)');
ylabel('双程时间 (s)');
grid on;

sgtitle('合成地震记录与地层标定');

6:地层标定(与实际地震剖面对比)

% 假设加载实际地震数据 (矩阵 seismic_data, 行为时间,列为道)
load('seismic_data.mat'); % 实际地震数据

% 提取井旁道
well_trace = seismic_data(:, well_position); 

% 对比显示
figure;
subplot(1,2,1);
imagesc(1:size(seismic_data,2), t, seismic_data); 
colormap(gray);
hold on;
plot(well_position, t, 'r--', 'LineWidth', 1.5); % 标记井位置
title('实际地震剖面');
xlabel('道号');
ylabel('时间 (s)');

subplot(1,2,2);
plot(syn_seismic, t, 'b', 'LineWidth', 1.5);
set(gca, 'YDir', 'reverse');
title('合成地震记录');
xlabel('振幅');
ylabel('时间 (s)');
grid on;

 

  1. 数据要求

    • 声波时差 (ac) 单位需为 μs/m(若为 μs/ft,需转换为米制)。
    • 密度 (den) 单位需为 g/cm³
    • 确保深度采样间隔均匀(如不满足需插值)。
  2. 参数调整

    • 子波主频 f0:需与实际地震数据主频匹配(可通过频谱分析获取)。
    • 时间采样率 dt:应与实际地震数据一致(常用 2ms 或 4ms)。
  3. 地层标定验证

    • 将合成记录与实际井旁道对比,调整子波参数或速度模型,使同相轴对齐。
    • 标定关键地层界面(如油组顶底、不整合面)。
  4. 参考代码

    • matlab生成井的合成地震记录,并且将地震记录成图显示 www.youwenfan/contentalc/65985.html

可生成高质量的合成地震记录,并有效实现地层标定。实际应用中可能需要多次迭代调整子波和速度模型以达到最佳匹配效果。

专注于matlab/simulink,电子电路,编程