首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用signal.convolve将signal.deconvolve应用于与瑞克小波卷积的信号,从而正确地重建信号?

如何使用signal.convolve将signal.deconvolve应用于与瑞克小波卷积的信号,从而正确地重建信号?
EN

Stack Overflow用户
提问于 2020-10-20 05:57:19
回答 1查看 275关注 0票数 1

因此,我将一个数组存储在一个维数为(251,240)的矩阵中。接下来,我创建了一个ricker小波,并将其与每一列(时间序列)进行卷积。这似乎工作得很好。在我的过程中的下一步将是用相同的ricker小波去卷积卷积的结果。我希望重建我的原始信号,但事实并非如此。我做错了什么?我如何正确地对ricker小波进行去卷积?

我将我的一些代码附加在下面

代码语言:javascript
复制
# 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()

这里显示的图是我期望从卷积中得到的。(我还不能添加图片。对此我很抱歉)。

下一步(解卷积)似乎不太好用。

代码语言:javascript
复制
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)一点也不相似。我做错了什么?我怎样才能纠正这个错误呢?

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-21 13:26:28

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

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

这是一张rickert2的曲线图,在底部是它的频率响应曲线图。

ricker2非常流畅!这肯定很难去卷积。底图显示,频率响应在直流处为零,并且在超过0.2周/采样时迅速下降(请注意,y轴为dB)。这意味着一些中频成分可以通过噪声鲁棒的反卷积方法恢复,但直流和更高频率成分已经消失。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64435625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档