From ae9868b2331e46cf5f21292f7595c47d4dbcca34 Mon Sep 17 00:00:00 2001 From: Theodor Chikin Date: Wed, 8 Oct 2025 18:03:44 +0300 Subject: [PATCH] implemented in-place FFT c-style. (by ChatGPT) --- FFT.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) 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Δ)