【问题标题】:Wrong output for FFT implementationFFT 实现的错误输出
【发布时间】:2020-12-09 01:57:44
【问题描述】:

我正在尝试在 Python 中实现以下Algorithm of FFT,但输出几乎总是错误的。我不明白我的错误。有人可以说明我的错误吗?那会很棒!

编辑:

  • cpo2(x,y) 返回 max(x,y) 的最接近 2 的幂
  • fill(A,n) 填充列表 A(在列表末尾填充零)直到 A 达到长度 n
  • 我的函数工作的示例(根据 numpy.fft.fft):

输入 [1,2] -> 输出 [3, -1]

  • 以下是我的函数不起作用的一些示例:
  • input : -> output (wrong) // output (true based on np.fft.fft)
  • [1,2,3,4] -> [(10+0j), (-2-2j), (-2+0j), (-2+2j)] // [10.+0. j -2.+2.j -2.+0.j -2.-2.j]
  • [1,2,3] ->[6, 2] //[ 6. +0.j -1.5+0.8660254j -1.5-0.8660254j]
  • [1,4,4,0] -> [(9+0j), (-3+4j), (1+0j), (-3-4j)] //[ 9.+0.j -3.-4.j 1.+0.j -3.+4.j]
def FFT(A):
    n = int(len(A))
    if n == 1:
        return A
    w_n = np.exp(complex(0,2*np.pi/n))
    w = 1
    (A0,A1) = decomp(A)
    A0_star = FFT(A0)
    A1_star = FFT(A1)
    A_star0 = list()
    A_star1 = list()
    for k in range(int(n/2)):
        A_star0.append(A0_star[k] + w*A1_star[k])
        A_star1.append(A0_star[k] - w*A1_star[k])
        w = w*w_n
    A_star = A_star0 + A_star1
    return list(np.around(A_star))

def decomp(A):
   l = len(A)
   n = cpo2(l,l)
   A = fill(A,n)
   A0 = A[0::2]
   A1 = A[1::2]
   return(A0,A1)

【问题讨论】:

  • 您的代码不完整。 decomp(A) 是什么?您还应该包括一个示例输入和输出 - 4 个示例 cor 示例,因为这可以显示错误所在。
  • 你为什么打电话给np.around???
  • 只是为了获得更易读的输出。没有它,代码就可以工作:除了它没有给出正确的输出://
  • 您不应该对中间结果进行四舍五入(FFT 的输出用于更大尺寸的 FFT 内部的操作!)。相反,如果必须,只对最终输出进行四舍五入。

标签: python fft


【解决方案1】:

有两件事立即让我印象深刻:

  1. 您的for k in range(int(n/2)): 意味着这仅适用于n 的偶数值。而且由于您递归地调用FFT,这可能意味着这仅在n 是2 的幂时才有效。也许没关系,通常你关心的只是输入长度是 2 的幂。但是您的示例失败之一的 n=3,这不是 2 的幂。
  2. 当 n=4 时,所有失败案例都只是结果的虚部与预期相反的失败。 FFT 有不同的定义,不同之处在于复指数中的指数符号(代码中的 w_n)。看来您已经实现了一个与 np.fft.fft 实现的定义相反的定义。 np.fft.fft 的实现可能遵循电气工程中使用的约定,其中指数中有一个减号。您的实现似乎遵循物理学中使用的约定,其中指数中有一个加号。所以,尝试使用w_n = np.exp(complex(0,-2*np.pi/n))

可能还有更多问题,但从那些开始......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    相关资源
    最近更新 更多