【发布时间】:2013-11-08 16:02:26
【问题描述】:
我只想知道 IFFT 之后的虚部冲突背后的原因。
对于我的 C/C++ 实现和 Matlab 实现,我正在执行相同的以下步骤。
- 我的信号 x 的维度为 Mx1,我执行 N 点 FFT(其中 N = 2*M) 在该信号上得到 N 点的频域信号。
- 对此频域信号应用自定义滤波器(实部和虚部都逐步更改)。
- 在 N 点逆 FFT 中执行。
C/C++ 和 Matlab 实现都生成完全相同的结果,除了在逆 IFFT 步骤之后,虚部不匹配但实部匹配。
如果我跳过上面的步骤 2,两个实现的 IFFT 输出匹配没有任何问题。 我的 IFFT 输入信号(即在 step2 滤波器之后)不需要是共轭对称的。事实上,这个信号甚至可能不是厄米特/对称的。
目前,我正在使用 FFT/IFFT 的 C 实现定义为函数 smbFft,在此 CPP-FILE 中可用。
任何线索,为什么会发生这种情况?
PS:如果有人能指出 C/C++ 中的 FFT 实现,那就太好了,它与相应的 Matlab 实现完全一致。
谢谢。
编辑:我刚刚测试了 FFTW 实现,而不是 smbFfT(我在上面提到过)。 FFTW 实现也有同样的问题,这表明这两种测试的 C 实现都使用厄米对称设置执行 IFFT。我需要在 C 中执行与 Matlab 对 IFFT(..., 'nonsymmetric') 相同的 IFFT。
【问题讨论】:
-
发布您的代码。特别要注意 Matlab
'运算符,它应用了复杂的共轭 -
尝试 FFT -> IFFT 没有两个代码的其他更改也确认您的 C 代码中的逆运算是正确的。结果应该等于输入(考虑到数值精度)
-
@Sebastien 我刚刚在上面编辑,我跳过上面的第2步,IFFT的输出与Matlab的IFFT匹配。
-
@LuisMendo 感谢您的指点。我知道这个操作。
-
你在这两种情况下使用完全相同的过滤器吗?我曾经将 fftw 用于 C 代码。非常高效和强大。
标签: c matlab signal-processing fft ifft