FFT 算法错误

Posted

技术标签:

【中文标题】FFT 算法错误【英文标题】:FFT Algorithm Bug 【发布时间】:2017-04-05 19:40:29 【问题描述】:

尝试在 python 中实现 FFT 算法,并遇到了一个我似乎无法弄清楚的错误。

这是我的代码:

def FFT(co, inverse=False):
  if len(co) <= 1:
    return co

  even = FFT(co[::2], inverse)
  odd = FFT(co[1::2], inverse)

  y = [0] * len(co)
  z = -1 if inverse else 1

  for k in range(0, len(co)//2):
    w = np.round(math.e**(z*1j*math.pi*(2*k / len(co))), decimals=10)
    y[k] = even[k] + w*odd[k]
    y[k + len(co)//2] = even[k] - w*odd[k]

return y

当我跑步时

x1 = FFT([1, 1, 2, 0])
print x1

print np.fft.fft([1, 1, 2, 0])

我明白了:

[(4+0j), (-1+1j), (2+0j), (-1-1j)]
[ 4.+0.j -1.-1.j  2.+0.j -1.+1.j]

所以对于索引 1 和索引 3,它是复共轭。有什么想法吗?

【问题讨论】:

你试过z = +1 if inverse else -1吗? 是的……那行得通!谢谢 【参考方案1】:

definition of the forward Discrete Fourier Transform used by np.fft.fft 由:

您应该注意到复指数参数中的负号。

另一方面,在您的实现中,您使用正号进行正向变换,并且这种将参数符号反转为复指数会导致频谱共轭。

因此,要让您的实现产生与 np.fft.fft 相同的结果,您只需将正向和反向转换的符号反转:

z = +1 if inverse else -1

(而不是z = -1 if inverse else 1)。

【讨论】:

以上是关于FFT 算法错误的主要内容,如果未能解决你的问题,请参考以下文章

Numpy FFT错误 - 带信封的梳状滤波器

内存要求:N 点 FFT(出现错误)

错误结果绘图窗口 FFT

真正的 fft 错误 - ffmpeg

假设 FFT 结果错误

FFT 频率分析似乎得到了错误的值