用pyculib进行三维FFT的结果是错误的

2024-05-29 02:08:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用pyculib在anaconda3.5中的矩阵上执行3D FFT。我刚刚跟踪了在网站上发布的the example code。但我发现了一些有趣的东西,不明白为什么。在

仅当使用numpy.arange创建矩阵时,使用pyculib对矩阵执行3D FFT是正确的。在

代码如下:

from pyculib.fft.binding import Plan, CUFFT_C2C
import numpy as np
from numba import cuda
data = np.random.rand(26, 256, 256).astype(np.complex64)
orig = data.copy()
d_data = cuda.to_device(data)
fftplan = Plan.three(CUFFT_C2C, *data.shape)
fftplan.forward(d_data, d_data)
fftplan.inverse(d_data, d_data)
d_data.copy_to_host(data)
result = data / n
np.allclose(orig, result.real)

最后,结果是错误。而原始结果之间的差异不是一个小数目,不可忽略。 我尝试了一些其他的数据集(不是随机数),得到了一些错误的结果。在

另外,我在没有逆FFT的情况下进行测试:

^{pr2}$

结果也是错误的。在

网站上的测试代码,他们使用numpy.arange来创建矩阵。我试着:

n = 26*256*256
data = np.arange(n, dtype=np.complex64).reshape(26,256,256)

该矩阵的FFT结果是正确的。在

有谁能帮忙指出原因吗?在


Tags: fromimportfftnumpydata网站错误np
1条回答
网友
1楼 · 发布于 2024-05-29 02:08:03

我不使用CUDA,但我认为你的问题本质上是数值问题。区别在于您使用的两个数据集。随机.rand动态范围为0-1,范围为0-26*256*256。FFT尝试按值的范围/点数的顺序来解析空间频率分量。对于arange来说,这是统一的,FFT在数值上是精确的。对于rand,这是1/26*256*256~5.8e-7。在

只需在numpy数组上运行FFT/IFFT而不使用CUDA就可以显示出类似的差异。在

相关问题 更多 >

    热门问题