使用 DFT (FFT) 计算卷积

计算科学 模拟 傅立叶分析 傅里叶变换 卷积
2021-11-27 07:42:51

我有以下卷积作为数值模拟的一部分。

T(r)=d3r2p(r2)f(r2)α(rr2).

我的问题是的解析表达式确实存在,但是,我只有在傅里叶域中的 alpha(k) 形式我计划通过以下方式进行评估:fpαα(k)

  1. 使用numpy中的meshgridlinspace使用的网格网格构造网格100×100×100
ran = linspace(-1,1,N_r)
x,y,z = meshgrid(ran,ran,ran) #position space
  1. 从 x, y, z 构造傅里叶域中的分量 xf, yf, zf
xf = fftn(x)
yf = fftn(y)
zf = fftn(z)
  1. 在 numpy 中使用fftn 求的傅里叶变换f(r)×p(r)
  2. 乘以α(k)
  3. 在 numpy 中使用ifftn进行傅里叶逆变换。

我不太确定上述方法是否有效,实际上我未能正确验证它。我尝试使用 scipy.ndimage.convolve 将结果与傅里叶域中产品的傅里叶逆变换进行比较。我对代码所做的事情是否正确?有没有一种方法可以验证一种方法是否适用于更简单的示例?

试图验证:

我尝试了以下方法来测试该理论。似乎它不起作用。我希望结果res_1res_2相同。我还使用函数real截断由fftnifftn函数产生的微小虚部

x = linspace(-1,1,10)
xf = fftn(x)

def f(x):
    return x**2+x**3*sin(x)

def g(k):
    return k**2+k**3/(3-k**2)

g_k = g(xf)
g_x = real(ifftn(g_k))

res_1 = img_con(g_x,f(x))

res_2 = real(ifftn(g(xf)*fftn(f(x))))

print(res_1)
print(res_2)

我在做错事吗?

1个回答

您需要注意,除非正确填充频域乘法 (DFT),否则在线性卷积之后会应用循环卷积。

有关实际示例和更多信息,请查看我的答案:

  1. 频域中的核卷积-循环填充
  2. 关于线性和圆形卷积的问题 - 1D 和 2D