scipy.fft (Python) 结果和 FFTW (C) 结果之间的细微差别

问题描述 投票:0回答:1

我正在尝试使用 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 代码在数据分配或数据初始化的某个地方出现了一个错误,但我一直在寻找,但我不认为是这样。

python c scipy fft fftw
1个回答
0
投票

好吧,所以我的预感是对的。这是我的 C 代码中的一次计数错误。数据的一个边缘被忽略(大部分为零,但并非全部)。事实上,现在 FFTW 代码与 scipy 代码足够接近,可以在我的测试数据集上获得至少 6 位小数的一致性。够好了!啤酒时间!

© www.soinside.com 2019 - 2024. All rights reserved.