【问题标题】:Fourier deconvolution with numpy用 numpy 进行傅里叶反卷积
【发布时间】:2018-04-14 16:52:29
【问题描述】:

我正在尝试使用傅立叶反卷积从信号中删除我的探针功能,但我无法通过测试信号获得正确的输出。

t = np.zeros(30)
t = np.append(t, np.arange(0, 20, 0.1))

sigma = 2
mu = 5.
g = 1/np.sqrt(2*np.pi*sigma**2) * np.exp(-(np.arange(mu-3*sigma,mu+3*sigma,0.1)-mu)**2/(2*sigma**2))

def pad_signals(s1, s2):
    size = t.size +g.size - 1
    size = int(2 ** np.ceil(np.log2(size)))
    s1 = np.pad(s1, ((size-s1.size)//2, int(np.ceil((size-s1.size)/2))), 'constant', constant_values=(0, 0))
    s2 = np.pad(s2, ((size-s2.size)//2, int(np.ceil((size-s2.size)/2))), 'constant', constant_values=(0, 0))
    return s1, s2

def decon_fourier_ratio(signal, removed_signal):
    signal, removed_signal = pad_signals(signal, removed_signal)
    recovered = np.fft.fftshift(np.fft.ifft(np.fft.fft(signal)/np.fft.fft(removed_signal)))
    return np.real(recovered)

gt = (np.convolve(t, g, mode='full') / g.sum())[:230]
tr = decon_fourier_ratio(gt, g)

fig, ax = plt.subplots(nrows=2, ncols=2, sharex=True)
ax[0,0].plot(np.arange(0,np.fft.irfft(np.fft.rfft(t)).size), np.fft.irfft(np.fft.rfft(t)), label='thickness')
ax[0,1].plot(np.arange(0,np.fft.irfft(np.fft.rfft(g)).size), np.fft.irfft(np.fft.rfft(g)), label='probe shape')
ax[1,0].plot(np.arange(0,gt.size),gt, label='recorded signal')
ax[1,1].plot(np.arange(0,tr.size),tr, label='deconvolved signal')
plt.show()

上面的脚本创建了一个演示样本(t)和一个高斯形状的探针(g)。然后,它将它们卷积成一个信号 gt,这是一个样本在探测时的样子。我用 pad_signals() 将信号填充到最接近的 2^N,以提高效率并修复任何非周期性。然后我尝试用 decon_fourier_ratio() 移除高斯探针。从图像中可以清楚地看出,我没有恢复初始厚度梯度。任何想法为什么反卷积不起作用?

注意:我也尝试过 SciPy 的反卷积。但是,这个函数只适用于特定宽度的高斯函数。

非常感谢任何帮助,

埃里克

【问题讨论】:

    标签: python numpy fft deconvolution


    【解决方案1】:

    您没有进行全卷积的任何原因?如果我将gt 的构造更改为:

    g /= g.sum()  # so the deconvolved signal has the same amplitude
    gt = np.convolve(t, g, mode='full')
    

    然后我得到以下图:

    除了部分卷积可能会改变频率内容外,我无法完全告诉您为什么会看到这种行为。或者,如果您想获得相同的行为并使用same,您可以用零填充您的输入信号。

    【讨论】:

    • 我刚试过这确实解决了恢复不正确信号的问题。我的猜测是因为卷积信号现在是连续的。唯一的问题是厚度“无限增加”,即我的探头只会看到厚度增加,因此卷积信号不应减少。我在上面发布了一个更正的图像,并将代码更正为 230 处的裁剪。
    猜你喜欢
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 2019-07-19
    相关资源
    最近更新 更多