【问题标题】:Fast Fourier Transform algorithm wrong by a single minus sign快速傅里叶变换算法因单个减号而出错
【发布时间】:2021-10-28 01:34:39
【问题描述】:

所以看完这个关于快速傅立叶变换的视频https://www.youtube.com/watch?v=h7apO7q16V0

我分析了伪代码并在 python 中实现了它,发现它产生的输出与许多 fft 计算器网站的输出不同。我的价值观似乎都在那里,只是奇怪,因为订单不合适,任何人都知道为什么。它是一种不同的算法实现还是什么。


import cmath
import math
def FFT(P):
    n= len(P)

    if n == 1:
        return P

    omega = cmath.exp((2 * cmath.pi * 1j)/n)

    p_even = P[::2]
    p_odd = P[1::2]

    y_even = FFT(p_even)
    y_odd = FFT(p_odd)

    y = [0] * n

    
    for i in range(n//2):
        y[i] = y_even[i] + omega**i*y_odd[i]
        y[i+n//2] = y_even[i] - omega**i*y_odd[i]
    return y

    
poly = [0,1,2,3]
print(FFT([0,1,2,3]))

我测试它的网站是https://tonysader.github.io/FFT_Calculator/? 我在这个站点输入 0,1,2,3 得到:6, -2+2J, -2, -2+-2J

而我的python程序输出:6,-2-2J,-2,-2+2J

我遵循的伪代码:

【问题讨论】:

  • 我强烈建议您不要关注 YouTube 视频来学习这些内容。这些没有质量控制,人们可以在这些视频中说任何他们想说的!这个似乎缺少一个减号。与Wikipedia比较。

标签: python image-processing signal-processing fft


【解决方案1】:

我认为您正在运行的程序正在执行逆 FFT。尝试 omega = cmath.exp((-2 * cmath.pi * 1j)/n)。注意减号。

【讨论】:

  • 哦,对了,所以我改变了我的欧米茄以匹配它,现在它是正确的。所以我现在的问题是,有什么区别。我假设所有实现都使用欧拉部分逆时针方向,那么我的结果会是错误的快速傅立叶变换吗?
  • 这是 FFT 魔力的一部分。 FFT 及其逆运算几乎是相同的运算,除了符号的变化。如果您将逆 FFT 应用于 FFT 的结果,您将获得原始值(模块浮点错误)。
  • 正如您可能已经知道的那样,哪个运算是“FFT”,哪个是“逆 FFT”是一个任意决定,可能由高斯或傅里叶做出。
  • 等等,所以你说反 fft 是我所做的,或者它们是任意的。它不能因为 numpy.ifft(0,1,2,3) 不是我给出的值。从你所说的只是虚部发生了变化,它代表相移,所以不太重要吧?
  • 对不起,你误解了我的意思。有一个 FFT 操作。 FFT运算是什么意思大家都认同,而且总是涉及到负号。但是,正如您所发现的,操作及其逆操作几乎相同。如果 200 年前,傅立叶交换了这两个运算,那么数学就可以继续进行下去了。但他没有,我们也没有。这有意义吗?
猜你喜欢
  • 2011-07-12
  • 2010-12-13
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 2013-03-31
相关资源
最近更新 更多