【问题标题】:How can I properly reconstruct a signal using signal.deconvolve applied to a signal convolved with a ricker wavelet using signal.convolve?如何使用signal.deconvolve正确重建信号,该信号应用于使用signal.convolve与ricker小波卷积的信号?
【发布时间】:2021-02-02 17:14:55
【问题描述】:

所以,我有一个数组存储在一个维度为 (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) 完全不同。我究竟做错了什么?我该如何纠正这个问题?

提前致谢!

【问题讨论】:

    标签: python scipy signal-processing convolution deconvolution


    【解决方案1】:

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

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

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

    ricker2 非常流畅!这肯定很难去卷积。底部图显示频率响应在 DC 处为零,并迅速下降(注意 y 轴以 dB 为单位)超过 0.2 个周期/样本左右。这意味着一些中频内容可以通过抗噪去卷积方法恢复,但直流和更高频率的内容会消失。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 2016-09-19
      相关资源
      最近更新 更多