Matlab | 基于复赛谱提取地震数据的地震子波

function w = ExtractWavelet(data, M)
% 功能:基于复赛谱提取输入地震数据data的地震子波w
% 输入:
%       x     -  地震信号,Nt×Nz
%       M     -  提取地震子波的长度
% 输出:
%       w     -  提取的地震子波,1×M
% 时间:2022/10/17

if nargin < 2
    M = 101;
end

[Nt, Nz] = size(data);
z1 = zeros(Nt, Nz);
% 多道平均对数分解法
for k = 1:Nz 
    x = data(:,k);
    y = fft(x);     % 做傅里叶变换
    z = log(y);     % 并取其对数得到对数谱
    z1(:,k) = ifft(z);   % 再做傅里叶反变换
end
z2 = sum(z1,2)/Nz;
% 设计一个低通滤波时窗c
% c = [ones(1,15),zeros(1,Nt-30),ones(1,15)]';  
c = zeros(Nt, 1);
for i = 1:Nt
    c(i) = 0.5*(1+cos(2*pi*(i-1)/Nt));
end
wn = z2.*c;     % 截取复赛谱时间域的前面接近于0的一段数据
wn = fft(wn);   % 并进行傅里叶变换,得到对数谱
wn = exp(wn);   % 再取其指数,得到子波谱
w0 = real(ifft(wn));  % 然后做傅里叶反变换得到时间域的地震子波

w1 = zeros(Nt,1);
for i = 1:M/2
    w1(i) = w0(floor(M/2)+2-i);
end
for i = floor(M/2)+1:Nt
    w1(i) = w0(i-floor(M/2));
end
pm = max(abs(w1));
w1 = w1./pm; % 归一化

w = w1(1:M); % 提取的子波w

end
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值