簡體   English   中英

用於 FFT 實施的 output 錯誤

[英]Wrong output for FFT implementation

我正在嘗試在 Python 中實現以下FFT 算法,但 output 幾乎總是錯誤的。 我不明白我的錯誤。 有人可以說明我的錯誤嗎? 那會很棒!

編輯:

  • cpo2(x,y) 返回 max(x,y) 的最接近 2 的冪
  • fill(A,n) 填充列表 A(在列表末尾填充零)直到 A 達到長度 n
  • 我的 function 工作的示例(根據 numpy.fft.fft):

輸入 [1,2] -> output [3, -1]

  • 以下是我的 function 不起作用的一些示例:
  • 輸入:-> output(錯誤)//output(基於 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)

有兩件事立即讓我印象深刻:

  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))

可能還有更多問題,但從那些開始......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM