Python 确定性傅里叶反褶积
我用numpy做傅里叶反褶积有点麻烦。我目前正在尝试使用一个3高斯的测试用例,这样我就可以确切地知道每一端会发生什么 我试图恢复的是给定滤波器和输出的精确形式的输入信号 这里,我使用了一个简单的约束来抑制高频端,将其设置为零(因为信号在傅里叶空间中也是高斯的)。由于这个限制,我希望通过一点点响声来恢复我的原始输入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
#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()
这里,橙色是使用输出和模糊的反卷积恢复的输入信号
对此,我有几个问题:
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]一样处理帧之间的不匹配问题。
滤波器的设计通常是为了减少高频噪声的影响。因此,反褶积可能导致高频噪声放大。像你一样筛选频率是一个潜在的解决方案。请注意,这完全等同于使用特定滤波器对信号进行卷积
在层析重建范围内,滤波后的反投影算法需要应用斜坡滤波器,这会极大地增加高频噪声。提出了一种:在给定卷积信号信噪比的情况下,这种滤波器可以设计成使反卷积信号的均方误差最小的滤波器。然而,它需要一些关于信号和噪声功率谱密度的假设 啊!!谢谢你的帮助。我意识到我的缩放问题在哪里。我有点不确定是否要改变内核。它肯定会给我带来我所期待的结果,但是它的理由是什么呢?不客气。我在答案中添加了几行来调查延迟是如何发生的。我明白了,谢谢你的补充意见!我意识到我也可以在中的离散卷积方程中看到这一点。