implemented in-place FFT c-style. (by ChatGPT)

This commit is contained in:
2025-10-08 18:03:44 +03:00
parent 59f99cc466
commit ae9868b233

16
FFT.py
View File

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