我正在尝试使用 C 中的 FFTW 从 Python 中的
scipy.fft
中的一些已知工作代码重新创建结果。我发现我的结果有一些小错误。
我的输入数据是真实的 3d 数据,尺寸 = (294, 294, 294)。
我的 scipy.fft 调用如下所示:
complex_data_out = scipy.fft.fftn(real_data_in,s=dimensions)
我的 fftw 代码如下所示:
fftw_plan plan = fftw_plan_dft(3, dimensions, complex_data_in, complex_data_out, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(plan);
注意
complex_data_in == real_data_in
所有虚数都为 0。
我已验证两个程序之间的
real_data_in
匹配。
无论如何,我得到的结果略有不同。如果我从两个complex_data_out数组中抓取几个任意点,我会得到这些值:
SciPy:
pt 1: 187904.8906250 + 132361.1718750 i
pt 2: 112964.4062500 + 237751.6250000 i
FTTW:
pt 1: 187709.8070491 + 132244.8899144 i
pt 2: 113043.6615987 + 238079.0344479 i
有关缩放因子的一些调试:
scipy val one r / fftw val one r = 1.001039283
scipy val one i / fftw val one i = 1.000879293
scipy val two r / fftw val two r = 0.999298896
scipy val two r / fftw val two r = 0.998624787
这些差异是如此之小,以至于它们可能由某些标准化因素引起是没有意义的。而且尺度不一致。
是否有人有过使用 FFTW 与 SciPy、MATLAB 或 NumPy 等得到稍微不同的结果的经验?我见过人们在互联网上讨论巨大的差异(由于标准化因素),但不是小的不一致差异。
我的第一个预感是,也许我的 C 代码在数据分配或数据初始化的某个地方出现了一个错误,但我一直在寻找,但我不认为是这样。
好吧,所以我的预感是对的。这是我的 C 代码中的一次计数错误。数据的一个边缘被忽略(大部分为零,但并非全部)。事实上,现在 FFTW 代码与 scipy 代码足够接近,可以在我的测试数据集上获得至少 6 位小数的一致性。够好了!啤酒时间!