[英]Wrong output for FFT implementation
我正在嘗試在 Python 中實現以下FFT 算法,但 output 幾乎總是錯誤的。 我不明白我的錯誤。 有人可以說明我的錯誤嗎? 那會很棒!
編輯:
輸入 [1,2] -> output [3, -1]
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)
有兩件事立即讓我印象深刻:
for k in range(int(n/2)):
意味着這只適用於n
的偶數值。 而且由於您遞歸地調用FFT
,這可能意味着這僅在n
是 2 的冪時才有效。 也許沒關系,通常你關心的只是輸入長度是 2 的冪。 但是您的示例失敗之一具有 n=3,這不是 2 的冪。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.