我只想知道 IFFT 后虚部冲突背后的原因。
对于我的 C/C++ 实现和 Matlab 实现,我正在执行相同的以下步骤。
- 我的信号 x 的维度是 Mx1,我执行了 N 点 FFT(其中 N = 2*M) 在该信号上得到频域中的 N 点信号。
- 对此频域信号应用自定义滤波器(实部和虚部逐步改变)。
- 执行 N 点逆 FFT。
C/C++ 和 Matlab 实现生成完全相同的结果,除了在逆 IFFT 步骤之后,虚部不匹配但实部匹配。
如果我跳过上面的第 2 步,两个实现的 IFFT 输出匹配没有任何问题。 我的 IFFT 输入信号(即,在第 2 步滤波器之后)不需要共轭对称。事实上,这个信号甚至可能不是厄尔米特/对称信号。
目前,我正在使用 FFT/IFFT 的 C 实现,定义为函数 smbFft
,可在此 CPP-FILE 中找到.
任何线索,为什么会发生这种情况?
PS:如果有人可以向我指出 C/C++ 中的 FFT 实现,它与相应的 Matlab 实现完全一致,那就太好了。
谢谢。
编辑:我只是测试了 FFTW 实现而不是 smbFfT
(我在上面提到过)。 FFTW 实现也有同样的问题,这表明这两个经过测试的 C 实现都使用厄密对称设置执行 IFFT。我需要在 C 中执行与 Matlab 使用 IFFT(..., 'nonsymmetric')
执行的相同的 IFFT。
最佳答案
如果您想要严格实数的结果(虚部全部为零),则需要在 IFFT 之前使 vector 完全共轭对称(实部镜像,虚部反镜像)。
Matlab 和 C 以不同方式处理数组的索引 0 或 1。确保您的过滤器也考虑到了这一点。
关于IFFT 后虚部冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19863410/