C++ FFTW与pyFFTW逆傅里叶变换结果存在N倍差异的咨询
pyFFTW与C++ FFTW逆傅里叶变换结果的缩放差异原因及解决办法
你遇到的结果差异并非操作错误,核心原因是两者对逆傅里叶变换的归一化默认设置不同:
- C++版FFTW的
fftw_plan_dft_1d执行逆变换(FFTW_BACKWARD)时,默认不做归一化处理,输出是逆变换的原始计算值(未除以数组长度N)。 - pyFFTW的
FFTW类默认会对逆变换自动应用1/N的归一化,这是它为了贴近NumPy的FFT接口行为做的封装适配,虽然是FFTW的直接封装,但默认配置做了对齐调整。
验证你的示例
你的数组长度N=4:
- C++输出的
(10, 0)除以4得到2.5+0.j,(-2, -2)除以4得到-0.5-0.5j,完全对应pyFFTW的输出,证明确实是归一化因子导致的差异。
解决办法
1. 修改pyFFTW配置,关闭自动归一化
创建FFTW对象时添加normalise_idft=False参数,即可和C++版FFTW行为完全一致:
import numpy as np import pyfftw K = pyfftw.empty_aligned(4, dtype='complex128') X = pyfftw.empty_aligned(4, dtype='complex128') # 关闭逆变换自动归一化 ifftDoer = pyfftw.FFTW(K, X, direction='FFTW_BACKWARD', normalise_idft=False) K[:] = np.array([1, 2, 3, 4]) ifftDoer() print(X) # 输出:[10.+0.j -2.-2.j -2.+0.j -2.+2.j]
2. 修改C++代码,手动添加归一化
执行逆变换后,将每个输出元素除以N,即可和pyFFTW默认输出一致:
int main() { int N = 4; fftw_complex *in, *out; fftw_plan p; in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); p = fftw_plan_dft_1d(N, in, out, FFTW_BACKWARD, FFTW_ESTIMATE); for (int i = 0; i < 4; i++) { in[i][0] = i+1; in[i][1] = 0; } fftw_execute(p); // 手动添加归一化 for (int i = 0; i < N; i++) { out[i][0] /= N; out[i][1] /= N; } printFFTWComplexArr(out, N); fftw_destroy_plan(p); } // 输出会和pyFFTW默认结果一致
补充说明
pyFFTW的默认归一化行为是为了对齐numpy.fft系列函数的逻辑,如果你习惯NumPy的FFT操作,默认设置会更顺手;如果需要严格和C++ FFTW的原始行为保持一致,关闭自动归一化即可。
内容的提问来源于stack exchange,提问作者Remeraze
相关产品推荐
相关产品推荐

