【问题标题】:Conflict in Imaginary parts after IFFTIFFT后虚部冲突
【发布时间】:2013-11-08 16:02:26
【问题描述】:

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

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

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


【解决方案1】:

如果您想要一个严格的实数结果(虚部都等于零),那么您需要在 IFFT 之前使向量完全共轭对称(实部镜像,虚部反镜像)。

Matlab 和 C 以不同的方式处理数组的索引 0 或 1。确保您的过滤器也考虑到这一点。

【讨论】:

  • 感谢您的指点。我的 IFFT 输入信号(即在 step2 滤波器之后)不需要是共轭对称的。因此,我知道IFFT之后的虚部不会为零。那不是问题。问题是在IFFT之后,虚部对我来说仍然很重要。但是与 Matlab.IFFT 实现相比,C 实现(我在上面提到过)计算的虚数不同。换言之,这两种 IFFT 实现在处理相同的输入非对称信号时存在冲突。
猜你喜欢
  • 2013-12-16
  • 1970-01-01
  • 2018-01-13
  • 2010-10-22
  • 2018-04-29
  • 1970-01-01
  • 2014-08-17
  • 2023-03-12
  • 2018-02-08
相关资源
最近更新 更多