如何进行FFT卷积?如何进行规范化?

问题描述

在 Python 中,我们可以通过 numpy.fft 进行卷积。例如,如果我们尝试计算 SIS 模型的引力透镜信号,我们可以将 $\kappa$ 定义为 $\kappa = \frac{\theta_{\rm E}}{2|\theta|}$,那么我们可以通过卷积计算偏转角 $\alpha$ 为 $\alpha = \frac{1}{\pi} \int d\theta'^2 \kappa(\theta) \frac{\theta-\theta' }{|\theta-\theta'|}$ 。理论上,偏转为 $\alpha(\theta) = \theta_{\rm E}\frac{\theta}{|\theta|}$。但是当我尝试通过 numpy.fft 计算它时,我对一些标准化的因素感到困惑。例如,

npix   = 2048        #mesh grid number
thetaE = 0.5         #a constant
dtheta = thetaE/10   #grid resolution
theta_x,theta_y,theta = mesh_theta(npix,dtheta)  #assign grid position for calculation,theta will be an array of 2048*2048

kappa = thetaE/2./theta   #define kappa mesh,2048*2048
kern_alpha_x,kern_alpha_y = kernal_alpha(theta_x,theta_y)    #define kernal mesh,2048*2048

###zero padding should be used###

kappa_fft = np.fft.fft2(kappa)
kern_alpha_x_fft = np.fft.fft2(kern_alpha_x)
kern_alpha_y_fft = np.fft.fft2(kern_alpha_y)

alpha_x = np.fft.fftshift(np.fft.ifft2(kappa_fft*kern_alpha_x_fft)).real
alpha_y = np.fft.fftshift(np.fft.ifft2(kappa_fft*kern_alpha_y_fft)).real

如上所示,$\alpha_{\rm x}$,$\alpha_{\rm y}$ 可以通过 $\kappa$ 和 $K_{\alpha_{\rm x}}$ 之间的卷积计算, $K_{\alpha_{\rm y}}$,表示偏转 $|\alpha| = \sqrt{\alpha_{\rm x}^2+\alpha_{\rm y}^2}$。但是,当我检查 alpha_x,alpha_y 的结果时,似乎应该乘以归一化。如果我将一个因子乘以 np.sqrt(alpha_x**2 + alpha_y**2)*dtheta*dtheta,那么结果似乎是正确的。我不知道是否应该使用这种标准化dtheta*dtheta,为什么?谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)