我如何才能正确地使用signal.deconvolve来重构信号,并应用到使用signal.convolve与ricker小波卷积的信号上?

问题描述

因此,我将数组存储在尺寸为(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的图,底部是频率响应的图。

Plot of ricker2

ricker2非常流畅!这绝对是难以分解的。底部图显示,频率响应在DC处为零,并在0.2个周期/样本左右以上迅速下降(注意y轴以dB为单位)。这意味着可以通过噪声稳健的反卷积方法恢复某些中频频率内容,但不再使用DC和更高的频率内容。

我建议尝试Wiener deconvolution。这是鲁棒反卷积的经典方法。 this github gist中有一个Python实现(请参见“ wiener_deconvolution”函数)。