如何使用 signal.deconvolve 正确重构信号,该信号应用于使用 signal.convolve 与 ricker 小波卷积的信号?

How can I properly reconstruct a signal using signal.deconvolve applied to a signal convolved with a ricker wavelet using signal.convolve?

因此,我将一个数组存储在维度为 (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[:,i],ricker2)
    deconvolved_seismogram.append(deconvolved_trace)
deconvolved_seismogram = np.array(deconvolved_seismogram).T

fig,ax = plt.subplots(figsize=(8,10))
ax.imshow(deconvolved_seismogram,  aspect=1400,  extent= [np.min(offsets), np.max(offsets),np.max(time),np.min(time)]) 
plt.title('Deconvolved Central Shot Seismic Gather \n ', fontweight="bold")
plt.xlabel('Offset [m]', fontweight="bold")
plt.ylabel('Time [s]', fontweight="bold")
plt.show()

deconvolved_seismogram 数组具有正确的维度,但信号与原始信号 (seismic_data) 完全不同。我究竟做错了什么?我该如何纠正?

提前致谢!

潜在的问题是过滤器的卷积可能会删除信息。如果滤波器的频率响应包含零(或数值上接近零的点),则这些频率分量是不可恢复的,并且不可能进行完整的反卷积。

另一个问题是 scipy.signal.deconvolve 试图精确地去卷积(通过多项式除法);它不是一种抗噪声方法。反卷积本质上是通过滤波器的频率响应在频域中逐点划分。如果任何地方的响应都很小,这个除法会放大任何噪声,包括数值 round-off 误差——我相信这可以解释你观察到 scipy.signal.deconvolve 的反卷积结果“与原始信号完全不相似” .

这是 rickert2 的曲线图,底部是其频率响应曲线图。

ricker2非常流畅!这绝对很难反卷积。底部图显示频率响应在 DC 处为零并迅速下降(注意 y-axis 以 dB 为单位)高于 0.2 cycles/sample 左右。这意味着一些 mid-range 频率内容可以通过 noise-robust 反卷积方法恢复,但 DC 和更高频率内容消失了。

我建议尝试 Wiener deconvolution. This is a classic method for robust deconvolution. There is a Python implementation in this github gist(参见“wiener_deconvolution”函数)。