MATLAB实现方案:SGY地震数据的自相关与互相关分析
本方案通过MATLAB对SGY格式地震数据进行读取、预处理,并开展自相关和互相关分析,最终生成可视化图件以辅助地震信号特征提取。
1. 读取SGY地震数据
由于实际应用中需使用真实地震文件,此处为演示目的采用模拟数据替代。首先调用自定义函数读取SGY文件中的核心信息:
[sgyData, t, traceHeaders] = readSGY('sample.sgy');
获取数据维度并输出基本信息:
[nTraces, nSamples] = size(sgyData);
fprintf('地震数据信息:\n');
fprintf('道数: %d\n', nTraces);
fprintf('采样点数: %d\n', nSamples);
fprintf('采样间隔: %.2f ms\n', t(2)-t(1));
fprintf('总时间: %.2f s\n', t(end)/1000);
2. 数据预处理流程
为提升后续分析精度,对原始数据执行去趋势化与滤波操作。
先去除各道的直流分量(均值偏移):
sgyData = detrend(sgyData')';
随后设计四阶巴特沃斯带通滤波器,保留5–80 Hz有效频段信号(抗噪处理):
fs = 1/(t(2)-t(1)); fcuts = [5, 10, 80, 100]; order = 4; [b,a] = butter(order, fcuts/(fs/2), 'bandpass'); filteredData = filtfilt(b, a, sgyData')';
选取感兴趣的时窗区间用于分析:
startSample = 500; endSample = 1500; analysisData = filteredData(:, startSample:endSample); analysisTime = t(startSample:endSample);[此处为图片1]
3. 自相关特性分析
选取中间道作为参考道,计算其自相关函数以观察信号周期性或重复结构:
refTrace = ceil(nTraces/2); selectedTrace = analysisData(refTrace, :); [acor, lags] = xcorr(selectedTrace, 'coeff'); lags_ms = lags * (t(2)-t(1)); acor = acor / max(acor); % 归一化处理
该步骤可识别出信号内部的时间对称性和主频成分分布情况。
4. 道间互相关分析
为进一步比较不同空间位置地震道之间的相似性,选择相邻道进行互相关运算:
compTrace = refTrace + 5;
if compTrace > nTraces
compTrace = refTrace - 5;
end
compareTrace = analysisData(compTrace, :);
[xcor, lagsX] = xcorr(selectedTrace, compareTrace, 'coeff');
lagsX_ms = lagsX * (t(2)-t(1));
通过最大相关值对应滞后点,可估计两道间的传播时间差,适用于速度建模或偏移校正。
[此处为图片2]5. 图形化展示设置
统一设定图表字体大小与线条宽度,增强可视化一致性:
set(0, 'DefaultAxesFontSize', 10); set(0, 'DefaultTextFontSize', 10); set(0, 'DefaultLineLineWidth', 1.5);
创建复合图形窗口,第一子图显示选定的两条地震道波形:
figure('Name', '地震道波形', 'Position', [100, 100, 1200, 800]);
subplot(2,1,1);
plot(analysisTime, selectedTrace, 'b', 'LineWidth', 1.5);
hold on;
plot(analysisTime, compareTrace, 'r', 'LineWidth', 1.5);
xlabel('时间 (ms)');
ylabel('振幅');
title('参考道与对比道波形');
legend(['道 ', num2str(refTrace)], ['道 ', num2str(compTrace)]);
grid on;
在波形图中标注关键地质反射事件,辅助解释:
yLimits = ylim; plot([300, 300], yLimits, 'k--', 'LineWidth', 1); text(310, yLimits(2)*0.9, '浅层反射', 'FontSize', 10); plot([700, 700], yLimits, 'k--', 'LineWidth', 1); text(710, yLimits(2)*0.9, '中层反射', 'FontSize', 10); plot([1200, 1200], yLimits, 'k--', 'LineWidth', 1); text(1210, yLimits(2)*0.9, '深层反射', 'FontSize', 10);
6. 自相关结果绘图
第二子图绘制归一化自相关函数随延迟时间的变化曲线,揭示信号自身在不同时移下的相似程度。
% 图件3: 互相关分析
figure('Name', '互相关分析', 'Position', [100, 100, 1200, 600]);
subplot(1,2,1);
plot(analysisTime, selectedTrace, 'b', 'LineWidth', 1.5);
hold on;
plot(analysisTime, compareTrace, 'r', 'LineWidth', 1.5);
xlabel('时间 (ms)');
ylabel('振幅');
title('参考道与对比道波形');
legend(['道 ', num2str(refTrace)], ['道 ', num2str(compTrace)]);
grid on;
subplot(1,2,2);
plot(lagsX_ms, xcor, 'm', 'LineWidth', 1.5);
xlabel('延迟时间 (ms)');
ylabel('归一化互相关系数');
title('参考道与对比道互相关分析');
grid on;
xlim([-200, 200]);
% 标记最大相关位置
[maxCorr, maxIdx] = max(xcor);
hold on;
plot(lagsX_ms(maxIdx), maxCorr, 'ko', 'MarkerSize', 10, 'MarkerFaceColor', 'y');
text(lagsX_ms(maxIdx), maxCorr+0.05, ...
sprintf('最大相关: %.2f\n延迟: %.1f ms', maxCorr, lagsX_ms(maxIdx)), ...
'HorizontalAlignment', 'center');
[此处为图片1]
% 图件4: 多道自相关分析
figure('Name', '多道自相关分析', 'Position', [100, 100, 1200, 800]);
numTracesToShow = min(9, nTraces);
cols = 3;
rows = ceil(numTracesToShow/cols);
for i = 1:numTracesToShow
traceIdx = floor((i-1)*nTraces/numTracesToShow) + 1;
traceData = analysisData(traceIdx, :);
[acorTrace, lagsTrace] = xcorr(traceData, 'coeff');
lagsTrace_ms = lagsTrace * (t(2)-t(1));
subplot(rows, cols, i);
plot(lagsTrace_ms, acorTrace, 'b', 'LineWidth', 1.2);
title(['道 ', num2str(traceIdx)]);
xlabel('延迟 (ms)');
ylabel('自相关');
grid on;
xlim([-150, 150]);
end
[此处为图片2]
% 图件5: 相干分析 (多道互相关)
figure('Name', '相干分析', 'Position', [100, 100, 1200, 800]);
% 计算平均相干系数
coherence = zeros(1, length(analysisTime));
windowSize = 50; % 相干计算窗口大小
for i = 1:nTraces-windowSize
windowData = analysisData(i:i+windowSize-1, :);
meanTrace = mean(windowData, 1);
end
[此处为图片3]
subplot(2,1,2);
plot(lags_ms, acor, 'b', 'LineWidth', 1.5);
xlabel('延迟时间 (ms)');
ylabel('归一化自相关');
title('参考道自相关分析');
grid on;
xlim([-200, 200]);
% 标记主要周期
[peaks, locs] = findpeaks(acor, 'MinPeakHeight', 0.3);
hold on;
for i = 1:min(3, length(locs))
plot(lags_ms(locs(i)), peaks(i), 'ro', 'MarkerSize', 8);
text(lags_ms(locs(i)), peaks(i)+0.05, ...
sprintf('%.1f ms', lags_ms(locs(i))), ...
'HorizontalAlignment', 'center');
end
%% 6. 保存分析结果
save('seismic_correlation_results.mat', 'acor', 'xcor', 'lags_ms', 'lagsX_ms', 'coherence');
%% 辅助函数: 读取SGY文件 (简化版)
function [data, t, traceHeaders] = readSGY(filename)
% 实际实现需要完整的SGY解析器
% 此处使用模拟数据替代
% 模拟参数设置
nTraces = 100; % 道数
nSamples = 2000; % 每道采样点数量
dt = 0.002; % 采样间隔(秒)
% 构建时间向量(单位:毫秒)
t = (0:nSamples-1) * dt * 1000;
% 初始化地震数据矩阵
data = zeros(nTraces, nSamples);
for i = 1:nTraces
% 生成基础Ricker子波
baseWavelet = ricker(30, dt, 1.5);
waveLength = length(baseWavelet);
% 创建随机反射系数序列
reflectors = randn(1, 15) * 0.1;
reflectorTimes = sort(randperm(nSamples - 500, 15) + 250);
% 合成单道地震信号
trace = zeros(1, nSamples);
for j = 1:length(reflectors)
pos = reflectorTimes(j);
if pos + waveLength <= nSamples
trace(pos:pos+waveLength-1) = trace(pos:pos+waveLength-1) + reflectors(j)*baseWavelet;
end
end
% 添加高斯白噪声
noise = randn(1, nSamples) * 0.05;
data(i, :) = trace + noise;
% 引入道间振幅差异
data(i, :) = data(i, :) * (0.9 + 0.2*rand());
end
% 构造模拟道头信息
traceHeaders = struct();
traceHeaders.TRACE_SAMPLE_COUNT = repmat(nSamples, nTraces, 1);
traceHeaders.SAMPLE_INTERVAL = repmat(dt*1000000, nTraces, 1); % 单位:微秒
traceHeaders.TraceNumber = (1:nTraces)';
end
%% Ricker小波生成函数
function wavelet = ricker(freq, dt, duration)
t = -duration/2 : dt : duration/2;
arg = pi * freq * t;
wavelet = (1 - 2*arg.^2) .* exp(-arg.^2);
wavelet = wavelet / max(abs(wavelet)); % 归一化处理
end
% 相干性计算主循环
for i = 1:(nTraces - windowSize + 1)
windowData = analysisData(i:i+windowSize-1, :);
meanTrace = mean(windowData, 1);
centeredData = windowData - repmat(meanTrace, windowSize, 1);
covMatrix = centeredData * centeredData' / (nSamples - 1);
coherence = coherence + diag(covMatrix, 0);
end
coherence = coherence / (nTraces - windowSize);
% 绘制地震数据与相干性结果
subplot(2,1,1);
imagesc(analysisTime, 1:nTraces, analysisData);
colormap(gray);
colorbar;
xlabel('时间 (ms)');
ylabel('道号');
title('地震数据剖面');
axis tight;
[此处为图片1]
subplot(2,1,2);
plot(analysisTime, coherence, 'b', 'LineWidth', 2);
xlabel('时间 (ms)');
ylabel('相干系数');
title('地震数据相干性分析');
grid on;
ylim([0, 1]);
[此处为图片2]
分析说明
1. 自相关分析
目的:用于识别地震信号中重复出现的波形模式,检测是否存在周期性特征。
数学表达式:
Rxx(τ) = ∫-∞∞ x(t)x(t+τ) dt
主要应用:
- 估计地震子波的主频特性
- 识别地下多次反射波(multiple waves)
- 通过周期性特征反演地层厚度信息
2. 互相关分析
目的:衡量两个不同地震道之间的相似程度,可用于提取它们之间的时间延迟(即走时差)。
互相关函数用于衡量两个信号之间的相似性随时间延迟的变化,其数学表达式如下:
Rxy(τ) = ∫-∞∞ x(t)y(t+τ) dt
该方法在实际中广泛应用于速度分析、构造平移校正以及相似断面的提取。
[此处为图片3]自相关与互相关分析是地震数据处理中的基础工具。其中,相干分析旨在量化多道地震数据之间的相似程度,以揭示地下结构的空间连续性特征。
相干系数的计算公式为:
γij = |Pij| / (PiiP
该指标可用于识别断层分布、预测裂缝发育区域及检测岩性变化带。
[此处为图片5]在波形对比中,通常选取一条参考道作为基准进行分析:
- 蓝色曲线:表示参考道(一般为测线中心道)
- 红色曲线:表示待比较的相邻道
- 黑色虚线:标记典型地质界面位置
通过直观比对不同道的波形差异,可初步判断地层连续性和构造扰动情况。
[此处为图片1]自相关分析常用于提取地震信号的周期特性:
- 横轴:表示时间延迟(单位:毫秒)
- 纵轴:显示归一化后的自相关系数
- 红圈标记:指示主要周期成分所在位置
此图有助于识别地震子波的主频以及地层的重复周期特征。
[此处为图片2]多道自相关结果可通过网格形式展示,以便于横向比较不同测线或不同位置的信号周期性特征变化情况。
[此处为图片4]实际应用建议
数据选择原则
- 优先选用信噪比较高的地震数据段
- 避开强能量干扰区域(如面波、工业噪音等)
- 考虑使用不同偏移距的道集进行联合分析,提升结果稳定性
参数自适应调整策略
根据主导频率自动设定滤波范围:
% 自适应参数设置
if dominant_freq > 50
fcuts = [10, 20, 100, 120]; % 高频数据适用
else
fcuts = [2, 5, 40, 50]; % 低频数据适用
end
高级分析扩展方法
倾角扫描分析通过模拟不同倾斜角度下的波形匹配程度,增强对复杂构造的解析能力:
% 倾角范围定义
dips = -5:0.5:5;
dipCorrelations = zeros(length(dips), nSamples);
for i = 1:length(dips)
shiftedTrace = shift_trace(compareTrace, dips(i), t);
[corr, ~] = xcorr(selectedTrace, shiftedTrace, 'coeff');
dipCorrelations(i, :) = corr;
end
三维可视化处理
构建三维相干体有助于全面理解空间结构特征:
% 构建相干数据立方体
coherenceCube = zeros(nTraces, nSamples, nInlines);
for inline = 1:nInlines
coherenceCube(:,:,inline) = compute_inline_coherence(data(:,:,inline));
end
% 可视化显示
volumeViewer(coherenceCube);
常见问题与解决方案
低频噪音干扰抑制
- 引入高通滤波器去除次声干扰
- 采用小波去噪技术提升信号纯净度
% 小波去噪实现
[C, L] = wavedec(selectedTrace, 5, 'db4');
thr = wthrmngr('dw1ddenoLVL','penalhi',C,L,1);
cleanedTrace = wdencmp('gbl',C,L,'db4',5,thr,'s');
计算效率优化措施
- 利用并行循环加速多道处理过程
parfor i = 1:nTraces
[acor(i,:), ~] = xcorr(analysisData(i,:), 'coeff');
end
- 实施降采样以减少数据量,加快运算速度
decimation_factor = 4;
downsampledData = analysisData(:, 1:decimation_factor:end);
结果验证方法
- 使用合成地震记录进行算法测试
- 基于已知地质模型开展正演验证
- 结合钻井资料进行井震标定对比分析
地质应用实例
断层检测
在相干切片中,低值区域通常对应断层带;而互相关分析所得的时移量可用于估算断层面的倾角。
薄层识别
自相关函数的峰值间隔反映了地层的周期厚度,依据公式 h = 2v·Δt 可估算薄层厚度,其中 v 为传播速度,Δt 为双程旅行时差。
岩性预测
高相干区域往往代表沉积稳定的均质层;而低相干区则可能指示裂缝发育带或岩性突变部位。
速度分析
通过互相关函数的最大峰值位置确定两道间的时差 Δt,结合空间距离 Δx 计算视速度倾角:θ = tan(Δx/Δt),进而反演叠加速度。


雷达卡


京公网安备 11010802022788号







