问题描述
因此,我将数组存储在尺寸为(251,240)的矩阵中。接下来,我创建了一个ricker小波,将其与每列(时间序列)进行卷积。这似乎工作正常。我的过程的下一步将是使用相同的ricker小波对卷积的结果进行反卷积。我希望可以恢复原始信号,但是事实并非如此。我在做错什么,如何正确解卷ricker小波?
我在下面附上我的一些代码
# the array 'time' and and 'seismic_data' with dimensions (251,) and (251,240) respectively,where created in prevIoUs cells.
from scipy import signal
ricker2 = signal.ricker(time.size,4) #create ricker wavelet with same dimensions as time series
seismogram = []
seismic_trace = [signal.convolve(ricker2,seismic_data[:,i],mode='same')for i in range(offsets.size - 1)] #creates array with each row being the time series convolved
seismogram = np.array(seismic_trace).T #transpose to get time series as columns
# PlottingI
fig,ax = plt.subplots(figsize=(8,10))
ax.imshow(seismic_data,aspect=1400,extent= [np.min(offsets),np.max(offsets),np.max(time),np.min(time)])
plt.title('Central Shot Seismic Gather \n ',fontweight="bold")
plt.xlabel('Offset [m]',fontweight="bold")
plt.ylabel('Time [s]',fontweight="bold")
plt.show()
这里显示的图是我从卷积中得到的期望。 (我尚无法添加图片。很抱歉)。
下一步(反卷积)似乎工作不正常。
deconvolved_seismogram = []
for i in range (offsets.size-1):
rems,deconvolved_trace = signal.deconvolve(seismogram[:,ricker2)
deconvolved_seismogram.append(deconvolved_trace)
deconvolved_seismogram = np.array(deconvolved_seismogram).T
fig,10))
ax.imshow(deconvolved_seismogram,np.min(time)])
plt.title('Deconvolved Central Shot Seismic Gather \n ',fontweight="bold")
plt.show()
deconvolved_seismogram数组具有正确的尺寸,但是信号与原始信号(seismic_data)根本不相似。我究竟做错了什么?我该如何纠正?
谢谢!
解决方法
潜在的问题是过滤器的卷积可能会删除信息。如果滤波器的频率响应包含零(或数值上接近零的点),则这些频率分量将不可恢复,并且不可能进行完全的反卷积。
另一个问题是scipy.signal.deconvolve
试图去卷积(通过多项式除法);它不是一种抗噪声的方法。反卷积本质上是在频域中按点除以滤波器的频率响应。如果任何地方的响应都很小,则该除法将放大任何噪声,包括数值舍入误差-我相信这可以解释您的观察结果:scipy.signal.deconvolve
的去卷积结果“根本不类似于原始信号”。 / p>
这里是rickert2
的图,底部是频率响应的图。
ricker2
非常流畅!这绝对是难以分解的。底部图显示,频率响应在DC处为零,并在0.2个周期/样本左右以上迅速下降(注意y轴以dB为单位)。这意味着可以通过噪声稳健的反卷积方法恢复某些中频频率内容,但不再使用DC和更高的频率内容。
我建议尝试Wiener deconvolution。这是鲁棒反卷积的经典方法。 this github gist中有一个Python实现(请参见“ wiener_deconvolution”函数)。