FFTW从numpy.fft

时间:2018-05-03 18:05:13

标签: python c++ numpy fft fftw

我正在将一些C ++代码移植到Python。 C ++代码使用FFTW库执行DFT和IDFT,而在Python中,我选择暂时使用numpys实现。

我遇到了一些奇怪的行为。在两种情况下,似乎前向变换的计算方式相同,但逆变换会产生不同的结果!

相关的C ++代码:

int N = 12;
auto fft_coefficients = new complex<double>[N] {
        5.45, -0.54, 1.81, 1.49, 0.48, 3.98, 0.93, 3.98, 0.48, 1.49, 1.81, -0.54 };
fftw_plan plan_ifft = fftw_plan_dft_1d(
        N, reinterpret_cast<fftw_complex *>(fft_coefficients),
        reinterpret_cast<fftw_complex *>(fft_coefficients), FFTW_BACKWARD,
        FFTW_ESTIMATE);
fftw_execute(plan_ifft);
// Results in
// [20.82, -1.98, 4.55, 1.86, 3.63, 13.68, 1.10, 13.68,, 3.63, 1.86, 4.55, -1.98]

但是,当我在Python中运行相同的代码但使用numpy时,我得到以下内容:

np.fft.ifft(np.array([5.45, -0.54, 1.81, 1.49, 0.48, 3.98, 0.93, 3.98, 0.48, 1.49,
                      1.81, -0.54], dtype=np.complex64)).real
# array([ 1.73, -0.16,  0.38,  0.15,  0.3 ,  1.14,  0.09,  1.14,  0.3 ,
#         0.15,  0.38, -0.16])

我认为我可能需要将norm='ortho'选项添加到numpy来进行单一IDFT,但这并不能使它们匹配。

我不明白这两个库如何以不同的方式计算逆DFT,而不仅仅是一点点,完全不同的结果。

3 个答案:

答案 0 :(得分:2)

FFTW claims:“FFTW计算非标准化DFT”

即ifft they compute enter image description here

但是,正如wikipedia所述,反向DFT定义为enter image description here

所以fftw输出实际上是不正确的,需要缩放。

答案 1 :(得分:2)

至少在电气工程界,没有标准化的标准。这些都不是“错误的”,您只需要知道每个库在计算什么并加以处理即可。

答案 2 :(得分:0)

没关系。我找到了答案。显然,FFTW通过归一化因子处理归一化与numpy不同。如果我将N乘以SELECT OBJECT_NAME(id), count(text) FROM syscomments WHERE [text] like '%AccountAttributes%' AND OBJECTPROPERTY(id, 'IsProcedure') = 1 and OBJECT_NAME(id) in ( 'sproc_name','sproc_name1' ) GROUP BY OBJECT_NAME(id) ,我会得到与FFTW相同的结果。

这开启了另一个问题:哪一个正在跳过正向变换中的规范化?为什么?这似乎是非常不一致的行为。