使用MKL进行复杂到真实的IFFT

时间:2015-06-19 17:07:16

标签: fortran fft intel-mkl

我正在尝试对具有共轭甚至对称性的复数输入数组进行一维IFFT变换,其中z(1)z(N/2+1)是真实的。数组的总大小为N=256。如果我按以下方式准备IFFT:

stat = DftiCreateDescriptor( desc_handle, DFTI_DOUBLE, DFTI_REAL, 1,256)
stat = DftiSetValue(desc_handle, DFTI_CONJUGATE_EVEN_STORAGE, DFTI_COMPLEX_COMPLEX)

stat = DftiSetValue(desc_handle, DFTI_PLACEMENT, DFTI_NOT_INPLACE)

stat = DftiComputeBackward(desc_handle, X_in, M_out)

...其中X_in具有甚至如上所述的共轭对称性。这意味着M_out在某种意义上应该是一个数学真实数组:

real(dp) :: M_out(N+2)

然后预期的真实fortran数组中的每个其他元素都等于零。

complex(dp) :: M_out(N/2)

然后预期的复数fortran数组将具有N/2大小,虚部为零。

然而,在完成上述操作后,我得到的结果并不真实。就像例程不理解输入复数fortran数组没有共轭甚至对称性。这是为什么?我是否必须添加任何其他首选项参数以确保正确读取输入结构?

1 个答案:

答案 0 :(得分:0)

在此示例中,前向域是实际的,后向域即使是复杂的存储也是共轭的。因此,MKL期望X_in的类型为Complex [],而M_out的类型为Real []。结果是真实的。

我怀疑,你提供了一个复杂的数组作为M_out。然后该数组被解释为Real []并包含反向变换的实际结果。没有插入虚部的零。