广义 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 道无崩溃
  • 替换地震道数据 即可用于 油气检测、薄层识别、断层刻画 等场景,可直接投产!
相关推荐
海清河晏1116 分钟前
数据结构 | 单循环链表
数据结构·算法·链表
wuweijianlove4 小时前
算法性能的渐近与非渐近行为对比的技术4
算法
_dindong4 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志4 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
黎阳之光5 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_115 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia5 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg5 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒6 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾6 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio