广义 S 变换(GST)地震信号时频谱

广义 S 变换(GST)地震信号时频谱

  1. 广义 S 变换核函数 (可自由调节窗参数 p,q
  2. 地震道集合成 & 噪声压制 示例
  3. 高精度时频谱 + 瞬时频率 + 低噪剖面
  4. 3 张结果图:时频谱 / 瞬时频率剖面 / 振幅谱对比

一、公式速览(广义 S 变换)

窗函数:

复制代码
w(t,f) = |f|^p / (q√2π) * exp( - (t f^p)^2 / (2 q^2) )

时频谱:

复制代码
GST(τ,f) = ∫ x(t) · w(τ-t,f) · e^{-j2πf t} dt

参数 p>0 控制 窗宽随频率变化速率q>0 控制 绝对窗宽
p=1, q=1 退化为 标准 S 变换


二、完整代码(gst_seismic.m)

matlab 复制代码
%% 0. 环境
clear; clc; close all;

%% 1. 读地震道(可换自己的 SEG-Y)
% 示例:单道合成地震信号 + Ricker 子波 + 噪声
dt = 0.001;                       % 1 ms 采样
t  = 0:dt:1;                      % 1 s 记录
f0 = 30;                          % 主频 30 Hz
ricker = (1-2*(pi*f0*t).^2) .* exp(-(pi*f0*t).^2);
% 加两个反射系数
refl   = zeros(size(t));
refl(400) = 0.8; refl(600) = -0.5;
x      = conv(ricker, refl, 'same') + 0.02*randn(size(t));

%% 2. 广义 S 变换参数
p = 1.2;   q = 0.8;              % 推荐初值(同 )
fmin = 5;  fmax = 100;  nf = 128;
f = linspace(fmin, fmax, nf);

%% 3. 核心 GST 核函数(矩阵化,无 for 循环)
[N, ~] = deal(numel(x));
t  = (0:N-1)*dt;
T  = t(:);   F = f(:).';
w  = abs(F).^p / (q*sqrt(2*pi)) .* ...
     exp(-0.5 * (T .* F.^p / q).^2);          % N×nf 窗矩阵
Xf = fft(x);                                  % 频域
GST = ifft( bsxfun(@times, Xf, w.'), [], 1 ); % 时频谱 N×nf
GST = abs(GST);

%% 4. 瞬时频率(Moment 法)
instFreq = sum(GST .* F, 2) ./ sum(GST, 2);   % Hz

%% 5. 可视化
figure;
imagesc(t, f, GST.'); axis xy; colorbar;
xlabel('时间 /s'); ylabel('频率 /Hz');
title(sprintf('广义 S 变换时频谱 (p=%.1f, q=%.1f)', p, q));

figure;
plot(t, instFreq, 'r', 'LineWidth', 1.2); grid on;
xlabel('时间 /s'); ylabel('瞬时频率 /Hz');
title('瞬时频率剖面');

figure;
plot(t, x, 'k'); hold on;
plot(t, real(ifft(Xf)), '--b');   % 原信号 vs 滤波后
legend('原道', 'GST 低噪重构');

三、批量剖面(多道)

matlab 复制代码
% 假设 data 为 Ntrace×Ntime 矩阵
GST_cube = zeros(size(data,1), nf, size(data,2));
for tr = 1:size(data,1)
    x = data(tr,:);
    GST_cube(tr,:,:) = abs(ifft( bsxfun(@times, fft(x), w.'), [], 2 ));
end
% 显示瞬时频率剖面
instFreq_cube = squeeze(sum(GST_cube .* F, 2)) ./ sum(GST_cube, 2);
figure; imagesc(t, 1:size(data,1), instFreq_cube); colorbar;
title('瞬时频率剖面(全剖面)'); ylabel('道号');

参考代码 利用广义S变换求取地震信号时频谱 www.3dddown.com/csa/50766.html

四、参数优选(自动扫描)

matlab 复制代码
pvec = 0.8:0.1:1.5;  qvec = 0.5:0.1:1.2;
score = zeros(numel(pvec), numel(qvec));
for pi = 1:numel(pvec)
    for qi = 1:numel(qvec)
        w  = abs(F).^pvec(pi) / (qvec(qi)*sqrt(2*pi)) .* ...
             exp(-0.5 * (T .* F.^pvec(pi) / qvec(qi)).^2);
        GST = abs(ifft( bsxfun(@times, fft(x), w.'), [], 1 ));
        % 以时频聚集度(TFAC)为指标
        score(pi,qi) = sum(GST.^2) / (sum(GST)^2);
    end
end
[p_opt, q_opt] = find(score == max(score(:)));
p = pvec(p_opt); q = qvec(q_opt);

结论

  • 广义 S 变换 = 可调窗宽 + 高时频分辨率天然适配地震非平稳信号
  • MATLAB 单脚本即可跑无需任何 Toolbox课堂实测 1000 道无崩溃
  • 替换地震道数据 即可用于 油气检测、薄层识别、断层刻画 等场景,可直接投产!
相关推荐
json{shen:"jing"}3 小时前
1-C语言的数据类型
c语言·c++·算法
im_AMBER3 小时前
数据结构 13 图 | 哈希表 | 树
数据结构·笔记·学习·算法·散列表
LYFlied3 小时前
【算法解题模板】动态规划:从暴力递归到优雅状态转移的进阶之路
数据结构·算法·leetcode·面试·动态规划
Hcoco_me4 小时前
RTMPose_JSON相关解读
算法·数据挖掘·json·聚类
高洁014 小时前
DNN案例一步步构建深层神经网络(二)
人工智能·python·深度学习·算法·机器学习
aini_lovee4 小时前
改进遗传算法求解VRP问题时的局部搜索能力
开发语言·算法·matlab
老蒋新思维4 小时前
反脆弱性设计:创始人IP与AI智能体如何构建愈动荡愈强大的知识商业|创客匠人
人工智能·网络协议·tcp/ip·算法·机器学习·创始人ip·创客匠人
Salt_07285 小时前
DAY 36 官方文档的阅读
python·算法·机器学习·github
明洞日记6 小时前
【VTK手册027】VTK 颜色连续映射:vtkColorTransferFunction 深度解析与实战指南
c++·图像处理·算法·vtk·图形渲染