IFFT 后虚部冲突

标签 c matlab signal-processing fft ifft

我只想知道 IFFT 后虚部冲突背后的原因。

对于我的 C/C++ 实现和 Matlab 实现,我正在执行相同的以下步骤。

  1. 我的信号 x 的维度是 Mx1,我执行了 N 点 FFT(其中 N = 2*M) 在该信号上得到频域中的 N 点信号。
  2. 对此频域信号应用自定义滤波器(实部和虚部逐步改变)。
  3. 执行 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/

相关文章:

matlab - 在 MATLAB 上绘制金字塔

arrays - Julia 中的元素明智减法

c++ - 带通 FIR 滤波器

matlab - 在 MATLAB 中根据信号数据确定频率

matlab - matlab中的新手互相关

c - 如何使用用户输入的 int 类型定义数组中的元素数量?

c - *C* 可接受的二维字符串输入?

c - 如何在 DOS/C 中访问非标准 COM 端口(USB->Serial,COM5+)?

matlab - 是否有正确的方法来绘制比率直方图?

c - Sscanf 没有返回我想要的