diff --git a/FFT.py b/FFT.py index 4620b9a..c733a7a 100644 --- a/FFT.py +++ b/FFT.py @@ -93,7 +93,7 @@ def FFT_arr_inplace(buf): In-place radix-2 DIT FFT для списка buf длины N=2^m, где каждый элемент — [re, im]. Без массивов twiddle: твиддл на уровне обновляется рекуррентно. """ - N = len(buf) + N = len(buf)/2 # --- bit-reverse перестановка (чтобы бабочки шли последовательно) --- j = 0 for i in range(1, N): @@ -103,7 +103,7 @@ def FFT_arr_inplace(buf): bit >>= 1 j |= bit if i < j: - buf[i], buf[j] = buf[j], buf[i] + buf[i*2], buf[i*2+1], buf[j*2], buf[j*2+1] = buf[j*2], buf[j*2+1], buf[i*2], buf[i*2+1] # --- уровни бабочек --- m = 2 @@ -117,18 +117,18 @@ def FFT_arr_inplace(buf): # w = e^{-j*0*Δ} = 1 + j0 wr, wi = 1.0, 0.0 for k in range(half): - u_re, u_im = buf[start + k] - v_re, v_im = buf[start + k + half] + u_re, u_im = buf[(start + k)*2], buf[(start + k)*2 +1] + v_re, v_im = buf[(start + k + half)*2], buf[(start + k + half)*2 +1] # t = w * v t_re = wr * v_re - wi * v_im t_im = wr * v_im + wi * v_re # верх/низ - buf[start + k][0] = u_re + t_re - buf[start + k][1] = u_im + t_im - buf[start + k + half][0] = u_re - t_re - buf[start + k + half][1] = u_im - t_im + buf[(start + k)*2 +0] = u_re + t_re + buf[(start + k)*2 +1] = u_im + t_im + buf[(start + k + half)*2 + 0] = u_re - t_re + buf[(start + k + half)*2 + 1] = u_im - t_im # w *= w_m (поворот на Δ с помощью рекуррентной формулы) # (wr + j wi) * (cΔ + j sΔ)