如何使用signal.deconvolve正确地重建信号,将其应用于使用signal.convolve的ricker小波卷积的信号?

2024-05-14 10:51:48 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我有一个数组存储在一个矩阵中,它的维数为(251240)。接下来,我创建了一个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()

解卷积地震记录阵列具有正确的尺寸,但信号与原始信号(地震数据)完全不同。我做错了什么?我怎样才能纠正这个问题

提前谢谢


Tags: signaltimenptracepltaxarray卷积
1条回答
网友
1楼 · 发布于 2024-05-14 10:51:48

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

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

这里是rickert2的曲线图,底部是它的频率响应曲线图

Plot of ricker2

ricker2非常平滑!这绝对是很难去卷积的。底部曲线图显示,频率响应在直流时为零,并且在0.2个周期/样本左右的范围内快速下降(注意y轴以dB为单位)。这意味着一些中频内容可以通过抗噪反褶积方法恢复,但直流和高频内容消失了

我建议试试看。这是鲁棒反褶积的经典方法。在this github gist中有一个Python实现(请参阅“维纳_反褶积”函数)

相关问题 更多 >

    热门问题