Python 确定性傅里叶反褶积

Python 确定性傅里叶反褶积,python,numpy,Python,Numpy,我用numpy做傅里叶反褶积有点麻烦。我目前正在尝试使用一个3高斯的测试用例,这样我就可以确切地知道每一端会发生什么 我试图恢复的是给定滤波器和输出的精确形式的输入信号 这里,我使用了一个简单的约束来抑制高频端,将其设置为零(因为信号在傅里叶空间中也是高斯的)。由于这个限制,我希望通过一点点响声来恢复我的原始输入 #Dummy Case for Gaussian convolve with Gaussian N = 128 x = np.arange(-5, 5, 10./(2 * N)) e

我用numpy做傅里叶反褶积有点麻烦。我目前正在尝试使用一个3高斯的测试用例,这样我就可以确切地知道每一端会发生什么

我试图恢复的是给定滤波器和输出的精确形式的输入信号

这里,我使用了一个简单的约束来抑制高频端,将其设置为零(因为信号在傅里叶空间中也是高斯的)。由于这个限制,我希望通过一点点响声来恢复我的原始输入

#Dummy Case for Gaussian convolve with Gaussian

N = 128
x = np.arange(-5, 5, 10./(2 * N))
epsilon = 1e-18

def gaus(x,sigma):
    return 1./np.sqrt(2*np.pi)/sigma * np.exp(-(x * x)/(2 * sigma**2))

y_g = gaus(x,0.3)     #output gaussian blurred signal
y_b = gaus(x,0.1)     #gaussian blur filter
y_i = gaus(x,np.sqrt(0.3**2 - 0.1**2))   #og gaussian input

f_yg = np.fft.fft(y_g)    #fft the blur
f_yb = np.fft.fft(y_b)    #fft the filter
f_yi = np.fft.fft(y_i)

r_f = (np.fft.fftshift(f_yg)+epsilon)/(np.fft.fftshift(f_yb)+epsilon)      #deconvolve by division in fourier space
r_f[np.abs(x)>0.5] = 0    #naive constraint to remove the artifacts by knowing final form is gaussian

r_f = np.fft.ifftshift(r_f)

r_if = np.fft.ifft(r_f)
y_gf = np.fft.ifft(f_yg)
y_bf = np.fft.ifft(f_yb)
y_if = np.fft.ifft(f_yi)

plt.plot(x,y_if, label='fft true input')
plt.plot(x,r_if, label='fft recv. input')
plt.legend(framealpha=0.)
plt.show()

这里,橙色是使用输出和模糊的反卷积恢复的输入信号

对此,我有几个问题:

  • 显然存在一个缩放问题。我认为这可能会出现的唯一方面是当我应用天真约束时。在这一步中,我是否应该重新规范化,知道傅里叶空间上的1/sqrt(N)*积分等于1
  • 看起来恢复的高斯曲线的位置被曲线两边的一半弄乱了。这是因为傅里叶空间的分裂吗?我如何恢复原来的位置(或者我一开始做的完全错误)
  • 我已经附加了用于生成两条曲线的脚本,原始输入和物理空间中恢复的输入

    干杯, 基文

    编辑:我应该补充一点,使用scipy.deconvolve+一些小的编辑来恢复图像没有问题。这一定意味着我这里的方法有点错误?

    1)正如您正确理解的,缩放的要求与离散傅里叶变换有关。最好的方法是计算两个均匀单位信号的反褶积。他们的DFT是n0….,其中n是DFT的点数。因此,比值r_f为1 0 0,由
    np.fft.ifft()
    计算的反向fft为1/n1/n1/n。。。 反褶积产生的正确信号应为1/t1/t1/T…,其中T=10。是框架的长度

    因此,执行反褶积的正确比例为
    n/T=len(r\u f)/10。

    r_if=r_if*len(r_if)/10.
    
    2) 反褶积信号被平移半个周期。这是因为高斯核位于帧的中间。只需将内核移动半个周期,问题就解决了。函数
    np.fft.fftshift()
    可用于此目的:

    f_yb = np.fft.fft(np.fft.fftshift(y_b))    #fft the filter
    
    编辑:为了研究转换的原因,让我们关注反褶积核是非常窄的高斯分布的情况,几乎对应于狄拉克分布。您的输入信号是一条高斯曲线,以零为中心,采样帧在-5和5之间。类似地,反褶积核是一个以零为中心的狄拉克。因此,反褶积信号必须与输入信号相同:以零为中心的高斯曲线。然而,在FFTW中实现的DFT,以及因此
    np.fft.fft()
    ,在点10j/n处采样,其中j在[0..n-1]中,傅里叶空间中的频率为k/10,其中k在[0..n/2,-n/2+1..-1]中。因此,此DFT将信号视为以5为中心的高斯信号,反褶积核视为以5为中心的狄拉克。函数f(t)与以t0为中心的狄拉克δ(t-t0)的卷积就是平移函数f(t-t0)。因此,由
    np.fft.fft()
    计算的反褶积结果是将输入信号转换半个周期。由于输入信号在[-5,5]帧中居中于0,因此由
    np.fft.fft()
    计算的输出信号居中于-5(或由于周期性而等效于5)移动内核解决了我们认为帧是[-5]和
    np.fft.ifft()
    像处理[0 10]一样处理帧之间的不匹配问题。

    滤波器的设计通常是为了减少高频噪声的影响。因此,反褶积可能导致高频噪声放大。像你一样筛选频率是一个潜在的解决方案。请注意,这完全等同于使用特定滤波器对信号进行卷积


    在层析重建范围内,滤波后的反投影算法需要应用斜坡滤波器,这会极大地增加高频噪声。提出了一种:在给定卷积信号信噪比的情况下,这种滤波器可以设计成使反卷积信号的均方误差最小的滤波器。然而,它需要一些关于信号和噪声功率谱密度的假设

    啊!!谢谢你的帮助。我意识到我的缩放问题在哪里。我有点不确定是否要改变内核。它肯定会给我带来我所期待的结果,但是它的理由是什么呢?不客气。我在答案中添加了几行来调查延迟是如何发生的。我明白了,谢谢你的补充意见!我意识到我也可以在中的离散卷积方程中看到这一点。